diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bebba190b73078af76aaeff8b18f6637043ad385..5d5bbe80f56f1e601b59d1c2d15b1ee269e36c0a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -120,6 +120,22 @@ bindings-android: - bindings.aar - bindings-sources.jar +# This pipeline job will attempt to have pkg.go.dev update docs for client/xxdk. +# +# pkg.go.dev relies on the proxy.golang.org service (go module cache/proxy) to discover versions of +# Go modules to make docs of. The proxy keeps a list of all known versions of Go modules. The go +# mod proxy does cache pulls for about 30 minutes, so if quickly successive commits are done in +# master/release, this will fail to pull the latest client, and the docs will not update. +trigger-doc-update: + stage: trigger_integration + image: $DOCKER_IMAGE + script: + # We use GOPRIVATE blank because not want to directly pull client, we want to use the public cache. + - GOPRIVATE="" go install gitlab.com/elixxir/client@$CI_COMMIT_REF_NAME + only: + - release + - master + trigger-integration: stage: trigger_integration trigger: diff --git a/README.md b/README.md index 85caa9719203f12bf8bfbcb7d9e22b02cf37102f..9c693d8b71b24497eb1a1e0a6af044702b8b87a8 100644 --- a/README.md +++ b/README.md @@ -1,89 +1,84 @@ # xx network Client -[](https://gitlab.com/elixxir/client/commits/master) -[](https://gitlab.com/elixxir/client/commits/master) +[Repository](https://git.xx.network/elixxir/client) | [Go Doc](https://pkg.go.dev/gitlab.com/elixxir/client/xxdk) | [Examples](https://git.xx.network/elixxir/xxdk-examples/-/tree/master) -The client is a library and related command-line tool -that facilitates making full-featured xx clients for all platforms. It interfaces with the cMix system, enabling access -to all xx network messaging features, including end-to-end encryption and metadata protection. +The client is a library and related command-line tool that facilitates making full-featured xx clients for all +platforms. It interfaces with the cMix system, enabling access to all xx network messaging features, including +end-to-end encryption and metadata protection. -This repository contains everything necessary to implement all of the -xx network messaging features. It also contains features to extend the base -messaging protocols. +This repository contains everything necessary to implement the xx network messaging features. In addition, it also +contains features to extend the base messaging protocols. -The command-line tool accompanying the client library can be built for any platform supported by -golang. The libraries are built for iOS and Android using -[gomobile](https://godoc.org/golang.org/x/mobile/cmd/gomobile). +The command-line tool accompanying the client library can be built for any platform supported by Go. The libraries are +built for iOS and Android using [gomobile](https://pkg.go.dev/golang.org/x/mobile/cmd/gomobile). -For library writers, the client requires a writable folder to store -data, functions for receiving and approving requests for creating -secure end-to-end messaging channels, for discovering users, and for -receiving different types of messages. Details for implementing these -features are in the [Library Overview section](#library-overview) below. +For library writers, the client requires a writable folder to store data, functions for receiving and approving requests +for creating secure end-to-end messaging channels, discovering users, and receiving different types of messages. The client is open-source software released under the simplified BSD License. ## Command Line Usage -The command-line tool is intended for testing xx network functionality and not -for regular user use. +The command-line tool is intended for testing xx network functionality and not for regular user use. -These instructions assume that you have [Go 1.17.X installed](https://go.dev/doc/install), and GCC installed for Cgo (such as `build-essential` on Debian or Ubuntu). +These instructions assume that you have [Go 1.17.X](https://go.dev/doc/install) installed and GCC installed for +[cgo](https://pkg.go.dev/cmd/cgo) (such as `build-essential` on Debian or Ubuntu). Compilation steps: -``` -git clone https://gitlab.com/elixxir/client.git client -cd client -go mod vendor -v -go mod tidy -go test ./... -# Linux 64 bit binary -GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags '-w -s' -o client.linux64 main.go -# Windows 64 bit binary -GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -ldflags '-w -s' -o client.win64 main.go -# Windows 32 big binary -GOOS=windows GOARCH=386 CGO_ENABLED=0 go build -ldflags '-w -s' -o release/client.win32 main.go -# Mac OSX 64 bit binary (intel) -GOOS=darwin GOARCH=amd64 CGO_ENABLED=0 go build -ldflags '-w -s' -o release/client.darwin64 main.go +```shell +$ git clone https://gitlab.com/elixxir/client.git client +$ cd client +$ go mod vendor +$ go mod tidy + +# Linux 64-bit binary +$ GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags '-w -s' -o client.linux64 main.go + +# Windows 64-bit binary +$ GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -ldflags '-w -s' -o client.win64 main.go + +# Windows 32-bit binary +$ GOOS=windows GOARCH=386 CGO_ENABLED=0 go build -ldflags '-w -s' -o client.win32 main.go + +# Mac OSX 64-bit binary (Intel) +$ GOOS=darwin GOARCH=amd64 CGO_ENABLED=0 go build -ldflags '-w -s' -o client.darwin64 main.go ``` -#### Fetching an NDF +### Fetching an NDF -All actions performed with the client require a -current [NDF](https://xxdk-dev.xx.network/technical-glossary#network-definition-file-ndf). The NDF is downloadable from -the command line -or [via an access point](https://xxdk-dev.xx.network/quick-reference#func-downloadandverifysignedndfwithurl) in the -Client API. +All actions performed with the client require a current +[network definition file (NDF)](https://xxdk-dev.xx.network/technical-glossary/#network-definition-file-ndf). The NDF is +downloadable from the command line or +[via an access point](https://xxdk-dev.xx.network/quick-reference#func-downloadandverifysignedndfwithurl) in the Client +API. Use the `getndf` command to fetch the NDF via the command line. `getndf` enables command-line users to poll the NDF from a network gateway without any pre-established client connection. First, you'll want to download an SSL certificate: -``` -// Assumes you are running a gateway locally -openssl s_client -showcerts -connect localhost:8440 < /dev/null 2>&1 | openssl x509 -outform PEM > certfile.pem +```shell +# Assumes you are running a gateway locally +$ openssl s_client -showcerts -connect localhost:8440 < /dev/null 2>&1 | openssl x509 -outform PEM > certfile.pem ``` -Now you can fetch the NDF: +Now you can fetch the NDF. -``` -// Example usage for Gateways, assumes you are running a gateway locally -$ go run main.go getndf --gwhost localhost:8440 --cert certfile.pem | jq . >ndf.json +```shell +# Example usage for gateways, assumes you are running a gateway locally +$ ./client getndf --gwhost localhost:8440 --cert certfile.pem | jq . > ndf.json ``` -You can also download an NDF directly for different environments by using the `--env` flag: +You can also download an NDF directly for different environments by using the `--env` flag. -```go -$ go run main.go getndf --env mainnet | jq . >ndf.json -// Or, run via the binary (assuming 64-bit Windows): -$ ./client.win64 getndf --env mainnet | jq . >ndf.json +```shell +$ ./client getndf --env mainnet | jq . > ndf.json ``` Sample content of `ndf.json`: -``` +```json { "Timestamp": "2021-01-29T01:19:49.227246827Z", "Gateways": [ @@ -91,31 +86,36 @@ Sample content of `ndf.json`: "Id": "BRM+Iotl6ujIGhjRddZMBdauapS7Z6jL0FJGq7IkUdYB", "Address": ":8440", "Tls_certificate": "-----BEGIN CERTIFICATE-----\nMIIDbDCCAlSgAwIBAgIJAOUNtZneIYECMA0GCSqGSIb3DQEBBQUAMGgxCzAJBgNV\nBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRIwEAYDVQQHDAlDbGFyZW1vbnQx\nGzAZBgNVBAoMElByaXZhdGVncml0eSBDb3JwLjETMBEGA1UEAwwKKi5jbWl4LnJp\ncDAeFw0xOTAzMDUxODM1NDNaFw0yOTAzMDIxODM1NDNaMGgxCzAJBgNVBAYTAlVT\nMRMwEQYDVQQIDApDYWxpZm9ybmlhMRIwEAYDVQQHDAlDbGFyZW1vbnQxGzAZBgNV\nBAoMElByaXZhdGVncml0eSBDb3JwLjETMBEGA1UEAwwKKi5jbWl4LnJpcDCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPP0WyVkfZA/CEd2DgKpcudn0oDh\nDwsjmx8LBDWsUgQzyLrFiVigfUmUefknUH3dTJjmiJtGqLsayCnWdqWLHPJYvFfs\nWYW0IGF93UG/4N5UAWO4okC3CYgKSi4ekpfw2zgZq0gmbzTnXcHF9gfmQ7jJUKSE\ntJPSNzXq+PZeJTC9zJAb4Lj8QzH18rDM8DaL2y1ns0Y2Hu0edBFn/OqavBJKb/uA\nm3AEjqeOhC7EQUjVamWlTBPt40+B/6aFJX5BYm2JFkRsGBIyBVL46MvC02MgzTT9\nbJIJfwqmBaTruwemNgzGu7Jk03hqqS1TUEvSI6/x8bVoba3orcKkf9HsDjECAwEA\nAaMZMBcwFQYDVR0RBA4wDIIKKi5jbWl4LnJpcDANBgkqhkiG9w0BAQUFAAOCAQEA\nneUocN4AbcQAC1+b3To8u5UGdaGxhcGyZBlAoenRVdjXK3lTjsMdMWb4QctgNfIf\nU/zuUn2mxTmF/ekP0gCCgtleZr9+DYKU5hlXk8K10uKxGD6EvoiXZzlfeUuotgp2\nqvI3ysOm/hvCfyEkqhfHtbxjV7j7v7eQFPbvNaXbLa0yr4C4vMK/Z09Ui9JrZ/Z4\ncyIkxfC6/rOqAirSdIp09EGiw7GM8guHyggE4IiZrDslT8V3xIl985cbCxSxeW1R\ntgH4rdEXuVe9+31oJhmXOE9ux2jCop9tEJMgWg7HStrJ5plPbb+HmjoX3nBO04E5\n6m52PyzMNV+2N21IPppKwA==\n-----END CERTIFICATE-----\n" - }, - { - "Id": "JCBd9mAQb2BW8hc8H9avy1ubcjUAa7MHrPp0dBU/VqQB", - ..... + } + ] +} ``` -#### Sending Safe Messages Between Two (2) Users +Use the `--help` command with `getndf` to view all options. + +```shell +$ ./client getndf --help +``` -**Note:** For information on receiving messages and troubleshooting authenticated channel requests, -see [Receiving Messages](#receiving-messages) -and [Confirming authenticated channel requests](#confirming-authenticated-channel-requests). +### Sending Safe Messages Between Two (2) Users + +> 💡 **Note:** For information on receiving messages and troubleshooting authenticated channel requests, +see [Receiving Messages](#receiving-messages) and +> [Confirming authenticated channel requests](#confirming-authenticated-channel-requests). To send messages with end-to-end encryption, you must first establish a connection or [authenticated channel](https://xxdk-dev.xx.network/technical-glossary#authenticated-channel) with the other user. See below for example commands for sending or confirming authenticated channel requests, as well as for sending E2E -messages: +messages. -``` -# Get user contact jsons for each client -$ client --password user1-password --ndf ndf.json -l client1.log -s user1session --writeContact user1-contact.json --unsafe -m "Hi to me, without E2E Encryption" -$ client --password user2-password --ndf ndf.json -l client2.log -s user2session --writeContact user2-contact.json --unsafe -m "Hi to me, without E2E Encryption" +```shell +# Get user contact files for each client +$ ./client --password user1-password --ndf ndf.json -l client1.log -s user1session --writeContact user1-contact.json --unsafe -m "Hi to me, without E2E Encryption" +$ ./client --password user2-password --ndf ndf.json -l client2.log -s user2session --writeContact user2-contact.json --unsafe -m "Hi to me, without E2E Encryption" # Request authenticated channel from another client. Note that the receiving client # is expected to confirm the request before any specified timeout (default 120s) -$ client --password password --ndf ndf.json -l client.log -s session-directory --destfile user2-contact.json --waitTimeout 360 --unsafe-channel-creation --send-auth-request +$ ./client --password password --ndf ndf.json -l client.log -s session-directory --destfile user2-contact.json --waitTimeout 360 --unsafe-channel-creation --send-auth-request WARNING: unsafe channel creation enabled Adding authenticated channel for: Qm40C5hRUm7uhp5aATVWhSL6Mt+Z4JVBQrsEDvMORh4D Message received: @@ -124,19 +124,19 @@ Received 1 # Accept/Confirm an authenticated channel request implicitly # (should be within the timeout window of requesting client, or the request will need to be re-sent): -$ client --password "password" --ndf ndf.json -l client.log -s session-directory --destfile user2-contact.json --unsafe-channel-creation --waitTimeout 200 +$ ./client --password "password" --ndf ndf.json -l client.log -s session-directory --destfile user2-contact.json --unsafe-channel-creation --waitTimeout 200 Authentication channel request from: o+QpswTmnsuZve/QRz0j0RYNWqjgx4R5pACfO00Pe0cD Sending to o+QpswTmnsuZve/QRz0j0RYNWqjgx4R5pACfO00Pe0cD: Message received: Received 1 # Send E2E Messages -$ client --password user1-password --ndf ndf.json -l client1.log -s user1session --destfile user2-contact.json -m "Hi User 2, from User 1 with E2E Encryption" +$ ./client --password user1-password --ndf ndf.json -l client1.log -s user1session --destfile user2-contact.json -m "Hi User 2, from User 1 with E2E Encryption" Sending to Qm40C5hRUm7uhp5aATVWhSL6Mt+Z4JVBQrsEDvMORh4D: Hi User 2, from User 1 with E2E Encryption Timed out! Received 0 -$ client --password user2-password --ndf ndf.json -l client1.log -s user2session --destfile user1-contact.json -m "Hi User 1, from User 2 with E2E Encryption" +$ ./client --password user2-password --ndf ndf.json -l client1.log -s user2session --destfile user1-contact.json -m "Hi User 1, from User 2 with E2E Encryption" Sending to o+QpswTmnsuZve/QRz0j0RYNWqjgx4R5pACfO00Pe0cD: Hi User 1, from User 2 with E2E Encryption Timed out! Received 0 @@ -147,57 +147,55 @@ Received 0 * `-l`: The file to write logs (user messages are still printed to stdout). * `-s`: The storage directory for client session data. * `--writeContact`: Output the user's contact information to this file. -* `--destfile` is used to specify the recipient. You can also use - `--destid b64:...` using the user's base64 id, which is printed in the logs. -* `--unsafe`: Send message without encryption (necessary whenever you have not - already established an e2e channel). +* `--destfile` is used to specify the recipient. You can also use `--destid b64:...` using the user's base64 ID, which +is printed in the logs. +* `--unsafe`: Send message without encryption (necessary whenever you have not already established an e2e channel). * `--unsafe-channel-creation` Auto-create and auto-accept channel requests. * `-m`: The message to send. Note that the client defaults to sending to itself when a destination is not supplied. -This is why we've used the `--unsafe` flag when creating the user contact jsons. -However, when sending between users, it is dropped in exchange for `--unsafe-channel-creation`. +This is why we've used the `--unsafe` flag when creating the user contact files. +However, when sending between users, the flag is dropped in exchange for `--unsafe-channel-creation`. For the authenticated channel creation to be considered "safe", the user should be prompted. You can do this by -explicitly accepting the channel creation -when sending a request with `--send-auth-request` (while excluding the `--unsafe-channel-creation` flag) or explicitly -accepting a request with `--accept-channel`: +explicitly accepting the channel creation when sending a request with `--send-auth-request` (while excluding the +`--unsafe-channel-creation` flag) or explicitly accepting a request with `--accept-channel`: -``` -$ client --password user-password --ndf ndf.json -l client.log -s session-directory --destfile user-contact.json --accept-channel +```shell +$ ./client --password user-password --ndf ndf.json -l client.log -s session-directory --destfile user-contact.json --accept-channel Authentication channel request from: yYAztmoCoAH2VIr00zPxnj/ZRvdiDdURjdDWys0KYI4D Sending to yYAztmoCoAH2VIr00zPxnj/ZRvdiDdURjdDWys0KYI4D: Message received: Received 1 ``` -#### Receiving Messages +### Receiving Messages There is no explicit command for receiving messages. Instead, the client will attempt to fetch pending messages on each run. You can use the `--receiveCount` flag to limit the number of messages the client waits for before a timeout occurs: -``` -$ client --password <password> --ndf <NDF JSON file> -l client.log -s <session directory> --destfile <contact JSON file> --receiveCount <integer count> +```shell +$ ./client --password <password> --ndf <NDF JSON file> -l client.log -s <session directory> --destfile <contact JSON file> --receiveCount <integer count> ``` -#### Sending Authenticated Channel Requests +### Sending Authenticated Channel Requests See [Sending Safe Messages Between Two (2) Users](#sending-safe-messages-between-two-2-users) -#### Confirming Authenticated Channel Requests +### Confirming Authenticated Channel Requests Setting up an authenticated channel between clients is a back-and-forth process that happens in sequence. One client sends a request and waits for the other to accept it. -See the previous section, [Sending safe messages between 2 users](#sending-safe-messages-between-2-users), for example +See the previous section, [Sending safe messages between 2 users](#sending-safe-messages-between-two-2-users), for example, commands showing how to set up an end-to-end connection between clients before sending messages. As with received messages, there is no command for checking for authenticated channel requests; you'll be notified of any pending requests whenever the client is run. -``` +```shell $ ./client.win64 --password password --ndf ndf.json -l client.log -s session-directory --destfile user-contact8.json --waitTimeout 120 -m "Hi User 7, from User 8 with E2E Encryption" Authentication channel request from: 8zAWY69UUK/FkMBGY3ViR5MMfcp1GoKn6Y3c/64NYNYD Sending to yYAztmoCoAH2VIr00zPxnj/ZRvdiDdURjdDWys0KYI4D: Hi User 7, from User 8 with E2E Encryption @@ -206,7 +204,7 @@ Received 0 ``` -##### Troubleshooting +### Troubleshooting **`panic: Could not confirm authentication channel for ...`** @@ -218,7 +216,7 @@ Retrying the request should fix this. If necessary, you may increase the time th before timeout using the `--auth-timeout` flag (default 120s). This error will also occur with the receiving client if it received the request but failed to confirm it before the -requesting client reached a timeout. In this case, the request needs to be resent while the other client reattempts to +requesting client reached a timeout. In this case, the request must be resent while the other client reattempts to confirm the channel. **`panic: Received request not found`** @@ -226,9 +224,9 @@ confirm the channel. You may also run into the `panic: Received request not found` error when attempting to confirm an authenticated channel request. This means your client has not received the request. If one has been sent, simply retrying should fix this. -Full usage of client can be found with `client --help`: +Full usage of the client can be found with `client --help`: -``` +```shell $ ./client --help Runs a client for cMix anonymous communication platform @@ -237,6 +235,7 @@ Usage: client [command] Available Commands: + broadcast Send broadcast messages fileTransfer Send and receive file for cMix client generate Generates version and dependency information for the Elixxir binary getndf Download the network definition file from the network and print it. @@ -249,20 +248,24 @@ Available Commands: Flags: --accept-channel Accept the channel request for the corresponding recipient ID - --auth-timeout uint The number of seconds to wait for an authentication channelto confirm (default 120) - --delete-all-requests Delete the all contact requests, both sent and received. + --auth-timeout uint The number of seconds to wait for an authentication channelto confirm (default 60) + --backupIdList string JSON file containing the backed up partner IDs --backupIn string Path to load backup client from - --backupOut string Path to output backup client. + --backupJsonOut string Path to output unencrypted client JSON backup. + --backupOut string Path to output encrypted client backup. If no path is supplied, the backup system is not started. --backupPass string Passphrase to encrypt/decrypt backup - --delete-channel Delete the channel information for the corresponding recipient ID - --delete-receive-requests Delete the all received contact requests. - --delete-sent-requests Delete the all sent contact requests. + --delete-all-requests DeleteFingerprint the all contact requests, both sent and received. + --delete-channel DeleteFingerprint the channel information for the corresponding recipient ID + --delete-receive-requests DeleteFingerprint the all received contact requests. + --delete-request DeleteFingerprint the request for the specified ID given by the destfile flag's contact file. + --delete-sent-requests DeleteFingerprint the all sent contact requests. --destfile string Read this contact file for the destination id -d, --destid string ID to send message to (if below 40, will be precanned. Use '0x' or 'b64:' for hex and base64 representations) (default "0") - --e2eMaxKeys uint Max keys used before blocking until a rekey completes (default 800) - --e2eMinKeys uint Minimum number of keys used before requesting rekey (default 500) + --e2eMaxKeys uint Max keys used before blocking until a rekey completes (default 2000) + --e2eMinKeys uint Minimum number of keys used before requesting rekey (default 1000) --e2eNumReKeys uint Number of rekeys reserved for rekey operations (default 16) - --e2eRekeyThreshold float64 Number between 0 an 1. Percent of keys used before a rekey is started + --e2eRekeyThreshold float Number between 0 an 1. Percent of keys used before a rekey is started (default 0.05) + --force-legacy Force client to operate using legacy identities. --forceHistoricalRounds Force all rounds to be sent to historical round retrieval --forceMessagePickupRetry Enable a mechanism which forces a 50% chance of no message pickup, instead triggering the message pickup retry mechanism -h, --help help for client @@ -275,13 +278,14 @@ Flags: --protoUserOut string Path to which a normally constructed client will write proto user JSON file --protoUserPath string Path to proto user JSON file containing cryptographic primitives the client will load --receiveCount uint How many messages we should wait for before quitting (default 1) - --regcode string Identity code (optional) + --regcode string ReceptionIdentity code (optional) --send-auth-request Send an auth request to the specified destination and waitfor confirmation --sendCount uint The number of times to send the message (default 1) --sendDelay uint The delay between sending the messages in ms (default 500) --sendid uint Use precanned user id (must be between 1 and 40, inclusive) -s, --session string Sets the initial storage directory for client session data --slowPolling Enables polling for unfiltered network updates with RSA signatures + --splitSends Force sends to go over multiple rounds if possible --unsafe Send raw, unsafe messages without e2e encryption. --unsafe-channel-creation Turns off the user identity authenticated channel check, automatically approving authenticated channels --verboseRoundTracking Verbose round tracking, keeps track and prints all rounds the client was aware of while running. Defaults to false if not set. @@ -292,131 +296,111 @@ Flags: Use "client [command] --help" for more information about a command. ``` -**Note:** The client cannot be used on the betanet with precanned user ids. +>💡 **Note:** The client cannot be used on the xx network with pre-canned user IDs. ## Library Overview -The xx client is designed to be used as a go library (and by extension a -c library). +The xx client is designed to be a go library (and, by extension, a C library). -Support is also present for go mobile to build Android and iOS libraries. We -bind all exported symbols from the bindings package for use on mobile -platforms. +Support is also present for Go mobile to build Android and iOS libraries. In addition, we bind all exported symbols from +the bindings package for use on mobile platforms. ### Implementation Notes -Clients need to perform the same actions *in the same order* as shown in -`cmd/root.go`. Specifically, certain handlers need to be registered and -set up before starting network threads. Additionally, you cannot perform certain actions until the network connection -reaches a "healthy" state. - -See [main.go](https://git.xx.network/elixxir/xxdk-examples/-/blob/sample-messaging-app/sample-messaging-app/main.go) for relevant code listings on when and how to perform these actions. -The [Getting Started](https://xxdk-dev.xx.network/getting-started) guide provides further detail. - -You can also visit the [API Quick Reference](https://xxdk-dev.xx.network/quick-reference) -for information on the types and functions exposed by the Client API. - -The main entry point for developing with the client is `api/client` (or -`bindings/client`). We recommend using go doc to explore: - -``` -go doc -all ./api -go doc -all ./interfaces -``` - -Looking at the API will, for example, show you there is a RoundEvents callback -registration function, which lets your client see round events: - -``` -func (c *Client) GetRoundEvents() interfaces.RoundEvents - RegisterRoundEventsCb registers a callback for round events. -``` - -and then inside interfaces: - -``` -type RoundEvents interface { - // designates a callback to call on the specified event - // rid is the id of the round the event occurs on - // callback is the callback the event is triggered on - // timeout is the amount of time before an error event is returned - // valid states are the states which the event should trigger on - AddRoundEvent(rid id.Round, callback ds.RoundEventCallback, - timeout time.Duration, validStates ...states.Round) *ds.EventCallback - - // designates a go channel to signal the specified event - // rid is the id of the round the event occurs on - // eventChan is the channel the event is triggered on - // timeout is the amount of time before an error event is returned - // valid states are the states which the event should trigger on - AddRoundEventChan(rid id.Round, eventChan chan ds.EventReturn, - timeout time.Duration, validStates ...states.Round) *ds.EventCallback - - //Allows the un-registration of a round event before it triggers - Remove(rid id.Round, e *ds.EventCallback) -} -``` - -Which, when investigated, yields the following prototype: - -``` -// Callbacks must use this function signature -type RoundEventCallback func(ri *pb.RoundInfo, timedOut bool) -``` - -showing that you can receive a full RoundInfo object for any round event +Clients must perform the same actions *in the same order* as shown in `cmd/root.go`. Specifically, certain handlers need +to be registered and set up before starting network threads. Additionally, you cannot perform certain actions until the +network connection reaches a "healthy" state. + +Refer to Setting Up a cMix Client in the API documentation for specific on how to do this. + +See the [xxdk Example repository](https://git.xx.network/elixxir/xxdk-examples/-/tree/master) for various example +implementations. +In addition, the [Getting Started](https://xxdk-dev.xx.network/getting-started) guide provides further detail. + +You can also visit the [API Quick Reference](https://xxdk-dev.xx.network/quick-reference) for information on the types +and functions exposed by the Client API. + +The main entry point for developing with the client is `xxdk/cmix` (or `bindings/cmix`). We recommend using the +[documentation in the Go package directory](https://pkg.go.dev/gitlab.com/elixxir/client/xxdk). + +Looking at the API will, for example, show you there is a `RoundEvents` callback registration function, which lets your +client see round events. + +> ```go +> func (c *Cmix) GetRoundEvents() interfaces.RoundEvents +> ``` +> RegisterRoundEventsCb registers a callback for round events. + +And then, inside the `RoundEvents` interfaces: + +> ```go +> type RoundEvents interface { +> // designates a callback to call on the specified event +> // rid is the id of the round the event occurs on +> // callback is the callback the event is triggered on +> // timeout is the amount of time before an error event is returned +> // valid states are the states which the event should trigger on +> AddRoundEvent(rid id.Round, callback ds.RoundEventCallback, +> timeout time.Duration, validStates ...states.Round) *ds.EventCallback +> +> // designates a go channel to signal the specified event +> // rid is the id of the round the event occurs on +> // eventChan is the channel the event is triggered on +> // timeout is the amount of time before an error event is returned +> // valid states are the states which the event should trigger on +> AddRoundEventChan(rid id.Round, eventChan chan ds.EventReturn, +> timeout time.Duration, validStates ...states.Round) *ds.EventCallback +> +> // Allows the un-registration of a round event before it triggers +> Remove(rid id.Round, e *ds.EventCallback) +> } +> ``` + +Which, when investigated, yields the following prototype. + +> ```go +> // Callbacks must use this function signature +> type RoundEventCallback func(ri *pb.RoundInfo, timedOut bool) +> ``` + +Showing that you can receive a full `RoundInfo` object for any round event received by the client library on the network. ### Building the Library for iOS and Android -To set up Gomobile for Android, install the NDK and pass the -ndk flag -to ` $ gomobile init`. Other repositories that use Gomobile for -binding should include a shell script that creates the bindings. For -iOS, gomobile must be run on an OS X machine with Xcode installed. +To set up gomobile for Android, install the NDK and pass the `-ndk` flag ` $ gomobile init`. Other repositories that use +gomobile for binding should include a shell script that creates the bindings. For iOS, gomobile must be run on an OS X +machine with Xcode installed. Important reference info: -1. [Setting up Gomobile and subcommands](https://godoc.org/golang.org/x/mobile/cmd/gomobile) -2. [Reference cycles, type restrictions](https://godoc.org/golang.org/x/mobile/cmd/gobind) +1. [Setting up gomobile and subcommands](https://pkg.go.dev/golang.org/x/mobile/cmd/gomobile) +2. [Reference cycles, type restrictions](https://pkg.go.dev/golang.org/x/mobile/cmd/gobind) To clone and build: -``` +```shell # Go mobile install -go get -u golang.org/x/mobile/cmd/gomobile -go get -u golang.org/x/mobile/bind -gomobile init... # Note this line will be different depending on sdk/target! +$ go get golang.org/x/mobile/bind +$ go install golang.org/x/mobile/cmd/gomobile@latest +$ gomobile init... # Note this line will be different depending on sdk/target! + # Get and test code -git clone https://gitlab.com/elixxir/client.git client -cd client -go mod vendor -v -go mod tidy -go test ./... +$ git clone https://gitlab.com/elixxir/client.git client +$ cd client +$ go mod vendor +$ go mod tidy +$ go test ./... + # Android -gomobile bind -target android -androidapi 21 gitlab.com/elixxir/client/bindings +$ gomobile bind -target android -androidapi 21 gitlab.com/elixxir/client/bindings + # iOS -gomobile bind -target ios gitlab.com/elixxir/client/bindings -zip -r iOS.zip Bindings.framework +$ gomobile bind -target ios gitlab.com/elixxir/client/bindings +$ zip -r iOS.zip Bindings.framework ``` -You can verify that all symbols got bound by unzipping -`bindings-sources.jar` and inspecting the resulting source files. - -Every time you make a change to the client or bindings, you must -rebuild the client bindings into a .aar or iOS.zip to propagate those -changes to the app. There's a script that runs gomobile for you in the -`bindings-integration` repository. - -## Roadmap - -See the larger network documentation for more, but there are 2 specific -parts of the roadmap that are intended for the client: - -* Ephemeral IDs - Sending messages to users with temporal/ephemeral recipient - user identities. -* User Discovery - A bot that will allow the user to look for others on the - network. -* Notifications - An optional notifications system which uses firebase -* Efficiency improvements - mechanisms for message pickup and network tracking -* will evolve to allow tradeoffs and options for use +You can verify that all symbols got bound by unzipping `bindings-sources.jar` and inspecting the resulting source files. -We are also always looking at simplifying and improving the library interface. +Every time you make a change to the client or bindings, you must rebuild the client bindings into a `.aar` or `iOS.zip` +to propagate those changes to the app. There's a script that runs gomobile for you in the `bindings-integration` +repository. diff --git a/auth/confirm.go b/auth/confirm.go index 72928f04927ab8ccd8a50e06096eeab480a57775..05c1bc136ac567749d1115b7e13d1c7091da1a6b 100644 --- a/auth/confirm.go +++ b/auth/confirm.go @@ -15,7 +15,6 @@ import ( "gitlab.com/elixxir/client/auth/store" "gitlab.com/elixxir/client/cmix" "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" "gitlab.com/elixxir/client/event" util "gitlab.com/elixxir/client/storage/utility" "gitlab.com/elixxir/crypto/contact" @@ -110,7 +109,7 @@ func (s *state) confirm(partner contact.Contact, serviceTag string) ( // into critical messages does not occur // create local relationship - p := session.GetDefaultParams() + p := s.sessionParams _, err := s.e2e.AddPartner(partner.ID, partner.DhPubKey, dhPriv, rr.GetTheirSidHPubKeyA(), sidhPriv, p, p) if err != nil { diff --git a/auth/receivedConfirm.go b/auth/receivedConfirm.go index bf25d5661743e226f2d7cb2024cff457365ab20c..ad30186d15c911dbc739495ccf58df4bdcf05818 100644 --- a/auth/receivedConfirm.go +++ b/auth/receivedConfirm.go @@ -9,7 +9,6 @@ import ( "gitlab.com/elixxir/client/cmix/identity/receptionID" "gitlab.com/elixxir/client/cmix/message" "gitlab.com/elixxir/client/cmix/rounds" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" "gitlab.com/elixxir/crypto/contact" cAuth "gitlab.com/elixxir/crypto/e2e/auth" "gitlab.com/elixxir/primitives/fact" @@ -90,7 +89,7 @@ func (rcs *receivedConfirmService) Process(msg format.Message, } // add the partner - p := session.GetDefaultParams() + p := authState.sessionParams _, err = authState.e2e.AddPartner(rcs.GetPartner(), partnerPubKey, rcs.GetMyPrivKey(), partnerSIDHPubKey, rcs.GetMySIDHPrivKey(), p, p) if err != nil { diff --git a/auth/state.go b/auth/state.go index 3b82f15e46049abd5cc8be2367fb4abb45b68e71..f77da163641d59a5be7004c8f52b498e3c2cb6bb 100644 --- a/auth/state.go +++ b/auth/state.go @@ -9,12 +9,14 @@ package auth import ( "encoding/base64" + "github.com/pkg/errors" "gitlab.com/elixxir/client/auth/store" "gitlab.com/elixxir/client/cmix" "gitlab.com/elixxir/client/cmix/identity/receptionID" "gitlab.com/elixxir/client/cmix/message" "gitlab.com/elixxir/client/e2e" + "gitlab.com/elixxir/client/e2e/ratchet/partner/session" "gitlab.com/elixxir/client/event" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/crypto/fastRNG" @@ -37,6 +39,10 @@ type state struct { params Params + // These are the parameters used when creating/adding session + // partners + sessionParams session.Params + backupTrigger func(reason string) } @@ -56,11 +62,12 @@ type state struct { // with a memory only versioned.KV) as well as a memory only versioned.KV for // NewState and use GetDefaultTemporaryParams() for the parameters func NewState(kv *versioned.KV, net cmix.Client, e2e e2e.Handler, - rng *fastRNG.StreamGenerator, event event.Reporter, params Params, - callbacks Callbacks, backupTrigger func(reason string)) (State, error) { + rng *fastRNG.StreamGenerator, event event.Reporter, authParams Params, + sessParams session.Params, callbacks Callbacks, + backupTrigger func(reason string)) (State, error) { kv = kv.Prefix(makeStorePrefix(e2e.GetReceptionID())) - return NewStateLegacy( - kv, net, e2e, rng, event, params, callbacks, backupTrigger) + return NewStateLegacy(kv, net, e2e, rng, event, authParams, sessParams, + callbacks, backupTrigger) } // NewStateLegacy loads the auth state or creates new auth state if one cannot @@ -68,8 +75,9 @@ func NewState(kv *versioned.KV, net cmix.Client, e2e e2e.Handler, // Does not modify the kv prefix for backwards compatibility. // Otherwise, acts the same as NewState func NewStateLegacy(kv *versioned.KV, net cmix.Client, e2e e2e.Handler, - rng *fastRNG.StreamGenerator, event event.Reporter, params Params, - callbacks Callbacks, backupTrigger func(reason string)) (State, error) { + rng *fastRNG.StreamGenerator, event event.Reporter, authParams Params, + sessParams session.Params, callbacks Callbacks, + backupTrigger func(reason string)) (State, error) { s := &state{ callbacks: callbacks, @@ -78,7 +86,8 @@ func NewStateLegacy(kv *versioned.KV, net cmix.Client, e2e e2e.Handler, e2e: e2e, rng: rng, event: event, - params: params, + params: authParams, + sessionParams: sessParams, backupTrigger: backupTrigger, } @@ -90,13 +99,13 @@ func NewStateLegacy(kv *versioned.KV, net cmix.Client, e2e e2e.Handler, // register services net.AddService(e2e.GetReceptionID(), message.Service{ Identifier: e2e.GetReceptionID()[:], - Tag: params.RequestTag, + Tag: authParams.RequestTag, Metadata: nil, }, &receivedRequestService{s: s, reset: false}) net.AddService(e2e.GetReceptionID(), message.Service{ Identifier: e2e.GetReceptionID()[:], - Tag: params.ResetRequestTag, + Tag: authParams.ResetRequestTag, Metadata: nil, }, &receivedRequestService{s: s, reset: true}) diff --git a/backup/backupRestore.go b/backup/backupRestore.go index 93ba6778ea16e2a7982ee5a1c7e487b7d08bf406..94e1180ae0d5a993d4d13ca63854e6b690885e1c 100644 --- a/backup/backupRestore.go +++ b/backup/backupRestore.go @@ -4,13 +4,11 @@ // All rights reserved. / //////////////////////////////////////////////////////////////////////////////// -// FIXME: This is placeholder, there's got to be a better place to put -// backup restoration than inside messenger. - package backup import ( "github.com/pkg/errors" + jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/e2e" "gitlab.com/elixxir/client/e2e/rekey" "gitlab.com/elixxir/client/storage" @@ -22,9 +20,9 @@ import ( "gitlab.com/xx_network/primitives/id" ) -// NewClientFromBackup constructs a new E2e from an encrypted +// NewClientFromBackup initializes a new e2e storage from an encrypted // backup. The backup is decrypted using the backupPassphrase. On -// success a successful client creation, the function will return a +// a successful client creation, the function will return a // JSON encoded list of the E2E partners contained in the backup and a // json-encoded string containing parameters stored in the backup func NewClientFromBackup(ndfJSON, storageDir string, sessionPassword, @@ -38,7 +36,10 @@ func NewClientFromBackup(ndfJSON, storageDir string, sessionPassword, "Failed to unmarshal decrypted client contents.") } - usr := user.NewUserFromBackup(backUp) + jww.INFO.Printf("Decrypted backup ID to Restore: %v", + backUp.ReceptionIdentity.ComputedID) + + userInfo := user.NewUserFromBackup(backUp) def, err := xxdk.ParseNDF(ndfJSON) if err != nil { @@ -49,7 +50,7 @@ func NewClientFromBackup(ndfJSON, storageDir string, sessionPassword, // Note we do not need registration here storageSess, err := xxdk.CheckVersionAndSetupStorage(def, storageDir, - sessionPassword, usr, cmixGrp, e2eGrp, + sessionPassword, userInfo, cmixGrp, e2eGrp, backUp.RegistrationCode) if err != nil { return nil, "", err @@ -69,10 +70,10 @@ func NewClientFromBackup(ndfJSON, storageDir string, sessionPassword, return nil, "", err } - privkey := usr.E2eDhPrivateKey + privKey := userInfo.E2eDhPrivateKey //initialize the e2e storage - err = e2e.Init(storageSess.GetKV(), usr.ReceptionID, privkey, e2eGrp, + err = e2e.Init(storageSess.GetKV(), userInfo.ReceptionID, privKey, e2eGrp, rekey.GetDefaultParams()) if err != nil { return nil, "", err diff --git a/backup/keyStorage.go b/backup/keyStorage.go index f0e11469e850f17363bee97f6c5cc9d47d377b97..27437998775dc4a63cf4e3c996dd82f3aa68e56c 100644 --- a/backup/keyStorage.go +++ b/backup/keyStorage.go @@ -9,7 +9,6 @@ package backup import ( "bytes" - "github.com/pkg/errors" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/crypto/backup" diff --git a/bindings/authenticatedConnection.go b/bindings/authenticatedConnection.go new file mode 100644 index 0000000000000000000000000000000000000000..95f60c71ad58c6abb031ae054f7c1be350b58096 --- /dev/null +++ b/bindings/authenticatedConnection.go @@ -0,0 +1,112 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + +package bindings + +import ( + "sync" + + "github.com/pkg/errors" + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/connect" + "gitlab.com/elixxir/crypto/contact" +) + +//connection tracker singleton, used to track connections so they can be +//referenced by id back over the bindings +var authenticatedConnectionTrackerSingleton = &authenticatedConnectionTracker{ + connections: make(map[int]*AuthenticatedConnection), + count: 0, +} + +type AuthenticatedConnection struct { + Connection +} + +func (_ *AuthenticatedConnection) IsAuthenticated() bool { + return true +} + +// ConnectWithAuthentication is called by the client (i.e. the one establishing +// connection with the server). Once a connect.Connection has been established +// with the server and then authenticate their identity to the server. +// accepts a marshalled ReceptionIdentity and contact.Contact object +func (c *Cmix) ConnectWithAuthentication(e2eId int, recipientContact, + e2eParamsJSON []byte) (*AuthenticatedConnection, error) { + if len(e2eParamsJSON) == 0 { + jww.WARN.Printf("e2e params not specified, using defaults...") + e2eParamsJSON = GetDefaultE2EParams() + } + + cont, err := contact.Unmarshal(recipientContact) + if err != nil { + return nil, err + } + + e2eClient, err := e2eTrackerSingleton.get(e2eId) + if err != nil { + return nil, err + } + + params, err := parseE2EParams(e2eParamsJSON) + if err != nil { + return nil, err + } + + connection, err := connect.ConnectWithAuthentication(cont, + e2eClient.api, params) + return authenticatedConnectionTrackerSingleton.make(connection), err +} + +// connectionTracker is a singleton used to keep track of extant clients, allowing +// for race condition free passing over the bindings + +type authenticatedConnectionTracker struct { + connections map[int]*AuthenticatedConnection + count int + mux sync.RWMutex +} + +// make makes a client from an API client, assigning it a unique ID +func (act *authenticatedConnectionTracker) make(c connect.AuthenticatedConnection) *AuthenticatedConnection { + act.mux.Lock() + defer act.mux.Unlock() + + id := act.count + act.count++ + + act.connections[id] = &AuthenticatedConnection{ + Connection: Connection{ + connection: c, + id: id, + }, + } + + return act.connections[id] +} + +//get returns a client given its ID +func (act *authenticatedConnectionTracker) get(id int) (*AuthenticatedConnection, error) { + act.mux.RLock() + defer act.mux.RUnlock() + + c, exist := act.connections[id] + if !exist { + return nil, errors.Errorf("Cannot get client for id %d, client "+ + "does not exist", id) + } + + return c, nil +} + +//deletes a client if it exists +func (act *authenticatedConnectionTracker) delete(id int) { + act.mux.Lock() + defer act.mux.Unlock() + + delete(act.connections, id) +} diff --git a/bindings/authenticatedConnectionTracker.go b/bindings/authenticatedConnectionTracker.go deleted file mode 100644 index 57e260dc7c037b5cd82d5aebbb404d9b8b4ca751..0000000000000000000000000000000000000000 --- a/bindings/authenticatedConnectionTracker.go +++ /dev/null @@ -1,56 +0,0 @@ -package bindings - -import ( - "github.com/pkg/errors" - "gitlab.com/elixxir/client/connect" - "sync" -) - -// connectionTracker is a singleton used to keep track of extant clients, allowing -// for race condition free passing over the bindings - -type authenticatedConnectionTracker struct { - connections map[int]*AuthenticatedConnection - count int - mux sync.RWMutex -} - -// make makes a client from an API client, assigning it a unique ID -func (act *authenticatedConnectionTracker) make(c connect.AuthenticatedConnection) *AuthenticatedConnection { - act.mux.Lock() - defer act.mux.Unlock() - - id := act.count - act.count++ - - act.connections[id] = &AuthenticatedConnection{ - Connection: Connection{ - connection: c, - id: id, - }, - } - - return act.connections[id] -} - -//get returns a client given its ID -func (act *authenticatedConnectionTracker) get(id int) (*AuthenticatedConnection, error) { - act.mux.RLock() - defer act.mux.RUnlock() - - c, exist := act.connections[id] - if !exist { - return nil, errors.Errorf("Cannot get client for id %d, client "+ - "does not exist", id) - } - - return c, nil -} - -//deletes a client if it exists -func (act *authenticatedConnectionTracker) delete(id int) { - act.mux.Lock() - defer act.mux.Unlock() - - delete(act.connections, id) -} diff --git a/bindings/autheticatedConnection.go b/bindings/autheticatedConnection.go deleted file mode 100644 index cc0ef41a8092ad48d45e9c7357c502ed4483e632..0000000000000000000000000000000000000000 --- a/bindings/autheticatedConnection.go +++ /dev/null @@ -1,40 +0,0 @@ -package bindings - -import ( - "gitlab.com/elixxir/client/connect" - "gitlab.com/elixxir/crypto/contact" -) - -//connection tracker singleton, used to track connections so they can be -//referenced by id back over the bindings -var authenticatedConnectionTrackerSingleton = &authenticatedConnectionTracker{ - connections: make(map[int]*AuthenticatedConnection), - count: 0, -} - -type AuthenticatedConnection struct { - Connection -} - -func (_ *AuthenticatedConnection) IsAuthenticated() bool { - return true -} - -// ConnectWithAuthentication is called by the client (i.e. the one establishing -// connection with the server). Once a connect.Connection has been established -// with the server and then authenticate their identity to the server. -// accepts a marshalled ReceptionIdentity and contact.Contact object -func (c *Cmix) ConnectWithAuthentication(e2eId int, recipientContact []byte) (*AuthenticatedConnection, error) { - cont, err := contact.Unmarshal(recipientContact) - if err != nil { - return nil, err - } - - e2eClient, err := e2eTrackerSingleton.get(e2eId) - if err != nil { - return nil, err - } - - connection, err := connect.ConnectWithAuthentication(cont, e2eClient.api, connect.GetDefaultParams()) - return authenticatedConnectionTrackerSingleton.make(connection), nil -} diff --git a/bindings/cmix.go b/bindings/cmix.go index 2003f7c2fa876a091325fdd5b1f04a3bc710de98..f37b778dd30299b66e8a3641c1d6f88461325c3a 100644 --- a/bindings/cmix.go +++ b/bindings/cmix.go @@ -1,7 +1,16 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + package bindings import ( "fmt" + "sync" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/xxdk" @@ -20,39 +29,49 @@ var cmixTrackerSingleton = &cmixTracker{ count: 0, } -// Cmix BindingsClient wraps the xxdk.Cmix, implementing additional functions +// Cmix wraps the xxdk.Cmix struct, implementing additional functions // to support the gomobile Cmix interface type Cmix struct { api *xxdk.Cmix id int } -// NewKeystore creates client storage, generates keys, connects, and registers +// NewCmix creates client storage, generates keys, connects, and registers // with the network. Note that this does not register a username/identity, but // merely creates a new cryptographic identity for adding such information // at a later date. // // Users of this function should delete the storage directory on error. -func NewKeystore(network, storageDir string, password []byte, regCode string) error { - if err := xxdk.NewCmix(network, storageDir, password, regCode); err != nil { +func NewCmix(ndfJSON, storageDir string, password []byte, registrationCode string) error { + if err := xxdk.NewCmix(ndfJSON, storageDir, password, registrationCode); err != nil { return errors.New(fmt.Sprintf("Failed to create new client: %+v", err)) } return nil } -// Login will load an existing client from the storageDir +// LoadCmix will load an existing client from the storageDir // using the password. This will fail if the client doesn't exist or // the password is incorrect. // The password is passed as a byte array so that it can be cleared from // memory and stored as securely as possible using the memguard library. -// Login does not block on network connection, and instead loads and +// LoadCmix does not block on network connection, and instead loads and // starts subprocesses to perform network operations. -// TODO: add in custom parameters instead of the default -func Login(storageDir string, password []byte) (*Cmix, error) { - client, err := xxdk.LoadCmix(storageDir, password, xxdk.GetDefaultParams()) +func LoadCmix(storageDir string, password []byte, cmixParamsJSON []byte) (*Cmix, + error) { + if len(cmixParamsJSON) == 0 { + jww.WARN.Printf("cmix params not specified, using defaults...") + cmixParamsJSON = GetDefaultCMixParams() + } + + params, err := parseCMixParams(cmixParamsJSON) + if err != nil { + return nil, err + } + + client, err := xxdk.LoadCmix(storageDir, password, params) if err != nil { - return nil, errors.New(fmt.Sprintf("Failed to login: %+v", err)) + return nil, errors.New(fmt.Sprintf("LoadCmix failed: %+v", err)) } return cmixTrackerSingleton.make(client), nil @@ -61,3 +80,50 @@ func Login(storageDir string, password []byte) (*Cmix, error) { func (c *Cmix) GetID() int { return c.id } + +// cmixTracker is a singleton used to keep track of extant Cmix objects, +// preventing race conditions created by passing it over the bindings +type cmixTracker struct { + clients map[int]*Cmix + count int + mux sync.RWMutex +} + +// make a Cmix from an xxdk.Cmix, assigns it a unique ID, +// and adds it to the cmixTracker +func (ct *cmixTracker) make(c *xxdk.Cmix) *Cmix { + ct.mux.Lock() + defer ct.mux.Unlock() + + id := ct.count + ct.count++ + + ct.clients[id] = &Cmix{ + api: c, + id: id, + } + + return ct.clients[id] +} + +// get a Cmix from the cmixTracker given its ID +func (ct *cmixTracker) get(id int) (*Cmix, error) { + ct.mux.RLock() + defer ct.mux.RUnlock() + + c, exist := ct.clients[id] + if !exist { + return nil, errors.Errorf("Cannot get client for id %d, client "+ + "does not exist", id) + } + + return c, nil +} + +// delete a Cmix if it exists in the cmixTracker +func (ct *cmixTracker) delete(id int) { + ct.mux.Lock() + defer ct.mux.Unlock() + + delete(ct.clients, id) +} diff --git a/bindings/cmixTracker.go b/bindings/cmixTracker.go deleted file mode 100644 index cb7d215a0613c780cc228998c381efec8b9ad36a..0000000000000000000000000000000000000000 --- a/bindings/cmixTracker.go +++ /dev/null @@ -1,54 +0,0 @@ -package bindings - -import ( - "github.com/pkg/errors" - "gitlab.com/elixxir/client/xxdk" - "sync" -) - -// cmixTracker is a singleton used to keep track of extant Cmix objects, -// preventing race conditions created by passing it over the bindings -type cmixTracker struct { - clients map[int]*Cmix - count int - mux sync.RWMutex -} - -// make a Cmix from an xxdk.Cmix, assigns it a unique ID, -// and adds it to the cmixTracker -func (ct *cmixTracker) make(c *xxdk.Cmix) *Cmix { - ct.mux.Lock() - defer ct.mux.Unlock() - - id := ct.count - ct.count++ - - ct.clients[id] = &Cmix{ - api: c, - id: id, - } - - return ct.clients[id] -} - -// get a Cmix from the cmixTracker given its ID -func (ct *cmixTracker) get(id int) (*Cmix, error) { - ct.mux.RLock() - defer ct.mux.RUnlock() - - c, exist := ct.clients[id] - if !exist { - return nil, errors.Errorf("Cannot get client for id %d, client "+ - "does not exist", id) - } - - return c, nil -} - -// delete a Cmix if it exists in the cmixTracker -func (ct *cmixTracker) delete(id int) { - ct.mux.Lock() - defer ct.mux.Unlock() - - delete(ct.clients, id) -} diff --git a/bindings/connect.go b/bindings/connect.go index 98f9795398040d1cb372e8c54fb4d273efd84dbc..85c25b4ee96f37d100c61d8449658d836da53729 100644 --- a/bindings/connect.go +++ b/bindings/connect.go @@ -1,12 +1,22 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + package bindings import ( "encoding/json" + "sync" + + "github.com/pkg/errors" + jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/catalog" "gitlab.com/elixxir/client/connect" - e2e2 "gitlab.com/elixxir/client/e2e" + "gitlab.com/elixxir/client/xxdk" "gitlab.com/elixxir/crypto/contact" - "time" ) // connectionTrackerSingleton is used to track connections so they can be @@ -20,6 +30,7 @@ var connectionTrackerSingleton = &connectionTracker{ type Connection struct { connection connect.Connection id int + params xxdk.E2EParams } // GetId returns the Connection.id @@ -33,8 +44,12 @@ func (c *Connection) GetId() int { // partner.Manager is confirmed. // recipientContact - marshalled contact.Contact object // myIdentity - marshalled ReceptionIdentity object -func (c *Cmix) Connect(e2eId int, recipientContact []byte) ( +func (c *Cmix) Connect(e2eId int, recipientContact, e2eParamsJSON []byte) ( *Connection, error) { + if len(e2eParamsJSON) == 0 { + jww.WARN.Printf("e2e params not specified, using defaults...") + e2eParamsJSON = GetDefaultE2EParams() + } cont, err := contact.Unmarshal(recipientContact) if err != nil { return nil, err @@ -45,21 +60,24 @@ func (c *Cmix) Connect(e2eId int, recipientContact []byte) ( return nil, err } - p := connect.GetDefaultParams() - p.Timeout = 45 * time.Second + p, err := parseE2EParams(e2eParamsJSON) + if err != nil { + return nil, err + } + connection, err := connect.Connect(cont, e2eClient.api, p) if err != nil { return nil, err } - return connectionTrackerSingleton.make(connection), nil + return connectionTrackerSingleton.make(connection, p), nil } // SendE2E is a wrapper for sending specifically to the Connection's partner.Manager // Returns marshalled E2ESendReport func (c *Connection) SendE2E(mt int, payload []byte) ([]byte, error) { rounds, mid, ts, err := c.connection.SendE2E(catalog.MessageType(mt), payload, - e2e2.GetDefaultParams()) + c.params.Base) if err != nil { return nil, err @@ -92,3 +110,52 @@ func (c *Connection) RegisterListener(messageType int, newListener Listener) err _, err := c.connection.RegisterListener(catalog.MessageType(messageType), listener{l: newListener}) return err } + +// connectionTracker is a singleton used to keep track of extant clients, allowing +// for race condition free passing over the bindings + +type connectionTracker struct { + connections map[int]*Connection + count int + mux sync.RWMutex +} + +// make makes a client from an API client, assigning it a unique ID +func (ct *connectionTracker) make(c connect.Connection, + params xxdk.E2EParams) *Connection { + ct.mux.Lock() + defer ct.mux.Unlock() + + id := ct.count + ct.count++ + + ct.connections[id] = &Connection{ + connection: c, + id: id, + params: params, + } + + return ct.connections[id] +} + +//get returns a client given its ID +func (ct *connectionTracker) get(id int) (*Connection, error) { + ct.mux.RLock() + defer ct.mux.RUnlock() + + c, exist := ct.connections[id] + if !exist { + return nil, errors.Errorf("Cannot get client for id %d, client "+ + "does not exist", id) + } + + return c, nil +} + +//deletes a client if it exists +func (ct *connectionTracker) delete(id int) { + ct.mux.Lock() + defer ct.mux.Unlock() + + delete(ct.connections, id) +} diff --git a/bindings/connect_test.go b/bindings/connect_test.go index 9093dd3adff088bf82e7df4f9f28661a35b9a75d..f6152c768365d15cd5e29476af00dd2b587c02f3 100644 --- a/bindings/connect_test.go +++ b/bindings/connect_test.go @@ -1,13 +1,21 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + package bindings import ( "encoding/json" - "gitlab.com/elixxir/crypto/e2e" - "gitlab.com/xx_network/crypto/csprng" - "gitlab.com/xx_network/primitives/id" "reflect" "testing" "time" + + "gitlab.com/elixxir/crypto/e2e" + "gitlab.com/xx_network/crypto/csprng" + "gitlab.com/xx_network/primitives/id" ) func TestE2ESendReport_JSON(t *testing.T) { diff --git a/bindings/connectionTracker.go b/bindings/connectionTracker.go deleted file mode 100644 index 0352c3285acee4b64b0bc951898ba3f4991e6d04..0000000000000000000000000000000000000000 --- a/bindings/connectionTracker.go +++ /dev/null @@ -1,54 +0,0 @@ -package bindings - -import ( - "github.com/pkg/errors" - "gitlab.com/elixxir/client/connect" - "sync" -) - -// connectionTracker is a singleton used to keep track of extant clients, allowing -// for race condition free passing over the bindings - -type connectionTracker struct { - connections map[int]*Connection - count int - mux sync.RWMutex -} - -// make makes a client from an API client, assigning it a unique ID -func (ct *connectionTracker) make(c connect.Connection) *Connection { - ct.mux.Lock() - defer ct.mux.Unlock() - - id := ct.count - ct.count++ - - ct.connections[id] = &Connection{ - connection: c, - id: id, - } - - return ct.connections[id] -} - -//get returns a client given its ID -func (ct *connectionTracker) get(id int) (*Connection, error) { - ct.mux.RLock() - defer ct.mux.RUnlock() - - c, exist := ct.connections[id] - if !exist { - return nil, errors.Errorf("Cannot get client for id %d, client "+ - "does not exist", id) - } - - return c, nil -} - -//deletes a client if it exists -func (ct *connectionTracker) delete(id int) { - ct.mux.Lock() - defer ct.mux.Unlock() - - delete(ct.connections, id) -} diff --git a/bindings/delivery.go b/bindings/delivery.go index 9146e838f4381661385e4769b20a95ff4f74320b..0efa3e636f61a6520c6e34e8d15efd68d15c36ca 100644 --- a/bindings/delivery.go +++ b/bindings/delivery.go @@ -1,13 +1,21 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + package bindings import ( "encoding/json" "fmt" + "time" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/cmix" "gitlab.com/xx_network/primitives/id" - "time" ) // Example marshalled roundList object: diff --git a/bindings/e2e.go b/bindings/e2e.go index bd849f9ad1304b14b6eaa3a20e8177059c82c7d6..32dacd40d9acc4bdc01ec3b9459731d88395dbb0 100644 --- a/bindings/e2e.go +++ b/bindings/e2e.go @@ -1,12 +1,17 @@ -//////////////////////////////////////////////////////////////////////////////// -// Copyright © 2022 Privategrity Corporation / -// / -// All rights reserved. / -//////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// package bindings import ( + "sync" + + "github.com/pkg/errors" + jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/cmix/identity/receptionID" "gitlab.com/elixxir/client/cmix/rounds" "gitlab.com/elixxir/client/xxdk" @@ -32,10 +37,16 @@ func (e *E2e) GetID() int { return e.id } -// LoginE2e creates and returns a new E2e object and adds it to the e2eTrackerSingleton -// identity should be created via MakeIdentity() and passed in here +// Login creates and returns a new E2e object and adds it to the e2eTrackerSingleton +// identity should be created via MakeReceptionIdentity() and passed in here // If callbacks is left nil, a default auth.Callbacks will be used -func LoginE2e(cmixId int, callbacks AuthCallbacks, identity []byte) (*E2e, error) { +func Login(cmixId int, callbacks AuthCallbacks, identity, + e2eParamsJSON []byte) (*E2e, error) { + if len(e2eParamsJSON) == 0 { + jww.WARN.Printf("e2e params not specified, using defaults...") + e2eParamsJSON = GetDefaultE2EParams() + } + cmix, err := cmixTrackerSingleton.get(cmixId) if err != nil { return nil, err @@ -53,7 +64,12 @@ func LoginE2e(cmixId int, callbacks AuthCallbacks, identity []byte) (*E2e, error authCallbacks = &authCallback{bindingsCbs: callbacks} } - newE2e, err := xxdk.Login(cmix.api, authCallbacks, newIdentity) + params, err := parseE2EParams(e2eParamsJSON) + if err != nil { + return nil, err + } + + newE2e, err := xxdk.Login(cmix.api, authCallbacks, newIdentity, params) if err != nil { return nil, err } @@ -61,10 +77,16 @@ func LoginE2e(cmixId int, callbacks AuthCallbacks, identity []byte) (*E2e, error return e2eTrackerSingleton.make(newE2e), nil } -// LoginE2eEphemeral creates and returns a new ephemeral E2e object and adds it to the e2eTrackerSingleton -// identity should be created via MakeIdentity() and passed in here +// LoginEphemeral creates and returns a new ephemeral E2e object and adds it to the e2eTrackerSingleton +// identity should be created via MakeReceptionIdentity() or MakeLegacyReceptionIdentity() and passed in here // If callbacks is left nil, a default auth.Callbacks will be used -func LoginE2eEphemeral(cmixId int, callbacks AuthCallbacks, identity []byte) (*E2e, error) { +func LoginEphemeral(cmixId int, callbacks AuthCallbacks, identity, + e2eParamsJSON []byte) (*E2e, error) { + if len(e2eParamsJSON) == 0 { + jww.WARN.Printf("e2e params not specified, using defaults...") + e2eParamsJSON = GetDefaultE2EParams() + } + cmix, err := cmixTrackerSingleton.get(cmixId) if err != nil { return nil, err @@ -82,32 +104,13 @@ func LoginE2eEphemeral(cmixId int, callbacks AuthCallbacks, identity []byte) (*E authCallbacks = &authCallback{bindingsCbs: callbacks} } - newE2e, err := xxdk.LoginEphemeral(cmix.api, authCallbacks, newIdentity) - if err != nil { - return nil, err - } - return e2eTrackerSingleton.make(newE2e), nil -} - -// LoginE2eLegacy creates a new E2e backed by the xxdk.Cmix persistent versioned.KV -// Uses the pre-generated transmission ID used by xxdk.Cmix -// If callbacks is left nil, a default auth.Callbacks will be used -// This function is designed to maintain backwards compatibility with previous xx messenger designs -// and should not be used for other purposes -func LoginE2eLegacy(cmixId int, callbacks AuthCallbacks) (*E2e, error) { - cmix, err := cmixTrackerSingleton.get(cmixId) + params, err := parseE2EParams(e2eParamsJSON) if err != nil { return nil, err } - var authCallbacks xxdk.AuthCallbacks - if callbacks == nil { - authCallbacks = xxdk.DefaultAuthCallbacks{} - } else { - authCallbacks = &authCallback{bindingsCbs: callbacks} - } - - newE2e, err := xxdk.LoginLegacy(cmix.api, authCallbacks) + newE2e, err := xxdk.LoginEphemeral(cmix.api, authCallbacks, + newIdentity, params) if err != nil { return nil, err } @@ -161,3 +164,51 @@ func (a *authCallback) Reset(partner contact.Contact, receptionID receptionID.EphemeralIdentity, round rounds.Round, _ *xxdk.E2e) { a.bindingsCbs.Reset(convertAuthCallbacks(partner, receptionID, round)) } + +// e2eTracker is a singleton used to keep track of extant E2e objects, +// preventing race conditions created by passing it over the bindings +type e2eTracker struct { + // TODO: Key on Identity.ID to prevent duplication + clients map[int]*E2e + count int + mux sync.RWMutex +} + +// make a E2e from an xxdk.E2e, assigns it a unique ID, +// and adds it to the e2eTracker +func (ct *e2eTracker) make(c *xxdk.E2e) *E2e { + ct.mux.Lock() + defer ct.mux.Unlock() + + id := ct.count + ct.count++ + + ct.clients[id] = &E2e{ + api: c, + id: id, + } + + return ct.clients[id] +} + +// get an E2e from the e2eTracker given its ID +func (ct *e2eTracker) get(id int) (*E2e, error) { + ct.mux.RLock() + defer ct.mux.RUnlock() + + c, exist := ct.clients[id] + if !exist { + return nil, errors.Errorf("Cannot get client for id %d, client "+ + "does not exist", id) + } + + return c, nil +} + +// delete an E2e if it exists in the e2eTracker +func (ct *e2eTracker) delete(id int) { + ct.mux.Lock() + defer ct.mux.Unlock() + + delete(ct.clients, id) +} diff --git a/bindings/e2eHandler.go b/bindings/e2eHandler.go index 043b69ce352fb51653608f56e1dce09af7a62c02..5114f46ee96bade011fc1c5c90e335f6c529de1d 100644 --- a/bindings/e2eHandler.go +++ b/bindings/e2eHandler.go @@ -1,14 +1,16 @@ -//////////////////////////////////////////////////////////////////////////////// -// Copyright © 2022 Privategrity Corporation / -// / -// All rights reserved. / -//////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// package bindings import ( "encoding/json" "fmt" + "gitlab.com/elixxir/client/catalog" "gitlab.com/elixxir/client/cmix/identity/receptionID" "gitlab.com/elixxir/client/cmix/rounds" @@ -120,7 +122,7 @@ func (e *E2e) RemoveService(tag string) error { // - []byte - the marshalled bytes of the E2ESendReport object. func (e *E2e) SendE2E(messageType int, recipientId, payload, e2eParams []byte) ([]byte, error) { - + // Note that specifically these are the .Base params from xxdk.E2EParams params := e2e.GetDefaultParams() err := params.UnmarshalJSON(e2eParams) if err != nil { diff --git a/bindings/e2eTracker.go b/bindings/e2eTracker.go deleted file mode 100644 index 8f3ff5374ddb048642eeeda0a74a04a7f6bc3c44..0000000000000000000000000000000000000000 --- a/bindings/e2eTracker.go +++ /dev/null @@ -1,61 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Copyright © 2022 Privategrity Corporation / -// / -// All rights reserved. / -//////////////////////////////////////////////////////////////////////////////// - -package bindings - -import ( - "github.com/pkg/errors" - "gitlab.com/elixxir/client/xxdk" - "sync" -) - -// e2eTracker is a singleton used to keep track of extant E2e objects, -// preventing race conditions created by passing it over the bindings -type e2eTracker struct { - // TODO: Key on Identity.ID to prevent duplication - clients map[int]*E2e - count int - mux sync.RWMutex -} - -// make a E2e from an xxdk.E2e, assigns it a unique ID, -// and adds it to the e2eTracker -func (ct *e2eTracker) make(c *xxdk.E2e) *E2e { - ct.mux.Lock() - defer ct.mux.Unlock() - - id := ct.count - ct.count++ - - ct.clients[id] = &E2e{ - api: c, - id: id, - } - - return ct.clients[id] -} - -// get an E2e from the e2eTracker given its ID -func (ct *e2eTracker) get(id int) (*E2e, error) { - ct.mux.RLock() - defer ct.mux.RUnlock() - - c, exist := ct.clients[id] - if !exist { - return nil, errors.Errorf("Cannot get client for id %d, client "+ - "does not exist", id) - } - - return c, nil -} - -// delete an E2e if it exists in the e2eTracker -func (ct *e2eTracker) delete(id int) { - ct.mux.Lock() - defer ct.mux.Unlock() - - delete(ct.clients, id) -} diff --git a/bindings/fileTransfer.go b/bindings/fileTransfer.go new file mode 100644 index 0000000000000000000000000000000000000000..b9d3e802be559af4c83ad131b967228be00c759c --- /dev/null +++ b/bindings/fileTransfer.go @@ -0,0 +1,346 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + +package bindings + +import ( + "encoding/json" + "time" + + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/fileTransfer" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/xx_network/primitives/id" +) + +/* File Transfer Structs and Interfaces */ + +// FileTransfer object is a bindings-layer struct which wraps a fileTransfer.FileTransfer interface +type FileTransfer struct { + ft fileTransfer.FileTransfer + e2eCl *E2e +} + +// ReceivedFile is a public struct which represents the contents of an incoming file +// Example JSON: +// { +// "TransferID":"B4Z9cwU18beRoGbk5xBjbcd5Ryi9ZUFA2UBvi8FOHWo=", // ID of the incoming transfer for receiving +// "SenderID":"emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD", // ID of sender of incoming file +// "Preview":"aXQncyBtZSBhIHByZXZpZXc=", // Preview of the incoming file +// "Name":"testfile.txt", // Name of incoming file +// "Type":"text file", // Incoming file type +// "Size":2048 // Incoming file size +// } +type ReceivedFile struct { + TransferID []byte + SenderID []byte + Preview []byte + Name string + Type string + Size int +} + +// FileSend is a public struct which represents a file to be transferred +// { +// "Name":"testfile.txt", // File name +// "Type":"text file", // File type +// "Preview":"aXQncyBtZSBhIHByZXZpZXc=", // Preview of contents +// "Contents":"VGhpcyBpcyB0aGUgZnVsbCBjb250ZW50cyBvZiB0aGUgZmlsZSBpbiBieXRlcw==" // Full contents of the file +// } +type FileSend struct { + Name string + Type string + Preview []byte + Contents []byte +} + +// Progress is a public struct which represents the progress of an in-progress file transfer +// Example JSON: +// {"Completed":false, // Status of transfer (true if done) +// "Transmitted":128, // Bytes transferred so far +// "Total":2048, // Total size of file +// "Err":null // Error status (if any) +// } +type Progress struct { + Completed bool + Transmitted int + Total int + Err error +} + +// ReceiveFileCallback is a bindings-layer interface which is called when a file is received +// Accepts the result of calling json.Marshal on a ReceivedFile struct +type ReceiveFileCallback interface { + Callback(payload []byte, err error) +} + +// FileTransferSentProgressCallback is a bindings-layer interface which is called with the progress of a sending file +// Accepts the result of calling json.Marshal on a Progress struct & a FilePartTracker interface +type FileTransferSentProgressCallback interface { + Callback(payload []byte, t *FilePartTracker, err error) +} + +// FileTransferReceiveProgressCallback is a bindings-layer interface which is called with the progress of a received file +// Accepts the result of calling json.Marshal on a Progress struct & a FilePartTracker interface +type FileTransferReceiveProgressCallback interface { + Callback(payload []byte, t *FilePartTracker, err error) +} + +/* Main functions */ + +// InitFileTransfer creates a bindings-level File Transfer manager +// Accepts e2e client ID and marshalled params JSON +func InitFileTransfer(e2eID int, paramsJSON []byte) (*FileTransfer, error) { + + // Get bindings client from singleton + e2eCl, err := e2eTrackerSingleton.get(e2eID) + if err != nil { + return nil, err + } + + // Client info + myID := e2eCl.api.GetReceptionIdentity().ID + rng := e2eCl.api.GetRng() + + params, err := parseFileTransferParams(paramsJSON) + if err != nil { + return nil, err + } + + // Create file transfer manager + m, err := fileTransfer.NewManager(params, myID, + e2eCl.api.GetCmix(), e2eCl.api.GetStorage(), rng) + + // Add file transfer processes to client services tracking + err = e2eCl.api.AddService(m.StartProcesses) + if err != nil { + return nil, err + } + + // Return wrapped manager + return &FileTransfer{ft: m, e2eCl: e2eCl}, nil +} + +// Send is the bindings-level function for sending a File +// Accepts: +// FileSend JSON payload +// Marshalled recipient ID +// Marshalled e2e Params JSON +// Number of retries allowed +// Limit on duration between retries +// FileTransferSentProgressCallback interface +func (f *FileTransfer) Send(payload, recipientID, paramsJSON []byte, retry float32, + period string, callback FileTransferSentProgressCallback) ([]byte, error) { + // Unmarshal recipient ID + recipient, err := id.Unmarshal(recipientID) + if err != nil { + return nil, err + } + + // Parse duration to time.Duration + p, err := time.ParseDuration(period) + + // Wrap transfer progress callback to be passed to fileTransfer layer + cb := func(completed bool, arrived, total uint16, + st fileTransfer.SentTransfer, t fileTransfer.FilePartTracker, err error) { + prog := &Progress{ + Completed: completed, + Transmitted: int(arrived), + Total: int(total), + Err: err, + } + pm, err := json.Marshal(prog) + callback.Callback(pm, &FilePartTracker{t}, err) + } + + // Unmarshal payload + fs := &FileSend{} + err = json.Unmarshal(payload, fs) + if err != nil { + return nil, err + } + + sendNew := func(transferInfo []byte) error { + resp, err := f.e2eCl.SendE2E(int(catalog.NewFileTransfer), recipientID, transferInfo, paramsJSON) + if err != nil { + return err + } + jww.INFO.Printf("New file transfer message sent: %s", resp) + return nil + } + + // Send file + ftID, err := f.ft.Send(recipient, fs.Name, fs.Type, fs.Contents, retry, fs.Preview, cb, p, sendNew) + if err != nil { + return nil, err + } + + // Return Transfer ID + return ftID.Bytes(), nil +} + +// Receive returns the full file on the completion of the transfer. +// It deletes internal references to the data and unregisters any attached +// progress callback. Returns an error if the transfer is not complete, the +// full file cannot be verified, or if the transfer cannot be found. +// +// Receive can only be called once the progress callback returns that the +// file transfer is complete. +func (f *FileTransfer) Receive(tidBytes []byte) ([]byte, error) { + tid := ftCrypto.UnmarshalTransferID(tidBytes) + return f.ft.Receive(&tid) +} + +// CloseSend deletes a file from the internal storage once a transfer has +// completed or reached the retry limit. Returns an error if the transfer +// has not run out of retries. +// +// This function should be called once a transfer completes or errors out +// (as reported by the progress callback). +func (f *FileTransfer) CloseSend(tidBytes []byte) error { + tid := ftCrypto.UnmarshalTransferID(tidBytes) + return f.ft.CloseSend(&tid) +} + +/* Callback registration functions */ + +// RegisterSentProgressCallback allows for the registration of a callback to +// track the progress of an individual sent file transfer. +// SentProgressCallback is auto registered on Send; this function should be +// called when resuming clients or registering extra callbacks. +// Accepts ID of the transfer, callback for transfer progress, +// and period between retries +func (f *FileTransfer) RegisterSentProgressCallback(tidBytes []byte, + callback FileTransferSentProgressCallback, period string) error { + cb := func(completed bool, arrived, total uint16, + st fileTransfer.SentTransfer, t fileTransfer.FilePartTracker, err error) { + prog := &Progress{ + Completed: completed, + Transmitted: int(arrived), + Total: int(total), + Err: err, + } + pm, err := json.Marshal(prog) + callback.Callback(pm, &FilePartTracker{t}, err) + } + p, err := time.ParseDuration(period) + if err != nil { + return err + } + tid := ftCrypto.UnmarshalTransferID(tidBytes) + + return f.ft.RegisterSentProgressCallback(&tid, cb, p) +} + +// RegisterReceivedProgressCallback allows for the registration of a +// callback to track the progress of an individual received file transfer. +// This should be done when a new transfer is received on the +// ReceiveCallback. +// Accepts ID of the transfer, callback for transfer progress and period between retries +func (f *FileTransfer) RegisterReceivedProgressCallback(tidBytes []byte, callback FileTransferReceiveProgressCallback, period string) error { + cb := func(completed bool, received, total uint16, + rt fileTransfer.ReceivedTransfer, t fileTransfer.FilePartTracker, err error) { + prog := &Progress{ + Completed: completed, + Transmitted: int(received), + Total: int(total), + Err: err, + } + pm, err := json.Marshal(prog) + callback.Callback(pm, &FilePartTracker{t}, err) + } + p, err := time.ParseDuration(period) + if err != nil { + return err + } + tid := ftCrypto.UnmarshalTransferID(tidBytes) + return f.ft.RegisterReceivedProgressCallback(&tid, cb, p) +} + +/* Utility Functions */ + +func (f *FileTransfer) MaxFileNameLen() int { + return f.ft.MaxFileNameLen() +} + +func (f *FileTransfer) MaxFileTypeLen() int { + return f.ft.MaxFileTypeLen() +} + +func (f *FileTransfer) MaxFileSize() int { + return f.ft.MaxFileSize() +} + +func (f *FileTransfer) MaxPreviewSize() int { + return f.ft.MaxPreviewSize() +} + +//////////////////////////////////////////////////////////////////////////////// +// File Part Tracker // +//////////////////////////////////////////////////////////////////////////////// + +// FilePartTracker contains the interfaces.FilePartTracker. +type FilePartTracker struct { + m fileTransfer.FilePartTracker +} + +// GetPartStatus returns the status of the file part with the given part number. +// The possible values for the status are: +// 0 = unsent +// 1 = sent (sender has sent a part, but it has not arrived) +// 2 = arrived (sender has sent a part, and it has arrived) +// 3 = received (receiver has received a part) +func (fpt FilePartTracker) GetPartStatus(partNum int) int { + return int(fpt.m.GetPartStatus(uint16(partNum))) +} + +// GetNumParts returns the total number of file parts in the transfer. +func (fpt FilePartTracker) GetNumParts() int { + return int(fpt.m.GetNumParts()) +} + +//////////////////////////////////////////////////////////////////////////////// +// Event Reporter // +//////////////////////////////////////////////////////////////////////////////// + +// EventReport is a public struct which represents the contents of an event report +// Example JSON: +// {"Priority":1, +// "Category":"Test Events", +// "EventType":"Ping", +// "Details":"This is an example of an event report" +// } +type EventReport struct { + Priority int + Category string + EventType string + Details string +} + +// ReporterFunc is a bindings-layer interface which receives info from the Event Manager +// Accepts result of json.Marshal on an EventReport object +type ReporterFunc interface { + Report(payload []byte, err error) +} + +// reporter is the internal struct to match the event.Reporter interface +type reporter struct { + r ReporterFunc +} + +// Report matches the event.Reporter interface, wraps the info in an EventReport struct +// and passes the marshalled struct to the internal callback +func (r *reporter) Report(priority int, category, evtType, details string) { + rep := &EventReport{ + Priority: priority, + Category: category, + EventType: evtType, + Details: details, + } + r.r.Report(json.Marshal(rep)) +} diff --git a/bindings/fileTransfer_test.go b/bindings/fileTransfer_test.go new file mode 100644 index 0000000000000000000000000000000000000000..10d49d9b81cbea043d281de9f4377508a6e2063f --- /dev/null +++ b/bindings/fileTransfer_test.go @@ -0,0 +1,67 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + +package bindings + +import ( + "encoding/json" + "testing" + + "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/xx_network/crypto/csprng" + "gitlab.com/xx_network/primitives/id" +) + +func TestFileTransfer_inputs(t *testing.T) { + fs := &FileSend{ + Name: "testfile.txt", + Type: "text file", + Preview: []byte("it's me a preview"), + Contents: []byte("This is the full contents of the file in bytes"), + } + fsm, _ := json.Marshal(fs) + t.Log("FileSend example json:") + t.Log(string(fsm)) + t.Log("\n") + + tid, _ := fileTransfer.NewTransferID(csprng.NewSystemRNG()) + sid := id.NewIdFromString("zezima", id.User, t) + rf := &ReceivedFile{ + TransferID: tid.Bytes(), + SenderID: sid.Marshal(), + Preview: []byte("it's me a preview"), + Name: "testfile.txt", + Type: "text file", + Size: 2048, + } + rfm, _ := json.Marshal(rf) + t.Log("ReceivedFile example json:") + t.Log(string(rfm)) + t.Log("\n") + + p := &Progress{ + Completed: false, + Transmitted: 128, + Total: 2048, + Err: nil, + } + pm, _ := json.Marshal(p) + t.Log("Progress example json:") + t.Log(string(pm)) + t.Log("\n") + + er := &EventReport{ + Priority: 1, + Category: "Test Events", + EventType: "Ping", + Details: "This is an example of an event report", + } + erm, _ := json.Marshal(er) + t.Log("EventReport example json:") + t.Log(string(erm)) + t.Log("\n") +} diff --git a/bindings/follow.go b/bindings/follow.go index 34bb4c58eabffb120a2fc1dbad6cfc57b51324d5..874882c813bc478711786e87fdff380935020462 100644 --- a/bindings/follow.go +++ b/bindings/follow.go @@ -1,10 +1,18 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + package bindings import ( "fmt" + "time" + "github.com/pkg/errors" "gitlab.com/xx_network/primitives/netTime" - "time" ) // StartNetworkFollower kicks off the tracking of the network. It starts @@ -86,9 +94,9 @@ func (c *Cmix) HasRunningProcessies() bool { return c.api.HasRunningProcessies() } -// IsNetworkHealthy returns true if the network is read to be in a healthy state where +// IsHealthy returns true if the network is read to be in a healthy state where // messages can be sent -func (c *Cmix) IsNetworkHealthy() bool { +func (c *Cmix) IsHealthy() bool { return c.api.GetCmix().IsHealthy() } @@ -98,14 +106,14 @@ type NetworkHealthCallback interface { Callback(bool) } -// RegisterNetworkHealthCB registers the network health callback to be called +// AddHealthCallback registers the network health callback to be called // any time the network health changes. Returns a unique ID that can be used to // unregister the network health callback. -func (c *Cmix) RegisterNetworkHealthCB(nhc NetworkHealthCallback) int64 { +func (c *Cmix) AddHealthCallback(nhc NetworkHealthCallback) int64 { return int64(c.api.GetCmix().AddHealthCallback(nhc.Callback)) } -func (c *Cmix) UnregisterNetworkHealthCB(funcID int64) { +func (c *Cmix) RemoveHealthCallback(funcID int64) { c.api.GetCmix().RemoveHealthCallback(uint64(funcID)) } diff --git a/bindings/identity.go b/bindings/identity.go index 2718672f50b22b8017d84e9c1799eac4667905d6..c3e470df403bcd8b838d1f2240068f8afba4261f 100644 --- a/bindings/identity.go +++ b/bindings/identity.go @@ -1,7 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + package bindings import ( "encoding/json" + "gitlab.com/elixxir/client/xxdk" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/primitives/fact" @@ -24,8 +32,8 @@ type ReceptionIdentity struct { DHKeyPrivate []byte } -// MakeIdentity generates a new cryptographic identity for receiving messages -func (c *Cmix) MakeIdentity() ([]byte, error) { +// MakeReceptionIdentity generates a new cryptographic identity for receiving messages +func (c *Cmix) MakeReceptionIdentity() ([]byte, error) { ident, err := xxdk.MakeReceptionIdentity(c.api) if err != nil { return nil, err @@ -34,6 +42,16 @@ func (c *Cmix) MakeIdentity() ([]byte, error) { return ident.Marshal() } +// MakeLegacyReceptionIdentity generates the legacy identity for receiving messages +func (c *Cmix) MakeLegacyReceptionIdentity() ([]byte, error) { + ident, err := xxdk.MakeLegacyReceptionIdentity(c.api) + if err != nil { + return nil, err + } + + return ident.Marshal() +} + // GetIDFromContact accepts a marshalled contact.Contact object & returns a marshalled id.ID object func GetIDFromContact(marshaled []byte) ([]byte, error) { cnt, err := contact.Unmarshal(marshaled) diff --git a/bindings/identity_test.go b/bindings/identity_test.go index 1d1e0be0f331185480fbf48d87ca7607f2eb7f5b..662f1f5c000021def40a17a50d9c9646b8a78779 100644 --- a/bindings/identity_test.go +++ b/bindings/identity_test.go @@ -1,7 +1,16 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + package bindings import ( "encoding/json" + "testing" + "gitlab.com/elixxir/crypto/cmix" "gitlab.com/elixxir/crypto/cyclic" dh "gitlab.com/elixxir/crypto/diffieHellman" @@ -9,7 +18,6 @@ import ( "gitlab.com/xx_network/crypto/large" "gitlab.com/xx_network/crypto/signature/rsa" "gitlab.com/xx_network/primitives/id" - "testing" ) func TestIdentity_JSON(t *testing.T) { diff --git a/bindings/listener.go b/bindings/listener.go index b284687beadd802985b6023528989a5401b7dbd0..5d4e5608d212e8b596468cd8887bfb86560bf4ff 100644 --- a/bindings/listener.go +++ b/bindings/listener.go @@ -1,7 +1,15 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + package bindings import ( "encoding/json" + jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/e2e/receive" ) diff --git a/bindings/listener_test.go b/bindings/listener_test.go index c8fd03ec88cfea35ab5cb7a5431f05fb7157907d..8336dd207f0a9232ec3daa650f8bcdd571358189 100644 --- a/bindings/listener_test.go +++ b/bindings/listener_test.go @@ -1,12 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + package bindings import ( "encoding/json" + "testing" + "time" + "gitlab.com/elixxir/crypto/e2e" "gitlab.com/xx_network/crypto/csprng" "gitlab.com/xx_network/primitives/id" - "testing" - "time" ) func TestMessage_Json(t *testing.T) { diff --git a/bindings/utilities.go b/bindings/logging.go similarity index 76% rename from bindings/utilities.go rename to bindings/logging.go index 7eb109730a21b1c4cc519ee7b1e8d154362f62a0..5fa5fe0e196807f9baa52dfa9969f6331a85ec5a 100644 --- a/bindings/utilities.go +++ b/bindings/logging.go @@ -1,11 +1,21 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + +// logging.go contains bindings log control functions + package bindings import ( "fmt" + "log" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "google.golang.org/grpc/grpclog" - "log" ) // sets level of logging. All logs the set level and above will be displayed diff --git a/bindings/ndf.go b/bindings/ndf.go index ed72aa1d6a98c33861d814d18f032c7396e1a099..4787544b6075a9ac835f92624c807130d1aa964a 100644 --- a/bindings/ndf.go +++ b/bindings/ndf.go @@ -1,3 +1,10 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + package bindings import "gitlab.com/elixxir/client/xxdk" diff --git a/bindings/ndf_test.go b/bindings/ndf_test.go index beb0eac9604902938b5efcac0660bf4ea230c7d4..c453582b5d7eccee053de6f4d60cae5a345af3ed 100644 --- a/bindings/ndf_test.go +++ b/bindings/ndf_test.go @@ -1,12 +1,20 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + package bindings import ( "fmt" + "strings" + "testing" + "gitlab.com/elixxir/comms/testkeys" "gitlab.com/xx_network/primitives/ndf" "gitlab.com/xx_network/primitives/utils" - "strings" - "testing" ) var testCert = `-----BEGIN CERTIFICATE----- diff --git a/bindings/params.go b/bindings/params.go new file mode 100644 index 0000000000000000000000000000000000000000..cc7883b30c673f6166eca4a1d865481a24554fe0 --- /dev/null +++ b/bindings/params.go @@ -0,0 +1,87 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + +// params.go provides functions for getting and setting parameters in bindings. + +package bindings + +import ( + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/fileTransfer" + "gitlab.com/elixxir/client/single" + "gitlab.com/elixxir/client/xxdk" +) + +// GetDefaultCMixParams returns a JSON serialized object with all of the +// CMIX parameters and their default values. Call this function and modify +// the json to change CMIX settings. +func GetDefaultCMixParams() []byte { + defaultParams := xxdk.GetDefaultCMixParams() + data, err := defaultParams.Marshal() + if err != nil { + jww.FATAL.Panicf("Unexpected error: %+v", err) + } + return data +} + +// GetDefaultE2EParams returns a JSON serialized object with all of the +// E2E parameters and their default values. Call this function and modify +// the json to change E2E settings. +func GetDefaultE2EParams() []byte { + defaultParams := xxdk.GetDefaultE2EParams() + data, err := defaultParams.Marshal() + if err != nil { + jww.FATAL.Panicf("Unexpected error: %+v", err) + } + return data +} + +// GetDefaultFileTransferParams returns a JSON serialized object with all the +// File transfer parameters and their default values. Call this function and modify +// the json to change file transfer settings. +func GetDefaultFileTransferParams() []byte { + defaultParams := fileTransfer.DefaultParams() + data, err := defaultParams.MarshalJSON() + if err != nil { + jww.FATAL.Panicf("Unexpected error: %+v", err) + } + return data +} + +// GetDefaultSingleUseParams returns a JSON serialized object with all the +// single use parameters and their default values. Call this function and modify +// the json to change single use settings. +func GetDefaultSingleUseParams() []byte { + defaultParams := single.GetDefaultRequestParams() + data, err := defaultParams.MarshalJSON() + if err != nil { + jww.FATAL.Panicf("Unexpected error: %+v", err) + } + return data +} + +func parseSingleUseParams(data []byte) (single.RequestParams, error) { + p := &single.RequestParams{} + return *p, p.UnmarshalJSON(data) +} + +func parseFileTransferParams(data []byte) (fileTransfer.Params, error) { + p := &fileTransfer.Params{} + return *p, p.UnmarshalJSON(data) +} + +func parseCMixParams(data []byte) (xxdk.CMIXParams, error) { + p := &xxdk.CMIXParams{} + err := p.Unmarshal(data) + return *p, err +} + +func parseE2EParams(data []byte) (xxdk.E2EParams, error) { + p := &xxdk.E2EParams{} + err := p.Unmarshal(data) + return *p, err +} diff --git a/bindings/restlike.go b/bindings/restlike.go index c6c31c7ae744e644747a8da6018471fd03b8680e..b1a6fbd2167b681c51c71841c32260e07c8e9de6 100644 --- a/bindings/restlike.go +++ b/bindings/restlike.go @@ -1,14 +1,16 @@ -//////////////////////////////////////////////////////////////////////////////// -// Copyright © 2022 Privategrity Corporation / -// / -// All rights reserved. / -//////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// package bindings import ( "encoding/json" - "gitlab.com/elixxir/client/e2e" + + jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/restlike" "gitlab.com/elixxir/client/restlike/connect" ) @@ -33,7 +35,13 @@ type RestlikeMessage struct { // RestlikeRequest performs a normal restlike request // request - marshalled RestlikeMessage // Returns marshalled result RestlikeMessage -func RestlikeRequest(clientID int, connectionID int, request []byte) ([]byte, error) { +func RestlikeRequest(clientID, connectionID int, request, + e2eParamsJSON []byte) ([]byte, error) { + if len(e2eParamsJSON) == 0 { + jww.WARN.Printf("restlike params unspecified, using defaults") + e2eParamsJSON = GetDefaultE2EParams() + } + cl, err := cmixTrackerSingleton.get(clientID) if err != nil { return nil, err @@ -43,6 +51,11 @@ func RestlikeRequest(clientID int, connectionID int, request []byte) ([]byte, er return nil, err } + params, err := parseE2EParams(e2eParamsJSON) + if err != nil { + return nil, err + } + msg := &RestlikeMessage{} err = json.Unmarshal(request, msg) if err != nil { @@ -58,7 +71,7 @@ func RestlikeRequest(clientID int, connectionID int, request []byte) ([]byte, er result, err := c.Request(restlike.Method(msg.Method), restlike.URI(msg.URI), msg.Content, &restlike.Headers{ Headers: msg.Headers, Version: msg.Version, - }, e2e.GetDefaultParams()) + }, params.Base) if err != nil { return nil, err } @@ -77,7 +90,17 @@ func RestlikeRequest(clientID int, connectionID int, request []byte) ([]byte, er // RestlikeRequestAuth performs an authenticated restlike request // request - marshalled RestlikeMessage // Returns marshalled result RestlikeMessage -func RestlikeRequestAuth(clientID int, authConnectionID int, request []byte) ([]byte, error) { +func RestlikeRequestAuth(clientID int, authConnectionID int, request, + e2eParamsJSON []byte) ([]byte, error) { + if len(e2eParamsJSON) == 0 { + jww.WARN.Printf("restlike params unspecified, using defaults") + e2eParamsJSON = GetDefaultE2EParams() + } + params, err := parseE2EParams(e2eParamsJSON) + if err != nil { + return nil, err + } + cl, err := cmixTrackerSingleton.get(clientID) if err != nil { return nil, err @@ -102,7 +125,7 @@ func RestlikeRequestAuth(clientID int, authConnectionID int, request []byte) ([] result, err := c.Request(restlike.Method(msg.Method), restlike.URI(msg.URI), msg.Content, &restlike.Headers{ Headers: msg.Headers, Version: msg.Version, - }, e2e.GetDefaultParams()) + }, params.Base) if err != nil { return nil, err } diff --git a/bindings/restlikeSingle.go b/bindings/restlikeSingle.go new file mode 100644 index 0000000000000000000000000000000000000000..f6ddee5fcf2acafdfcd8f72aa80fc7916cafa5f9 --- /dev/null +++ b/bindings/restlikeSingle.go @@ -0,0 +1,100 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + +package bindings + +import ( + "encoding/json" + + "gitlab.com/elixxir/client/restlike" + "gitlab.com/elixxir/client/restlike/single" + "gitlab.com/elixxir/crypto/contact" +) + +// RestlikeCallback is the public function type bindings can use to make an asynchronous restlike request +// It accepts a json marshalled restlike.Message and an error (the results of calling json.Marshal on the message) +type RestlikeCallback interface { + Callback([]byte, error) +} + +// RequestRestLike sends a restlike request to a given contact +// Accepts marshalled contact object as recipient, marshalled RestlikeMessage and params JSON +// Returns json marshalled restlike.Message & error +func RequestRestLike(e2eID int, recipient, request, paramsJSON []byte) ([]byte, error) { + c, err := e2eTrackerSingleton.get(e2eID) + if err != nil { + return nil, err + } + req := single.Request{ + Net: c.api.GetCmix(), + Rng: c.api.GetRng().GetStream(), + E2eGrp: c.api.GetStorage().GetE2EGroup(), + } + + message := &RestlikeMessage{} + err = json.Unmarshal(request, message) + + recipientContact, err := contact.Unmarshal(recipient) + if err != nil { + return nil, err + } + + params, err := parseSingleUseParams(paramsJSON) + if err != nil { + return nil, err + } + + resp, err := req.Request(recipientContact, restlike.Method(message.Method), restlike.URI(message.URI), + message.Content, &restlike.Headers{ + Headers: message.Headers, + Version: 0, + }, params) + if err != nil { + return nil, err + } + return json.Marshal(resp) +} + +// AsyncRequestRestLike sends an asynchronous restlike request to a given contact +// Accepts e2e client ID, marshalled contact object as recipient, +// marshalled RestlikeMessage, marshalled Params json, and a RestlikeCallback +// Returns an error, and the RestlikeCallback will be called with the results +// of json marshalling the response when received +func AsyncRequestRestLike(e2eID int, recipient, request, paramsJSON []byte, cb RestlikeCallback) error { + c, err := e2eTrackerSingleton.get(e2eID) + if err != nil { + return err + } + req := single.Request{ + Net: c.api.GetCmix(), + Rng: c.api.GetRng().GetStream(), + E2eGrp: c.api.GetStorage().GetE2EGroup(), + } + + message := &RestlikeMessage{} + err = json.Unmarshal(request, message) + + recipientContact, err := contact.Unmarshal(recipient) + if err != nil { + return err + } + + rlcb := func(message *restlike.Message) { + cb.Callback(json.Marshal(message)) + } + + params, err := parseSingleUseParams(paramsJSON) + if err != nil { + return err + } + + return req.AsyncRequest(recipientContact, restlike.Method(message.Method), restlike.URI(message.URI), + message.Content, &restlike.Headers{ + Headers: message.Headers, + Version: 0, + }, rlcb, params) +} diff --git a/bindings/secrets.go b/bindings/secrets.go index f5f23eadd16beb8651a5d4a083801ac802b566ef..5bdeeed03c35cf6e0af99b8a64aaf54f213e8a23 100644 --- a/bindings/secrets.go +++ b/bindings/secrets.go @@ -1,3 +1,10 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + package bindings import ( diff --git a/bindings/secrets_test.go b/bindings/secrets_test.go index c2422a319986881ff9567d37d8090d3e0230188c..60b03a2d42b8b564e4dbf134aab92c4cf189e401 100644 --- a/bindings/secrets_test.go +++ b/bindings/secrets_test.go @@ -1,3 +1,10 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + package bindings import ( diff --git a/bindings/single.go b/bindings/single.go new file mode 100644 index 0000000000000000000000000000000000000000..c54bfeecabcb762be47aed7c8f023da1b2a7a23f --- /dev/null +++ b/bindings/single.go @@ -0,0 +1,188 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + +package bindings + +import ( + "encoding/json" + + "gitlab.com/elixxir/client/cmix/identity/receptionID" + "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/single" + "gitlab.com/elixxir/crypto/contact" + "gitlab.com/xx_network/primitives/id" +) + +/* PUBLIC WRAPPER METHODS */ + +// TransmitSingleUse accepts a marshalled recipient contact object, tag, payload, params JSON, SingleUseResponse callback func & a +// Client. Transmits payload to recipient via single use +func TransmitSingleUse(e2eID int, recipient []byte, tag string, payload, paramsJSON []byte, responseCB SingleUseResponse) ([]byte, error) { + e2eCl, err := e2eTrackerSingleton.get(e2eID) + if err != nil { + return nil, err + } + + recipientContact, err := contact.Unmarshal(recipient) + if err != nil { + return nil, err + } + + rcb := &singleUseResponse{response: responseCB} + + params, err := parseSingleUseParams(paramsJSON) + if err != nil { + return nil, err + } + + rids, eid, err := single.TransmitRequest(recipientContact, tag, payload, rcb, params, e2eCl.api.GetCmix(), e2eCl.api.GetRng().GetStream(), e2eCl.api.GetStorage().GetE2EGroup()) + + if err != nil { + return nil, err + } + sr := SingleUseSendReport{ + EphID: eid.EphId.Int64(), + ReceptionID: eid.Source.Marshal(), + RoundsList: makeRoundsList(rids), + } + return json.Marshal(sr) +} + +// Listen starts a single use listener on a given tag using the passed in client and SingleUseCallback func +func Listen(e2eID int, tag string, cb SingleUseCallback) (StopFunc, error) { + e2eCl, err := e2eTrackerSingleton.get(e2eID) + if err != nil { + return nil, err + } + + listener := singleUseListener{scb: cb} + dhpk, err := e2eCl.api.GetReceptionIdentity().GetDHKeyPrivate() + if err != nil { + return nil, err + } + l := single.Listen(tag, e2eCl.api.GetReceptionIdentity().ID, dhpk, e2eCl.api.GetCmix(), e2eCl.api.GetStorage().GetE2EGroup(), listener) + return l.Stop, nil +} + +// JSON Types + +// SingleUseSendReport is the bindings struct used to represent information returned by single.TransmitRequest +// +// Example json marshalled struct: +// {"Rounds":[1,5,9], +// "EphID":{"EphId":[0,0,0,0,0,0,3,89], +// "Source":"emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD"}} +type SingleUseSendReport struct { + RoundsList + ReceptionID []byte + EphID int64 +} + +// SingleUseResponseReport is the bindings struct used to represent information passed +// to the single.Response callback interface in response to single.TransmitRequest +// +// Example json marshalled struct: +// {"Rounds":[1,5,9], +// "Payload":"rSuPD35ELWwm5KTR9ViKIz/r1YGRgXIl5792SF8o8piZzN6sT4Liq4rUU/nfOPvQEjbfWNh/NYxdJ72VctDnWw==", +// "ReceptionID":{"EphId":[0,0,0,0,0,0,3,89], +// "Source":"emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD"}, +// "Err":null} +type SingleUseResponseReport struct { + RoundsList + Payload []byte + ReceptionID []byte + EphID int64 + Err error +} + +// SingleUseCallbackReport is the bindings struct used to represent single use messages +// received by a callback passed into single.Listen +// +// Example json marshalled struct: +// {"Rounds":[1,5,9], +// "Payload":"rSuPD35ELWwm5KTR9ViKIz/r1YGRgXIl5792SF8o8piZzN6sT4Liq4rUU/nfOPvQEjbfWNh/NYxdJ72VctDnWw==", +// "Partner":"emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD", +// "EphID":{"EphId":[0,0,0,0,0,0,3,89], +// "Source":"emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD"}} +type SingleUseCallbackReport struct { + RoundsList + Payload []byte + Partner *id.ID + EphID int64 + ReceptionID []byte +} + +// Function types + +// StopFunc is the function to stop a listener returned to the bindings layer when one is started +type StopFunc func() + +// SingleUseCallback func is passed into Listen and called when messages are received +// Accepts a SingleUseCallbackReport marshalled to json +type SingleUseCallback interface { + Callback(callbackReport []byte, err error) +} + +// SingleUseResponse is the public facing callback func passed by bindings clients into TransmitSingleUse +// Accepts a SingleUseResponseReport marshalled to json +type SingleUseResponse interface { + Callback(responseReport []byte, err error) +} + +/* CALLBACK WRAPPERS */ + +/* listener struct */ + +// singleUseListener is the internal struct used to wrap a SingleUseCallback func, +// which matches the single.Receiver interface +type singleUseListener struct { + scb SingleUseCallback +} + +// Callback is called whenever a single use message is heard by the listener, and translates the info to +//a SingleUseCallbackReport which is marshalled & passed to bindings +func (sl singleUseListener) Callback(req *single.Request, eid receptionID.EphemeralIdentity, rl []rounds.Round) { + var rids []id.Round + for _, r := range rl { + rids = append(rids, r.ID) + } + + // Todo: what other info from req needs to get to bindings + scr := SingleUseCallbackReport{ + Payload: req.GetPayload(), + RoundsList: makeRoundsList(rids), + Partner: req.GetPartner(), + EphID: eid.EphId.Int64(), + ReceptionID: eid.Source.Marshal(), + } + + sl.scb.Callback(json.Marshal(scr)) +} + +/* response struct */ + +// singleUseResponse is the private struct backing SingleUseResponse, which subscribes to the single.Response interface +type singleUseResponse struct { + response SingleUseResponse +} + +// Callback builds a SingleUseSendReport & passes the json marshalled version into the callback +func (sr singleUseResponse) Callback(payload []byte, receptionID receptionID.EphemeralIdentity, + rounds []rounds.Round, err error) { + var rids []id.Round + for _, r := range rounds { + rids = append(rids, r.ID) + } + sendReport := SingleUseResponseReport{ + RoundsList: makeRoundsList(rids), + ReceptionID: receptionID.Source.Marshal(), + EphID: receptionID.EphId.Int64(), + Payload: payload, + Err: err, + } + sr.response.Callback(json.Marshal(&sendReport)) +} diff --git a/bindings/single_test.go b/bindings/single_test.go new file mode 100644 index 0000000000000000000000000000000000000000..be543bb7e0a972085c871a781a0a6e0bb9d43af7 --- /dev/null +++ b/bindings/single_test.go @@ -0,0 +1,75 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + +package bindings + +import ( + "encoding/json" + "testing" + "time" + + "gitlab.com/elixxir/client/cmix/identity/receptionID" + "gitlab.com/xx_network/crypto/csprng" + "gitlab.com/xx_network/primitives/id" + "gitlab.com/xx_network/primitives/id/ephemeral" +) + +func TestSingleUseJsonMarshals(t *testing.T) { + rids := []id.Round{1, 5, 9} + rl := makeRoundsList(rids) + rid := id.NewIdFromString("zezima", id.User, t) + eid, _, _, err := ephemeral.GetId(rid, 16, time.Now().UnixNano()) + if err != nil { + t.Fatalf("Failed to generate ephemeral id: %+v", err) + } + ephId := receptionID.EphemeralIdentity{ + EphId: eid, + Source: rid, + } + payload := make([]byte, 64) + rng := csprng.NewSystemRNG() + rng.Read(payload) + sendReport := SingleUseSendReport{ + RoundsList: rl, + EphID: ephId.EphId.Int64(), + ReceptionID: ephId.Source.Marshal(), + } + srm, err := json.Marshal(sendReport) + if err != nil { + t.Errorf("Failed to marshal send report to JSON: %+v", err) + } else { + t.Logf("Marshalled send report:\n%s\n", string(srm)) + } + + responseReport := SingleUseResponseReport{ + RoundsList: rl, + Payload: payload, + ReceptionID: ephId.Source.Marshal(), + EphID: ephId.EphId.Int64(), + Err: nil, + } + rrm, err := json.Marshal(responseReport) + if err != nil { + t.Errorf("Failed to marshal response report to JSON: %+v", err) + } else { + t.Logf("Marshalled response report:\n%s\n", string(rrm)) + } + + callbackReport := SingleUseCallbackReport{ + RoundsList: rl, + Payload: payload, + Partner: rid, + EphID: ephId.EphId.Int64(), + ReceptionID: ephId.Source.Marshal(), + } + crm, err := json.Marshal(callbackReport) + if err != nil { + t.Errorf("Failed to marshal callback report to JSON: %+v", err) + } else { + t.Logf("Marshalled callback report:\n%s\n", string(crm)) + } +} diff --git a/bindings/version.go b/bindings/version.go index 4d6a4b2dc2dd86b1881aa3c918062cd50052fd98..ad7ddc66e800713d84f2d3858f854d6b5cedb6aa 100644 --- a/bindings/version.go +++ b/bindings/version.go @@ -1,8 +1,11 @@ -//////////////////////////////////////////////////////////////////////////////// -// Copyright © 2022 Privategrity Corporation / -// / -// All rights reserved. / -//////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + +// version.go contains functions to report the client version. package bindings diff --git a/cmd/backup.go b/cmd/backup.go new file mode 100644 index 0000000000000000000000000000000000000000..c8a5c78608785a10f8b18d2813a5a9a4197c7933 --- /dev/null +++ b/cmd/backup.go @@ -0,0 +1,116 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2022 Privategrity Corporation / +// / +// All rights reserved. / +//////////////////////////////////////////////////////////////////////////////// + +package cmd + +import ( + "encoding/json" + "io/fs" + "io/ioutil" + "os" + + "github.com/pkg/errors" + jww "github.com/spf13/jwalterweatherman" + "github.com/spf13/viper" + "gitlab.com/elixxir/client/backup" + "gitlab.com/elixxir/client/xxdk" + backupCrypto "gitlab.com/elixxir/crypto/backup" + "gitlab.com/xx_network/primitives/utils" +) + +// loadOrInitBackup will build a new xxdk.E2e from existing storage +// or from a new storage that it will create if none already exists +func loadOrInitBackup(backupPath string, backupPass string, password []byte, storeDir string, + cmixParams xxdk.CMIXParams, e2eParams xxdk.E2EParams) *xxdk.E2e { + jww.INFO.Printf("Using Backup sender") + + // create a new client if none exist + if _, err := os.Stat(storeDir); errors.Is(err, fs.ErrNotExist) { + // Initialize from scratch + ndfJson, err := ioutil.ReadFile(viper.GetString("ndf")) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + b, backupFile := loadBackup(backupPath, backupPass) + + // Marshal the backup object in JSON + backupJson, err := json.Marshal(b) + if err != nil { + jww.FATAL.Panicf("Failed to JSON Marshal backup: %+v", err) + } + + // Write the backup JSON to file + err = utils.WriteFileDef(viper.GetString("backupJsonOut"), backupJson) + if err != nil { + jww.FATAL.Panicf("Failed to write backup to file: %+v", err) + } + + // Construct client from backup data + backupIdList, _, err := backup.NewClientFromBackup(string(ndfJson), storeDir, + password, []byte(backupPass), backupFile) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + backupIdListPath := viper.GetString("backupIdList") + if backupIdListPath != "" { + // Marshal backed up ID list to JSON + backedUpIdListJson, err := json.Marshal(backupIdList) + if err != nil { + jww.FATAL.Panicf("Failed to JSON Marshal backed up IDs: %+v", err) + } + + // Write backed up ID list to file + err = utils.WriteFileDef(backupIdListPath, backedUpIdListJson) + if err != nil { + jww.FATAL.Panicf("Failed to write backed up IDs to file %q: %+v", + backupIdListPath, err) + } + } + } + // Initialize from storage + net, err := xxdk.LoadCmix(storeDir, password, cmixParams) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + // Load or initialize xxdk.ReceptionIdentity storage + identity, err := xxdk.LoadReceptionIdentity(identityStorageKey, net) + if err != nil { + identity, err = xxdk.MakeLegacyReceptionIdentity(net) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + err = xxdk.StoreReceptionIdentity(identityStorageKey, identity, net) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + } + + messenger, err := xxdk.Login(net, authCbs, identity, e2eParams) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + return messenger +} + +func loadBackup(backupPath, backupPass string) (backupCrypto.Backup, []byte) { + jww.INFO.Printf("Loading backup from path %q", backupPath) + backupFile, err := utils.ReadFile(backupPath) + if err != nil { + jww.FATAL.Panicf("%v", err) + } + + var b backupCrypto.Backup + err = b.Decrypt(backupPass, backupFile) + if err != nil { + jww.FATAL.Panicf("Failed to decrypt backup: %+v", err) + } + + return b, backupFile +} diff --git a/cmd/broadcast.go b/cmd/broadcast.go index c3221e938a4ad6814f27a8d032aa5561da971356..c5e292fc43ccbb480c58e4b10a60ae09c25cb6fd 100644 --- a/cmd/broadcast.go +++ b/cmd/broadcast.go @@ -2,6 +2,9 @@ package cmd import ( "fmt" + "os" + "time" + "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" @@ -12,9 +15,7 @@ import ( crypto "gitlab.com/elixxir/crypto/broadcast" "gitlab.com/xx_network/crypto/signature/rsa" "gitlab.com/xx_network/primitives/utils" - "os" "sync" - "time" ) // singleCmd is the single-use subcommand that allows for sening and responding @@ -24,7 +25,8 @@ var broadcastCmd = &cobra.Command{ Short: "Send broadcast messages", Args: cobra.NoArgs, Run: func(cmd *cobra.Command, args []string) { - client := initE2e() + cmixParams, e2eParams := initParams() + client := initE2e(cmixParams, e2eParams) // Write user contact to file user := client.GetReceptionIdentity() @@ -46,8 +48,8 @@ var broadcastCmd = &cobra.Command{ /* Set up underlying crypto broadcast.Channel */ var channel *crypto.Channel var pk *rsa.PrivateKey - keyPath := viper.GetString("keyPath") - path, err := utils.ExpandPath(viper.GetString("chanPath")) + keyPath := viper.GetString(broadcastKeyPathFlag) + path, err := utils.ExpandPath(viper.GetString(broadcastChanPathFlag)) if utils.Exists(path) { // Load symmetric from path cBytes, err := utils.ReadFile(path) @@ -60,8 +62,8 @@ var broadcastCmd = &cobra.Command{ } } else { // Load in broadcast channel info - name := viper.GetString("name") - desc := viper.GetString("description") + name := viper.GetString(broadcastNameFlag) + desc := viper.GetString(broadcastDescriptionFlag) if name == "" { jww.FATAL.Panicf("Name cannot be empty") } else if desc == "" { @@ -69,7 +71,7 @@ var broadcastCmd = &cobra.Command{ } var cryptChannel *crypto.Channel - if viper.GetBool("new") { + if viper.GetBool(broadcastNewFlag) { // Create a new broadcast channel cryptChannel, pk, err = crypto.NewChannel(name, desc, client.GetRng().GetStream()) if err != nil { @@ -87,12 +89,12 @@ var broadcastCmd = &cobra.Command{ fmt.Printf("New broadcast channel generated") } else { // Read rest of info from config & build object manually - pubKeyBytes := []byte(viper.GetString("rsaPub")) + pubKeyBytes := []byte(viper.GetString(broadcastRsaPubFlag)) pubKey, err := rsa.LoadPublicKeyFromPem(pubKeyBytes) if err != nil { jww.FATAL.Panicf("Failed to load public key at path: %+v", err) } - salt := []byte(viper.GetString("salt")) + salt := []byte(viper.GetString(broadcastSaltFlag)) rid, err := crypto.NewChannelID(name, desc, salt, pubKeyBytes) if err != nil { @@ -159,7 +161,7 @@ var broadcastCmd = &cobra.Command{ } err = bcl.RegisterListener(scb, broadcast.Symmetric) if err != nil { - jww.FATAL.Panicf("Failed to register symmetric listener: %+v", err) + jww.FATAL.Panicf("Failed to register asymmetric listener: %+v", err) } // Create & register asymmetric receiver callback @@ -237,11 +239,12 @@ var broadcastCmd = &cobra.Command{ wg.Wait() } + /* Create properly sized broadcast message */ /* Receive broadcast messages over the channel */ jww.INFO.Printf("Waiting for message reception...") - waitSecs := viper.GetUint("waitTimeout") - expectedCnt := viper.GetUint("receiveCount") + waitSecs := viper.GetUint(waitTimeoutFlag) + expectedCnt := viper.GetUint(receiveCountFlag) waitTimeout := time.Duration(waitSecs) * time.Second receivedCount := uint(0) done := false @@ -288,41 +291,43 @@ var broadcastCmd = &cobra.Command{ func init() { // Single-use subcommand options - broadcastCmd.Flags().StringP("name", "", "", + broadcastCmd.Flags().StringP(broadcastNameFlag, "", "", "Symmetric channel name") - _ = viper.BindPFlag("name", broadcastCmd.Flags().Lookup("name")) + bindFlagHelper(broadcastNameFlag, broadcastCmd) - broadcastCmd.Flags().StringP("rsaPub", "", "", + broadcastCmd.Flags().StringP(broadcastRsaPubFlag, "", "", "Broadcast channel rsa pub key") - _ = viper.BindPFlag("rsaPub", broadcastCmd.Flags().Lookup("rsaPub")) + bindFlagHelper(broadcastRsaPubFlag, broadcastCmd) - broadcastCmd.Flags().StringP("salt", "", "", + broadcastCmd.Flags().StringP(broadcastSaltFlag, "", "", "Broadcast channel salt") - _ = viper.BindPFlag("salt", broadcastCmd.Flags().Lookup("salt")) + bindFlagHelper(broadcastSaltFlag, broadcastCmd) - broadcastCmd.Flags().StringP("description", "", "", + broadcastCmd.Flags().StringP(broadcastDescriptionFlag, "", "", "Broadcast channel description") - _ = viper.BindPFlag("description", broadcastCmd.Flags().Lookup("description")) + bindFlagHelper(broadcastDescriptionFlag, broadcastCmd) - broadcastCmd.Flags().StringP("chanPath", "", "", + broadcastCmd.Flags().StringP(broadcastChanPathFlag, "", "", "Broadcast channel output path") - _ = viper.BindPFlag("chanPath", broadcastCmd.Flags().Lookup("chanPath")) + bindFlagHelper(broadcastChanPathFlag, broadcastCmd) - broadcastCmd.Flags().StringP("keyPath", "", "", + broadcastCmd.Flags().StringP(broadcastKeyPathFlag, "", "", "Broadcast channel private key output path") - _ = viper.BindPFlag("keyPath", broadcastCmd.Flags().Lookup("keyPath")) + bindFlagHelper(broadcastKeyPathFlag, broadcastCmd) - broadcastCmd.Flags().BoolP("new", "", false, + broadcastCmd.Flags().BoolP(broadcastNewFlag, "", false, "Create new broadcast channel") - _ = viper.BindPFlag("new", broadcastCmd.Flags().Lookup("new")) + bindFlagHelper(broadcastNewFlag, broadcastCmd) - broadcastCmd.Flags().StringP("symmetric", "", "", + broadcastCmd.Flags().StringP(broadcastSymmetricFlag, "", "", "Send symmetric broadcast message") _ = viper.BindPFlag("symmetric", broadcastCmd.Flags().Lookup("symmetric")) + bindFlagHelper(broadcastSymmetricFlag, broadcastCmd) - broadcastCmd.Flags().StringP("asymmetric", "", "", + broadcastCmd.Flags().StringP(broadcastAsymmetricFlag, "", "", "Send asymmetric broadcast message (must be used with keyPath)") _ = viper.BindPFlag("asymmetric", broadcastCmd.Flags().Lookup("asymmetric")) + bindFlagHelper(broadcastAsymmetricFlag, broadcastCmd) rootCmd.AddCommand(broadcastCmd) } diff --git a/cmd/callbacks.go b/cmd/callbacks.go index d5d75a321f7e215062738184bbaab954812c29b6..d700147c0d3e290b86e715e0b204c7b6bca8d11c 100644 --- a/cmd/callbacks.go +++ b/cmd/callbacks.go @@ -10,6 +10,7 @@ package cmd import ( "fmt" + "github.com/spf13/viper" "gitlab.com/elixxir/client/xxdk" @@ -26,18 +27,20 @@ import ( type authCallbacks struct { autoConfirm bool confCh chan *id.ID + params xxdk.E2EParams } -func makeAuthCallbacks(autoConfirm bool) *authCallbacks { +func makeAuthCallbacks(autoConfirm bool, params xxdk.E2EParams) *authCallbacks { return &authCallbacks{ autoConfirm: autoConfirm, confCh: make(chan *id.ID, 10), + params: params, } } func (a *authCallbacks) Request(requestor contact.Contact, receptionID receptionID.EphemeralIdentity, - round rounds.Round, client *xxdk.E2e) { + round rounds.Round, messenger *xxdk.E2e) { msg := fmt.Sprintf("Authentication channel request from: %s\n", requestor.ID) jww.INFO.Printf(msg) @@ -45,10 +48,10 @@ func (a *authCallbacks) Request(requestor contact.Contact, if a.autoConfirm { jww.INFO.Printf("Channel Request: %s", requestor.ID) - if viper.GetBool("verify-sends") { // Verify message sends were successful - acceptChannelVerified(client, requestor.ID) + if viper.GetBool(verifySendFlag) { // Verify message sends were successful + acceptChannelVerified(messenger, requestor.ID, a.params) } else { - acceptChannel(client, requestor.ID) + acceptChannel(messenger, requestor.ID) } a.confCh <- requestor.ID @@ -57,15 +60,15 @@ func (a *authCallbacks) Request(requestor contact.Contact, } func (a *authCallbacks) Confirm(requestor contact.Contact, - receptionID receptionID.EphemeralIdentity, - round rounds.Round, client *xxdk.E2e) { + _ receptionID.EphemeralIdentity, + _ rounds.Round, _ *xxdk.E2e) { jww.INFO.Printf("Channel Confirmed: %s", requestor.ID) a.confCh <- requestor.ID } func (a *authCallbacks) Reset(requestor contact.Contact, - receptionID receptionID.EphemeralIdentity, - round rounds.Round, client *xxdk.E2e) { + _ receptionID.EphemeralIdentity, + _ rounds.Round, _ *xxdk.E2e) { msg := fmt.Sprintf("Authentication channel reset from: %s\n", requestor.ID) jww.INFO.Printf(msg) diff --git a/cmd/deployment.go b/cmd/deployment.go new file mode 100644 index 0000000000000000000000000000000000000000..f5350d516b2beff594fae0d0f70568c3318c2484 --- /dev/null +++ b/cmd/deployment.go @@ -0,0 +1,130 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2022 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + +package cmd + +// Deployment environment constants for the download-ndf code path +const ( + mainnet = "mainnet" + release = "release" + dev = "dev" + testnet = "testnet" +) + +// URL constants pointing to the NDF of the associated deployment environment +// requested for the download-ndf code path. +const ( + mainNetUrl = "https://elixxir-bins.s3.us-west-1.amazonaws.com/ndf/mainnet.json" + releaseUrl = "https://elixxir-bins.s3.us-west-1.amazonaws.com/ndf/release.json" + devUrl = "https://elixxir-bins.s3.us-west-1.amazonaws.com/ndf/default.json" + testNetUrl = "https://elixxir-bins.s3.us-west-1.amazonaws.com/ndf/testnet.json" +) + +// Certificates for deployment environments. Used to verify NDF signatures. +const ( + mainNetCert = `-----BEGIN CERTIFICATE----- +MIIFqTCCA5GgAwIBAgIUO0qHXSeKrOMucO+Zz82Mf1Zlq4gwDQYJKoZIhvcNAQEL +BQAwgYAxCzAJBgNVBAYTAktZMRQwEgYDVQQHDAtHZW9yZ2UgVG93bjETMBEGA1UE +CgwKeHggbmV0d29yazEPMA0GA1UECwwGRGV2T3BzMRMwEQYDVQQDDAp4eC5uZXR3 +b3JrMSAwHgYJKoZIhvcNAQkBFhFhZG1pbnNAeHgubmV0d29yazAeFw0yMTEwMzAy +MjI5MjZaFw0zMTEwMjgyMjI5MjZaMIGAMQswCQYDVQQGEwJLWTEUMBIGA1UEBwwL +R2VvcmdlIFRvd24xEzARBgNVBAoMCnh4IG5ldHdvcmsxDzANBgNVBAsMBkRldk9w +czETMBEGA1UEAwwKeHgubmV0d29yazEgMB4GCSqGSIb3DQEJARYRYWRtaW5zQHh4 +Lm5ldHdvcmswggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQD08ixnPWwz +FtBIEWx2SnFjBsdrSWCp9NcWXRtGWeq3ACz+ixiflj/U9U4b57aULeOAvcoC7bwU +j5w3oYxRmXIV40QSevx1z9mNcW3xbbacQ+yCgPPhhj3/c285gVVOUzURLBTNAi9I +EA59zAb8Vy0E6zfq4HRAhH11Q/10QgDjEXuGXra1k3IlemVsouiJGNAtKojNDE1N +x9HnraSEiXzdnV2GDplEvMHaLd3s9vs4XsiLB3VwKyHv7EH9+LOIra6pr5BWw+kD +2qHKGmQMOQe0a7nCirW/k9axH0WiA0XWuQu3U1WfcMEfdC/xn1vtubrdYjtzpXUy +oUEX5eHfu4OlA/zoH+trocfARDyBmTVbDy0P9imH//a6GUKDui9r3fXwEy5YPMhb +dKaNc7QWLPHMh1n25h559z6PqxxPT6UqFFbZD2gTw1sbbpjyqhLbnYguurkxY3jZ +ztW337hROzQ1/abbg/P59JA95Pmhkl8nqqDEf0buOmvMazq3Lwg92nuZ8gsdMKXB +xaEtTTpxhTPOqzc1/XQgScZnc+092MBDh3C2GMxzylOIdk+yF2Gyb+VWPUe29dSa +azzxsDXzRy8y8jaOjdSUWaLa/MgS5Dg1AfHtD55bdvqYzw3NEXIVarpMlzl+Z+6w +jvuwz8GyoMSVe+YEGgvSDvlfY/z19aqneQIDAQABoxkwFzAVBgNVHREEDjAMggp4 +eC5uZXR3b3JrMA0GCSqGSIb3DQEBCwUAA4ICAQCp0JDub2w5vZQvFREyA+utZ/+s +XT05j1iTgIRKMa3nofDGERYJUG7FcTd373I2baS70PGx8FF1QuXhn4DNNZlW/SZt +pa1d0pAerqFrIzwOuWVDponYHQ8ayvsT7awCbwZEZE4RhooqS4LqnvtgFu/g7LuM +zkFN8TER7HAUn3P7BujLvcgtqk2LMDz+AgBRszDp/Bw7+1EJDeG9d7hC/stXgDV/ +vpD1YDpxSmW4zjezFJqV6OdMOwo9RWVIktK3RXbFc6I5UJZ5kmzPe/I2oPPCBQvD +G3VqFLQe5ik5rXP7SgAN1fL/7KuQna0s42hkV64Z2ymCX69G1ofpgpEFaQLaxLbj +QOun0r8A3NyKvHRIh4K0dFcc3FSOF60Y6k769HKbOPmSDjSSg0qO9GEONBJ8BxAT +IHcHoTAOQoqGehdzepXQSjHsPqTXv3ZFFwCCgO0toI0Qhqwo89X6R3k+i4Kaktr7 +mLiPO8s0nq1PZ1XrybKE9BCHkYH1JkUDA+M0pn4QAEx/BuM0QnGXoi1sImW3pEUG +NP7fjkISrD48P8P/TLS45sx5pB8MNGEsRw0lBKmuOdWDmdfhOltB6JxmbhpstNZp +6LVLK6SEOwE76xnHiisR2KyhTTiroUq73BgPFWkWhoJDPbmL1DHgnbdKwwstG8Qu +UGb8k8vh6tzqYZAOKg== +-----END CERTIFICATE-----` + releaseCert = `-----BEGIN CERTIFICATE----- +MIIFtjCCA56gAwIBAgIJAJnUcpLbGSQiMA0GCSqGSIb3DQEBCwUAMIGMMQswCQYD +VQQGEwJVUzELMAkGA1UECAwCQ0ExEjAQBgNVBAcMCUNsYXJlbW9udDEQMA4GA1UE +CgwHRWxpeHhpcjEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxEzARBgNVBAMMCmVsaXh4 +aXIuaW8xHzAdBgkqhkiG9w0BCQEWEGFkbWluQGVsaXh4aXIuaW8wHhcNMjAxMTE3 +MTkwMTUyWhcNMjIxMTE3MTkwMTUyWjCBjDELMAkGA1UEBhMCVVMxCzAJBgNVBAgM +AkNBMRIwEAYDVQQHDAlDbGFyZW1vbnQxEDAOBgNVBAoMB0VsaXh4aXIxFDASBgNV +BAsMC0RldmVsb3BtZW50MRMwEQYDVQQDDAplbGl4eGlyLmlvMR8wHQYJKoZIhvcN +AQkBFhBhZG1pbkBlbGl4eGlyLmlvMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAvtByOoSS8SeMLvvHIuOGfnx0VgweveJHX93LUyJxr1RlVBXCgC5/QOQN +N3dmKWzu4YwaA2jtwaAMhkgdfyOcw6kuqfvQjxv99XRIRKM4GZQkJiym2cnorNu7 +hm2/bxmj5TjpP9+vFzbjkJrpRQ80hsV7I9+NKzIhMK4YTgte/F/q9URESlMZxTbb +MFh3s5iiBfBLRNFFsHVdy8OVH+Jv5901cLn+yowaMDLrBMOWGlRROg82ZeRAranX +9X1s+6BclJ/cBe/LcDxGso5sco6UzrWHzpDTnOTzHoamQHYCXtAZP4XbzcqI6A5i +GFM2akuG9Wv3XZZv/6eJRnKS2GLkvv7dtzv+nalxoBKtyIE8ICIVOrb+pVJvY1Id +HOXkK9MEJJ6sZhddipUaQw6hD4I0dNEt30Ugq9zTgFcEnM2R7qKpIDmxrRbcl280 +TQGNYgdidzleNdZbjcTvsMVhcxPXCY+bVX1xICD1oJiZZbZFejBvPEfLYyzSdYp+ +awX5OnLVSrQtTJu9yz5q3q5pHhxJnqS/CVGLTvzLfmk7BGwRZZuK87LnSixyYfpd +S23qI45AEUINEE0HDZsI+KBq0oVlDB0Z3AZpWauRDqY3o6JIbIOpqmZc6KntyL7j +YCAhbB1tchS47PpbIxUgMMGoR3MBkJutPqtTWCEE3l5jvv0CknUCAwEAAaMZMBcw +FQYDVR0RBA4wDIIKZWxpeHhpci5pbzANBgkqhkiG9w0BAQsFAAOCAgEACLoxE3nh +3VzXH2lQo1QzjKkG/+1m75T0l9Wn9uxa2W/90qBCfim1CPfWUstGdRLBi8gjDevV +zK5HN+Cpz2E22qByeN9fl6rJC4zd1vIdexEre5h7goWoV+qFPhOACElor1tF5UQ2 +GD+NFH+Z0ALG1u8db0hBv8NCbtD4YzcQzzINEbs9gp/Sq3cRzkz1wCufFwJwr7+R +0YqZfPj/v/w9G9wSUys1s3i4xr2u87T/bPF68VRg6r1+kXRSRevXd99wKwap52jY +zOwsDGZF9BHMpFVYR/yZhfzSK3F1DmvwuqOsfwSFIjrUjfRlwS28zyZ8rjBq1suD +EAdvYCLDmBSGssNh8E20PHmk5UROYFGEEhlK5ZKj/f1HOmMiOX461XK6HODYyitq +Six2dPi1ZlBJW83DyFqSWJaUR/CluBYmqrWoBX+chv54bU2Y9j/sA/O98wa7trsk +ctzvAcXjhXm6ESRVVD/iZvkW5MP2mkgbDpW3RP9souK5JzbcpC7i3hEcAqPSPgzL +94kHDpYNY7jcGQC4CjPdfBi+Tf6il/QLFRFgyHm2ze3+qrlPT6SQ4hSSH1iXyf4v +tlqu6u77fbF9yaHtq7dvYxH1WioIUxMqbIC1CNgGC1Y/LhzgLRKPSTBCrbQyTcGc +0b5cTzVKxdP6v6WOAXVOEkXTcBPZ4nEZxY0= +-----END CERTIFICATE-----` + devCert = `-----BEGIN CERTIFICATE----- +MIIF4DCCA8igAwIBAgIUegUvihtQooWNIzsNqj6lucXn6g8wDQYJKoZIhvcNAQEL +BQAwgYwxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTESMBAGA1UEBwwJQ2xhcmVt +b250MRAwDgYDVQQKDAdFbGl4eGlyMRQwEgYDVQQLDAtEZXZlbG9wbWVudDETMBEG +A1UEAwwKZWxpeHhpci5pbzEfMB0GCSqGSIb3DQEJARYQYWRtaW5AZWxpeHhpci5p +bzAeFw0yMTExMzAxODMwMTdaFw0zMTExMjgxODMwMTdaMIGMMQswCQYDVQQGEwJV +UzELMAkGA1UECAwCQ0ExEjAQBgNVBAcMCUNsYXJlbW9udDEQMA4GA1UECgwHRWxp +eHhpcjEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxEzARBgNVBAMMCmVsaXh4aXIuaW8x +HzAdBgkqhkiG9w0BCQEWEGFkbWluQGVsaXh4aXIuaW8wggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCckGabzUitkySleveyD9Yrxrpj50FiGkOvwkmgN1jF +9r5StN3otiU5tebderkjD82mVqB781czRA9vPqAggbw1ZdAyQPTvDPTj7rmzkByq +QIkdZBMshV/zX1z8oXoNB9bzZlUFVF4HTY3dEytAJONJRkGGAw4FTa/wCkWsITiT +mKvkP3ciKgz7s8uMyZzZpj9ElBphK9Nbwt83v/IOgTqDmn5qDBnHtoLw4roKJkC8 +00GF4ZUhlVSQC3oFWOCu6tvSUVCBCTUzVKYJLmCnoilmiE/8nCOU0VOivtsx88f5 +9RSPfePUk8u5CRmgThwOpxb0CAO0gd+sY1YJrn+FaW+dSR8OkM3bFuTq7fz9CEkS +XFfUwbJL+HzT0ZuSA3FupTIExyDmM/5dF8lC0RB3j4FNQF+H+j5Kso86e83xnXPI +e+IKKIYa/LVdW24kYRuBDpoONN5KS/F+F/5PzOzH9Swdt07J9b7z1dzWcLnKGtkN +WVsZ7Ue6cuI2zOEWqF1OEr9FladgORcdVBoF/WlsA63C2c1J0tjXqqcl/27GmqGW +gvhaA8Jkm20qLCEhxQ2JzrBdk/X/lCZdP/7A5TxnLqSBq8xxMuLJlZZbUG8U/BT9 +sHF5mXZyiucMjTEU7qHMR2UGNFot8TQ7ZXntIApa2NlB/qX2qI5D13PoXI9Hnyxa +8wIDAQABozgwNjAVBgNVHREEDjAMggplbGl4eGlyLmlvMB0GA1UdDgQWBBQimFud +gCzDVFD3Xz68zOAebDN6YDANBgkqhkiG9w0BAQsFAAOCAgEAccsH9JIyFZdytGxC +/6qjSHPgV23ZGmW7alg+GyEATBIAN187Du4Lj6cLbox5nqLdZgYzizVop32JQAHv +N1QPKjViOOkLaJprSUuRULa5kJ5fe+XfMoyhISI4mtJXXbMwl/PbOaDSdeDjl0ZO +auQggWslyv8ZOkfcbC6goEtAxljNZ01zY1ofSKUj+fBw9Lmomql6GAt7NuubANs4 +9mSjXwD27EZf3Aqaaju7gX1APW2O03/q4hDqhrGW14sN0gFt751ddPuPr5COGzCS +c3Xg2HqMpXx//FU4qHrZYzwv8SuGSshlCxGJpWku9LVwci1Kxi4LyZgTm6/xY4kB +5fsZf6C2yAZnkIJ8bEYr0Up4KzG1lNskU69uMv+d7W2+4Ie3Evf3HdYad/WeUskG +tc6LKY6B2NX3RMVkQt0ftsDaWsktnR8VBXVZSBVYVEQu318rKvYRdOwZJn339obI +jyMZC/3D721e5Anj/EqHpc3I9Yn3jRKw1xc8kpNLg/JIAibub8JYyDvT1gO4xjBO ++6EWOBFgDAsf7bSP2xQn1pQFWcA/sY1MnRsWeENmKNrkLXffP+8l1tEcijN+KCSF +ek1mr+qBwSaNV9TA+RXVhvqd3DEKPPJ1WhfxP1K81RdUESvHOV/4kdwnSahDyao0 +EnretBzQkeKeBwoB2u6NTiOmUjk= +-----END CERTIFICATE-----` + testNetCert = `` +) diff --git a/cmd/dumpRounds.go b/cmd/dumpRounds.go new file mode 100644 index 0000000000000000000000000000000000000000..401d894ad12dc1003798849d970c7b287c75425a --- /dev/null +++ b/cmd/dumpRounds.go @@ -0,0 +1,157 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + +// Package cmd initializes the CLI and config parsers as well as the logger. +package cmd + +import ( + "encoding/base64" + "fmt" + "strconv" + "time" + + "github.com/spf13/cobra" + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/xx_network/comms/signature" + "gitlab.com/xx_network/crypto/signature/ec" + "gitlab.com/xx_network/primitives/id" +) + +// dumpRoundsCmd allows the user to view network information about a specific +// round on the network. +var dumpRoundsCmd = &cobra.Command{ + Use: "dumprounds", + Short: "Dump round information for specified rounds", + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + roundIDs := parseRoundIDs(args) + + cmixParams, e2eParams := initParams() + client := initE2e(cmixParams, e2eParams) + err := client.StartNetworkFollower(5 * time.Second) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + connected := make(chan bool, 10) + client.GetCmix().AddHealthCallback( + func(isconnected bool) { + connected <- isconnected + }) + waitUntilConnected(connected) + + numRequests := len(roundIDs) + requestCh := make(chan bool, numRequests) + + registration := client.GetStorage().GetNDF().Registration + ecp := registration.EllipticPubKey + pubkey, err := ec.LoadPublicKey(ecp) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + fmt.Printf("registration pubkey: %s\n\n", pubkey.MarshalText()) + + rcb := func(round rounds.Round, success bool) { + if !success { + fmt.Printf("round %v lookup failed", round.ID) + } + + fmt.Printf("Round %v:", round.ID) + fmt.Printf("\n\tBatch size: %v, State: %v", + round.BatchSize, round.State) + fmt.Printf("\n\tUpdateID: %v, AddrSpaceSize: %v", + round.UpdateID, round.AddressSpaceSize) + + fmt.Printf("\n\tTopology: ") + for i, nodeId := range round.Raw.Topology { + nidStr := base64.StdEncoding.EncodeToString( + nodeId) + fmt.Printf("\n\t\t%d\t-\t%s", i, nidStr) + } + + fmt.Printf("\n\tTimestamps: ") + for state, ts := range round.Timestamps { + fmt.Printf("\n\t\t%v \t-\t%v", state, ts) + } + + fmt.Printf("\n\tErrors (%d): ", len(round.Raw.Errors)) + for i, err := range round.Raw.Errors { + fmt.Printf("\n\t\t%d - %v", i, err) + } + + fmt.Printf("\n\tClientErrors (%d): ", + len(round.Raw.ClientErrors)) + for _, ce := range round.Raw.ClientErrors { + fmt.Printf("\n\t\t%s - %v, Src: %v", + base64.StdEncoding.EncodeToString( + ce.ClientId), + ce.Error, + base64.StdEncoding.EncodeToString( + ce.Source)) + } + + ri := round.Raw + err = signature.VerifyEddsa(ri, pubkey) + if err != nil { + fmt.Printf("\n\tECC signature failed: %v", err) + fmt.Printf("\n\tuse trace logging for sig details") + } else { + fmt.Printf("\n\tECC signature succeeded!\n\n") + } + + // fmt.Printf("Round Info RAW: %v\n\n", round) + + // rsapubkey, _ := rsa.LoadPublicKeyFromPem([]byte( + // registration.TlsCertificate)) + // signature.VerifyRsa(ri, rsapubkey) + // if err != nil { + // fmt.Printf("RSA signature failed: %v", err) + // fmt.Printf("use trace logging for sig details") + // } else { + // fmt.Printf("RSA signature succeeded!") + // } + + requestCh <- success + } + + for i := range roundIDs { + rid := roundIDs[i] + err := client.GetCmix().LookupHistoricalRound(rid, rcb) + if err != nil { + fmt.Printf("error on %v: %v", rid, err) + } + } + + for done := 0; done < numRequests; done++ { + res := <-requestCh + fmt.Printf("request complete: %v", res) + } + }, +} + +func init() { + rootCmd.AddCommand(dumpRoundsCmd) +} + +func parseRoundIDs(roundStrs []string) []id.Round { + var roundIDs []id.Round + for _, r := range roundStrs { + i, err := parseRoundID(r) + if err != nil { + fmt.Printf("Could not parse into round ID: %s, %v", + r, err) + } else { + roundIDs = append(roundIDs, id.Round(i)) + } + } + return roundIDs +} + +func parseRoundID(roundStr string) (uint64, error) { + return strconv.ParseUint(roundStr, 10, 64) +} diff --git a/cmd/fileTransfer.go b/cmd/fileTransfer.go index 468bc50fe270ecc3a9114cc8aedf8627ddcd0f90..9540c7cabbf448d87b1b099ad66b056d9d779bb7 100644 --- a/cmd/fileTransfer.go +++ b/cmd/fileTransfer.go @@ -9,10 +9,11 @@ package cmd import ( "fmt" - "gitlab.com/elixxir/client/xxdk" "io/ioutil" "time" + "gitlab.com/elixxir/client/xxdk" + "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" @@ -34,9 +35,8 @@ var ftCmd = &cobra.Command{ Short: "Send and receive file for cMix client", Args: cobra.NoArgs, Run: func(cmd *cobra.Command, args []string) { - - // Initialise a new client - client := initE2e() + cmixParams, e2eParams := initParams() + client := initE2e(cmixParams, e2eParams) // Print user's reception ID and save contact file user := client.GetReceptionIdentity() @@ -50,7 +50,7 @@ var ftCmd = &cobra.Command{ } // Initialize the file transfer manager - maxThroughput := viper.GetInt("maxThroughput") + maxThroughput := viper.GetInt(fileMaxThroughputFlag) m, receiveChan := initFileTransferManager(client, maxThroughput) // Wait until connected or crash on timeout @@ -81,13 +81,13 @@ var ftCmd = &cobra.Command{ // If set, send the file to the recipient sendDone := make(chan struct{}) - if viper.IsSet("sendFile") { - recipientContactPath := viper.GetString("sendFile") - filePath := viper.GetString("filePath") - fileType := viper.GetString("fileType") - filePreviewPath := viper.GetString("filePreviewPath") - filePreviewString := viper.GetString("filePreviewString") - retry := float32(viper.GetFloat64("retry")) + if viper.IsSet(fileSendFlag) { + recipientContactPath := viper.GetString(fileSendFlag) + filePath := viper.GetString(filePathFlag) + fileType := viper.GetString(fileTypeFlag) + filePreviewPath := viper.GetString(filePreviewPathFlag) + filePreviewString := viper.GetString(filePreviewStringFlag) + retry := float32(viper.GetFloat64(fileRetry)) sendFile(filePath, fileType, filePreviewPath, filePreviewString, recipientContactPath, retry, m, sendDone) @@ -132,7 +132,7 @@ type receivedFtResults struct { // initFileTransferManager creates a new file transfer manager with a new // reception callback. Returns the file transfer manager and the channel that // will be triggered when the callback is called. -func initFileTransferManager(client *xxdk.E2e, maxThroughput int) ( +func initFileTransferManager(messenger *xxdk.E2e, maxThroughput int) ( *ftE2e.Wrapper, chan receivedFtResults) { // Create interfaces.ReceiveCallback that returns the results on a channel @@ -152,24 +152,24 @@ func initFileTransferManager(client *xxdk.E2e, maxThroughput int) ( // Create new manager manager, err := ft.NewManager(p, - client.GetReceptionIdentity().ID, - client.GetCmix(), - client.GetStorage(), - client.GetRng()) + messenger.GetReceptionIdentity().ID, + messenger.GetCmix(), + messenger.GetStorage(), + messenger.GetRng()) if err != nil { jww.FATAL.Panicf( "[FT] Failed to create new file transfer manager: %+v", err) } // Start the file transfer sending and receiving threads - err = client.AddService(manager.StartProcesses) + err = messenger.AddService(manager.StartProcesses) if err != nil { jww.FATAL.Panicf("[FT] Failed to start file transfer threads: %+v", err) } e2eParams := ftE2e.DefaultParams() e2eFt, err := ftE2e.NewWrapper(receiveCB, e2eParams, manager, - client.GetReceptionIdentity().ID, client.GetE2E(), client.GetCmix()) + messenger.GetReceptionIdentity().ID, messenger.GetE2E(), messenger.GetCmix()) if err != nil { jww.FATAL.Panicf( "[FT] Failed to create new e2e file transfer wrapper: %+v", err) @@ -348,43 +348,34 @@ func getContactFromFile(path string) contact.Contact { // init initializes commands and flags for Cobra. func init() { - ftCmd.Flags().String("sendFile", "", + ftCmd.Flags().String(fileSendFlag, "", "Sends a file to a recipient with the contact file at this path.") - bindPFlagCheckErr("sendFile") + bindFlagHelper(fileSendFlag, ftCmd) - ftCmd.Flags().String("filePath", "", + ftCmd.Flags().String(filePathFlag, "", "The path to the file to send. Also used as the file name.") - bindPFlagCheckErr("filePath") + bindFlagHelper(filePathFlag, ftCmd) - ftCmd.Flags().String("fileType", "txt", + ftCmd.Flags().String(fileTypeFlag, "txt", "8-byte file type.") - bindPFlagCheckErr("fileType") + bindFlagHelper(fileTypeFlag, ftCmd) - ftCmd.Flags().String("filePreviewPath", "", + ftCmd.Flags().String(filePreviewPathFlag, "", "The path to the file preview to send. Set either this flag or "+ "filePreviewString.") - bindPFlagCheckErr("filePreviewPath") + bindFlagHelper(filePreviewPathFlag, ftCmd) - ftCmd.Flags().String("filePreviewString", "", + ftCmd.Flags().String(filePreviewStringFlag, "", "File preview data. Set either this flag or filePreviewPath.") - bindPFlagCheckErr("filePreviewString") + bindFlagHelper(filePreviewStringFlag, ftCmd) - ftCmd.Flags().Int("maxThroughput", 1000, + ftCmd.Flags().Int(fileMaxThroughputFlag, 1000, "Maximum data transfer speed to send file parts (in bytes per second)") - bindPFlagCheckErr("maxThroughput") + bindFlagHelper(fileMaxThroughputFlag, ftCmd) - ftCmd.Flags().Float64("retry", 0.5, + ftCmd.Flags().Float64(fileRetry, 0.5, "Retry rate.") - bindPFlagCheckErr("retry") + bindFlagHelper(fileRetry, ftCmd) rootCmd.AddCommand(ftCmd) } - -// bindPFlagCheckErr binds the key to a pflag.Flag used by Cobra and prints an -// error if one occurs. -func bindPFlagCheckErr(key string) { - err := viper.BindPFlag(key, ftCmd.Flags().Lookup(key)) - if err != nil { - jww.ERROR.Printf("viper.BindPFlag failed for %q: %+v", key, err) - } -} diff --git a/cmd/flags.go b/cmd/flags.go new file mode 100644 index 0000000000000000000000000000000000000000..32ce750fae4f6efe97a546b60b24f7633063a52e --- /dev/null +++ b/cmd/flags.go @@ -0,0 +1,150 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2022 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + +package cmd + +// This is a comprehensive list of CLI flag name constants. Organized by +// subcommand, with root level CLI flags at the top of the list. Newly added +// flags for any existing or new subcommands should be listed and organized +// here. Pulling flags using Viper should use the constants defined here. +// todo: fill this with all existing flags, replace hardcoded references with +// these constants. This makes renaming them easier, as well as having +// a consolidated place in code for these flags. +const ( + //////////////// Root flags /////////////////////////////////////////////// + + // Send/receive flags + verifySendFlag = "verify-sends" + messageFlag = "message" + destIdFlag = "destid" + sendCountFlag = "sendCount" + sendDelayFlag = "sendDelay" + splitSendsFlag = "splitSends" + receiveCountFlag = "receiveCount" + waitTimeoutFlag = "waitTimeout" + unsafeFlag = "unsafe" + + // Channel flags + unsafeChannelCreationFlag = "unsafe-channel-creation" + acceptChannelFlag = "accept-channel" + deleteChannelFlag = "delete-channel" + + // Request flags + deleteReceiveRequestsFlag = "delete-receive-requests" + deleteSentRequestsFlag = "delete-sent-requests" + deleteAllRequestsFlag = "delete-all-requests" + deleteRequestFlag = "delete-request" + sendAuthRequestFlag = "send-auth-request" + authTimeoutFlag = "auth-timeout" + + // Contact file flags + writeContactFlag = "writeContact" + destFileFlag = "destfile" + + // Log flags + logLevelFlag = "logLevel" + logFlag = "log" + + // Loading/establishing xxdk.E2E + sessionFlag = "session" + passwordFlag = "password" + ndfFlag = "ndf" + regCodeFlag = "regcode" + protoUserPathFlag = "protoUserPath" + protoUserOutFlag = "protoUserOut" + forceLegacyFlag = "force-legacy" + + // Backup flags + backupOutFlag = "backupOut" + backupJsonOutFlag = "backupJsonOut" + backupInFlag = "backupIn" + backupPassFlag = "backupPass" + backupIdListFlag = "backupIdList" + + // Network following/logging flags + verboseRoundTrackingFlag = "verboseRoundTracking" + forceHistoricalRoundsFlag = "forceHistoricalRounds" + slowPollingFlag = "slowPolling" + forceMessagePickupRetryFlag = "forceMessagePickupRetry" + + // E2E Params + e2eMinKeysFlag = "e2eMinKeys" + e2eMaxKeysFlag = "e2eMaxKeys" + e2eNumReKeysFlag = "e2eNumReKeys" + e2eRekeyThresholdFlag = "e2eRekeyThreshold" + + // Misc + sendIdFlag = "sendid" + profileCpuFlag = "profile-cpu" + userIdPrefixFlag = "userid-prefix" + + ///////////////// Broadcast subcommand flags ////////////////////////////// + broadcastNameFlag = "name" + broadcastRsaPubFlag = "rsaPub" + broadcastSaltFlag = "salt" + broadcastDescriptionFlag = "description" + broadcastChanPathFlag = "chanPath" + broadcastKeyPathFlag = "keyPath" + broadcastNewFlag = "new" + broadcastFlag = "broadcast" + broadcastSymmetricFlag = "symmetric" + broadcastAsymmetricFlag = "asymmetric" + + ///////////////// Connection subcommand flags ///////////////////////////// + connectionFlag = "connect" + connectionStartServerFlag = "startServer" + connectionServerTimeoutFlag = "serverTimeout" + connectionDisconnectFlag = "disconnect" + connectionAuthenticatedFlag = "authenticated" + + ///////////////// File Transfer subcommand flags ////////////////////////// + fileSendFlag = "sendFile" + filePathFlag = "filePath" + fileTypeFlag = "fileType" + filePreviewPathFlag = "filePreviewPath" + filePreviewStringFlag = "filePreviewString" + fileMaxThroughputFlag = "maxThroughput" + fileRetry = "retry" + + ///////////////// GetNdf subcommand flags ////////////////////////////// + ndfGwHostFlag = "gwhost" + ndfPermHostFlag = "permhost" + ndfCertFlag = "cert" + ndfEnvFlag = "env" + + ///////////////// Group subcommand flags ////////////////////////////////// + groupCreateFlag = "create" + groupNameFlag = "name" + groupResendFlag = "resend" + groupJoinFlag = "join" + groupLeaveFlag = "leave" + groupSendMessageFlag = "sendMessage" + groupWaitFlag = "wait" + groupReceiveTimeoutFlag = "receiveTimeout" + groupListFlag = "list" + groupShowFlag = "show" + + ///////////////// Single subcommand flags ///////////////////////////////// + singleSendFlag = "send" + singleReplyFlag = "reply" + singleContactFlag = "contact" + singleTagFlag = "tag" + singleMaxMessagesFlag = "maxMessages" + singleTimeoutFlag = "timeout" + + ///////////////// User Discovery subcommand flags ///////////////////////// + udRegisterFlag = "register" + udRemoveFlag = "remove" + udAddPhoneFlag = "addphone" + udAddEmailFlag = "addemail" + udConfirmFlag = "confirm" + udLookupFlag = "lookup" + udSearchUsernameFlag = "searchusername" + udSearchEmailFlag = "searchemail" + udSearchPhoneFlag = "searchphone" + udBatchAddFlag = "batchadd" +) diff --git a/cmd/getndf.go b/cmd/getndf.go index 429f2238df30350497c1d0dd178fae7079847761..12299183a40d2e79b8986218f09056445abe0637 100644 --- a/cmd/getndf.go +++ b/cmd/getndf.go @@ -42,10 +42,10 @@ var getNDFCmd = &cobra.Command{ "and print it.", Args: cobra.NoArgs, Run: func(cmd *cobra.Command, args []string) { - if viper.GetString("env") != "" { + if viper.IsSet(ndfEnvFlag) { var ndfJSON []byte var err error - switch viper.GetString("env") { + switch viper.GetString(ndfEnvFlag) { case mainnet: ndfJSON, err = xxdk.DownloadAndVerifySignedNdfWithUrl(mainNetUrl, mainNetCert) if err != nil { @@ -69,23 +69,23 @@ var getNDFCmd = &cobra.Command{ } default: jww.FATAL.Panicf("env flag with unknown flag (%s)", - viper.GetString("env")) + viper.GetString(ndfEnvFlag)) } // Print to stdout fmt.Printf("%s", ndfJSON) } else { // Note: getndf prints to stdout, so we default to not do that - logLevel := viper.GetUint("logLevel") - logPath := viper.GetString("log") + logLevel := viper.GetUint(logLevelFlag) + logPath := viper.GetString(logFlag) if logPath == "-" || logPath == "" { logPath = "getndf.log" } initLog(logLevel, logPath) jww.INFO.Printf(Version()) - gwHost := viper.GetString("gwhost") - permHost := viper.GetString("permhost") - certPath := viper.GetString("cert") + gwHost := viper.GetString(ndfGwHostFlag) + permHost := viper.GetString(ndfPermHostFlag) + certPath := viper.GetString(ndfCertFlag) // Load the certificate var cert []byte @@ -147,25 +147,22 @@ var getNDFCmd = &cobra.Command{ } func init() { - getNDFCmd.Flags().StringP("gwhost", "", "", + getNDFCmd.Flags().StringP(ndfGwHostFlag, "", "", "Poll this gateway host:port for the NDF") - viper.BindPFlag("gwhost", - getNDFCmd.Flags().Lookup("gwhost")) - getNDFCmd.Flags().StringP("permhost", "", "", + bindFlagHelper(ndfGwHostFlag, getNDFCmd) + + getNDFCmd.Flags().StringP(ndfPermHostFlag, "", "", "Poll this registration host:port for the NDF") - viper.BindPFlag("permhost", - getNDFCmd.Flags().Lookup("permhost")) + bindFlagHelper(ndfPermHostFlag, getNDFCmd) - getNDFCmd.Flags().StringP("cert", "", "", + getNDFCmd.Flags().StringP(ndfCertFlag, "", "", "Check with the TLS certificate at this path") - viper.BindPFlag("cert", - getNDFCmd.Flags().Lookup("cert")) + bindFlagHelper(ndfCertFlag, getNDFCmd) - getNDFCmd.Flags().StringP("env", "", "", + getNDFCmd.Flags().StringP(ndfEnvFlag, "", "", "Downloads and verifies a signed NDF from a specified environment. "+ "Accepted environment flags include mainnet, release, testnet, and dev") - viper.BindPFlag("env", - getNDFCmd.Flags().Lookup("env")) + bindFlagHelper(ndfEnvFlag, getNDFCmd) rootCmd.AddCommand(getNDFCmd) } diff --git a/cmd/group.go b/cmd/group.go index 1520d97c648ed47d952636c9f8aba703c04295cd..783eff474813b1f3bb3c69a3b2f3212c4d56b427 100644 --- a/cmd/group.go +++ b/cmd/group.go @@ -12,12 +12,13 @@ package cmd import ( "bufio" "fmt" + "os" + "time" + "gitlab.com/elixxir/client/cmix/identity/receptionID" "gitlab.com/elixxir/client/cmix/rounds" "gitlab.com/elixxir/client/xxdk" "gitlab.com/elixxir/primitives/format" - "os" - "time" "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" @@ -33,8 +34,8 @@ var groupCmd = &cobra.Command{ Short: "Group commands for cMix client", Args: cobra.NoArgs, Run: func(cmd *cobra.Command, args []string) { - - client := initE2e() + cmixParams, e2eParams := initParams() + client := initE2e(cmixParams, e2eParams) // Print user's reception ID user := client.GetReceptionIdentity() @@ -69,45 +70,45 @@ var groupCmd = &cobra.Command{ } // Get group message and name - msgBody := []byte(viper.GetString("message")) - name := []byte(viper.GetString("name")) - timeout := viper.GetDuration("receiveTimeout") + msgBody := []byte(viper.GetString(messageFlag)) + name := []byte(viper.GetString(groupNameFlag)) + timeout := viper.GetDuration(groupReceiveTimeoutFlag) - if viper.IsSet("create") { - filePath := viper.GetString("create") + if viper.IsSet(groupCreateFlag) { + filePath := viper.GetString(groupCreateFlag) createGroup(name, msgBody, filePath, groupManager) } - if viper.IsSet("resend") { - groupIdString := viper.GetString("resend") + if viper.IsSet(groupResendFlag) { + groupIdString := viper.GetString(groupResendFlag) resendRequests(groupIdString, groupManager) } - if viper.GetBool("join") { + if viper.GetBool(groupJoinFlag) { joinGroup(reqChan, timeout, groupManager) } - if viper.IsSet("leave") { - groupIdString := viper.GetString("leave") + if viper.IsSet(groupLeaveFlag) { + groupIdString := viper.GetString(groupLeaveFlag) leaveGroup(groupIdString, groupManager) } - if viper.IsSet("sendMessage") { - groupIdString := viper.GetString("sendMessage") + if viper.IsSet(groupSendMessageFlag) { + groupIdString := viper.GetString(groupSendMessageFlag) sendGroup(groupIdString, msgBody, groupManager) } - if viper.IsSet("wait") { - numMessages := viper.GetUint("wait") + if viper.IsSet(groupWaitFlag) { + numMessages := viper.GetUint(groupWaitFlag) messageWait(numMessages, timeout, recChan) } - if viper.GetBool("list") { + if viper.GetBool(groupListFlag) { listGroups(groupManager) } - if viper.IsSet("show") { - groupIdString := viper.GetString("show") + if viper.IsSet(groupShowFlag) { + groupIdString := viper.GetString(groupShowFlag) showGroup(groupIdString, groupManager) } }, @@ -115,7 +116,7 @@ var groupCmd = &cobra.Command{ // initGroupManager creates a new group chat manager and starts the process // service. -func initGroupManager(client *xxdk.E2e) (groupChat.GroupChat, +func initGroupManager(messenger *xxdk.E2e) (groupChat.GroupChat, chan groupChat.MessageReceive, chan groupStore.Group) { recChan := make(chan groupChat.MessageReceive, 10) @@ -125,10 +126,10 @@ func initGroupManager(client *xxdk.E2e) (groupChat.GroupChat, } jww.INFO.Print("[GC] Creating new group manager.") - manager, err := groupChat.NewManager(client.GetCmix(), - client.GetE2E(), client.GetStorage().GetReceptionID(), - client.GetRng(), client.GetStorage().GetE2EGroup(), - client.GetStorage().GetKV(), requestCb, &receiveProcessor{recChan}) + manager, err := groupChat.NewManager(messenger.GetCmix(), + messenger.GetE2E(), messenger.GetReceptionIdentity().ID, + messenger.GetRng(), messenger.GetStorage().GetE2EGroup(), + messenger.GetStorage().GetKV(), requestCb, &receiveProcessor{recChan}) if err != nil { jww.FATAL.Panicf("[GC] Failed to initialize group chat manager: %+v", err) } @@ -311,61 +312,45 @@ func ReadLines(fileName string) []string { } func init() { - groupCmd.Flags().String("create", "", + groupCmd.Flags().String(groupCreateFlag, "", "Create a group with from the list of contact file paths.") - err := viper.BindPFlag("create", groupCmd.Flags().Lookup("create")) - checkBindErr(err, "create") + bindFlagHelper(groupCreateFlag, groupCmd) - groupCmd.Flags().String("name", "Group Name", + groupCmd.Flags().String(groupNameFlag, "Group Name", "The name of the new group to create.") - err = viper.BindPFlag("name", groupCmd.Flags().Lookup("name")) - checkBindErr(err, "name") + bindFlagHelper(groupNameFlag, groupCmd) - groupCmd.Flags().String("resend", "", + groupCmd.Flags().String(groupResendFlag, "", "Resend invites for all users in this group ID.") - err = viper.BindPFlag("resend", groupCmd.Flags().Lookup("resend")) - checkBindErr(err, "resend") + bindFlagHelper(groupResendFlag, groupCmd) - groupCmd.Flags().Bool("join", false, + groupCmd.Flags().Bool(groupJoinFlag, false, "Waits for group request joins the group.") - err = viper.BindPFlag("join", groupCmd.Flags().Lookup("join")) - checkBindErr(err, "join") + bindFlagHelper(groupJoinFlag, groupCmd) - groupCmd.Flags().String("leave", "", + groupCmd.Flags().String(groupLeaveFlag, "", "Leave this group ID.") - err = viper.BindPFlag("leave", groupCmd.Flags().Lookup("leave")) - checkBindErr(err, "leave") + bindFlagHelper(groupLeaveFlag, groupCmd) - groupCmd.Flags().String("sendMessage", "", + groupCmd.Flags().String(groupSendMessageFlag, "", "Send message to this group ID.") - err = viper.BindPFlag("sendMessage", groupCmd.Flags().Lookup("sendMessage")) - checkBindErr(err, "sendMessage") + bindFlagHelper(groupSendMessageFlag, groupCmd) - groupCmd.Flags().Uint("wait", 0, + groupCmd.Flags().Uint(groupWaitFlag, 0, "Waits for number of messages to be received.") - err = viper.BindPFlag("wait", groupCmd.Flags().Lookup("wait")) - checkBindErr(err, "wait") + bindFlagHelper(groupWaitFlag, groupCmd) - groupCmd.Flags().Duration("receiveTimeout", time.Minute, + groupCmd.Flags().Duration(groupReceiveTimeoutFlag, time.Minute, "Amount of time to wait for a group request or message before timing out.") - err = viper.BindPFlag("receiveTimeout", groupCmd.Flags().Lookup("receiveTimeout")) - checkBindErr(err, "receiveTimeout") + bindFlagHelper(groupReceiveTimeoutFlag, groupCmd) - groupCmd.Flags().Bool("list", false, + groupCmd.Flags().Bool(groupListFlag, false, "Prints list all groups to which this client belongs.") - err = viper.BindPFlag("list", groupCmd.Flags().Lookup("list")) - checkBindErr(err, "list") + bindFlagHelper(groupListFlag, groupCmd) - groupCmd.Flags().String("show", "", + groupCmd.Flags().String(groupShowFlag, "", "Prints the members of this group ID.") - err = viper.BindPFlag("show", groupCmd.Flags().Lookup("show")) - checkBindErr(err, "show") + bindFlagHelper(groupShowFlag, groupCmd) rootCmd.AddCommand(groupCmd) } - -func checkBindErr(err error, key string) { - if err != nil { - jww.ERROR.Printf("viper.BindPFlag failed for %s: %+v", key, err) - } -} diff --git a/cmd/init.go b/cmd/init.go index 75ea00e6c75bee432de3164d6f721291028ef97b..7854b816344b151caaa8853885b475f7c9cbc41c 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -9,9 +9,17 @@ package cmd import ( + "fmt" + + "io/fs" + "io/ioutil" + "os" + + "github.com/pkg/errors" "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" + "gitlab.com/elixxir/client/xxdk" ) // initCmd creates a new user object with the given NDF @@ -20,17 +28,144 @@ var initCmd = &cobra.Command{ Short: "Initialize a user ID but do not connect to the network", Args: cobra.NoArgs, Run: func(cmd *cobra.Command, args []string) { - _, receptionIdentity := initCmix() + // TODO: Handle userid-prefix argument + storePassword := parsePassword(viper.GetString("password")) + storeDir := viper.GetString("session") + regCode := viper.GetString("regcode") + + // Initialize from scratch + ndfJson, err := ioutil.ReadFile(viper.GetString("ndf")) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + err = xxdk.NewCmix(string(ndfJson), storeDir, storePassword, regCode) + net, err := xxdk.OpenCmix(storeDir, storePassword) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + identity, err := xxdk.MakeReceptionIdentity(net) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + err = xxdk.StoreReceptionIdentity(identityStorageKey, identity, net) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } - jww.INFO.Printf("User: %s", receptionIdentity.ID) - writeContact(receptionIdentity.GetContact()) + jww.INFO.Printf("User: %s", identity.ID) + writeContact(identity.GetContact()) + + // NOTE: DO NOT REMOVE THIS LINE. YOU WILL BREAK INTEGRATION + fmt.Printf("%s\n", identity.ID) }, } func init() { - initCmd.Flags().StringP("userid-prefix", "", "", + initCmd.Flags().StringP(userIdPrefixFlag, "", "", "Desired prefix of userID to brute force when running init command. Prepend (?i) for case-insensitive. Only Base64 characters are valid.") - _ = viper.BindPFlag("userid-prefix", initCmd.Flags().Lookup("userid-prefix")) + bindFlagHelper(userIdPrefixFlag, initCmd) rootCmd.AddCommand(initCmd) } + +// loadOrInitMessenger will build a new xxdk.E2e from existing storage +// or from a new storage that it will create if none already exists +func loadOrInitMessenger(forceLegacy bool, password []byte, storeDir, regCode string, + cmixParams xxdk.CMIXParams, e2eParams xxdk.E2EParams) *xxdk.E2e { + jww.INFO.Printf("Using normal sender") + + // create a new client if none exist + if _, err := os.Stat(storeDir); errors.Is(err, fs.ErrNotExist) { + // Initialize from scratch + ndfJson, err := ioutil.ReadFile(viper.GetString("ndf")) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + err = xxdk.NewCmix(string(ndfJson), storeDir, password, regCode) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + } + + // Initialize from storage + net, err := xxdk.LoadCmix(storeDir, password, cmixParams) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + // Load or initialize xxdk.ReceptionIdentity storage + identity, err := xxdk.LoadReceptionIdentity(identityStorageKey, net) + if err != nil { + if forceLegacy { + jww.INFO.Printf("Forcing legacy sender") + identity, err = xxdk.MakeLegacyReceptionIdentity(net) + } else { + identity, err = xxdk.MakeReceptionIdentity(net) + } + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + err = xxdk.StoreReceptionIdentity(identityStorageKey, identity, net) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + } + + messenger, err := xxdk.Login(net, authCbs, identity, e2eParams) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + return messenger +} + +// loadOrInitVanity will build a new xxdk.E2e from existing storage +// or from a new storage that it will create if none already exists +func loadOrInitVanity(password []byte, storeDir, regCode, userIdPrefix string, + cmixParams xxdk.CMIXParams, e2eParams xxdk.E2EParams) *xxdk.E2e { + jww.INFO.Printf("Using Vanity sender") + + // create a new client if none exist + if _, err := os.Stat(storeDir); errors.Is(err, fs.ErrNotExist) { + // Initialize from scratch + ndfJson, err := ioutil.ReadFile(viper.GetString("ndf")) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + err = xxdk.NewVanityClient(string(ndfJson), storeDir, + password, regCode, userIdPrefix) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + } + // Initialize from storage + net, err := xxdk.LoadCmix(storeDir, password, cmixParams) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + // Load or initialize xxdk.ReceptionIdentity storage + identity, err := xxdk.LoadReceptionIdentity(identityStorageKey, net) + if err != nil { + identity, err = xxdk.MakeLegacyReceptionIdentity(net) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + err = xxdk.StoreReceptionIdentity(identityStorageKey, identity, net) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + } + + messenger, err := xxdk.Login(net, authCbs, identity, e2eParams) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + return messenger +} diff --git a/cmd/precan.go b/cmd/precan.go index 64a558ee167f0d3ad9bdb5e1e04326947f510d3d..3c00f106a95ca0149de171c68581b3f4ae83f618 100644 --- a/cmd/precan.go +++ b/cmd/precan.go @@ -10,15 +10,63 @@ package cmd import ( - "encoding/binary" - "gitlab.com/elixxir/client/xxdk" - "strconv" - + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" + "github.com/spf13/viper" + "gitlab.com/elixxir/client/xxdk" "gitlab.com/elixxir/crypto/contact" "gitlab.com/xx_network/primitives/id" + "io/fs" + "io/ioutil" + "os" ) +// loadOrInitPrecan will build a new xxdk.E2e from existing storage +// or from a new storage that it will create if none already exists +func loadOrInitPrecan(precanId uint, password []byte, storeDir string, + cmixParams xxdk.CMIXParams, e2eParams xxdk.E2EParams) *xxdk.E2e { + jww.INFO.Printf("Using Precanned sender") + + // create a new client if none exist + if _, err := os.Stat(storeDir); errors.Is(err, fs.ErrNotExist) { + // Initialize from scratch + ndfJson, err := ioutil.ReadFile(viper.GetString(ndfFlag)) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + err = xxdk.NewPrecannedClient(precanId, string(ndfJson), storeDir, password) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + } + // Initialize from storage + net, err := xxdk.LoadCmix(storeDir, password, cmixParams) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + // Load or initialize xxdk.ReceptionIdentity storage + identity, err := xxdk.LoadReceptionIdentity(identityStorageKey, net) + if err != nil { + identity, err = xxdk.MakeLegacyReceptionIdentity(net) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + err = xxdk.StoreReceptionIdentity(identityStorageKey, identity, net) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + } + + messenger, err := xxdk.Login(net, authCbs, identity, e2eParams) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + return messenger +} + func isPrecanID(id *id.ID) bool { // check if precanned rBytes := id.Bytes() @@ -33,44 +81,14 @@ func isPrecanID(id *id.ID) bool { return false } -// returns a simple numerical id if the user is a precanned user, otherwise -// returns the normal string of the userID -func printIDNice(uid *id.ID) string { - - for index, puid := range precannedIDList { - if uid.Cmp(puid) { - return strconv.Itoa(index + 1) - } - } - - return uid.String() -} - -// build a list of precanned ids to use for comparision for nicer user id output -var precannedIDList = buildPrecannedIDList() - -func buildPrecannedIDList() []*id.ID { - - idList := make([]*id.ID, 40) - - for i := 0; i < 40; i++ { - uid := new(id.ID) - binary.BigEndian.PutUint64(uid[:], uint64(i+1)) - uid.SetType(id.User) - idList[i] = uid - } - - return idList -} - func getPrecanID(recipientID *id.ID) uint { return uint(recipientID.Bytes()[7]) } -func addPrecanAuthenticatedChannel(client *xxdk.E2e, recipientID *id.ID, +func addPrecanAuthenticatedChannel(messenger *xxdk.E2e, recipientID *id.ID, recipient contact.Contact) { jww.WARN.Printf("Precanned user id detected: %s", recipientID) - preUsr, err := client.MakePrecannedAuthenticatedChannel( + preUsr, err := messenger.MakePrecannedAuthenticatedChannel( getPrecanID(recipientID)) if err != nil { jww.FATAL.Panicf("%+v", err) diff --git a/cmd/proto.go b/cmd/proto.go new file mode 100644 index 0000000000000000000000000000000000000000..6ab109c5ad15dd5dbaf1497706c0b02507c0ae6f --- /dev/null +++ b/cmd/proto.go @@ -0,0 +1,78 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2022 Privategrity Corporation / +// / +// All rights reserved. / +//////////////////////////////////////////////////////////////////////////////// + +package cmd + +import ( + "encoding/json" + "github.com/pkg/errors" + jww "github.com/spf13/jwalterweatherman" + "github.com/spf13/viper" + "gitlab.com/elixxir/client/storage/user" + "gitlab.com/elixxir/client/xxdk" + "gitlab.com/xx_network/primitives/utils" + "io/fs" + "io/ioutil" + "os" +) + +// loadOrInitProto will build a new xxdk.E2e from existing storage +// or from a new storage that it will create if none already exists +func loadOrInitProto(protoUserPath string, password []byte, storeDir string, + cmixParams xxdk.CMIXParams, e2eParams xxdk.E2EParams) *xxdk.E2e { + jww.INFO.Printf("Using Proto sender") + + // create a new client if none exist + if _, err := os.Stat(storeDir); errors.Is(err, fs.ErrNotExist) { + // Initialize from scratch + ndfJson, err := ioutil.ReadFile(viper.GetString(ndfFlag)) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + protoUserJson, err := utils.ReadFile(protoUserPath) + if err != nil { + jww.FATAL.Panicf("%v", err) + } + + protoUser := &user.Proto{} + err = json.Unmarshal(protoUserJson, protoUser) + if err != nil { + jww.FATAL.Panicf("%v", err) + } + + err = xxdk.NewProtoClient_Unsafe(string(ndfJson), storeDir, + password, protoUser) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + } + // Initialize from storage + net, err := xxdk.LoadCmix(storeDir, password, cmixParams) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + // Load or initialize xxdk.ReceptionIdentity storage + identity, err := xxdk.LoadReceptionIdentity(identityStorageKey, net) + if err != nil { + identity, err = xxdk.MakeLegacyReceptionIdentity(net) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + + err = xxdk.StoreReceptionIdentity(identityStorageKey, identity, net) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + } + + messenger, err := xxdk.Login(net, authCbs, identity, e2eParams) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + return messenger +} diff --git a/cmd/root.go b/cmd/root.go index ce2b9987acfd1fe75cff381072b4c9a0b459bfbf..9e5c2ba42dba81d45c7acc7e5bb822f412a2b2ea 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -13,9 +13,7 @@ import ( "encoding/binary" "encoding/hex" "encoding/json" - "errors" "fmt" - "io/fs" "io/ioutil" "log" "os" @@ -25,14 +23,10 @@ import ( "sync" "time" - "gitlab.com/elixxir/client/storage/user" - "gitlab.com/elixxir/client/backup" - "gitlab.com/elixxir/client/e2e" "gitlab.com/elixxir/client/xxdk" "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix" "gitlab.com/elixxir/client/e2e/ratchet/partner/session" "github.com/spf13/cobra" @@ -45,128 +39,6 @@ import ( "gitlab.com/xx_network/primitives/utils" ) -// Deployment environment constants for the download-ndf code path -const ( - mainnet = "mainnet" - release = "release" - dev = "dev" - testnet = "testnet" -) - -// URL constants pointing to the NDF of the associated deployment environment -// requested for the download-ndf code path. -const ( - mainNetUrl = "https://elixxir-bins.s3.us-west-1.amazonaws.com/ndf/mainnet.json" - releaseUrl = "https://elixxir-bins.s3.us-west-1.amazonaws.com/ndf/release.json" - devUrl = "https://elixxir-bins.s3.us-west-1.amazonaws.com/ndf/default.json" - testNetUrl = "https://elixxir-bins.s3.us-west-1.amazonaws.com/ndf/testnet.json" -) - -// Certificates for deployment environments. Used to verify NDF signatures. -const ( - mainNetCert = `-----BEGIN CERTIFICATE----- -MIIFqTCCA5GgAwIBAgIUO0qHXSeKrOMucO+Zz82Mf1Zlq4gwDQYJKoZIhvcNAQEL -BQAwgYAxCzAJBgNVBAYTAktZMRQwEgYDVQQHDAtHZW9yZ2UgVG93bjETMBEGA1UE -CgwKeHggbmV0d29yazEPMA0GA1UECwwGRGV2T3BzMRMwEQYDVQQDDAp4eC5uZXR3 -b3JrMSAwHgYJKoZIhvcNAQkBFhFhZG1pbnNAeHgubmV0d29yazAeFw0yMTEwMzAy -MjI5MjZaFw0zMTEwMjgyMjI5MjZaMIGAMQswCQYDVQQGEwJLWTEUMBIGA1UEBwwL -R2VvcmdlIFRvd24xEzARBgNVBAoMCnh4IG5ldHdvcmsxDzANBgNVBAsMBkRldk9w -czETMBEGA1UEAwwKeHgubmV0d29yazEgMB4GCSqGSIb3DQEJARYRYWRtaW5zQHh4 -Lm5ldHdvcmswggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQD08ixnPWwz -FtBIEWx2SnFjBsdrSWCp9NcWXRtGWeq3ACz+ixiflj/U9U4b57aULeOAvcoC7bwU -j5w3oYxRmXIV40QSevx1z9mNcW3xbbacQ+yCgPPhhj3/c285gVVOUzURLBTNAi9I -EA59zAb8Vy0E6zfq4HRAhH11Q/10QgDjEXuGXra1k3IlemVsouiJGNAtKojNDE1N -x9HnraSEiXzdnV2GDplEvMHaLd3s9vs4XsiLB3VwKyHv7EH9+LOIra6pr5BWw+kD -2qHKGmQMOQe0a7nCirW/k9axH0WiA0XWuQu3U1WfcMEfdC/xn1vtubrdYjtzpXUy -oUEX5eHfu4OlA/zoH+trocfARDyBmTVbDy0P9imH//a6GUKDui9r3fXwEy5YPMhb -dKaNc7QWLPHMh1n25h559z6PqxxPT6UqFFbZD2gTw1sbbpjyqhLbnYguurkxY3jZ -ztW337hROzQ1/abbg/P59JA95Pmhkl8nqqDEf0buOmvMazq3Lwg92nuZ8gsdMKXB -xaEtTTpxhTPOqzc1/XQgScZnc+092MBDh3C2GMxzylOIdk+yF2Gyb+VWPUe29dSa -azzxsDXzRy8y8jaOjdSUWaLa/MgS5Dg1AfHtD55bdvqYzw3NEXIVarpMlzl+Z+6w -jvuwz8GyoMSVe+YEGgvSDvlfY/z19aqneQIDAQABoxkwFzAVBgNVHREEDjAMggp4 -eC5uZXR3b3JrMA0GCSqGSIb3DQEBCwUAA4ICAQCp0JDub2w5vZQvFREyA+utZ/+s -XT05j1iTgIRKMa3nofDGERYJUG7FcTd373I2baS70PGx8FF1QuXhn4DNNZlW/SZt -pa1d0pAerqFrIzwOuWVDponYHQ8ayvsT7awCbwZEZE4RhooqS4LqnvtgFu/g7LuM -zkFN8TER7HAUn3P7BujLvcgtqk2LMDz+AgBRszDp/Bw7+1EJDeG9d7hC/stXgDV/ -vpD1YDpxSmW4zjezFJqV6OdMOwo9RWVIktK3RXbFc6I5UJZ5kmzPe/I2oPPCBQvD -G3VqFLQe5ik5rXP7SgAN1fL/7KuQna0s42hkV64Z2ymCX69G1ofpgpEFaQLaxLbj -QOun0r8A3NyKvHRIh4K0dFcc3FSOF60Y6k769HKbOPmSDjSSg0qO9GEONBJ8BxAT -IHcHoTAOQoqGehdzepXQSjHsPqTXv3ZFFwCCgO0toI0Qhqwo89X6R3k+i4Kaktr7 -mLiPO8s0nq1PZ1XrybKE9BCHkYH1JkUDA+M0pn4QAEx/BuM0QnGXoi1sImW3pEUG -NP7fjkISrD48P8P/TLS45sx5pB8MNGEsRw0lBKmuOdWDmdfhOltB6JxmbhpstNZp -6LVLK6SEOwE76xnHiisR2KyhTTiroUq73BgPFWkWhoJDPbmL1DHgnbdKwwstG8Qu -UGb8k8vh6tzqYZAOKg== ------END CERTIFICATE-----` - releaseCert = `-----BEGIN CERTIFICATE----- -MIIFtjCCA56gAwIBAgIJAJnUcpLbGSQiMA0GCSqGSIb3DQEBCwUAMIGMMQswCQYD -VQQGEwJVUzELMAkGA1UECAwCQ0ExEjAQBgNVBAcMCUNsYXJlbW9udDEQMA4GA1UE -CgwHRWxpeHhpcjEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxEzARBgNVBAMMCmVsaXh4 -aXIuaW8xHzAdBgkqhkiG9w0BCQEWEGFkbWluQGVsaXh4aXIuaW8wHhcNMjAxMTE3 -MTkwMTUyWhcNMjIxMTE3MTkwMTUyWjCBjDELMAkGA1UEBhMCVVMxCzAJBgNVBAgM -AkNBMRIwEAYDVQQHDAlDbGFyZW1vbnQxEDAOBgNVBAoMB0VsaXh4aXIxFDASBgNV -BAsMC0RldmVsb3BtZW50MRMwEQYDVQQDDAplbGl4eGlyLmlvMR8wHQYJKoZIhvcN -AQkBFhBhZG1pbkBlbGl4eGlyLmlvMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAvtByOoSS8SeMLvvHIuOGfnx0VgweveJHX93LUyJxr1RlVBXCgC5/QOQN -N3dmKWzu4YwaA2jtwaAMhkgdfyOcw6kuqfvQjxv99XRIRKM4GZQkJiym2cnorNu7 -hm2/bxmj5TjpP9+vFzbjkJrpRQ80hsV7I9+NKzIhMK4YTgte/F/q9URESlMZxTbb -MFh3s5iiBfBLRNFFsHVdy8OVH+Jv5901cLn+yowaMDLrBMOWGlRROg82ZeRAranX -9X1s+6BclJ/cBe/LcDxGso5sco6UzrWHzpDTnOTzHoamQHYCXtAZP4XbzcqI6A5i -GFM2akuG9Wv3XZZv/6eJRnKS2GLkvv7dtzv+nalxoBKtyIE8ICIVOrb+pVJvY1Id -HOXkK9MEJJ6sZhddipUaQw6hD4I0dNEt30Ugq9zTgFcEnM2R7qKpIDmxrRbcl280 -TQGNYgdidzleNdZbjcTvsMVhcxPXCY+bVX1xICD1oJiZZbZFejBvPEfLYyzSdYp+ -awX5OnLVSrQtTJu9yz5q3q5pHhxJnqS/CVGLTvzLfmk7BGwRZZuK87LnSixyYfpd -S23qI45AEUINEE0HDZsI+KBq0oVlDB0Z3AZpWauRDqY3o6JIbIOpqmZc6KntyL7j -YCAhbB1tchS47PpbIxUgMMGoR3MBkJutPqtTWCEE3l5jvv0CknUCAwEAAaMZMBcw -FQYDVR0RBA4wDIIKZWxpeHhpci5pbzANBgkqhkiG9w0BAQsFAAOCAgEACLoxE3nh -3VzXH2lQo1QzjKkG/+1m75T0l9Wn9uxa2W/90qBCfim1CPfWUstGdRLBi8gjDevV -zK5HN+Cpz2E22qByeN9fl6rJC4zd1vIdexEre5h7goWoV+qFPhOACElor1tF5UQ2 -GD+NFH+Z0ALG1u8db0hBv8NCbtD4YzcQzzINEbs9gp/Sq3cRzkz1wCufFwJwr7+R -0YqZfPj/v/w9G9wSUys1s3i4xr2u87T/bPF68VRg6r1+kXRSRevXd99wKwap52jY -zOwsDGZF9BHMpFVYR/yZhfzSK3F1DmvwuqOsfwSFIjrUjfRlwS28zyZ8rjBq1suD -EAdvYCLDmBSGssNh8E20PHmk5UROYFGEEhlK5ZKj/f1HOmMiOX461XK6HODYyitq -Six2dPi1ZlBJW83DyFqSWJaUR/CluBYmqrWoBX+chv54bU2Y9j/sA/O98wa7trsk -ctzvAcXjhXm6ESRVVD/iZvkW5MP2mkgbDpW3RP9souK5JzbcpC7i3hEcAqPSPgzL -94kHDpYNY7jcGQC4CjPdfBi+Tf6il/QLFRFgyHm2ze3+qrlPT6SQ4hSSH1iXyf4v -tlqu6u77fbF9yaHtq7dvYxH1WioIUxMqbIC1CNgGC1Y/LhzgLRKPSTBCrbQyTcGc -0b5cTzVKxdP6v6WOAXVOEkXTcBPZ4nEZxY0= ------END CERTIFICATE-----` - devCert = `-----BEGIN CERTIFICATE----- -MIIF4DCCA8igAwIBAgIUegUvihtQooWNIzsNqj6lucXn6g8wDQYJKoZIhvcNAQEL -BQAwgYwxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTESMBAGA1UEBwwJQ2xhcmVt -b250MRAwDgYDVQQKDAdFbGl4eGlyMRQwEgYDVQQLDAtEZXZlbG9wbWVudDETMBEG -A1UEAwwKZWxpeHhpci5pbzEfMB0GCSqGSIb3DQEJARYQYWRtaW5AZWxpeHhpci5p -bzAeFw0yMTExMzAxODMwMTdaFw0zMTExMjgxODMwMTdaMIGMMQswCQYDVQQGEwJV -UzELMAkGA1UECAwCQ0ExEjAQBgNVBAcMCUNsYXJlbW9udDEQMA4GA1UECgwHRWxp -eHhpcjEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxEzARBgNVBAMMCmVsaXh4aXIuaW8x -HzAdBgkqhkiG9w0BCQEWEGFkbWluQGVsaXh4aXIuaW8wggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCckGabzUitkySleveyD9Yrxrpj50FiGkOvwkmgN1jF -9r5StN3otiU5tebderkjD82mVqB781czRA9vPqAggbw1ZdAyQPTvDPTj7rmzkByq -QIkdZBMshV/zX1z8oXoNB9bzZlUFVF4HTY3dEytAJONJRkGGAw4FTa/wCkWsITiT -mKvkP3ciKgz7s8uMyZzZpj9ElBphK9Nbwt83v/IOgTqDmn5qDBnHtoLw4roKJkC8 -00GF4ZUhlVSQC3oFWOCu6tvSUVCBCTUzVKYJLmCnoilmiE/8nCOU0VOivtsx88f5 -9RSPfePUk8u5CRmgThwOpxb0CAO0gd+sY1YJrn+FaW+dSR8OkM3bFuTq7fz9CEkS -XFfUwbJL+HzT0ZuSA3FupTIExyDmM/5dF8lC0RB3j4FNQF+H+j5Kso86e83xnXPI -e+IKKIYa/LVdW24kYRuBDpoONN5KS/F+F/5PzOzH9Swdt07J9b7z1dzWcLnKGtkN -WVsZ7Ue6cuI2zOEWqF1OEr9FladgORcdVBoF/WlsA63C2c1J0tjXqqcl/27GmqGW -gvhaA8Jkm20qLCEhxQ2JzrBdk/X/lCZdP/7A5TxnLqSBq8xxMuLJlZZbUG8U/BT9 -sHF5mXZyiucMjTEU7qHMR2UGNFot8TQ7ZXntIApa2NlB/qX2qI5D13PoXI9Hnyxa -8wIDAQABozgwNjAVBgNVHREEDjAMggplbGl4eGlyLmlvMB0GA1UdDgQWBBQimFud -gCzDVFD3Xz68zOAebDN6YDANBgkqhkiG9w0BAQsFAAOCAgEAccsH9JIyFZdytGxC -/6qjSHPgV23ZGmW7alg+GyEATBIAN187Du4Lj6cLbox5nqLdZgYzizVop32JQAHv -N1QPKjViOOkLaJprSUuRULa5kJ5fe+XfMoyhISI4mtJXXbMwl/PbOaDSdeDjl0ZO -auQggWslyv8ZOkfcbC6goEtAxljNZ01zY1ofSKUj+fBw9Lmomql6GAt7NuubANs4 -9mSjXwD27EZf3Aqaaju7gX1APW2O03/q4hDqhrGW14sN0gFt751ddPuPr5COGzCS -c3Xg2HqMpXx//FU4qHrZYzwv8SuGSshlCxGJpWku9LVwci1Kxi4LyZgTm6/xY4kB -5fsZf6C2yAZnkIJ8bEYr0Up4KzG1lNskU69uMv+d7W2+4Ie3Evf3HdYad/WeUskG -tc6LKY6B2NX3RMVkQt0ftsDaWsktnR8VBXVZSBVYVEQu318rKvYRdOwZJn339obI -jyMZC/3D721e5Anj/EqHpc3I9Yn3jRKw1xc8kpNLg/JIAibub8JYyDvT1gO4xjBO -+6EWOBFgDAsf7bSP2xQn1pQFWcA/sY1MnRsWeENmKNrkLXffP+8l1tEcijN+KCSF -ek1mr+qBwSaNV9TA+RXVhvqd3DEKPPJ1WhfxP1K81RdUESvHOV/4kdwnSahDyao0 -EnretBzQkeKeBwoB2u6NTiOmUjk= ------END CERTIFICATE-----` - testNetCert = `` -) - // Key used for storing xxdk.ReceptionIdentity objects const identityStorageKey = "identityStorageKey" @@ -188,7 +60,7 @@ var rootCmd = &cobra.Command{ Short: "Runs a client for cMix anonymous communication platform", Args: cobra.NoArgs, Run: func(cmd *cobra.Command, args []string) { - profileOut := viper.GetString("profile-cpu") + profileOut := viper.GetString(profileCpuFlag) if profileOut != "" { f, err := os.Create(profileOut) if err != nil { @@ -197,7 +69,9 @@ var rootCmd = &cobra.Command{ pprof.StartCPUProfile(f) } - client := initE2e() + cmixParams, e2eParams := initParams() + + client := initE2e(cmixParams, e2eParams) jww.INFO.Printf("Client Initialized...") @@ -208,9 +82,9 @@ var rootCmd = &cobra.Command{ var recipientContact contact.Contact var recipientID *id.ID - destFile := viper.GetString("destfile") - destId := viper.GetString("destid") - sendId := viper.GetString("sendid") + destFile := viper.GetString(destFileFlag) + destId := viper.GetString(destIdFlag) + sendId := viper.GetString(sendIdFlag) if destFile != "" { recipientContact = readContact(destFile) recipientID = recipientContact.ID @@ -272,17 +146,17 @@ var rootCmd = &cobra.Command{ jww.INFO.Printf("Client backup triggered...") // Send Messages - msgBody := viper.GetString("message") + msgBody := viper.GetString(messageFlag) time.Sleep(10 * time.Second) // Accept auth request for this recipient authConfirmed := false - paramsE2E := e2e.GetDefaultParams() - if viper.GetBool("accept-channel") { + if viper.GetBool(acceptChannelFlag) { // Verify that the confirmation message makes it to the // original sender - if viper.GetBool("verify-sends") { - acceptChannelVerified(client, recipientID) + if viper.GetBool(verifySendFlag) { + acceptChannelVerified(client, recipientID, + e2eParams) } else { // Accept channel, agnostic of round result acceptChannel(client, recipientID) @@ -298,15 +172,18 @@ var rootCmd = &cobra.Command{ jww.INFO.Printf("Authenticated channel already in "+ "place for %s", recipientID) authConfirmed = true + } else { + jww.INFO.Printf("No authenticated channel in "+ + "place for %s", recipientID) } // Send unsafe messages or not? - unsafe := viper.GetBool("unsafe") - sendAuthReq := viper.GetBool("send-auth-request") + unsafe := viper.GetBool(unsafeFlag) + sendAuthReq := viper.GetBool(sendAuthRequestFlag) if !unsafe && !authConfirmed && !isPrecanPartner && sendAuthReq { addAuthenticatedChannel(client, recipientID, - recipientContact) + recipientContact, e2eParams) } else if !unsafe && !authConfirmed && isPrecanPartner { addPrecanAuthenticatedChannel(client, recipientID, recipientContact) @@ -315,7 +192,7 @@ var rootCmd = &cobra.Command{ sendAuthReq { jww.WARN.Printf("Resetting negotiated auth channel") resetAuthenticatedChannel(client, recipientID, - recipientContact) + recipientContact, e2eParams) authConfirmed = false } @@ -335,7 +212,7 @@ var rootCmd = &cobra.Command{ scnt := uint(0) // Wait until authConfirmed - waitSecs := viper.GetUint("auth-timeout") + waitSecs := viper.GetUint(authTimeoutFlag) for !authConfirmed && scnt < waitSecs { time.Sleep(1 * time.Second) scnt++ @@ -353,11 +230,11 @@ var rootCmd = &cobra.Command{ } // DeleteFingerprint this recipient - if viper.GetBool("delete-channel") { + if viper.GetBool(deleteChannelFlag) { deleteChannel(client, recipientID) } - if viper.GetBool("delete-receive-requests") { + if viper.GetBool(deleteReceiveRequestsFlag) { err = client.GetAuth().DeleteReceiveRequests() if err != nil { jww.FATAL.Panicf("Failed to delete received requests:"+ @@ -365,7 +242,7 @@ var rootCmd = &cobra.Command{ } } - if viper.GetBool("delete-sent-requests") { + if viper.GetBool(deleteSentRequestsFlag) { err = client.GetAuth().DeleteSentRequests() if err != nil { jww.FATAL.Panicf("Failed to delete sent requests:"+ @@ -373,7 +250,7 @@ var rootCmd = &cobra.Command{ } } - if viper.GetBool("delete-all-requests") { + if viper.GetBool(deleteAllRequestsFlag) { err = client.GetAuth().DeleteAllRequests() if err != nil { jww.FATAL.Panicf("Failed to delete all requests:"+ @@ -381,7 +258,7 @@ var rootCmd = &cobra.Command{ } } - if viper.GetBool("delete-request") { + if viper.GetBool(deleteRequestFlag) { err = client.GetAuth().DeleteRequest(recipientID) if err != nil { jww.FATAL.Panicf("Failed to delete request for %s:"+ @@ -393,17 +270,13 @@ var rootCmd = &cobra.Command{ payload := []byte(msgBody) recipient := recipientID - if viper.GetBool("splitSends") { - paramsE2E.ExcludedRounds = excludedRounds.NewSet() - } - jww.INFO.Printf("Client Sending messages...") wg := &sync.WaitGroup{} - sendCnt := int(viper.GetUint("sendCount")) + sendCnt := int(viper.GetUint(sendCountFlag)) wg.Add(sendCnt) go func() { - sendDelay := time.Duration(viper.GetUint("sendDelay")) + sendDelay := time.Duration(viper.GetUint(sendDelayFlag)) for i := 0; i < sendCnt; i++ { go func(i int) { defer wg.Done() @@ -412,53 +285,24 @@ var rootCmd = &cobra.Command{ // Send messages var roundIDs []id.Round if unsafe { - paramsE2E.CMIXParams.DebugTag = "cmd.Unsafe" + e2eParams.Base.DebugTag = "cmd.Unsafe" roundIDs, _, err = client.GetE2E().SendUnsafe( mt, recipient, payload, - paramsE2E) + e2eParams.Base) } else { - paramsE2E.CMIXParams.DebugTag = "cmd.E2E" + e2eParams.Base.DebugTag = "cmd.E2E" roundIDs, _, _, err = client.GetE2E().SendE2E(mt, - recipient, payload, paramsE2E) + recipient, payload, e2eParams.Base) } if err != nil { jww.FATAL.Panicf("%+v", err) } - if viper.GetBool("verify-sends") { // Verify message sends were successful - retryChan := make(chan struct{}) - done := make(chan struct{}, 1) - - // Construct the callback function which - // verifies successful message send or retries - f := func(allRoundsSucceeded, timedOut bool, - rounds map[id.Round]cmix.RoundResult) { - printRoundResults( - rounds, roundIDs, payload, recipientID) - if !allRoundsSucceeded { - retryChan <- struct{}{} - } else { - done <- struct{}{} - } - } - - // Monitor rounds for results - err = client.GetCmix().GetRoundResults(paramsE2E.CMIXParams.Timeout, f, roundIDs...) - if err != nil { - jww.DEBUG.Printf("Could not verify messages were sent successfully, resending messages...") - continue - } - - select { - case <-retryChan: - // On a retry, go to the top of the loop - jww.DEBUG.Printf("Messages were not sent successfully, resending messages...") + // Verify message sends were successful + if viper.GetBool(verifySendFlag) { + if !verifySendSuccess(client, e2eParams.Base, + roundIDs, recipientID, payload) { continue - case <-done: - // Close channels on verification success - close(done) - close(retryChan) - break } } @@ -472,9 +316,9 @@ var rootCmd = &cobra.Command{ // Wait until message timeout or we receive enough then exit // TODO: Actually check for how many messages we've received - expectedCnt := viper.GetUint("receiveCount") + expectedCnt := viper.GetUint(receiveCountFlag) receiveCnt := uint(0) - waitSecs := viper.GetUint("waitTimeout") + waitSecs := viper.GetUint(waitTimeoutFlag) waitTimeout := time.Duration(waitSecs) * time.Second done := false @@ -489,10 +333,18 @@ var rootCmd = &cobra.Command{ done = true break case m := <-recvCh: - fmt.Printf("Message received: %s\n", string( - m.Payload)) + strToPrint := string(m.Payload) + if m.MessageType != catalog.XxMessage { + strToPrint = fmt.Sprintf("type is %s", + m.MessageType) + } else { + receiveCnt++ + } + + fmt.Printf("Message received: %s\n", + strToPrint) + // fmt.Printf("%s", m.Timestamp) - receiveCnt++ if receiveCnt == expectedCnt { done = true break @@ -502,10 +354,10 @@ var rootCmd = &cobra.Command{ // wait an extra 5 seconds to make sure no messages were missed done = false - waitTime := time.Duration(5 * time.Second) + waitTime := 5 * time.Second if expectedCnt == 0 { // Wait longer if we didn't expect to receive anything - waitTime = time.Duration(15 * time.Second) + waitTime = 15 * time.Second } timer := time.NewTimer(waitTime) for !done { @@ -540,190 +392,71 @@ var rootCmd = &cobra.Command{ }, } -// initCmix returns a newly-initialized xxdk.Cmix object and its stored xxdk.ReceptionIdentity -func initCmix() (*xxdk.Cmix, xxdk.ReceptionIdentity) { - logLevel := viper.GetUint("logLevel") - initLog(logLevel, viper.GetString("log")) - jww.INFO.Printf(Version()) - - pass := parsePassword(viper.GetString("password")) - storeDir := viper.GetString("session") - regCode := viper.GetString("regcode") - precannedID := viper.GetUint("sendid") - userIDprefix := viper.GetString("userid-prefix") - protoUserPath := viper.GetString("protoUserPath") - backupPath := viper.GetString("backupIn") - backupPass := []byte(viper.GetString("backupPass")) - - // FIXME: All branches of the upcoming path - var knownReception xxdk.ReceptionIdentity - - // create a new client if none exist - if _, err := os.Stat(storeDir); errors.Is(err, fs.ErrNotExist) { - // Load NDF - ndfJSON, err := ioutil.ReadFile(viper.GetString("ndf")) - if err != nil { - jww.FATAL.Panicf(err.Error()) - } - - if precannedID != 0 { - knownReception, err = xxdk.NewPrecannedClient(precannedID, - string(ndfJSON), storeDir, pass) - } else if protoUserPath != "" { - protoUserJson, err := utils.ReadFile(protoUserPath) - if err != nil { - jww.FATAL.Panicf("%v", err) - } - - protoUser := &user.Proto{} - err = json.Unmarshal(protoUserJson, protoUser) - if err != nil { - jww.FATAL.Panicf("%v", err) - } - - err = xxdk.NewProtoClient_Unsafe(string(ndfJSON), storeDir, - pass, protoUser) - } else if userIDprefix != "" { - err = xxdk.NewVanityClient(string(ndfJSON), storeDir, - pass, regCode, userIDprefix) - } else if backupPath != "" { - - b, backupFile := loadBackup(backupPath, string(backupPass)) - - // Marshal the backup object in JSON - backupJson, err := json.Marshal(b) - if err != nil { - jww.ERROR.Printf("Failed to JSON Marshal backup: %+v", err) - } +func initParams() (xxdk.CMIXParams, xxdk.E2EParams) { + e2eParams := xxdk.GetDefaultE2EParams() + e2eParams.Session.MinKeys = uint16(viper.GetUint(e2eMinKeysFlag)) + e2eParams.Session.MaxKeys = uint16(viper.GetUint(e2eMaxKeysFlag)) + e2eParams.Session.NumRekeys = uint16(viper.GetUint(e2eNumReKeysFlag)) + e2eParams.Session.RekeyThreshold = viper.GetFloat64(e2eRekeyThresholdFlag) - // Write the backup JSON to file - err = utils.WriteFileDef(viper.GetString("backupJsonOut"), backupJson) - if err != nil { - jww.FATAL.Panicf("Failed to write backup to file: %+v", err) - } - - // Construct client from backup data - backupIdList, _, err := backup.NewClientFromBackup(string(ndfJSON), storeDir, - pass, backupPass, backupFile) - if err != nil { - jww.FATAL.Panicf("%+v", err) - } - - backupIdListPath := viper.GetString("backupIdList") - if backupIdListPath != "" { - // Marshal backed up ID list to JSON - backedUpIdListJson, err := json.Marshal(backupIdList) - if err != nil { - jww.ERROR.Printf("Failed to JSON Marshal backed up IDs: %+v", err) - } - - // Write backed up ID list to file - err = utils.WriteFileDef(backupIdListPath, backedUpIdListJson) - if err != nil { - jww.FATAL.Panicf("Failed to write backed up IDs to file %q: %+v", - backupIdListPath, err) - } - } - - } else { - err = xxdk.NewCmix(string(ndfJSON), storeDir, - pass, regCode) - } - - if err != nil { - jww.FATAL.Panicf("%+v", err) - } - } - - params := initParams() - client, err := xxdk.OpenCmix(storeDir, pass, params) - if err != nil { - jww.FATAL.Panicf("%+v", err) + if viper.GetBool("splitSends") { + e2eParams.Base.ExcludedRounds = excludedRounds.NewSet() } - // If there is a known xxdk.ReceptionIdentity, store it now - if knownReception.ID != nil { - err = xxdk.StoreReceptionIdentity(identityStorageKey, knownReception, client) - if err != nil { - jww.FATAL.Panicf("%+v", err) - } - } - - // Attempt to load extant xxdk.ReceptionIdentity - identity, err := xxdk.LoadReceptionIdentity(identityStorageKey, client) - if err != nil { - // If no extant xxdk.ReceptionIdentity, generate and store a new one - identity, err = xxdk.MakeReceptionIdentity(client) - if err != nil { - jww.FATAL.Panicf("%+v", err) - } - err = xxdk.StoreReceptionIdentity(identityStorageKey, identity, client) - if err != nil { - jww.FATAL.Panicf("%+v", err) - } - } - return client, identity -} - -func initParams() xxdk.Params { - p := xxdk.GetDefaultParams() - p.Session.MinKeys = uint16(viper.GetUint("e2eMinKeys")) - p.Session.MaxKeys = uint16(viper.GetUint("e2eMaxKeys")) - p.Session.NumRekeys = uint16(viper.GetUint("e2eNumReKeys")) - p.Session.RekeyThreshold = viper.GetFloat64("e2eRekeyThreshold") - p.CMix.Pickup.ForceHistoricalRounds = viper.GetBool( - "forceHistoricalRounds") - p.CMix.FastPolling = !viper.GetBool("slowPolling") - p.CMix.Pickup.ForceMessagePickupRetry = viper.GetBool( - "forceMessagePickupRetry") - if p.CMix.Pickup.ForceMessagePickupRetry { + cmixParams := xxdk.GetDefaultCMixParams() + cmixParams.Network.Pickup.ForceHistoricalRounds = viper.GetBool( + forceHistoricalRoundsFlag) + cmixParams.Network.FastPolling = !viper.GetBool(slowPollingFlag) + cmixParams.Network.Pickup.ForceMessagePickupRetry = viper.GetBool( + forceMessagePickupRetryFlag) + if cmixParams.Network.Pickup.ForceMessagePickupRetry { period := 3 * time.Second jww.INFO.Printf("Setting Uncheck Round Period to %v", period) - p.CMix.Pickup.UncheckRoundPeriod = period + cmixParams.Network.Pickup.UncheckRoundPeriod = period } - p.CMix.VerboseRoundTracking = viper.GetBool( - "verboseRoundTracking") - return p + cmixParams.Network.VerboseRoundTracking = viper.GetBool( + verboseRoundTrackingFlag) + return cmixParams, e2eParams } // initE2e returns a fully-formed xxdk.E2e object -func initE2e() *xxdk.E2e { - _, receptionIdentity := initCmix() - - pass := parsePassword(viper.GetString("password")) - storeDir := viper.GetString("session") - jww.DEBUG.Printf("sessionDur: %v", storeDir) - - params := initParams() - - // load the client - baseClient, err := xxdk.LoadCmix(storeDir, pass, params) - if err != nil { - jww.FATAL.Panicf("%+v", err) - } +func initE2e(cmixParams xxdk.CMIXParams, e2eParams xxdk.E2EParams) *xxdk.E2e { + initLog(viper.GetUint("logLevel"), viper.GetString("log")) + jww.INFO.Printf(Version()) + // Intake parameters for client initialization + precanId := viper.GetUint(sendIdFlag) + protoUserPath := viper.GetString(protoUserPathFlag) + userIdPrefix := viper.GetString(userIdPrefixFlag) + backupPath := viper.GetString(backupInFlag) + backupPass := viper.GetString(backupPassFlag) + storePassword := parsePassword(viper.GetString(passwordFlag)) + storeDir := viper.GetString(sessionFlag) + regCode := viper.GetString(regCodeFlag) + forceLegacy := viper.GetBool(forceLegacyFlag) + jww.DEBUG.Printf("sessionDir: %v", storeDir) + + // TODO: This probably shouldn't be initialized globally. authCbs = makeAuthCallbacks( - viper.GetBool("unsafe-channel-creation")) - - // Force LoginLegacy for precanned senderID - var client *xxdk.E2e - if isPrecanID(receptionIdentity.ID) { - jww.INFO.Printf("Using LoginLegacy for precan sender") - client, err = xxdk.LoginLegacy(baseClient, authCbs) - if err != nil { - jww.FATAL.Panicf("%+v", err) - } + viper.GetBool(unsafeChannelCreationFlag), e2eParams) + + // Initialize the client of the proper type + var messenger *xxdk.E2e + if precanId != 0 { + messenger = loadOrInitPrecan(precanId, storePassword, storeDir, cmixParams, e2eParams) + } else if protoUserPath != "" { + messenger = loadOrInitProto(protoUserPath, storePassword, storeDir, cmixParams, e2eParams) + } else if userIdPrefix != "" { + messenger = loadOrInitVanity(storePassword, storeDir, regCode, userIdPrefix, cmixParams, e2eParams) + } else if backupPath != "" { + messenger = loadOrInitBackup(backupPath, backupPass, storePassword, storeDir, cmixParams, e2eParams) } else { - jww.INFO.Printf("Using Login for non-precan sender") - client, err = xxdk.Login(baseClient, authCbs, receptionIdentity) - if err != nil { - jww.FATAL.Panicf("%+v", err) - } + messenger = loadOrInitMessenger(forceLegacy, storePassword, storeDir, regCode, cmixParams, e2eParams) } - if protoUser := viper.GetString("protoUserOut"); protoUser != "" { - - jsonBytes, err := client.ConstructProtoUserFile() + // Handle protoUser output + if protoUser := viper.GetString(protoUserOutFlag); protoUser != "" { + jsonBytes, err := messenger.ConstructProtoUserFile() if err != nil { jww.FATAL.Panicf("cannot construct proto user file: %v", err) @@ -734,22 +467,24 @@ func initE2e() *xxdk.E2e { jww.FATAL.Panicf("cannot write proto user to file: %v", err) } - } - if backupOut := viper.GetString("backupOut"); backupOut != "" { - backupPass := viper.GetString("backupPass") + // Handle backup output + if backupOut := viper.GetString("backupOutFlag"); backupOut != "" { + if !forceLegacy { + jww.FATAL.Panicf("Unable to make backup for non-legacy sender!") + } updateBackupCb := func(encryptedBackup []byte) { jww.INFO.Printf("Backup update received, size %d", len(encryptedBackup)) fmt.Println("Backup update received.") - err = utils.WriteFileDef(backupOut, encryptedBackup) + err := utils.WriteFileDef(backupOut, encryptedBackup) if err != nil { jww.FATAL.Panicf("cannot write backup: %+v", err) } - backupJsonPath := viper.GetString("backupJsonOut") + backupJsonPath := viper.GetString(backupJsonOutFlag) if backupJsonPath != "" { var b backupCrypto.Backup @@ -769,25 +504,25 @@ func initE2e() *xxdk.E2e { } } } - _, err = backup.InitializeBackup(backupPass, updateBackupCb, - client.GetBackupContainer(), client.GetE2E(), client.GetStorage(), - nil, client.GetStorage().GetKV(), client.GetRng()) + _, err := backup.InitializeBackup(backupPass, updateBackupCb, + messenger.GetBackupContainer(), messenger.GetE2E(), messenger.GetStorage(), + nil, messenger.GetStorage().GetKV(), messenger.GetRng()) if err != nil { jww.FATAL.Panicf("Failed to initialize backup with key %q: %+v", backupPass, err) } } - return client + return messenger } -func acceptChannel(client *xxdk.E2e, recipientID *id.ID) id.Round { - recipientContact, err := client.GetAuth().GetReceivedRequest( +func acceptChannel(messenger *xxdk.E2e, recipientID *id.ID) id.Round { + recipientContact, err := messenger.GetAuth().GetReceivedRequest( recipientID) if err != nil { jww.FATAL.Panicf("%+v", err) } - rid, err := client.GetAuth().Confirm( + rid, err := messenger.GetAuth().Confirm( recipientContact) if err != nil { jww.FATAL.Panicf("%+v", err) @@ -796,17 +531,17 @@ func acceptChannel(client *xxdk.E2e, recipientID *id.ID) id.Round { return rid } -func deleteChannel(client *xxdk.E2e, partnerId *id.ID) { - err := client.DeleteContact(partnerId) +func deleteChannel(messenger *xxdk.E2e, partnerId *id.ID) { + err := messenger.DeleteContact(partnerId) if err != nil { jww.FATAL.Panicf("%+v", err) } } -func addAuthenticatedChannel(client *xxdk.E2e, recipientID *id.ID, - recipient contact.Contact) { +func addAuthenticatedChannel(messenger *xxdk.E2e, recipientID *id.ID, + recipient contact.Contact, e2eParams xxdk.E2EParams) { var allowed bool - if viper.GetBool("unsafe-channel-creation") { + if viper.GetBool(unsafeChannelCreationFlag) { msg := "unsafe channel creation enabled\n" jww.WARN.Printf(msg) fmt.Printf("WARNING: %s", msg) @@ -826,17 +561,17 @@ func addAuthenticatedChannel(client *xxdk.E2e, recipientID *id.ID, recipientContact := recipient if recipientContact.ID != nil && recipientContact.DhPubKey != nil { - me := client.GetReceptionIdentity().GetContact() + me := messenger.GetReceptionIdentity().GetContact() jww.INFO.Printf("Requesting auth channel from: %s", recipientID) // Verify that the auth request makes it to the recipient // by monitoring the round result - if viper.GetBool("verify-sends") { - requestChannelVerified(client, recipientContact, me) + if viper.GetBool(verifySendFlag) { + requestChannelVerified(messenger, recipientContact, me, e2eParams) } else { // Just call Request, agnostic of round result - _, err := client.GetAuth().Request(recipientContact, + _, err := messenger.GetAuth().Request(recipientContact, me.Facts) if err != nil { jww.FATAL.Panicf("%+v", err) @@ -849,10 +584,10 @@ func addAuthenticatedChannel(client *xxdk.E2e, recipientID *id.ID, } } -func resetAuthenticatedChannel(client *xxdk.E2e, recipientID *id.ID, - recipient contact.Contact) { +func resetAuthenticatedChannel(messenger *xxdk.E2e, recipientID *id.ID, + recipient contact.Contact, e2eParams xxdk.E2EParams) { var allowed bool - if viper.GetBool("unsafe-channel-creation") { + if viper.GetBool(unsafeChannelCreationFlag) { msg := "unsafe channel creation enabled\n" jww.WARN.Printf(msg) fmt.Printf("WARNING: %s", msg) @@ -876,10 +611,11 @@ func resetAuthenticatedChannel(client *xxdk.E2e, recipientID *id.ID, recipientID) // Verify that the auth request makes it to the recipient // by monitoring the round result - if viper.GetBool("verify-sends") { - resetChannelVerified(client, recipientContact) + if viper.GetBool(verifySendFlag) { + resetChannelVerified(messenger, recipientContact, + e2eParams) } else { - _, err := client.GetAuth().Reset(recipientContact) + _, err := messenger.GetAuth().Reset(recipientContact) if err != nil { jww.FATAL.Panicf("%+v", err) } @@ -890,17 +626,17 @@ func resetAuthenticatedChannel(client *xxdk.E2e, recipientID *id.ID, } } -func acceptChannelVerified(client *xxdk.E2e, recipientID *id.ID) { - paramsE2E := e2e.GetDefaultParams() - roundTimeout := paramsE2E.CMIXParams.SendTimeout +func acceptChannelVerified(messenger *xxdk.E2e, recipientID *id.ID, + params xxdk.E2EParams) { + roundTimeout := params.Base.CMIXParams.SendTimeout done := make(chan struct{}, 1) retryChan := make(chan struct{}, 1) for { - rid := acceptChannel(client, recipientID) + rid := acceptChannel(messenger, recipientID) // Monitor rounds for results - err := client.GetCmix().GetRoundResults(roundTimeout, + err := messenger.GetCmix().GetRoundResults(roundTimeout, makeVerifySendsCallback(retryChan, done), rid) if err != nil { jww.DEBUG.Printf("Could not verify "+ @@ -926,22 +662,22 @@ func acceptChannelVerified(client *xxdk.E2e, recipientID *id.ID) { } } -func requestChannelVerified(client *xxdk.E2e, - recipientContact, me contact.Contact) { - paramsE2E := e2e.GetDefaultParams() - roundTimeout := paramsE2E.CMIXParams.SendTimeout +func requestChannelVerified(messenger *xxdk.E2e, + recipientContact, me contact.Contact, + params xxdk.E2EParams) { + roundTimeout := params.Base.CMIXParams.SendTimeout retryChan := make(chan struct{}, 1) done := make(chan struct{}, 1) for { - rid, err := client.GetAuth().Request(recipientContact, + rid, err := messenger.GetAuth().Request(recipientContact, me.Facts) if err != nil { continue } // Monitor rounds for results - err = client.GetCmix().GetRoundResults(roundTimeout, + err = messenger.GetCmix().GetRoundResults(roundTimeout, makeVerifySendsCallback(retryChan, done), rid) if err != nil { @@ -966,21 +702,21 @@ func requestChannelVerified(client *xxdk.E2e, } } -func resetChannelVerified(client *xxdk.E2e, recipientContact contact.Contact) { - paramsE2E := e2e.GetDefaultParams() - roundTimeout := paramsE2E.CMIXParams.SendTimeout +func resetChannelVerified(messenger *xxdk.E2e, recipientContact contact.Contact, + params xxdk.E2EParams) { + roundTimeout := params.Base.CMIXParams.SendTimeout retryChan := make(chan struct{}, 1) done := make(chan struct{}, 1) for { - rid, err := client.GetAuth().Reset(recipientContact) + rid, err := messenger.GetAuth().Reset(recipientContact) if err != nil { jww.FATAL.Panicf("%+v", err) } // Monitor rounds for results - err = client.GetCmix().GetRoundResults(roundTimeout, + err = messenger.GetCmix().GetRoundResults(roundTimeout, makeVerifySendsCallback(retryChan, done), rid) if err != nil { @@ -1008,7 +744,7 @@ func resetChannelVerified(client *xxdk.E2e, recipientContact contact.Contact) { } func waitUntilConnected(connected chan bool) { - waitTimeout := time.Duration(viper.GetUint("waitTimeout")) + waitTimeout := time.Duration(viper.GetUint(waitTimeoutFlag)) timeoutTimer := time.NewTimer(waitTimeout * time.Second) isConnected := false // Wait until we connect or panic if we can't by a timeout @@ -1042,16 +778,6 @@ func waitUntilConnected(connected chan bool) { }() } -func parsePassword(pwStr string) []byte { - if strings.HasPrefix(pwStr, "0x") { - return getPWFromHexString(pwStr[2:]) - } else if strings.HasPrefix(pwStr, "b64:") { - return getPWFromb64String(pwStr[4:]) - } else { - return []byte(pwStr) - } -} - func parseRecipient(idStr string) *id.ID { if idStr == "0" { jww.FATAL.Panicf("No recipient specified") @@ -1156,7 +882,7 @@ func initLog(threshold uint, logPath string) { jww.SetLogThreshold(jww.LevelInfo) } - if viper.GetBool("verboseRoundTracking") { + if viper.GetBool(verboseRoundTrackingFlag) { initRoundLog(logPath) } } @@ -1208,204 +934,210 @@ func init() { // Here you will define your flags and configuration settings. // Cobra supports persistent flags, which, if defined here, // will be global for your application. - rootCmd.PersistentFlags().UintP("logLevel", "v", 0, + rootCmd.PersistentFlags().UintP(logLevelFlag, "v", 0, "Verbose mode for debugging") - viper.BindPFlag("logLevel", rootCmd.PersistentFlags().Lookup("logLevel")) + viper.BindPFlag(logLevelFlag, rootCmd.PersistentFlags(). + Lookup(logLevelFlag)) - rootCmd.PersistentFlags().Bool("verboseRoundTracking", false, + rootCmd.PersistentFlags().Bool(verboseRoundTrackingFlag, false, "Verbose round tracking, keeps track and prints all rounds the "+ "client was aware of while running. Defaults to false if not set.") - viper.BindPFlag("verboseRoundTracking", rootCmd.PersistentFlags().Lookup("verboseRoundTracking")) + viper.BindPFlag(verboseRoundTrackingFlag, rootCmd.PersistentFlags().Lookup( + verboseRoundTrackingFlag)) - rootCmd.PersistentFlags().StringP("session", "s", + rootCmd.PersistentFlags().StringP(sessionFlag, "s", "", "Sets the initial storage directory for "+ "client session data") - viper.BindPFlag("session", rootCmd.PersistentFlags().Lookup("session")) + viper.BindPFlag(sessionFlag, rootCmd.PersistentFlags().Lookup(sessionFlag)) - rootCmd.PersistentFlags().StringP("writeContact", "w", + rootCmd.PersistentFlags().StringP(writeContactFlag, "w", "-", "Write contact information, if any, to this file, "+ " defaults to stdout") - viper.BindPFlag("writeContact", rootCmd.PersistentFlags().Lookup( - "writeContact")) + viper.BindPFlag(writeContactFlag, rootCmd.PersistentFlags().Lookup( + writeContactFlag)) - rootCmd.PersistentFlags().StringP("password", "p", "", + rootCmd.PersistentFlags().StringP(passwordFlag, "p", "", "Password to the session file") - viper.BindPFlag("password", rootCmd.PersistentFlags().Lookup( - "password")) + viper.BindPFlag(passwordFlag, rootCmd.PersistentFlags().Lookup( + passwordFlag)) - rootCmd.PersistentFlags().StringP("ndf", "n", "ndf.json", + rootCmd.PersistentFlags().StringP(ndfFlag, "n", "ndf.json", "Path to the network definition JSON file") - viper.BindPFlag("ndf", rootCmd.PersistentFlags().Lookup("ndf")) + viper.BindPFlag(ndfFlag, rootCmd.PersistentFlags().Lookup(ndfFlag)) - rootCmd.PersistentFlags().StringP("log", "l", "-", + rootCmd.PersistentFlags().StringP(logFlag, "l", "-", "Path to the log output path (- is stdout)") - viper.BindPFlag("log", rootCmd.PersistentFlags().Lookup("log")) + viper.BindPFlag(logFlag, rootCmd.PersistentFlags().Lookup(logFlag)) - rootCmd.Flags().StringP("regcode", "", "", + rootCmd.Flags().StringP(regCodeFlag, "", "", "ReceptionIdentity code (optional)") - viper.BindPFlag("regcode", rootCmd.Flags().Lookup("regcode")) + viper.BindPFlag(regCodeFlag, rootCmd.Flags().Lookup(regCodeFlag)) - rootCmd.PersistentFlags().StringP("message", "m", "", + rootCmd.PersistentFlags().StringP(messageFlag, "m", "", "Message to send") - viper.BindPFlag("message", rootCmd.PersistentFlags().Lookup("message")) + viper.BindPFlag(messageFlag, rootCmd.PersistentFlags().Lookup(messageFlag)) - rootCmd.Flags().UintP("sendid", "", 0, + rootCmd.Flags().UintP(sendIdFlag, "", 0, "Use precanned user id (must be between 1 and 40, inclusive)") - viper.BindPFlag("sendid", rootCmd.Flags().Lookup("sendid")) + viper.BindPFlag(sendIdFlag, rootCmd.Flags().Lookup(sendIdFlag)) - rootCmd.Flags().StringP("destid", "d", "0", + rootCmd.Flags().StringP(destIdFlag, "d", "0", "ID to send message to (if below 40, will be precanned. Use "+ "'0x' or 'b64:' for hex and base64 representations)") - viper.BindPFlag("destid", rootCmd.Flags().Lookup("destid")) + viper.BindPFlag(destIdFlag, rootCmd.Flags().Lookup(destIdFlag)) + rootCmd.PersistentFlags().Bool("force-legacy", false, + "Force client to operate using legacy identities.") + viper.BindPFlag("force-legacy", rootCmd.PersistentFlags().Lookup("force-legacy")) - rootCmd.Flags().StringP("destfile", "", + rootCmd.PersistentFlags().StringP(destFileFlag, "", "", "Read this contact file for the destination id") - viper.BindPFlag("destfile", rootCmd.Flags().Lookup("destfile")) + viper.BindPFlag(destFileFlag, rootCmd.PersistentFlags().Lookup(destFileFlag)) - rootCmd.Flags().UintP("sendCount", + rootCmd.PersistentFlags().UintP(sendCountFlag, "", 1, "The number of times to send the message") - viper.BindPFlag("sendCount", rootCmd.Flags().Lookup("sendCount")) - rootCmd.PersistentFlags().UintP("sendDelay", + viper.BindPFlag(sendCountFlag, rootCmd.PersistentFlags().Lookup(sendCountFlag)) + rootCmd.PersistentFlags().UintP(sendDelayFlag, "", 500, "The delay between sending the messages in ms") - viper.BindPFlag("sendDelay", rootCmd.PersistentFlags().Lookup("sendDelay")) - rootCmd.Flags().BoolP("splitSends", + viper.BindPFlag(sendDelayFlag, rootCmd.PersistentFlags().Lookup(sendDelayFlag)) + rootCmd.Flags().BoolP(splitSendsFlag, "", false, "Force sends to go over multiple rounds if possible") - viper.BindPFlag("splitSends", rootCmd.Flags().Lookup("splitSends")) + viper.BindPFlag(splitSendsFlag, rootCmd.Flags().Lookup(splitSendsFlag)) - rootCmd.Flags().BoolP("verify-sends", "", false, + rootCmd.Flags().BoolP(verifySendFlag, "", false, "Ensure successful message sending by checking for round completion") - viper.BindPFlag("verify-sends", rootCmd.Flags().Lookup("verify-sends")) + viper.BindPFlag(verifySendFlag, rootCmd.Flags().Lookup(verifySendFlag)) - rootCmd.PersistentFlags().UintP("receiveCount", + rootCmd.PersistentFlags().UintP(receiveCountFlag, "", 1, "How many messages we should wait for before quitting") - viper.BindPFlag("receiveCount", rootCmd.PersistentFlags().Lookup("receiveCount")) - rootCmd.PersistentFlags().UintP("waitTimeout", "", 15, + viper.BindPFlag(receiveCountFlag, rootCmd.PersistentFlags().Lookup(receiveCountFlag)) + rootCmd.PersistentFlags().UintP(waitTimeoutFlag, "", 15, "The number of seconds to wait for messages to arrive") - viper.BindPFlag("waitTimeout", - rootCmd.PersistentFlags().Lookup("waitTimeout")) + viper.BindPFlag(waitTimeoutFlag, + rootCmd.PersistentFlags().Lookup(waitTimeoutFlag)) - rootCmd.Flags().BoolP("unsafe", "", false, + rootCmd.Flags().BoolP(unsafeFlag, "", false, "Send raw, unsafe messages without e2e encryption.") - viper.BindPFlag("unsafe", rootCmd.Flags().Lookup("unsafe")) + viper.BindPFlag(unsafeFlag, rootCmd.Flags().Lookup(unsafeFlag)) - rootCmd.PersistentFlags().BoolP("unsafe-channel-creation", "", false, + rootCmd.PersistentFlags().BoolP(unsafeChannelCreationFlag, "", false, "Turns off the user identity authenticated channel check, "+ "automatically approving authenticated channels") - viper.BindPFlag("unsafe-channel-creation", - rootCmd.PersistentFlags().Lookup("unsafe-channel-creation")) + viper.BindPFlag(unsafeChannelCreationFlag, + rootCmd.PersistentFlags().Lookup(unsafeChannelCreationFlag)) - rootCmd.Flags().BoolP("accept-channel", "", false, + rootCmd.Flags().BoolP(acceptChannelFlag, "", false, "Accept the channel request for the corresponding recipient ID") - viper.BindPFlag("accept-channel", - rootCmd.Flags().Lookup("accept-channel")) + viper.BindPFlag(acceptChannelFlag, + rootCmd.Flags().Lookup(acceptChannelFlag)) - rootCmd.PersistentFlags().Bool("delete-channel", false, + rootCmd.PersistentFlags().Bool(deleteChannelFlag, false, "DeleteFingerprint the channel information for the corresponding recipient ID") - viper.BindPFlag("delete-channel", - rootCmd.PersistentFlags().Lookup("delete-channel")) + viper.BindPFlag(deleteChannelFlag, + rootCmd.PersistentFlags().Lookup(deleteChannelFlag)) - rootCmd.PersistentFlags().Bool("delete-receive-requests", false, + rootCmd.PersistentFlags().Bool(deleteReceiveRequestsFlag, false, "DeleteFingerprint the all received contact requests.") - viper.BindPFlag("delete-receive-requests", - rootCmd.PersistentFlags().Lookup("delete-receive-requests")) + viper.BindPFlag(deleteReceiveRequestsFlag, + rootCmd.PersistentFlags().Lookup(deleteReceiveRequestsFlag)) - rootCmd.PersistentFlags().Bool("delete-sent-requests", false, + rootCmd.PersistentFlags().Bool(deleteSentRequestsFlag, false, "DeleteFingerprint the all sent contact requests.") - viper.BindPFlag("delete-sent-requests", - rootCmd.PersistentFlags().Lookup("delete-sent-requests")) + viper.BindPFlag(deleteSentRequestsFlag, + rootCmd.PersistentFlags().Lookup(deleteSentRequestsFlag)) - rootCmd.PersistentFlags().Bool("delete-all-requests", false, + rootCmd.PersistentFlags().Bool(deleteAllRequestsFlag, false, "DeleteFingerprint the all contact requests, both sent and received.") - viper.BindPFlag("delete-all-requests", - rootCmd.PersistentFlags().Lookup("delete-all-requests")) + viper.BindPFlag(deleteAllRequestsFlag, + rootCmd.PersistentFlags().Lookup(deleteAllRequestsFlag)) - rootCmd.PersistentFlags().Bool("delete-request", false, + rootCmd.PersistentFlags().Bool(deleteRequestFlag, false, "DeleteFingerprint the request for the specified ID given by the "+ "destfile flag's contact file.") - viper.BindPFlag("delete-request", - rootCmd.PersistentFlags().Lookup("delete-request")) + viper.BindPFlag(deleteRequestFlag, + rootCmd.PersistentFlags().Lookup(deleteRequestFlag)) - rootCmd.Flags().BoolP("send-auth-request", "", false, + rootCmd.Flags().BoolP(sendAuthRequestFlag, "", false, "Send an auth request to the specified destination and wait"+ "for confirmation") - viper.BindPFlag("send-auth-request", - rootCmd.Flags().Lookup("send-auth-request")) - rootCmd.Flags().UintP("auth-timeout", "", 60, + viper.BindPFlag(sendAuthRequestFlag, + rootCmd.Flags().Lookup(sendAuthRequestFlag)) + rootCmd.Flags().UintP(authTimeoutFlag, "", 60, "The number of seconds to wait for an authentication channel"+ "to confirm") - viper.BindPFlag("auth-timeout", - rootCmd.Flags().Lookup("auth-timeout")) + viper.BindPFlag(authTimeoutFlag, + rootCmd.Flags().Lookup(authTimeoutFlag)) - rootCmd.Flags().BoolP("forceHistoricalRounds", "", false, + rootCmd.Flags().BoolP(forceHistoricalRoundsFlag, "", false, "Force all rounds to be sent to historical round retrieval") - viper.BindPFlag("forceHistoricalRounds", - rootCmd.Flags().Lookup("forceHistoricalRounds")) + viper.BindPFlag(forceHistoricalRoundsFlag, + rootCmd.Flags().Lookup(forceHistoricalRoundsFlag)) // Network params - rootCmd.Flags().BoolP("slowPolling", "", false, + rootCmd.Flags().BoolP(slowPollingFlag, "", false, "Enables polling for unfiltered network updates with RSA signatures") - viper.BindPFlag("slowPolling", - rootCmd.Flags().Lookup("slowPolling")) - rootCmd.Flags().Bool("forceMessagePickupRetry", false, + viper.BindPFlag(slowPollingFlag, + rootCmd.Flags().Lookup(slowPollingFlag)) + + rootCmd.Flags().Bool(forceMessagePickupRetryFlag, false, "Enable a mechanism which forces a 50% chance of no message pickup, "+ "instead triggering the message pickup retry mechanism") - viper.BindPFlag("forceMessagePickupRetry", - rootCmd.Flags().Lookup("forceMessagePickupRetry")) + viper.BindPFlag(forceMessagePickupRetryFlag, + rootCmd.Flags().Lookup(forceMessagePickupRetryFlag)) // E2E Params defaultE2EParams := session.GetDefaultParams() - rootCmd.Flags().UintP("e2eMinKeys", + rootCmd.Flags().UintP(e2eMinKeysFlag, "", uint(defaultE2EParams.MinKeys), "Minimum number of keys used before requesting rekey") - viper.BindPFlag("e2eMinKeys", rootCmd.Flags().Lookup("e2eMinKeys")) - rootCmd.Flags().UintP("e2eMaxKeys", + viper.BindPFlag(e2eMinKeysFlag, rootCmd.Flags().Lookup(e2eMinKeysFlag)) + rootCmd.Flags().UintP(e2eMaxKeysFlag, "", uint(defaultE2EParams.MaxKeys), "Max keys used before blocking until a rekey completes") - viper.BindPFlag("e2eMaxKeys", rootCmd.Flags().Lookup("e2eMaxKeys")) - rootCmd.Flags().UintP("e2eNumReKeys", + viper.BindPFlag(e2eMaxKeysFlag, rootCmd.Flags().Lookup(e2eMaxKeysFlag)) + rootCmd.Flags().UintP(e2eNumReKeysFlag, "", uint(defaultE2EParams.NumRekeys), "Number of rekeys reserved for rekey operations") - viper.BindPFlag("e2eNumReKeys", rootCmd.Flags().Lookup("e2eNumReKeys")) - rootCmd.Flags().Float64P("e2eRekeyThreshold", + viper.BindPFlag(e2eNumReKeysFlag, rootCmd.Flags().Lookup(e2eNumReKeysFlag)) + rootCmd.Flags().Float64P(e2eRekeyThresholdFlag, "", defaultE2EParams.RekeyThreshold, "Number between 0 an 1. Percent of keys used before a rekey is started") - viper.BindPFlag("e2eRekeyThreshold", rootCmd.Flags().Lookup("e2eRekeyThreshold")) + viper.BindPFlag(e2eRekeyThresholdFlag, rootCmd.Flags().Lookup(e2eRekeyThresholdFlag)) - rootCmd.Flags().String("profile-cpu", "", + rootCmd.Flags().String(profileCpuFlag, "", "Enable cpu profiling to this file") - viper.BindPFlag("profile-cpu", rootCmd.Flags().Lookup("profile-cpu")) + viper.BindPFlag(profileCpuFlag, rootCmd.Flags().Lookup(profileCpuFlag)) // Proto user flags - rootCmd.Flags().String("protoUserPath", "", + rootCmd.Flags().String(protoUserPathFlag, "", "Path to proto user JSON file containing cryptographic primitives "+ "the client will load") - viper.BindPFlag("protoUserPath", rootCmd.Flags().Lookup("protoUserPath")) - rootCmd.Flags().String("protoUserOut", "", + viper.BindPFlag(protoUserPathFlag, rootCmd.Flags().Lookup(protoUserPathFlag)) + rootCmd.Flags().String(protoUserOutFlag, "", "Path to which a normally constructed client "+ "will write proto user JSON file") - viper.BindPFlag("protoUserOut", rootCmd.Flags().Lookup("protoUserOut")) + viper.BindPFlag(protoUserOutFlag, rootCmd.Flags().Lookup(protoUserOutFlag)) // Backup flags - rootCmd.Flags().String("backupOut", "", + rootCmd.Flags().String(backupOutFlag, "", "Path to output encrypted client backup. If no path is supplied, the "+ "backup system is not started.") - viper.BindPFlag("backupOut", rootCmd.Flags().Lookup("backupOut")) + viper.BindPFlag(backupOutFlag, rootCmd.Flags().Lookup(backupOutFlag)) - rootCmd.Flags().String("backupJsonOut", "", + rootCmd.Flags().String(backupJsonOutFlag, "", "Path to output unencrypted client JSON backup.") - viper.BindPFlag("backupJsonOut", rootCmd.Flags().Lookup("backupJsonOut")) + viper.BindPFlag(backupJsonOutFlag, rootCmd.Flags().Lookup(backupJsonOutFlag)) - rootCmd.Flags().String("backupIn", "", + rootCmd.Flags().String(backupInFlag, "", "Path to load backup client from") - viper.BindPFlag("backupIn", rootCmd.Flags().Lookup("backupIn")) + viper.BindPFlag(backupInFlag, rootCmd.Flags().Lookup(backupInFlag)) - rootCmd.Flags().String("backupPass", "", + rootCmd.Flags().String(backupPassFlag, "", "Passphrase to encrypt/decrypt backup") - viper.BindPFlag("backupPass", rootCmd.Flags().Lookup("backupPass")) + viper.BindPFlag(backupPassFlag, rootCmd.Flags().Lookup(backupPassFlag)) - rootCmd.Flags().String("backupIdList", "", + rootCmd.Flags().String(backupIdListFlag, "", "JSON file containing the backed up partner IDs") - viper.BindPFlag("backupIdList", rootCmd.Flags().Lookup("backupIdList")) + viper.BindPFlag(backupIdListFlag, rootCmd.Flags().Lookup(backupIdListFlag)) } diff --git a/cmd/single.go b/cmd/single.go index ed6939618864287668739abd0e6e258c02ae41f4..d23a5be52475b2fc3e7119c965a9c304d9518c26 100644 --- a/cmd/single.go +++ b/cmd/single.go @@ -33,7 +33,8 @@ var singleCmd = &cobra.Command{ Args: cobra.NoArgs, Run: func(cmd *cobra.Command, args []string) { - client := initE2e() + cmixParams, e2eParams := initParams() + client := initE2e(cmixParams, e2eParams) // Write user contact to file user := client.GetReceptionIdentity() @@ -54,7 +55,7 @@ var singleCmd = &cobra.Command{ waitUntilConnected(connected) // get the tag - tag := viper.GetString("tag") + tag := viper.GetString(singleTagFlag) // Register the callback receiver := &Receiver{ @@ -87,14 +88,14 @@ var singleCmd = &cobra.Command{ numReg, total) } - timeout := viper.GetDuration("timeout") + timeout := viper.GetDuration(singleTimeoutFlag) // If the send flag is set, then send a message - if viper.GetBool("send") { + if viper.GetBool(singleSendFlag) { // get message details - payload := []byte(viper.GetString("message")) - partner := readSingleUseContact("contact") - maxMessages := uint8(viper.GetUint("maxMessages")) + payload := []byte(viper.GetString(messageFlag)) + partner := readSingleUseContact(singleContactFlag) + maxMessages := uint8(viper.GetUint(singleMaxMessagesFlag)) sendSingleUse(client.Cmix, partner, payload, maxMessages, timeout, tag) @@ -102,7 +103,7 @@ var singleCmd = &cobra.Command{ // If the reply flag is set, then start waiting for a // message and reply when it is received - if viper.GetBool("reply") { + if viper.GetBool(singleReplyFlag) { replySingleUse(timeout, receiver) } listener.Stop() @@ -112,28 +113,28 @@ var singleCmd = &cobra.Command{ func init() { // Single-use subcommand options - singleCmd.Flags().Bool("send", false, "Sends a single-use message.") - _ = viper.BindPFlag("send", singleCmd.Flags().Lookup("send")) + singleCmd.Flags().Bool(singleSendFlag, false, "Sends a single-use message.") + bindFlagHelper(singleSendFlag, singleCmd) - singleCmd.Flags().Bool("reply", false, + singleCmd.Flags().Bool(singleReplyFlag, false, "Listens for a single-use message and sends a reply.") - _ = viper.BindPFlag("reply", singleCmd.Flags().Lookup("reply")) + bindFlagHelper(singleReplyFlag, singleCmd) - singleCmd.Flags().StringP("contact", "c", "", + singleCmd.Flags().StringP(singleContactFlag, "c", "", "Path to contact file to send message to.") - _ = viper.BindPFlag("contact", singleCmd.Flags().Lookup("contact")) + bindFlagHelper(singleContactFlag, singleCmd) - singleCmd.Flags().StringP("tag", "", "testTag", + singleCmd.Flags().StringP(singleTagFlag, "", "testTag", "The tag that specifies the callback to trigger on reception.") - _ = viper.BindPFlag("tag", singleCmd.Flags().Lookup("tag")) + bindFlagHelper(singleTagFlag, singleCmd) - singleCmd.Flags().Uint8("maxMessages", 1, + singleCmd.Flags().Uint8(singleMaxMessagesFlag, 1, "The max number of single-use response messages.") - _ = viper.BindPFlag("maxMessages", singleCmd.Flags().Lookup("maxMessages")) + bindFlagHelper(singleMaxMessagesFlag, singleCmd) - singleCmd.Flags().DurationP("timeout", "t", 30*time.Second, + singleCmd.Flags().DurationP(singleTimeoutFlag, "t", 30*time.Second, "Duration before stopping to wait for single-use message.") - _ = viper.BindPFlag("timeout", singleCmd.Flags().Lookup("timeout")) + bindFlagHelper(singleTimeoutFlag, singleCmd) rootCmd.AddCommand(singleCmd) } @@ -156,7 +157,7 @@ func (r *Response) Callback(payload []byte, receptionID receptionID.EphemeralIde } // sendSingleUse sends a single use message. -func sendSingleUse(m *xxdk.Cmix, partner contact.Contact, payload []byte, +func sendSingleUse(net *xxdk.Cmix, partner contact.Contact, payload []byte, maxMessages uint8, timeout time.Duration, tag string) { // Construct callback callback := &Response{ @@ -177,12 +178,12 @@ func sendSingleUse(m *xxdk.Cmix, partner contact.Contact, payload []byte, partner.ID, payload) params := single.GetDefaultRequestParams() params.MaxResponseMessages = maxMessages - rng := m.GetRng().GetStream() + rng := net.GetRng().GetStream() defer rng.Close() - e2eGrp := m.GetStorage().GetE2EGroup() + e2eGrp := net.GetStorage().GetE2EGroup() rnd, ephID, err := single.TransmitRequest(partner, tag, payload, callback, params, - m.GetCmix(), rng, e2eGrp) + net.GetCmix(), rng, e2eGrp) if err != nil { jww.FATAL.Panicf("Failed to transmit single-use message: %+v", err) } diff --git a/cmd/ud.go b/cmd/ud.go index 44d159684a40756dcc724c88b1a17b94c7ed9b65..06707a6f52d224d3f661c6dc664dc7d3a2238b69 100644 --- a/cmd/ud.go +++ b/cmd/ud.go @@ -10,13 +10,14 @@ package cmd import ( "fmt" + "strings" + "time" + "gitlab.com/elixxir/client/single" "gitlab.com/elixxir/client/ud" "gitlab.com/elixxir/client/xxmutils" "gitlab.com/elixxir/primitives/fact" "gitlab.com/xx_network/primitives/utils" - "strings" - "time" "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" @@ -33,42 +34,21 @@ var udCmd = &cobra.Command{ Short: "Register for and search users using the xx network user discovery service.", Args: cobra.NoArgs, Run: func(cmd *cobra.Command, args []string) { - client := initE2e() + cmixParams, e2eParams := initParams() + client := initE2e(cmixParams, e2eParams) // get user and save contact to file user := client.GetReceptionIdentity() - jww.INFO.Printf("User: %s", user.ID) + jww.INFO.Printf("[UD]User: %s", user.ID) writeContact(user.GetContact()) - // // Set up reception handler - // swBoard := client.GetSwitchboard() - // recvCh := make(chan message.Receive, 10000) - // listenerID := swBoard.RegisterChannel("DefaultCLIReceiver", - // switchboard.AnyUser(), message.XxMessage, recvCh) - // jww.INFO.Printf("Message ListenerID: %v", listenerID) - - // // Set up auth request handler, which simply prints the user ID of the - // // requester - // authMgr := client.GetAuthRegistrar() - // authMgr.AddGeneralRequestCallback(printChanRequest) - - // // If unsafe channels, add auto-acceptor - // if viper.GetBool("unsafe-channel-creation") { - // authMgr.AddGeneralRequestCallback(func( - // requester contact.Contact) { - // jww.INFO.Printf("Got Request: %s", requester.ID) - // _, err := client.ConfirmAuthenticatedChannel(requester) - // if err != nil { - // jww.FATAL.Panicf("%+v", err) - // } - // }) - // } - err := client.StartNetworkFollower(50 * time.Millisecond) if err != nil { jww.FATAL.Panicf("%+v", err) } + jww.TRACE.Printf("[UD] Waiting for connection...") + // Wait until connected or crash on timeout connected := make(chan bool, 10) client.GetCmix().AddHealthCallback( @@ -77,22 +57,17 @@ var udCmd = &cobra.Command{ }) waitUntilConnected(connected) + jww.TRACE.Printf("[UD] Connected!") + // Make user discovery manager rng := client.GetRng() userToRegister := viper.GetString("register") - userDiscoveryMgr, err := ud.NewManager(client.GetCmix(), - client.GetE2E(), client.NetworkFollowerStatus, - client.GetEventReporter(), - client.GetComms(), client.GetStorage(), - rng, - userToRegister, client.GetStorage().GetKV()) + jww.TRACE.Printf("[UD] Registering user %v...", userToRegister) + userDiscoveryMgr, err := ud.NewManager(client, client.GetComms(), + client.NetworkFollowerStatus, userToRegister, nil) if err != nil { if strings.Contains(err.Error(), ud.IsRegisteredErr) { - userDiscoveryMgr, err = ud.LoadManager(client.GetCmix(), - client.GetE2E(), client.GetEventReporter(), - client.GetComms(), - client.GetStorage(), client.GetRng(), - client.GetStorage().GetKV()) + userDiscoveryMgr, err = ud.LoadManager(client, client.GetComms()) if err != nil { jww.FATAL.Panicf("Failed to load UD manager: %+v", err) } @@ -101,9 +76,10 @@ var udCmd = &cobra.Command{ } } + jww.INFO.Printf("[UD] Registered user %v", userToRegister) var newFacts fact.FactList - phone := viper.GetString("addphone") + phone := viper.GetString(udAddPhoneFlag) if phone != "" { f, err := fact.NewFact(fact.Phone, phone) if err != nil { @@ -112,7 +88,7 @@ var udCmd = &cobra.Command{ newFacts = append(newFacts, f) } - email := viper.GetString("addemail") + email := viper.GetString(udAddEmailFlag) if email != "" { f, err := fact.NewFact(fact.Email, email) if err != nil { @@ -122,24 +98,29 @@ var udCmd = &cobra.Command{ } for i := 0; i < len(newFacts); i++ { + jww.INFO.Printf("[UD] Registering Fact: %v", + newFacts[i]) r, err := userDiscoveryMgr.SendRegisterFact(newFacts[i]) if err != nil { fmt.Printf("Failed to register fact: %s\n", newFacts[i]) - jww.FATAL.Panicf("Failed to send register fact: %+v", err) + jww.FATAL.Panicf("[UD] Failed to send register fact: %+v", err) } // TODO Store the code? - jww.INFO.Printf("Fact Add Response: %+v", r) + jww.INFO.Printf("[UD] Fact Add Response: %+v", r) } - confirmID := viper.GetString("confirm") + confirmID := viper.GetString(udConfirmFlag) if confirmID != "" { + jww.INFO.Printf("[UD] Confirming fact: %v", confirmID) err = userDiscoveryMgr.ConfirmFact(confirmID, confirmID) if err != nil { fmt.Printf("Couldn't confirm fact: %s\n", err.Error()) jww.FATAL.Panicf("%+v", err) } + + jww.INFO.Printf("[UD] Confirmed %v", confirmID) } udContact, err := userDiscoveryMgr.GetContact() @@ -150,12 +131,10 @@ var udCmd = &cobra.Command{ // Handle lookup (verification) process // Note: Cryptographic verification occurs above the bindings layer - lookupIDStr := viper.GetString("lookup") + lookupIDStr := viper.GetString(udLookupFlag) if lookupIDStr != "" { lookupID := parseRecipient(lookupIDStr) - //if !ok { - // jww.FATAL.Panicf("Could not parse recipient: %s", lookupIDStr) - //} + jww.INFO.Printf("[UD] Looking up %v", lookupID) cb := func(newContact contact.Contact, err error) { if err != nil { @@ -176,13 +155,14 @@ var udCmd = &cobra.Command{ time.Sleep(31 * time.Second) } - if viper.GetString("batchadd") != "" { - idListFile, err := utils.ReadFile(viper.GetString("batchadd")) + if viper.IsSet(udBatchAddFlag) { + idListFile, err := utils.ReadFile(viper.GetString(udBatchAddFlag)) if err != nil { fmt.Printf("BATCHADD: Couldn't read file: %s\n", err.Error()) jww.FATAL.Panicf("BATCHADD: Couldn't read file: %+v", err) } + jww.INFO.Printf("[UD] BATCHADD: Running") restored, _, _, err := xxmutils.RestoreContactsFromBackup( idListFile, client, userDiscoveryMgr, nil) if err != nil { @@ -193,12 +173,12 @@ var udCmd = &cobra.Command{ for !client.GetE2E().HasAuthenticatedChannel(uid) { time.Sleep(time.Second) } - jww.INFO.Printf("Authenticated channel established for %s", uid) + jww.INFO.Printf("[UD] Authenticated channel established for %s", uid) } } - usernameSearchStr := viper.GetString("searchusername") - emailSearchStr := viper.GetString("searchemail") - phoneSearchStr := viper.GetString("searchphone") + usernameSearchStr := viper.GetString(udSearchUsernameFlag) + emailSearchStr := viper.GetString(udSearchEmailFlag) + phoneSearchStr := viper.GetString(udSearchPhoneFlag) var facts fact.FactList if usernameSearchStr != "" { @@ -223,7 +203,7 @@ var udCmd = &cobra.Command{ facts = append(facts, f) } - userToRemove := viper.GetString("remove") + userToRemove := viper.GetString(udRemoveFlag) if userToRemove != "" { f, err := fact.NewFact(fact.Username, userToRemove) if err != nil { @@ -261,6 +241,7 @@ var udCmd = &cobra.Command{ stream := rng.GetStream() defer stream.Close() + jww.INFO.Printf("[UD] Search: %v", facts) _, _, err = ud.Search(client.GetCmix(), client.GetEventReporter(), stream, client.GetE2E().GetGroup(), @@ -279,56 +260,44 @@ var udCmd = &cobra.Command{ func init() { // User Discovery subcommand Options - udCmd.Flags().StringP("register", "r", "", + udCmd.Flags().StringP(udRegisterFlag, "r", "", "Register this user with user discovery.") - _ = viper.BindPFlag("register", udCmd.Flags().Lookup("register")) + bindFlagHelper(udRegisterFlag, udCmd) - udCmd.Flags().StringP("remove", "", "", + udCmd.Flags().StringP(udRemoveFlag, "", "", "Remove this user with user discovery.") - _ = viper.BindPFlag("remove", udCmd.Flags().Lookup("remove")) + bindFlagHelper(udRemoveFlag, udCmd) - udCmd.Flags().String("addphone", "", + udCmd.Flags().String(udAddPhoneFlag, "", "Add phone number to existing user registration.") - _ = viper.BindPFlag("addphone", udCmd.Flags().Lookup("addphone")) + bindFlagHelper(udAddPhoneFlag, udCmd) - udCmd.Flags().StringP("addemail", "e", "", + udCmd.Flags().StringP(udAddEmailFlag, "e", "", "Add email to existing user registration.") - _ = viper.BindPFlag("addemail", udCmd.Flags().Lookup("addemail")) + bindFlagHelper(udAddEmailFlag, udCmd) - udCmd.Flags().String("confirm", "", "Confirm fact with confirmation ID.") - _ = viper.BindPFlag("confirm", udCmd.Flags().Lookup("confirm")) + udCmd.Flags().String(udConfirmFlag, "", "Confirm fact with confirmation ID.") + bindFlagHelper(udConfirmFlag, udCmd) - udCmd.Flags().StringP("lookup", "u", "", + udCmd.Flags().StringP(udLookupFlag, "u", "", "Look up user ID. Use '0x' or 'b64:' for hex and base64 representations.") - _ = viper.BindPFlag("lookup", udCmd.Flags().Lookup("lookup")) + bindFlagHelper(udLookupFlag, udCmd) - udCmd.Flags().String("searchusername", "", + udCmd.Flags().String(udSearchUsernameFlag, "", "Search for users with this username.") - _ = viper.BindPFlag("searchusername", udCmd.Flags().Lookup("searchusername")) + bindFlagHelper(udSearchUsernameFlag, udCmd) - udCmd.Flags().String("searchemail", "", + udCmd.Flags().String(udSearchEmailFlag, "", "Search for users with this email address.") - _ = viper.BindPFlag("searchemail", udCmd.Flags().Lookup("searchemail")) + bindFlagHelper(udSearchEmailFlag, udCmd) - udCmd.Flags().String("searchphone", "", + udCmd.Flags().String(udSearchPhoneFlag, "", "Search for users with this email address.") - _ = viper.BindPFlag("searchphone", udCmd.Flags().Lookup("searchphone")) + bindFlagHelper(udSearchPhoneFlag, udCmd) - udCmd.Flags().String("batchadd", "", + udCmd.Flags().String(udBatchAddFlag, "", "Path to JSON marshalled slice of partner IDs that will be looked up on UD.") - _ = viper.BindPFlag("batchadd", udCmd.Flags().Lookup("batchadd")) + bindFlagHelper(udBatchAddFlag, udCmd) rootCmd.AddCommand(udCmd) } - -func printContact(c contact.Contact) { - jww.DEBUG.Printf("Printing contact: %+v", c) - cBytes := c.Marshal() - if len(cBytes) == 0 { - jww.ERROR.Print("Marshaled contact has a size of 0.") - } else { - jww.DEBUG.Printf("Printing marshaled contact of size %d.", len(cBytes)) - } - - fmt.Print(string(cBytes)) -} diff --git a/cmd/utils.go b/cmd/utils.go index 12c01738e45ecae13c9a4fef3fdb4140f3284a42..723d1d47debb774415830137e9cdb0a87def4558 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -1,6 +1,9 @@ package cmd import ( + "github.com/spf13/cobra" + "gitlab.com/elixxir/client/e2e" + "gitlab.com/elixxir/client/xxdk" "io/ioutil" "strconv" "strings" @@ -8,28 +11,70 @@ import ( jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" "gitlab.com/elixxir/client/cmix" - backupCrypto "gitlab.com/elixxir/crypto/backup" "gitlab.com/elixxir/crypto/contact" "gitlab.com/xx_network/primitives/id" - "gitlab.com/xx_network/primitives/utils" ) // todo: go through cmd package and organize utility functions -func loadBackup(backupPath, backupPass string) (backupCrypto.Backup, []byte) { - jww.INFO.Printf("Loading backup from path %q with password %q", backupPath, backupPass) - backupFile, err := utils.ReadFile(backupPath) +// bindFlagHelper binds the key to a pflag.Flag used by Cobra and prints an +// error if one occurs. +func bindFlagHelper(key string, command *cobra.Command) { + err := viper.BindPFlag(key, command.Flags().Lookup(key)) if err != nil { - jww.FATAL.Panicf("%v", err) + jww.ERROR.Printf("viper.BindPFlag failed for %q: %+v", key, err) + } +} + +func verifySendSuccess(client *xxdk.E2e, paramsE2E e2e.Params, + roundIDs []id.Round, partnerId *id.ID, payload []byte) bool { + retryChan := make(chan struct{}) + done := make(chan struct{}, 1) + + // Construct the callback function which + // verifies successful message send or retries + f := func(allRoundsSucceeded, timedOut bool, + rounds map[id.Round]cmix.RoundResult) { + printRoundResults( + rounds, roundIDs, payload, partnerId) + if !allRoundsSucceeded { + retryChan <- struct{}{} + } else { + done <- struct{}{} + } } - var b backupCrypto.Backup - err = b.Decrypt(backupPass, backupFile) + // Monitor rounds for results + err := client.GetCmix().GetRoundResults( + paramsE2E.CMIXParams.Timeout, f, roundIDs...) if err != nil { - jww.ERROR.Printf("Failed to decrypt backup: %+v", err) + jww.DEBUG.Printf("Could not verify messages were sent " + + "successfully, resending messages...") + return false } - return b, backupFile + select { + case <-retryChan: + // On a retry, go to the top of the loop + jww.DEBUG.Printf("Messages were not sent successfully," + + " resending messages...") + return false + case <-done: + // Close channels on verification success + close(done) + close(retryChan) + return true + } +} + +func parsePassword(pwStr string) []byte { + if strings.HasPrefix(pwStr, "0x") { + return getPWFromHexString(pwStr[2:]) + } else if strings.HasPrefix(pwStr, "b64:") { + return getPWFromb64String(pwStr[4:]) + } else { + return []byte(pwStr) + } } ///////////////////////////////////////////////////////////////// @@ -72,11 +117,22 @@ func printRoundResults(rounds map[id.Round]cmix.RoundResult, roundIDs []id.Round jww.ERROR.Printf("\tRound(s) %v timed out (no network resolution could be found)", strings.Join(timedOutRounds, ",")) } +} + +func printContact(c contact.Contact) { + jww.DEBUG.Printf("Printing contact: %+v", c) + cBytes := c.Marshal() + if len(cBytes) == 0 { + jww.ERROR.Print("Marshaled contact has a size of 0.") + } else { + jww.DEBUG.Printf("Printing marshaled contact of size %d.", len(cBytes)) + } + jww.INFO.Printf(string(cBytes)) } func writeContact(c contact.Contact) { - outfilePath := viper.GetString("writeContact") + outfilePath := viper.GetString(writeContactFlag) if outfilePath == "" { return } @@ -91,6 +147,7 @@ func readContact(inputFilePath string) contact.Contact { if inputFilePath == "" { return contact.Contact{} } + data, err := ioutil.ReadFile(inputFilePath) jww.INFO.Printf("Contact file size read in: %d", len(data)) if err != nil { diff --git a/cmix.go b/cmix.go deleted file mode 100644 index 69ee456715006686934cd8b27cbc3dccd8a976a1..0000000000000000000000000000000000000000 --- a/cmix.go +++ /dev/null @@ -1,8 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// Copyright © 2020 xx network SEZC // -// // -// Use of this source code is governed by a license that can be found in the // -// LICENSE file // -/////////////////////////////////////////////////////////////////////////////// - -package main diff --git a/cmix/message/handler.go b/cmix/message/handler.go index 842337d656d146daf2629ce8abf0c35afdfa3ae1..6a5baf55486860b3d14d5d2960acaa861dc18ba0 100644 --- a/cmix/message/handler.go +++ b/cmix/message/handler.go @@ -182,15 +182,14 @@ func (h *handler) handleMessageHelper(ecrMsg format.Message, bundle Bundle) bool services, exists := h.get( identity.Source, ecrMsg.GetSIH(), ecrMsg.GetContents()) - if exists { + // If the id doesn't exist or there are no services for it, then + // we want messages to be reprocessed as garbled. + if exists && len(services) != 0 { for _, t := range services { jww.DEBUG.Printf("handleMessage service found: %s, %s", ecrMsg.Digest(), t) go t.Process(ecrMsg, identity, round) } - if len(services) == 0 { - jww.WARN.Printf("Empty service list for %s", ecrMsg.Digest()) - } return true } diff --git a/cmix/message/handler_test.go b/cmix/message/handler_test.go index b842ce1e4aa367e8c3fbafddd0e0a24da1cbca5b..99dfb9f199d0ea3ced7341e0ae7282e73930feaf 100644 --- a/cmix/message/handler_test.go +++ b/cmix/message/handler_test.go @@ -7,6 +7,9 @@ package message import ( + "testing" + "time" + "gitlab.com/elixxir/client/cmix/identity/receptionID" "gitlab.com/elixxir/client/cmix/rounds" "gitlab.com/elixxir/client/event" @@ -17,8 +20,6 @@ import ( "gitlab.com/elixxir/primitives/format" "gitlab.com/elixxir/primitives/states" "gitlab.com/xx_network/primitives/id" - "testing" - "time" ) type testProcessor struct { @@ -150,9 +151,16 @@ func Test_handler_handleMessageHelper_Service(t *testing.T) { contents := []byte{4, 4} lazyPreimage := sih.MakePreimage(contents, "test") + + s := Service{ + Identifier: nil, + Tag: "test", + lazyPreimage: &lazyPreimage, + } + ecrMsg := format.NewMessage(2056) ecrMsg.SetContents(contents) - ecrMsg.SetSIH(sih.Hash(lazyPreimage, ecrMsg.GetContents())) + ecrMsg.SetSIH(s.Hash(ecrMsg.GetContents())) testRound := rounds.Round{ Timestamps: make(map[states.Round]time.Time), @@ -166,12 +174,9 @@ func Test_handler_handleMessageHelper_Service(t *testing.T) { RoundInfo: testRound, } - s := Service{ - Identifier: nil, - Tag: "test", - lazyPreimage: &lazyPreimage, - } - m.AddService(testId, s, nil) + processor := &testProcessor{} + + m.AddService(testId, s, processor) result := m.handleMessageHelper(ecrMsg, bundle) if !result { t.Errorf("Expected handleMessage success!") diff --git a/cmix/message/inProgress.go b/cmix/message/inProgress.go index e5e9826a9c0dbba61e28401fac041e530146ade0..83cc22fe27041c352bdfb73545e7113a9e5adb38 100644 --- a/cmix/message/inProgress.go +++ b/cmix/message/inProgress.go @@ -29,6 +29,8 @@ import ( func (h *handler) CheckInProgressMessages() { select { case h.checkInProgress <- struct{}{}: + jww.DEBUG.Print("[Garbled] Sent signal to check garbled " + + "message queue...") default: jww.WARN.Print("Failed to check garbled messages due to full channel.") } @@ -54,16 +56,19 @@ func (h *handler) recheckInProgress() { // Try to decrypt every garbled message, excising those whose counts are too // high for grbldMsg, ri, identity, has := h.inProcess.Next(); has; grbldMsg, ri, identity, has = h.inProcess.Next() { + bundleMsgs := []format.Message{grbldMsg} bundle := Bundle{ Round: id.Round(ri.ID), RoundInfo: rounds.MakeRound(ri), - Messages: []format.Message{grbldMsg}, + Messages: bundleMsgs, Finish: func() {}, Identity: identity, } select { case h.messageReception <- bundle: + jww.INFO.Printf("[GARBLE] Sent %d messages to process", + len(bundleMsgs)) default: jww.WARN.Printf("Failed to send bundle, channel full.") } diff --git a/cmix/params.go b/cmix/params.go index d8aa778b104dadbdfa0e28215e00f0a10f5b6761..73ec67dd10f47bb5969164e8593687cac5cf0e16 100644 --- a/cmix/params.go +++ b/cmix/params.go @@ -222,7 +222,7 @@ type cMixParamsDisk struct { func GetDefaultCMIXParams() CMIXParams { return CMIXParams{ RoundTries: 10, - Timeout: 25 * time.Second, + Timeout: 45 * time.Second, RetryDelay: 1 * time.Second, SendTimeout: 3 * time.Second, DebugTag: DefaultDebugTag, diff --git a/cmix/rounds/round.go b/cmix/rounds/round.go index 93242bc30787277b900dc18a03c878c088534130..6f4f48183ca2c2f0eb0e473f4a91a752fa381b11 100644 --- a/cmix/rounds/round.go +++ b/cmix/rounds/round.go @@ -1,12 +1,14 @@ package rounds import ( + "fmt" + "time" + jww "github.com/spf13/jwalterweatherman" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/primitives/states" "gitlab.com/xx_network/comms/connect" "gitlab.com/xx_network/primitives/id" - "time" ) type Round struct { @@ -127,3 +129,9 @@ func (r Round) GetEndTimestamp() time.Time { // Unreachable return time.Time{} } + +// String prints a formatted version of the client error string +func (re *RoundError) String() string { + return fmt.Sprintf("ClientError(ClientID: %s, Err: %s)", + re.NodeID, re.Error) +} diff --git a/connect/authCallbacks.go b/connect/authCallbacks.go index cdf8b849fdf3b4065d3e19b62ec5191b79fbf48a..01eb5e90ff994f83d79e68a11a0285104307a6f4 100644 --- a/connect/authCallbacks.go +++ b/connect/authCallbacks.go @@ -27,7 +27,7 @@ type clientAuthCallback struct { // Used for building new Connection objects connectionE2e clientE2e.Handler - connectionParams Params + connectionParams xxdk.E2EParams authState auth.State } @@ -35,7 +35,7 @@ type clientAuthCallback struct { // of an auth.State object. // it will accept requests only if a request callback is passed in func getClientAuthCallback(confirm, request Callback, e2e clientE2e.Handler, - auth auth.State, params Params) *clientAuthCallback { + auth auth.State, params xxdk.E2EParams) *clientAuthCallback { return &clientAuthCallback{ confirmCallback: confirm, requestCallback: request, @@ -94,14 +94,14 @@ type serverAuthCallback struct { cl *ConnectionList // Used for building new Connection objects - connectionParams Params + connectionParams xxdk.E2EParams } // getServerAuthCallback returns a callback interface to be passed into the creation // of a xxdk.E2e object. // it will accept requests only if a request callback is passed in func getServerAuthCallback(confirm, request Callback, cl *ConnectionList, - params Params) *serverAuthCallback { + params xxdk.E2EParams) *serverAuthCallback { return &serverAuthCallback{ confirmCallback: confirm, requestCallback: request, @@ -117,12 +117,12 @@ func (a serverAuthCallback) Confirm(contact.Contact, // Request will be called when an auth Request message is processed. func (a serverAuthCallback) Request(requestor contact.Contact, - _ receptionID.EphemeralIdentity, _ rounds.Round, e2e *xxdk.E2e) { + _ receptionID.EphemeralIdentity, _ rounds.Round, messenger *xxdk.E2e) { if a.requestCallback == nil { jww.ERROR.Printf("Received a request when requests are" + "not enable, will not accept") } - _, err := e2e.GetAuth().Confirm(requestor) + _, err := messenger.GetAuth().Confirm(requestor) if err != nil { jww.ERROR.Printf("Unable to build connection with "+ "partner %s: %+v", requestor.ID, err) @@ -130,7 +130,7 @@ func (a serverAuthCallback) Request(requestor contact.Contact, a.requestCallback(nil) } // After confirmation, get the new partner - newPartner, err := e2e.GetE2E().GetPartner(requestor.ID) + newPartner, err := messenger.GetE2E().GetPartner(requestor.ID) if err != nil { jww.ERROR.Printf("Unable to build connection with "+ "partner %s: %+v", requestor.ID, err) @@ -142,7 +142,7 @@ func (a serverAuthCallback) Request(requestor contact.Contact, // Return the new Connection object c := BuildConnection( - newPartner, e2e.GetE2E(), e2e.GetAuth(), a.connectionParams) + newPartner, messenger.GetE2E(), messenger.GetAuth(), a.connectionParams) a.cl.Add(c) a.requestCallback(c) } diff --git a/connect/authenticated.go b/connect/authenticated.go index 926cd15435d61883896117c98a5c370860365c27..11f0d2de9d92cb2b42e34dab9618b61d48d77328 100644 --- a/connect/authenticated.go +++ b/connect/authenticated.go @@ -8,6 +8,9 @@ package connect import ( + "sync" + "time" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/catalog" @@ -19,8 +22,6 @@ import ( "gitlab.com/xx_network/crypto/signature/rsa" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" - "sync" - "time" ) // Constant error messages @@ -51,27 +52,27 @@ type AuthenticatedCallback func(connection AuthenticatedConnection) // ConnectWithAuthentication is called by the client, ie the one establishing // connection with the server. Once a connect.Connection has been established // with the server and then authenticate their identity to the server. -func ConnectWithAuthentication(recipient contact.Contact, e2eClient *xxdk.E2e, - p Params) (AuthenticatedConnection, error) { +func ConnectWithAuthentication(recipient contact.Contact, messenger *xxdk.E2e, + p xxdk.E2EParams) (AuthenticatedConnection, error) { // Track the time since we started to attempt to establish a connection timeStart := netTime.Now() // Establish a connection with the server - conn, err := Connect(recipient, e2eClient, p) + conn, err := Connect(recipient, messenger, p) if err != nil { return nil, errors.Errorf("failed to establish connection "+ "with recipient %s: %+v", recipient.ID, err) } // Build the authenticated connection and return - identity := e2eClient.GetReceptionIdentity() + identity := messenger.GetReceptionIdentity() privKey, err := identity.GetRSAPrivatePem() if err != nil { return nil, err } return connectWithAuthentication(conn, timeStart, recipient, identity.Salt, privKey, - e2eClient.GetRng(), e2eClient.GetCmix(), p) + messenger.GetRng(), messenger.GetCmix(), p) } // connectWithAuthentication builds and sends an IdentityAuthentication to @@ -80,7 +81,7 @@ func ConnectWithAuthentication(recipient contact.Contact, e2eClient *xxdk.E2e, func connectWithAuthentication(conn Connection, timeStart time.Time, recipient contact.Contact, salt []byte, myRsaPrivKey *rsa.PrivateKey, rng *fastRNG.StreamGenerator, - net cmix.Client, p Params) (AuthenticatedConnection, error) { + net cmix.Client, p xxdk.E2EParams) (AuthenticatedConnection, error) { // Construct message to prove your identity to the server payload, err := buildClientAuthRequest(conn.GetPartner(), rng, myRsaPrivKey, salt) @@ -133,7 +134,7 @@ func connectWithAuthentication(conn Connection, timeStart time.Time, }) // Find the remaining time in the timeout since we first sent the message - remainingTime := p.Timeout - netTime.Since(timeStart) + remainingTime := p.Base.Timeout - netTime.Since(timeStart) // Track the result of the round(s) we sent the // identity authentication message on @@ -174,7 +175,9 @@ func connectWithAuthentication(conn Connection, timeStart time.Time, // authenticate themselves. An established AuthenticatedConnection will // be passed via the callback. func StartAuthenticatedServer(identity xxdk.ReceptionIdentity, - cb AuthenticatedCallback, net *xxdk.Cmix, p Params) (*ConnectionServer, error) { + cb AuthenticatedCallback, net *xxdk.Cmix, p xxdk.E2EParams, + clParams ConnectionListParams) ( + *ConnectionServer, error) { // Register the waiter for a connection establishment connCb := Callback(func(connection Connection) { @@ -191,7 +194,7 @@ func StartAuthenticatedServer(identity xxdk.ReceptionIdentity, connection.GetPartner().PartnerId(), err) } }) - return StartServer(identity, connCb, net, p) + return StartServer(identity, connCb, net, p, clParams) } // authenticatedHandler provides an implementation for the diff --git a/connect/authenticated_test.go b/connect/authenticated_test.go index 5a8a3112fbe10e7672fae864d75f995dcb0c1c50..d4f5be3d2875ff0841ce91a6f81c4f5ef846c204 100644 --- a/connect/authenticated_test.go +++ b/connect/authenticated_test.go @@ -8,6 +8,11 @@ package connect import ( + "math/rand" + "testing" + "time" + + "gitlab.com/elixxir/client/xxdk" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/fastRNG" @@ -15,9 +20,6 @@ import ( "gitlab.com/xx_network/crypto/signature/rsa" "gitlab.com/xx_network/crypto/xx" "gitlab.com/xx_network/primitives/id" - "math/rand" - "testing" - "time" ) // TestConnectWithAuthentication will test the client/server relationship for @@ -77,8 +79,8 @@ func TestConnectWithAuthentication(t *testing.T) { }) // Initialize params with a shorter timeout to hasten test results - customParams := GetDefaultParams() - customParams.Timeout = 3 * time.Second + customParams := xxdk.GetDefaultE2EParams() + customParams.Base.Timeout = 3 * time.Second // Initialize the server serverHandler := buildAuthConfirmationHandler(serverCb, mockConn) @@ -96,7 +98,7 @@ func TestConnectWithAuthentication(t *testing.T) { } // Wait for the server to establish it's connection via the callback - timeout := time.NewTimer(customParams.Timeout) + timeout := time.NewTimer(customParams.Base.Timeout) select { case <-authConnChan: return diff --git a/connect/connect.go b/connect/connect.go index 0a6b9a7fc8b1d95125bf24ac9d0f9cfff245205e..f6aace42dcd2d3f5170fd4cc4ef7fd8c105ca1c0 100644 --- a/connect/connect.go +++ b/connect/connect.go @@ -7,15 +7,13 @@ package connect import ( - "encoding/json" - "gitlab.com/elixxir/client/e2e/rekey" - "gitlab.com/elixxir/client/event" - "gitlab.com/elixxir/client/xxdk" - "gitlab.com/xx_network/primitives/netTime" "io" "sync/atomic" "time" + "gitlab.com/elixxir/client/xxdk" + "gitlab.com/xx_network/primitives/netTime" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/auth" @@ -28,12 +26,6 @@ import ( "gitlab.com/xx_network/primitives/id" ) -const ( - // connectionTimeout is the time.Duration for a connection - // to be established before the requester times out. - connectionTimeout = 15 * time.Second -) - var alreadyClosedErr = errors.New("connection is closed") // Connection is a wrapper for the E2E and auth packages. @@ -85,55 +77,23 @@ type Connection interface { // new Connection objects as they are established. type Callback func(connection Connection) -// Params for managing Connection objects. -type Params struct { - Auth auth.Params - Rekey rekey.Params - Event event.Reporter `json:"-"` - List ConnectionListParams - Timeout time.Duration -} - -// GetDefaultParams returns a usable set of default Connection parameters. -func GetDefaultParams() Params { - return Params{ - Auth: auth.GetDefaultTemporaryParams(), - Rekey: rekey.GetDefaultEphemeralParams(), - Event: event.NewEventManager(), - List: DefaultConnectionListParams(), - Timeout: connectionTimeout, - } -} - -// GetParameters returns the default Params, or override with given -// parameters, if set. -func GetParameters(params string) (Params, error) { - p := GetDefaultParams() - if len(params) > 0 { - err := json.Unmarshal([]byte(params), &p) - if err != nil { - return Params{}, err - } - } - return p, nil -} - // Connect performs auth key negotiation with the given recipient, // and returns a Connection object for the newly-created partner.Manager // This function is to be used sender-side and will block until the // partner.Manager is confirmed. -func Connect(recipient contact.Contact, e2eClient *xxdk.E2e, - p Params) (Connection, error) { +func Connect(recipient contact.Contact, messenger *xxdk.E2e, + p xxdk.E2EParams) (Connection, error) { // Build callback for E2E negotiation signalChannel := make(chan Connection, 1) cb := func(connection Connection) { signalChannel <- connection } - callback := getClientAuthCallback(cb, nil, e2eClient.GetE2E(), e2eClient.GetAuth(), p) - e2eClient.GetAuth().AddPartnerCallback(recipient.ID, callback) + callback := getClientAuthCallback(cb, nil, messenger.GetE2E(), + messenger.GetAuth(), p) + messenger.GetAuth().AddPartnerCallback(recipient.ID, callback) // Perform the auth request - _, err := e2eClient.GetAuth().Request(recipient, nil) + _, err := messenger.GetAuth().Request(recipient, nil) if err != nil { return nil, err } @@ -141,7 +101,7 @@ func Connect(recipient contact.Contact, e2eClient *xxdk.E2e, // Block waiting for auth to confirm jww.DEBUG.Printf("Connection waiting for auth request "+ "for %s to be confirmed...", recipient.ID.String()) - timeout := time.NewTimer(p.Timeout) + timeout := time.NewTimer(p.Base.Timeout) defer timeout.Stop() select { case newConnection := <-signalChannel: @@ -167,20 +127,20 @@ func Connect(recipient contact.Contact, e2eClient *xxdk.E2e, // no requests are missed. // This call does an xxDK.ephemeralLogin under the hood and the connection // server must be the only listener on auth. -func StartServer(identity xxdk.ReceptionIdentity, cb Callback, net *xxdk.Cmix, - p Params) (*ConnectionServer, error) { +func StartServer(identity xxdk.ReceptionIdentity, connectionCallback Callback, + net *xxdk.Cmix, params xxdk.E2EParams, clParams ConnectionListParams) (*ConnectionServer, error) { // Create connection list and start cleanup thread - cl := NewConnectionList(p.List) + cl := NewConnectionList(clParams) err := net.AddService(cl.CleanupThread) if err != nil { return nil, err } // Build callback for E2E negotiation - callback := getServerAuthCallback(nil, cb, cl, p) + callback := getServerAuthCallback(nil, connectionCallback, cl, params) - e2eClient, err := xxdk.LoginEphemeral(net, callback, identity) + e2eClient, err := xxdk.LoginEphemeral(net, callback, identity, params) if err != nil { return nil, err } @@ -191,8 +151,8 @@ func StartServer(identity xxdk.ReceptionIdentity, cb Callback, net *xxdk.Cmix, // ConnectionServer contains type ConnectionServer struct { - E2e *xxdk.E2e - Cl *ConnectionList + Messenger *xxdk.E2e + Cl *ConnectionList } // handler provides an implementation for the Connection interface. @@ -200,21 +160,20 @@ type handler struct { auth auth.State partner partner.Manager e2e clientE2e.Handler + params xxdk.E2EParams // Timestamp of last time a message was sent or received (Unix nanoseconds) lastUse *int64 // Indicates if the connection has been closed (0 = open, 1 = closed) closed *uint32 - - params Params } // BuildConnection assembles a Connection object // after an E2E partnership has already been confirmed with the given // partner.Manager. func BuildConnection(partner partner.Manager, e2eHandler clientE2e.Handler, - auth auth.State, p Params) Connection { + auth auth.State, p xxdk.E2EParams) Connection { lastUse := netTime.Now().UnixNano() closed := uint32(0) return &handler{ diff --git a/connect/params_test.go b/connect/params_test.go index 5501ad55153af983a72df2b0ab4d1e8b64358628..98bb5e2953b5ec570639c0601e78924b7e39c6ec 100644 --- a/connect/params_test.go +++ b/connect/params_test.go @@ -11,11 +11,13 @@ import ( "bytes" "encoding/json" "testing" + + "gitlab.com/elixxir/client/xxdk" ) func TestParams_MarshalUnmarshal(t *testing.T) { // Construct a set of params - p := GetDefaultParams() + p := xxdk.GetDefaultE2EParams() // Marshal the params data, err := json.Marshal(&p) @@ -26,7 +28,7 @@ func TestParams_MarshalUnmarshal(t *testing.T) { t.Logf("%s", string(data)) // Unmarshal the params object - received := Params{} + received := xxdk.E2EParams{} err = json.Unmarshal(data, &received) if err != nil { t.Fatalf("Unmarshal error: %v", err) diff --git a/dummy/manager.go b/dummy/manager.go index 28ddd25e69c7e40bd2ee8a31a4b84d16ac9a7f5a..4832f3ef505ea37114c2f4d202c82604ddd7eab0 100644 --- a/dummy/manager.go +++ b/dummy/manager.go @@ -57,25 +57,25 @@ type Manager struct { statusChan chan bool // Cmix interfaces - client *xxdk.Cmix - store *storage.Session - net interfaces.NetworkManager - rng *fastRNG.StreamGenerator + net *xxdk.Cmix + store *storage.Session + networkManager interfaces.NetworkManager + rng *fastRNG.StreamGenerator } // NewManager creates a new dummy Manager with the specified average send delta // and the range used for generating random durations. func NewManager(maxNumMessages int, avgSendDelta, randomRange time.Duration, - client *xxdk.Cmix, manager interfaces.NetworkManager) *Manager { - clientStorage := client.GetStorage() - return newManager(maxNumMessages, avgSendDelta, randomRange, client, - &clientStorage, manager, client.GetRng()) + net *xxdk.Cmix, manager interfaces.NetworkManager) *Manager { + clientStorage := net.GetStorage() + return newManager(maxNumMessages, avgSendDelta, randomRange, net, + &clientStorage, manager, net.GetRng()) } // newManager builds a new dummy Manager from fields explicitly passed in. This // function is a helper function for NewManager to make it easier to test. func newManager(maxNumMessages int, avgSendDelta, randomRange time.Duration, - client *xxdk.Cmix, store *storage.Session, net interfaces.NetworkManager, + net *xxdk.Cmix, store *storage.Session, networkManager interfaces.NetworkManager, rng *fastRNG.StreamGenerator) *Manager { return &Manager{ maxNumMessages: maxNumMessages, @@ -83,9 +83,9 @@ func newManager(maxNumMessages int, avgSendDelta, randomRange time.Duration, randomRange: randomRange, status: notStarted, statusChan: make(chan bool, statusChanLen), - client: client, - store: store, net: net, + store: store, + networkManager: networkManager, rng: rng, } } diff --git a/dummy/manager_test.go b/dummy/manager_test.go index 753b0fcb215855f960a5517305c430b0207e9776..6a49bcc6a597ebf476ee8bbfb8f45a79045a4488 100644 --- a/dummy/manager_test.go +++ b/dummy/manager_test.go @@ -59,7 +59,7 @@ func TestManager_StartDummyTraffic(t *testing.T) { msgChan := make(chan bool) go func() { - for m.net.(*testNetworkManager).GetMsgListLen() == 0 { + for m.networkManager.(*testNetworkManager).GetMsgListLen() == 0 { time.Sleep(5 * time.Millisecond) } msgChan <- true @@ -71,7 +71,7 @@ func TestManager_StartDummyTraffic(t *testing.T) { t.Errorf("Timed out after %s waiting for messages to be sent.", 3*m.avgSendDelta) case <-msgChan: - numReceived += m.net.(*testNetworkManager).GetMsgListLen() + numReceived += m.networkManager.(*testNetworkManager).GetMsgListLen() } err = stop.Close() @@ -86,7 +86,7 @@ func TestManager_StartDummyTraffic(t *testing.T) { msgChan = make(chan bool) go func() { - for m.net.(*testNetworkManager).GetMsgListLen() == numReceived { + for m.networkManager.(*testNetworkManager).GetMsgListLen() == numReceived { time.Sleep(5 * time.Millisecond) } msgChan <- true @@ -118,10 +118,10 @@ func TestManager_SetStatus(t *testing.T) { go func() { var numReceived int for i := 0; i < 2; i++ { - for m.net.(*testNetworkManager).GetMsgListLen() == numReceived { + for m.networkManager.(*testNetworkManager).GetMsgListLen() == numReceived { time.Sleep(5 * time.Millisecond) } - numReceived = m.net.(*testNetworkManager).GetMsgListLen() + numReceived = m.networkManager.(*testNetworkManager).GetMsgListLen() msgChan <- true } }() @@ -161,7 +161,7 @@ func TestManager_SetStatus(t *testing.T) { t.Errorf("Timed out after %s waiting for messages to be sent.", 3*m.avgSendDelta) case <-msgChan: - numReceived += m.net.(*testNetworkManager).GetMsgListLen() + numReceived += m.networkManager.(*testNetworkManager).GetMsgListLen() } // Setting status to true multiple times does not interrupt sending @@ -177,10 +177,10 @@ func TestManager_SetStatus(t *testing.T) { t.Errorf("Timed out after %s waiting for messages to be sent.", 3*m.avgSendDelta) case <-msgChan: - if m.net.(*testNetworkManager).GetMsgListLen() <= numReceived { + if m.networkManager.(*testNetworkManager).GetMsgListLen() <= numReceived { t.Errorf("Failed to receive second send."+ "\nmessages on last receive: %d\nmessages on this receive: %d", - numReceived, m.net.(*testNetworkManager).GetMsgListLen()) + numReceived, m.networkManager.(*testNetworkManager).GetMsgListLen()) } } @@ -254,10 +254,10 @@ func TestManager_GetStatus(t *testing.T) { go func() { var numReceived int for i := 0; i < 2; i++ { - for m.net.(*testNetworkManager).GetMsgListLen() == numReceived { + for m.networkManager.(*testNetworkManager).GetMsgListLen() == numReceived { time.Sleep(5 * time.Millisecond) } - numReceived = m.net.(*testNetworkManager).GetMsgListLen() + numReceived = m.networkManager.(*testNetworkManager).GetMsgListLen() msgChan <- true } }() @@ -292,7 +292,7 @@ func TestManager_GetStatus(t *testing.T) { t.Errorf("Timed out after %s waiting for messages to be sent.", 3*m.avgSendDelta) case <-msgChan: - numReceived += m.net.(*testNetworkManager).GetMsgListLen() + numReceived += m.networkManager.(*testNetworkManager).GetMsgListLen() } // Setting status to true multiple times does not interrupt sending @@ -311,10 +311,10 @@ func TestManager_GetStatus(t *testing.T) { t.Errorf("Timed out after %s waiting for messages to be sent.", 3*m.avgSendDelta) case <-msgChan: - if m.net.(*testNetworkManager).GetMsgListLen() <= numReceived { + if m.networkManager.(*testNetworkManager).GetMsgListLen() <= numReceived { t.Errorf("Failed to receive second send."+ "\nmessages on last receive: %d\nmessages on this receive: %d", - numReceived, m.net.(*testNetworkManager).GetMsgListLen()) + numReceived, m.networkManager.(*testNetworkManager).GetMsgListLen()) } } diff --git a/dummy/send.go b/dummy/send.go index f6f532c81557a3c440a1296a8c60f2f114146f73..84271b67ea4310bf91af057a58ffe2256520460a 100644 --- a/dummy/send.go +++ b/dummy/send.go @@ -106,7 +106,7 @@ func (m *Manager) sendMessages(msgs map[id.ID]format.Message) error { // } // rng.Close() // p.DebugTag = "dummy" - _, _, err := m.net.SendCMIX(msg, &recipient, p) + _, _, err := m.networkManager.SendCMIX(msg, &recipient, p) if err != nil { jww.WARN.Printf("Failed to send dummy message %d/%d via "+ "Send: %+v", i, len(msgs), err) diff --git a/dummy/send_test.go b/dummy/send_test.go index 6a5a91feff0c152b70982e60e769aae53c37813e..9af8ee8796e4d76faa7d45188c60db271d772335 100644 --- a/dummy/send_test.go +++ b/dummy/send_test.go @@ -40,10 +40,10 @@ func TestManager_sendThread(t *testing.T) { go func() { var numReceived int for i := 0; i < 2; i++ { - for m.net.(*testNetworkManager).GetMsgListLen() == numReceived { + for m.networkManager.(*testNetworkManager).GetMsgListLen() == numReceived { time.Sleep(5 * time.Millisecond) } - numReceived = m.net.(*testNetworkManager).GetMsgListLen() + numReceived = m.networkManager.(*testNetworkManager).GetMsgListLen() msgChan <- true } }() @@ -54,7 +54,7 @@ func TestManager_sendThread(t *testing.T) { t.Errorf("Timed out after %s waiting for messages to be sent.", 3*m.avgSendDelta) case <-msgChan: - numReceived += m.net.(*testNetworkManager).GetMsgListLen() + numReceived += m.networkManager.(*testNetworkManager).GetMsgListLen() } select { @@ -62,10 +62,10 @@ func TestManager_sendThread(t *testing.T) { t.Errorf("Timed out after %s waiting for messages to be sent.", 3*m.avgSendDelta) case <-msgChan: - if m.net.(*testNetworkManager).GetMsgListLen() <= numReceived { + if m.networkManager.(*testNetworkManager).GetMsgListLen() <= numReceived { t.Errorf("Failed to receive second send."+ "\nmessages on last receive: %d\nmessages on this receive: %d", - numReceived, m.net.(*testNetworkManager).GetMsgListLen()) + numReceived, m.networkManager.(*testNetworkManager).GetMsgListLen()) } } @@ -115,7 +115,7 @@ func TestManager_sendMessages(t *testing.T) { } // get sent messages - receivedMsgs := m.net.(*testNetworkManager).GetMsgList() + receivedMsgs := m.networkManager.(*testNetworkManager).GetMsgList() // Test that all messages were received if len(receivedMsgs) != len(msgs) { diff --git a/dummy/utils_test.go b/dummy/utils_test.go index cbc441c22d732469ecc77f145c8de9796c6adee7..bc838731f5f42b345c4fbdfd849750b4551c0ef5 100644 --- a/dummy/utils_test.go +++ b/dummy/utils_test.go @@ -59,7 +59,7 @@ func newTestManager(maxNumMessages int, avgSendDelta, randomRange time.Duration, randomRange: randomRange, statusChan: make(chan bool, statusChanLen), store: &store, - net: newTestNetworkManager(sendErr, t), + networkManager: newTestNetworkManager(sendErr, t), rng: fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG), } diff --git a/e2e/manager.go b/e2e/manager.go index 6d4102ebba81c19ee4ddce1bb7cf65ad8e3b7ecf..00630b7467ad57d1eb21a653b6a3315061f79c24 100644 --- a/e2e/manager.go +++ b/e2e/manager.go @@ -2,9 +2,10 @@ package e2e import ( "encoding/json" - "strings" "time" + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/xx_network/primitives/netTime" "github.com/pkg/errors" @@ -38,6 +39,7 @@ type manager struct { kv *versioned.KV } +const legacyE2EKey = "legacyE2ESystem" const e2eRekeyParamsKey = "e2eRekeyParams" const e2eRekeyParamsVer = 0 @@ -46,6 +48,7 @@ const e2eRekeyParamsVer = 0 // uses the passed ID to modify the kv prefix for a unique storage path func Init(kv *versioned.KV, myID *id.ID, privKey *cyclic.Int, grp *cyclic.Group, rekeyParams rekey.Params) error { + jww.INFO.Printf("Initializing new e2e.Handler for %s", myID.String()) kv = kv.Prefix(makeE2ePrefix(myID)) return initE2E(kv, myID, privKey, grp, rekeyParams) } @@ -100,9 +103,12 @@ func LoadLegacy(kv *versioned.KV, net cmix.Client, myID *id.ID, // Check if values are already written. If they exist on disk/memory already, // this would be a case where LoadLegacy is most likely not the correct // code-path the caller should be following. - if _, err := kv.Get(e2eRekeyParamsKey, e2eRekeyParamsVer); err != nil && !strings.Contains(err.Error(), "object not found") { - return nil, errors.New("E2E rekey params are already on disk, " + - "LoadLegacy should not be called") + if _, err := kv.Get(e2eRekeyParamsKey, e2eRekeyParamsVer); err == nil { + if _, err = kv.Get(legacyE2EKey, e2eRekeyParamsVer); err != nil { + return nil, errors.New("E2E rekey params" + + " are already on disk, " + + "LoadLegacy should not be called") + } } // Store the rekey params to disk/memory @@ -111,6 +117,17 @@ func LoadLegacy(kv *versioned.KV, net cmix.Client, myID *id.ID, Timestamp: netTime.Now(), Data: rekeyParamsData, }) + if err != nil { + return nil, err + } + err = kv.Set(legacyE2EKey, e2eRekeyParamsVer, &versioned.Object{ + Version: e2eRekeyParamsVer, + Timestamp: netTime.Now(), + Data: []byte{1}, + }) + if err != nil { + return nil, err + } // Load the legacy data return loadE2E(kv, net, myID, grp, rng, events) @@ -173,12 +190,13 @@ func (m *manager) StartProcesses() (stoppable.Stoppable, error) { recipient *id.ID, payload []byte, cmixParams cmix.CMIXParams) ( []id.Round, e2e.MessageID, time.Time, error) { + // FIXME: we should have access to the e2e params here... par := GetDefaultParams() par.CMIXParams = cmixParams return m.SendE2E(mt, recipient, payload, par) } rekeyStopper, err := rekey.Start(m.Switchboard, m.Ratchet, - rekeySendFunc, m.net, m.grp, rekey.GetDefaultParams()) + rekeySendFunc, m.net, m.grp, m.rekeyParams) if err != nil { return nil, err } diff --git a/e2e/processor.go b/e2e/processor.go index 1b6620149005c12ad456fc3b3b34ead31890a240..17e2293401209f84783f4855182f607cc8f6bd0e 100644 --- a/e2e/processor.go +++ b/e2e/processor.go @@ -2,6 +2,7 @@ package e2e import ( "fmt" + "gitlab.com/elixxir/client/e2e/ratchet/partner/session" jww "github.com/spf13/jwalterweatherman" @@ -18,6 +19,7 @@ type processor struct { func (p *processor) Process(ecrMsg format.Message, receptionID receptionID.EphemeralIdentity, round rounds.Round) { + jww.TRACE.Printf("[E2E] Process(ecrMsgDigest: %s)", ecrMsg.Digest()) // ensure the key will be marked used before returning defer p.cy.Use() diff --git a/e2e/ratchet/partner/relationship.go b/e2e/ratchet/partner/relationship.go index ff321d04becdce2e4ddeb9f18d520174b40f1b5c..bd6f60ccef05edaaa526a01288b7905f4e351829 100644 --- a/e2e/ratchet/partner/relationship.go +++ b/e2e/ratchet/partner/relationship.go @@ -273,8 +273,8 @@ func (r *relationship) getSessionForSending() *session.Session { for _, s := range sessions { status := s.Status() confirmed := s.IsConfirmed() - jww.TRACE.Printf("[REKEY] Session Status/Confirmed: %v, %v", - status, confirmed) + jww.TRACE.Printf("[REKEY] Session Status/Confirmed: (%v, %s), %v", + status, s.NegotiationStatus(), confirmed) if status == session.Active && confirmed { //always return the first confirmed active, happy path return s diff --git a/e2e/ratchet/partner/relationshipFingerprint.go b/e2e/ratchet/partner/relationshipFingerprint.go index e00f6aa69638830752b079332e63f0f6bb68755f..9380b9a5051e9d82f76d3043e880350600425d6b 100644 --- a/e2e/ratchet/partner/relationshipFingerprint.go +++ b/e2e/ratchet/partner/relationshipFingerprint.go @@ -12,6 +12,7 @@ import ( session2 "gitlab.com/elixxir/client/e2e/ratchet/partner/session" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" + "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/e2e" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" @@ -20,7 +21,7 @@ import ( func makeRelationshipFingerprint(t session2.RelationshipType, grp *cyclic.Group, myPrivKey, partnerPubKey *cyclic.Int, me, partner *id.ID) []byte { - myPubKey := grp.ExpG(myPrivKey, grp.NewIntFromUInt(1)) + myPubKey := diffieHellman.GeneratePublicKey(myPrivKey, grp) switch t { case session2.Send: diff --git a/e2e/ratchet/partner/session/session.go b/e2e/ratchet/partner/session/session.go index 58d1ca8ac4ca71d2adbc3f0eaf554e1507dfee0c..d0ee6ca19b1e233699ca6d7869e7e88420046b19 100644 --- a/e2e/ratchet/partner/session/session.go +++ b/e2e/ratchet/partner/session/session.go @@ -11,6 +11,11 @@ import ( "encoding/binary" "encoding/json" "fmt" + "math" + "math/big" + "sync" + "testing" + "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" @@ -23,10 +28,6 @@ import ( "gitlab.com/xx_network/crypto/randomness" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" - "math" - "math/big" - "sync" - "testing" ) const currentSessionVersion = 0 diff --git a/e2e/ratchet/ratchet.go b/e2e/ratchet/ratchet.go index 1a272b9a942c63d6fe88a492040eda68da19180c..aa5fd2c185cec46568655fc9a765850a04715dfa 100644 --- a/e2e/ratchet/ratchet.go +++ b/e2e/ratchet/ratchet.go @@ -139,6 +139,7 @@ func (r *Ratchet) GetPartner(partnerID *id.ID) (partner.Manager, error) { m, ok := r.managers[*partnerID] if !ok { + jww.WARN.Printf("%s: %s", NoPartnerErrorStr, partnerID) return nil, errors.New(NoPartnerErrorStr) } @@ -149,6 +150,7 @@ func (r *Ratchet) GetPartner(partnerID *id.ID) (partner.Manager, error) { func (r *Ratchet) DeletePartner(partnerID *id.ID) error { m, ok := r.managers[*partnerID] if !ok { + jww.WARN.Printf("%s: %s", NoPartnerErrorStr, partnerID) return errors.New(NoPartnerErrorStr) } diff --git a/e2e/receive/switchboard.go b/e2e/receive/switchboard.go index 3bb5e23cfae466cad43a4a2ca665a079caa48413..3f6122df73beeafd49129e1ab0d859e32e3a8ea5 100644 --- a/e2e/receive/switchboard.go +++ b/e2e/receive/switchboard.go @@ -8,11 +8,12 @@ package receive import ( + "sync" + "github.com/golang-collections/collections/set" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/catalog" "gitlab.com/xx_network/primitives/id" - "sync" ) type Switchboard struct { @@ -142,6 +143,9 @@ func (sw *Switchboard) Speak(item Message) { // well as those that do not care about certain criteria matches := sw.matchListeners(item) + jww.TRACE.Printf("[E2E] Switchboard.Speak(SenderID: %s, MsgType: %s)", + item.Sender, item.MessageType) + //Execute hear on all matched listeners in a new goroutine matches.Do(func(i interface{}) { lid := i.(ListenerID) diff --git a/e2e/rekey/confirm.go b/e2e/rekey/confirm.go index b6ae0a6ddaec07fa19dab7b8e86a0d374ad27b50..449aefddbbd2bd3723545ad03c1df5f9424757f9 100644 --- a/e2e/rekey/confirm.go +++ b/e2e/rekey/confirm.go @@ -32,6 +32,9 @@ func startConfirm(ratchet *ratchet.Ratchet, c chan receive.Message, } func handleConfirm(ratchet *ratchet.Ratchet, confirmation receive.Message) { + jww.DEBUG.Printf("[REKEY] handleConfirm(partner: %s)", + confirmation.Sender) + //ensure the message was encrypted properly if !confirmation.Encrypted { jww.ERROR.Printf( diff --git a/e2e/rekey/rekey.go b/e2e/rekey/rekey.go index 8de7ef2daff692cc41914f67c3d8ea7974bb84c9..960df918f20e3aee3e87a77ac4959668fc5db87c 100644 --- a/e2e/rekey/rekey.go +++ b/e2e/rekey/rekey.go @@ -96,6 +96,8 @@ func trigger(instance *commsNetwork.Instance, grp *cyclic.Group, sendE2E E2eSend func negotiate(instance *commsNetwork.Instance, grp *cyclic.Group, sendE2E E2eSender, param Params, sess *session.Session, sendTimeout time.Duration) error { + // Note: All new sending sessions are set to "Sending" status by default + //generate public key pubKey := diffieHellman.GeneratePublicKey(sess.GetMyPrivKey(), grp) diff --git a/e2e/rekey/trigger.go b/e2e/rekey/trigger.go index c44fba7ff728fc81a8cfeeccc46eae85ea3a8974..80d2cd2b62a8a1840e8605aa79bc7d4e501cbb2d 100644 --- a/e2e/rekey/trigger.go +++ b/e2e/rekey/trigger.go @@ -53,6 +53,10 @@ func startTrigger(ratchet *ratchet.Ratchet, sender E2eSender, net cmix.Client, func handleTrigger(ratchet *ratchet.Ratchet, sender E2eSender, net cmix.Client, grp *cyclic.Group, request receive.Message, param Params, stop *stoppable.Single) error { + + jww.DEBUG.Printf("[REKEY] handleTrigger(partner: %s)", + request.Sender) + //ensure the message was encrypted properly if !request.Encrypted { errMsg := fmt.Sprintf(errBadTrigger, request.Sender) @@ -105,9 +109,12 @@ func handleTrigger(ratchet *ratchet.Ratchet, sender E2eSender, } //Send the Confirmation Message - //build the payload + // build the payload, note that for confirmations, we need only send the + // (generated from new keys) session id, which the other side should + // know about already. + // When sending a trigger, the source session id is sent instead payload, err := proto.Marshal(&RekeyConfirm{ - SessionID: sess.GetSource().Marshal(), + SessionID: sess.GetID().Marshal(), }) //If the payload cannot be marshaled, panic @@ -116,7 +123,7 @@ func handleTrigger(ratchet *ratchet.Ratchet, sender E2eSender, "Negotation Confirmation with %s", sess.GetPartner()) } - //send the trigger + //send the trigger confirmation params := cmix.GetDefaultCMIXParams() params.Critical = true //ignore results, the passed sender interface makes it a critical message diff --git a/e2e/sendE2E.go b/e2e/sendE2E.go index 65cf98cdf63105298daebbc8eede2b21dc6e3d17..159f7c8451ca997d3924803f01bb30eb4355d0f1 100644 --- a/e2e/sendE2E.go +++ b/e2e/sendE2E.go @@ -81,7 +81,7 @@ func (m *manager) sendE2E(mt catalog.MessageType, recipient *id.ID, rekeySendFunc := func(mt catalog.MessageType, recipient *id.ID, payload []byte, cmixParams cmix.CMIXParams) ( []id.Round, e2e.MessageID, time.Time, error) { - par := GetDefaultParams() + par := params par.CMIXParams = cmixParams return m.SendE2E(mt, recipient, payload, par) } diff --git a/go.mod b/go.mod index f1594495c9516fd0d6a4586c377e8810f976a8bb..c30177adab05391441f4195854120bf150d307ba 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( gitlab.com/elixxir/primitives v0.0.3-0.20220606195757-40f7a589347f gitlab.com/xx_network/comms v0.0.4-0.20220630163702-f3d372ef6acd gitlab.com/xx_network/crypto v0.0.5-0.20220606200528-3f886fe49e81 - gitlab.com/xx_network/primitives v0.0.4-0.20220630163313-7890038258c6 + gitlab.com/xx_network/primitives v0.0.4-0.20220712193914-aebd8544396e go.uber.org/ratelimit v0.2.0 golang.org/x/crypto v0.0.0-20220128200615-198e4374d7ed golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 diff --git a/go.sum b/go.sum index 8d1e3fc2d22efad52720f2a922b18426b5ced73f..e8adcd01305845b6db74898bb27221cf3bf81cbf 100644 --- a/go.sum +++ b/go.sum @@ -307,8 +307,9 @@ gitlab.com/xx_network/primitives v0.0.2/go.mod h1:cs0QlFpdMDI6lAo61lDRH2JZz+3aVk gitlab.com/xx_network/primitives v0.0.4-0.20220222211843-901fa4a2d72b/go.mod h1:9imZHvYwNFobxueSvVtHneZLk9wTK7HQTzxPm+zhFhE= gitlab.com/xx_network/primitives v0.0.4-0.20220317172007-4d2a53e6e669/go.mod h1:AXVVFt7dDAeIUpOGPiStCcUIKsBXLWbmV/BgZ4T+tOo= gitlab.com/xx_network/primitives v0.0.4-0.20220324193139-b292d1ae6e7e/go.mod h1:AXVVFt7dDAeIUpOGPiStCcUIKsBXLWbmV/BgZ4T+tOo= -gitlab.com/xx_network/primitives v0.0.4-0.20220630163313-7890038258c6 h1:3It6ILDHn/9J/Oi7MfMjkidKPe7vbFCy5JQtXx8EfYM= gitlab.com/xx_network/primitives v0.0.4-0.20220630163313-7890038258c6/go.mod h1:AXVVFt7dDAeIUpOGPiStCcUIKsBXLWbmV/BgZ4T+tOo= +gitlab.com/xx_network/primitives v0.0.4-0.20220712193914-aebd8544396e h1:zRRo/v3KUo3MtpjNJaB03LR+Zi2g1afYF8yKWl1t19o= +gitlab.com/xx_network/primitives v0.0.4-0.20220712193914-aebd8544396e/go.mod h1:AXVVFt7dDAeIUpOGPiStCcUIKsBXLWbmV/BgZ4T+tOo= gitlab.com/xx_network/ring v0.0.3-0.20220222211904-da613960ad93 h1:eJZrXqHsMmmejEPWw8gNAt0I8CGAMNO/7C339Zco3TM= gitlab.com/xx_network/ring v0.0.3-0.20220222211904-da613960ad93/go.mod h1:aLzpP2TiZTQut/PVHR40EJAomzugDdHXetbieRClXIM= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= diff --git a/restlike/connect/server.go b/restlike/connect/server.go index d2a22dad5d3a46dbd63af11dbf5f2eb937a080da..7438b41d7ffaa5edb99e7d3f99913a0250921ee9 100644 --- a/restlike/connect/server.go +++ b/restlike/connect/server.go @@ -16,14 +16,16 @@ import ( // Server implements the RestServer interface using connect.Connection type Server struct { - receptionId *id.ID - endpoints *restlike.Endpoints + receptionId *id.ID + endpoints *restlike.Endpoints + ConnectServer *connect.ConnectionServer } // NewServer builds a RestServer with connect.Connection and // the provided arguments, then registers necessary external services func NewServer(identity xxdk.ReceptionIdentity, net *xxdk.Cmix, - p connect.Params) (*Server, error) { + p xxdk.E2EParams, clParams connect.ConnectionListParams) (*Server, error) { + var err error newServer := &Server{ receptionId: identity.ID, endpoints: restlike.NewEndpoints(), @@ -36,7 +38,7 @@ func NewServer(identity xxdk.ReceptionIdentity, net *xxdk.Cmix, } // Build the connection listener - _, err := connect.StartServer(identity, cb, net, p) + newServer.ConnectServer, err = connect.StartServer(identity, cb, net, p, clParams) if err != nil { return nil, err } diff --git a/single/request.go b/single/request.go index 1a49628653915c373fb6d7b59e632a7375eebfbc..08e78c6effd39046fada90042fd04efd8472855a 100644 --- a/single/request.go +++ b/single/request.go @@ -11,6 +11,7 @@ import ( "gitlab.com/elixxir/client/single/message" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" + "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/e2e/auth" "gitlab.com/elixxir/crypto/e2e/singleUse" "gitlab.com/xx_network/crypto/csprng" @@ -271,7 +272,7 @@ func generateDhKeys(grp *cyclic.Group, dhPubKey *cyclic.Int, rng io.Reader) ( privKey := grp.NewIntFromBytes(privKeyBytes) // Generate public key and DH key - publicKey = grp.ExpG(privKey, grp.NewInt(1)) + publicKey = diffieHellman.GeneratePublicKey(privKey, grp) dhKey = grp.Exp(dhPubKey, privKey, grp.NewInt(1)) return dhKey, publicKey, nil diff --git a/storage/session.go b/storage/session.go index 89836d53ebf70a88a006e007e76c940927f7c9b1..d181f07428b1178b83a7b0121c980882c79d1c37 100644 --- a/storage/session.go +++ b/storage/session.go @@ -10,10 +10,13 @@ package storage import ( + "math/rand" "sync" "testing" "time" + "gitlab.com/elixxir/crypto/diffieHellman" + "gitlab.com/elixxir/client/storage/utility" "gitlab.com/xx_network/crypto/large" @@ -30,13 +33,14 @@ import ( "gitlab.com/xx_network/primitives/ndf" ) -// Number of rounds to store in the CheckedRound buffer -const CheckRoundsMaxSize = 1000000 / 64 const currentSessionVersion = 0 -const cmixGroupKey = "cmixGroup" -const e2eGroupKey = "e2eGroup" -// Session object, backed by encrypted filestore +// NOTE: These are set this way for legacy purposes. If you want to change them +// you will need to set up and upgrade path for old session files +const cmixGroupKey = "cmix/GroupKey" +const e2eGroupKey = "e2eSession/Group" + +// Session object, backed by encrypted versioned.KVc type Session interface { GetClientVersion() version.Version Get(key string) (*versioned.Object, error) @@ -86,7 +90,7 @@ type session struct { clientVersion *clientVersion.Store } -// Initialize a new Session object +// initStore initializes a new Session object func initStore(baseDir, password string) (*session, error) { fs, err := ekv.NewFilestore(baseDir, password) var s *session @@ -102,7 +106,7 @@ func initStore(baseDir, password string) (*session, error) { return s, nil } -// Creates new UserData in the session +// New UserData in the session func New(baseDir, password string, u user.Info, currentVersion version.Version, cmixGrp, e2eGrp *cyclic.Group) (Session, error) { @@ -119,7 +123,7 @@ func New(baseDir, password string, u user.Info, } s.User, err = user.NewUser(s.kv, u.TransmissionID, u.ReceptionID, u.TransmissionSalt, - u.ReceptionSalt, u.TransmissionRSA, u.ReceptionRSA, u.Precanned) + u.ReceptionSalt, u.TransmissionRSA, u.ReceptionRSA, u.Precanned, u.E2eDhPrivateKey, u.E2eDhPublicKey) if err != nil { return nil, errors.WithMessage(err, "Failed to create user") } @@ -139,7 +143,7 @@ func New(baseDir, password string, u user.Info, return s, nil } -// Loads existing user data into the session +// Load existing user data into the session func Load(baseDir, password string, currentVersion version.Version) (Session, error) { s, err := initStore(baseDir, password) @@ -196,7 +200,7 @@ func (s *session) Set(key string, object *versioned.Object) error { return s.kv.Set(key, currentSessionVersion, object) } -// delete a value in the session +// Delete a value in the session func (s *session) Delete(key string) error { return s.kv.Delete(key, currentSessionVersion) } @@ -206,17 +210,17 @@ func (s *session) GetKV() *versioned.KV { return s.kv } -// GetCmixGrouo returns cMix Group +// GetCmixGroup returns cMix Group func (s *session) GetCmixGroup() *cyclic.Group { return s.cmixGroup } -// GetE2EGrouo returns cMix Group +// GetE2EGroup returns cMix Group func (s *session) GetE2EGroup() *cyclic.Group { return s.e2eGroup } -// Initializes a Session object wrapped around a MemStore object. +// InitTestingSession object wrapped around a MemStore object. // FOR TESTING ONLY func InitTestingSession(i interface{}) Session { switch i.(type) { @@ -230,7 +234,14 @@ func InitTestingSession(i interface{}) Session { kv := versioned.NewKV(ekv.MakeMemstore()) s := &session{kv: kv} uid := id.NewIdFromString("zezima", id.User, i) - u, err := user.NewUser(kv, uid, uid, []byte("salt"), []byte("salt"), privKey, privKey, false) + + prng := rand.New(rand.NewSource(42)) + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + u, err := user.NewUser(kv, uid, uid, []byte("salt"), []byte("salt"), privKey, privKey, false, dhPrivKey, dhPubKey) if err != nil { jww.FATAL.Panicf("InitTestingSession failed to create dummy user: %+v", err) } diff --git a/storage/user/cryptographic.go b/storage/user/cryptographic.go index fd4b73047008f6f0f78ad9a2f1b067372932aae6..8c245fc70ac257dc9eef14d9848be007c7831343 100644 --- a/storage/user/cryptographic.go +++ b/storage/user/cryptographic.go @@ -10,15 +10,19 @@ package user import ( "bytes" "encoding/gob" + "encoding/json" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/storage/utility" "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/xx_network/crypto/signature/rsa" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" ) -const currentCryptographicIdentityVersion = 0 +const originalCryptographicIdentityVersion = 0 +const currentCryptographicIdentityVersion = 1 const cryptographicIdentityKey = "cryptographicIdentity" type CryptographicIdentity struct { @@ -29,6 +33,8 @@ type CryptographicIdentity struct { receptionSalt []byte receptionRsaKey *rsa.PrivateKey isPrecanned bool + e2eDhPrivateKey *cyclic.Int + e2eDhPublicKey *cyclic.Int } type ciDisk struct { @@ -41,10 +47,23 @@ type ciDisk struct { IsPrecanned bool } +type ciDiskV1 struct { + TransmissionID *id.ID + TransmissionSalt []byte + TransmissionRsaKey *rsa.PrivateKey + ReceptionID *id.ID + ReceptionSalt []byte + ReceptionRsaKey *rsa.PrivateKey + IsPrecanned bool + E2eDhPrivateKey []byte + E2eDhPublicKey []byte +} + func newCryptographicIdentity(transmissionID, receptionID *id.ID, transmissionSalt, receptionSalt []byte, transmissionRsa, receptionRsa *rsa.PrivateKey, - isPrecanned bool, kv *versioned.KV) *CryptographicIdentity { + isPrecanned bool, e2eDhPrivateKey, e2eDhPublicKey *cyclic.Int, + kv *versioned.KV) *CryptographicIdentity { ci := &CryptographicIdentity{ transmissionID: transmissionID, @@ -54,6 +73,8 @@ func newCryptographicIdentity(transmissionID, receptionID *id.ID, receptionSalt: receptionSalt, receptionRsaKey: receptionRsa, isPrecanned: isPrecanned, + e2eDhPrivateKey: e2eDhPrivateKey, + e2eDhPublicKey: e2eDhPublicKey, } if err := ci.save(kv); err != nil { @@ -64,39 +85,115 @@ func newCryptographicIdentity(transmissionID, receptionID *id.ID, return ci } -func loadCryptographicIdentity(kv *versioned.KV) (*CryptographicIdentity, error) { - obj, err := kv.Get(cryptographicIdentityKey, - currentCryptographicIdentityVersion) +// loadOriginalCryptographicIdentity attempts to load the originalCryptographicIdentityVersion CryptographicIdentity +func loadOriginalCryptographicIdentity(kv *versioned.KV) (*CryptographicIdentity, error) { + result := &CryptographicIdentity{} + obj, err := kv.Get(cryptographicIdentityKey, originalCryptographicIdentityVersion) if err != nil { - return nil, errors.WithMessage(err, "Failed to get user "+ - "cryptographic identity from EKV") + return nil, errors.WithMessagef(err, "Failed to get version %d user "+ + "cryptographic identity from EKV", originalCryptographicIdentityVersion) } - var resultBuffer bytes.Buffer - result := &CryptographicIdentity{} decodable := &ciDisk{} resultBuffer.Write(obj.Data) dec := gob.NewDecoder(&resultBuffer) err = dec.Decode(decodable) + if err != nil { + return nil, err + } - if decodable != nil { - result.isPrecanned = decodable.IsPrecanned - result.receptionRsaKey = decodable.ReceptionRsaKey - result.transmissionRsaKey = decodable.TransmissionRsaKey - result.transmissionSalt = decodable.TransmissionSalt - result.transmissionID = decodable.TransmissionID - result.receptionID = decodable.ReceptionID - result.receptionSalt = decodable.ReceptionSalt + result.isPrecanned = decodable.IsPrecanned + result.receptionRsaKey = decodable.ReceptionRsaKey + result.transmissionRsaKey = decodable.TransmissionRsaKey + result.transmissionSalt = decodable.TransmissionSalt + result.transmissionID = decodable.TransmissionID + result.receptionID = decodable.ReceptionID + result.receptionSalt = decodable.ReceptionSalt + return result, nil +} + +func loadCryptographicIdentity(kv *versioned.KV) (*CryptographicIdentity, error) { + result := &CryptographicIdentity{} + obj, err := kv.Get(cryptographicIdentityKey, + currentCryptographicIdentityVersion) + if err != nil { + result, err = loadOriginalCryptographicIdentity(kv) + if err != nil { + return nil, err + } + jww.WARN.Printf("Attempting to migrate cryptographic identity to new version...") + // Populate E2E keys from legacy storage + result.e2eDhPublicKey, result.e2eDhPrivateKey = loadLegacyDHKeys(kv) + // Migrate to the new version in storage + return result, result.save(kv) + } + + decodable := &ciDiskV1{} + err = json.Unmarshal(obj.Data, decodable) + if err != nil { + return nil, err } - return result, err + result.isPrecanned = decodable.IsPrecanned + result.receptionRsaKey = decodable.ReceptionRsaKey + result.transmissionRsaKey = decodable.TransmissionRsaKey + result.transmissionSalt = decodable.TransmissionSalt + result.transmissionID = decodable.TransmissionID + result.receptionID = decodable.ReceptionID + result.receptionSalt = decodable.ReceptionSalt + + result.e2eDhPrivateKey = &cyclic.Int{} + err = result.e2eDhPrivateKey.UnmarshalJSON(decodable.E2eDhPrivateKey) + if err != nil { + return nil, err + } + result.e2eDhPublicKey = &cyclic.Int{} + err = result.e2eDhPublicKey.UnmarshalJSON(decodable.E2eDhPublicKey) + if err != nil { + return nil, err + } + + return result, nil +} + +// loadLegacyDHKeys attempts to load DH Keys from legacy storage. It +// prints a warning to the log as users should be using ReceptionIdentity +// instead of PortableUserInfo +func loadLegacyDHKeys(kv *versioned.KV) (pub, priv *cyclic.Int) { + // Legacy package prefixes and keys, see e2e/ratchet/storage.go + packagePrefix := "e2eSession" + pubKeyKey := "DhPubKey" + privKeyKey := "DhPrivKey" + + kvPrefix := kv.Prefix(packagePrefix) + + privKey, err := utility.LoadCyclicKey(kvPrefix, privKeyKey) + if err != nil { + jww.ERROR.Printf("Failed to load e2e DH private key: %v", err) + return nil, nil + } + + pubKey, err := utility.LoadCyclicKey(kvPrefix, pubKeyKey) + if err != nil { + jww.ERROR.Printf("Failed to load e2e DH public key: %v", err) + return nil, nil + } + + return pubKey, privKey } func (ci *CryptographicIdentity) save(kv *versioned.KV) error { - var userDataBuffer bytes.Buffer + dhPriv, err := ci.e2eDhPrivateKey.MarshalJSON() + if err != nil { + return err + } + dhPub, err := ci.e2eDhPublicKey.MarshalJSON() + if err != nil { + return err + } - encodable := &ciDisk{ + encodable := &ciDiskV1{ TransmissionID: ci.transmissionID, TransmissionSalt: ci.transmissionSalt, TransmissionRsaKey: ci.transmissionRsaKey, @@ -104,10 +201,11 @@ func (ci *CryptographicIdentity) save(kv *versioned.KV) error { ReceptionSalt: ci.receptionSalt, ReceptionRsaKey: ci.receptionRsaKey, IsPrecanned: ci.isPrecanned, + E2eDhPrivateKey: dhPriv, + E2eDhPublicKey: dhPub, } - enc := gob.NewEncoder(&userDataBuffer) - err := enc.Encode(encodable) + enc, err := json.Marshal(&encodable) if err != nil { return err } @@ -115,7 +213,7 @@ func (ci *CryptographicIdentity) save(kv *versioned.KV) error { obj := &versioned.Object{ Version: currentCryptographicIdentityVersion, Timestamp: netTime.Now(), - Data: userDataBuffer.Bytes(), + Data: enc, } return kv.Set(cryptographicIdentityKey, @@ -149,3 +247,11 @@ func (ci *CryptographicIdentity) GetTransmissionRSA() *rsa.PrivateKey { func (ci *CryptographicIdentity) IsPrecanned() bool { return ci.isPrecanned } + +func (ci *CryptographicIdentity) GetE2eDhPublicKey() *cyclic.Int { + return ci.e2eDhPublicKey.DeepCopy() +} + +func (ci *CryptographicIdentity) GetE2eDhPrivateKey() *cyclic.Int { + return ci.e2eDhPrivateKey.DeepCopy() +} diff --git a/storage/user/cryptographic_test.go b/storage/user/cryptographic_test.go index 1096ccf683e288ae99577bc14989ab3fd71af599..0b9f92d9525600ad66c7746dbda12fa06fc6a318 100644 --- a/storage/user/cryptographic_test.go +++ b/storage/user/cryptographic_test.go @@ -11,7 +11,10 @@ import ( "bytes" "crypto/rand" "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/crypto/cyclic" + "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/ekv" + "gitlab.com/xx_network/crypto/large" "gitlab.com/xx_network/crypto/signature/rsa" "gitlab.com/xx_network/primitives/id" "testing" @@ -22,11 +25,19 @@ func TestNewCryptographicIdentity(t *testing.T) { kv := versioned.NewKV(ekv.MakeMemstore()) uid := id.NewIdFromString("zezima", id.User, t) salt := []byte("salt") - _ = newCryptographicIdentity(uid, uid, salt, salt, &rsa.PrivateKey{}, &rsa.PrivateKey{}, false, kv) - _, err := kv.Get(cryptographicIdentityKey, 0) + prng := rand.Reader + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + _ = newCryptographicIdentity(uid, uid, salt, salt, &rsa.PrivateKey{}, + &rsa.PrivateKey{}, false, dhPrivKey, dhPubKey, kv) + + _, err := kv.Get(cryptographicIdentityKey, currentCryptographicIdentityVersion) if err != nil { - t.Errorf("Did not store cryptographic identity") + t.Errorf("Did not store cryptographic identity: %+v", err) } } @@ -35,7 +46,15 @@ func TestLoadCryptographicIdentity(t *testing.T) { kv := versioned.NewKV(ekv.MakeMemstore()) uid := id.NewIdFromString("zezima", id.User, t) salt := []byte("salt") - ci := newCryptographicIdentity(uid, uid, salt, salt, &rsa.PrivateKey{}, &rsa.PrivateKey{}, false, kv) + + prng := rand.Reader + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + ci := newCryptographicIdentity(uid, uid, salt, salt, &rsa.PrivateKey{}, + &rsa.PrivateKey{}, false, dhPrivKey, dhPubKey, kv) err := ci.save(kv) if err != nil { @@ -64,7 +83,15 @@ func TestCryptographicIdentity_GetReceptionRSA(t *testing.T) { t.Errorf("Failed to generate pk2") } salt := []byte("salt") - ci := newCryptographicIdentity(uid, uid, salt, salt, pk1, pk2, false, kv) + + prng := rand.Reader + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + ci := newCryptographicIdentity( + uid, uid, salt, salt, pk1, pk2, false, dhPrivKey, dhPubKey, kv) if ci.GetReceptionRSA().D != pk2.D { t.Errorf("Did not receive expected RSA key. Expected: %+v, Received: %+v", pk2, ci.GetReceptionRSA()) } @@ -83,7 +110,15 @@ func TestCryptographicIdentity_GetTransmissionRSA(t *testing.T) { t.Errorf("Failed to generate pk2") } salt := []byte("salt") - ci := newCryptographicIdentity(uid, uid, salt, salt, pk1, pk2, false, kv) + + prng := rand.Reader + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + ci := newCryptographicIdentity( + uid, uid, salt, salt, pk1, pk2, false, dhPrivKey, dhPubKey, kv) if ci.GetTransmissionRSA().D != pk1.D { t.Errorf("Did not receive expected RSA key. Expected: %+v, Received: %+v", pk1, ci.GetTransmissionRSA()) } @@ -95,7 +130,15 @@ func TestCryptographicIdentity_GetTransmissionSalt(t *testing.T) { uid := id.NewIdFromString("zezima", id.User, t) ts := []byte("transmission salt") rs := []byte("reception salt") - ci := newCryptographicIdentity(uid, uid, ts, rs, &rsa.PrivateKey{}, &rsa.PrivateKey{}, false, kv) + + prng := rand.Reader + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + ci := newCryptographicIdentity(uid, uid, ts, rs, &rsa.PrivateKey{}, + &rsa.PrivateKey{}, false, dhPrivKey, dhPubKey, kv) if bytes.Compare(ci.GetTransmissionSalt(), ts) != 0 { t.Errorf("Did not get expected salt. Expected: %+v, Received: %+v", ts, ci.GetTransmissionSalt()) } @@ -107,7 +150,15 @@ func TestCryptographicIdentity_GetReceptionSalt(t *testing.T) { uid := id.NewIdFromString("zezima", id.User, t) ts := []byte("transmission salt") rs := []byte("reception salt") - ci := newCryptographicIdentity(uid, uid, ts, rs, &rsa.PrivateKey{}, &rsa.PrivateKey{}, false, kv) + + prng := rand.Reader + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + ci := newCryptographicIdentity(uid, uid, ts, rs, &rsa.PrivateKey{}, + &rsa.PrivateKey{}, false, dhPrivKey, dhPubKey, kv) if bytes.Compare(ci.GetReceptionSalt(), rs) != 0 { t.Errorf("Did not get expected salt. Expected: %+v, Received: %+v", rs, ci.GetReceptionSalt()) } @@ -119,7 +170,14 @@ func TestCryptographicIdentity_GetTransmissionID(t *testing.T) { rid := id.NewIdFromString("zezima", id.User, t) tid := id.NewIdFromString("jakexx360", id.User, t) salt := []byte("salt") - ci := newCryptographicIdentity(tid, rid, salt, salt, &rsa.PrivateKey{}, &rsa.PrivateKey{}, false, kv) + + prng := rand.Reader + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + ci := newCryptographicIdentity(tid, rid, salt, salt, &rsa.PrivateKey{}, &rsa.PrivateKey{}, false, dhPrivKey, dhPubKey, kv) if !ci.GetTransmissionID().Cmp(tid) { t.Errorf("Did not receive expected user ID. Expected: %+v, Received: %+v", tid, ci.GetTransmissionID()) } @@ -131,7 +189,14 @@ func TestCryptographicIdentity_GetReceptionID(t *testing.T) { rid := id.NewIdFromString("zezima", id.User, t) tid := id.NewIdFromString("jakexx360", id.User, t) salt := []byte("salt") - ci := newCryptographicIdentity(tid, rid, salt, salt, &rsa.PrivateKey{}, &rsa.PrivateKey{}, false, kv) + + prng := rand.Reader + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + ci := newCryptographicIdentity(tid, rid, salt, salt, &rsa.PrivateKey{}, &rsa.PrivateKey{}, false, dhPrivKey, dhPubKey, kv) if !ci.GetReceptionID().Cmp(rid) { t.Errorf("Did not receive expected user ID. Expected: %+v, Received: %+v", rid, ci.GetReceptionID()) } @@ -142,7 +207,14 @@ func TestCryptographicIdentity_IsPrecanned(t *testing.T) { kv := versioned.NewKV(ekv.MakeMemstore()) uid := id.NewIdFromString("zezima", id.User, t) salt := []byte("salt") - ci := newCryptographicIdentity(uid, uid, salt, salt, &rsa.PrivateKey{}, &rsa.PrivateKey{}, true, kv) + + prng := rand.Reader + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + ci := newCryptographicIdentity(uid, uid, salt, salt, &rsa.PrivateKey{}, &rsa.PrivateKey{}, true, dhPrivKey, dhPubKey, kv) if !ci.IsPrecanned() { t.Error("I really don't know how this could happen") } diff --git a/storage/user/info.go b/storage/user/info.go index 3da77bb13935d863e382e26ad55aa529f1b63b6b..fc272cb0fe134b767e399b4bb9fca2a8cd3411e4 100644 --- a/storage/user/info.go +++ b/storage/user/info.go @@ -94,10 +94,8 @@ func (u *User) PortableUserInfo() Info { ReceptionSalt: copySlice(ci.GetReceptionSalt()), ReceptionRSA: ci.GetReceptionRSA(), Precanned: ci.IsPrecanned(), - //fixme: set these in the e2e layer, the command line layer - //needs more logical separation so this can be removed - E2eDhPrivateKey: nil, - E2eDhPublicKey: nil, + E2eDhPrivateKey: ci.GetE2eDhPrivateKey(), + E2eDhPublicKey: ci.GetE2eDhPublicKey(), } } diff --git a/storage/user/registation_test.go b/storage/user/registation_test.go index cec369ea41ca74c63ea972e3455a4b577ebcd464..346e662758223a755e13c5e19186002ae6b9ec6f 100644 --- a/storage/user/registation_test.go +++ b/storage/user/registation_test.go @@ -11,10 +11,14 @@ import ( "bytes" "encoding/binary" "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/crypto/cyclic" + "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/ekv" + "gitlab.com/xx_network/crypto/large" "gitlab.com/xx_network/crypto/signature/rsa" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" + "math/rand" "testing" "time" ) @@ -24,7 +28,15 @@ func TestUser_GetRegistrationValidationSignature(t *testing.T) { kv := versioned.NewKV(ekv.MakeMemstore()) uid := id.NewIdFromString("test", id.User, t) salt := []byte("salt") - u, err := NewUser(kv, uid, uid, salt, salt, &rsa.PrivateKey{}, &rsa.PrivateKey{}, false) + + prng := rand.New(rand.NewSource(42)) + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + u, err := NewUser(kv, uid, uid, salt, salt, &rsa.PrivateKey{}, + &rsa.PrivateKey{}, false, dhPrivKey, dhPubKey) if err != nil || u == nil { t.Errorf("Failed to create new user: %+v", err) } @@ -59,7 +71,15 @@ func TestUser_SetRegistrationValidationSignature(t *testing.T) { kv := versioned.NewKV(ekv.MakeMemstore()) uid := id.NewIdFromString("test", id.User, t) salt := []byte("salt") - u, err := NewUser(kv, uid, uid, salt, salt, &rsa.PrivateKey{}, &rsa.PrivateKey{}, false) + + prng := rand.New(rand.NewSource(42)) + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + u, err := NewUser(kv, uid, uid, salt, salt, &rsa.PrivateKey{}, + &rsa.PrivateKey{}, false, dhPrivKey, dhPubKey) if err != nil || u == nil { t.Errorf("Failed to create new user: %+v", err) } @@ -102,7 +122,15 @@ func TestUser_loadRegistrationValidationSignature(t *testing.T) { kv := versioned.NewKV(ekv.MakeMemstore()) uid := id.NewIdFromString("test", id.User, t) salt := []byte("salt") - u, err := NewUser(kv, uid, uid, salt, salt, &rsa.PrivateKey{}, &rsa.PrivateKey{}, false) + + prng := rand.New(rand.NewSource(42)) + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + u, err := NewUser(kv, uid, uid, salt, salt, &rsa.PrivateKey{}, + &rsa.PrivateKey{}, false, dhPrivKey, dhPubKey) if err != nil || u == nil { t.Errorf("Failed to create new user: %+v", err) } @@ -145,7 +173,15 @@ func TestUser_GetRegistrationTimestamp(t *testing.T) { kv := versioned.NewKV(ekv.MakeMemstore()) uid := id.NewIdFromString("test", id.User, t) salt := []byte("salt") - u, err := NewUser(kv, uid, uid, salt, salt, &rsa.PrivateKey{}, &rsa.PrivateKey{}, false) + + prng := rand.New(rand.NewSource(42)) + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + u, err := NewUser(kv, uid, uid, salt, salt, &rsa.PrivateKey{}, + &rsa.PrivateKey{}, false, dhPrivKey, dhPubKey) if err != nil || u == nil { t.Errorf("Failed to create new user: %+v", err) } @@ -194,7 +230,15 @@ func TestUser_loadRegistrationTimestamp(t *testing.T) { kv := versioned.NewKV(ekv.MakeMemstore()) uid := id.NewIdFromString("test", id.User, t) salt := []byte("salt") - u, err := NewUser(kv, uid, uid, salt, salt, &rsa.PrivateKey{}, &rsa.PrivateKey{}, false) + + prng := rand.New(rand.NewSource(42)) + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + u, err := NewUser(kv, uid, uid, salt, salt, &rsa.PrivateKey{}, + &rsa.PrivateKey{}, false, dhPrivKey, dhPubKey) if err != nil || u == nil { t.Errorf("Failed to create new user: %+v", err) } diff --git a/storage/user/user.go b/storage/user/user.go index e79abf3300c039ab8f097672bc6e62ca8a47f286..5b84321a97cc169df474ab2ebd602bfb2769c0b1 100644 --- a/storage/user/user.go +++ b/storage/user/user.go @@ -10,6 +10,7 @@ package user import ( "github.com/pkg/errors" "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/xx_network/crypto/signature/rsa" "gitlab.com/xx_network/primitives/id" "sync" @@ -33,9 +34,11 @@ type User struct { // builds a new user. func NewUser(kv *versioned.KV, transmissionID, receptionID *id.ID, transmissionSalt, - receptionSalt []byte, transmissionRsa, receptionRsa *rsa.PrivateKey, isPrecanned bool) (*User, error) { + receptionSalt []byte, transmissionRsa, receptionRsa *rsa.PrivateKey, isPrecanned bool, + e2eDhPrivateKey, e2eDhPublicKey *cyclic.Int) (*User, error) { - ci := newCryptographicIdentity(transmissionID, receptionID, transmissionSalt, receptionSalt, transmissionRsa, receptionRsa, isPrecanned, kv) + ci := newCryptographicIdentity(transmissionID, receptionID, transmissionSalt, + receptionSalt, transmissionRsa, receptionRsa, isPrecanned, e2eDhPrivateKey, e2eDhPublicKey, kv) return &User{CryptographicIdentity: ci, kv: kv}, nil } diff --git a/storage/user/user_test.go b/storage/user/user_test.go index 01a93088c1e54c7d2b6d03a6d5a6a1cb0cfb8803..9198e48f607e3c25d79d74242f7607819a83efd1 100644 --- a/storage/user/user_test.go +++ b/storage/user/user_test.go @@ -9,9 +9,13 @@ package user import ( "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/crypto/cyclic" + "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/ekv" + "gitlab.com/xx_network/crypto/large" "gitlab.com/xx_network/crypto/signature/rsa" "gitlab.com/xx_network/primitives/id" + "math/rand" "testing" ) @@ -26,7 +30,15 @@ func TestLoadUser(t *testing.T) { uid := id.NewIdFromString("test", id.User, t) salt := []byte("salt") - ci := newCryptographicIdentity(uid, uid, salt, salt, &rsa.PrivateKey{}, &rsa.PrivateKey{}, false, kv) + + prng := rand.New(rand.NewSource(42)) + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + ci := newCryptographicIdentity(uid, uid, salt, salt, &rsa.PrivateKey{}, + &rsa.PrivateKey{}, false, dhPrivKey, dhPubKey, kv) err = ci.save(kv) if err != nil { t.Errorf("Failed to save ci to kv: %+v", err) @@ -43,7 +55,15 @@ func TestNewUser(t *testing.T) { kv := versioned.NewKV(ekv.MakeMemstore()) uid := id.NewIdFromString("test", id.User, t) salt := []byte("salt") - u, err := NewUser(kv, uid, uid, salt, salt, &rsa.PrivateKey{}, &rsa.PrivateKey{}, false) + + prng := rand.New(rand.NewSource(42)) + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + u, err := NewUser(kv, uid, uid, salt, salt, &rsa.PrivateKey{}, + &rsa.PrivateKey{}, false, dhPrivKey, dhPubKey) if err != nil || u == nil { t.Errorf("Failed to create new user: %+v", err) } diff --git a/storage/user/username_test.go b/storage/user/username_test.go index f4a851145b8296bdab49b07bb6996d51344dc2ae..a52b20ac003d692c38ba632299354bb8ce698faf 100644 --- a/storage/user/username_test.go +++ b/storage/user/username_test.go @@ -9,10 +9,14 @@ package user import ( "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/crypto/cyclic" + "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/ekv" + "gitlab.com/xx_network/crypto/large" "gitlab.com/xx_network/crypto/signature/rsa" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" + "math/rand" "testing" ) @@ -23,7 +27,15 @@ func TestUser_SetUsername(t *testing.T) { rid := id.NewIdFromString("recv", id.User, t) tsalt := []byte("tsalt") rsalt := []byte("rsalt") - u, err := NewUser(kv, tid, rid, tsalt, rsalt, &rsa.PrivateKey{}, &rsa.PrivateKey{}, false) + + prng := rand.New(rand.NewSource(42)) + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + u, err := NewUser(kv, tid, rid, tsalt, rsalt, &rsa.PrivateKey{}, + &rsa.PrivateKey{}, false, dhPrivKey, dhPubKey) if err != nil || u == nil { t.Errorf("Failed to create new user: %+v", err) } @@ -57,7 +69,15 @@ func TestUser_GetUsername(t *testing.T) { rid := id.NewIdFromString("recv", id.User, t) tsalt := []byte("tsalt") rsalt := []byte("rsalt") - u, err := NewUser(kv, tid, rid, tsalt, rsalt, &rsa.PrivateKey{}, &rsa.PrivateKey{}, false) + + prng := rand.New(rand.NewSource(42)) + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + u, err := NewUser(kv, tid, rid, tsalt, rsalt, &rsa.PrivateKey{}, + &rsa.PrivateKey{}, false, dhPrivKey, dhPubKey) if err != nil || u == nil { t.Errorf("Failed to create new user: %+v", err) } @@ -85,7 +105,15 @@ func TestUser_loadUsername(t *testing.T) { rid := id.NewIdFromString("recv", id.User, t) tsalt := []byte("tsalt") rsalt := []byte("rsalt") - u, err := NewUser(kv, tid, rid, tsalt, rsalt, &rsa.PrivateKey{}, &rsa.PrivateKey{}, false) + + prng := rand.New(rand.NewSource(42)) + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) + dhPrivKey := diffieHellman.GeneratePrivateKey( + diffieHellman.DefaultPrivateKeyLength, grp, prng) + dhPubKey := diffieHellman.GeneratePublicKey(dhPrivKey, grp) + + u, err := NewUser(kv, tid, rid, tsalt, rsalt, &rsa.PrivateKey{}, + &rsa.PrivateKey{}, false, dhPrivKey, dhPubKey) if err != nil || u == nil { t.Errorf("Failed to create new user: %+v", err) } diff --git a/ud/addFact.go b/ud/addFact.go index 3c2b0af5428d71c57fd5f80cc3a0b5657bc9cccc..ba9fef240d7b26dc56d4eb89b41c23676a026ce1 100644 --- a/ud/addFact.go +++ b/ud/addFact.go @@ -22,7 +22,7 @@ func (m *Manager) SendRegisterFact(f fact.Fact) (string, error) { jww.INFO.Printf("ud.SendRegisterFact(%s)", f.Stringify()) m.factMux.Lock() defer m.factMux.Unlock() - return m.addFact(f, m.e2e.GetReceptionID(), m.comms) + return m.addFact(f, m.e2e.GetReceptionIdentity().ID, m.comms) } // addFact is the helper function for SendRegisterFact. @@ -45,8 +45,11 @@ func (m *Manager) addFact(inFact fact.Fact, myId *id.ID, fHash := factID.Fingerprint(f) // Sign our inFact for putting into the request - privKey := m.user.PortableUserInfo().ReceptionRSA - stream := m.rng.GetStream() + privKey, err := m.e2e.GetReceptionIdentity().GetRSAPrivatePem() + if err != nil { + return "", err + } + stream := m.getRng().GetStream() defer stream.Close() fSig, err := rsa.Sign(stream, privKey, hash.CMixHash, fHash, nil) if err != nil { diff --git a/ud/interfaces.go b/ud/interfaces.go index db7f0b60333ddbc559520aa5ee9a12eb51594eea..42b0c570f5ff522bcb2b8204ad867b4b08fd9b4a 100644 --- a/ud/interfaces.go +++ b/ud/interfaces.go @@ -1,11 +1,13 @@ package ud import ( + "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/e2e" + "gitlab.com/elixxir/client/event" "gitlab.com/elixxir/client/single" - "gitlab.com/elixxir/client/storage/user" + "gitlab.com/elixxir/client/storage" "gitlab.com/elixxir/client/xxdk" - "gitlab.com/elixxir/crypto/cyclic" - "gitlab.com/xx_network/primitives/id" + "gitlab.com/elixxir/crypto/fastRNG" ) // CMix is a sub-interface of the cmix.Client. It contains the methods @@ -16,25 +18,16 @@ type CMix interface { single.Cmix } -// E2E is a sub-interface of the e2e.Handler. It contains the methods +// E2E is a sub-interface of the xxdk.E2e. It contains the methods // relevant to what is used in this package. type E2E interface { - // GetGroup returns the cyclic group used for end to end encruption - GetGroup() *cyclic.Group - - // GetReceptionID returns the default IDs - GetReceptionID() *id.ID - - // GetHistoricalDHPubkey returns the user's Historical DH - // Public Key - GetHistoricalDHPubkey() *cyclic.Int -} - -// UserInfo is a sub-interface for the user.User object in storage. -// It contains the methods relevant to what is used in this package. -type UserInfo interface { - PortableUserInfo() user.Info - GetReceptionRegistrationValidationSignature() []byte + GetReceptionIdentity() xxdk.ReceptionIdentity + GetCmix() cmix.Client + GetE2E() e2e.Handler + GetEventReporter() event.Reporter + GetRng() *fastRNG.StreamGenerator + GetStorage() storage.Session + GetTransmissionIdentity() xxdk.TransmissionIdentity } // NetworkStatus is an interface for the xxdk.Cmix's diff --git a/ud/lookup_test.go b/ud/lookup_test.go index 132905cc0878331aba435b1cbeee045bbda91d84..da300b7b4e778913d8c66b84a497d344e368c795 100644 --- a/ud/lookup_test.go +++ b/ud/lookup_test.go @@ -65,8 +65,8 @@ func TestManager_Lookup(t *testing.T) { defer mockListener.Stop() - r := m.e2e.GetGroup().NewInt(1) - m.e2e.GetGroup().Random(r) + r := m.e2e.GetE2E().GetGroup().NewInt(1) + m.e2e.GetE2E().GetGroup().Random(r) s := "" jsonable, err := r.MarshalJSON() if err != nil { @@ -87,7 +87,7 @@ func TestManager_Lookup(t *testing.T) { } // Run the lookup - _, _, err = Lookup(m.network, prng, + _, _, err = Lookup(m.getCmix(), prng, grp, udContact, callback, uid, p) if err != nil { t.Errorf("Lookup() returned an error: %+v", err) diff --git a/ud/manager.go b/ud/manager.go index 77dbc01f44def0d37e0d84ff208fb8cffe39befe..026583cb43bbd2b000ca49a1b693b92e6bb2dfe4 100644 --- a/ud/manager.go +++ b/ud/manager.go @@ -26,37 +26,20 @@ const ( // Manager is the control structure for the contacting the user discovery service. type Manager struct { - // Network is a sub-interface of the cmix.Client interface. It - // allows the Manager to retrieve network state. - network CMix // e2e is a sub-interface of the e2e.Handler. It allows the Manager // to retrieve the client's E2E information. e2e E2E - // events allows the Manager to report events to the other - // levels of the client. - events event.Reporter - // store is an instantiation of this package's storage object. // It contains the facts that are in some state of being registered // with the UD service store *store.Store - // user is a sub-interface of the user.User object in the storage package. - // This allows the Manager to pull user information for registration - // and verifying the client's identity - user UserInfo - // comms is a sub-interface of the client.Comms interface. It contains // gRPC functions for registering and fact operations. comms Comms - // kv is a versioned key-value store used for isRegistered and - // setRegistered. This is separated from store operations as store's kv - // has a different prefix which breaks backwards compatibility. - kv *versioned.KV - // factMux is to be used for Add/Remove fact.Fact operations. // This prevents simultaneous calls to Add/Remove calls which // may cause unexpected behaviour. @@ -66,19 +49,17 @@ type Manager struct { // production. This is for testing with a separately deployed UD service. alternativeUd *alternateUd - // rng is a fastRNG.StreamGenerator which is used to generate random - // data. This is used for signatures for adding/removing facts. - rng *fastRNG.StreamGenerator + // registrationValidationSignature for the ReceptionID + // Optional, depending on UD configuration + registrationValidationSignature []byte } // NewManager builds a new user discovery manager. // It requires that an updated // NDF is available and will error if one is not. -func NewManager(services CMix, e2e E2E, - follower NetworkStatus, - events event.Reporter, comms Comms, userStore UserInfo, - rng *fastRNG.StreamGenerator, username string, - kv *versioned.KV) (*Manager, error) { +// registrationValidationSignature may be set to nil +func NewManager(e2e E2E, comms Comms, follower NetworkStatus, + username string, registrationValidationSignature []byte) (*Manager, error) { jww.INFO.Println("ud.NewManager()") if follower() != xxdk.Running { @@ -88,13 +69,9 @@ func NewManager(services CMix, e2e E2E, // Initialize manager m := &Manager{ - network: services, - e2e: e2e, - events: events, - comms: comms, - user: userStore, - kv: kv, - rng: rng, + e2e: e2e, + comms: comms, + registrationValidationSignature: registrationValidationSignature, } if m.isRegistered() { @@ -103,7 +80,7 @@ func NewManager(services CMix, e2e E2E, // Initialize store var err error - m.store, err = store.NewOrLoadStore(kv) + m.store, err = store.NewOrLoadStore(m.getKv()) if err != nil { return nil, errors.Errorf("Failed to initialize store: %v", err) } @@ -116,16 +93,16 @@ func NewManager(services CMix, e2e E2E, } // Register with user discovery - stream := rng.GetStream() + stream := m.getRng().GetStream() defer stream.Close() - err = m.register(username, stream, comms, udHost) + err = m.register(username, stream, m.comms, udHost) if err != nil { return nil, errors.Errorf("Failed to register: %v", err) } // Set storage to registered - if err = setRegistered(kv); err != nil && m.events != nil { - m.events.Report(1, "UserDiscovery", "Registration", + if err = setRegistered(m.getKv()); err != nil && m.getEventReporter() != nil { + m.getEventReporter().Report(1, "UserDiscovery", "Registration", fmt.Sprintf("User Registered with UD: %+v", username)) } @@ -136,11 +113,8 @@ func NewManager(services CMix, e2e E2E, // NewManagerFromBackup builds a new user discover manager from a backup. // It will construct a manager that is already registered and restore // already registered facts into store. -func NewManagerFromBackup(services CMix, - e2e E2E, follower NetworkStatus, - events event.Reporter, comms Comms, userStore UserInfo, - rng *fastRNG.StreamGenerator, - email, phone fact.Fact, kv *versioned.KV) (*Manager, error) { +func NewManagerFromBackup(e2e E2E, comms Comms, follower NetworkStatus, + email, phone fact.Fact) (*Manager, error) { jww.INFO.Println("ud.NewManagerFromBackup()") if follower() != xxdk.Running { return nil, errors.New( @@ -150,18 +124,13 @@ func NewManagerFromBackup(services CMix, // Initialize manager m := &Manager{ - network: services, - e2e: e2e, - events: events, - comms: comms, - user: userStore, - kv: kv, - rng: rng, + e2e: e2e, + comms: comms, } // Initialize our store var err error - m.store, err = store.NewOrLoadStore(kv) + m.store, err = store.NewOrLoadStore(m.getKv()) if err != nil { return nil, err } @@ -175,7 +144,7 @@ func NewManagerFromBackup(services CMix, // Set as registered. Since it's from a backup, // the client is already registered - if err = setRegistered(kv); err != nil { + if err = setRegistered(m.getKv()); err != nil { return nil, errors.WithMessage(err, "failed to set client as "+ "registered with user discovery.") } @@ -219,19 +188,10 @@ func InitStoreFromBackup(kv *versioned.KV, // LoadManager loads the state of the Manager // from disk. This is meant to be called after any the first // instantiation of the manager by NewUserDiscovery. -func LoadManager(services CMix, e2e E2E, - events event.Reporter, comms Comms, userStore UserInfo, - rng *fastRNG.StreamGenerator, - kv *versioned.KV) (*Manager, error) { - +func LoadManager(e2e E2E, comms Comms) (*Manager, error) { m := &Manager{ - network: services, - e2e: e2e, - events: events, - comms: comms, - user: userStore, - rng: rng, - kv: kv, + e2e: e2e, + comms: comms, } if !m.isRegistered() { @@ -240,7 +200,7 @@ func LoadManager(services CMix, e2e E2E, } var err error - m.store, err = store.NewOrLoadStore(kv) + m.store, err = store.NewOrLoadStore(m.getKv()) if err != nil { return nil, errors.Errorf("Failed to initialize store: %v", err) } @@ -262,7 +222,10 @@ func (m *Manager) GetStringifiedFacts() []string { // GetContact returns the contact for UD as retrieved from the NDF. func (m *Manager) GetContact() (contact.Contact, error) { - grp := m.e2e.GetGroup() + grp, err := m.e2e.GetReceptionIdentity().GetGroup() + if err != nil { + return contact.Contact{}, err + } // Return alternative User discovery contact if set if m.alternativeUd != nil { // Unmarshal UD DH public key @@ -282,7 +245,7 @@ func (m *Manager) GetContact() (contact.Contact, error) { }, nil } - netDef := m.network.GetInstance().GetPartialNdf().Get() + netDef := m.getCmix().GetInstance().GetPartialNdf().Get() // Unmarshal UD ID from the NDF udID, err := id.Unmarshal(netDef.UDB.ID) @@ -315,7 +278,7 @@ func (m *Manager) getOrAddUdHost() (*connect.Host, error) { return m.alternativeUd.host, nil } - netDef := m.network.GetInstance().GetPartialNdf().Get() + netDef := m.getCmix().GetInstance().GetPartialNdf().Get() if netDef.UDB.Cert == "" { return nil, errors.New("NDF does not have User Discovery information, " + "is there network access?: Cert not present.") @@ -348,3 +311,32 @@ func (m *Manager) getOrAddUdHost() (*connect.Host, error) { return host, nil } + +///////////////////////////////////////////////////////////////////////////////////////// +// Internal getters ///////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + +// getCmix retrieve a sub-interface of cmix.Client. +// It allows the Manager to retrieve network state. +func (m *Manager) getCmix() CMix { + return m.e2e.GetCmix() +} + +// getKv returns a versioned.KV used for isRegistered and setRegistered. +// This is separated from store operations as store's kv +// has a different prefix which breaks backwards compatibility. +func (m *Manager) getKv() *versioned.KV { + return m.e2e.GetStorage().GetKV() +} + +// getEventReporter returns an event.Reporter. This allows +// the Manager to report events to the other levels of the client. +func (m *Manager) getEventReporter() event.Reporter { + return m.e2e.GetEventReporter() +} + +// getRng returns a fastRNG.StreamGenerator. This RNG is for +// generating signatures for adding/removing facts. +func (m *Manager) getRng() *fastRNG.StreamGenerator { + return m.e2e.GetRng() +} diff --git a/ud/mockComms_test.go b/ud/mockComms_test.go new file mode 100644 index 0000000000000000000000000000000000000000..542469eac332d27589dc6c40a27ef824f60a6cab --- /dev/null +++ b/ud/mockComms_test.go @@ -0,0 +1,46 @@ +package ud + +import ( + pb "gitlab.com/elixxir/comms/mixmessages" + "gitlab.com/xx_network/comms/connect" + "gitlab.com/xx_network/comms/messages" + "gitlab.com/xx_network/primitives/id" +) + +type mockComms struct { + udHost *connect.Host +} + +func (m mockComms) SendRegisterUser(host *connect.Host, message *pb.UDBUserRegistration) (*messages.Ack, error) { + return nil, nil +} + +func (m mockComms) SendRegisterFact(host *connect.Host, message *pb.FactRegisterRequest) (*pb.FactRegisterResponse, error) { + return nil, nil +} + +func (m mockComms) SendConfirmFact(host *connect.Host, message *pb.FactConfirmRequest) (*messages.Ack, error) { + return nil, nil +} + +func (m mockComms) SendRemoveFact(host *connect.Host, message *pb.FactRemovalRequest) (*messages.Ack, error) { + return nil, nil +} + +func (m mockComms) SendRemoveUser(host *connect.Host, message *pb.FactRemovalRequest) (*messages.Ack, error) { + return nil, nil +} + +func (m *mockComms) AddHost(hid *id.ID, address string, cert []byte, params connect.HostParams) (host *connect.Host, err error) { + h, err := connect.NewHost(hid, address, cert, params) + if err != nil { + return nil, err + } + + m.udHost = h + return h, nil +} + +func (m mockComms) GetHost(hostId *id.ID) (*connect.Host, bool) { + return m.udHost, true +} diff --git a/ud/mockE2e_test.go b/ud/mockE2e_test.go new file mode 100644 index 0000000000000000000000000000000000000000..103d7e1362eeebfdec403a741044f6610918cff0 --- /dev/null +++ b/ud/mockE2e_test.go @@ -0,0 +1,219 @@ +package ud + +import ( + "github.com/cloudflare/circl/dh/sidh" + "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/cmix/message" + "gitlab.com/elixxir/client/e2e" + "gitlab.com/elixxir/client/e2e/ratchet/partner" + "gitlab.com/elixxir/client/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/e2e/receive" + "gitlab.com/elixxir/client/event" + "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/client/xxdk" + "gitlab.com/elixxir/crypto/cyclic" + cryptoE2e "gitlab.com/elixxir/crypto/e2e" + "gitlab.com/elixxir/crypto/fastRNG" + "gitlab.com/xx_network/crypto/csprng" + "gitlab.com/xx_network/crypto/signature/rsa" + "gitlab.com/xx_network/primitives/id" + "testing" + "time" +) + +/////////////////////////////////////////////////////////////////////////////// +// Mock of the E2E interface within this package ////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +type mockE2e struct { + grp *cyclic.Group + events event.Reporter + rng *fastRNG.StreamGenerator + kv *versioned.KV + network cmix.Client + t testing.TB + key *rsa.PrivateKey +} + +func (m mockE2e) GetE2E() e2e.Handler { + return mockE2eHandler{} +} + +func (m mockE2e) GetReceptionIdentity() xxdk.ReceptionIdentity { + + dhPrivKey, _ := getGroup().NewInt(5).MarshalJSON() + grp, _ := getGroup().MarshalJSON() + + return xxdk.ReceptionIdentity{ + ID: id.NewIdFromString("test", id.User, m.t), + RSAPrivatePem: rsa.CreatePrivateKeyPem(m.key), + Salt: []byte("test"), + DHKeyPrivate: dhPrivKey, + E2eGrp: grp, + } +} + +func (m mockE2e) GetRng() *fastRNG.StreamGenerator { + return fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG) +} + +func (m mockE2e) GetTransmissionIdentity() xxdk.TransmissionIdentity { + return xxdk.TransmissionIdentity{ + ID: id.NewIdFromString("test", id.User, m.t), + RSAPrivatePem: m.key, + Salt: []byte("test"), + } +} + +func (m mockE2e) GetHistoricalDHPubkey() *cyclic.Int { + return m.grp.NewInt(6) +} + +func (m mockE2e) GetReceptionID() *id.ID { + return id.NewIdFromString("test", id.User, m.t) +} + +func (m mockE2e) GetGroup() *cyclic.Group { + return getGroup() +} + +func (m mockE2e) GetEventReporter() event.Reporter { + return mockReporter{} +} + +func (m mockE2e) GetCmix() cmix.Client { + return m.network +} + +func (m mockE2e) GetStorage() storage.Session { + //TODO implement me + panic("implement me") +} + +/////////////////////////////////////////////////////////////////////////////// +// Mock of the e2e.Handler interface within this package ////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +type mockE2eHandler struct{} + +func (m mockE2eHandler) StartProcesses() (stoppable.Stoppable, error) { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) SendE2E(mt catalog.MessageType, recipient *id.ID, payload []byte, params e2e.Params) ([]id.Round, cryptoE2e.MessageID, time.Time, error) { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) RegisterListener(senderID *id.ID, messageType catalog.MessageType, newListener receive.Listener) receive.ListenerID { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) RegisterFunc(name string, senderID *id.ID, messageType catalog.MessageType, newListener receive.ListenerFunc) receive.ListenerID { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) RegisterChannel(name string, senderID *id.ID, messageType catalog.MessageType, newListener chan receive.Message) receive.ListenerID { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) Unregister(listenerID receive.ListenerID) { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) UnregisterUserListeners(userID *id.ID) { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) AddPartner(partnerID *id.ID, partnerPubKey, myPrivKey *cyclic.Int, partnerSIDHPubKey *sidh.PublicKey, mySIDHPrivKey *sidh.PrivateKey, sendParams, receiveParams session.Params) (partner.Manager, error) { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) GetPartner(partnerID *id.ID) (partner.Manager, error) { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) DeletePartner(partnerId *id.ID) error { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) GetAllPartnerIDs() []*id.ID { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) HasAuthenticatedChannel(partner *id.ID) bool { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) AddService(tag string, processor message.Processor) error { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) RemoveService(tag string) error { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) SendUnsafe(mt catalog.MessageType, recipient *id.ID, payload []byte, params e2e.Params) ([]id.Round, time.Time, error) { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) EnableUnsafeReception() { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) GetHistoricalDHPubkey() *cyclic.Int { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) GetHistoricalDHPrivkey() *cyclic.Int { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) GetReceptionID() *id.ID { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) FirstPartitionSize() uint { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) SecondPartitionSize() uint { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) PartitionSize(payloadIndex uint) uint { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) PayloadSize() uint { + //TODO implement me + panic("implement me") +} + +func (m mockE2eHandler) GetGroup() *cyclic.Group { + return getGroup() +} diff --git a/ud/networkManager_test.go b/ud/networkManager_test.go new file mode 100644 index 0000000000000000000000000000000000000000..8aaec9115ab25ee3870dbff16afe3aa62670bbe8 --- /dev/null +++ b/ud/networkManager_test.go @@ -0,0 +1,225 @@ +package ud + +import ( + "bytes" + "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/cmix/gateway" + "gitlab.com/elixxir/client/cmix/identity" + "gitlab.com/elixxir/client/cmix/identity/receptionID" + "gitlab.com/elixxir/client/cmix/message" + "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/comms/network" + "gitlab.com/elixxir/crypto/contact" + "gitlab.com/elixxir/primitives/format" + "gitlab.com/xx_network/comms/connect" + "gitlab.com/xx_network/primitives/id" + "gitlab.com/xx_network/primitives/id/ephemeral" + "time" +) + +// testNetworkManager is a mock implementation of the CMix interface. +type testNetworkManager struct { + requestProcess message.Processor + instance *network.Instance + testingFace interface{} + c contact.Contact + responseProcessor message.Processor +} + +func (tnm *testNetworkManager) Send(recipient *id.ID, fingerprint format.Fingerprint, + service message.Service, + payload, mac []byte, cmixParams cmix.CMIXParams) (id.Round, ephemeral.Id, error) { + msg := format.NewMessage(tnm.instance.GetE2EGroup().GetP().ByteLen()) + // Build message. Will panic if inputs are not correct. + msg.SetKeyFP(fingerprint) + msg.SetContents(payload) + msg.SetMac(mac) + msg.SetSIH(service.Hash(msg.GetContents())) + // If the recipient for a call to Send is UD, then this + // is the request pathway. Call the UD processor to simulate + // the UD picking up the request + if bytes.Equal(tnm.instance.GetFullNdf(). + Get().UDB.ID, + recipient.Bytes()) { + tnm.responseProcessor.Process(msg, receptionID.EphemeralIdentity{}, rounds.Round{}) + + } else { + // This should happen when the mock UD service Sends back a response. + // Calling process mocks up the requester picking up the response. + tnm.requestProcess.Process(msg, receptionID.EphemeralIdentity{}, rounds.Round{}) + } + + return 0, ephemeral.Id{}, nil +} + +func (tnm *testNetworkManager) AddFingerprint(identity *id.ID, + fingerprint format.Fingerprint, mp message.Processor) error { + // AddFingerprint gets called in both the request and response + // code-paths. We only want to set in the code-path transmitting + // from UD + if !bytes.Equal(tnm.instance.GetFullNdf().Get().UDB.ID, + identity.Bytes()) { + tnm.requestProcess = mp + } + + return nil +} + +func (tnm *testNetworkManager) AddService(clientID *id.ID, + newService message.Service, + response message.Processor) { + tnm.responseProcessor = response + return +} + +func (tnm *testNetworkManager) CheckInProgressMessages() { + return +} + +func (tnm *testNetworkManager) GetMaxMessageLength() int { + return 700 +} + +func (tnm *testNetworkManager) AddIdentity(id *id.ID, validUntil time.Time, persistent bool) { + return +} + +func (tnm *testNetworkManager) DeleteClientFingerprints(identity *id.ID) { + return +} + +func (tnm *testNetworkManager) Process(ecrMsg format.Message, + receptionID receptionID.EphemeralIdentity, round rounds.Round) { + +} + +func (tnm *testNetworkManager) String() string { + return "mockPRocessor" +} + +func (tnm *testNetworkManager) DeleteService(clientID *id.ID, toDelete message.Service, processor message.Processor) { + return +} + +func (tnm *testNetworkManager) IsHealthy() bool { + return true +} + +func (tnm *testNetworkManager) GetAddressSpace() uint8 { + return 8 +} + +func (tnm *testNetworkManager) GetInstance() *network.Instance { + return tnm.instance +} + +func (tnm *testNetworkManager) Follow(report cmix.ClientErrorReport) (stoppable.Stoppable, error) { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) GetVerboseRounds() string { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) SendToAny(sendFunc func(host *connect.Host) (interface{}, error), stop *stoppable.Single) (interface{}, error) { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) SendMany(messages []cmix.TargetedCmixMessage, p cmix.CMIXParams) (id.Round, []ephemeral.Id, error) { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) RemoveIdentity(id *id.ID) { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) GetIdentity(get *id.ID) (identity.TrackedID, error) { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) DeleteFingerprint(identity *id.ID, fingerprint format.Fingerprint) { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) DeleteClientService(clientID *id.ID) { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) TrackServices(tracker message.ServicesTracker) { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) WasHealthy() bool { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) AddHealthCallback(f func(bool)) uint64 { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) RemoveHealthCallback(u uint64) { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) HasNode(nid *id.ID) bool { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) NumRegisteredNodes() int { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) TriggerNodeRegistration(nid *id.ID) { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) GetRoundResults(timeout time.Duration, roundCallback cmix.RoundEventCallback, roundList ...id.Round) error { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) LookupHistoricalRound(rid id.Round, callback rounds.RoundResultCallback) error { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) SendToPreferred(targets []*id.ID, sendFunc gateway.SendToPreferredFunc, stop *stoppable.Single, timeout time.Duration) (interface{}, error) { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) SetGatewayFilter(f gateway.Filter) { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) GetHostParams() connect.HostParams { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) RegisterAddressSpaceNotification(tag string) (chan uint8, error) { + //TODO implement me + panic("implement me") +} + +func (tnm *testNetworkManager) UnregisterAddressSpaceNotification(tag string) { + //TODO implement me + panic("implement me") +} diff --git a/ud/register.go b/ud/register.go index 3df8edd643216d8629e7c074152cd23f7ef2cc04..07c7fcdb942b2f96726af26a5e1deeac92fc2278 100644 --- a/ud/register.go +++ b/ud/register.go @@ -3,6 +3,7 @@ package ud import ( "github.com/pkg/errors" pb "gitlab.com/elixxir/comms/mixmessages" + "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/crypto/factID" "gitlab.com/elixxir/crypto/hash" "gitlab.com/elixxir/primitives/fact" @@ -17,24 +18,37 @@ func (m *Manager) register(username string, rng csprng.Source, comm registerUserComms, udHost *connect.Host) error { var err error - cryptoUser := m.user.PortableUserInfo() + identity := m.e2e.GetReceptionIdentity() + privKey, err := identity.GetRSAPrivatePem() + if err != nil { + return err + } + grp, err := identity.GetGroup() + if err != nil { + return err + } + dhKeyPriv, err := identity.GetDHKeyPrivate() + if err != nil { + return err + } + dhKeyPub := diffieHellman.GeneratePublicKey(dhKeyPriv, grp) // Construct the user registration message msg := &pb.UDBUserRegistration{ - PermissioningSignature: m.user.GetReceptionRegistrationValidationSignature(), - RSAPublicPem: string(rsa.CreatePublicKeyPem(cryptoUser.ReceptionRSA.GetPublic())), + PermissioningSignature: m.registrationValidationSignature, + RSAPublicPem: string(rsa.CreatePublicKeyPem(privKey.GetPublic())), IdentityRegistration: &pb.Identity{ Username: username, - DhPubKey: m.e2e.GetHistoricalDHPubkey().Bytes(), - Salt: cryptoUser.ReceptionSalt, + DhPubKey: dhKeyPub.Bytes(), + Salt: identity.Salt, }, - UID: cryptoUser.ReceptionID.Marshal(), - Timestamp: cryptoUser.RegistrationTimestamp, + UID: identity.ID.Marshal(), + Timestamp: m.e2e.GetTransmissionIdentity().RegistrationTimestamp, } // Sign the identity data and add to user registration message identityDigest := msg.IdentityRegistration.Digest() - msg.IdentitySignature, err = rsa.Sign(rng, cryptoUser.ReceptionRSA, + msg.IdentitySignature, err = rsa.Sign(rng, privKey, hash.CMixHash, identityDigest, nil) if err != nil { return errors.Errorf("Failed to sign user's IdentityRegistration: %+v", err) @@ -48,11 +62,11 @@ func (m *Manager) register(username string, rng csprng.Source, // Hash and sign fact hashedFact := factID.Fingerprint(usernameFact) - signedFact, err := rsa.Sign(rng, cryptoUser.ReceptionRSA, hash.CMixHash, hashedFact, nil) + signedFact, err := rsa.Sign(rng, privKey, hash.CMixHash, hashedFact, nil) // Add username fact register request to the user registration message msg.Frs = &pb.FactRegisterRequest{ - UID: cryptoUser.ReceptionID.Marshal(), + UID: identity.ID.Marshal(), Fact: &pb.Fact{ Fact: username, FactType: 0, diff --git a/ud/register_test.go b/ud/register_test.go index 3aae46e19b7a3834e3f16c6f42a35e8e696e20bc..d23aacc40f1b7bb89a1fb2f9606dc414ec909f72 100644 --- a/ud/register_test.go +++ b/ud/register_test.go @@ -43,8 +43,13 @@ func TestManager_register(t *testing.T) { isCorrect("testUser", c.msg, m, t) // Verify the signed identity data - pubKey := m.user.PortableUserInfo().ReceptionRSA.GetPublic() - err = rsa.Verify(pubKey, hash.CMixHash, c.msg.IdentityRegistration.Digest(), + pubKeyPem := m.e2e.GetReceptionIdentity().RSAPrivatePem + privKey, err := rsa.LoadPrivateKeyFromPem(pubKeyPem) + if err != nil { + t.Fatalf("Failed to load public key: %+v", err) + } + + err = rsa.Verify(privKey.GetPublic(), hash.CMixHash, c.msg.IdentityRegistration.Digest(), c.msg.IdentitySignature, nil) if err != nil { t.Errorf("Failed to verify signed identity data: %+v", err) @@ -52,7 +57,7 @@ func TestManager_register(t *testing.T) { // Verify the signed fact usernameFact, _ := fact.NewFact(fact.Username, "testUser") - err = rsa.Verify(pubKey, hash.CMixHash, factID.Fingerprint(usernameFact), + err = rsa.Verify(privKey.GetPublic(), hash.CMixHash, factID.Fingerprint(usernameFact), c.msg.Frs.FactSig, nil) if err != nil { t.Errorf("Failed to verify signed fact data: %+v", err) @@ -62,17 +67,23 @@ func TestManager_register(t *testing.T) { // isCorrect checks if the UDBUserRegistration has all the expected fields minus // any signatures. func isCorrect(username string, msg *pb.UDBUserRegistration, m *Manager, t *testing.T) { - userInfo := m.user.PortableUserInfo() - - if !bytes.Equal(m.user.GetReceptionRegistrationValidationSignature(), msg.PermissioningSignature) { + if !bytes.Equal(m.registrationValidationSignature, msg.PermissioningSignature) { t.Errorf("PermissioningSignature incorrect.\n\texpected: %v\n\treceived: %v", - m.user.GetReceptionRegistrationValidationSignature(), msg.PermissioningSignature) + m.registrationValidationSignature, msg.PermissioningSignature) + } + + identity := m.e2e.GetReceptionIdentity() + privKey, err := rsa.LoadPrivateKeyFromPem(identity.RSAPrivatePem) + if err != nil { + t.Fatalf("Failed to load private key: %v", err) } - if string(rsa.CreatePublicKeyPem(userInfo.TransmissionRSA.GetPublic())) != + pubKeyPem := rsa.CreatePublicKeyPem(privKey.GetPublic()) + + if string(pubKeyPem) != msg.RSAPublicPem { t.Errorf("RSAPublicPem incorrect.\n\texpected: %v\n\treceived: %v", - string(rsa.CreatePublicKeyPem(userInfo.TransmissionRSA.GetPublic())), + string(pubKeyPem), msg.RSAPublicPem) } @@ -81,19 +92,27 @@ func isCorrect(username string, msg *pb.UDBUserRegistration, m *Manager, t *test username, msg.IdentityRegistration.Username) } - if !bytes.Equal(userInfo.E2eDhPublicKey.Bytes(), msg.IdentityRegistration.DhPubKey) { + dhKeyPriv, err := identity.GetDHKeyPrivate() + if err != nil { + t.Fatalf("%v", err) + } + + grp := m.e2e.GetE2E().GetGroup() + dhKeyPub := grp.ExpG(dhKeyPriv, grp.NewInt(1)) + + if !bytes.Equal(dhKeyPub.Bytes(), msg.IdentityRegistration.DhPubKey) { t.Errorf("IdentityRegistration DhPubKey incorrect.\n\texpected: %#v\n\treceived: %#v", - userInfo.E2eDhPublicKey.Bytes(), msg.IdentityRegistration.DhPubKey) + dhKeyPub.Bytes(), msg.IdentityRegistration.DhPubKey) } - if !bytes.Equal(userInfo.TransmissionSalt, msg.IdentityRegistration.Salt) { + if !bytes.Equal(identity.Salt, msg.IdentityRegistration.Salt) { t.Errorf("IdentityRegistration Salt incorrect.\n\texpected: %#v\n\treceived: %#v", - userInfo.TransmissionSalt, msg.IdentityRegistration.Salt) + identity.Salt, msg.IdentityRegistration.Salt) } - if !bytes.Equal(userInfo.TransmissionID.Marshal(), msg.Frs.UID) { + if !bytes.Equal(identity.ID.Marshal(), msg.Frs.UID) { t.Errorf("Frs UID incorrect.\n\texpected: %v\n\treceived: %v", - userInfo.TransmissionID.Marshal(), msg.Frs.UID) + identity.ID.Marshal(), msg.Frs.UID) } if !reflect.DeepEqual(&pb.Fact{Fact: username}, msg.Frs.Fact) { diff --git a/ud/registered.go b/ud/registered.go index 71eab2a4e71ede3019c866c261dd818e325ebdaa..41eb6ccd3ec04c3046462048232dafceb93a3412 100644 --- a/ud/registered.go +++ b/ud/registered.go @@ -14,7 +14,7 @@ const isRegisteredVersion = 0 // isRegistered loads from storage if the client is registered with user // discovery. func (m *Manager) isRegistered() bool { - _, err := m.kv.Get(isRegisteredKey, isRegisteredVersion) + _, err := m.getKv().Get(isRegisteredKey, isRegisteredVersion) if err != nil { return false } diff --git a/ud/remove.go b/ud/remove.go index b64a218e6d54f120de999478ef8b9fd5fb10dd0c..bdaf1e66e682035df6c2d35fccbc864d25622c8a 100644 --- a/ud/remove.go +++ b/ud/remove.go @@ -45,8 +45,12 @@ func (m *Manager) removeFact(f fact.Fact, fHash := factID.Fingerprint(f) // Sign our inFact for putting into the request - privKey := m.user.PortableUserInfo().ReceptionRSA - stream := m.rng.GetStream() + identity := m.e2e.GetReceptionIdentity() + privKey, err := identity.GetRSAPrivatePem() + if err != nil { + return err + } + stream := m.getRng().GetStream() defer stream.Close() fSig, err := rsa.Sign(stream, privKey, hash.CMixHash, fHash, nil) if err != nil { @@ -55,7 +59,7 @@ func (m *Manager) removeFact(f fact.Fact, // Create our Fact Removal Request message data remFactMsg := mixmessages.FactRemovalRequest{ - UID: m.e2e.GetReceptionID().Marshal(), + UID: identity.ID.Marshal(), RemovalData: &mmFact, FactSig: fSig, } @@ -84,9 +88,14 @@ func (m *Manager) PermanentDeleteAccount(f fact.Fact) error { if err != nil { return err } - privKey := m.user.PortableUserInfo().ReceptionRSA - return m.permanentDeleteAccount(f, m.e2e.GetReceptionID(), privKey, m.comms, udHost) + identity := m.e2e.GetReceptionIdentity() + privKey, err := identity.GetRSAPrivatePem() + if err != nil { + return err + } + + return m.permanentDeleteAccount(f, identity.ID, privKey, m.comms, udHost) } // permanentDeleteAccount is a helper function for PermanentDeleteAccount. @@ -104,7 +113,7 @@ func (m *Manager) permanentDeleteAccount(f fact.Fact, myId *id.ID, privateKey *r fHash := factID.Fingerprint(f) // Sign our inFact for putting into the request - stream := m.rng.GetStream() + stream := m.getRng().GetStream() defer stream.Close() fsig, err := rsa.Sign(stream, privateKey, hash.CMixHash, fHash, nil) if err != nil { diff --git a/ud/search_test.go b/ud/search_test.go index 4bbc98e44ccba2fc08f3f98b0b58c5925d774ae9..cb9f77bbd8b175fccb56c82093cbe8c536ac60f5 100644 --- a/ud/search_test.go +++ b/ud/search_test.go @@ -71,7 +71,7 @@ func TestManager_Search(t *testing.T) { CmixParams: cmix.GetDefaultCMIXParams(), } - _, _, err = Search(m.network, m.events, prng, m.e2e.GetGroup(), + _, _, err = Search(m.getCmix(), m.getEventReporter(), prng, m.e2e.GetE2E().GetGroup(), udContact, callback, factList, p) if err != nil { t.Fatalf("Search() returned an error: %+v", err) diff --git a/ud/utils_test.go b/ud/utils_test.go index 5124db19cd73f3b153afde487c4649a2276780ff..8c3016a8680085cddf9bdd732a182a3624edef1a 100644 --- a/ud/utils_test.go +++ b/ud/utils_test.go @@ -8,31 +8,22 @@ package ud import ( - "bytes" "github.com/golang/protobuf/proto" "gitlab.com/elixxir/client/cmix" "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/cmix/message" "gitlab.com/elixxir/client/cmix/rounds" "gitlab.com/elixxir/client/event" "gitlab.com/elixxir/client/single" - "gitlab.com/elixxir/client/stoppable" "gitlab.com/elixxir/client/storage/user" "gitlab.com/elixxir/client/storage/versioned" store "gitlab.com/elixxir/client/ud/store" - pb "gitlab.com/elixxir/comms/mixmessages" - "gitlab.com/elixxir/comms/testkeys" "gitlab.com/elixxir/crypto/contact" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/ekv" - "gitlab.com/elixxir/primitives/format" - "gitlab.com/xx_network/comms/messages" "gitlab.com/xx_network/crypto/csprng" "gitlab.com/xx_network/crypto/large" "gitlab.com/xx_network/crypto/signature/rsa" - "gitlab.com/xx_network/primitives/id/ephemeral" - "gitlab.com/xx_network/primitives/utils" "io" "math/rand" "testing" @@ -53,17 +44,6 @@ const dhKeyEnc = `hQj4FKeaQDt34eO/BQe5OSk571WMQBu4YNqMQ0TFeuzjzCM9lLMuOsQhcyjZcI const lookupRequestEnc = `AKZFAoU00dRlcO7dcKfVeEdpNTmbWPNELNSZ1198xUhuo0421zGCKwttXS1q8yetg0dk3OZo50Hc09/U8o82mtWkB+0IYcgiPJxvwUH3tcf8kpfb7JNcQ2yseDO91dfpIOBUdneLSBewgvef1uvyvLeCRUK2s+x0KeabPRiUh0CbevivY/R5UTW0CUNA8VqiQHRCrlqIEKnGTvXmFmb8iTbfUsNxnyp6k7HwGrcutsZsBUsXymUL1F/g+ceZ2KXULtGnTv/wdYk5I2LVVb0UP350EWJ0gAFFZ8cxqQhXZ6337b1ZDe0yBTF8vxzHS++DDjl7TbATkvthwmWNXydlvGhGXX8lFNSYdT3OdxrHwGZ2M2lkmUw2DFHK30GqgiAulYv62pi/jzZJ8sIrcGzYPh4J7PnYE7w5IitDClbzLHXiZolEZnoLawjF62VwF8uN+68XQuJfd1xbIbzy0BqLXu/EajAU5WfEEhunoubPDXAhSLyvMIgLJLKBv5NAKeKu9gmFuAPopGPpGxouS59jtY8+MpQxUhJQa8MuKSqw5aNZW8Qoh6NilVQE0uEB7CZ4OAz3yuIml2SMYTTtKlsFw9M9bPdNzeYZeWnjWPp2rn9SH1MvQlQ2gkcmMpaRg3pvnMR/qp6MKQ0BMEBoFWIGqmEvTtw9VzAsaZzYXUi+69ZFZm/1b7F2l8k4YrANe+xx1QL86R9J5oPUR52Asi6y2vlmGiSsKotKnSdIuZ1ZAVKku9KyhzTGj2/Gqimj6+HTvnrPEsO4Dtojrt596FWvGHssTr7Dy4Wc8nslTx8tRHtqOomlCiXl6U/0pbBqcAydJ9ZocJVCP6htaMRWg7ikbSVee9RK9Wn6In5whFFCDrH+5sk92sLZvE6UXyK3fD4JV8SpypvUXUK1GaFPuni4VUPOmTxe5n7JDA0MP9WKNqRqWY86BRlBiNhp5Fg9Oq7GtrvpxxyupWg1/4ErPM5oJuJANakjwjrW/X98uEBS6uPcWVPsclh94lhq7IEsPZ54Tu4VI/EdZn7QcxXP5vaR2OAX2QCEQSL1dR3SqDqzMBGzKBsY5xwqG62hVardp0dcKpIR8rFPU1lBc30PmpnifV6Cq/kw4ViJbZgVZcw9EHX0eI4sTrVBL6STe3sBEGBLpIPhlSUVhWvifpxLCc1bF/2wmrFpf7VsvR2RI/TT6JyJZrE4nNcC+2/myen3rq70m5Fac3CpAEwzB01Ee3tWf6qET4FSxwCsRY4FU2d88TkDjsF1FGsex4l7wNn/lyBP2x3YrMfWxPv86Uej0bzl5AKgHxXQn1eXnoOJH8C/RQ2obVGdJmHfWMJ4KdJQpP7bGEK8cd7+FjPYbBhyHeiHPHN30RYgHCYFVkxwm7fjY9khmvNM8CRNRbzUHOYmtnLGPD4LYULjmLnpEfjNSATrIlSmsPagEd7hlD/3xAvOe7KwBInAuBD079TcLBEkPFdQK/WQ05Qd0Z5mDQUdSRn+wk6jdLXjUREP4PIS2u+65KBMhWXIm0AzQq/y6YA8LUoyMR16Cys0Nwmo9vtSaOAVj9l+aFI7no++ezX13S025DRy7/bKFXvFdf6aCgAe6Zqg4fHc772thixcAV6/iDgqb9VXVm7sXf9grVlL8/8qL+T3nqsF9Ozc+E90a0WQf8RkDvOHpLTjHRXBhvDxu4RjQJu0KRJG/Xc24Zs6m4t5C1FpB2TOAyjlLCAd94y+NUKGOc1edOGi03yPJeVuwABH6/BcwCNU2N9ibQpwhv2VNYmp1BSlIvQMItZ4wTSOTiefenahrGDaCYdkMYrX5kjl6XAtEub1D+JbQL4BO3rUb5tZKBqrbZ8m+k7wQHyBW0o5ndhPa2JZK2itQ4Yy/upWy0Ltc3khm0w3lq4uf9sFQX9hdzImI8ageVM3o2HXML1b/oQMmWgREZ5EMsZwugtbgXEfMNWMYvo6HD6/P/07T6Ath1BlGv+2XyVPFbqYzX+QWFzr0SGxhKbRwbB5bf8STjhMvYLKAnZqsbzA9ejEzqO4HiFLe+02sSVZ8/XkjesQF64byuNV9JsXfd1ANtYGLfRN9zR1v8KgL52UdgCobWmWiS/vUYYTBjGQ99yDEjkEcKL5WdyDQBqyhB3vPo/nhLz3odqZJs2igvHsjRM2kS7eDK53KnYfCHte2nmMc0nFKg+zebi7SbZDnmU5J6Cb1UUzhhCBZbfliUdZ1K9xIxsKycWl7KkXnTFYQxcHfIMFCGhRlQG6WJB/Bq20qzOShRxM3qwcsfv2tVX4jxtoP1KjKi54x8ikak6aRomkHbRBYrTL5RXcXUQ1dKpfVCHJCsp83y1mW4fN0W7XDN+KxKM0d/culnQF4kARJr40stDZqy5sDXA7tSAgNDH5ulnA9oj5sU9sp2a79m/hhFUVXRBB+vlqITFs4zLAIzg9B9ZgfG0+oSQwjy44HCmyj3dJUwh+PS71kIuBN1CR3xp+BtJyzbsZS1WGzl66ecCN3Cpg755Xe5H8n+k+OVx9ovjVEJ4q99C0hh7jKdwwDZssm7GM1GjjhaKViGCMI+a0rA0O7il8N2Jvt3+nykmUXnWUtrxxWaseSjau4c/RA3ENiuVSIltVCKYCRXXlBU/H4kZrlRPybmnwfqco3ItFLjpPK+Ac4oQwJCtQgYYeNqrRIxZ4Z7Mw8y5Z9zym6yAxthr6JBBp81T/okxbF+E8StxqImQiaPQS6aIIHKOy21/AYCPunmQ83HYGjWcm0Zet7IariDslA260Uz/W4nwf9FXenQkx0OcqbDwnoYb6qiQPnD+GWvN5aLwT+Ey31zE7XSHFv3cYlGNYWdP0QnDypXc7wXVWOse6WqgvB/i/5QTf6JCPOxqGW0aCFXeDbzwcz1Lw/zAeCnvDMPs1yygQQtWx6tOiDHajWTExi3TWw7kPGttzWVb9/R2e/umNFbpmrX8VILZx8sAqVFejm9lwQY7VxzcRaH5n6L+MaIMY47ktnois1G/K/aJFcI2upkDwKhRcDG6OsS1pA6J70PVi4bxfLgwEHBQb5ZOOi/S7scibTJYbazJ0YHWCcbuAj2FyjoZYss5KXiRE182NdAzqDVE8WVX5LaF6ZcMYUiN6ezeDd/oYTlHCxV3Y7yyk70kZXURB9U3DVb5f7rqmT0FA5YCG/XylqNlx+j4MDL9VP2DR0J7kCgZtwX2Gw+fJC18Sv/UNNZn6TBjhEC2ILxZLVHOI2w6sJwSrxfRNSHjGNFZNdfyRy4ry56vDjvdLGrcnr0MAUBC0W5WcW1DBe9eZBf108/9zdhpJT5AwmcfQ/WsRioxyM2MZeqHXfvi3SMXera1WDNnlsJvA/aiTv3pk9AvBwKZ2JJzrLsOUs49CBM7l7oDzal1k5dppUmCwjh8fp4azYo+mBfr2+zfVQuMBae9YnCe6xTleuV5M6j+xR44RlHT3cVjBE2/rQR2rbhgd0YH/84cT4T/1fQ8mvYk26wtXi1VQAIEGSSuFMyXBj2u/CbaPf9EwopdJm8ePH920uZiqlgKmlg0duJnWkFVNYZGF9Dy4p1R/7x3dIL67yijF35LTIOIPSmO3h826wkz+f0FPDFDRanM5MevwfdALNC8ZSpwd7AY8XauaK8UohC7v8+iQAxI8DYexdiFJzp1SnshrZ4WNIWbMhj/DK9OUfXby0HCkFydoYGCA3rag1f15P5WZMh1k6dbSUnUAQxgqDjAaWNDI5ClnIfn+EnUKyNLEpMR4K852I1u88HTQIYwe4eo3zsytu6MUeJmKC7Ku1TMyGgEUzPu7XmPA9f7p2hr47fsiQF9N5kJJ7RAD3hfx+yqwNs2SBfp3CPeQH0piTC5doAZBQXDybQUCenlZ/Dpeib5ChtjR6AWiCDDbqjueW9cPraNUb6wvx4pU+3K73uzw3M2hkcQ1UbqYBecRrDutQ6HdEL4qUuWueH7+mU4ENdYI4WIQRHixXsKYZyjn+0XmmQYLYosIFJiVYUcSRQFVszPY7DWavURxJm2c1RIdLYqo0QVu2Uohp3RysNjxx4kNqbBbq7NEdVth1bPf3DD20IGb4K9j+PnBxPiIMq9lHTXbBSARfUNNpZRu6WYr8+ahEJLazntiBrfYJ+2+EXgFa+84GSlpBVJruF2Fzls68KchXlpwAg588JoUkgapTJQtSIh/wZHm272RQ+1uQfnYtrQjlujVxl3v1/id3xliXRC5HA5ze1J2OmDGb89Io/nxyaF3nI3n7GbFyw6hY1/OtpK1CtgpnoqTZPaUp7q+DqIYhwEjv0mEMqEAnUa9sDVqj6+uOOBJ+Mk0sgnKtY+W3srXeMbk+bV8VxHR8lDvQo4J43jVQ/2zVuHmG0eU/LAOIDPFo06vFc8jlKqVnh5hInBPxGLdKf65rfksWwgGbqAGrCCt53bD2MzceLGZ4Kehse5s79cnRCkhnQvScThkv5/dp7/ieUQfFRySCaf6BmTRpfXTN4eyPJKvl5EsqwbneUZLx4BONHHyE5FtKuntJVydyzzfpug2t/3IXSroctHtqvkZrPaEDriKWsghd+y0e17ZQH2WSCMqgWoe7/+GMhGXdiRNhPpgq3EHLWNU7mTAN5mq+qhN7U5yB597HZySWct+v/UuOUdbKaSSi1w8gz/AcyrvwAQ0AHifmSN7qL0QwYzA5n23L0VV2wmfk8GnCYFr8Po0+KspZSwzGdcYQ2hVLGqIV3zjNcb5K+rkkqIgF/GiyOWkMEA8uyKmrHRMd69bIs8We+7wRRPq7I5ziufs2XT4FUg2m3tqAVBSAU+5XqKZrkQPe6XVyayorbUvdZziphaVSx6woyoZ5i1ZkdM2o0VGon40ALsYWPZBNPj+VsnaqNwcmAaMlQbjrMoOhJF15haMXVTsV7E4VHqx8opg+i0Vcu7iwZwQ5VYTg3woDvcoMk2M56OeElyggyj/kIognUNYmb1cpS+I6KDQQkqhSwSseJturcELpHuyOvbRE8K8+vlOvxUugsgur12uqcRV1txOc2ChMpRMq/Y7Y8N7EDgyBLj8Taai7hkq6IzK+ecKniWHhN1qNgIEH23gzoEVsDeDc/ErVGGEIlYs8bDA/XESppGhvfqdTquDYJEhPZ0kq3uc7kWNaP1KOJ5944z05zM5kcRQEYPS3ZNmE+m53WnH+xB0HOeGRBDiTjdqUaaqoHumj64jCPyUrybk+PPNJYEbyN2275sZahTF2k9GJjpOtKq1pJVtrOX0m7lafJVvP5AtFcU7k+6etNoHYimLCoLmwCPgjGPwciwCjZ8+hHZuknPWU/sjlcPOyThhU25f3ThOiT5VLLNPP2sTD/xwmoLV4Cii9xe2QYqpqj7S6LPdIOgzi2XGbH9IM4tW17z52M75lm4UFi1GhotEyPQA1MKLDhK/ZGf1czawPFTQ43T8SA7tqiFDzN032vEoXehBtO6sciCuBNKS6qy2fBegVAZqt8UM8yJxSdveCg==` func newTestManager(t *testing.T) (*Manager, *testNetworkManager) { - - keyData, err := utils.ReadFile(testkeys.GetNodeKeyPath()) - if err != nil { - t.Fatalf("Could not load private key: %v", err) - } - - key, err := rsa.LoadPrivateKeyFromPem(keyData) - if err != nil { - t.Fatalf("Could not load public key") - } - kv := versioned.NewKV(ekv.MakeMemstore()) udStore, err := store.NewOrLoadStore(kv) if err != nil { @@ -71,21 +51,27 @@ func newTestManager(t *testing.T) (*Manager, *testNetworkManager) { } rngGen := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG) + stream := rngGen.GetStream() + privKey, err := rsa.GenerateKey(stream, 1024) + stream.Close() // Create our Manager object + tnm := newTestNetworkManager(t) m := &Manager{ - e2e: mockE2e{grp: getGroup()}, - events: event.NewEventManager(), - user: mockUser{testing: t, key: key}, - store: udStore, - comms: &mockComms{}, - rng: rngGen, - kv: kv, + e2e: mockE2e{ + grp: getGroup(), + events: event.NewEventManager(), + rng: rngGen, + kv: kv, + network: tnm, + t: t, + key: privKey, + }, + store: udStore, + comms: &mockComms{}, } - tnm := newTestNetworkManager(t) - m.network = tnm - netDef := m.network.GetInstance().GetPartialNdf().Get() + netDef := m.getCmix().GetInstance().GetPartialNdf().Get() // Unmarshal UD ID from the NDF udID, err := id.Unmarshal(netDef.UDB.ID) if err != nil { @@ -234,184 +220,12 @@ func (receiver *mockReceiver) Callback(req *single.Request, } -// testNetworkManager is a mock implementation of the CMix interface. -type testNetworkManager struct { - requestProcess message.Processor - instance *network.Instance - testingFace interface{} - c contact.Contact - responseProcessor message.Processor -} - -func (tnm *testNetworkManager) Send(recipient *id.ID, fingerprint format.Fingerprint, - service message.Service, - payload, mac []byte, cmixParams cmix.CMIXParams) (id.Round, ephemeral.Id, error) { - msg := format.NewMessage(tnm.instance.GetE2EGroup().GetP().ByteLen()) - // Build message. Will panic if inputs are not correct. - msg.SetKeyFP(fingerprint) - msg.SetContents(payload) - msg.SetMac(mac) - msg.SetSIH(service.Hash(msg.GetContents())) - // If the recipient for a call to Send is UD, then this - // is the request pathway. Call the UD processor to simulate - // the UD picking up the request - if bytes.Equal(tnm.instance.GetFullNdf(). - Get().UDB.ID, - recipient.Bytes()) { - tnm.responseProcessor.Process(msg, receptionID.EphemeralIdentity{}, rounds.Round{}) - - } else { - // This should happen when the mock UD service Sends back a response. - // Calling process mocks up the requester picking up the response. - tnm.requestProcess.Process(msg, receptionID.EphemeralIdentity{}, rounds.Round{}) - } - - return 0, ephemeral.Id{}, nil -} - -func (tnm *testNetworkManager) AddFingerprint(identity *id.ID, - fingerprint format.Fingerprint, mp message.Processor) error { - // AddFingerprint gets called in both the request and response - // code-paths. We only want to set in the code-path transmitting - // from UD - if !bytes.Equal(tnm.instance.GetFullNdf().Get().UDB.ID, - identity.Bytes()) { - tnm.requestProcess = mp - } - - return nil -} - -func (tnm *testNetworkManager) AddService(clientID *id.ID, - newService message.Service, - response message.Processor) { - tnm.responseProcessor = response - return -} - -func (tnm *testNetworkManager) CheckInProgressMessages() { - return -} - -func (tnm *testNetworkManager) GetMaxMessageLength() int { - return 700 -} - -func (tnm *testNetworkManager) AddIdentity(id *id.ID, validUntil time.Time, persistent bool) { - return -} +type mockReporter struct{} -func (tnm *testNetworkManager) DeleteClientFingerprints(identity *id.ID) { +func (m mockReporter) Report(priority int, category, evtType, details string) { return } -func (tnm *testNetworkManager) Process(ecrMsg format.Message, - receptionID receptionID.EphemeralIdentity, round rounds.Round) { - -} - -func (tnm *testNetworkManager) String() string { - return "mockPRocessor" -} - -func (tnm *testNetworkManager) DeleteService(clientID *id.ID, toDelete message.Service, processor message.Processor) { - return -} - -func (tnm *testNetworkManager) IsHealthy() bool { - return true -} - -func (tnm *testNetworkManager) SendToAny(sendFunc func(host *connect.Host) (interface{}, error), stop *stoppable.Single) (interface{}, error) { - //TODO implement me - panic("implement me") -} - -func (tnm *testNetworkManager) GetAddressSpace() uint8 { - return 8 -} - -func (tnm *testNetworkManager) GetInstance() *network.Instance { - return tnm.instance -} - -type mockUserStore struct{} - -func (m mockUserStore) PortableUserInfo() user.Info { - //TODO implement me - panic("implement me") -} - -func (m mockUserStore) GetUsername() (string, error) { - //TODO implement me - panic("implement me") -} - -func (m mockUserStore) GetReceptionRegistrationValidationSignature() []byte { - //TODO implement me - panic("implement me") -} - -type mockComms struct { - udHost *connect.Host -} - -func (m mockComms) SendRegisterUser(host *connect.Host, message *pb.UDBUserRegistration) (*messages.Ack, error) { - //TODO implement me - panic("implement me") -} - -func (m mockComms) SendRegisterFact(host *connect.Host, message *pb.FactRegisterRequest) (*pb.FactRegisterResponse, error) { - //TODO implement me - panic("implement me") -} - -func (m mockComms) SendConfirmFact(host *connect.Host, message *pb.FactConfirmRequest) (*messages.Ack, error) { - //TODO implement me - panic("implement me") -} - -func (m mockComms) SendRemoveFact(host *connect.Host, message *pb.FactRemovalRequest) (*messages.Ack, error) { - //TODO implement me - panic("implement me") -} - -func (m mockComms) SendRemoveUser(host *connect.Host, message *pb.FactRemovalRequest) (*messages.Ack, error) { - //TODO implement me - panic("implement me") -} - -func (m *mockComms) AddHost(hid *id.ID, address string, cert []byte, params connect.HostParams) (host *connect.Host, err error) { - h, err := connect.NewHost(hid, address, cert, params) - if err != nil { - return nil, err - } - - m.udHost = h - return h, nil -} - -func (m mockComms) GetHost(hostId *id.ID) (*connect.Host, bool) { - return m.udHost, true -} - -type mockE2e struct { - grp *cyclic.Group -} - -func (m mockE2e) GetHistoricalDHPubkey() *cyclic.Int { - return m.grp.NewInt(6) -} - -func (m mockE2e) GetReceptionID() *id.ID { - //TODO implement me - panic("implement me") -} - -func (m mockE2e) GetGroup() *cyclic.Group { - return getGroup() -} - type mockResponse struct { c []contact.Contact err error diff --git a/xxdk/backup.go b/xxdk/backup.go index 6b02e9ad5635a3984c485487a6c714eacc003f62..f6bbf690545e94ac15fc04670cf0cd02af9101da 100644 --- a/xxdk/backup.go +++ b/xxdk/backup.go @@ -8,6 +8,10 @@ package xxdk import "sync" +// TriggerBackup function is called to start a backup. The reason is used for +// logging purposes and should describe the event that triggered a backup. +// +// For example, the reason can say "contact added" when a new contact is saved. type TriggerBackup func(reason string) // Container contains the trigger to call to initiate a backup. diff --git a/xxdk/cmix.go b/xxdk/cmix.go index 54aa051cbd8c22b0e7205e7e3c4d06822d5c5c39..d490fcb3ad2ec7a639def1f3c597d21985ec4ebc 100644 --- a/xxdk/cmix.go +++ b/xxdk/cmix.go @@ -38,22 +38,23 @@ import ( const followerStoppableName = "client" type Cmix struct { - //generic RNG for client + // Generic RNG for client rng *fastRNG.StreamGenerator - // the storage session securely stores data to disk and memoizes as is + + // The storage session securely stores data to disk and memoizes as is // appropriate storage storage.Session - //Low level comms object + // Low level comms object comms *client.Comms - //facilitates sane communications with cMix + // Facilitates sane communications with cMix network cmix.Client - //object used to register and communicate with permissioning + // Object used to register and communicate with permissioning permissioning *registration.Registration - //services system to track running threads + // Services system to track running threads followerServices *services clientErrorChannel chan interfaces.ClientError @@ -61,15 +62,14 @@ type Cmix struct { events *event.Manager } -// NewCmix creates client storage, generates keys, connects, and registers +// NewCmix creates client storage, generates keys, and connects and registers // with the network. Note that this does not register a username/identity, but -// merely creates a new cryptographic identity for adding such information -// at a later date. -func NewCmix(ndfJSON, storageDir string, password []byte, - registrationCode string) error { +// merely creates a new cryptographic identity for adding such information at a +// later date. +func NewCmix( + ndfJSON, storageDir string, password []byte, registrationCode string) error { jww.INFO.Printf("NewCmix(dir: %s)", storageDir) - rngStreamGen := fastRNG.NewStreamGenerator(12, 1024, - csprng.NewSystemRNG) + rngStreamGen := fastRNG.NewStreamGenerator(12, 1024, csprng.NewSystemRNG) def, err := ParseNDF(ndfJSON) if err != nil { @@ -78,26 +78,25 @@ func NewCmix(ndfJSON, storageDir string, password []byte, cmixGrp, e2eGrp := DecodeGroups(def) start := netTime.Now() - protoUser := createNewUser(rngStreamGen) - jww.DEBUG.Printf("PortableUserInfo generation took: %s", - netTime.Now().Sub(start)) + userInfo := createNewUser(rngStreamGen, e2eGrp) + jww.DEBUG.Printf( + "PortableUserInfo generation took: %s", netTime.Now().Sub(start)) _, err = CheckVersionAndSetupStorage(def, storageDir, password, - protoUser, cmixGrp, e2eGrp, registrationCode) + userInfo, cmixGrp, e2eGrp, registrationCode) return err } -// NewVanityClient creates a user with a receptionID that starts with -// the supplied prefix It creates client storage, generates keys, -// connects, and registers with the network. Note that this does not -// register a username/identity, but merely creates a new -// cryptographic identity for adding such information at a later date. +// NewVanityClient creates a user with a receptionID that starts with the +// supplied prefix. It creates client storage, generates keys, and connects and +// registers with the network. Note that this does not register a username/ +// identity, but merely creates a new cryptographic identity for adding such +// information at a later date. func NewVanityClient(ndfJSON, storageDir string, password []byte, registrationCode string, userIdPrefix string) error { jww.INFO.Printf("NewVanityClient()") - rngStreamGen := fastRNG.NewStreamGenerator(12, 1024, - csprng.NewSystemRNG) + rngStreamGen := fastRNG.NewStreamGenerator(12, 1024, csprng.NewSystemRNG) rngStream := rngStreamGen.GetStream() def, err := ParseNDF(ndfJSON) @@ -106,11 +105,10 @@ func NewVanityClient(ndfJSON, storageDir string, password []byte, } cmixGrp, e2eGrp := DecodeGroups(def) - protoUser := createNewVanityUser(rngStream, cmixGrp, e2eGrp, - userIdPrefix) + userInfo := createNewVanityUser(rngStream, e2eGrp, userIdPrefix) _, err = CheckVersionAndSetupStorage(def, storageDir, password, - protoUser, cmixGrp, e2eGrp, registrationCode) + userInfo, cmixGrp, e2eGrp, registrationCode) if err != nil { return err } @@ -118,25 +116,22 @@ func NewVanityClient(ndfJSON, storageDir string, password []byte, return nil } -// OpenCmix session, but don't connect to the network or log in -// NOTE: This is a helper function that, in most applications, should not be used on its own -// Consider using LoadCmix instead, which calls this function for you. -func OpenCmix(storageDir string, password []byte, - parameters Params) (*Cmix, error) { +// OpenCmix creates client storage but does not connect to the network or login. +// Note that this is a helper function that, in most applications, should not be +// used on its own. Consider using LoadCmix instead, which calls this function +// for you. +func OpenCmix(storageDir string, password []byte) (*Cmix, error) { jww.INFO.Printf("OpenCmix()") - rngStreamGen := fastRNG.NewStreamGenerator(12, 1024, - csprng.NewSystemRNG) + rngStreamGen := fastRNG.NewStreamGenerator(12, 1024, csprng.NewSystemRNG) currentVersion, err := version.ParseVersion(SEMVER) if err != nil { - return nil, errors.WithMessage(err, - "Could not parse version string.") + return nil, errors.WithMessage(err, "Could not parse version string.") } passwordStr := string(password) - storageSess, err := storage.Load(storageDir, passwordStr, - currentVersion) + storageSess, err := storage.Load(storageDir, passwordStr, currentVersion) if err != nil { return nil, err } @@ -160,7 +155,7 @@ func OpenCmix(storageDir string, password []byte, } // NewProtoClient_Unsafe initializes a client object from a JSON containing -// predefined cryptographic which defines a user. This is designed for some +// predefined cryptographic that defines a user. This is designed for some // specific deployment procedures and is generally unsafe. func NewProtoClient_Unsafe(ndfJSON, storageDir string, password []byte, protoUser *user.Proto) error { @@ -174,9 +169,8 @@ func NewProtoClient_Unsafe(ndfJSON, storageDir string, password []byte, } cmixGrp, e2eGrp := DecodeGroups(def) - - storageSess, err := CheckVersionAndSetupStorage(def, storageDir, - password, usr, cmixGrp, e2eGrp, protoUser.RegCode) + storageSess, err := CheckVersionAndSetupStorage( + def, storageDir, password, usr, cmixGrp, e2eGrp, protoUser.RegCode) if err != nil { return err } @@ -187,10 +181,9 @@ func NewProtoClient_Unsafe(ndfJSON, storageDir string, password []byte, protoUser.TransmissionRegValidationSig) storageSess.SetRegistrationTimestamp(protoUser.RegistrationTimestamp) - // move the registration state to indicate registered with - // registration on proto client - err = storageSess.ForwardRegistrationStatus( - storage.PermissioningComplete) + // Move the registration state to indicate registered with registration on + // roto client + err = storageSess.ForwardRegistrationStatus(storage.PermissioningComplete) if err != nil { return err } @@ -198,27 +191,29 @@ func NewProtoClient_Unsafe(ndfJSON, storageDir string, password []byte, return nil } -// LoadCmix initializes a Cmix object from existing storage and starts the network -func LoadCmix(storageDir string, password []byte, parameters Params) (*Cmix, error) { +// LoadCmix initializes a Cmix object from existing storage and starts the +// network. +func LoadCmix(storageDir string, password []byte, parameters CMIXParams) ( + *Cmix, error) { jww.INFO.Printf("LoadCmix()") - c, err := OpenCmix(storageDir, password, parameters) + c, err := OpenCmix(storageDir, password) if err != nil { return nil, err } - c.network, err = cmix.NewClient(parameters.CMix, c.comms, c.storage, - c.rng, c.events) + c.network, err = cmix.NewClient( + parameters.Network, c.comms, c.storage, c.rng, c.events) if err != nil { return nil, err } - jww.INFO.Printf("Cmix Logged in: \n\tTransmissionID: %s "+ - "\n\tReceptionID: %s", c.storage.GetTransmissionID(), c.storage.GetReceptionID()) + jww.INFO.Printf( + "Client loaded: \n\tTransmissionID: %s", c.GetTransmissionIdentity().ID) def := c.storage.GetNDF() - //initialize registration + // initialize registration. if def.Registration.Address != "" { err = c.initPermissioning(def) if err != nil { @@ -240,8 +235,7 @@ func LoadCmix(storageDir string, password []byte, parameters Params) (*Cmix, err def.Notification.Address, []byte(def.Notification.TlsCertificate), hp) if err != nil { - jww.WARN.Printf("Failed adding host for "+ - "notifications: %+v", err) + jww.WARN.Printf("Failed adding host for notifications: %+v", err) } } @@ -256,14 +250,15 @@ func LoadCmix(storageDir string, password []byte, parameters Params) (*Cmix, err func (c *Cmix) initComms() error { var err error - //get the user from session - privKey := c.storage.GetTransmissionRSA() + // get the user from session + transmissionIdentity := c.GetTransmissionIdentity() + privKey := transmissionIdentity.RSAPrivatePem pubPEM := rsa.CreatePublicKeyPem(privKey.GetPublic()) privPEM := rsa.CreatePrivateKeyPem(privKey) - //start comms - c.comms, err = client.NewClientComms(c.storage.GetTransmissionID(), - pubPEM, privPEM, c.storage.GetTransmissionSalt()) + // start comms + c.comms, err = client.NewClientComms(transmissionIdentity.ID, + pubPEM, privPEM, transmissionIdentity.Salt) if err != nil { return errors.WithMessage(err, "failed to load client") } @@ -272,34 +267,30 @@ func (c *Cmix) initComms() error { func (c *Cmix) initPermissioning(def *ndf.NetworkDefinition) error { var err error - //initialize registration + // Initialize registration c.permissioning, err = registration.Init(c.comms, def) if err != nil { - return errors.WithMessage(err, "failed to init "+ - "permissioning handler") + return errors.WithMessage(err, "failed to init permissioning handler") } - //register with registration if necessary + // Register with registration if necessary if c.storage.GetRegistrationStatus() == storage.KeyGenComplete { - jww.INFO.Printf("Cmix has not registered yet, " + - "attempting registration") + jww.INFO.Printf("Cmix has not registered yet, attempting registration") err = c.registerWithPermissioning() if err != nil { - jww.ERROR.Printf("Cmix has failed registration: %s", - err) + jww.ERROR.Printf("Cmix has failed registration: %s", err) return errors.WithMessage(err, "failed to load client") } - jww.INFO.Printf("Cmix successfully registered " + - "with the network") + jww.INFO.Printf("Cmix successfully registered with the network") } + return nil } -// registerFollower adds the follower processes to the client's -// follower service list. -// This should only ever be called once +// registerFollower adds the follower processes to the client's follower service +// list. This should only ever be called once. func (c *Cmix) registerFollower() error { - //build the error callback + // Build the error callback cer := func(source, message, trace string) { select { case c.clientErrorChannel <- interfaces.ClientError{ @@ -308,8 +299,8 @@ func (c *Cmix) registerFollower() error { Trace: trace, }: default: - jww.WARN.Printf("Failed to notify about ClientError "+ - "from %s: %s", source, message) + jww.WARN.Printf("Failed to notify about ClientError from %s: %s", + source, message) } } @@ -318,71 +309,72 @@ func (c *Cmix) registerFollower() error { return errors.WithMessage(err, "Couldn't start event reporting") } - //register the core follower service + // Register the core follower service err = c.followerServices.add(func() (stoppable.Stoppable, error) { return c.network.Follow(cer) }) if err != nil { - return errors.WithMessage(err, "Failed to start following "+ - "the network") + return errors.WithMessage(err, "Failed to start following the network") } return nil } -// ----- Cmix Functions ----- +//////////////////////////////////////////////////////////////////////////////// +// Cmix Functions // +//////////////////////////////////////////////////////////////////////////////// -// GetErrorsChannel returns a channel which passes errors from the -// long-running threads controlled by StartNetworkFollower and -// StopNetworkFollower +// GetErrorsChannel returns a channel that passes errors from the long-running +// threads controlled by StartNetworkFollower and StopNetworkFollower. func (c *Cmix) GetErrorsChannel() <-chan interfaces.ClientError { return c.clientErrorChannel } -// StartNetworkFollower kicks off the tracking of the network. It starts -// long running network client threads and returns an object for checking -// state and stopping those threads. -// Call this when returning from sleep and close when going back to -// sleep. +// StartNetworkFollower kicks off the tracking of the network. It starts long- +// running network client threads and returns an object for checking state and +// stopping those threads. +// +// Call this when returning from sleep and close when going back to sleep. +// // These threads may become a significant drain on battery when offline, ensure -// they are stopped if there is no internet access +// they are stopped if there is no internet access. +// // Threads Started: // - Network Follower (/network/follow.go) -// tracks the network events and hands them off to workers for handling +// tracks the network events and hands them off to workers for handling. // - Historical Round Retrieval (/network/rounds/historical.go) -// Retrieves data about rounds which are too old to be -// stored by the client +// retrieves data about rounds that are too old to be stored by the client. // - Message Retrieval Worker Group (/network/rounds/retrieve.go) -// Requests all messages in a given round from the -// gateway of the last nodes +// requests all messages in a given round from the gateway of the last +// nodes. // - Message Handling Worker Group (/network/message/handle.go) -// Decrypts and partitions messages when signals via the -// Switchboard -// - health Tracker (/network/health) -// Via the network instance tracks the state of the network +// decrypts and partitions messages when signals via the Switchboard. +// - Health Tracker (/network/health), +// via the network instance, tracks the state of the network. // - Garbled Messages (/network/message/garbled.go) -// Can be signaled to check all recent messages which -// could be be decoded Uses a message store on disk for -// persistence +// can be signaled to check all recent messages that could be decoded. It +// uses a message store on disk for persistence. // - Critical Messages (/network/message/critical.go) -// Ensures all protocol layer mandatory messages are sent -// Uses a message store on disk for persistence +// ensures all protocol layer mandatory messages are sent. It uses a +// message store on disk for persistence. // - KeyExchange Trigger (/keyExchange/trigger.go) -// Responds to sent rekeys and executes them +// responds to sent rekeys and executes them. // - KeyExchange Confirm (/keyExchange/confirm.go) -// Responds to confirmations of successful rekey operations +// responds to confirmations of successful rekey operations. // - Auth Callback (/auth/callback.go) -// Handles both auth confirm and requests +// handles both auth confirm and requests. func (c *Cmix) StartNetworkFollower(timeout time.Duration) error { - jww.INFO.Printf("StartNetworkFollower() \n\tTransmissionID: %s "+ - "\n\tReceptionID: %s", c.storage.GetTransmissionID(), c.storage.GetReceptionID()) + jww.INFO.Printf( + "StartNetworkFollower() \n\tTransmissionID: %s \n\tReceptionID: %s", + c.storage.GetTransmissionID(), c.storage.GetReceptionID()) return c.followerServices.start(timeout) } -// StopNetworkFollower stops the network follower if it is running. -// It returns errors if the Follower is in the wrong state to stop or if it -// fails to stop it. +// StopNetworkFollower stops the network follower if it is running. It returns +// an error if the follower is in the wrong state to stop or if it fails to stop +// it. +// // if the network follower is running and this fails, the client object will // most likely be in an unrecoverable state and need to be trashed. func (c *Cmix) StopNetworkFollower() error { @@ -390,71 +382,71 @@ func (c *Cmix) StopNetworkFollower() error { return c.followerServices.stop() } -// NetworkFollowerStatus Gets the state of the network follower. Returns: -// Stopped - 0 -// Running - 2000 -// Stopping - 3000 +// NetworkFollowerStatus gets the state of the network follower. It returns a +// status with the following values: +// Stopped - 0 +// Running - 2000 +// Stopping - 3000 func (c *Cmix) NetworkFollowerStatus() Status { jww.INFO.Printf("NetworkFollowerStatus()") return c.followerServices.status() } -// HasRunningProcessies checks if any background threads are running -// and returns true if one or more are +// HasRunningProcessies checks if any background threads are running and returns +// true if one or more are. func (c *Cmix) HasRunningProcessies() bool { return !c.followerServices.stoppable.IsStopped() } -// RegisterRoundEventsCb registers a callback for round -// events. +// GetRoundEvents registers a callback for round events. func (c *Cmix) GetRoundEvents() interfaces.RoundEvents { jww.INFO.Printf("GetRoundEvents()") - jww.WARN.Printf("GetRoundEvents does not handle Cmix Errors " + - "edge case!") + jww.WARN.Printf("GetRoundEvents does not handle Cmix Errors edge case!") return c.network.GetInstance().GetRoundEvents() } -// AddService adds a service ot be controlled by the client thread control, -// these will be started and stopped with the network follower +// AddService adds a service to be controlled by the client thread control. +// These will be started and stopped with the network follower. func (c *Cmix) AddService(sp Service) error { return c.followerServices.add(sp) } -// GetTransmissionIdentity returns the current TransmissionIdentity for this client +// GetTransmissionIdentity returns the current TransmissionIdentity for this +// client. func (c *Cmix) GetTransmissionIdentity() TransmissionIdentity { jww.INFO.Printf("GetTransmissionIdentity()") cMixUser := c.storage.PortableUserInfo() return buildTransmissionIdentity(cMixUser) } -// GetComms returns the client comms object +// GetComms returns the client comms object. func (c *Cmix) GetComms() *client.Comms { return c.comms } -// GetRng returns the client rng object +// GetRng returns the client RNG object. func (c *Cmix) GetRng() *fastRNG.StreamGenerator { return c.rng } -// GetStorage returns the client storage object +// GetStorage returns the client storage object. func (c *Cmix) GetStorage() storage.Session { return c.storage } -// GetCmix returns the client Network Interface +// GetCmix returns the client network interface. func (c *Cmix) GetCmix() cmix.Client { return c.network } -// GetEventReporter returns the event reporter +// GetEventReporter returns the event reporter. func (c *Cmix) GetEventReporter() event.Reporter { return c.events } // GetNodeRegistrationStatus gets the current state of nodes registration. It -// returns the total number of nodes in the NDF and the number of those which -// are currently registers with. An error is returned if the network is not +// returns the total number of nodes in the NDF and the number of those that are +// currently registered with. An error is returned if the network is not // healthy. func (c *Cmix) GetNodeRegistrationStatus() (int, int, error) { // Return an error if the network is not healthy @@ -470,8 +462,8 @@ func (c *Cmix) GetNodeRegistrationStatus() (int, int, error) { for i, n := range nodes { nid, err := id.Unmarshal(n.ID) if err != nil { - return 0, 0, errors.Errorf("Failed to unmarshal nodes "+ - "ID %v (#%d): %s", n.ID, i, err.Error()) + return 0, 0, errors.Errorf( + "Failed to unmarshal nodes ID %v (#%d): %s", n.ID, i, err.Error()) } if n.Status == ndf.Stale { numStale += 1 @@ -482,18 +474,18 @@ func (c *Cmix) GetNodeRegistrationStatus() (int, int, error) { } } - // get the number of in progress nodes registrations + // Get the number of in progress nodes registrations return numRegistered, len(nodes) - numStale, nil } // GetPreferredBins returns the geographic bin or bins that the provided two // character country code is a part of. func (c *Cmix) GetPreferredBins(countryCode string) ([]string, error) { - // get the bin that the country is in + // Get the bin that the country is in bin, exists := region.GetCountryBin(countryCode) if !exists { - return nil, errors.Errorf("failed to find geographic bin "+ - "for country %q", countryCode) + return nil, errors.Errorf( + "failed to find geographic bin for country %q", countryCode) } // Add bin to list of geographic bins @@ -527,12 +519,15 @@ func (c *Cmix) GetPreferredBins(countryCode string) ([]string, error) { return bins, nil } -// ----- Utility Functions ----- -// ParseNDF parses the initial ndf string for the client. do not check the -// signature, it is deprecated. +//////////////////////////////////////////////////////////////////////////////// +// Utility Functions // +//////////////////////////////////////////////////////////////////////////////// + +// ParseNDF parses the initial NDF string for the client. This function does not +// check the signature; it is deprecated. func ParseNDF(ndfString string) (*ndf.NetworkDefinition, error) { if ndfString == "" { - return nil, errors.New("ndf file empty") + return nil, errors.New("NDF file empty") } netDef, err := ndf.Unmarshal([]byte(ndfString)) @@ -543,15 +538,15 @@ func ParseNDF(ndfString string) (*ndf.NetworkDefinition, error) { return netDef, nil } -// DecodeGroups returns the e2e and cmix groups from the ndf +// DecodeGroups returns the E2E and cMix groups from the NDF. func DecodeGroups(ndf *ndf.NetworkDefinition) (cmixGrp, e2eGrp *cyclic.Group) { largeIntBits := 16 - //Generate the cmix group + // Generate the cMix group cmixGrp = cyclic.NewGroup( large.NewIntFromString(ndf.CMIX.Prime, largeIntBits), large.NewIntFromString(ndf.CMIX.Generator, largeIntBits)) - //Generate the e2e group + // Generate the e2e group e2eGrp = cyclic.NewGroup( large.NewIntFromString(ndf.E2E.Prime, largeIntBits), large.NewIntFromString(ndf.E2E.Generator, largeIntBits)) @@ -559,23 +554,21 @@ func DecodeGroups(ndf *ndf.NetworkDefinition) (cmixGrp, e2eGrp *cyclic.Group) { return cmixGrp, e2eGrp } -// CheckVersionAndSetupStorage is common code shared by NewCmix, -// NewPrecannedClient and NewVanityClient it checks client version and -// creates a new storage for user data -func CheckVersionAndSetupStorage(def *ndf.NetworkDefinition, - storageDir string, password []byte, protoUser user.Info, - cmixGrp, e2eGrp *cyclic.Group, registrationCode string) ( - storage.Session, error) { - // get current client version +// CheckVersionAndSetupStorage checks the client version and creates a new +// storage for user data. This function is common code shared by NewCmix, +//// NewPrecannedClient and NewVanityClient. +func CheckVersionAndSetupStorage(def *ndf.NetworkDefinition, storageDir string, + password []byte, userInfo user.Info, cmixGrp, e2eGrp *cyclic.Group, + registrationCode string) (storage.Session, error) { + // Get current client version currentVersion, err := version.ParseVersion(SEMVER) if err != nil { - return nil, errors.WithMessage(err, - "Could not parse version string.") + return nil, errors.WithMessage(err, "Could not parse version string.") } - // Create Storage + // Create storage passwordStr := string(password) - storageSess, err := storage.New(storageDir, passwordStr, protoUser, + storageSess, err := storage.New(storageDir, passwordStr, userInfo, currentVersion, cmixGrp, e2eGrp) if err != nil { return nil, err @@ -584,14 +577,15 @@ func CheckVersionAndSetupStorage(def *ndf.NetworkDefinition, // Save NDF to be used in the future storageSess.SetNDF(def) - //store the registration code for later use + // Store the registration code for later use storageSess.SetRegCode(registrationCode) - //move the registration state to keys generated + + // Move the registration state to keys generated err = storageSess.ForwardRegistrationStatus(storage.KeyGenComplete) if err != nil { - return nil, errors.WithMessage(err, "Failed to denote state "+ - "change in session") + return nil, errors.WithMessage( + err, "Failed to denote state change in session") } return storageSess, nil diff --git a/xxdk/compress_test.go b/xxdk/compress_test.go index 75d020eebdd4efb15be25326c248e4f6b17834da..3361115fb8dca117c27e94dfa5dff4a6854955ad 100644 --- a/xxdk/compress_test.go +++ b/xxdk/compress_test.go @@ -11,7 +11,8 @@ import ( "testing" ) -// Test compressing an image that is small enough to not need compressed +// TestCompressJpeg_TooSmall tests compressing an image that is small enough to +// not need to be compressed. func TestCompressJpeg_TooSmall(t *testing.T) { testImg := []byte{255, 216, 255, 219, 0, 132, 0, 8, 6, 6, 7, 6, 5, 8, 7, 7, 7, 9, 9, 8, 10, 12, 20, 13, 12, 11, 11, 12, 25, 18, 19, 15, 20, 29, 26, 31, 30, 29, 26, 28, 28, 32, 36, 46, 39, 32, 34, 44, 35, 28, 28, 40, 55, 41, 44, 48, 49, 52, 52, 52, 31, 39, 57, 61, 56, 50, 60, 46, 51, 52, 50, 1, 9, 9, 9, 12, 11, 12, 24, 13, 13, 24, 50, 33, 28, 33, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 255, 192, 0, 11, 8, 1, 0, 1, 0, 1, 1, 17, 0, 255, 196, 0, 210, 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 16, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125, 1, 2, 3, 0, 4, 17, 5, 18, 33, 49, 65, 6, 19, 81, 97, 7, 34, 113, 20, 50, 129, 145, 161, 8, 35, 66, 177, 193, 21, 82, 209, 240, 36, 51, 98, 114, 130, 9, 10, 22, 23, 24, 25, 26, 37, 38, 39, 40, 41, 42, 52, 53, 54, 55, 56, 57, 58, 67, 68, 69, 70, 71, 72, 73, 74, 83, 84, 85, 86, 87, 88, 89, 90, 99, 100, 101, 102, 103, 104, 105, 106, 115, 116, 117, 118, 119, 120, 121, 122, 131, 132, 133, 134, 135, 136, 137, 138, 146, 147, 148, 149, 150, 151, 152, 153, 154, 162, 163, 164, 165, 166, 167, 168, 169, 170, 178, 179, 180, 181, 182, 183, 184, 185, 186, 194, 195, 196, 197, 198, 199, 200, 201, 202, 210, 211, 212, 213, 214, 215, 216, 217, 218, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 255, 218, 0, 8, 1, 1, 0, 0, 63, 0, 240, 74, 40, 162, 150, 140, 82, 226, 138, 41, 104, 197, 24, 165, 197, 24, 163, 20, 184, 164, 164, 163, 20, 82, 81, 70, 40, 197, 33, 20, 82, 81, 69, 20, 81, 69, 20, 81, 75, 75, 69, 45, 24, 165, 28, 81, 75, 138, 83, 70, 40, 197, 24, 52, 98, 147, 20, 164, 82, 98, 144, 138, 76, 81, 69, 33, 162, 144, 138, 74, 40, 162, 138, 40, 162, 150, 151, 20, 82, 226, 148, 82, 208, 5, 46, 41, 113, 75, 138, 92, 123, 81, 138, 54, 210, 17, 70, 218, 76, 81, 138, 66, 41, 8, 164, 164, 52, 82, 80, 69, 54, 138, 40, 162, 138, 41, 69, 45, 20, 180, 180, 160, 82, 226, 156, 5, 45, 40, 20, 184, 165, 217, 64, 94, 104, 43, 73, 183, 52, 109, 160, 173, 55, 109, 4, 113, 77, 35, 2, 144, 138, 105, 160, 210, 82, 81, 77, 197, 20, 81, 69, 46, 40, 165, 165, 237, 64, 167, 129, 75, 138, 118, 40, 2, 157, 183, 52, 240, 180, 161, 14, 41, 193, 104, 217, 138, 82, 188, 112, 41, 10, 241, 210, 144, 143, 173, 33, 83, 77, 219, 237, 72, 87, 2, 153, 138, 66, 180, 210, 41, 8, 166, 154, 41, 41, 40, 164, 52, 80, 41, 212, 82, 209, 78, 3, 138, 120, 20, 160, 83, 128, 167, 5, 169, 2, 140, 80, 171, 205, 74, 19, 138, 120, 136, 158, 198, 156, 45, 156, 142, 20, 254, 85, 34, 217, 200, 71, 220, 63, 145, 164, 251, 36, 152, 251, 135, 242, 166, 53, 179, 142, 168, 127, 42, 141, 163, 97, 212, 26, 140, 161, 6, 154, 70, 106, 61, 180, 133, 105, 132, 83, 72, 166, 210, 26, 78, 212, 134, 146, 146, 138, 94, 134, 148, 81, 74, 41, 192, 83, 128, 167, 129, 78, 11, 79, 11, 237, 82, 4, 20, 245, 67, 233, 86, 162, 179, 121, 58, 41, 252, 171, 86, 211, 66, 150, 108, 124, 188, 125, 43, 106, 15, 12, 130, 49, 183, 7, 215, 21, 167, 31, 135, 34, 85, 198, 193, 249, 85, 132, 208, 34, 11, 130, 131, 242, 160, 232, 16, 244, 242, 199, 229, 85, 230, 240, 244, 77, 199, 150, 63, 42, 206, 184, 240, 202, 55, 69, 199, 225, 88, 87, 90, 4, 177, 31, 149, 107, 30, 107, 87, 136, 252, 202, 127, 42, 172, 83, 28, 117, 166, 17, 138, 137, 151, 154, 105, 20, 210, 41, 184, 166, 145, 205, 37, 24, 163, 20, 218, 112, 162, 138, 112, 20, 224, 41, 224, 113, 78, 3, 21, 42, 253, 41, 225, 121, 171, 17, 66, 206, 120, 6, 183, 52, 253, 21, 229, 33, 156, 87, 87, 99, 160, 32, 229, 151, 143, 165, 116, 22, 250, 114, 170, 128, 170, 0, 171, 241, 217, 40, 237, 86, 22, 203, 29, 169, 255, 0, 99, 24, 206, 41, 5, 152, 29, 169, 175, 100, 61, 42, 180, 150, 0, 245, 21, 70, 125, 53, 91, 248, 107, 3, 80, 208, 34, 149, 78, 16, 103, 233, 92, 126, 161, 160, 203, 1, 44, 131, 138, 195, 146, 34, 167, 144, 69, 87, 101, 230, 152, 195, 2, 153, 142, 41, 152, 166, 154, 67, 73, 70, 105, 41, 69, 45, 0, 83, 192, 167, 118, 167, 142, 148, 240, 42, 69, 7, 117, 90, 130, 3, 35, 0, 43, 171, 209, 244, 98, 248, 37, 107, 180, 178, 210, 214, 53, 233, 91, 48, 218, 0, 7, 21, 161, 5, 167, 168, 171, 73, 108, 181, 48, 183, 29, 133, 63, 236, 227, 29, 40, 54, 217, 237, 81, 181, 182, 42, 25, 45, 242, 58, 85, 87, 180, 246, 170, 83, 90, 142, 114, 181, 139, 121, 167, 171, 169, 5, 107, 138, 213, 116, 12, 51, 20, 90, 228, 110, 32, 104, 100, 100, 35, 21, 85, 214, 163, 43, 129, 76, 34, 154, 69, 48, 138, 74, 13, 37, 45, 46, 41, 64, 167, 10, 120, 233, 82, 40, 24, 169, 20, 123, 85, 152, 34, 46, 224, 87, 91, 162, 104, 161, 200, 119, 28, 215, 123, 99, 96, 177, 160, 218, 5, 109, 65, 108, 7, 106, 209, 138, 1, 233, 86, 227, 128, 84, 203, 5, 88, 142, 1, 138, 119, 217, 232, 17, 123, 83, 90, 10, 137, 161, 24, 170, 210, 65, 237, 84, 230, 182, 226, 179, 110, 109, 70, 43, 18, 246, 203, 114, 244, 174, 19, 196, 58, 62, 51, 42, 14, 107, 144, 154, 45, 164, 131, 85, 153, 106, 54, 168, 205, 52, 210, 26, 74, 13, 20, 162, 156, 5, 61, 105, 224, 84, 138, 42, 116, 94, 107, 160, 209, 116, 214, 184, 149, 73, 233, 94, 141, 166, 88, 44, 81, 168, 197, 116, 54, 246, 224, 10, 211, 130, 26, 208, 142, 14, 42, 212, 113, 99, 181, 78, 177, 10, 144, 69, 222, 165, 72, 233, 166, 32, 5, 55, 96, 244, 168, 154, 33, 80, 201, 30, 23, 165, 82, 154, 63, 106, 161, 60, 57, 24, 172, 187, 155, 126, 51, 92, 254, 163, 102, 178, 35, 41, 29, 107, 206, 53, 205, 52, 219, 76, 216, 28, 30, 107, 157, 113, 140, 130, 59, 212, 44, 42, 35, 72, 69, 52, 138, 109, 6, 138, 112, 167, 10, 122, 212, 130, 165, 65, 87, 108, 225, 50, 202, 170, 43, 209, 52, 29, 63, 202, 141, 11, 122, 87, 101, 109, 14, 2, 214, 197, 188, 92, 86, 140, 17, 85, 248, 163, 226, 172, 172, 89, 171, 11, 13, 72, 177, 128, 113, 74, 87, 7, 2, 156, 34, 4, 84, 102, 48, 42, 38, 142, 162, 146, 58, 171, 36, 64, 85, 9, 226, 218, 107, 54, 120, 178, 107, 30, 242, 29, 192, 241, 92, 134, 189, 167, 9, 224, 113, 143, 155, 21, 230, 183, 112, 152, 101, 100, 61, 65, 53, 77, 199, 173, 66, 194, 152, 105, 166, 155, 69, 45, 40, 167, 10, 112, 169, 86, 167, 140, 116, 174, 139, 65, 181, 243, 102, 83, 218, 189, 43, 76, 183, 85, 141, 69, 116, 118, 208, 130, 5, 107, 193, 23, 21, 126, 4, 230, 174, 198, 149, 110, 52, 0, 84, 170, 9, 53, 48, 76, 210, 152, 129, 163, 102, 13, 53, 211, 61, 42, 22, 92, 84, 44, 162, 171, 74, 181, 78, 101, 21, 153, 113, 30, 115, 89, 87, 80, 141, 166, 185, 237, 66, 13, 200, 69, 121, 191, 137, 44, 130, 200, 92, 117, 174, 94, 65, 218, 160, 96, 105, 134, 154, 122, 83, 105, 41, 105, 69, 60, 83, 197, 72, 157, 106, 204, 32, 22, 21, 220, 248, 102, 217, 74, 6, 199, 53, 232, 22, 49, 225, 65, 197, 110, 219, 47, 2, 181, 160, 198, 5, 94, 137, 113, 205, 91, 141, 73, 25, 171, 105, 192, 230, 165, 76, 19, 197, 74, 65, 7, 21, 38, 220, 10, 110, 0, 28, 208, 112, 5, 86, 110, 106, 23, 90, 173, 34, 213, 73, 82, 168, 78, 181, 149, 114, 157, 107, 18, 242, 48, 1, 53, 192, 120, 154, 219, 116, 108, 195, 222, 184, 9, 65, 12, 126, 181, 3, 84, 100, 83, 15, 74, 109, 20, 10, 114, 211, 169, 235, 82, 37, 93, 182, 92, 202, 191, 90, 244, 143, 14, 199, 139, 116, 207, 160, 174, 214, 200, 101, 70, 43, 106, 217, 122, 86, 180, 8, 49, 87, 98, 24, 171, 113, 213, 164, 229, 121, 169, 149, 49, 210, 164, 3, 38, 159, 208, 80, 64, 99, 81, 149, 0, 211, 72, 82, 58, 85, 105, 5, 86, 117, 170, 178, 138, 163, 50, 230, 178, 238, 120, 4, 86, 29, 234, 245, 174, 55, 94, 139, 48, 62, 61, 13, 121, 149, 218, 237, 158, 65, 245, 254, 117, 81, 133, 68, 212, 195, 77, 52, 81, 74, 41, 224, 211, 215, 6, 166, 140, 96, 154, 189, 100, 51, 58, 125, 69, 122, 118, 130, 153, 129, 62, 130, 187, 27, 65, 180, 1, 91, 22, 227, 165, 106, 67, 138, 191, 16, 207, 53, 114, 60, 17, 86, 57, 197, 74, 7, 21, 32, 20, 234, 94, 41, 132, 10, 141, 206, 42, 23, 2, 171, 191, 34, 170, 63, 90, 163, 62, 5, 101, 220, 14, 181, 137, 124, 6, 13, 114, 122, 207, 250, 151, 227, 177, 175, 45, 212, 6, 46, 228, 250, 255, 0, 83, 89, 237, 81, 53, 48, 210, 26, 109, 20, 224, 78, 41, 194, 158, 42, 96, 122, 85, 251, 35, 251, 244, 250, 143, 231, 94, 157, 160, 113, 110, 159, 65, 93, 141, 161, 206, 43, 102, 223, 181, 105, 192, 50, 113, 87, 226, 6, 174, 69, 86, 1, 197, 74, 27, 117, 74, 23, 20, 226, 188, 83, 72, 197, 55, 57, 166, 55, 53, 3, 142, 113, 85, 228, 3, 57, 170, 146, 12, 243, 84, 38, 200, 38, 179, 110, 15, 36, 86, 45, 238, 57, 56, 174, 75, 90, 56, 137, 207, 181, 121, 110, 164, 119, 92, 191, 212, 255, 0, 51, 89, 237, 215, 240, 168, 141, 48, 211, 77, 20, 82, 131, 78, 230, 158, 181, 42, 213, 187, 99, 137, 23, 234, 43, 210, 252, 58, 231, 200, 79, 160, 174, 210, 209, 250, 86, 213, 185, 198, 13, 107, 91, 176, 171, 209, 28, 85, 184, 218, 172, 35, 228, 98, 166, 78, 26, 164, 38, 156, 31, 138, 70, 106, 111, 67, 76, 115, 198, 106, 18, 120, 205, 87, 118, 7, 131, 85, 37, 35, 7, 21, 66, 102, 224, 214, 93, 199, 66, 107, 18, 245, 134, 15, 53, 199, 107, 178, 226, 7, 199, 161, 175, 50, 190, 109, 211, 191, 214, 169, 49, 228, 212, 70, 152, 105, 167, 173, 20, 130, 148, 83, 129, 169, 5, 72, 188, 10, 177, 11, 96, 143, 173, 119, 126, 23, 185, 33, 21, 79, 78, 49, 93, 245, 156, 153, 197, 110, 219, 177, 192, 173, 104, 24, 214, 132, 7, 7, 154, 178, 173, 207, 21, 106, 51, 154, 156, 26, 145, 105, 199, 210, 131, 210, 152, 100, 192, 197, 49, 159, 34, 161, 118, 226, 171, 72, 120, 170, 146, 17, 84, 46, 14, 43, 46, 229, 178, 13, 96, 223, 56, 0, 215, 11, 226, 59, 128, 177, 56, 246, 53, 231, 183, 14, 90, 67, 143, 90, 174, 213, 25, 166, 53, 55, 52, 148, 82, 129, 74, 41, 224, 212, 128, 243, 83, 70, 112, 107, 166, 240, 237, 239, 149, 42, 198, 223, 133, 122, 102, 159, 48, 40, 167, 189, 111, 91, 75, 210, 181, 224, 147, 56, 197, 104, 196, 249, 171, 177, 145, 138, 178, 142, 0, 169, 146, 74, 153, 94, 159, 188, 119, 166, 150, 201, 166, 57, 24, 166, 23, 0, 85, 119, 122, 171, 36, 156, 85, 73, 100, 197, 103, 220, 75, 154, 202, 184, 151, 131, 92, 238, 163, 54, 3, 28, 215, 156, 120, 146, 236, 179, 149, 6, 185, 71, 36, 177, 168, 73, 168, 205, 52, 210, 82, 81, 154, 90, 1, 167, 138, 120, 169, 151, 53, 118, 202, 109, 146, 175, 98, 15, 21, 233, 58, 13, 249, 146, 20, 82, 121, 2, 186, 235, 89, 193, 193, 173, 155, 105, 178, 69, 105, 69, 46, 106, 252, 82, 246, 171, 10, 227, 28, 26, 157, 95, 2, 156, 37, 237, 82, 7, 239, 154, 26, 67, 77, 243, 42, 55, 144, 1, 85, 165, 147, 138, 172, 242, 224, 113, 84, 165, 151, 53, 159, 52, 189, 107, 30, 238, 108, 3, 92, 158, 179, 123, 178, 55, 201, 199, 21, 230, 154, 157, 201, 158, 118, 110, 184, 53, 158, 231, 53, 17, 52, 194, 105, 166, 146, 146, 146, 150, 148, 83, 129, 197, 61, 77, 72, 172, 77, 78, 143, 180, 231, 189, 116, 186, 30, 164, 81, 148, 19, 205, 122, 38, 159, 120, 178, 160, 34, 186, 11, 91, 129, 129, 138, 212, 138, 126, 106, 250, 75, 158, 69, 88, 73, 10, 158, 106, 202, 205, 154, 144, 75, 205, 72, 100, 7, 189, 55, 204, 247, 166, 153, 121, 168, 154, 76, 212, 18, 75, 129, 85, 158, 97, 84, 39, 156, 99, 138, 203, 184, 184, 235, 88, 55, 247, 155, 20, 215, 159, 120, 135, 81, 47, 185, 1, 174, 74, 71, 201, 200, 224, 230, 161, 102, 166, 19, 77, 164, 52, 218, 76, 243, 64, 165, 165, 165, 6, 156, 13, 60, 26, 145, 79, 35, 53, 110, 222, 99, 20, 128, 143, 90, 236, 116, 61, 100, 33, 84, 115, 193, 233, 93, 205, 149, 230, 240, 8, 53, 183, 111, 114, 8, 235, 90, 16, 207, 239, 86, 210, 108, 158, 181, 101, 38, 21, 56, 155, 34, 129, 55, 189, 2, 122, 105, 154, 163, 121, 189, 234, 172, 179, 123, 213, 41, 103, 247, 170, 19, 220, 128, 15, 53, 141, 121, 120, 21, 73, 221, 197, 113, 154, 222, 172, 66, 16, 14, 43, 134, 186, 153, 165, 144, 177, 39, 173, 83, 44, 57, 52, 195, 72, 105, 166, 154, 105, 41, 41, 41, 194, 150, 129, 193, 167, 10, 112, 52, 245, 57, 28, 212, 129, 184, 171, 86, 247, 13, 27, 112, 122, 116, 174, 211, 68, 215, 67, 66, 3, 183, 204, 43, 176, 179, 212, 21, 212, 16, 213, 179, 5, 232, 173, 8, 110, 55, 119, 171, 43, 112, 7, 122, 153, 46, 120, 235, 78, 19, 231, 189, 31, 104, 30, 180, 198, 184, 247, 168, 154, 227, 222, 170, 77, 115, 131, 214, 168, 205, 116, 0, 235, 88, 247, 119, 224, 3, 205, 114, 90, 190, 184, 145, 130, 3, 100, 253, 107, 139, 188, 189, 146, 229, 201, 39, 143, 74, 160, 205, 158, 245, 27, 30, 120, 166, 154, 105, 166, 230, 146, 131, 210, 155, 214, 138, 81, 75, 69, 40, 52, 234, 114, 154, 144, 53, 72, 141, 142, 134, 167, 130, 119, 136, 228, 18, 62, 149, 208, 233, 122, 251, 66, 66, 200, 127, 90, 236, 108, 53, 180, 149, 70, 215, 31, 157, 109, 193, 168, 140, 3, 186, 175, 71, 122, 27, 156, 213, 129, 120, 0, 251, 212, 255, 0, 182, 14, 205, 65, 188, 0, 227, 117, 49, 175, 112, 122, 213, 121, 47, 128, 254, 42, 165, 62, 160, 0, 206, 234, 196, 189, 214, 18, 53, 57, 112, 63, 26, 228, 181, 63, 16, 52, 153, 88, 219, 143, 90, 230, 231, 185, 105, 24, 228, 147, 85, 11, 28, 154, 97, 52, 194, 105, 9, 166, 154, 67, 73, 65, 166, 209, 75, 69, 45, 45, 46, 105, 192, 211, 129, 167, 6, 197, 56, 49, 245, 169, 17, 200, 63, 214, 174, 219, 106, 18, 192, 126, 86, 63, 157, 110, 89, 248, 145, 209, 112, 230, 183, 109, 188, 70, 133, 71, 205, 250, 214, 148, 122, 228, 108, 63, 214, 15, 206, 167, 26, 210, 118, 113, 249, 211, 155, 88, 76, 125, 241, 159, 173, 87, 147, 92, 141, 71, 50, 12, 253, 107, 58, 235, 196, 81, 32, 206, 254, 125, 51, 88, 183, 94, 35, 44, 50, 27, 240, 205, 96, 93, 106, 115, 92, 183, 36, 129, 84, 26, 66, 195, 169, 197, 71, 186, 153, 156, 230, 154, 105, 9, 226, 152, 77, 6, 138, 67, 73, 73, 69, 20, 180, 82, 210, 210, 131, 78, 6, 151, 52, 160, 226, 156, 173, 199, 90, 126, 234, 126, 243, 216, 154, 122, 206, 224, 112, 199, 243, 171, 11, 127, 58, 156, 239, 227, 241, 167, 255, 0, 106, 207, 187, 239, 154, 83, 170, 92, 28, 159, 48, 254, 103, 252, 106, 39, 191, 153, 137, 62, 97, 252, 205, 66, 215, 14, 255, 0, 196, 223, 137, 168, 204, 132, 247, 168, 203, 123, 211, 75, 82, 19, 145, 138, 111, 106, 66, 105, 164, 210, 82, 81, 72, 77, 37, 20, 81, 69, 45, 0, 246, 165, 162, 156, 41, 104, 205, 56, 30, 41, 67, 83, 183, 81, 184, 210, 239, 59, 113, 75, 187, 154, 55, 30, 5, 38, 238, 5, 27, 184, 166, 230, 147, 52, 148, 132, 243, 73, 158, 105, 9, 164, 52, 148, 82, 80, 105, 40, 162, 138, 40, 162, 157, 69, 46, 104, 205, 45, 0, 211, 129, 163, 117, 46, 234, 51, 70, 105, 75, 102, 147, 62, 244, 19, 73, 154, 51, 73, 154, 15, 74, 110, 104, 164, 162, 146, 131, 69, 37, 20, 153, 163, 154, 90, 40, 165, 162, 150, 138, 90, 5, 46, 104, 205, 45, 25, 163, 52, 102, 140, 210, 102, 140, 209, 73, 147, 70, 105, 40, 162, 130, 105, 51, 72, 104, 162, 138, 74, 92, 209, 69, 20, 81, 75, 154, 41, 104, 205, 20, 180, 102, 140, 209, 65, 52, 191, 141, 33, 52, 102, 140, 210, 81, 69, 20, 153, 164, 162, 138, 40, 162, 146, 129, 75, 73, 154, 90, 40, 162, 148, 80, 77, 20, 185, 162, 140, 209, 69, 4, 209, 69, 20, 102, 142, 244, 148, 82, 81, 69, 20, 81, 73, 69, 127, 255, 217} result, err := CompressJpeg(testImg) @@ -23,7 +24,6 @@ func TestCompressJpeg_TooSmall(t *testing.T) { } } -// func TestCompressJpeg(t *testing.T) { testImg := []byte{255, 216, 255, 219, 0, 132, 0, 8, 6, 6, 7, 6, 5, 8, 7, 7, 7, 9, 9, 8, 10, 12, 20, 13, 12, 11, 11, 12, 25, 18, 19, 15, 20, 29, 26, 31, 30, 29, 26, 28, 28, 32, 36, 46, 39, 32, 34, 44, 35, 28, 28, 40, 55, 41, 44, 48, 49, 52, 52, 52, 31, 39, 57, 61, 56, 50, 60, 46, 51, 52, 50, 1, 9, 9, 9, 12, 11, 12, 24, 13, 13, 24, 50, 33, 28, 33, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 255, 192, 0, 17, 8, 4, 56, 7, 128, 3, 1, 34, 0, 2, 17, 1, 3, 17, 1, 255, 196, 1, 162, 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 16, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125, 1, 2, 3, 0, 4, 17, 5, 18, 33, 49, 65, 6, 19, 81, 97, 7, 34, 113, 20, 50, 129, 145, 161, 8, 35, 66, 177, 193, 21, 82, 209, 240, 36, 51, 98, 114, 130, 9, 10, 22, 23, 24, 25, 26, 37, 38, 39, 40, 41, 42, 52, 53, 54, 55, 56, 57, 58, 67, 68, 69, 70, 71, 72, 73, 74, 83, 84, 85, 86, 87, 88, 89, 90, 99, 100, 101, 102, 103, 104, 105, 106, 115, 116, 117, 118, 119, 120, 121, 122, 131, 132, 133, 134, 135, 136, 137, 138, 146, 147, 148, 149, 150, 151, 152, 153, 154, 162, 163, 164, 165, 166, 167, 168, 169, 170, 178, 179, 180, 181, 182, 183, 184, 185, 186, 194, 195, 196, 197, 198, 199, 200, 201, 202, 210, 211, 212, 213, 214, 215, 216, 217, 218, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 1, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 17, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119, 0, 1, 2, 3, 17, 4, 5, 33, 49, 6, 18, 65, 81, 7, 97, 113, 19, 34, 50, 129, 8, 20, 66, 145, 161, 177, 193, 9, 35, 51, 82, 240, 21, 98, 114, 209, 10, 22, 36, 52, 225, 37, 241, 23, 24, 25, 26, 38, 39, 40, 41, 42, 53, 54, 55, 56, 57, 58, 67, 68, 69, 70, 71, 72, 73, 74, 83, 84, 85, 86, 87, 88, 89, 90, 99, 100, 101, 102, 103, 104, 105, 106, 115, 116, 117, 118, 119, 120, 121, 122, 130, 131, 132, 133, 134, 135, 136, 137, 138, 146, 147, 148, 149, 150, 151, 152, 153, 154, 162, 163, 164, 165, 166, 167, 168, 169, 170, 178, 179, 180, 181, 182, 183, 184, 185, 186, 194, 195, 196, 197, 198, 199, 200, 201, 202, 210, 211, 212, 213, 214, 215, 216, 217, 218, 226, 227, 228, 229, 230, 231, 232, 233, 234, 242, 243, 244, 245, 246, 247, 248, 249, 250, 255, 218, 0, 12, 3, 1, 0, 2, 17, 3, 17, 0, 63, 0, 227, 254, 61, 255, 0, 201, 80, 159, 254, 189, 97, 254, 85, 230, 21, 244, 39, 197, 79, 133, 126, 39, 241, 111, 141, 164, 213, 52, 184, 109, 218, 213, 160, 142, 48, 100, 152, 41, 200, 28, 241, 92, 71, 252, 40, 79, 29, 127, 207, 181, 159, 254, 4, 138, 0, 243, 42, 43, 211, 191, 225, 65, 248, 231, 254, 125, 108, 191, 240, 40, 81, 255, 0, 10, 15, 199, 63, 243, 235, 101, 255, 0, 129, 66, 128, 60, 198, 190, 236, 208, 191, 228, 94, 211, 63, 235, 214, 47, 253, 4, 87, 201, 218, 231, 194, 63, 21, 120, 118, 202, 59, 189, 70, 11, 101, 133, 231, 72, 1, 142, 112, 199, 115, 28, 10, 246, 248, 47, 254, 34, 105, 150, 176, 217, 24, 116, 17, 228, 70, 177, 252, 211, 243, 192, 160, 15, 82, 162, 188, 203, 251, 119, 226, 47, 252, 242, 240, 247, 254, 4, 81, 253, 187, 241, 23, 254, 121, 120, 123, 255, 0, 2, 40, 3, 211, 104, 175, 50, 254, 221, 248, 139, 255, 0, 60, 188, 61, 255, 0, 129, 20, 127, 110, 252, 69, 255, 0, 158, 94, 30, 255, 0, 192, 138, 0, 244, 218, 43, 204, 191, 183, 126, 34, 255, 0, 207, 47, 15, 127, 224, 69, 31, 219, 191, 17, 127, 231, 151, 135, 191, 240, 34, 128, 61, 54, 138, 243, 47, 237, 223, 136, 191, 243, 203, 195, 223, 248, 17, 71, 246, 239, 196, 95, 249, 229, 225, 239, 252, 8, 160, 15, 77, 175, 132, 181, 223, 249, 24, 117, 63, 250, 250, 151, 255, 0, 67, 53, 245, 8, 214, 190, 35, 59, 0, 177, 248, 127, 36, 241, 254, 145, 94, 73, 125, 240, 91, 196, 211, 234, 55, 19, 92, 93, 233, 137, 44, 178, 51, 178, 249, 253, 9, 57, 254, 180, 1, 229, 84, 87, 166, 255, 0, 194, 144, 241, 7, 253, 4, 52, 191, 251, 254, 40, 255, 0, 133, 33, 226, 15, 250, 8, 105, 127, 247, 252, 80, 7, 153, 81, 94, 155, 255, 0, 10, 67, 196, 31, 244, 16, 210, 255, 0, 239, 248, 163, 254, 20, 135, 136, 63, 232, 33, 165, 255, 0, 223, 241, 64, 30, 101, 69, 122, 111, 252, 41, 15, 16, 127, 208, 67, 75, 255, 0, 191, 226, 143, 248, 82, 30, 32, 255, 0, 160, 134, 151, 255, 0, 127, 197, 0, 121, 149, 21, 233, 191, 240, 164, 60, 65, 255, 0, 65, 13, 47, 254, 255, 0, 138, 63, 225, 72, 120, 131, 254, 130, 26, 95, 253, 255, 0, 20, 1, 230, 85, 247, 102, 133, 255, 0, 34, 246, 153, 255, 0, 94, 177, 127, 232, 34, 190, 97, 31, 3, 252, 66, 196, 5, 191, 211, 9, 39, 0, 121, 226, 189, 114, 11, 255, 0, 136, 154, 109, 180, 86, 94, 78, 130, 62, 207, 26, 199, 243, 79, 207, 3, 20, 1, 234, 84, 87, 153, 127, 110, 124, 69, 255, 0, 158, 94, 30, 255, 0, 192, 138, 63, 183, 62, 34, 255, 0, 207, 47, 15, 127, 224, 69, 0, 122, 109, 21, 230, 95, 219, 159, 17, 127, 231, 151, 135, 191, 240, 34, 143, 237, 207, 136, 191, 243, 203, 195, 223, 248, 17, 64, 30, 155, 69, 121, 151, 246, 231, 196, 95, 249, 229, 225, 239, 252, 8, 163, 251, 115, 226, 47, 252, 242, 240, 247, 254, 4, 80, 7, 166, 209, 94, 101, 253, 185, 241, 23, 254, 121, 120, 123, 255, 0, 2, 40, 254, 220, 248, 139, 255, 0, 60, 188, 61, 255, 0, 129, 20, 1, 233, 181, 240, 150, 187, 255, 0, 35, 14, 167, 255, 0, 95, 82, 255, 0, 232, 102, 190, 161, 93, 107, 226, 51, 48, 2, 47, 15, 100, 158, 63, 210, 43, 201, 47, 190, 11, 120, 154, 125, 70, 230, 107, 139, 189, 49, 37, 146, 70, 145, 215, 207, 232, 73, 207, 245, 160, 15, 42, 162, 189, 55, 254, 20, 127, 136, 63, 232, 33, 165, 255, 0, 224, 64, 163, 254, 20, 127, 136, 63, 232, 33, 165, 255, 0, 224, 64, 160, 15, 50, 162, 189, 55, 254, 20, 127, 136, 63, 232, 33, 165, 255, 0, 224, 64, 163, 254, 20, 127, 136, 63, 232, 33, 165, 255, 0, 224, 64, 160, 15, 50, 162, 189, 55, 254, 20, 127, 136, 63, 232, 33, 165, 255, 0, 224, 64, 163, 254, 20, 127, 136, 63, 232, 33, 165, 255, 0, 224, 64, 160, 15, 50, 162, 189, 55, 254, 20, 127, 136, 63, 232, 33, 165, 255, 0, 224, 64, 163, 254, 20, 127, 136, 63, 232, 33, 165, 255, 0, 224, 64, 160, 15, 50, 175, 187, 52, 47, 249, 23, 180, 207, 250, 245, 139, 255, 0, 65, 21, 243, 18, 252, 15, 241, 11, 16, 5, 254, 150, 73, 56, 31, 233, 21, 235, 112, 95, 252, 69, 211, 109, 162, 178, 242, 116, 17, 246, 120, 214, 63, 154, 126, 120, 20, 1, 234, 84, 87, 152, 255, 0, 110, 252, 69, 255, 0, 158, 126, 30, 255, 0, 191, 244, 191, 219, 191, 17, 127, 231, 151, 135, 191, 240, 34, 128, 61, 54, 138, 243, 47, 237, 223, 136, 191, 243, 203, 195, 223, 248, 17, 71, 246, 239, 196, 95, 249, 229, 225, 239, 252, 8, 160, 15, 77, 162, 188, 203, 251, 119, 226, 47, 252, 242, 240, 247, 254, 4, 81, 253, 187, 241, 23, 254, 121, 120, 123, 255, 0, 2, 40, 3, 211, 104, 175, 50, 254, 221, 248, 139, 255, 0, 60, 188, 61, 255, 0, 129, 20, 159, 219, 191, 17, 127, 231, 159, 135, 191, 239, 253, 0, 122, 117, 124, 37, 174, 255, 0, 200, 193, 169, 255, 0, 215, 220, 191, 250, 25, 175, 168, 70, 179, 241, 25, 152, 0, 158, 31, 201, 60, 126, 254, 188, 142, 251, 224, 183, 137, 101, 191, 184, 150, 226, 239, 76, 73, 101, 149, 157, 148, 207, 208, 147, 154, 0, 242, 186, 43, 211, 127, 225, 71, 248, 135, 254, 127, 180, 207, 251, 255, 0, 71, 252, 40, 255, 0, 16, 255, 0, 207, 246, 153, 255, 0, 127, 232, 3, 204, 168, 175, 77, 255, 0, 133, 31, 226, 31, 249, 254, 211, 63, 239, 253, 31, 240, 163, 252, 67, 255, 0, 63, 218, 103, 253, 255, 0, 160, 15, 50, 162, 189, 55, 254, 20, 127, 136, 127, 231, 251, 76, 255, 0, 191, 244, 127, 194, 143, 241, 15, 252, 255, 0, 105, 159, 247, 254, 128, 60, 202, 138, 244, 223, 248, 81, 254, 33, 255, 0, 159, 237, 51, 254, 255, 0, 209, 255, 0, 10, 63, 196, 63, 243, 253, 166, 127, 223, 250, 0, 243, 42, 251, 179, 66, 255, 0, 145, 123, 76, 255, 0, 175, 88, 191, 244, 17, 95, 49, 15, 129, 222, 33, 36, 1, 127, 166, 18, 78, 0, 243, 235, 214, 224, 191, 248, 137, 166, 218, 197, 101, 228, 232, 35, 236, 241, 172, 127, 52, 252, 240, 40, 3, 212, 168, 175, 51, 254, 220, 248, 137, 255, 0, 60, 188, 61, 255, 0, 129, 20, 127, 110, 124, 68, 255, 0, 158, 94, 30, 255, 0, 192, 138, 0, 244, 202, 43, 204, 191, 183, 126, 34, 255, 0, 207, 47, 15, 127, 224, 69, 31, 219, 191, 17, 127, 231, 151, 135, 191, 240, 34, 128, 61, 54, 138, 243, 47, 237, 223, 136, 191, 243, 203, 195, 223, 248, 17, 71, 246, 239, 196, 95, 249, 229, 225, 239, 252, 8, 160, 15, 77, 162, 188, 203, 251, 115, 226, 47, 252, 242, 240, 247, 254, 4, 81, 253, 185, 241, 23, 254, 121, 120, 123, 255, 0, 2, 40, 3, 211, 107, 225, 45, 119, 254, 70, 29, 79, 254, 190, 165, 255, 0, 208, 205, 125, 66, 53, 159, 136, 204, 192, 42, 120, 127, 36, 255, 0, 207, 122, 242, 75, 239, 130, 222, 38, 155, 81, 184, 154, 226, 239, 76, 142, 89, 100, 105, 25, 124, 254, 132, 156, 255, 0, 90, 0, 242, 170, 43, 211, 127, 225, 72, 120, 131, 254, 130, 26, 103, 253, 255, 0, 163, 254, 20, 135, 136, 63, 232, 33, 166, 127, 223, 250, 0, 243, 42, 43, 211, 127, 225, 71, 248, 131, 254, 130, 26, 95, 254, 4, 10, 63, 225, 71, 248, 131, 254, 130, 26, 95, 254, 4, 10, 0, 243, 42, 43, 211, 127, 225, 72, 120, 131, 254, 130, 26, 95, 253, 255, 0, 20, 127, 194, 144, 241, 7, 253, 4, 52, 191, 251, 254, 40, 3, 204, 168, 175, 77, 255, 0, 133, 31, 226, 15, 250, 8, 105, 127, 248, 16, 40, 255, 0, 133, 31, 226, 15, 250, 8, 105, 127, 248, 16, 40, 3, 204, 171, 238, 205, 11, 254, 69, 237, 51, 254, 189, 98, 255, 0, 208, 69, 124, 196, 62, 7, 120, 133, 136, 2, 255, 0, 76, 36, 156, 1, 231, 215, 173, 193, 127, 241, 23, 77, 182, 138, 207, 201, 208, 71, 145, 26, 199, 243, 79, 207, 3, 20, 1, 234, 84, 87, 153, 127, 110, 124, 68, 255, 0, 158, 126, 30, 255, 0, 191, 244, 127, 110, 124, 68, 255, 0, 158, 126, 30, 255, 0, 191, 244, 1, 233, 180, 87, 153, 127, 110, 124, 68, 255, 0, 158, 126, 30, 255, 0, 191, 244, 127, 110, 124, 68, 255, 0, 158, 126, 30, 255, 0, 191, 244, 1, 233, 180, 87, 153, 127, 110, 124, 68, 255, 0, 158, 126, 30, 255, 0, 191, 244, 127, 110, 124, 68, 255, 0, 158, 126, 30, 255, 0, 191, 244, 1, 233, 180, 87, 153, 127, 110, 124, 68, 255, 0, 158, 126, 30, 255, 0, 191, 244, 127, 110, 124, 68, 255, 0, 158, 126, 30, 255, 0, 191, 244, 1, 233, 181, 240, 150, 187, 255, 0, 35, 14, 167, 255, 0, 95, 82, 255, 0, 232, 102, 190, 161, 26, 215, 196, 102, 96, 4, 94, 31, 201, 56, 31, 191, 175, 36, 190, 248, 45, 226, 105, 245, 27, 137, 174, 46, 244, 200, 229, 150, 86, 118, 83, 63, 66, 78, 127, 173, 0, 121, 85, 21, 233, 191, 240, 163, 252, 65, 255, 0, 65, 13, 47, 255, 0, 2, 5, 31, 240, 163, 252, 65, 255, 0, 65, 13, 47, 255, 0, 2, 5, 0, 121, 149, 21, 233, 223, 240, 164, 60, 65, 255, 0, 65, 13, 47, 255, 0, 2, 40, 255, 0, 133, 33, 226, 15, 250, 8, 105, 127, 248, 17, 64, 30, 99, 69, 122, 111, 252, 40, 255, 0, 16, 127, 208, 67, 75, 255, 0, 192, 129, 71, 252, 40, 255, 0, 16, 127, 208, 67, 75, 255, 0, 192, 129, 64, 30, 101, 69, 122, 111, 252, 40, 255, 0, 16, 127, 208, 67, 75, 255, 0, 192, 129, 71, 252, 40, 255, 0, 16, 127, 208, 67, 75, 255, 0, 192, 129, 64, 30, 101, 95, 118, 104, 95, 242, 47, 105, 159, 245, 235, 23, 254, 130, 43, 230, 37, 248, 29, 226, 22, 96, 5, 254, 152, 73, 56, 31, 191, 21, 235, 112, 95, 252, 69, 211, 173, 98, 178, 242, 116, 31, 244, 120, 214, 63, 154, 126, 120, 24, 160, 15, 82, 162, 188, 203, 251, 119, 226, 55, 252, 242, 240, 247, 254, 4, 81, 253, 187, 241, 27, 254, 121, 120, 123, 255, 0, 2, 40, 3, 211, 104, 175, 50, 254, 221, 248, 141, 255, 0, 60, 188, 61, 255, 0, 129, 20, 127, 110, 252, 70, 255, 0, 158, 94, 30, 255, 0, 192, 138, 0, 244, 218, 43, 204, 191, 183, 126, 35, 127, 207, 47, 15, 127, 224, 69, 31, 219, 191, 17, 191, 231, 151, 135, 191, 240, 34, 128, 61, 54, 138, 243, 47, 237, 223, 136, 223, 243, 203, 195, 223, 248, 17, 71, 246, 231, 196, 95, 249, 229, 225, 239, 252, 8, 160, 15, 77, 175, 132, 181, 223, 249, 24, 53, 63, 250, 251, 151, 255, 0, 67, 53, 245, 8, 214, 126, 35, 51, 0, 19, 195, 228, 147, 199, 239, 235, 200, 239, 190, 11, 120, 150, 107, 249, 230, 184, 187, 211, 18, 89, 37, 102, 101, 243, 250, 18, 115, 253, 104, 3, 202, 232, 175, 77, 255, 0, 133, 33, 226, 15, 250, 8, 105, 159, 247, 254, 143, 248, 82, 30, 32, 255, 0, 160, 134, 153, 255, 0, 127, 232, 3, 204, 168, 175, 77, 255, 0, 133, 33, 226, 15, 250, 8, 105, 159, 247, 254, 143, 248, 82, 30, 32, 255, 0, 160, 134, 153, 255, 0, 127, 232, 3, 204, 168, 175, 77, 255, 0, 133, 33, 226, 15, 250, 8, 105, 159, 247, 254, 143, 248, 82, 30, 32, 255, 0, 160, 134, 153, 255, 0, 127, 232, 3, 204, 168, 175, 78, 255, 0, 133, 31, 226, 31, 249, 255, 0, 211, 63, 239, 253, 31, 240, 163, 252, 67, 255, 0, 63, 250, 103, 253, 255, 0, 160, 15, 49, 175, 187, 52, 47, 249, 23, 180, 207, 250, 245, 139, 255, 0, 65, 21, 243, 16, 248, 29, 226, 22, 32, 11, 253, 48, 146, 112, 7, 159, 94, 183, 5, 255, 0, 196, 77, 50, 210, 27, 47, 39, 65, 30, 68, 107, 31, 205, 63, 60, 10, 0, 245, 42, 43, 204, 255, 0, 183, 62, 35, 127, 207, 47, 15, 127, 224, 69, 31, 219, 159, 17, 191, 231, 151, 135, 191, 240, 34, 128, 61, 50, 138, 243, 63, 237, 207, 136, 223, 243, 203, 195, 223, 248, 17, 71, 246, 231, 196, 111, 249, 229, 225, 239, 252, 8, 160, 15, 76, 162, 188, 207, 251, 115, 226, 55, 252, 242, 240, 247, 254, 4, 81, 253, 185, 241, 27, 254, 121, 120, 123, 255, 0, 2, 40, 3, 211, 40, 175, 51, 254, 220, 248, 141, 255, 0, 60, 188, 61, 255, 0, 129, 20, 127, 110, 124, 70, 255, 0, 158, 94, 30, 255, 0, 192, 138, 0, 244, 202, 248, 75, 93, 255, 0, 145, 135, 83, 255, 0, 175, 169, 127, 244, 51, 95, 80, 141, 103, 226, 51, 48, 1, 60, 63, 146, 120, 253, 253, 121, 37, 247, 193, 111, 19, 79, 168, 92, 205, 61, 222, 152, 146, 201, 43, 72, 235, 231, 244, 36, 231, 250, 208, 7, 149, 81, 94, 157, 255, 0, 10, 67, 196, 31, 244, 16, 210, 255, 0, 240, 34, 143, 248, 82, 30, 32, 255, 0, 160, 134, 151, 255, 0, 129, 20, 1, 230, 52, 87, 167, 127, 194, 144, 241, 7, 253, 4, 52, 191, 252, 8, 163, 254, 20, 135, 136, 63, 232, 33, 165, 255, 0, 224, 69, 0, 121, 141, 21, 233, 223, 240, 164, 60, 65, 255, 0, 65, 13, 47, 255, 0, 2, 40, 255, 0, 133, 33, 226, 15, 250, 8, 105, 127, 248, 17, 64, 30, 99, 69, 122, 119, 252, 41, 15, 16, 127, 208, 67, 75, 255, 0, 192, 138, 63, 225, 72, 120, 131, 254, 130, 26, 95, 254, 4, 80, 7, 152, 215, 221, 154, 23, 252, 139, 218, 103, 253, 122, 197, 255, 0, 160, 138, 249, 136, 124, 14, 241, 9, 32, 11, 253, 48, 146, 112, 7, 159, 94, 183, 5, 255, 0, 196, 77, 54, 218, 43, 47, 39, 65, 30, 68, 107, 31, 205, 63, 60, 12, 80, 7, 169, 81, 94, 101, 253, 185, 241, 19, 254, 121, 248, 123, 254, 255, 0, 209, 253, 185, 241, 19, 254, 121, 248, 123, 254, 255, 0, 208, 7, 166, 209, 94, 101, 253, 185, 241, 19, 254, 121, 248, 123, 254, 255, 0, 209, 253, 185, 241, 19, 254, 121, 248, 123, 254, 255, 0, 208, 7, 166, 209, 94, 101, 253, 185, 241, 19, 254, 121, 248, 123, 254, 255, 0, 209, 253, 185, 241, 19, 254, 121, 248, 123, 254, 255, 0, 208, 7, 166, 209, 94, 101, 253, 185, 241, 19, 254, 121, 248, 123, 254, 255, 0, 209, 253, 185, 241, 19, 254, 121, 248, 123, 254, 255, 0, 208, 7, 166, 215, 194, 90, 239, 252, 140, 58, 159, 253, 125, 75, 255, 0, 161, 154, 250, 132, 107, 95, 17, 153, 128, 17, 248, 127, 36, 241, 251, 250, 242, 75, 239, 130, 222, 38, 155, 80, 184, 154, 226, 239, 76, 73, 101, 145, 157, 151, 207, 232, 73, 207, 245, 160, 15, 42, 162, 189, 55, 254, 20, 127, 136, 63, 232, 33, 165, 255, 0, 224, 64, 163, 254, 20, 127, 136, 63, 232, 33, 165, 255, 0, 224, 64, 160, 15, 50, 162, 189, 55, 254, 20, 127, 136, 127, 232, 33, 165, 255, 0, 224, 64, 163, 254, 20, 127, 136, 127, 232, 33, 165, 255, 0, 224, 64, 160, 15, 50, 162, 189, 55, 254, 20, 127, 136, 127, 232, 33, 165, 255, 0, 224, 64, 163, 254, 20, 127, 136, 127, 232, 33, 165, 255, 0, 224, 64, 160, 15, 50, 162, 189, 55, 254, 20, 127, 136, 127, 232, 33, 165, 255, 0, 224, 64, 163, 254, 20, 127, 136, 127, 232, 33, 165, 255, 0, 224, 64, 160, 15, 50, 175, 187, 52, 47, 249, 23, 180, 207, 250, 245, 139, 255, 0, 65, 21, 243, 16, 248, 29, 226, 22, 96, 5, 254, 152, 73, 56, 31, 191, 175, 91, 130, 255, 0, 226, 38, 157, 109, 21, 151, 149, 160, 143, 179, 198, 177, 252, 211, 243, 192, 160, 15, 82, 162, 188, 203, 251, 115, 226, 47, 252, 242, 240, 247, 254, 4, 81, 253, 185, 241, 23, 254, 121, 120, 123, 255, 0, 2, 40, 3, 211, 104, 175, 50, 254, 220, 248, 139, 255, 0, 60, 188, 61, 255, 0, 129, 20, 127, 110, 124, 69, 255, 0, 158, 94, 30, 255, 0, 192, 138, 0, 244, 218, 43, 204, 191, 183, 62, 34, 255, 0, 207, 47, 15, 127, 224, 69, 31, 219, 159, 17, 127, 231, 151, 135, 191, 240, 34, 128, 61, 54, 138, 243, 47, 237, 207, 136, 191, 243, 203, 195, 223, 248, 17, 71, 246, 231, 196, 95, 249, 229, 225, 239, 252, 8, 160, 15, 77, 175, 132, 181, 223, 249, 24, 53, 63, 250, 251, 151, 255, 0, 67, 53, 245, 10, 235, 63, 17, 157, 128, 9, 225, 252, 147, 199, 239, 235, 201, 47, 190, 11, 120, 150, 107, 251, 137, 103, 187, 211, 18, 89, 101, 103, 101, 51, 244, 36, 230, 128, 60, 170, 138, 244, 223, 248, 81, 254, 32, 255, 0, 159, 253, 47, 255, 0, 2, 5, 31, 240, 163, 252, 65, 255, 0, 63, 250, 95, 254, 4, 10, 0, 243, 42, 43, 211, 127, 225, 71, 248, 131, 254, 127, 244, 191, 252, 8, 20, 127, 194, 143, 241, 7, 252, 255, 0, 233, 127, 248, 16, 40, 3, 204, 168, 175, 77, 255, 0, 133, 31, 226, 15, 249, 255, 0, 210, 255, 0, 240, 32, 81, 255, 0, 10, 63, 196, 31, 243, 255, 0, 165, 255, 0, 224, 64, 160, 15, 50, 162, 189, 55, 254, 20, 127, 136, 63, 231, 255, 0, 75, 255, 0, 192, 129, 71, 252, 40, 255, 0, 16, 127, 207, 254, 151, 255, 0, 129, 2, 128, 60, 202, 190, 236, 208, 191, 228, 94, 211, 63, 235, 214, 47, 253, 4, 87, 204, 67, 224, 119, 136, 88, 128, 47, 244, 204, 147, 128, 60, 241, 94, 183, 5, 255, 0, 196, 77, 54, 218, 43, 47, 39, 65, 31, 103, 141, 99, 249, 167, 231, 129, 64, 30, 165, 69, 121, 151, 246, 239, 196, 95, 249, 229, 225, 239, 252, 8, 163, 251, 119, 226, 47, 252, 242, 240, 247, 254, 4, 80, 7, 166, 209, 94, 101, 253, 187, 241, 23, 254, 121, 120, 123, 255, 0, 2, 40, 254, 221, 248, 139, 255, 0, 60, 188, 61, 255, 0, 129, 20, 1, 233, 180, 87, 153, 127, 110, 252, 69, 255, 0, 158, 94, 30, 255, 0, 192, 138, 63, 183, 126, 34, 255, 0, 207, 47, 15, 127, 224, 69, 0, 122, 109, 21, 230, 95, 219, 191, 17, 191, 231, 151, 135, 191, 240, 34, 147, 251, 115, 226, 55, 252, 242, 240, 247, 254, 4, 80, 7, 167, 87, 194, 90, 239, 252, 140, 58, 159, 253, 125, 75, 255, 0, 161, 154, 250, 132, 107, 63, 17, 157, 128, 84, 240, 246, 73, 227, 253, 34, 188, 146, 251, 224, 183, 137, 166, 212, 110, 38, 184, 187, 211, 35, 150, 89, 26, 70, 95, 63, 161, 39, 63, 214, 128, 60, 170, 138, 244, 223, 248, 82, 30, 32, 255, 0, 160, 134, 151, 255, 0, 127, 197, 31, 240, 164, 60, 65, 255, 0, 65, 13, 47, 254, 255, 0, 138, 0, 243, 42, 43, 211, 127, 225, 72, 120, 131, 254, 130, 26, 95, 253, 255, 0, 20, 127, 194, 144, 241, 7, 253, 4, 52, 191, 251, 254, 40, 3, 204, 168, 175, 77, 255, 0, 133, 33, 226, 15, 250, 8, 105, 127, 247, 252, 81, 255, 0, 10, 67, 196, 31, 244, 16, 210, 255, 0, 239, 248, 160, 15, 50, 162, 189, 55, 254, 20, 127, 136, 63, 231, 255, 0, 75, 255, 0, 192, 129, 71, 252, 40, 255, 0, 16, 127, 207, 254, 151, 255, 0, 129, 2, 128, 60, 202, 190, 236, 208, 191, 228, 94, 211, 63, 235, 214, 47, 253, 4, 87, 204, 67, 224, 119, 136, 88, 128, 47, 244, 194, 73, 192, 30, 120, 175, 91, 130, 255, 0, 226, 38, 155, 109, 21, 151, 147, 160, 143, 179, 198, 177, 252, 211, 243, 192, 197, 0, 122, 149, 21, 230, 95, 219, 159, 17, 127, 231, 151, 135, 191, 240, 34, 147, 251, 115, 226, 55, 252, 242, 240, 247, 254, 4, 80, 7, 167, 81, 94, 101, 253, 185, 241, 23, 254, 121, 120, 123, 255, 0, 2, 40, 254, 220, 248, 139, 255, 0, 60, 188, 61, 255, 0, 129, 20, 1, 233, 180, 87, 153, 127, 110, 124, 69, 255, 0, 158, 94, 30, 255, 0, 192, 138, 63, 183, 62, 34, 255, 0, 207, 47, 15, 127, 224, 69, 0, 122, 109, 21, 230, 63, 219, 159, 17, 191, 231, 151, 135, 191, 240, 34, 143, 237, 207, 136, 223, 243, 203, 195, 223, 248, 17, 64, 30, 157, 95, 9, 107, 191, 242, 48, 234, 127, 245, 245, 47, 254, 134, 107, 234, 21, 214, 126, 35, 51, 0, 34, 240, 246, 73, 227, 247, 245, 228, 151, 223, 5, 188, 77, 62, 163, 115, 53, 197, 222, 152, 146, 201, 35, 72, 235, 231, 244, 36, 231, 250, 208, 7, 149, 81, 94, 155, 255, 0, 10, 63, 196, 31, 244, 16, 210, 255, 0, 240, 32, 81, 255, 0, 10, 63, 196, 31, 244, 16, 210, 255, 0, 240, 32, 80, 7, 153, 81, 94, 155, 255, 0, 10, 63, 196, 31, 244, 16, 210, 255, 0, 240, 32, 81, 255, 0, 10, 63, 196, 31, 244, 16, 210, 255, 0, 240, 32, 80, 7, 153, 81, 94, 155, 255, 0, 10, 63, 196, 31, 244, 16, 210, 255, 0, 240, 32, 81, 255, 0, 10, 63, 196, 31, 244, 16, 210, 255, 0, 240, 32, 80, 7, 153, 81, 94, 155, 255, 0, 10, 63, 196, 31, 244, 16, 210, 255, 0, 240, 32, 81, 255, 0, 10, 63, 196, 31, 244, 16, 210, 255, 0, 240, 32, 80, 7, 153, 87, 221, 154, 23, 252, 139, 218, 103, 253, 122, 197, 255, 0, 160, 138, 249, 137, 126, 7, 248, 133, 136, 2, 255, 0, 75, 36, 156, 15, 244, 138, 245, 184, 47, 254, 34, 233, 182, 209, 89, 121, 58, 8, 251, 60, 107, 31, 205, 63, 60, 10, 0, 245, 42, 43, 204, 127, 183, 126, 34, 255, 0, 207, 63, 15, 127, 223, 250, 95, 237, 223, 136, 191, 243, 203, 195, 223, 248, 17, 64, 30, 155, 69, 121, 151, 246, 239, 196, 95, 249, 229, 225, 239, 252, 8, 163, 251, 119, 226, 47, 252, 242, 240, 247, 254, 4, 80, 7, 166, 209, 94, 101, 253, 187, 241, 23, 254, 121, 120, 123, 255, 0, 2, 40, 254, 221, 248, 139, 255, 0, 60, 188, 61, 255, 0, 129, 20, 1, 233, 180, 87, 153, 127, 110, 252, 69, 255, 0, 158, 94, 30, 255, 0, 192, 138, 79, 237, 223, 136, 191, 243, 207, 195, 223, 247, 254, 128, 61, 58, 190, 18, 215, 127, 228, 96, 212, 255, 0, 235, 238, 95, 253, 12, 215, 212, 35, 89, 248, 140, 204, 0, 79, 15, 228, 158, 63, 127, 94, 39, 31, 194, 191, 22, 120, 135, 94, 214, 214, 218, 43, 70, 158, 206, 232, 165, 198, 102, 10, 3, 183, 205, 199, 231, 64, 30, 119, 69, 122, 111, 252, 40, 79, 29, 127, 207, 165, 151, 254, 5, 10, 63, 225, 66, 120, 235, 254, 125, 44, 191, 240, 40, 80, 7, 153, 87, 93, 240, 179, 254, 74, 127, 135, 255, 0, 235, 236, 127, 35, 91, 255, 0, 240, 161, 60, 117, 255, 0, 62, 150, 95, 248, 20, 43, 162, 240, 47, 193, 223, 23, 104, 62, 54, 210, 117, 75, 235, 123, 85, 181, 182, 159, 204, 144, 172, 224, 156, 99, 210, 128, 62, 141, 162, 138, 40, 0, 162, 138, 40, 3, 207, 254, 47, 127, 200, 161, 105, 255, 0, 97, 91, 79, 253, 24, 43, 151, 241, 95, 252, 141, 58, 135, 253, 117, 254, 149, 212, 252, 95, 255, 0, 145, 70, 211, 254, 194, 182, 159, 250, 48, 87, 45, 226, 191, 249, 26, 117, 15, 250, 235, 253, 5, 0, 99, 98, 140, 83, 168, 160, 6, 226, 140, 83, 168, 160, 6, 226, 140, 83, 168, 160, 6, 226, 140, 83, 168, 160, 9, 172, 64, 254, 209, 182, 255, 0, 174, 171, 223, 222, 180, 124, 84, 51, 226, 141, 67, 254, 186, 214, 125, 143, 252, 132, 109, 191, 235, 170, 255, 0, 49, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 180, 1, 141, 143, 243, 154, 49, 254, 115, 78, 162, 128, 27, 143, 243, 154, 49, 254, 115, 78, 162, 128, 27, 143, 243, 154, 49, 254, 115, 78, 162, 128, 27, 143, 243, 154, 49, 254, 115, 78, 162, 128, 38, 177, 31, 241, 49, 181, 255, 0, 174, 171, 223, 222, 180, 124, 87, 255, 0, 35, 78, 161, 255, 0, 93, 189, 125, 171, 58, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 187, 80, 6, 54, 62, 191, 157, 24, 250, 254, 116, 234, 40, 1, 184, 250, 254, 116, 99, 235, 249, 211, 168, 160, 6, 227, 235, 249, 209, 143, 175, 231, 78, 162, 128, 27, 143, 175, 231, 70, 62, 191, 157, 58, 138, 0, 154, 196, 127, 196, 198, 215, 175, 250, 213, 239, 239, 90, 62, 42, 31, 241, 84, 234, 29, 127, 215, 122, 251, 86, 117, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 26, 135, 253, 117, 254, 148, 1, 141, 143, 175, 231, 70, 62, 191, 157, 58, 138, 0, 110, 62, 191, 157, 24, 250, 254, 116, 234, 40, 1, 184, 250, 254, 116, 99, 235, 249, 211, 168, 160, 6, 227, 235, 249, 209, 143, 175, 231, 78, 162, 128, 38, 177, 31, 241, 49, 182, 235, 254, 181, 123, 251, 214, 143, 138, 135, 252, 85, 26, 135, 253, 117, 172, 251, 31, 249, 8, 219, 127, 215, 85, 254, 98, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 104, 3, 27, 31, 95, 206, 140, 125, 127, 58, 117, 20, 0, 220, 125, 127, 58, 49, 245, 252, 233, 212, 80, 3, 113, 245, 252, 232, 199, 215, 243, 167, 81, 64, 13, 199, 215, 243, 163, 31, 95, 206, 157, 69, 0, 77, 98, 63, 226, 99, 107, 215, 253, 106, 247, 247, 173, 31, 21, 127, 200, 211, 168, 127, 215, 111, 233, 89, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 218, 128, 49, 177, 254, 115, 70, 63, 206, 105, 212, 80, 3, 113, 254, 115, 70, 63, 206, 105, 212, 80, 3, 113, 254, 115, 70, 63, 206, 105, 212, 80, 3, 113, 254, 115, 70, 63, 206, 105, 212, 80, 4, 214, 35, 254, 38, 54, 191, 245, 213, 123, 251, 214, 143, 138, 255, 0, 228, 105, 212, 63, 235, 183, 175, 181, 103, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 207, 168, 127, 215, 106, 0, 198, 199, 215, 243, 163, 31, 95, 206, 157, 69, 0, 55, 31, 95, 206, 140, 125, 127, 58, 117, 20, 0, 220, 125, 127, 58, 49, 245, 252, 233, 212, 80, 3, 113, 245, 252, 232, 199, 215, 243, 167, 81, 64, 19, 88, 143, 248, 152, 219, 117, 255, 0, 90, 189, 253, 235, 71, 197, 67, 254, 42, 157, 67, 254, 186, 214, 125, 143, 252, 132, 109, 191, 235, 170, 255, 0, 49, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 180, 1, 141, 138, 49, 78, 162, 128, 27, 138, 49, 78, 162, 128, 27, 138, 49, 78, 162, 128, 27, 138, 49, 78, 162, 128, 38, 177, 31, 241, 49, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 219, 250, 86, 117, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 26, 135, 253, 118, 254, 130, 128, 49, 177, 245, 252, 232, 199, 215, 243, 167, 81, 64, 13, 199, 215, 243, 163, 31, 95, 206, 157, 69, 0, 55, 31, 95, 206, 140, 125, 127, 58, 117, 20, 0, 220, 125, 127, 58, 49, 245, 252, 233, 212, 80, 4, 214, 35, 254, 38, 54, 189, 127, 214, 175, 127, 122, 209, 241, 88, 255, 0, 138, 167, 80, 255, 0, 174, 181, 157, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 104, 3, 27, 31, 231, 52, 99, 252, 230, 157, 69, 0, 55, 31, 231, 52, 99, 252, 230, 157, 69, 0, 55, 31, 231, 52, 99, 252, 230, 157, 69, 0, 55, 31, 231, 52, 99, 252, 230, 157, 69, 0, 75, 98, 63, 226, 99, 109, 255, 0, 93, 87, 191, 189, 105, 120, 168, 127, 197, 81, 168, 127, 215, 90, 207, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 180, 1, 141, 143, 175, 231, 70, 62, 191, 157, 58, 138, 0, 110, 62, 191, 157, 24, 250, 254, 116, 234, 40, 1, 184, 250, 254, 116, 99, 235, 249, 211, 168, 160, 6, 227, 235, 249, 209, 143, 175, 231, 78, 162, 128, 38, 177, 31, 241, 49, 181, 235, 254, 181, 123, 251, 214, 143, 138, 135, 252, 85, 58, 135, 253, 118, 254, 149, 157, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 191, 165, 0, 99, 99, 252, 230, 140, 127, 156, 211, 168, 160, 6, 227, 252, 230, 140, 127, 156, 211, 168, 160, 6, 227, 252, 230, 140, 127, 156, 211, 168, 160, 6, 227, 252, 230, 140, 127, 156, 211, 168, 160, 9, 172, 71, 252, 76, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 58, 135, 253, 118, 254, 149, 157, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 3, 27, 31, 231, 52, 99, 252, 230, 157, 69, 0, 55, 31, 231, 52, 99, 252, 230, 157, 69, 0, 55, 31, 231, 52, 99, 252, 230, 157, 69, 0, 55, 31, 231, 52, 99, 252, 230, 157, 69, 0, 77, 99, 255, 0, 33, 27, 111, 250, 234, 189, 253, 235, 71, 197, 67, 62, 40, 212, 63, 235, 173, 103, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 207, 168, 127, 215, 90, 0, 198, 199, 249, 205, 24, 255, 0, 57, 167, 81, 64, 13, 199, 249, 205, 24, 255, 0, 57, 167, 81, 64, 13, 199, 249, 205, 24, 255, 0, 57, 167, 81, 64, 13, 199, 249, 205, 24, 255, 0, 57, 167, 81, 64, 19, 88, 143, 248, 152, 218, 255, 0, 215, 85, 239, 239, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 223, 210, 179, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 104, 212, 63, 235, 183, 244, 20, 1, 141, 143, 175, 231, 70, 62, 191, 157, 58, 138, 0, 110, 62, 191, 157, 24, 250, 254, 116, 234, 40, 1, 184, 250, 254, 116, 99, 235, 249, 211, 168, 160, 6, 227, 235, 249, 209, 143, 175, 231, 78, 162, 128, 38, 177, 31, 241, 49, 181, 235, 254, 181, 123, 251, 214, 143, 138, 199, 252, 85, 58, 135, 253, 117, 172, 235, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 117, 15, 250, 235, 64, 24, 216, 255, 0, 57, 163, 31, 231, 52, 234, 40, 1, 184, 255, 0, 57, 163, 31, 231, 52, 234, 40, 1, 184, 255, 0, 57, 163, 31, 231, 52, 234, 40, 1, 184, 255, 0, 57, 163, 31, 231, 52, 234, 40, 2, 91, 17, 255, 0, 19, 27, 111, 250, 234, 189, 253, 235, 75, 197, 67, 254, 42, 141, 67, 254, 186, 214, 125, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 140, 250, 135, 253, 117, 160, 12, 108, 127, 156, 209, 143, 243, 154, 117, 20, 0, 220, 127, 156, 209, 143, 243, 154, 117, 20, 0, 220, 127, 156, 209, 143, 243, 154, 117, 20, 0, 220, 127, 156, 209, 143, 243, 154, 117, 20, 1, 53, 136, 255, 0, 137, 141, 175, 253, 117, 94, 254, 245, 163, 226, 175, 249, 26, 117, 15, 250, 237, 253, 43, 58, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 187, 80, 6, 54, 63, 206, 104, 199, 249, 205, 58, 138, 0, 110, 63, 206, 104, 199, 249, 205, 58, 138, 0, 110, 63, 206, 104, 199, 249, 205, 58, 138, 0, 110, 63, 206, 104, 199, 249, 205, 58, 138, 0, 154, 196, 127, 196, 198, 215, 254, 186, 175, 127, 122, 209, 241, 87, 252, 141, 58, 135, 253, 118, 254, 149, 157, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 3, 27, 31, 231, 52, 99, 252, 230, 157, 69, 0, 55, 31, 231, 52, 99, 252, 230, 157, 69, 0, 55, 31, 231, 52, 99, 252, 230, 157, 69, 0, 55, 31, 231, 52, 99, 252, 230, 157, 69, 0, 77, 99, 255, 0, 33, 27, 111, 250, 234, 189, 253, 235, 71, 197, 67, 62, 40, 212, 63, 235, 173, 103, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 207, 168, 127, 215, 90, 0, 198, 199, 249, 205, 24, 255, 0, 57, 167, 81, 64, 13, 199, 249, 205, 24, 255, 0, 57, 167, 81, 64, 13, 199, 249, 205, 24, 255, 0, 57, 167, 81, 64, 13, 199, 249, 205, 24, 255, 0, 57, 167, 81, 64, 19, 88, 143, 248, 152, 218, 255, 0, 215, 85, 239, 239, 90, 62, 42, 255, 0, 145, 167, 80, 255, 0, 174, 223, 210, 179, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 181, 0, 99, 99, 252, 230, 140, 127, 156, 211, 168, 160, 6, 227, 252, 230, 140, 127, 156, 211, 168, 160, 6, 227, 252, 230, 140, 127, 156, 211, 168, 160, 6, 227, 252, 230, 140, 127, 156, 211, 168, 160, 9, 172, 71, 252, 76, 109, 127, 235, 170, 255, 0, 58, 209, 241, 88, 255, 0, 138, 167, 80, 255, 0, 174, 223, 210, 179, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 183, 244, 160, 12, 108, 127, 156, 209, 143, 243, 154, 117, 20, 0, 220, 127, 156, 209, 143, 243, 154, 117, 20, 0, 220, 127, 156, 209, 143, 243, 154, 117, 20, 0, 220, 127, 156, 209, 143, 243, 154, 117, 20, 1, 45, 136, 255, 0, 137, 141, 183, 253, 117, 94, 254, 245, 165, 226, 161, 255, 0, 21, 70, 161, 255, 0, 93, 107, 62, 199, 254, 66, 54, 223, 245, 213, 127, 157, 104, 120, 171, 254, 70, 125, 67, 254, 186, 208, 6, 54, 63, 206, 104, 199, 249, 205, 58, 138, 0, 110, 63, 206, 104, 199, 249, 205, 58, 138, 0, 110, 63, 206, 104, 199, 249, 205, 58, 138, 0, 110, 63, 206, 104, 199, 249, 205, 58, 138, 0, 154, 196, 127, 196, 194, 215, 254, 186, 175, 127, 122, 238, 252, 1, 255, 0, 35, 127, 143, 63, 236, 42, 191, 250, 44, 87, 9, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 187, 175, 0, 127, 200, 223, 227, 207, 251, 10, 175, 254, 139, 160, 14, 254, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 14, 3, 226, 255, 0, 252, 138, 54, 159, 246, 21, 180, 255, 0, 209, 130, 185, 111, 21, 255, 0, 200, 211, 168, 127, 215, 95, 232, 43, 169, 248, 191, 255, 0, 34, 141, 167, 253, 133, 109, 63, 244, 96, 174, 91, 197, 127, 242, 52, 234, 31, 245, 215, 250, 10, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 123, 31, 249, 8, 219, 127, 215, 85, 254, 98, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 107, 62, 199, 254, 66, 54, 223, 245, 213, 127, 152, 173, 15, 21, 127, 200, 207, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 89, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 218, 128, 50, 40, 166, 211, 168, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 53, 15, 250, 235, 253, 43, 58, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 141, 67, 254, 186, 255, 0, 74, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 123, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 25, 245, 15, 250, 235, 89, 246, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 67, 197, 95, 242, 51, 234, 31, 245, 214, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 187, 86, 117, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 140, 250, 135, 253, 118, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 213, 157, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 103, 212, 63, 235, 173, 103, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 207, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 53, 15, 250, 237, 253, 5, 103, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 209, 168, 127, 215, 111, 232, 40, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 63, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 105, 212, 63, 235, 173, 103, 88, 127, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 211, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 123, 31, 249, 8, 219, 127, 215, 85, 254, 98, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 107, 62, 199, 254, 66, 54, 223, 245, 213, 127, 152, 173, 15, 21, 127, 200, 207, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 253, 43, 58, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 141, 67, 254, 187, 31, 229, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 171, 58, 199, 254, 66, 22, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 187, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 21, 161, 226, 175, 249, 25, 245, 15, 250, 235, 89, 246, 63, 242, 17, 182, 255, 0, 174, 171, 252, 197, 104, 120, 171, 254, 70, 125, 67, 254, 186, 208, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 209, 168, 127, 215, 111, 232, 43, 58, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 141, 67, 254, 187, 127, 65, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 97, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 107, 58, 195, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 157, 67, 254, 186, 208, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 207, 168, 127, 215, 90, 207, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 180, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 218, 179, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 181, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 140, 250, 135, 253, 118, 172, 235, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 79, 99, 255, 0, 33, 27, 111, 250, 234, 191, 204, 86, 135, 138, 191, 228, 103, 212, 63, 235, 173, 103, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 21, 161, 226, 175, 249, 25, 245, 15, 250, 235, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 171, 58, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 187, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 207, 168, 127, 215, 111, 233, 89, 214, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 219, 250, 80, 6, 69, 20, 218, 117, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 79, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 107, 62, 199, 254, 66, 54, 223, 245, 213, 127, 157, 104, 120, 171, 254, 70, 125, 67, 254, 186, 208, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 174, 235, 192, 31, 242, 55, 248, 243, 254, 194, 171, 255, 0, 162, 235, 133, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 93, 215, 128, 63, 228, 111, 241, 231, 253, 133, 87, 255, 0, 69, 208, 7, 127, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 7, 1, 241, 127, 254, 69, 27, 79, 251, 10, 218, 127, 232, 193, 92, 183, 138, 255, 0, 228, 105, 212, 63, 235, 175, 244, 21, 212, 252, 95, 255, 0, 145, 70, 211, 254, 194, 182, 159, 250, 48, 87, 45, 226, 191, 249, 26, 117, 15, 250, 235, 253, 5, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 109, 191, 235, 170, 255, 0, 49, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 159, 99, 255, 0, 33, 27, 111, 250, 234, 191, 204, 86, 135, 138, 191, 228, 103, 212, 63, 235, 173, 0, 100, 81, 69, 20, 0, 81, 69, 104, 88, 232, 90, 150, 164, 219, 109, 173, 155, 234, 195, 2, 128, 51, 233, 185, 174, 250, 195, 225, 211, 48, 31, 111, 185, 41, 254, 204, 124, 215, 73, 103, 224, 221, 30, 215, 4, 219, 137, 91, 213, 232, 3, 200, 150, 222, 119, 251, 144, 74, 223, 69, 171, 80, 232, 218, 140, 255, 0, 118, 210, 97, 245, 92, 87, 182, 69, 103, 111, 10, 226, 40, 35, 79, 160, 169, 168, 3, 200, 44, 124, 47, 171, 125, 178, 23, 54, 199, 10, 234, 78, 126, 181, 111, 196, 126, 27, 212, 238, 53, 251, 217, 225, 128, 180, 82, 62, 84, 215, 170, 81, 64, 30, 31, 46, 133, 169, 65, 247, 173, 37, 252, 23, 53, 76, 218, 92, 199, 247, 173, 165, 95, 170, 215, 190, 84, 82, 91, 195, 63, 250, 216, 85, 190, 162, 128, 60, 20, 240, 112, 122, 250, 81, 94, 197, 121, 225, 45, 30, 243, 39, 236, 170, 142, 127, 137, 107, 157, 190, 248, 115, 31, 222, 179, 185, 98, 223, 221, 110, 148, 1, 231, 244, 86, 182, 161, 225, 173, 83, 77, 7, 207, 182, 44, 7, 120, 249, 172, 140, 96, 224, 142, 71, 106, 0, 90, 40, 162, 128, 38, 176, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 163, 80, 255, 0, 174, 191, 210, 179, 172, 63, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 104, 212, 63, 235, 175, 244, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 159, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 181, 103, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 207, 168, 127, 215, 106, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 89, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 218, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 54, 223, 245, 213, 127, 152, 173, 15, 21, 127, 200, 207, 168, 127, 215, 90, 207, 177, 255, 0, 144, 141, 183, 253, 117, 95, 230, 43, 67, 197, 95, 242, 51, 234, 31, 245, 214, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 199, 254, 66, 22, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 141, 67, 254, 187, 127, 65, 89, 214, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 52, 106, 31, 245, 219, 250, 10, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 117, 15, 250, 235, 89, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 52, 234, 31, 245, 214, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 54, 223, 245, 213, 127, 152, 173, 15, 21, 127, 200, 207, 168, 127, 215, 90, 206, 177, 255, 0, 144, 133, 183, 253, 118, 95, 231, 90, 62, 42, 255, 0, 145, 162, 255, 0, 254, 186, 208, 6, 69, 20, 220, 138, 145, 34, 105, 48, 17, 89, 255, 0, 221, 25, 160, 6, 209, 90, 86, 250, 22, 165, 120, 15, 147, 105, 32, 199, 247, 134, 43, 82, 207, 192, 122, 204, 254, 89, 117, 138, 56, 155, 169, 45, 200, 20, 1, 204, 209, 93, 244, 31, 13, 149, 152, 253, 162, 241, 212, 99, 143, 44, 86, 149, 159, 195, 253, 50, 221, 79, 155, 36, 147, 231, 187, 241, 138, 0, 242, 221, 192, 119, 20, 245, 86, 127, 184, 165, 177, 232, 51, 94, 195, 23, 132, 180, 72, 99, 218, 108, 35, 126, 122, 183, 90, 189, 109, 162, 233, 182, 106, 69, 189, 156, 72, 27, 147, 129, 64, 30, 53, 99, 111, 112, 117, 40, 49, 111, 41, 253, 234, 244, 95, 122, 209, 241, 61, 173, 211, 248, 150, 253, 163, 181, 157, 144, 203, 156, 162, 19, 94, 189, 29, 180, 49, 54, 82, 37, 83, 234, 5, 75, 154, 0, 241, 75, 79, 15, 106, 183, 160, 152, 109, 100, 24, 60, 238, 24, 169, 191, 225, 16, 214, 191, 231, 215, 245, 175, 101, 162, 128, 60, 107, 254, 17, 13, 107, 254, 125, 127, 90, 63, 225, 16, 214, 191, 231, 215, 245, 175, 101, 162, 128, 60, 107, 254, 17, 13, 107, 254, 125, 127, 90, 63, 225, 16, 214, 191, 231, 215, 245, 175, 101, 162, 128, 60, 107, 254, 17, 13, 107, 254, 125, 127, 90, 138, 227, 195, 90, 189, 148, 62, 108, 214, 140, 71, 251, 35, 38, 189, 170, 138, 0, 240, 251, 43, 43, 177, 125, 110, 77, 149, 200, 2, 85, 39, 247, 103, 166, 106, 231, 138, 96, 156, 248, 150, 249, 188, 153, 64, 50, 240, 118, 240, 107, 217, 106, 25, 97, 138, 127, 245, 177, 171, 227, 166, 69, 0, 120, 51, 68, 241, 140, 178, 50, 143, 82, 42, 61, 195, 212, 126, 117, 238, 179, 233, 90, 125, 204, 126, 92, 214, 145, 58, 231, 56, 34, 169, 63, 132, 244, 55, 66, 191, 217, 209, 46, 71, 81, 212, 80, 7, 140, 83, 171, 212, 238, 124, 1, 164, 207, 22, 216, 154, 72, 79, 247, 150, 179, 39, 248, 105, 18, 129, 246, 123, 217, 24, 231, 159, 50, 128, 60, 254, 138, 235, 46, 254, 31, 106, 177, 72, 126, 206, 98, 146, 48, 51, 203, 96, 214, 52, 254, 29, 213, 109, 99, 243, 94, 214, 77, 159, 236, 140, 208, 6, 101, 20, 230, 183, 154, 30, 37, 134, 72, 136, 254, 242, 226, 163, 200, 52, 1, 102, 199, 254, 66, 54, 223, 245, 213, 127, 152, 173, 15, 21, 127, 200, 207, 168, 127, 215, 90, 206, 177, 227, 80, 182, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 214, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 141, 67, 254, 187, 127, 65, 89, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 52, 106, 31, 245, 219, 250, 10, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 117, 15, 250, 235, 89, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 52, 234, 31, 245, 214, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 54, 223, 245, 213, 127, 157, 104, 120, 171, 254, 70, 125, 67, 254, 186, 214, 125, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 140, 250, 135, 253, 117, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 213, 157, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 181, 103, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 207, 168, 127, 215, 106, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 123, 31, 249, 8, 219, 127, 215, 85, 254, 98, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 107, 62, 199, 254, 66, 54, 223, 245, 213, 127, 152, 173, 15, 21, 127, 200, 207, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 89, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 218, 128, 50, 40, 162, 138, 0, 40, 162, 180, 44, 52, 61, 75, 82, 109, 182, 214, 205, 236, 88, 96, 80, 6, 125, 55, 53, 223, 88, 124, 58, 102, 3, 237, 247, 37, 63, 217, 143, 154, 233, 44, 252, 27, 163, 218, 224, 155, 113, 43, 14, 239, 64, 30, 68, 45, 231, 144, 124, 176, 74, 223, 69, 171, 80, 232, 186, 140, 223, 118, 210, 111, 197, 113, 94, 217, 21, 156, 16, 174, 34, 130, 52, 250, 10, 155, 52, 1, 228, 22, 62, 23, 213, 190, 217, 3, 155, 98, 2, 200, 164, 231, 235, 87, 60, 71, 225, 189, 78, 235, 95, 188, 158, 24, 11, 69, 36, 185, 90, 245, 58, 40, 3, 195, 229, 208, 181, 40, 62, 245, 164, 191, 128, 205, 82, 54, 151, 17, 253, 235, 121, 87, 234, 181, 239, 181, 20, 150, 240, 207, 254, 182, 21, 111, 168, 160, 15, 5, 60, 113, 208, 209, 94, 197, 121, 225, 45, 30, 243, 39, 236, 170, 142, 127, 137, 107, 158, 190, 248, 112, 156, 181, 149, 211, 239, 254, 235, 116, 160, 15, 62, 162, 181, 181, 15, 13, 106, 154, 118, 68, 246, 197, 128, 239, 31, 53, 145, 208, 144, 122, 138, 0, 90, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 159, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 215, 117, 224, 15, 249, 27, 252, 121, 255, 0, 97, 85, 255, 0, 209, 117, 194, 216, 255, 0, 200, 66, 215, 254, 186, 175, 243, 174, 235, 192, 31, 242, 55, 248, 243, 254, 194, 171, 255, 0, 162, 232, 3, 191, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 3, 128, 248, 191, 255, 0, 34, 141, 167, 253, 133, 109, 63, 244, 96, 174, 91, 197, 127, 242, 52, 234, 31, 245, 215, 250, 10, 234, 126, 47, 255, 0, 200, 163, 105, 255, 0, 97, 91, 79, 253, 24, 43, 150, 241, 95, 252, 141, 58, 135, 253, 117, 254, 130, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 54, 223, 245, 213, 127, 152, 173, 15, 21, 127, 200, 207, 168, 127, 215, 90, 206, 177, 255, 0, 144, 141, 183, 253, 117, 95, 230, 43, 83, 196, 177, 52, 190, 43, 190, 137, 20, 179, 153, 184, 2, 128, 49, 107, 75, 73, 208, 47, 245, 137, 64, 183, 132, 132, 238, 204, 48, 43, 171, 240, 239, 129, 75, 5, 185, 213, 122, 117, 88, 71, 113, 239, 93, 244, 80, 199, 111, 16, 142, 36, 84, 141, 122, 1, 64, 28, 198, 143, 224, 109, 62, 195, 18, 221, 127, 164, 203, 215, 231, 232, 13, 117, 49, 162, 68, 129, 81, 66, 129, 208, 10, 117, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 132, 6, 24, 32, 16, 122, 131, 92, 246, 173, 224, 221, 51, 83, 220, 203, 31, 217, 229, 63, 198, 131, 173, 116, 84, 80, 7, 141, 235, 30, 22, 212, 52, 134, 59, 226, 243, 33, 61, 25, 121, 252, 235, 18, 189, 245, 148, 58, 20, 112, 24, 30, 8, 61, 235, 138, 241, 15, 129, 98, 185, 13, 113, 166, 128, 146, 255, 0, 207, 46, 212, 1, 231, 182, 31, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 52, 106, 31, 245, 215, 250, 85, 72, 45, 229, 182, 213, 237, 225, 154, 34, 178, 9, 151, 32, 143, 122, 183, 226, 175, 249, 26, 53, 15, 250, 235, 253, 40, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 103, 212, 63, 235, 173, 103, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 207, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 89, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 218, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 187, 86, 117, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 140, 250, 135, 253, 118, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 159, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 104, 212, 63, 235, 183, 244, 21, 157, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 70, 161, 255, 0, 93, 191, 160, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 167, 80, 255, 0, 174, 181, 157, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 146, 8, 39, 156, 145, 12, 45, 39, 251, 163, 53, 189, 167, 248, 31, 86, 190, 65, 43, 34, 67, 25, 254, 241, 231, 63, 74, 0, 231, 15, 20, 228, 141, 165, 192, 137, 25, 243, 192, 192, 205, 122, 109, 159, 195, 205, 62, 37, 31, 104, 150, 73, 142, 65, 59, 191, 149, 116, 118, 218, 54, 157, 101, 131, 109, 105, 20, 101, 78, 70, 7, 74, 0, 242, 173, 35, 195, 122, 181, 213, 228, 15, 29, 177, 84, 4, 57, 50, 113, 198, 107, 172, 191, 240, 43, 106, 58, 237, 205, 212, 215, 69, 33, 149, 183, 13, 189, 69, 118, 244, 80, 7, 51, 99, 224, 109, 34, 212, 47, 153, 31, 218, 48, 63, 229, 167, 122, 216, 180, 210, 116, 251, 47, 248, 246, 180, 142, 44, 28, 240, 58, 85, 234, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 181, 198, 159, 105, 122, 24, 92, 219, 199, 38, 70, 14, 69, 99, 93, 120, 47, 71, 184, 251, 144, 8, 72, 31, 193, 93, 21, 20, 1, 192, 31, 135, 94, 69, 196, 50, 91, 93, 151, 85, 96, 79, 152, 49, 222, 178, 188, 83, 225, 221, 81, 245, 187, 171, 164, 131, 124, 82, 177, 101, 43, 207, 21, 234, 148, 80, 7, 129, 201, 12, 168, 113, 44, 44, 159, 239, 12, 84, 85, 238, 183, 90, 109, 157, 238, 239, 180, 91, 71, 38, 70, 9, 35, 173, 115, 247, 222, 0, 210, 238, 139, 152, 153, 237, 247, 28, 226, 62, 212, 1, 229, 148, 87, 83, 127, 224, 61, 82, 208, 52, 144, 4, 154, 37, 25, 235, 207, 229, 92, 229, 205, 157, 197, 161, 196, 240, 74, 152, 63, 196, 188, 80, 4, 52, 83, 122, 211, 168, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 53, 15, 250, 237, 253, 5, 103, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 209, 168, 127, 215, 111, 232, 40, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 63, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 105, 212, 63, 235, 173, 103, 88, 127, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 211, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 123, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 25, 245, 15, 250, 235, 89, 246, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 67, 197, 95, 242, 51, 234, 31, 245, 214, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 187, 86, 117, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 140, 250, 135, 253, 118, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 213, 157, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 35, 109, 255, 0, 93, 87, 249, 138, 208, 241, 87, 252, 140, 250, 135, 253, 117, 172, 251, 31, 249, 8, 219, 127, 215, 85, 254, 98, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 181, 103, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 79, 19, 196, 210, 248, 178, 253, 17, 75, 72, 101, 224, 15, 194, 128, 49, 107, 79, 72, 240, 254, 161, 171, 200, 5, 188, 36, 39, 118, 110, 5, 117, 94, 29, 240, 41, 96, 46, 181, 94, 157, 86, 31, 95, 173, 119, 208, 193, 29, 188, 66, 40, 81, 82, 53, 24, 0, 80, 7, 49, 163, 248, 23, 79, 177, 196, 183, 95, 233, 50, 245, 195, 116, 6, 186, 148, 68, 137, 66, 70, 161, 84, 118, 2, 157, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 33, 25, 24, 32, 28, 245, 6, 185, 237, 91, 193, 186, 110, 167, 185, 150, 63, 179, 202, 127, 137, 59, 215, 69, 69, 0, 120, 222, 177, 225, 109, 71, 73, 108, 188, 102, 72, 123, 50, 243, 88, 149, 239, 172, 170, 232, 81, 192, 96, 120, 32, 247, 174, 43, 196, 62, 4, 138, 224, 27, 141, 55, 9, 40, 255, 0, 150, 93, 141, 0, 121, 237, 143, 252, 132, 109, 255, 0, 235, 170, 255, 0, 58, 209, 241, 87, 252, 140, 250, 135, 253, 117, 170, 144, 91, 201, 109, 171, 195, 12, 209, 21, 144, 76, 185, 4, 123, 213, 191, 21, 127, 200, 211, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 221, 120, 3, 254, 70, 255, 0, 30, 127, 216, 85, 127, 244, 93, 112, 182, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 186, 240, 7, 252, 141, 254, 60, 255, 0, 176, 170, 255, 0, 232, 186, 0, 239, 232, 162, 138, 0, 40, 162, 138, 0, 40, 172, 235, 205, 119, 74, 176, 159, 236, 247, 122, 141, 172, 18, 227, 59, 37, 148, 3, 138, 131, 254, 18, 189, 3, 254, 131, 22, 63, 247, 248, 80, 6, 197, 21, 143, 255, 0, 9, 94, 129, 255, 0, 65, 139, 31, 251, 252, 40, 255, 0, 132, 175, 64, 255, 0, 160, 197, 143, 253, 254, 20, 1, 204, 124, 94, 255, 0, 145, 66, 207, 254, 194, 182, 159, 250, 48, 87, 45, 226, 175, 249, 26, 117, 15, 250, 235, 253, 5, 108, 124, 82, 215, 116, 171, 255, 0, 11, 217, 219, 217, 234, 22, 215, 18, 255, 0, 106, 90, 159, 46, 57, 65, 63, 126, 157, 175, 248, 83, 81, 189, 215, 111, 46, 97, 150, 212, 70, 239, 149, 15, 48, 6, 128, 56, 234, 43, 161, 255, 0, 132, 51, 85, 255, 0, 158, 214, 63, 247, 252, 81, 255, 0, 8, 102, 171, 255, 0, 61, 172, 127, 239, 248, 160, 14, 122, 138, 232, 127, 225, 12, 213, 127, 231, 181, 143, 253, 255, 0, 20, 127, 194, 25, 170, 255, 0, 207, 107, 31, 251, 254, 40, 3, 158, 162, 186, 31, 248, 67, 53, 95, 249, 237, 99, 255, 0, 127, 197, 31, 240, 134, 106, 191, 243, 218, 199, 254, 255, 0, 138, 0, 231, 168, 174, 131, 254, 16, 189, 83, 254, 123, 89, 127, 223, 241, 78, 79, 4, 107, 19, 54, 21, 237, 24, 250, 9, 129, 52, 1, 145, 165, 194, 243, 234, 118, 202, 138, 89, 252, 197, 60, 14, 217, 175, 92, 182, 240, 245, 165, 190, 175, 115, 169, 48, 243, 39, 153, 242, 51, 252, 53, 71, 66, 208, 173, 188, 53, 167, 73, 119, 115, 134, 157, 35, 50, 74, 253, 118, 128, 50, 113, 92, 183, 252, 47, 175, 2, 255, 0, 207, 205, 239, 254, 3, 26, 0, 244, 250, 43, 204, 63, 225, 125, 120, 23, 254, 126, 111, 127, 240, 24, 209, 255, 0, 11, 235, 192, 191, 243, 243, 123, 255, 0, 128, 198, 128, 61, 62, 138, 243, 15, 248, 95, 94, 5, 255, 0, 159, 155, 223, 252, 6, 52, 127, 194, 250, 240, 47, 252, 252, 222, 255, 0, 224, 49, 160, 15, 79, 162, 188, 195, 254, 23, 215, 129, 127, 231, 230, 247, 255, 0, 1, 141, 31, 240, 190, 188, 11, 255, 0, 63, 55, 191, 248, 12, 104, 3, 211, 232, 175, 48, 255, 0, 133, 245, 224, 95, 249, 249, 189, 255, 0, 192, 99, 71, 252, 47, 175, 2, 255, 0, 207, 205, 239, 254, 3, 26, 0, 244, 250, 43, 205, 96, 248, 229, 224, 155, 155, 136, 160, 142, 230, 243, 124, 140, 21, 115, 108, 122, 147, 129, 86, 181, 143, 140, 126, 17, 208, 53, 107, 173, 42, 246, 226, 236, 93, 90, 191, 151, 38, 216, 9, 25, 250, 208, 7, 160, 81, 94, 97, 255, 0, 11, 235, 192, 191, 243, 243, 123, 255, 0, 128, 198, 143, 248, 95, 94, 5, 255, 0, 159, 155, 223, 252, 6, 52, 1, 233, 244, 87, 152, 127, 194, 250, 240, 47, 252, 252, 222, 255, 0, 224, 49, 163, 254, 23, 215, 129, 127, 231, 230, 247, 255, 0, 1, 141, 0, 122, 125, 21, 230, 31, 240, 190, 188, 11, 255, 0, 63, 55, 191, 248, 12, 104, 255, 0, 133, 245, 224, 95, 249, 249, 189, 255, 0, 192, 99, 64, 30, 159, 69, 121, 135, 252, 47, 175, 2, 255, 0, 207, 205, 239, 254, 3, 26, 63, 225, 125, 120, 23, 254, 126, 111, 127, 240, 24, 208, 7, 113, 171, 232, 22, 186, 179, 71, 51, 13, 147, 198, 192, 137, 0, 231, 131, 94, 99, 226, 248, 37, 135, 196, 151, 174, 202, 64, 119, 200, 56, 234, 43, 91, 254, 23, 215, 129, 127, 231, 230, 247, 255, 0, 1, 141, 117, 50, 67, 166, 120, 231, 195, 118, 183, 246, 185, 242, 230, 79, 50, 222, 82, 184, 96, 40, 3, 201, 168, 174, 146, 95, 3, 234, 240, 28, 57, 181, 94, 73, 27, 166, 3, 53, 31, 252, 33, 122, 175, 252, 245, 178, 255, 0, 191, 226, 128, 57, 250, 43, 160, 255, 0, 132, 43, 84, 255, 0, 158, 214, 95, 247, 252, 81, 255, 0, 8, 86, 169, 255, 0, 61, 172, 191, 239, 248, 160, 14, 126, 138, 232, 63, 225, 10, 213, 63, 231, 181, 151, 253, 255, 0, 20, 127, 194, 21, 170, 127, 207, 107, 47, 251, 254, 40, 3, 159, 162, 186, 15, 248, 66, 181, 79, 249, 237, 101, 255, 0, 127, 197, 31, 240, 133, 106, 159, 243, 218, 203, 254, 255, 0, 138, 0, 198, 177, 255, 0, 144, 141, 191, 253, 118, 95, 231, 90, 62, 42, 255, 0, 145, 163, 80, 255, 0, 174, 181, 122, 215, 193, 218, 148, 87, 144, 185, 146, 204, 133, 112, 113, 231, 143, 90, 183, 175, 248, 95, 80, 188, 215, 111, 46, 97, 123, 111, 45, 223, 42, 26, 92, 26, 9, 148, 212, 117, 108, 227, 168, 173, 239, 248, 67, 181, 79, 249, 235, 105, 255, 0, 127, 104, 255, 0, 132, 59, 84, 255, 0, 158, 182, 159, 247, 246, 139, 49, 123, 90, 95, 204, 140, 26, 43, 123, 254, 16, 237, 83, 254, 122, 218, 127, 223, 218, 63, 225, 14, 213, 63, 231, 173, 167, 253, 253, 162, 204, 61, 173, 47, 230, 70, 13, 21, 189, 255, 0, 8, 118, 169, 255, 0, 61, 109, 63, 239, 237, 31, 240, 135, 106, 159, 243, 214, 211, 254, 254, 209, 102, 30, 214, 151, 243, 35, 6, 138, 222, 255, 0, 132, 59, 84, 255, 0, 158, 182, 159, 247, 246, 143, 248, 67, 181, 79, 249, 235, 105, 255, 0, 127, 104, 179, 15, 107, 75, 249, 145, 145, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 60, 87, 255, 0, 35, 78, 161, 255, 0, 93, 191, 165, 94, 179, 240, 150, 165, 13, 228, 50, 187, 218, 108, 89, 1, 63, 189, 247, 171, 122, 231, 133, 181, 13, 67, 93, 186, 186, 183, 150, 215, 202, 146, 76, 169, 50, 138, 118, 125, 129, 84, 131, 217, 156, 118, 40, 197, 116, 63, 240, 134, 106, 255, 0, 223, 180, 255, 0, 191, 194, 143, 248, 67, 53, 127, 239, 218, 127, 223, 225, 79, 145, 246, 43, 153, 119, 57, 236, 81, 138, 232, 127, 225, 12, 213, 255, 0, 191, 105, 255, 0, 127, 133, 31, 240, 134, 106, 255, 0, 223, 180, 255, 0, 191, 194, 142, 71, 216, 57, 151, 115, 158, 197, 24, 174, 135, 254, 16, 205, 95, 251, 246, 159, 247, 248, 81, 255, 0, 8, 102, 175, 253, 251, 79, 251, 252, 40, 228, 125, 131, 153, 119, 57, 236, 81, 138, 232, 127, 225, 12, 213, 255, 0, 191, 105, 255, 0, 127, 133, 31, 240, 134, 106, 255, 0, 223, 180, 255, 0, 191, 194, 142, 71, 216, 57, 151, 115, 26, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 120, 171, 254, 70, 125, 67, 254, 187, 127, 74, 208, 180, 240, 110, 171, 13, 228, 18, 51, 218, 20, 87, 7, 137, 71, 173, 90, 215, 252, 43, 168, 222, 235, 215, 151, 48, 203, 106, 35, 119, 202, 137, 38, 0, 210, 105, 160, 77, 51, 142, 162, 186, 15, 248, 66, 245, 95, 249, 237, 101, 255, 0, 127, 197, 31, 240, 133, 234, 191, 243, 218, 203, 254, 255, 0, 138, 67, 57, 250, 43, 160, 255, 0, 132, 47, 85, 255, 0, 158, 214, 95, 247, 252, 81, 255, 0, 8, 94, 171, 255, 0, 61, 172, 191, 239, 248, 160, 14, 126, 138, 232, 63, 225, 11, 213, 127, 231, 181, 151, 253, 255, 0, 20, 127, 194, 23, 170, 255, 0, 207, 107, 47, 251, 254, 40, 3, 159, 162, 186, 15, 248, 66, 245, 95, 249, 237, 101, 255, 0, 127, 197, 31, 240, 133, 234, 191, 243, 218, 203, 254, 255, 0, 138, 0, 197, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 122, 215, 193, 218, 154, 94, 194, 251, 236, 254, 71, 7, 137, 135, 173, 93, 215, 252, 43, 168, 222, 235, 183, 151, 16, 203, 106, 35, 119, 202, 135, 152, 3, 249, 80, 7, 27, 69, 116, 31, 240, 133, 234, 191, 243, 218, 203, 254, 255, 0, 138, 63, 225, 10, 213, 63, 231, 181, 151, 253, 255, 0, 20, 1, 207, 209, 93, 7, 252, 33, 90, 167, 252, 246, 178, 255, 0, 191, 226, 143, 248, 66, 181, 79, 249, 237, 101, 255, 0, 127, 197, 0, 115, 244, 87, 65, 255, 0, 8, 86, 169, 255, 0, 61, 172, 191, 239, 248, 163, 254, 16, 173, 83, 254, 123, 89, 127, 223, 241, 64, 28, 253, 21, 208, 127, 194, 21, 170, 127, 207, 107, 47, 251, 254, 40, 255, 0, 132, 43, 84, 255, 0, 158, 214, 95, 247, 252, 80, 6, 45, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 26, 135, 253, 118, 254, 130, 175, 218, 248, 59, 83, 138, 246, 9, 30, 75, 50, 138, 224, 241, 56, 57, 230, 173, 248, 131, 194, 186, 133, 238, 187, 121, 115, 12, 182, 162, 57, 31, 42, 26, 96, 13, 0, 113, 212, 87, 65, 255, 0, 8, 94, 171, 255, 0, 61, 172, 191, 239, 248, 163, 254, 16, 189, 87, 254, 123, 89, 127, 223, 241, 64, 28, 253, 21, 208, 127, 194, 23, 170, 255, 0, 207, 107, 47, 251, 254, 40, 255, 0, 132, 47, 85, 255, 0, 158, 214, 95, 247, 252, 80, 7, 63, 69, 116, 31, 240, 133, 234, 191, 243, 218, 203, 254, 255, 0, 138, 63, 225, 11, 213, 127, 231, 181, 151, 253, 255, 0, 20, 1, 207, 209, 93, 7, 252, 33, 122, 175, 252, 246, 178, 255, 0, 191, 226, 143, 248, 66, 245, 95, 249, 237, 101, 255, 0, 127, 197, 0, 99, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 15, 21, 127, 200, 211, 168, 127, 215, 90, 191, 107, 224, 237, 78, 59, 200, 36, 146, 75, 50, 170, 224, 224, 78, 15, 122, 191, 173, 120, 71, 87, 212, 181, 187, 235, 139, 113, 1, 142, 71, 254, 255, 0, 61, 40, 3, 138, 165, 142, 54, 149, 130, 34, 150, 115, 216, 115, 93, 166, 155, 240, 238, 234, 73, 9, 212, 167, 17, 47, 111, 40, 231, 38, 187, 61, 55, 195, 122, 102, 150, 177, 24, 109, 144, 205, 24, 255, 0, 92, 126, 241, 247, 160, 15, 47, 211, 188, 45, 171, 106, 173, 136, 224, 49, 14, 237, 47, 28, 87, 103, 166, 124, 62, 178, 131, 202, 150, 241, 204, 210, 14, 90, 63, 225, 250, 87, 105, 69, 0, 83, 179, 211, 172, 244, 244, 197, 165, 178, 67, 198, 62, 81, 87, 43, 33, 252, 81, 160, 198, 229, 95, 87, 178, 12, 167, 4, 25, 135, 20, 159, 240, 149, 232, 31, 244, 24, 177, 255, 0, 191, 194, 128, 54, 40, 172, 127, 248, 74, 244, 15, 250, 12, 88, 255, 0, 223, 225, 71, 252, 37, 122, 7, 253, 6, 44, 127, 239, 240, 160, 13, 138, 43, 31, 254, 18, 189, 3, 254, 131, 22, 63, 247, 248, 81, 255, 0, 9, 94, 129, 255, 0, 65, 139, 31, 251, 252, 40, 3, 98, 138, 199, 255, 0, 132, 175, 64, 255, 0, 160, 197, 143, 253, 254, 20, 127, 194, 87, 160, 127, 208, 98, 199, 254, 255, 0, 10, 0, 216, 162, 177, 255, 0, 225, 43, 208, 63, 232, 49, 99, 255, 0, 127, 133, 31, 240, 149, 232, 31, 244, 24, 177, 255, 0, 191, 194, 128, 54, 40, 172, 127, 248, 74, 244, 15, 250, 12, 88, 255, 0, 223, 225, 71, 252, 37, 122, 7, 253, 6, 44, 127, 239, 240, 160, 13, 138, 43, 31, 254, 18, 189, 3, 254, 131, 22, 63, 247, 248, 81, 255, 0, 9, 94, 129, 255, 0, 65, 139, 31, 251, 252, 40, 3, 98, 138, 199, 255, 0, 132, 175, 64, 255, 0, 160, 197, 143, 253, 254, 20, 127, 194, 87, 160, 127, 208, 98, 199, 254, 255, 0, 10, 0, 216, 162, 177, 255, 0, 225, 43, 208, 63, 232, 49, 99, 255, 0, 127, 133, 31, 240, 149, 232, 31, 244, 24, 177, 255, 0, 191, 194, 128, 54, 40, 172, 127, 248, 74, 244, 15, 250, 12, 88, 255, 0, 223, 225, 71, 252, 37, 122, 7, 253, 6, 44, 127, 239, 240, 160, 13, 138, 43, 31, 254, 18, 189, 3, 254, 131, 22, 63, 247, 248, 81, 255, 0, 9, 94, 129, 255, 0, 65, 139, 31, 251, 252, 40, 3, 98, 138, 199, 255, 0, 132, 175, 64, 255, 0, 160, 197, 143, 253, 254, 20, 127, 194, 87, 160, 127, 208, 98, 199, 254, 255, 0, 10, 0, 216, 162, 177, 255, 0, 225, 43, 208, 63, 232, 49, 99, 255, 0, 127, 133, 31, 240, 149, 232, 31, 244, 24, 177, 255, 0, 191, 194, 128, 54, 40, 172, 127, 248, 74, 244, 15, 250, 12, 88, 255, 0, 223, 225, 71, 252, 37, 122, 7, 253, 6, 44, 127, 239, 240, 160, 13, 138, 43, 31, 254, 18, 189, 3, 254, 131, 22, 63, 247, 248, 81, 255, 0, 9, 94, 129, 255, 0, 65, 139, 31, 251, 252, 40, 3, 98, 138, 199, 255, 0, 132, 175, 64, 255, 0, 160, 197, 143, 253, 254, 20, 127, 194, 87, 160, 127, 208, 98, 199, 254, 255, 0, 10, 0, 216, 162, 177, 255, 0, 225, 43, 208, 63, 232, 49, 99, 255, 0, 127, 133, 31, 240, 149, 232, 31, 244, 24, 177, 255, 0, 191, 194, 128, 54, 40, 172, 127, 248, 74, 244, 15, 250, 12, 88, 255, 0, 223, 225, 71, 252, 37, 122, 7, 253, 6, 44, 127, 239, 240, 160, 13, 138, 43, 31, 254, 18, 189, 3, 254, 131, 22, 63, 247, 248, 81, 255, 0, 9, 94, 129, 255, 0, 65, 139, 31, 251, 252, 40, 3, 98, 160, 186, 179, 183, 188, 140, 37, 196, 9, 42, 142, 204, 43, 59, 254, 18, 189, 3, 254, 131, 22, 63, 247, 248, 81, 255, 0, 9, 94, 129, 255, 0, 65, 155, 31, 251, 252, 40, 3, 47, 83, 240, 30, 155, 123, 151, 182, 38, 216, 227, 133, 78, 149, 197, 106, 94, 16, 213, 116, 213, 14, 98, 243, 84, 240, 60, 190, 107, 215, 145, 210, 69, 87, 66, 10, 145, 144, 71, 67, 154, 125, 0, 120, 20, 168, 208, 29, 142, 140, 143, 232, 195, 20, 218, 246, 219, 253, 15, 78, 212, 155, 117, 221, 172, 111, 33, 24, 13, 220, 87, 27, 169, 252, 57, 117, 80, 250, 108, 254, 99, 147, 202, 203, 192, 197, 0, 113, 86, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 52, 106, 31, 245, 219, 250, 10, 211, 135, 193, 26, 204, 23, 112, 77, 50, 219, 170, 44, 160, 231, 204, 30, 181, 62, 191, 225, 93, 70, 251, 93, 189, 185, 134, 91, 97, 27, 190, 84, 60, 192, 31, 202, 128, 56, 234, 43, 160, 255, 0, 132, 47, 85, 255, 0, 158, 214, 95, 247, 252, 81, 255, 0, 8, 94, 171, 255, 0, 61, 172, 191, 239, 248, 160, 14, 126, 138, 232, 63, 225, 11, 213, 127, 231, 181, 151, 253, 255, 0, 20, 127, 194, 23, 170, 255, 0, 207, 107, 47, 251, 254, 40, 3, 159, 162, 186, 15, 248, 66, 245, 95, 249, 237, 101, 255, 0, 127, 197, 31, 240, 133, 234, 191, 243, 218, 203, 254, 255, 0, 138, 0, 231, 232, 174, 131, 254, 16, 189, 87, 254, 123, 89, 127, 223, 241, 71, 252, 33, 122, 175, 252, 246, 178, 255, 0, 191, 226, 128, 49, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 105, 212, 63, 235, 173, 95, 181, 240, 118, 167, 21, 228, 18, 73, 45, 153, 69, 112, 112, 39, 28, 243, 86, 245, 255, 0, 10, 106, 55, 186, 237, 229, 204, 50, 218, 136, 221, 242, 161, 230, 0, 208, 7, 29, 69, 116, 63, 240, 134, 106, 191, 243, 218, 199, 254, 255, 0, 138, 63, 225, 12, 213, 127, 231, 181, 143, 253, 255, 0, 20, 1, 207, 81, 93, 15, 252, 33, 154, 175, 252, 246, 177, 255, 0, 191, 226, 143, 248, 67, 53, 95, 249, 237, 99, 255, 0, 127, 197, 0, 115, 212, 87, 67, 255, 0, 8, 102, 171, 255, 0, 61, 172, 127, 239, 248, 163, 254, 16, 205, 87, 254, 123, 88, 255, 0, 223, 241, 64, 28, 245, 21, 208, 255, 0, 194, 25, 170, 255, 0, 207, 107, 31, 251, 254, 40, 255, 0, 132, 51, 85, 255, 0, 158, 214, 63, 247, 252, 80, 6, 37, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 209, 241, 87, 252, 140, 250, 135, 253, 117, 171, 246, 158, 14, 212, 163, 188, 134, 79, 54, 204, 133, 112, 112, 39, 30, 181, 111, 95, 240, 166, 163, 121, 174, 94, 221, 67, 45, 168, 142, 71, 202, 135, 152, 3, 64, 28, 117, 21, 208, 255, 0, 194, 25, 170, 255, 0, 207, 107, 31, 251, 254, 40, 255, 0, 132, 51, 85, 255, 0, 158, 214, 63, 247, 252, 80, 7, 61, 69, 116, 63, 240, 134, 106, 191, 243, 218, 199, 254, 255, 0, 138, 63, 225, 12, 213, 127, 231, 181, 143, 253, 255, 0, 20, 1, 207, 81, 93, 15, 252, 33, 154, 175, 252, 246, 177, 255, 0, 191, 226, 143, 248, 67, 53, 95, 249, 237, 99, 255, 0, 127, 197, 0, 115, 212, 87, 67, 255, 0, 8, 102, 171, 255, 0, 61, 172, 127, 239, 248, 163, 254, 16, 205, 87, 254, 123, 88, 255, 0, 223, 241, 64, 24, 182, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 75, 197, 95, 242, 52, 106, 31, 245, 218, 175, 90, 248, 59, 83, 138, 242, 9, 36, 150, 204, 162, 184, 56, 19, 143, 90, 185, 175, 248, 87, 82, 190, 215, 111, 46, 97, 123, 97, 28, 143, 149, 13, 40, 7, 165, 53, 113, 54, 142, 50, 138, 223, 255, 0, 132, 47, 87, 255, 0, 158, 150, 127, 247, 248, 81, 255, 0, 8, 94, 175, 255, 0, 61, 44, 255, 0, 239, 240, 163, 149, 246, 14, 101, 220, 192, 162, 183, 255, 0, 225, 11, 213, 255, 0, 231, 165, 159, 253, 254, 20, 127, 194, 23, 171, 255, 0, 207, 75, 63, 251, 252, 41, 242, 62, 193, 204, 187, 152, 20, 86, 255, 0, 252, 33, 122, 191, 252, 244, 179, 255, 0, 191, 194, 143, 248, 66, 245, 127, 249, 233, 103, 255, 0, 127, 133, 46, 87, 216, 57, 151, 115, 2, 138, 223, 255, 0, 132, 47, 87, 255, 0, 158, 150, 127, 247, 248, 81, 255, 0, 8, 94, 175, 255, 0, 61, 44, 255, 0, 239, 240, 167, 200, 251, 7, 50, 238, 99, 216, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 15, 21, 127, 200, 207, 168, 127, 215, 106, 208, 180, 240, 118, 169, 13, 228, 50, 179, 218, 108, 87, 4, 254, 248, 122, 213, 173, 119, 194, 247, 218, 134, 187, 121, 117, 111, 61, 167, 149, 35, 101, 115, 48, 6, 165, 233, 184, 93, 28, 117, 21, 208, 127, 194, 25, 169, 255, 0, 207, 91, 63, 251, 252, 40, 255, 0, 132, 51, 83, 255, 0, 158, 182, 127, 247, 248, 84, 243, 174, 225, 116, 115, 244, 87, 65, 255, 0, 8, 102, 167, 255, 0, 61, 108, 255, 0, 239, 240, 163, 254, 16, 205, 79, 254, 122, 217, 255, 0, 223, 225, 71, 58, 238, 23, 71, 63, 69, 116, 31, 240, 134, 106, 127, 243, 214, 207, 254, 255, 0, 10, 63, 225, 12, 212, 255, 0, 231, 173, 159, 253, 254, 20, 115, 174, 225, 116, 115, 244, 87, 65, 255, 0, 8, 102, 167, 255, 0, 61, 108, 255, 0, 239, 240, 163, 254, 16, 205, 79, 254, 122, 217, 255, 0, 223, 225, 71, 58, 238, 23, 70, 45, 143, 252, 132, 109, 191, 235, 178, 255, 0, 58, 209, 241, 87, 252, 140, 250, 135, 253, 117, 171, 246, 158, 16, 212, 163, 187, 133, 252, 219, 50, 21, 193, 199, 156, 57, 230, 173, 235, 254, 20, 212, 111, 53, 219, 203, 152, 101, 181, 17, 200, 249, 80, 211, 0, 127, 42, 105, 166, 59, 156, 117, 21, 208, 127, 194, 23, 170, 255, 0, 207, 107, 47, 251, 254, 40, 255, 0, 132, 47, 85, 255, 0, 158, 214, 95, 247, 252, 83, 3, 159, 162, 186, 15, 248, 66, 245, 95, 249, 237, 101, 255, 0, 127, 197, 31, 240, 133, 234, 191, 243, 218, 203, 254, 255, 0, 138, 0, 231, 232, 174, 131, 254, 16, 189, 87, 254, 123, 89, 127, 223, 241, 71, 252, 33, 122, 175, 252, 246, 178, 255, 0, 191, 226, 128, 57, 250, 43, 160, 255, 0, 132, 43, 84, 255, 0, 158, 214, 95, 247, 252, 83, 151, 193, 26, 196, 205, 133, 146, 209, 143, 162, 204, 9, 160, 12, 141, 46, 23, 159, 84, 182, 88, 144, 179, 135, 83, 192, 237, 154, 245, 219, 95, 15, 218, 219, 234, 247, 26, 147, 15, 50, 121, 155, 32, 145, 247, 106, 134, 131, 161, 91, 120, 103, 75, 146, 238, 231, 230, 184, 88, 204, 147, 63, 93, 160, 12, 144, 43, 150, 255, 0, 133, 245, 224, 95, 249, 249, 189, 255, 0, 192, 99, 64, 30, 159, 69, 121, 135, 252, 47, 175, 2, 255, 0, 207, 205, 239, 254, 3, 26, 63, 225, 125, 120, 23, 254, 126, 111, 127, 240, 24, 208, 7, 167, 209, 94, 97, 255, 0, 11, 235, 192, 191, 243, 243, 123, 255, 0, 128, 198, 143, 248, 95, 94, 5, 255, 0, 159, 155, 223, 252, 6, 52, 1, 233, 244, 87, 152, 127, 194, 250, 240, 47, 252, 252, 222, 255, 0, 224, 49, 163, 254, 23, 215, 129, 127, 231, 230, 247, 255, 0, 1, 141, 0, 122, 125, 21, 230, 31, 240, 190, 188, 11, 255, 0, 63, 55, 191, 248, 12, 104, 255, 0, 133, 245, 224, 95, 249, 249, 189, 255, 0, 192, 99, 64, 30, 159, 69, 121, 172, 31, 28, 188, 19, 115, 113, 28, 9, 115, 121, 190, 70, 8, 191, 232, 199, 169, 60, 85, 173, 103, 227, 31, 132, 116, 29, 90, 235, 74, 189, 158, 236, 93, 90, 191, 151, 32, 88, 9, 25, 250, 208, 7, 160, 81, 94, 97, 255, 0, 11, 235, 192, 191, 243, 243, 123, 255, 0, 128, 198, 143, 248, 95, 94, 5, 255, 0, 159, 155, 223, 252, 6, 52, 1, 233, 244, 87, 152, 127, 194, 250, 240, 47, 252, 252, 222, 255, 0, 224, 49, 163, 254, 23, 215, 129, 127, 231, 230, 247, 255, 0, 1, 141, 0, 122, 125, 21, 230, 31, 240, 190, 188, 11, 255, 0, 63, 55, 191, 248, 12, 104, 255, 0, 133, 245, 224, 95, 249, 249, 189, 255, 0, 192, 99, 64, 30, 159, 69, 121, 135, 252, 47, 175, 2, 255, 0, 207, 205, 239, 254, 3, 26, 63, 225, 125, 120, 23, 254, 126, 111, 127, 240, 24, 208, 7, 111, 171, 248, 126, 215, 86, 104, 230, 97, 178, 120, 216, 17, 32, 30, 134, 188, 207, 197, 176, 201, 23, 137, 47, 157, 148, 133, 145, 242, 9, 238, 43, 87, 254, 23, 215, 129, 127, 231, 230, 247, 255, 0, 1, 141, 117, 50, 195, 165, 248, 231, 195, 118, 215, 246, 249, 49, 204, 158, 101, 188, 165, 112, 192, 80, 7, 147, 81, 93, 28, 190, 6, 214, 34, 56, 115, 106, 163, 168, 221, 48, 25, 166, 255, 0, 194, 23, 170, 255, 0, 207, 91, 47, 251, 254, 40, 3, 158, 162, 186, 15, 248, 66, 245, 95, 249, 237, 101, 255, 0, 127, 197, 31, 240, 133, 234, 191, 243, 218, 203, 254, 255, 0, 138, 0, 231, 232, 174, 131, 254, 16, 189, 87, 254, 123, 89, 127, 223, 241, 71, 252, 33, 122, 175, 252, 246, 178, 255, 0, 191, 226, 128, 57, 250, 43, 160, 255, 0, 132, 47, 85, 255, 0, 158, 214, 95, 247, 252, 81, 255, 0, 8, 94, 171, 255, 0, 61, 172, 191, 239, 248, 160, 12, 91, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 220, 252, 63, 255, 0, 145, 195, 199, 159, 246, 21, 95, 253, 23, 88, 214, 158, 14, 212, 226, 188, 130, 71, 150, 204, 162, 200, 14, 4, 224, 247, 171, 126, 15, 213, 244, 221, 47, 198, 94, 57, 91, 235, 235, 123, 102, 125, 77, 74, 137, 92, 12, 141, 130, 128, 61, 58, 138, 199, 255, 0, 132, 175, 64, 255, 0, 160, 197, 143, 253, 254, 20, 127, 194, 87, 160, 127, 208, 98, 199, 254, 255, 0, 10, 0, 216, 162, 177, 255, 0, 225, 43, 208, 63, 232, 49, 99, 255, 0, 127, 133, 73, 111, 226, 61, 22, 234, 117, 183, 183, 213, 45, 37, 149, 206, 21, 18, 80, 73, 52, 1, 243, 47, 199, 191, 249, 42, 23, 31, 245, 235, 15, 242, 175, 49, 175, 79, 248, 249, 255, 0, 37, 62, 111, 250, 245, 135, 249, 26, 243, 10, 0, 40, 162, 138, 0, 191, 161, 127, 200, 193, 166, 255, 0, 215, 212, 95, 250, 24, 175, 161, 60, 86, 163, 254, 18, 157, 67, 175, 250, 239, 95, 97, 95, 61, 232, 95, 242, 48, 105, 191, 245, 245, 23, 254, 134, 43, 232, 95, 21, 127, 200, 211, 168, 127, 215, 111, 232, 40, 3, 23, 106, 255, 0, 183, 249, 154, 54, 175, 251, 127, 153, 167, 209, 64, 12, 218, 191, 237, 254, 102, 141, 171, 254, 223, 230, 105, 244, 80, 3, 54, 175, 251, 127, 153, 163, 106, 255, 0, 183, 249, 154, 125, 20, 0, 108, 4, 224, 110, 201, 247, 53, 233, 254, 12, 240, 194, 105, 176, 45, 253, 200, 63, 106, 113, 144, 9, 251, 162, 185, 255, 0, 3, 120, 123, 237, 215, 159, 111, 185, 95, 220, 68, 126, 80, 127, 136, 215, 168, 80, 6, 126, 185, 255, 0, 32, 13, 75, 254, 189, 37, 255, 0, 208, 77, 124, 39, 95, 118, 107, 191, 242, 0, 212, 127, 235, 214, 95, 253, 4, 215, 194, 116, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 127, 66, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 49, 93, 7, 197, 79, 249, 42, 30, 33, 255, 0, 175, 179, 252, 133, 115, 250, 23, 252, 140, 26, 111, 253, 125, 69, 255, 0, 161, 138, 232, 62, 42, 127, 201, 80, 241, 15, 253, 125, 159, 228, 40, 3, 144, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 175, 178, 254, 22, 127, 201, 47, 240, 247, 253, 122, 15, 230, 107, 227, 74, 251, 51, 225, 95, 252, 147, 15, 15, 255, 0, 215, 160, 254, 102, 128, 47, 248, 175, 195, 145, 235, 182, 37, 147, 139, 184, 198, 99, 96, 122, 251, 87, 145, 73, 3, 67, 43, 197, 48, 101, 117, 56, 32, 147, 197, 123, 245, 121, 255, 0, 143, 60, 60, 73, 254, 214, 182, 95, 250, 238, 7, 243, 160, 15, 61, 218, 63, 218, 255, 0, 190, 141, 27, 71, 251, 95, 247, 209, 167, 209, 64, 12, 218, 63, 218, 255, 0, 190, 141, 27, 71, 251, 95, 247, 209, 167, 209, 64, 12, 218, 63, 218, 255, 0, 190, 141, 27, 71, 251, 95, 247, 209, 167, 209, 64, 19, 88, 168, 26, 141, 183, 222, 255, 0, 90, 189, 207, 173, 107, 120, 148, 15, 248, 72, 239, 248, 63, 235, 125, 125, 171, 42, 199, 254, 66, 54, 223, 245, 213, 127, 157, 107, 248, 147, 254, 70, 59, 239, 250, 235, 253, 43, 72, 159, 61, 196, 191, 238, 241, 245, 253, 25, 145, 129, 232, 127, 58, 48, 61, 15, 231, 69, 21, 103, 198, 6, 7, 161, 252, 232, 192, 244, 63, 157, 20, 80, 1, 129, 232, 127, 58, 48, 61, 15, 231, 69, 20, 0, 96, 122, 31, 206, 140, 15, 67, 249, 209, 69, 0, 24, 92, 116, 63, 247, 209, 171, 66, 49, 180, 117, 252, 205, 86, 237, 86, 199, 221, 21, 235, 229, 91, 200, 246, 114, 109, 229, 242, 19, 104, 247, 252, 232, 218, 61, 255, 0, 58, 118, 40, 197, 122, 231, 184, 55, 104, 247, 252, 232, 218, 61, 255, 0, 58, 118, 40, 197, 0, 55, 104, 247, 252, 232, 218, 61, 255, 0, 58, 118, 40, 197, 0, 55, 104, 247, 252, 232, 218, 61, 255, 0, 58, 118, 40, 197, 0, 75, 102, 7, 219, 173, 250, 255, 0, 173, 94, 254, 244, 223, 21, 168, 255, 0, 132, 167, 80, 60, 255, 0, 173, 245, 62, 130, 159, 101, 255, 0, 31, 208, 127, 215, 69, 254, 116, 207, 21, 127, 200, 211, 168, 127, 215, 95, 233, 94, 22, 111, 241, 68, 244, 112, 91, 51, 23, 104, 255, 0, 107, 254, 250, 52, 109, 31, 237, 127, 223, 70, 159, 69, 120, 231, 112, 205, 163, 253, 175, 251, 232, 209, 180, 127, 181, 255, 0, 125, 26, 125, 20, 0, 205, 163, 253, 175, 251, 232, 209, 180, 127, 181, 255, 0, 125, 26, 125, 20, 0, 205, 163, 253, 175, 251, 232, 209, 180, 127, 181, 255, 0, 125, 26, 125, 20, 1, 45, 140, 99, 251, 70, 219, 175, 250, 213, 254, 35, 235, 90, 94, 43, 80, 124, 81, 168, 117, 255, 0, 90, 123, 214, 125, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 141, 58, 135, 253, 117, 52, 1, 139, 180, 123, 254, 102, 141, 163, 223, 243, 52, 250, 40, 1, 155, 71, 191, 230, 104, 218, 61, 255, 0, 51, 79, 162, 128, 25, 180, 123, 254, 102, 141, 163, 223, 243, 52, 250, 40, 1, 155, 71, 191, 230, 104, 218, 61, 255, 0, 51, 79, 162, 128, 36, 176, 81, 253, 163, 107, 215, 253, 106, 255, 0, 17, 245, 21, 165, 226, 181, 31, 240, 148, 234, 29, 127, 215, 122, 251, 86, 125, 143, 252, 132, 109, 127, 235, 170, 255, 0, 49, 90, 62, 42, 255, 0, 145, 163, 80, 255, 0, 174, 191, 210, 128, 49, 118, 143, 246, 191, 239, 163, 70, 209, 254, 215, 253, 244, 105, 244, 80, 3, 54, 143, 246, 191, 239, 163, 70, 209, 254, 215, 253, 244, 105, 244, 80, 3, 54, 143, 246, 191, 239, 163, 70, 209, 254, 215, 253, 244, 105, 245, 44, 22, 243, 221, 182, 219, 120, 100, 144, 147, 143, 148, 103, 20, 1, 95, 104, 255, 0, 107, 254, 250, 53, 110, 203, 74, 186, 212, 230, 88, 237, 96, 149, 139, 28, 6, 201, 199, 231, 93, 150, 145, 240, 242, 103, 253, 238, 169, 55, 150, 67, 12, 71, 23, 57, 30, 245, 222, 217, 217, 91, 88, 91, 136, 45, 97, 88, 162, 235, 180, 80, 7, 7, 163, 124, 60, 149, 100, 19, 234, 55, 13, 28, 145, 176, 40, 177, 54, 65, 250, 215, 123, 21, 180, 48, 52, 146, 34, 5, 105, 14, 231, 199, 115, 83, 209, 64, 5, 20, 81, 64, 5, 20, 81, 64, 31, 9, 107, 191, 242, 48, 106, 127, 245, 247, 47, 254, 134, 106, 133, 95, 215, 127, 228, 96, 212, 255, 0, 235, 238, 95, 253, 12, 213, 10, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 251, 179, 66, 255, 0, 145, 123, 76, 255, 0, 175, 88, 191, 244, 17, 90, 21, 159, 161, 127, 200, 189, 166, 127, 215, 172, 95, 250, 8, 173, 10, 0, 40, 162, 138, 0, 130, 226, 214, 11, 181, 217, 60, 65, 208, 16, 195, 62, 181, 198, 248, 143, 192, 102, 254, 226, 226, 254, 198, 118, 55, 51, 54, 76, 78, 112, 181, 220, 209, 64, 30, 29, 168, 232, 23, 218, 76, 205, 21, 212, 18, 124, 163, 121, 101, 36, 175, 231, 89, 187, 23, 223, 243, 53, 239, 243, 193, 29, 204, 47, 4, 202, 30, 55, 24, 101, 61, 197, 112, 186, 207, 195, 212, 111, 54, 125, 46, 76, 72, 196, 17, 3, 253, 208, 40, 3, 206, 246, 15, 127, 251, 232, 209, 180, 127, 181, 255, 0, 125, 26, 187, 125, 97, 117, 166, 202, 208, 221, 192, 201, 176, 224, 156, 112, 127, 26, 171, 64, 12, 218, 63, 218, 255, 0, 190, 141, 27, 71, 251, 95, 247, 209, 167, 209, 64, 12, 218, 63, 218, 255, 0, 190, 141, 27, 71, 251, 95, 247, 209, 167, 209, 64, 18, 88, 40, 254, 209, 181, 235, 254, 181, 127, 136, 250, 138, 210, 241, 90, 143, 248, 74, 117, 14, 191, 235, 189, 79, 165, 80, 177, 255, 0, 144, 141, 175, 253, 117, 95, 230, 43, 67, 197, 127, 242, 52, 234, 31, 245, 215, 250, 80, 6, 46, 209, 254, 215, 253, 244, 104, 218, 63, 218, 255, 0, 190, 141, 62, 138, 0, 102, 209, 254, 215, 253, 244, 104, 218, 63, 218, 255, 0, 190, 141, 62, 138, 0, 102, 209, 254, 215, 253, 244, 104, 218, 63, 218, 255, 0, 190, 141, 62, 138, 0, 102, 209, 254, 215, 253, 244, 104, 218, 63, 218, 255, 0, 190, 141, 62, 138, 0, 146, 197, 71, 246, 141, 183, 222, 255, 0, 90, 189, 207, 173, 105, 120, 169, 71, 252, 37, 58, 135, 95, 245, 190, 166, 168, 88, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 211, 168, 127, 215, 90, 0, 197, 216, 61, 255, 0, 239, 163, 70, 193, 239, 255, 0, 125, 26, 125, 20, 0, 205, 131, 223, 254, 250, 52, 108, 30, 255, 0, 247, 209, 167, 209, 64, 12, 216, 61, 255, 0, 239, 163, 70, 193, 239, 255, 0, 125, 26, 125, 20, 0, 205, 131, 223, 254, 250, 52, 108, 30, 255, 0, 247, 209, 167, 209, 64, 19, 88, 40, 254, 209, 181, 235, 254, 181, 123, 159, 81, 91, 254, 36, 81, 255, 0, 9, 21, 247, 95, 245, 190, 181, 131, 97, 255, 0, 33, 27, 95, 250, 234, 191, 204, 86, 255, 0, 136, 191, 228, 97, 188, 255, 0, 174, 159, 210, 189, 108, 167, 248, 207, 208, 228, 198, 124, 40, 203, 218, 61, 255, 0, 58, 54, 143, 127, 206, 157, 138, 49, 94, 249, 229, 141, 218, 61, 255, 0, 58, 54, 143, 127, 206, 157, 69, 3, 27, 180, 123, 254, 116, 109, 30, 255, 0, 157, 58, 138, 0, 110, 209, 239, 249, 209, 180, 123, 254, 116, 234, 40, 1, 187, 71, 191, 231, 89, 46, 163, 204, 61, 122, 255, 0, 120, 214, 197, 100, 63, 250, 195, 245, 175, 149, 226, 143, 134, 151, 207, 244, 55, 163, 212, 102, 209, 254, 215, 253, 244, 104, 218, 63, 218, 255, 0, 190, 141, 62, 138, 249, 3, 97, 155, 71, 251, 95, 247, 209, 163, 104, 255, 0, 107, 254, 250, 52, 250, 40, 1, 155, 71, 251, 95, 247, 209, 163, 104, 255, 0, 107, 254, 250, 52, 250, 40, 1, 155, 71, 251, 95, 247, 209, 163, 104, 255, 0, 107, 254, 250, 52, 250, 40, 2, 91, 5, 31, 218, 86, 189, 127, 214, 175, 241, 31, 90, 213, 241, 90, 143, 248, 74, 117, 14, 191, 235, 125, 77, 102, 216, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 47, 21, 127, 200, 209, 127, 255, 0, 93, 107, 210, 203, 246, 145, 211, 67, 169, 139, 180, 127, 181, 255, 0, 125, 26, 54, 143, 246, 191, 239, 163, 79, 162, 189, 35, 160, 102, 209, 254, 215, 253, 244, 104, 218, 63, 218, 255, 0, 190, 141, 62, 138, 0, 102, 209, 254, 215, 253, 244, 104, 218, 63, 218, 255, 0, 190, 141, 62, 138, 0, 79, 44, 19, 143, 155, 39, 253, 163, 94, 161, 224, 207, 12, 166, 153, 110, 183, 183, 42, 126, 212, 227, 229, 4, 253, 209, 92, 255, 0, 129, 252, 63, 246, 235, 179, 127, 114, 191, 184, 132, 252, 160, 255, 0, 17, 175, 80, 160, 12, 253, 119, 254, 69, 221, 79, 254, 189, 37, 255, 0, 208, 77, 124, 39, 95, 118, 107, 191, 242, 46, 234, 127, 245, 233, 47, 254, 130, 107, 225, 58, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 191, 161, 255, 0, 200, 193, 166, 255, 0, 215, 212, 95, 250, 16, 174, 131, 226, 167, 252, 148, 255, 0, 16, 255, 0, 215, 217, 254, 66, 185, 253, 15, 254, 70, 13, 55, 254, 190, 162, 255, 0, 208, 133, 116, 31, 21, 63, 228, 167, 248, 135, 254, 190, 207, 242, 20, 1, 200, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 87, 217, 191, 11, 63, 228, 151, 248, 127, 254, 189, 71, 243, 53, 241, 149, 125, 157, 240, 179, 254, 73, 127, 135, 191, 235, 208, 127, 51, 64, 23, 124, 87, 225, 216, 245, 219, 18, 200, 49, 117, 24, 204, 103, 56, 207, 181, 121, 20, 176, 52, 50, 188, 51, 6, 86, 83, 134, 4, 154, 247, 234, 243, 255, 0, 30, 248, 123, 254, 98, 214, 201, 255, 0, 93, 128, 31, 173, 0, 121, 238, 209, 254, 215, 253, 244, 104, 218, 63, 218, 255, 0, 190, 141, 62, 138, 0, 102, 209, 254, 215, 253, 244, 104, 218, 63, 218, 255, 0, 190, 141, 62, 138, 0, 102, 209, 254, 215, 253, 244, 104, 218, 63, 218, 255, 0, 190, 141, 62, 138, 0, 146, 193, 71, 246, 141, 175, 95, 245, 171, 220, 250, 215, 150, 252, 83, 255, 0, 146, 159, 226, 15, 250, 251, 63, 200, 87, 170, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 175, 43, 248, 167, 255, 0, 37, 63, 196, 31, 245, 246, 127, 144, 160, 14, 66, 138, 40, 160, 2, 186, 239, 133, 191, 242, 83, 252, 63, 255, 0, 95, 67, 249, 26, 228, 107, 174, 248, 89, 255, 0, 37, 63, 195, 255, 0, 245, 246, 63, 145, 160, 14, 135, 227, 231, 252, 148, 249, 255, 0, 235, 214, 31, 228, 107, 204, 43, 211, 254, 62, 127, 201, 79, 159, 254, 189, 97, 254, 70, 188, 194, 128, 10, 40, 162, 128, 47, 232, 95, 242, 48, 105, 191, 245, 245, 23, 254, 134, 43, 232, 95, 21, 127, 200, 207, 168, 127, 215, 111, 233, 95, 61, 104, 95, 242, 48, 105, 191, 245, 245, 23, 254, 134, 43, 232, 95, 21, 127, 200, 211, 168, 127, 215, 111, 233, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 21, 98, 194, 205, 245, 11, 232, 173, 97, 25, 103, 56, 170, 245, 223, 124, 59, 210, 49, 230, 234, 114, 47, 251, 17, 103, 245, 52, 1, 219, 233, 246, 81, 233, 214, 16, 218, 196, 62, 68, 92, 125, 106, 213, 20, 80, 6, 126, 187, 255, 0, 32, 13, 71, 254, 189, 101, 255, 0, 208, 77, 124, 39, 95, 118, 107, 191, 242, 0, 212, 127, 235, 214, 95, 253, 4, 215, 194, 116, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 127, 66, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 49, 93, 7, 197, 79, 249, 42, 30, 33, 255, 0, 175, 179, 252, 133, 115, 250, 23, 252, 140, 26, 111, 253, 125, 69, 255, 0, 161, 138, 232, 62, 42, 127, 201, 80, 241, 15, 253, 125, 159, 228, 40, 3, 144, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 175, 179, 126, 21, 255, 0, 201, 48, 240, 247, 253, 122, 15, 230, 107, 227, 42, 251, 55, 225, 95, 252, 147, 15, 15, 127, 215, 160, 254, 102, 128, 58, 250, 142, 104, 146, 226, 25, 33, 113, 185, 88, 96, 131, 82, 81, 64, 30, 37, 174, 233, 47, 163, 234, 179, 90, 183, 250, 190, 177, 159, 81, 89, 181, 233, 222, 62, 210, 62, 215, 166, 45, 244, 75, 153, 109, 186, 227, 251, 181, 230, 52, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 173, 191, 235, 170, 255, 0, 58, 213, 241, 39, 252, 140, 151, 223, 245, 215, 250, 86, 85, 143, 252, 132, 173, 191, 235, 170, 255, 0, 58, 213, 241, 39, 252, 140, 151, 223, 245, 215, 250, 85, 195, 115, 231, 120, 143, 253, 222, 62, 191, 163, 50, 168, 162, 138, 208, 248, 208, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 237, 87, 7, 221, 21, 79, 181, 92, 31, 116, 87, 173, 149, 111, 35, 217, 201, 183, 151, 200, 90, 40, 162, 189, 131, 223, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 178, 255, 0, 143, 232, 127, 223, 95, 231, 76, 241, 87, 252, 141, 58, 135, 253, 117, 254, 148, 251, 47, 248, 254, 135, 253, 245, 254, 116, 207, 21, 127, 200, 211, 168, 127, 215, 95, 233, 94, 22, 111, 241, 68, 238, 193, 236, 204, 138, 40, 162, 188, 115, 184, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 54, 223, 245, 213, 127, 157, 104, 120, 171, 254, 70, 157, 67, 254, 187, 86, 125, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 141, 58, 135, 253, 118, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 175, 253, 117, 95, 230, 43, 67, 197, 95, 242, 52, 106, 31, 245, 215, 250, 86, 125, 143, 252, 132, 109, 127, 235, 170, 255, 0, 49, 90, 30, 42, 255, 0, 145, 163, 80, 255, 0, 174, 191, 210, 128, 50, 40, 162, 155, 211, 154, 0, 117, 44, 81, 188, 146, 4, 69, 44, 231, 248, 71, 90, 219, 208, 252, 47, 123, 172, 201, 194, 24, 109, 135, 223, 145, 184, 227, 219, 214, 189, 43, 72, 240, 214, 159, 164, 162, 20, 136, 60, 224, 96, 204, 195, 147, 64, 28, 86, 137, 224, 59, 187, 153, 4, 186, 145, 242, 33, 225, 130, 14, 167, 216, 215, 161, 88, 105, 118, 90, 98, 50, 89, 219, 164, 65, 185, 56, 239, 87, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 15, 132, 181, 223, 249, 24, 53, 47, 250, 250, 151, 255, 0, 67, 53, 66, 175, 235, 191, 242, 48, 106, 95, 245, 245, 47, 254, 134, 106, 133, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 125, 217, 161, 127, 200, 189, 166, 127, 215, 172, 95, 250, 8, 173, 10, 207, 208, 191, 228, 94, 211, 63, 235, 214, 47, 253, 4, 86, 133, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 86, 188, 177, 182, 212, 32, 48, 93, 194, 178, 199, 215, 4, 87, 9, 174, 252, 63, 147, 204, 51, 233, 76, 10, 150, 201, 133, 184, 218, 61, 171, 209, 40, 160, 15, 4, 158, 9, 109, 230, 242, 167, 66, 146, 14, 48, 195, 21, 29, 123, 110, 167, 161, 216, 106, 234, 62, 211, 110, 172, 224, 96, 63, 113, 94, 111, 174, 248, 54, 251, 73, 253, 228, 74, 110, 109, 178, 6, 229, 229, 179, 244, 160, 14, 106, 138, 40, 160, 9, 172, 63, 228, 35, 107, 255, 0, 93, 87, 249, 138, 209, 241, 95, 252, 141, 58, 135, 253, 117, 254, 149, 157, 97, 255, 0, 33, 27, 95, 250, 234, 191, 204, 86, 143, 138, 255, 0, 228, 105, 212, 63, 235, 175, 244, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 167, 80, 255, 0, 174, 181, 159, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 78, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 35, 107, 255, 0, 93, 87, 249, 138, 232, 124, 71, 255, 0, 35, 5, 231, 251, 245, 207, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 21, 208, 248, 143, 254, 70, 11, 207, 247, 235, 212, 202, 127, 140, 253, 14, 76, 103, 194, 140, 186, 40, 162, 190, 132, 243, 130, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 178, 27, 253, 97, 250, 214, 189, 100, 55, 250, 195, 245, 175, 149, 226, 127, 134, 159, 204, 218, 151, 80, 162, 138, 43, 227, 205, 194, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 11, 22, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 75, 197, 95, 242, 51, 234, 31, 245, 214, 179, 108, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 151, 138, 191, 228, 103, 212, 63, 235, 173, 122, 153, 126, 204, 222, 143, 83, 34, 138, 40, 175, 68, 232, 10, 40, 162, 128, 10, 177, 97, 101, 46, 161, 123, 21, 172, 60, 179, 156, 125, 42, 189, 119, 223, 14, 180, 140, 121, 186, 156, 171, 254, 196, 95, 212, 208, 7, 107, 167, 89, 71, 167, 88, 67, 107, 8, 194, 32, 199, 215, 222, 174, 81, 69, 0, 103, 235, 191, 242, 46, 234, 127, 245, 233, 47, 254, 130, 107, 225, 58, 251, 179, 93, 255, 0, 145, 119, 83, 255, 0, 175, 73, 127, 244, 19, 95, 9, 208, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 5, 253, 15, 254, 70, 13, 55, 254, 190, 162, 255, 0, 208, 133, 116, 31, 21, 63, 228, 167, 248, 135, 254, 190, 207, 242, 21, 207, 232, 127, 242, 48, 105, 191, 245, 245, 23, 254, 132, 43, 160, 248, 169, 255, 0, 37, 63, 196, 63, 245, 246, 127, 144, 160, 14, 66, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 190, 206, 248, 89, 255, 0, 36, 191, 195, 223, 245, 232, 63, 153, 175, 140, 107, 236, 239, 133, 159, 242, 75, 252, 61, 255, 0, 94, 131, 249, 154, 0, 235, 170, 57, 162, 75, 136, 94, 41, 6, 232, 220, 96, 131, 82, 81, 64, 30, 35, 174, 233, 79, 163, 234, 146, 218, 183, 221, 206, 80, 250, 138, 206, 175, 78, 241, 246, 147, 246, 173, 49, 111, 163, 92, 203, 111, 247, 177, 221, 107, 204, 104, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 229, 127, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 21, 234, 150, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 202, 254, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 40, 3, 144, 162, 138, 40, 0, 174, 187, 225, 103, 252, 148, 255, 0, 15, 255, 0, 215, 216, 254, 70, 185, 26, 235, 190, 22, 127, 201, 79, 240, 255, 0, 253, 125, 143, 228, 104, 3, 161, 248, 249, 255, 0, 37, 62, 127, 250, 245, 135, 249, 26, 243, 10, 244, 255, 0, 143, 159, 242, 83, 231, 255, 0, 175, 88, 127, 145, 175, 48, 160, 2, 138, 40, 160, 11, 250, 23, 252, 140, 26, 103, 253, 125, 197, 255, 0, 161, 138, 250, 23, 197, 95, 242, 52, 234, 31, 245, 219, 250, 87, 207, 90, 23, 252, 140, 26, 103, 253, 125, 197, 255, 0, 161, 138, 250, 23, 197, 95, 242, 52, 234, 31, 245, 219, 250, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 15, 134, 38, 154, 116, 137, 121, 119, 108, 10, 246, 253, 42, 197, 52, 221, 50, 11, 85, 24, 216, 184, 62, 230, 188, 191, 193, 118, 63, 109, 241, 12, 76, 87, 41, 0, 50, 26, 245, 218, 0, 40, 162, 138, 0, 207, 215, 127, 228, 1, 168, 255, 0, 215, 172, 191, 250, 9, 175, 132, 235, 238, 205, 119, 254, 64, 26, 143, 253, 122, 203, 255, 0, 160, 154, 248, 78, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 47, 232, 95, 242, 48, 105, 159, 245, 247, 23, 254, 134, 43, 160, 248, 169, 255, 0, 37, 67, 196, 63, 245, 246, 127, 144, 174, 127, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 93, 7, 197, 79, 249, 42, 30, 33, 255, 0, 175, 179, 252, 133, 0, 114, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 21, 246, 111, 194, 191, 249, 38, 30, 30, 255, 0, 175, 65, 252, 205, 124, 101, 95, 102, 252, 43, 255, 0, 146, 97, 225, 239, 250, 244, 31, 204, 208, 7, 95, 69, 20, 80, 4, 115, 68, 183, 16, 60, 46, 62, 70, 24, 175, 13, 213, 44, 155, 78, 212, 103, 181, 126, 168, 216, 175, 118, 175, 51, 248, 139, 99, 228, 234, 112, 221, 129, 196, 203, 130, 125, 197, 0, 113, 148, 81, 69, 0, 20, 81, 69, 0, 79, 99, 255, 0, 33, 43, 111, 250, 234, 191, 206, 181, 124, 73, 255, 0, 35, 37, 247, 253, 117, 254, 149, 149, 99, 255, 0, 33, 43, 111, 250, 234, 191, 206, 181, 124, 73, 255, 0, 35, 37, 247, 253, 117, 254, 149, 112, 220, 249, 222, 35, 255, 0, 119, 143, 175, 232, 204, 170, 40, 162, 180, 62, 52, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 59, 85, 193, 247, 69, 83, 237, 87, 7, 221, 21, 235, 101, 91, 200, 246, 114, 109, 229, 242, 22, 138, 40, 175, 96, 247, 194, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 191, 227, 250, 31, 247, 215, 249, 211, 60, 85, 255, 0, 35, 78, 161, 255, 0, 93, 127, 165, 62, 203, 254, 63, 161, 255, 0, 125, 127, 157, 51, 197, 95, 242, 52, 234, 31, 245, 215, 250, 87, 133, 155, 252, 81, 59, 176, 123, 51, 34, 138, 40, 175, 28, 238, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 167, 80, 255, 0, 174, 213, 159, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 78, 161, 255, 0, 93, 168, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 35, 107, 255, 0, 93, 87, 249, 138, 208, 241, 87, 252, 141, 26, 135, 253, 117, 254, 149, 159, 99, 255, 0, 33, 27, 95, 250, 234, 191, 204, 87, 87, 127, 225, 139, 221, 115, 197, 151, 229, 20, 165, 184, 155, 231, 145, 184, 227, 219, 214, 128, 57, 75, 59, 59, 139, 217, 196, 22, 209, 23, 144, 240, 49, 93, 230, 131, 224, 53, 64, 46, 53, 108, 51, 118, 128, 114, 164, 123, 215, 81, 162, 104, 54, 154, 29, 168, 138, 1, 186, 78, 242, 17, 201, 173, 74, 0, 108, 113, 164, 113, 132, 140, 5, 85, 24, 0, 118, 167, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 124, 37, 174, 255, 0, 200, 193, 169, 127, 215, 212, 191, 250, 25, 170, 21, 127, 93, 255, 0, 145, 131, 82, 255, 0, 175, 169, 127, 244, 51, 84, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 3, 238, 205, 11, 254, 69, 237, 51, 254, 189, 98, 255, 0, 208, 69, 104, 86, 126, 133, 255, 0, 34, 246, 153, 255, 0, 94, 177, 127, 232, 34, 180, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 3, 142, 241, 7, 129, 109, 175, 131, 207, 167, 133, 134, 124, 127, 171, 232, 172, 107, 207, 47, 244, 203, 189, 46, 111, 34, 234, 18, 141, 235, 218, 189, 210, 168, 234, 122, 101, 174, 171, 104, 214, 247, 49, 130, 15, 67, 142, 86, 128, 60, 82, 195, 254, 66, 54, 191, 245, 213, 127, 152, 173, 31, 21, 255, 0, 200, 211, 168, 127, 215, 95, 233, 90, 154, 143, 132, 47, 52, 125, 78, 222, 104, 65, 158, 215, 206, 64, 24, 125, 238, 189, 197, 101, 248, 175, 254, 70, 157, 67, 254, 186, 255, 0, 133, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 141, 58, 135, 253, 117, 172, 251, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 26, 117, 15, 250, 235, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 79, 99, 255, 0, 33, 27, 95, 250, 234, 191, 204, 87, 67, 226, 63, 249, 24, 47, 63, 223, 174, 122, 199, 254, 66, 54, 191, 245, 213, 127, 152, 174, 135, 196, 127, 242, 48, 94, 127, 191, 94, 166, 83, 252, 103, 232, 114, 99, 62, 20, 101, 209, 69, 21, 244, 39, 156, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 21, 144, 255, 0, 235, 15, 214, 181, 235, 33, 255, 0, 214, 31, 173, 124, 175, 19, 252, 52, 254, 102, 212, 130, 138, 40, 175, 143, 55, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 44, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 47, 21, 127, 200, 207, 168, 127, 215, 90, 205, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 90, 94, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 234, 101, 251, 51, 122, 61, 76, 138, 40, 162, 189, 19, 160, 40, 162, 138, 0, 124, 49, 52, 211, 44, 74, 50, 206, 216, 21, 237, 250, 85, 144, 211, 244, 187, 123, 85, 227, 203, 92, 31, 115, 94, 97, 224, 155, 31, 182, 248, 138, 38, 43, 148, 128, 25, 15, 215, 181, 122, 229, 0, 20, 81, 69, 0, 103, 235, 191, 242, 46, 234, 127, 245, 233, 47, 254, 130, 107, 225, 58, 251, 179, 93, 255, 0, 145, 119, 83, 255, 0, 175, 73, 127, 244, 19, 95, 9, 208, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 5, 253, 11, 254, 70, 13, 55, 254, 190, 162, 255, 0, 208, 197, 116, 31, 21, 63, 228, 167, 248, 135, 254, 190, 207, 242, 21, 207, 232, 95, 242, 48, 105, 191, 245, 245, 23, 254, 134, 43, 160, 248, 169, 255, 0, 37, 63, 196, 63, 245, 246, 127, 144, 160, 14, 66, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 190, 206, 248, 89, 255, 0, 36, 191, 195, 223, 245, 232, 63, 153, 175, 140, 107, 236, 239, 133, 159, 242, 75, 252, 61, 255, 0, 94, 131, 249, 154, 0, 235, 168, 162, 138, 0, 142, 120, 22, 226, 9, 33, 113, 242, 184, 193, 175, 13, 212, 236, 155, 79, 212, 103, 181, 126, 177, 182, 43, 221, 171, 204, 254, 33, 216, 249, 58, 156, 87, 96, 113, 42, 242, 125, 197, 0, 113, 148, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 188, 175, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 189, 82, 199, 254, 66, 54, 191, 245, 213, 127, 157, 121, 95, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 0, 114, 20, 81, 69, 0, 21, 215, 124, 44, 255, 0, 146, 159, 225, 255, 0, 250, 251, 31, 200, 215, 35, 93, 119, 194, 207, 249, 41, 254, 31, 255, 0, 175, 177, 252, 141, 0, 116, 63, 31, 63, 228, 167, 207, 255, 0, 94, 176, 255, 0, 35, 94, 97, 94, 159, 241, 243, 254, 74, 124, 255, 0, 245, 235, 15, 242, 53, 230, 20, 0, 81, 69, 20, 1, 127, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 95, 66, 248, 171, 254, 70, 157, 67, 254, 187, 127, 74, 249, 235, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 95, 66, 248, 171, 254, 70, 157, 67, 254, 187, 127, 74, 0, 200, 162, 138, 40, 0, 162, 138, 40, 3, 209, 62, 27, 90, 237, 181, 187, 187, 35, 151, 96, 128, 251, 87, 119, 92, 239, 130, 160, 242, 60, 49, 110, 79, 252, 180, 204, 149, 209, 80, 1, 69, 20, 80, 6, 126, 187, 255, 0, 32, 13, 71, 254, 189, 101, 255, 0, 208, 77, 124, 39, 95, 118, 107, 191, 242, 0, 212, 127, 235, 214, 95, 253, 4, 215, 194, 116, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 127, 66, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 49, 93, 7, 197, 79, 249, 42, 30, 33, 255, 0, 175, 179, 252, 133, 115, 250, 23, 252, 140, 26, 111, 253, 125, 69, 255, 0, 161, 138, 232, 62, 42, 127, 201, 80, 241, 15, 253, 125, 159, 228, 40, 3, 144, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 175, 179, 62, 21, 255, 0, 201, 48, 240, 255, 0, 253, 122, 15, 230, 107, 227, 58, 251, 51, 225, 95, 252, 147, 15, 15, 255, 0, 215, 160, 254, 102, 128, 59, 10, 40, 162, 128, 10, 229, 60, 123, 107, 231, 248, 124, 75, 183, 38, 9, 3, 255, 0, 141, 117, 117, 153, 175, 65, 246, 141, 18, 242, 44, 103, 49, 26, 0, 241, 58, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 149, 183, 253, 117, 95, 231, 90, 190, 36, 255, 0, 145, 146, 251, 254, 186, 255, 0, 74, 202, 177, 255, 0, 144, 149, 183, 253, 117, 95, 231, 90, 190, 36, 255, 0, 145, 146, 251, 254, 186, 255, 0, 74, 184, 110, 124, 239, 17, 255, 0, 187, 199, 215, 244, 102, 85, 20, 81, 90, 31, 26, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 29, 170, 224, 251, 162, 169, 246, 171, 131, 238, 138, 245, 178, 173, 228, 123, 57, 54, 242, 249, 11, 69, 20, 87, 176, 123, 225, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 95, 241, 253, 15, 251, 235, 252, 233, 158, 42, 255, 0, 145, 167, 80, 255, 0, 174, 191, 210, 159, 101, 255, 0, 31, 208, 255, 0, 190, 191, 206, 153, 226, 175, 249, 26, 117, 15, 250, 235, 253, 43, 194, 205, 254, 40, 157, 216, 61, 153, 145, 69, 20, 87, 142, 119, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 211, 168, 127, 215, 106, 207, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 167, 80, 255, 0, 174, 212, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 74, 177, 51, 200, 17, 20, 179, 158, 128, 14, 77, 79, 103, 97, 113, 127, 63, 147, 109, 17, 119, 62, 157, 171, 212, 124, 57, 225, 43, 125, 32, 71, 115, 63, 239, 47, 49, 212, 244, 83, 237, 64, 24, 62, 26, 240, 59, 183, 151, 125, 168, 146, 159, 196, 177, 15, 211, 53, 232, 148, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 31, 9, 107, 191, 242, 48, 106, 95, 245, 245, 47, 254, 134, 106, 133, 95, 215, 127, 228, 96, 212, 191, 235, 234, 95, 253, 12, 213, 10, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 251, 179, 66, 255, 0, 145, 123, 76, 255, 0, 175, 88, 191, 244, 17, 90, 21, 159, 161, 127, 200, 189, 166, 127, 215, 172, 95, 250, 8, 173, 10, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 43, 137, 241, 63, 130, 254, 223, 44, 151, 246, 109, 251, 246, 201, 120, 207, 70, 174, 218, 138, 0, 240, 57, 224, 150, 222, 79, 42, 84, 104, 223, 208, 140, 83, 43, 217, 53, 239, 13, 90, 107, 169, 186, 65, 178, 117, 24, 89, 7, 90, 242, 125, 71, 73, 187, 210, 103, 48, 93, 70, 87, 156, 3, 216, 208, 5, 58, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 167, 80, 255, 0, 174, 181, 159, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 78, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 35, 107, 255, 0, 93, 87, 249, 138, 232, 124, 69, 255, 0, 35, 5, 239, 253, 117, 174, 122, 199, 254, 66, 54, 191, 245, 213, 127, 152, 174, 135, 196, 95, 242, 48, 94, 255, 0, 215, 90, 245, 50, 159, 227, 63, 67, 147, 25, 240, 163, 46, 138, 40, 175, 161, 60, 224, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 172, 134, 255, 0, 88, 126, 181, 175, 89, 13, 254, 176, 253, 107, 229, 120, 159, 225, 167, 243, 54, 165, 212, 40, 162, 138, 248, 243, 112, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 197, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 210, 241, 87, 252, 140, 250, 135, 253, 117, 172, 219, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 165, 226, 175, 249, 25, 245, 15, 250, 235, 94, 166, 95, 179, 55, 163, 212, 200, 162, 138, 43, 209, 58, 2, 138, 40, 160, 15, 68, 248, 113, 105, 182, 214, 238, 236, 142, 89, 182, 3, 93, 221, 115, 190, 10, 131, 200, 240, 197, 185, 254, 254, 94, 186, 42, 0, 40, 162, 138, 0, 207, 215, 127, 228, 93, 212, 255, 0, 235, 210, 95, 253, 4, 215, 194, 117, 247, 102, 187, 255, 0, 34, 238, 167, 255, 0, 94, 146, 255, 0, 232, 38, 190, 19, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 11, 250, 23, 252, 140, 26, 111, 253, 125, 69, 255, 0, 161, 138, 232, 62, 42, 127, 201, 79, 241, 15, 253, 125, 159, 228, 43, 159, 208, 191, 228, 96, 211, 127, 235, 234, 47, 253, 12, 87, 65, 241, 83, 254, 74, 127, 136, 127, 235, 236, 255, 0, 33, 64, 28, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 125, 157, 240, 179, 254, 73, 127, 135, 191, 235, 208, 127, 51, 95, 24, 215, 217, 223, 11, 63, 228, 151, 248, 123, 254, 189, 7, 243, 52, 1, 215, 81, 69, 20, 0, 87, 41, 227, 219, 95, 63, 195, 222, 118, 57, 130, 64, 255, 0, 208, 215, 87, 89, 158, 32, 131, 237, 26, 21, 228, 88, 206, 98, 52, 1, 226, 116, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 188, 175, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 189, 82, 199, 254, 66, 54, 191, 245, 213, 127, 157, 121, 95, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 0, 114, 20, 81, 69, 0, 21, 215, 124, 44, 255, 0, 146, 159, 225, 255, 0, 250, 251, 31, 200, 215, 35, 93, 119, 194, 207, 249, 41, 254, 31, 255, 0, 175, 177, 252, 141, 0, 116, 63, 31, 63, 228, 167, 207, 255, 0, 94, 176, 255, 0, 35, 94, 97, 94, 177, 241, 203, 78, 190, 186, 248, 145, 60, 182, 246, 87, 51, 71, 246, 104, 134, 228, 136, 145, 211, 218, 188, 215, 251, 27, 84, 255, 0, 160, 101, 239, 253, 248, 111, 240, 160, 10, 52, 85, 239, 236, 77, 91, 254, 129, 119, 191, 248, 14, 223, 225, 71, 246, 38, 173, 255, 0, 64, 187, 223, 252, 7, 111, 240, 160, 5, 208, 191, 228, 96, 211, 63, 235, 238, 47, 253, 12, 87, 208, 190, 42, 255, 0, 145, 167, 80, 255, 0, 174, 223, 210, 188, 23, 76, 211, 47, 173, 117, 173, 58, 91, 139, 43, 136, 99, 251, 84, 67, 116, 145, 21, 31, 120, 122, 215, 208, 158, 38, 211, 47, 165, 241, 29, 243, 69, 103, 59, 163, 75, 144, 193, 115, 154, 0, 231, 168, 171, 127, 217, 58, 143, 252, 248, 92, 127, 223, 179, 71, 246, 78, 163, 255, 0, 62, 23, 31, 247, 236, 208, 5, 74, 42, 223, 246, 78, 163, 255, 0, 62, 23, 31, 247, 236, 209, 253, 147, 168, 255, 0, 207, 133, 199, 253, 251, 52, 1, 236, 58, 4, 94, 86, 131, 98, 190, 145, 10, 211, 170, 214, 49, 152, 180, 251, 100, 199, 72, 198, 127, 42, 179, 64, 5, 20, 81, 64, 25, 250, 231, 252, 128, 53, 47, 250, 244, 151, 255, 0, 65, 53, 240, 157, 125, 219, 172, 35, 54, 137, 168, 34, 2, 89, 173, 228, 0, 14, 228, 169, 175, 138, 255, 0, 225, 19, 241, 15, 253, 1, 53, 15, 251, 240, 223, 225, 64, 24, 212, 86, 207, 252, 34, 126, 33, 255, 0, 160, 38, 161, 255, 0, 126, 27, 252, 40, 255, 0, 132, 79, 196, 63, 244, 4, 212, 63, 239, 195, 127, 133, 0, 99, 81, 91, 63, 240, 137, 248, 135, 254, 128, 154, 135, 253, 248, 111, 240, 163, 254, 17, 63, 16, 255, 0, 208, 19, 80, 255, 0, 191, 13, 254, 20, 1, 141, 69, 108, 255, 0, 194, 39, 226, 31, 250, 2, 106, 31, 247, 225, 191, 194, 143, 248, 68, 252, 67, 255, 0, 64, 77, 67, 254, 252, 55, 248, 80, 6, 53, 21, 179, 255, 0, 8, 159, 136, 127, 232, 9, 168, 127, 223, 134, 255, 0, 10, 63, 225, 19, 241, 15, 253, 1, 53, 15, 251, 240, 223, 225, 64, 21, 116, 47, 249, 24, 52, 207, 250, 251, 139, 255, 0, 67, 21, 208, 124, 84, 255, 0, 146, 161, 226, 31, 250, 251, 63, 200, 84, 222, 17, 240, 23, 137, 53, 63, 19, 88, 198, 154, 93, 196, 2, 57, 86, 102, 121, 208, 198, 161, 84, 130, 121, 53, 189, 241, 99, 192, 254, 32, 143, 199, 183, 247, 241, 105, 211, 92, 219, 223, 200, 102, 133, 160, 66, 248, 28, 14, 113, 208, 208, 7, 150, 81, 91, 63, 240, 137, 248, 135, 254, 128, 154, 135, 253, 248, 111, 240, 163, 254, 17, 63, 16, 255, 0, 208, 19, 80, 255, 0, 191, 13, 254, 20, 1, 141, 69, 108, 255, 0, 194, 39, 226, 31, 250, 2, 106, 31, 247, 225, 191, 194, 143, 248, 68, 252, 67, 255, 0, 64, 77, 67, 254, 252, 55, 248, 80, 6, 53, 21, 179, 255, 0, 8, 159, 136, 127, 232, 9, 168, 127, 223, 134, 255, 0, 10, 63, 225, 19, 241, 15, 253, 1, 53, 15, 251, 240, 223, 225, 64, 24, 212, 86, 207, 252, 34, 126, 33, 255, 0, 160, 38, 161, 255, 0, 126, 27, 252, 40, 255, 0, 132, 79, 196, 63, 244, 4, 212, 63, 239, 195, 127, 133, 0, 99, 87, 217, 127, 11, 63, 228, 151, 248, 123, 254, 189, 7, 243, 53, 242, 111, 252, 34, 126, 33, 255, 0, 160, 38, 161, 255, 0, 126, 27, 252, 43, 235, 127, 134, 182, 242, 218, 124, 56, 208, 237, 238, 34, 104, 101, 75, 124, 50, 56, 193, 7, 39, 168, 160, 14, 178, 138, 40, 160, 2, 162, 184, 93, 246, 146, 167, 170, 17, 250, 84, 180, 30, 65, 20, 1, 224, 115, 47, 151, 52, 139, 232, 72, 166, 86, 149, 214, 151, 168, 53, 229, 193, 91, 27, 156, 25, 79, 252, 179, 247, 168, 63, 178, 117, 31, 249, 240, 184, 255, 0, 191, 102, 128, 42, 81, 86, 255, 0, 178, 117, 31, 249, 240, 184, 255, 0, 191, 102, 143, 236, 157, 71, 254, 124, 46, 63, 239, 217, 160, 8, 172, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 183, 137, 63, 228, 100, 190, 255, 0, 174, 191, 210, 170, 217, 105, 90, 138, 223, 91, 147, 99, 56, 2, 85, 207, 201, 239, 86, 188, 73, 255, 0, 35, 37, 247, 253, 117, 254, 149, 112, 220, 249, 222, 35, 255, 0, 119, 143, 175, 232, 204, 170, 40, 162, 180, 62, 52, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 59, 85, 193, 247, 69, 83, 237, 87, 7, 221, 21, 235, 101, 91, 200, 246, 114, 109, 229, 242, 22, 138, 40, 175, 96, 247, 194, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 191, 227, 250, 31, 247, 215, 249, 211, 60, 85, 255, 0, 35, 78, 161, 255, 0, 93, 127, 165, 62, 203, 254, 63, 161, 255, 0, 125, 127, 157, 88, 241, 54, 155, 125, 47, 136, 239, 154, 43, 73, 221, 90, 92, 134, 85, 200, 53, 225, 102, 255, 0, 20, 78, 236, 30, 204, 231, 104, 171, 127, 217, 58, 143, 252, 248, 92, 127, 223, 179, 71, 246, 78, 163, 255, 0, 62, 23, 31, 247, 236, 215, 142, 119, 21, 40, 171, 127, 217, 58, 143, 252, 248, 92, 127, 223, 179, 71, 246, 78, 163, 255, 0, 62, 23, 31, 247, 236, 208, 5, 74, 42, 223, 246, 78, 163, 255, 0, 62, 23, 31, 247, 236, 209, 253, 147, 168, 255, 0, 207, 133, 199, 253, 251, 52, 1, 82, 138, 183, 253, 147, 168, 255, 0, 207, 133, 199, 253, 251, 52, 127, 100, 234, 63, 243, 225, 113, 255, 0, 126, 205, 0, 69, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 106, 43, 45, 43, 81, 91, 232, 9, 177, 156, 1, 42, 231, 247, 103, 214, 175, 248, 151, 76, 190, 151, 196, 87, 205, 21, 164, 236, 172, 249, 12, 171, 144, 104, 3, 158, 162, 173, 255, 0, 100, 234, 63, 243, 225, 113, 255, 0, 126, 205, 31, 217, 58, 143, 252, 248, 92, 127, 223, 179, 64, 21, 40, 171, 127, 217, 58, 143, 252, 248, 92, 127, 223, 179, 71, 246, 78, 165, 255, 0, 64, 251, 159, 251, 246, 104, 2, 165, 105, 104, 186, 29, 222, 177, 118, 144, 192, 152, 143, 171, 72, 71, 0, 84, 154, 70, 136, 151, 183, 133, 110, 239, 173, 236, 227, 137, 177, 48, 150, 80, 178, 15, 192, 215, 168, 216, 223, 104, 58, 125, 172, 118, 214, 218, 141, 130, 70, 189, 132, 235, 207, 235, 64, 18, 104, 186, 21, 158, 135, 110, 99, 182, 92, 179, 125, 231, 61, 77, 106, 85, 15, 237, 189, 39, 254, 130, 182, 95, 248, 16, 191, 227, 71, 246, 230, 147, 255, 0, 65, 91, 31, 252, 8, 95, 241, 160, 11, 244, 85, 15, 237, 189, 39, 254, 130, 182, 95, 248, 16, 191, 227, 71, 246, 222, 147, 255, 0, 65, 91, 47, 252, 8, 95, 241, 160, 11, 244, 85, 15, 237, 189, 35, 254, 130, 182, 95, 248, 16, 191, 227, 71, 246, 222, 145, 255, 0, 65, 91, 47, 252, 8, 95, 241, 160, 11, 244, 85, 15, 237, 189, 35, 254, 130, 182, 95, 248, 16, 191, 227, 71, 246, 222, 145, 255, 0, 65, 91, 47, 252, 8, 95, 241, 160, 11, 244, 83, 85, 131, 40, 101, 32, 130, 50, 8, 239, 78, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 15, 132, 181, 223, 249, 24, 53, 47, 250, 250, 151, 255, 0, 67, 53, 66, 183, 117, 173, 31, 84, 125, 123, 80, 97, 166, 222, 16, 110, 101, 32, 136, 27, 251, 199, 218, 168, 127, 98, 106, 191, 244, 11, 189, 255, 0, 191, 13, 254, 20, 1, 70, 138, 189, 253, 137, 170, 255, 0, 208, 46, 247, 254, 252, 55, 248, 81, 253, 137, 170, 255, 0, 208, 46, 247, 254, 252, 55, 248, 80, 5, 26, 42, 247, 246, 38, 171, 255, 0, 64, 187, 223, 251, 240, 223, 225, 71, 246, 38, 171, 255, 0, 64, 187, 223, 251, 240, 223, 225, 64, 20, 104, 171, 223, 216, 154, 175, 253, 2, 239, 127, 239, 195, 127, 133, 31, 216, 154, 175, 253, 2, 239, 127, 239, 195, 127, 133, 0, 81, 162, 175, 127, 98, 106, 191, 244, 11, 189, 255, 0, 191, 13, 254, 20, 127, 98, 106, 191, 244, 11, 189, 255, 0, 191, 13, 254, 20, 1, 70, 138, 189, 253, 137, 170, 255, 0, 208, 46, 247, 254, 252, 55, 248, 81, 253, 137, 170, 255, 0, 208, 46, 247, 254, 252, 55, 248, 80, 5, 26, 42, 247, 246, 38, 171, 255, 0, 64, 187, 223, 251, 240, 223, 225, 71, 246, 38, 171, 255, 0, 64, 187, 223, 251, 240, 223, 225, 64, 20, 104, 171, 223, 216, 154, 175, 253, 2, 239, 127, 239, 195, 127, 133, 31, 216, 154, 175, 253, 2, 239, 127, 239, 195, 127, 133, 0, 81, 162, 175, 127, 98, 106, 191, 244, 11, 189, 255, 0, 191, 13, 254, 20, 127, 98, 106, 191, 244, 11, 189, 255, 0, 191, 13, 254, 20, 1, 70, 138, 189, 253, 137, 170, 255, 0, 208, 46, 247, 254, 252, 55, 248, 81, 253, 137, 170, 255, 0, 208, 46, 247, 254, 252, 55, 248, 80, 5, 26, 42, 247, 246, 38, 171, 255, 0, 64, 187, 223, 251, 240, 223, 225, 71, 246, 38, 171, 255, 0, 64, 187, 223, 251, 240, 223, 225, 64, 20, 104, 171, 223, 216, 154, 175, 253, 2, 239, 127, 239, 195, 127, 133, 31, 216, 154, 175, 253, 2, 239, 127, 239, 195, 127, 133, 0, 81, 162, 175, 127, 98, 106, 191, 244, 11, 189, 255, 0, 191, 13, 254, 20, 127, 98, 106, 191, 244, 11, 189, 255, 0, 191, 13, 254, 20, 1, 70, 138, 189, 253, 137, 170, 255, 0, 208, 46, 247, 254, 252, 55, 248, 81, 253, 137, 170, 255, 0, 208, 46, 247, 254, 252, 55, 248, 80, 5, 26, 42, 247, 246, 38, 171, 255, 0, 64, 187, 223, 251, 240, 223, 225, 71, 246, 38, 171, 255, 0, 64, 187, 223, 251, 240, 223, 225, 64, 20, 104, 171, 223, 216, 154, 175, 253, 2, 239, 127, 239, 195, 127, 133, 31, 216, 154, 175, 253, 2, 239, 127, 239, 195, 127, 133, 0, 81, 162, 175, 127, 98, 106, 191, 244, 11, 189, 255, 0, 191, 13, 254, 20, 127, 98, 106, 191, 244, 11, 189, 255, 0, 191, 13, 254, 20, 1, 70, 138, 189, 253, 137, 170, 255, 0, 208, 46, 247, 254, 252, 55, 248, 81, 253, 137, 170, 255, 0, 208, 46, 247, 254, 252, 55, 248, 80, 5, 26, 42, 247, 246, 38, 171, 255, 0, 64, 187, 223, 251, 240, 223, 225, 71, 246, 38, 171, 255, 0, 64, 187, 223, 251, 240, 223, 225, 64, 20, 104, 171, 223, 216, 154, 175, 253, 2, 239, 127, 239, 195, 127, 133, 31, 216, 154, 175, 253, 2, 239, 127, 239, 195, 127, 133, 0, 125, 189, 161, 127, 200, 189, 166, 127, 215, 172, 95, 250, 8, 173, 10, 207, 209, 1, 93, 7, 78, 86, 4, 17, 109, 16, 32, 246, 249, 69, 104, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 80, 109, 107, 75, 82, 84, 234, 118, 96, 131, 130, 12, 235, 199, 235, 71, 246, 222, 147, 255, 0, 65, 75, 31, 251, 254, 191, 227, 64, 23, 232, 170, 31, 219, 122, 79, 253, 5, 44, 127, 239, 250, 255, 0, 141, 31, 219, 122, 79, 253, 5, 44, 127, 239, 250, 255, 0, 141, 0, 95, 162, 168, 127, 109, 233, 63, 244, 20, 177, 255, 0, 191, 235, 254, 52, 127, 109, 233, 63, 244, 20, 177, 255, 0, 191, 235, 254, 52, 1, 126, 168, 234, 122, 93, 182, 175, 102, 109, 174, 163, 4, 118, 61, 212, 250, 138, 79, 237, 189, 39, 254, 130, 150, 63, 247, 253, 127, 198, 143, 237, 189, 39, 254, 130, 182, 95, 248, 16, 191, 227, 64, 30, 87, 226, 31, 13, 220, 104, 183, 79, 133, 105, 45, 79, 204, 146, 129, 219, 222, 176, 235, 219, 38, 213, 180, 75, 136, 90, 25, 181, 27, 7, 141, 198, 10, 153, 215, 159, 214, 188, 203, 95, 208, 237, 44, 103, 123, 139, 13, 66, 206, 123, 86, 32, 4, 19, 169, 96, 73, 233, 138, 0, 192, 162, 173, 255, 0, 100, 234, 95, 244, 15, 185, 255, 0, 191, 102, 143, 236, 157, 71, 254, 124, 46, 63, 239, 138, 0, 169, 69, 91, 254, 201, 212, 127, 231, 194, 227, 254, 248, 163, 251, 39, 81, 255, 0, 159, 11, 143, 251, 226, 128, 34, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 21, 150, 149, 168, 45, 245, 185, 54, 51, 224, 74, 185, 249, 15, 76, 213, 255, 0, 18, 233, 183, 210, 248, 138, 249, 162, 180, 157, 149, 165, 200, 101, 92, 131, 64, 28, 245, 21, 111, 251, 39, 81, 255, 0, 159, 11, 143, 251, 246, 104, 254, 201, 212, 127, 231, 194, 227, 254, 253, 154, 0, 169, 69, 91, 254, 201, 212, 127, 231, 194, 227, 254, 253, 154, 63, 178, 117, 31, 249, 240, 184, 255, 0, 191, 102, 128, 42, 81, 86, 255, 0, 178, 117, 31, 249, 240, 184, 255, 0, 191, 102, 143, 236, 157, 71, 254, 124, 46, 63, 239, 217, 160, 10, 148, 85, 191, 236, 157, 71, 254, 124, 46, 63, 239, 217, 163, 251, 39, 81, 255, 0, 159, 11, 143, 251, 246, 104, 2, 59, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 208, 248, 143, 254, 70, 11, 207, 247, 235, 38, 203, 74, 212, 69, 252, 36, 216, 92, 128, 37, 92, 254, 239, 222, 181, 188, 71, 255, 0, 35, 5, 231, 251, 245, 234, 101, 63, 198, 126, 135, 38, 51, 225, 70, 93, 20, 81, 95, 66, 121, 193, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 89, 15, 254, 176, 253, 107, 94, 178, 31, 253, 97, 250, 215, 202, 241, 63, 195, 79, 230, 109, 72, 40, 162, 138, 248, 243, 112, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 197, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 210, 241, 87, 252, 140, 250, 135, 253, 117, 172, 219, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 185, 226, 93, 50, 250, 95, 17, 95, 52, 86, 147, 178, 52, 185, 12, 171, 144, 107, 212, 203, 246, 102, 244, 122, 156, 245, 21, 111, 251, 39, 81, 255, 0, 159, 11, 143, 251, 246, 104, 254, 201, 212, 127, 231, 194, 227, 254, 253, 154, 244, 78, 130, 165, 21, 111, 251, 39, 81, 255, 0, 159, 11, 143, 251, 246, 104, 254, 201, 212, 127, 231, 194, 227, 254, 253, 154, 0, 246, 31, 15, 197, 229, 104, 22, 41, 233, 16, 173, 58, 173, 167, 161, 138, 194, 217, 49, 210, 37, 254, 85, 102, 128, 10, 40, 162, 128, 51, 245, 223, 249, 23, 117, 63, 250, 244, 151, 255, 0, 65, 53, 240, 157, 125, 219, 173, 33, 125, 11, 80, 84, 82, 89, 173, 165, 0, 14, 255, 0, 41, 175, 138, 255, 0, 225, 19, 241, 15, 253, 1, 53, 15, 251, 240, 223, 225, 64, 24, 212, 86, 207, 252, 34, 126, 33, 255, 0, 160, 38, 161, 255, 0, 126, 27, 252, 40, 255, 0, 132, 79, 196, 63, 244, 4, 212, 63, 239, 195, 127, 133, 0, 99, 81, 91, 63, 240, 137, 248, 135, 254, 128, 154, 135, 253, 248, 111, 240, 163, 254, 17, 63, 16, 255, 0, 208, 19, 80, 255, 0, 191, 13, 254, 20, 1, 141, 69, 108, 255, 0, 194, 39, 226, 31, 250, 2, 106, 31, 247, 225, 191, 194, 143, 248, 68, 252, 67, 255, 0, 64, 77, 67, 254, 252, 55, 248, 80, 6, 53, 21, 179, 255, 0, 8, 159, 136, 127, 232, 9, 168, 127, 223, 134, 255, 0, 10, 63, 225, 19, 241, 15, 253, 1, 53, 15, 251, 240, 223, 225, 64, 21, 116, 47, 249, 24, 52, 223, 250, 250, 139, 255, 0, 67, 21, 208, 124, 84, 255, 0, 146, 161, 226, 31, 250, 251, 63, 200, 84, 254, 17, 240, 23, 137, 53, 63, 19, 217, 70, 154, 92, 240, 8, 229, 89, 153, 231, 140, 162, 128, 164, 19, 201, 173, 223, 139, 30, 8, 241, 4, 94, 61, 191, 212, 34, 211, 166, 185, 183, 191, 144, 205, 11, 64, 165, 248, 224, 115, 142, 134, 128, 60, 178, 138, 217, 255, 0, 132, 79, 196, 63, 244, 4, 212, 63, 239, 195, 127, 133, 31, 240, 137, 248, 135, 254, 128, 154, 135, 253, 248, 111, 240, 160, 12, 106, 43, 103, 254, 17, 63, 16, 255, 0, 208, 19, 80, 255, 0, 191, 13, 254, 20, 127, 194, 39, 226, 31, 250, 2, 106, 31, 247, 225, 191, 194, 128, 49, 168, 173, 159, 248, 68, 252, 67, 255, 0, 64, 77, 67, 254, 252, 55, 248, 81, 255, 0, 8, 159, 136, 127, 232, 9, 168, 127, 223, 134, 255, 0, 10, 0, 198, 162, 182, 127, 225, 19, 241, 15, 253, 1, 53, 15, 251, 240, 223, 225, 71, 252, 34, 126, 33, 255, 0, 160, 38, 161, 255, 0, 126, 27, 252, 40, 3, 26, 190, 205, 248, 89, 255, 0, 36, 191, 195, 255, 0, 245, 234, 63, 153, 175, 146, 255, 0, 225, 18, 241, 15, 253, 0, 239, 255, 0, 239, 195, 87, 215, 31, 13, 173, 229, 179, 248, 113, 161, 91, 220, 70, 241, 75, 29, 176, 13, 27, 140, 16, 114, 122, 208, 7, 87, 69, 20, 80, 1, 81, 92, 46, 251, 73, 83, 213, 8, 253, 42, 90, 15, 32, 138, 0, 240, 41, 151, 100, 242, 47, 163, 17, 77, 173, 43, 205, 47, 80, 107, 203, 130, 44, 103, 230, 86, 232, 158, 245, 7, 246, 78, 163, 255, 0, 62, 23, 31, 247, 236, 208, 5, 74, 42, 223, 246, 78, 163, 255, 0, 62, 23, 31, 247, 236, 209, 253, 147, 168, 255, 0, 207, 133, 199, 253, 251, 52, 1, 21, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 242, 191, 138, 127, 242, 83, 252, 65, 255, 0, 95, 103, 249, 10, 246, 11, 45, 43, 81, 23, 214, 228, 216, 92, 227, 205, 92, 254, 239, 222, 188, 167, 226, 85, 133, 229, 231, 196, 223, 17, 53, 181, 164, 243, 129, 117, 130, 98, 140, 182, 56, 30, 148, 1, 195, 81, 87, 191, 177, 53, 95, 250, 5, 222, 255, 0, 223, 134, 255, 0, 10, 63, 177, 53, 95, 250, 5, 222, 255, 0, 223, 134, 255, 0, 10, 0, 163, 93, 119, 194, 207, 249, 41, 254, 31, 255, 0, 175, 177, 252, 141, 115, 255, 0, 216, 154, 175, 253, 2, 239, 127, 239, 195, 127, 133, 117, 159, 12, 244, 173, 70, 15, 137, 26, 12, 210, 233, 247, 105, 26, 221, 2, 89, 161, 96, 7, 7, 190, 40, 3, 236, 46, 212, 81, 69, 0, 20, 81, 69, 0, 112, 31, 23, 143, 252, 82, 54, 159, 246, 21, 180, 255, 0, 209, 130, 178, 60, 71, 175, 106, 246, 222, 33, 191, 134, 11, 233, 82, 36, 151, 10, 163, 176, 173, 111, 139, 223, 242, 40, 217, 255, 0, 216, 86, 211, 255, 0, 70, 10, 229, 252, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 1, 159, 240, 146, 107, 63, 244, 18, 154, 143, 248, 73, 53, 159, 250, 9, 77, 89, 116, 80, 6, 167, 252, 36, 154, 207, 253, 4, 166, 163, 254, 18, 77, 103, 254, 130, 83, 86, 93, 20, 1, 238, 186, 123, 151, 211, 173, 157, 142, 73, 137, 73, 62, 188, 85, 170, 204, 240, 244, 222, 118, 129, 100, 255, 0, 244, 200, 86, 157, 0, 20, 81, 69, 0, 80, 214, 93, 227, 208, 239, 229, 70, 218, 233, 111, 35, 41, 29, 142, 211, 95, 30, 127, 194, 201, 241, 151, 253, 12, 119, 191, 247, 216, 175, 176, 245, 207, 249, 0, 106, 63, 245, 233, 47, 254, 130, 107, 225, 42, 0, 234, 191, 225, 100, 248, 203, 254, 134, 59, 223, 251, 236, 81, 255, 0, 11, 39, 198, 95, 244, 49, 222, 255, 0, 223, 98, 185, 90, 40, 3, 170, 255, 0, 133, 147, 227, 47, 250, 24, 239, 127, 239, 177, 71, 252, 44, 159, 25, 127, 208, 199, 123, 255, 0, 125, 138, 229, 104, 160, 14, 171, 254, 22, 79, 140, 191, 232, 99, 189, 255, 0, 190, 197, 31, 240, 178, 124, 101, 255, 0, 67, 29, 239, 253, 246, 43, 149, 162, 128, 58, 175, 248, 89, 62, 50, 255, 0, 161, 142, 247, 254, 251, 20, 127, 194, 201, 241, 151, 253, 12, 119, 191, 247, 216, 174, 86, 138, 0, 244, 31, 12, 252, 77, 241, 108, 94, 39, 211, 76, 218, 205, 205, 204, 70, 225, 17, 225, 149, 190, 86, 4, 227, 7, 243, 173, 175, 137, 223, 17, 124, 79, 109, 227, 253, 82, 198, 195, 84, 158, 210, 218, 214, 79, 37, 35, 133, 184, 56, 239, 245, 175, 51, 208, 191, 228, 96, 211, 127, 235, 234, 47, 253, 12, 87, 65, 241, 79, 254, 74, 127, 136, 63, 235, 236, 255, 0, 33, 64, 17, 127, 194, 201, 241, 151, 253, 12, 119, 191, 247, 216, 163, 254, 22, 79, 140, 191, 232, 99, 189, 255, 0, 190, 197, 114, 180, 80, 7, 85, 255, 0, 11, 39, 198, 95, 244, 49, 222, 255, 0, 223, 98, 143, 248, 89, 62, 50, 255, 0, 161, 142, 247, 254, 251, 21, 202, 209, 64, 29, 87, 252, 44, 159, 25, 127, 208, 199, 123, 255, 0, 125, 138, 63, 225, 100, 248, 203, 254, 134, 59, 223, 251, 236, 87, 43, 69, 0, 117, 95, 240, 178, 124, 101, 255, 0, 67, 29, 239, 253, 246, 40, 255, 0, 133, 147, 227, 47, 250, 24, 239, 127, 239, 177, 92, 173, 20, 1, 213, 127, 194, 201, 241, 151, 253, 12, 119, 191, 247, 216, 175, 170, 126, 29, 94, 220, 234, 63, 15, 52, 75, 219, 201, 154, 123, 153, 173, 247, 200, 237, 213, 142, 77, 124, 89, 95, 102, 124, 43, 255, 0, 146, 97, 225, 255, 0, 250, 244, 31, 204, 208, 7, 97, 69, 20, 80, 1, 72, 223, 116, 253, 41, 106, 11, 150, 217, 105, 51, 255, 0, 117, 9, 253, 40, 3, 199, 238, 188, 71, 173, 45, 228, 225, 117, 25, 64, 18, 156, 12, 244, 230, 153, 255, 0, 9, 38, 179, 255, 0, 65, 41, 171, 50, 83, 230, 77, 35, 250, 146, 105, 180, 1, 171, 255, 0, 9, 38, 179, 255, 0, 65, 41, 168, 255, 0, 132, 147, 89, 255, 0, 160, 148, 213, 149, 69, 0, 109, 89, 120, 143, 90, 123, 232, 17, 245, 25, 138, 153, 84, 17, 158, 188, 211, 188, 73, 255, 0, 35, 37, 247, 253, 117, 254, 149, 147, 99, 255, 0, 33, 43, 111, 250, 234, 191, 206, 181, 188, 73, 255, 0, 35, 37, 247, 253, 117, 254, 149, 112, 220, 249, 222, 35, 255, 0, 119, 143, 175, 232, 204, 170, 40, 162, 180, 62, 52, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 59, 85, 193, 247, 69, 83, 237, 87, 7, 221, 21, 235, 101, 91, 200, 246, 114, 109, 229, 242, 22, 138, 40, 175, 96, 247, 194, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 255, 0, 227, 250, 31, 250, 232, 191, 206, 175, 248, 143, 94, 213, 237, 188, 67, 125, 12, 23, 210, 164, 73, 46, 21, 65, 233, 84, 44, 255, 0, 227, 250, 31, 250, 232, 191, 206, 153, 226, 175, 249, 26, 117, 15, 250, 235, 94, 22, 111, 241, 68, 238, 193, 236, 198, 127, 194, 73, 172, 255, 0, 208, 74, 106, 63, 225, 36, 214, 127, 232, 37, 53, 101, 209, 94, 57, 220, 106, 127, 194, 73, 172, 255, 0, 208, 74, 106, 63, 225, 36, 214, 127, 232, 37, 53, 101, 209, 64, 26, 159, 240, 146, 107, 63, 244, 18, 154, 143, 248, 73, 53, 159, 250, 9, 77, 89, 116, 80, 6, 167, 252, 36, 154, 207, 253, 4, 166, 163, 254, 18, 77, 103, 254, 130, 83, 86, 93, 20, 1, 181, 101, 226, 61, 105, 239, 160, 71, 212, 102, 42, 101, 80, 70, 122, 243, 87, 252, 71, 175, 106, 246, 190, 32, 190, 134, 27, 233, 82, 37, 151, 10, 163, 181, 115, 150, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 52, 223, 255, 0, 215, 90, 0, 103, 252, 36, 154, 207, 253, 4, 166, 163, 254, 18, 77, 103, 254, 130, 83, 86, 93, 20, 1, 169, 255, 0, 9, 38, 183, 255, 0, 65, 41, 171, 150, 241, 23, 197, 93, 75, 76, 73, 109, 173, 53, 57, 101, 188, 198, 63, 217, 92, 247, 207, 173, 98, 248, 175, 197, 171, 167, 70, 108, 108, 24, 27, 162, 62, 105, 7, 252, 179, 30, 222, 245, 230, 69, 139, 18, 73, 201, 61, 73, 160, 9, 239, 175, 110, 117, 43, 217, 110, 239, 38, 105, 174, 37, 109, 210, 72, 199, 150, 53, 94, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 3, 238, 205, 11, 254, 69, 221, 51, 254, 189, 34, 255, 0, 208, 69, 104, 86, 126, 133, 255, 0, 34, 246, 153, 255, 0, 94, 177, 127, 232, 34, 180, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 230, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 15, 132, 181, 223, 249, 24, 117, 63, 250, 250, 151, 255, 0, 67, 53, 66, 180, 53, 239, 249, 24, 117, 63, 250, 250, 151, 255, 0, 66, 53, 159, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 62, 57, 30, 41, 85, 209, 138, 178, 156, 130, 59, 26, 101, 20, 1, 235, 158, 25, 248, 177, 171, 220, 34, 89, 234, 90, 180, 235, 112, 78, 212, 151, 179, 125, 77, 118, 191, 240, 147, 235, 95, 244, 18, 151, 243, 175, 155, 171, 190, 240, 135, 139, 177, 179, 78, 212, 95, 218, 41, 88, 254, 134, 128, 61, 79, 254, 18, 77, 103, 254, 130, 83, 81, 255, 0, 9, 38, 179, 255, 0, 65, 41, 171, 38, 157, 64, 27, 86, 94, 35, 214, 158, 250, 4, 125, 70, 82, 12, 170, 8, 207, 94, 106, 255, 0, 136, 117, 237, 94, 215, 196, 23, 240, 197, 125, 44, 113, 44, 184, 69, 7, 165, 115, 150, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 52, 223, 255, 0, 215, 90, 0, 103, 252, 36, 154, 207, 253, 4, 166, 163, 254, 18, 77, 103, 254, 130, 83, 86, 93, 20, 1, 169, 255, 0, 9, 38, 179, 255, 0, 65, 41, 168, 255, 0, 132, 147, 89, 255, 0, 160, 148, 213, 151, 69, 0, 106, 127, 194, 73, 172, 255, 0, 208, 74, 106, 63, 225, 36, 214, 127, 232, 37, 53, 101, 209, 64, 26, 159, 240, 146, 107, 63, 244, 18, 154, 143, 248, 73, 53, 159, 250, 9, 77, 89, 116, 80, 6, 221, 151, 136, 245, 167, 190, 182, 71, 212, 101, 42, 101, 80, 70, 122, 243, 87, 124, 69, 255, 0, 35, 5, 239, 253, 117, 174, 118, 199, 254, 66, 54, 191, 245, 213, 127, 157, 116, 94, 34, 255, 0, 145, 130, 247, 254, 186, 215, 169, 148, 255, 0, 25, 250, 28, 152, 207, 133, 25, 116, 81, 69, 125, 9, 231, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 100, 55, 250, 195, 245, 173, 122, 200, 111, 245, 135, 235, 95, 43, 196, 255, 0, 13, 63, 153, 181, 46, 161, 69, 20, 87, 199, 155, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 22, 44, 127, 228, 33, 107, 255, 0, 93, 87, 249, 215, 73, 226, 61, 123, 87, 182, 241, 5, 252, 48, 223, 74, 145, 43, 225, 84, 118, 174, 110, 199, 254, 66, 22, 191, 245, 213, 127, 157, 105, 120, 167, 254, 70, 155, 255, 0, 250, 235, 94, 166, 95, 179, 55, 163, 212, 103, 252, 36, 154, 223, 253, 4, 166, 163, 254, 18, 77, 111, 254, 130, 83, 86, 93, 21, 232, 157, 6, 167, 252, 36, 218, 207, 253, 4, 166, 163, 254, 18, 109, 103, 254, 130, 83, 86, 93, 20, 1, 238, 186, 123, 153, 116, 235, 105, 24, 228, 180, 74, 73, 245, 226, 173, 86, 103, 135, 165, 243, 188, 63, 98, 254, 177, 10, 211, 160, 2, 138, 40, 160, 10, 26, 196, 143, 22, 137, 168, 72, 141, 181, 146, 218, 71, 12, 59, 29, 166, 190, 60, 255, 0, 133, 149, 227, 47, 250, 24, 111, 127, 239, 161, 254, 21, 246, 22, 187, 255, 0, 34, 246, 167, 255, 0, 94, 178, 255, 0, 232, 38, 190, 19, 160, 14, 171, 254, 22, 87, 140, 191, 232, 97, 189, 255, 0, 190, 135, 248, 81, 255, 0, 11, 43, 198, 95, 244, 48, 222, 255, 0, 223, 67, 252, 43, 149, 162, 128, 58, 175, 248, 89, 94, 50, 255, 0, 161, 134, 247, 254, 250, 31, 225, 71, 252, 44, 175, 25, 127, 208, 195, 123, 255, 0, 125, 15, 240, 174, 86, 138, 0, 234, 191, 225, 101, 120, 203, 254, 134, 27, 223, 251, 232, 127, 133, 31, 240, 178, 188, 101, 255, 0, 67, 13, 239, 253, 244, 63, 194, 185, 90, 40, 3, 170, 255, 0, 133, 149, 227, 47, 250, 24, 111, 127, 239, 161, 254, 20, 127, 194, 202, 241, 151, 253, 12, 55, 191, 247, 208, 255, 0, 10, 229, 104, 160, 14, 255, 0, 195, 95, 19, 124, 91, 23, 137, 116, 211, 46, 179, 115, 115, 17, 184, 68, 104, 101, 111, 149, 193, 56, 193, 252, 235, 111, 226, 119, 196, 95, 19, 218, 248, 255, 0, 84, 177, 177, 213, 39, 180, 181, 180, 144, 66, 145, 66, 220, 112, 58, 253, 107, 205, 52, 47, 249, 24, 52, 207, 250, 251, 139, 255, 0, 67, 21, 208, 124, 83, 255, 0, 146, 159, 226, 15, 250, 251, 63, 200, 80, 4, 95, 240, 178, 188, 101, 255, 0, 67, 13, 239, 253, 244, 63, 194, 143, 248, 89, 94, 50, 255, 0, 161, 134, 247, 254, 250, 31, 225, 92, 173, 20, 1, 213, 127, 194, 202, 241, 151, 253, 12, 55, 191, 247, 208, 255, 0, 10, 63, 225, 101, 120, 203, 254, 134, 27, 223, 251, 232, 127, 133, 114, 180, 80, 7, 85, 255, 0, 11, 43, 198, 95, 244, 48, 222, 255, 0, 223, 67, 252, 40, 255, 0, 133, 149, 227, 47, 250, 24, 111, 127, 239, 161, 254, 21, 202, 209, 64, 29, 87, 252, 44, 175, 25, 127, 208, 195, 123, 255, 0, 125, 15, 240, 163, 254, 22, 87, 140, 191, 232, 97, 189, 255, 0, 190, 135, 248, 87, 43, 69, 0, 117, 95, 240, 178, 188, 101, 255, 0, 67, 13, 239, 253, 244, 63, 194, 190, 170, 248, 121, 123, 115, 169, 124, 61, 209, 111, 111, 37, 105, 174, 102, 182, 13, 36, 141, 213, 142, 77, 124, 87, 95, 102, 252, 44, 255, 0, 146, 95, 225, 255, 0, 250, 245, 31, 204, 208, 7, 95, 69, 20, 80, 1, 72, 223, 116, 253, 41, 106, 11, 150, 217, 105, 51, 255, 0, 117, 9, 253, 40, 3, 199, 238, 188, 71, 172, 139, 201, 194, 234, 51, 0, 37, 108, 15, 78, 106, 63, 248, 73, 53, 159, 250, 9, 77, 89, 178, 182, 249, 164, 127, 239, 18, 105, 180, 1, 169, 255, 0, 9, 38, 179, 255, 0, 65, 41, 168, 255, 0, 132, 147, 89, 255, 0, 160, 148, 213, 151, 69, 0, 109, 217, 120, 143, 89, 123, 235, 96, 250, 140, 196, 25, 84, 17, 234, 51, 93, 47, 195, 255, 0, 249, 27, 188, 121, 255, 0, 97, 85, 255, 0, 209, 98, 184, 91, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 221, 248, 3, 254, 70, 255, 0, 30, 127, 216, 85, 127, 244, 88, 160, 14, 250, 138, 40, 160, 2, 131, 156, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 121, 255, 0, 197, 239, 249, 20, 108, 255, 0, 236, 43, 105, 255, 0, 163, 5, 114, 254, 42, 255, 0, 145, 159, 80, 255, 0, 174, 213, 212, 124, 94, 255, 0, 145, 70, 207, 254, 194, 182, 159, 250, 48, 87, 47, 226, 175, 249, 25, 245, 15, 250, 237, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 122, 223, 129, 238, 60, 255, 0, 13, 66, 63, 231, 153, 43, 93, 37, 112, 95, 13, 238, 179, 21, 221, 169, 61, 8, 144, 10, 239, 104, 0, 162, 138, 40, 3, 63, 92, 255, 0, 144, 6, 165, 255, 0, 94, 146, 255, 0, 232, 38, 190, 19, 175, 187, 53, 207, 249, 0, 106, 95, 245, 233, 47, 254, 130, 107, 225, 58, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 191, 161, 127, 200, 193, 166, 255, 0, 215, 212, 95, 250, 24, 174, 131, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 185, 253, 11, 254, 70, 13, 55, 254, 190, 162, 255, 0, 208, 197, 116, 31, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 20, 1, 200, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 87, 217, 191, 10, 255, 0, 228, 152, 120, 123, 254, 189, 7, 243, 53, 241, 149, 125, 155, 240, 175, 254, 73, 135, 135, 191, 235, 208, 127, 51, 64, 29, 125, 20, 81, 64, 5, 102, 120, 134, 127, 179, 104, 23, 178, 231, 31, 186, 32, 86, 157, 114, 95, 16, 46, 188, 157, 0, 91, 231, 153, 156, 10, 0, 242, 218, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 149, 183, 253, 117, 95, 231, 90, 190, 36, 255, 0, 145, 146, 251, 254, 186, 255, 0, 74, 202, 177, 255, 0, 144, 149, 183, 253, 117, 95, 231, 90, 190, 36, 255, 0, 145, 146, 251, 254, 186, 255, 0, 74, 184, 110, 124, 239, 17, 255, 0, 187, 199, 215, 244, 102, 85, 20, 81, 90, 31, 26, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 29, 170, 224, 251, 162, 169, 246, 171, 131, 238, 138, 245, 178, 173, 228, 123, 57, 54, 242, 249, 11, 69, 20, 87, 176, 123, 225, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 127, 241, 253, 15, 253, 116, 95, 231, 76, 241, 87, 252, 141, 58, 135, 253, 117, 167, 217, 255, 0, 199, 244, 63, 245, 209, 127, 157, 51, 197, 95, 242, 52, 234, 31, 245, 214, 188, 44, 223, 226, 137, 221, 131, 217, 153, 20, 81, 69, 120, 231, 112, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 141, 55, 255, 0, 245, 214, 179, 236, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 105, 191, 255, 0, 174, 180, 1, 143, 214, 185, 31, 22, 120, 177, 116, 228, 54, 118, 44, 13, 211, 14, 100, 7, 238, 15, 241, 167, 120, 179, 197, 139, 166, 70, 108, 172, 88, 27, 166, 31, 51, 15, 224, 31, 227, 94, 98, 204, 206, 197, 152, 146, 196, 228, 147, 64, 3, 49, 118, 44, 196, 150, 60, 146, 105, 180, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 31, 118, 104, 95, 242, 47, 105, 159, 245, 235, 23, 254, 130, 43, 66, 179, 244, 47, 249, 23, 180, 207, 250, 245, 139, 255, 0, 65, 21, 161, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 31, 9, 235, 191, 242, 48, 106, 127, 245, 247, 47, 254, 132, 107, 62, 180, 53, 223, 249, 24, 53, 63, 250, 251, 151, 255, 0, 66, 53, 159, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 30, 129, 225, 47, 23, 228, 46, 159, 168, 201, 237, 28, 164, 245, 246, 53, 222, 215, 129, 87, 160, 120, 75, 197, 219, 130, 233, 250, 139, 243, 210, 41, 143, 127, 99, 64, 30, 137, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 77, 255, 0, 253, 117, 172, 235, 15, 249, 8, 91, 127, 215, 85, 254, 117, 163, 226, 175, 249, 26, 111, 255, 0, 235, 173, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 143, 252, 132, 109, 127, 235, 170, 255, 0, 49, 93, 23, 136, 191, 228, 96, 189, 255, 0, 174, 181, 206, 216, 255, 0, 200, 70, 215, 254, 186, 175, 243, 21, 209, 120, 139, 254, 70, 11, 223, 250, 235, 94, 166, 83, 252, 103, 232, 114, 99, 62, 20, 101, 209, 69, 21, 244, 39, 156, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 21, 144, 255, 0, 235, 15, 214, 181, 235, 33, 255, 0, 214, 31, 173, 124, 175, 19, 252, 52, 254, 102, 212, 130, 138, 40, 175, 143, 55, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 44, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 47, 20, 255, 0, 200, 211, 127, 255, 0, 93, 107, 54, 199, 254, 66, 22, 191, 245, 213, 127, 157, 105, 120, 167, 254, 70, 155, 255, 0, 250, 235, 94, 166, 95, 179, 55, 163, 212, 200, 162, 138, 43, 209, 58, 2, 138, 40, 160, 15, 92, 240, 53, 199, 159, 225, 152, 87, 254, 121, 146, 149, 209, 215, 3, 240, 222, 235, 48, 221, 218, 19, 200, 195, 138, 239, 168, 0, 162, 138, 40, 3, 63, 93, 255, 0, 145, 123, 83, 255, 0, 175, 89, 127, 244, 19, 95, 9, 215, 221, 154, 239, 252, 139, 218, 159, 253, 122, 203, 255, 0, 160, 154, 248, 78, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 47, 232, 95, 242, 48, 105, 159, 245, 247, 23, 254, 134, 43, 160, 248, 167, 255, 0, 37, 63, 196, 31, 245, 246, 127, 144, 174, 127, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 93, 7, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 0, 114, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 21, 246, 111, 194, 207, 249, 37, 254, 31, 255, 0, 175, 81, 252, 205, 124, 101, 95, 102, 252, 44, 255, 0, 146, 95, 225, 255, 0, 250, 245, 31, 204, 208, 7, 95, 69, 20, 80, 1, 89, 158, 33, 159, 236, 218, 5, 236, 185, 198, 34, 32, 86, 157, 114, 95, 16, 110, 188, 157, 4, 65, 159, 154, 105, 0, 160, 15, 45, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 221, 248, 3, 254, 70, 255, 0, 30, 127, 216, 85, 127, 244, 88, 174, 18, 199, 254, 66, 22, 191, 245, 213, 127, 157, 119, 126, 0, 255, 0, 145, 191, 199, 159, 246, 21, 95, 253, 22, 40, 3, 190, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 3, 207, 254, 47, 127, 200, 163, 103, 255, 0, 97, 91, 79, 253, 24, 43, 151, 241, 87, 252, 140, 250, 135, 253, 118, 174, 163, 226, 247, 252, 138, 54, 127, 246, 21, 180, 255, 0, 209, 130, 185, 127, 21, 127, 200, 207, 168, 127, 215, 106, 0, 200, 162, 138, 40, 0, 162, 138, 40, 3, 119, 193, 215, 223, 97, 241, 12, 25, 56, 73, 191, 118, 127, 165, 123, 21, 120, 12, 78, 98, 145, 101, 94, 25, 78, 69, 123, 134, 141, 124, 53, 29, 42, 218, 232, 28, 239, 94, 126, 180, 1, 122, 138, 40, 160, 12, 253, 115, 254, 64, 26, 159, 253, 122, 75, 255, 0, 160, 154, 248, 78, 190, 236, 215, 63, 228, 1, 169, 255, 0, 215, 164, 191, 250, 9, 175, 132, 232, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 254, 133, 255, 0, 35, 6, 155, 255, 0, 95, 81, 127, 232, 98, 186, 15, 138, 127, 242, 83, 252, 65, 255, 0, 95, 103, 249, 10, 231, 244, 47, 249, 24, 52, 223, 250, 250, 139, 255, 0, 67, 21, 208, 124, 83, 255, 0, 146, 159, 226, 15, 250, 251, 63, 200, 80, 7, 33, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 95, 102, 252, 43, 255, 0, 146, 97, 225, 239, 250, 244, 31, 204, 215, 198, 85, 246, 111, 194, 191, 249, 38, 30, 30, 255, 0, 175, 65, 252, 205, 0, 117, 244, 81, 69, 0, 21, 229, 255, 0, 16, 111, 133, 198, 175, 29, 170, 158, 32, 94, 126, 166, 189, 46, 226, 117, 181, 183, 146, 121, 14, 21, 6, 77, 120, 109, 253, 227, 94, 234, 19, 221, 55, 38, 70, 38, 128, 43, 209, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 173, 191, 235, 170, 255, 0, 58, 213, 241, 39, 252, 140, 151, 223, 245, 215, 250, 86, 85, 143, 252, 132, 173, 191, 235, 170, 255, 0, 58, 213, 241, 39, 252, 140, 151, 223, 245, 215, 250, 85, 195, 115, 231, 120, 143, 253, 222, 62, 191, 163, 50, 168, 162, 138, 208, 248, 208, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 237, 87, 7, 221, 21, 79, 181, 92, 31, 116, 87, 173, 149, 111, 35, 217, 201, 183, 151, 200, 90, 40, 162, 189, 131, 223, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 179, 255, 0, 143, 232, 127, 235, 162, 255, 0, 58, 103, 138, 191, 228, 105, 212, 63, 235, 173, 62, 207, 254, 63, 161, 255, 0, 174, 139, 252, 233, 158, 42, 255, 0, 145, 167, 80, 255, 0, 174, 181, 225, 102, 255, 0, 20, 78, 236, 30, 204, 200, 162, 138, 43, 199, 59, 130, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 33, 109, 255, 0, 93, 87, 249, 214, 111, 197, 95, 17, 71, 164, 107, 90, 148, 17, 63, 250, 108, 142, 118, 227, 248, 125, 234, 166, 189, 175, 166, 129, 105, 246, 128, 192, 220, 231, 247, 41, 234, 107, 201, 117, 61, 78, 239, 88, 212, 166, 191, 191, 153, 166, 185, 153, 183, 60, 141, 212, 208, 5, 87, 118, 145, 203, 185, 44, 196, 228, 147, 222, 155, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 247, 102, 133, 255, 0, 34, 246, 153, 255, 0, 94, 177, 127, 232, 34, 180, 43, 63, 66, 255, 0, 145, 123, 76, 255, 0, 175, 88, 191, 244, 17, 90, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 240, 158, 187, 255, 0, 35, 6, 167, 255, 0, 95, 114, 255, 0, 232, 70, 179, 235, 67, 93, 255, 0, 145, 131, 83, 255, 0, 175, 185, 127, 244, 35, 89, 244, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 234, 159, 15, 188, 71, 29, 237, 197, 166, 159, 121, 57, 251, 82, 74, 54, 150, 254, 33, 159, 231, 94, 129, 226, 191, 249, 25, 245, 15, 250, 234, 107, 231, 8, 102, 146, 222, 116, 154, 23, 41, 42, 16, 202, 195, 168, 34, 189, 107, 195, 190, 44, 111, 18, 163, 181, 244, 160, 234, 25, 249, 243, 252, 126, 244, 1, 189, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 197, 116, 94, 35, 255, 0, 145, 130, 243, 253, 250, 231, 108, 127, 228, 35, 107, 255, 0, 93, 87, 249, 138, 232, 188, 71, 255, 0, 35, 5, 231, 251, 245, 234, 101, 63, 198, 126, 135, 38, 51, 225, 70, 93, 20, 81, 95, 66, 121, 193, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 89, 13, 254, 176, 253, 107, 94, 178, 27, 253, 97, 250, 215, 202, 241, 63, 195, 79, 230, 109, 75, 168, 81, 69, 21, 241, 230, 225, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 5, 139, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 165, 226, 159, 249, 26, 111, 255, 0, 235, 173, 102, 216, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 47, 20, 255, 0, 200, 211, 127, 255, 0, 93, 107, 212, 203, 246, 102, 244, 122, 153, 20, 81, 69, 122, 39, 64, 81, 69, 20, 1, 191, 224, 203, 255, 0, 176, 248, 134, 29, 199, 9, 55, 238, 207, 244, 175, 96, 175, 1, 138, 67, 20, 138, 235, 195, 41, 200, 53, 237, 250, 61, 250, 234, 90, 85, 189, 208, 57, 222, 188, 253, 123, 208, 5, 250, 40, 162, 128, 51, 245, 223, 249, 23, 181, 63, 250, 245, 151, 255, 0, 65, 53, 240, 157, 125, 217, 174, 255, 0, 200, 189, 169, 255, 0, 215, 172, 191, 250, 9, 175, 132, 232, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 254, 133, 255, 0, 35, 6, 153, 255, 0, 95, 113, 127, 232, 98, 186, 15, 138, 127, 242, 83, 252, 65, 255, 0, 95, 103, 249, 10, 231, 244, 47, 249, 24, 52, 207, 250, 251, 139, 255, 0, 67, 21, 208, 124, 83, 255, 0, 146, 159, 226, 15, 250, 251, 63, 200, 80, 7, 33, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 95, 103, 124, 44, 255, 0, 146, 97, 225, 239, 250, 245, 31, 204, 215, 198, 53, 246, 119, 194, 207, 249, 38, 30, 30, 255, 0, 175, 81, 252, 205, 0, 117, 212, 81, 69, 0, 21, 229, 255, 0, 16, 111, 188, 253, 94, 59, 85, 60, 64, 188, 253, 77, 122, 93, 204, 235, 107, 111, 36, 238, 112, 136, 50, 107, 195, 117, 11, 198, 191, 212, 38, 186, 110, 178, 54, 104, 2, 189, 20, 81, 64, 5, 20, 81, 64, 19, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 174, 239, 192, 31, 242, 55, 248, 243, 254, 194, 171, 255, 0, 162, 197, 112, 150, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 187, 240, 7, 252, 141, 254, 60, 255, 0, 176, 170, 255, 0, 232, 177, 64, 29, 245, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 30, 127, 241, 123, 254, 69, 27, 63, 251, 10, 218, 127, 232, 193, 92, 191, 138, 191, 228, 103, 212, 63, 235, 181, 117, 31, 23, 191, 228, 81, 179, 255, 0, 176, 173, 167, 254, 140, 21, 203, 248, 171, 254, 70, 125, 67, 254, 187, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 119, 191, 15, 53, 125, 166, 93, 46, 86, 235, 243, 69, 159, 94, 226, 184, 42, 154, 198, 233, 236, 111, 34, 185, 136, 225, 208, 228, 80, 7, 188, 209, 84, 116, 189, 66, 61, 83, 78, 134, 234, 35, 157, 227, 159, 99, 87, 168, 3, 63, 92, 255, 0, 144, 6, 167, 255, 0, 94, 146, 255, 0, 232, 38, 190, 19, 175, 187, 53, 207, 249, 0, 106, 127, 245, 233, 47, 254, 130, 107, 225, 58, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 191, 161, 127, 200, 193, 166, 255, 0, 215, 212, 95, 250, 24, 174, 131, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 185, 253, 11, 254, 70, 13, 55, 254, 190, 162, 255, 0, 208, 197, 116, 31, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 20, 1, 200, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 87, 217, 159, 10, 255, 0, 228, 152, 120, 127, 254, 189, 7, 243, 53, 241, 157, 125, 153, 240, 175, 254, 73, 135, 135, 255, 0, 235, 208, 127, 51, 64, 29, 133, 20, 84, 87, 23, 17, 90, 91, 201, 60, 205, 182, 52, 25, 38, 128, 57, 47, 31, 234, 255, 0, 100, 211, 214, 194, 38, 253, 228, 255, 0, 123, 217, 107, 204, 170, 254, 185, 169, 201, 171, 106, 147, 93, 55, 66, 112, 163, 208, 85, 10, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 86, 223, 245, 213, 127, 157, 106, 248, 147, 254, 70, 75, 239, 250, 235, 253, 43, 42, 199, 254, 66, 86, 223, 245, 213, 127, 157, 106, 248, 147, 254, 70, 75, 239, 250, 235, 253, 42, 225, 185, 243, 188, 71, 254, 239, 31, 95, 209, 153, 84, 81, 69, 104, 124, 104, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 118, 171, 131, 238, 138, 167, 218, 174, 15, 186, 43, 214, 202, 183, 145, 236, 228, 219, 203, 228, 45, 20, 81, 94, 193, 239, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 89, 255, 0, 199, 244, 63, 245, 209, 127, 157, 51, 197, 95, 242, 52, 234, 31, 245, 214, 159, 103, 255, 0, 31, 208, 255, 0, 215, 69, 254, 116, 207, 21, 127, 200, 211, 168, 127, 215, 90, 240, 179, 127, 138, 39, 118, 15, 102, 100, 81, 69, 21, 227, 157, 193, 69, 20, 80, 1, 69, 20, 80, 1, 84, 53, 29, 78, 215, 74, 179, 55, 55, 79, 128, 59, 119, 39, 218, 173, 207, 50, 193, 3, 205, 43, 109, 141, 6, 73, 244, 175, 34, 241, 46, 188, 218, 221, 246, 229, 4, 65, 31, 8, 61, 125, 232, 2, 142, 171, 169, 207, 170, 223, 61, 196, 238, 91, 39, 229, 7, 248, 71, 165, 81, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 251, 179, 66, 255, 0, 145, 123, 76, 255, 0, 175, 88, 191, 244, 17, 90, 21, 159, 161, 127, 200, 189, 166, 127, 215, 172, 95, 250, 8, 173, 10, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 248, 79, 93, 255, 0, 145, 131, 83, 255, 0, 175, 185, 127, 244, 35, 89, 245, 161, 174, 255, 0, 200, 193, 169, 255, 0, 215, 220, 191, 250, 17, 172, 250, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 42, 107, 75, 185, 172, 174, 18, 226, 221, 202, 74, 135, 32, 138, 134, 138, 0, 246, 157, 11, 92, 183, 214, 236, 86, 68, 111, 222, 129, 137, 20, 245, 6, 181, 43, 197, 52, 61, 94, 93, 23, 81, 75, 168, 249, 29, 29, 125, 69, 123, 13, 133, 236, 26, 133, 148, 119, 54, 231, 114, 72, 51, 244, 160, 11, 84, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 95, 250, 234, 191, 204, 87, 69, 226, 47, 249, 24, 47, 127, 235, 173, 115, 182, 63, 242, 17, 181, 255, 0, 174, 171, 252, 197, 116, 94, 34, 255, 0, 145, 130, 247, 254, 186, 215, 169, 148, 255, 0, 25, 250, 28, 152, 207, 133, 25, 116, 81, 69, 125, 9, 231, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 100, 55, 250, 195, 245, 173, 122, 200, 127, 245, 135, 235, 95, 43, 196, 255, 0, 13, 63, 153, 181, 32, 162, 138, 43, 227, 205, 194, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 11, 22, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 75, 197, 63, 242, 52, 223, 255, 0, 215, 90, 205, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 90, 94, 41, 255, 0, 145, 166, 255, 0, 254, 186, 215, 169, 151, 236, 205, 232, 245, 50, 40, 162, 138, 244, 78, 128, 162, 138, 40, 0, 174, 247, 225, 222, 175, 131, 46, 151, 43, 117, 249, 226, 207, 234, 43, 130, 169, 172, 174, 94, 198, 238, 43, 152, 78, 26, 50, 8, 160, 15, 121, 162, 168, 233, 122, 132, 122, 166, 157, 13, 212, 71, 59, 199, 62, 198, 175, 80, 6, 126, 187, 255, 0, 34, 246, 167, 255, 0, 94, 178, 255, 0, 232, 38, 190, 19, 175, 187, 53, 223, 249, 23, 181, 63, 250, 245, 151, 255, 0, 65, 53, 240, 157, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 95, 208, 191, 228, 96, 211, 63, 235, 238, 47, 253, 12, 87, 65, 241, 79, 254, 74, 127, 136, 63, 235, 236, 255, 0, 33, 92, 254, 133, 255, 0, 35, 6, 153, 255, 0, 95, 113, 127, 232, 98, 186, 15, 138, 127, 242, 83, 252, 65, 255, 0, 95, 103, 249, 10, 0, 228, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 43, 236, 223, 133, 159, 242, 75, 252, 63, 255, 0, 94, 163, 249, 154, 248, 202, 190, 205, 248, 89, 255, 0, 36, 191, 195, 255, 0, 245, 234, 63, 153, 160, 14, 190, 138, 42, 43, 139, 136, 173, 173, 228, 158, 86, 196, 104, 50, 77, 0, 114, 62, 63, 214, 62, 203, 167, 173, 132, 79, 251, 217, 249, 108, 30, 139, 94, 103, 87, 181, 205, 77, 245, 109, 82, 107, 166, 232, 199, 229, 30, 130, 168, 208, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 187, 240, 7, 252, 141, 254, 60, 255, 0, 176, 170, 255, 0, 232, 177, 92, 37, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 238, 252, 1, 255, 0, 35, 127, 143, 63, 236, 42, 191, 250, 44, 80, 7, 125, 69, 20, 80, 1, 69, 20, 80, 1, 69, 24, 163, 240, 160, 2, 138, 63, 10, 63, 10, 0, 243, 255, 0, 139, 223, 242, 40, 217, 255, 0, 216, 86, 211, 255, 0, 70, 10, 229, 252, 85, 255, 0, 35, 62, 161, 255, 0, 93, 171, 169, 248, 189, 255, 0, 34, 133, 151, 253, 133, 109, 63, 244, 101, 115, 222, 39, 180, 185, 147, 196, 183, 229, 109, 166, 96, 101, 200, 34, 50, 71, 106, 0, 192, 162, 166, 251, 13, 239, 252, 249, 220, 255, 0, 223, 163, 71, 216, 111, 127, 231, 206, 231, 254, 253, 26, 0, 134, 138, 155, 236, 55, 191, 243, 231, 115, 255, 0, 126, 141, 31, 97, 189, 255, 0, 159, 59, 159, 251, 244, 104, 2, 26, 42, 111, 176, 222, 255, 0, 207, 157, 207, 253, 250, 52, 125, 134, 247, 254, 124, 238, 127, 239, 209, 160, 14, 155, 193, 26, 247, 246, 109, 233, 179, 157, 177, 111, 55, 66, 127, 132, 215, 169, 215, 131, 253, 138, 247, 254, 125, 46, 127, 239, 131, 94, 155, 224, 237, 106, 226, 246, 215, 236, 151, 208, 76, 179, 194, 56, 102, 82, 55, 10, 0, 219, 215, 63, 228, 1, 169, 255, 0, 215, 164, 191, 250, 9, 175, 132, 235, 238, 205, 115, 254, 64, 26, 159, 253, 122, 75, 255, 0, 160, 154, 248, 78, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 47, 232, 127, 242, 48, 105, 191, 245, 245, 23, 254, 132, 43, 160, 248, 167, 255, 0, 37, 63, 196, 31, 245, 246, 127, 144, 174, 127, 67, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 33, 93, 7, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 0, 114, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 21, 246, 103, 194, 191, 249, 38, 30, 31, 255, 0, 175, 65, 252, 205, 124, 103, 95, 102, 124, 43, 255, 0, 146, 97, 225, 255, 0, 250, 244, 31, 204, 208, 7, 97, 94, 119, 227, 189, 127, 205, 255, 0, 137, 85, 179, 124, 157, 102, 35, 249, 87, 81, 226, 93, 98, 93, 43, 78, 63, 101, 134, 89, 46, 95, 132, 218, 164, 129, 239, 94, 73, 37, 182, 161, 44, 133, 154, 210, 229, 153, 142, 73, 49, 154, 0, 175, 69, 77, 246, 27, 223, 249, 244, 159, 254, 253, 26, 62, 195, 123, 255, 0, 62, 147, 255, 0, 223, 163, 64, 16, 209, 83, 125, 134, 247, 254, 125, 39, 255, 0, 191, 70, 143, 176, 222, 255, 0, 207, 164, 255, 0, 247, 232, 208, 4, 52, 84, 223, 97, 189, 255, 0, 159, 73, 255, 0, 239, 209, 163, 236, 55, 191, 243, 233, 63, 253, 250, 52, 0, 88, 255, 0, 200, 74, 219, 254, 186, 175, 243, 173, 111, 18, 127, 200, 201, 125, 255, 0, 93, 127, 165, 82, 178, 177, 187, 26, 133, 185, 54, 147, 128, 37, 83, 147, 25, 245, 171, 190, 36, 255, 0, 145, 146, 251, 254, 186, 255, 0, 74, 184, 110, 124, 239, 17, 255, 0, 187, 199, 215, 244, 102, 85, 20, 81, 90, 31, 26, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 29, 170, 218, 253, 193, 85, 113, 158, 7, 39, 210, 180, 86, 202, 235, 104, 255, 0, 70, 159, 254, 248, 53, 234, 229, 173, 39, 43, 179, 218, 201, 83, 110, 86, 242, 34, 162, 166, 251, 13, 215, 252, 251, 79, 255, 0, 126, 205, 31, 97, 186, 255, 0, 159, 105, 255, 0, 239, 217, 175, 91, 218, 211, 238, 143, 123, 145, 246, 33, 162, 166, 251, 13, 215, 252, 251, 79, 255, 0, 126, 205, 31, 97, 186, 255, 0, 159, 105, 255, 0, 239, 217, 163, 218, 211, 238, 131, 145, 246, 33, 162, 166, 251, 13, 215, 252, 251, 79, 255, 0, 126, 205, 31, 97, 186, 255, 0, 159, 105, 255, 0, 239, 217, 163, 218, 211, 238, 131, 145, 246, 33, 162, 166, 251, 13, 215, 252, 251, 79, 255, 0, 126, 205, 31, 97, 186, 255, 0, 159, 105, 255, 0, 239, 217, 163, 218, 211, 238, 131, 145, 246, 11, 63, 248, 253, 135, 254, 186, 47, 243, 164, 241, 87, 252, 141, 58, 135, 253, 117, 171, 22, 118, 119, 66, 242, 18, 109, 167, 225, 215, 159, 44, 250, 211, 124, 79, 105, 115, 39, 137, 111, 204, 118, 179, 48, 50, 240, 66, 18, 13, 120, 121, 179, 78, 81, 177, 223, 132, 77, 39, 115, 2, 138, 155, 236, 55, 191, 243, 233, 63, 253, 250, 52, 125, 134, 247, 254, 125, 39, 255, 0, 191, 70, 188, 147, 180, 134, 138, 155, 236, 55, 191, 243, 233, 63, 253, 250, 52, 125, 134, 247, 254, 125, 39, 255, 0, 191, 70, 128, 33, 162, 166, 251, 13, 239, 252, 250, 79, 255, 0, 126, 141, 114, 158, 53, 214, 223, 69, 180, 54, 106, 36, 138, 254, 65, 149, 200, 193, 85, 245, 160, 14, 119, 198, 190, 35, 251, 76, 223, 217, 182, 146, 159, 37, 78, 38, 35, 248, 141, 113, 52, 164, 150, 36, 147, 146, 121, 38, 146, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 62, 236, 208, 191, 228, 94, 211, 63, 235, 214, 47, 253, 4, 86, 133, 80, 208, 191, 228, 95, 211, 63, 235, 210, 47, 253, 4, 85, 250, 0, 40, 162, 143, 194, 128, 10, 40, 252, 40, 252, 40, 0, 162, 143, 194, 143, 194, 128, 10, 40, 252, 40, 252, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 151, 240, 164, 252, 40, 0, 162, 143, 194, 143, 194, 128, 10, 40, 252, 40, 252, 40, 0, 162, 143, 194, 143, 194, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 252, 40, 252, 40, 0, 162, 143, 194, 143, 194, 128, 10, 40, 252, 40, 252, 40, 0, 162, 143, 194, 150, 128, 18, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 63, 10, 63, 10, 0, 40, 163, 240, 163, 240, 160, 2, 138, 63, 10, 63, 10, 0, 40, 163, 240, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 163, 240, 160, 2, 138, 63, 10, 63, 10, 0, 248, 79, 93, 255, 0, 145, 131, 83, 255, 0, 175, 185, 127, 244, 35, 89, 245, 127, 93, 255, 0, 145, 135, 83, 255, 0, 175, 169, 127, 244, 51, 84, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 174, 155, 194, 62, 34, 58, 69, 239, 145, 115, 35, 125, 141, 250, 143, 238, 159, 90, 230, 104, 160, 15, 123, 4, 21, 4, 28, 130, 50, 41, 213, 196, 120, 23, 95, 123, 188, 105, 87, 46, 239, 63, 252, 176, 239, 145, 233, 93, 239, 216, 111, 127, 231, 210, 127, 251, 244, 104, 2, 26, 42, 111, 176, 222, 255, 0, 207, 164, 255, 0, 247, 232, 209, 246, 27, 223, 249, 244, 159, 254, 253, 26, 0, 134, 138, 155, 236, 55, 191, 243, 233, 63, 253, 250, 52, 125, 134, 247, 254, 125, 39, 255, 0, 191, 70, 128, 11, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 209, 120, 143, 254, 70, 11, 207, 250, 235, 88, 182, 86, 55, 99, 80, 182, 38, 210, 124, 9, 65, 255, 0, 86, 125, 107, 123, 196, 54, 183, 15, 175, 94, 50, 219, 204, 65, 124, 130, 20, 243, 94, 158, 84, 210, 170, 238, 250, 28, 152, 180, 220, 85, 140, 122, 42, 111, 177, 93, 127, 207, 181, 199, 253, 251, 52, 125, 138, 235, 254, 125, 174, 63, 239, 217, 175, 127, 218, 67, 186, 60, 238, 71, 216, 134, 138, 155, 236, 87, 95, 243, 237, 113, 255, 0, 126, 205, 31, 98, 186, 255, 0, 159, 107, 143, 251, 246, 104, 246, 144, 238, 131, 150, 93, 136, 104, 169, 190, 197, 117, 255, 0, 62, 215, 31, 247, 236, 209, 246, 43, 175, 249, 246, 184, 255, 0, 191, 102, 143, 105, 14, 232, 57, 31, 98, 26, 42, 111, 177, 93, 127, 207, 181, 199, 253, 251, 52, 125, 138, 235, 254, 125, 174, 63, 239, 217, 163, 218, 67, 186, 14, 89, 118, 33, 172, 134, 255, 0, 88, 126, 181, 187, 246, 43, 175, 249, 245, 155, 254, 248, 53, 135, 50, 180, 115, 200, 174, 165, 72, 61, 8, 230, 190, 91, 137, 164, 156, 97, 103, 220, 218, 154, 107, 113, 40, 162, 138, 249, 19, 112, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 197, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 210, 241, 79, 252, 141, 55, 255, 0, 245, 214, 179, 108, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 215, 137, 172, 238, 100, 241, 45, 251, 71, 107, 51, 3, 47, 4, 33, 32, 215, 169, 151, 236, 205, 232, 245, 48, 40, 169, 190, 195, 123, 255, 0, 62, 147, 255, 0, 223, 163, 71, 216, 111, 127, 231, 210, 127, 251, 244, 107, 209, 58, 8, 104, 169, 190, 195, 123, 255, 0, 62, 147, 255, 0, 223, 163, 71, 216, 111, 127, 231, 210, 127, 251, 244, 104, 2, 26, 42, 111, 176, 222, 255, 0, 207, 164, 255, 0, 247, 232, 209, 246, 27, 223, 249, 244, 159, 254, 253, 26, 0, 233, 188, 19, 175, 255, 0, 102, 222, 27, 41, 219, 16, 77, 208, 147, 247, 77, 122, 150, 107, 194, 62, 197, 123, 255, 0, 62, 151, 63, 247, 193, 175, 77, 240, 110, 177, 113, 119, 105, 246, 59, 219, 121, 163, 154, 33, 242, 179, 169, 27, 133, 0, 109, 235, 191, 242, 47, 106, 127, 245, 235, 47, 254, 130, 107, 225, 58, 251, 179, 93, 255, 0, 145, 123, 83, 255, 0, 175, 89, 127, 244, 19, 95, 9, 208, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 5, 253, 11, 254, 70, 13, 51, 254, 190, 226, 255, 0, 208, 197, 116, 31, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 21, 207, 232, 127, 242, 48, 105, 191, 245, 245, 23, 254, 132, 43, 127, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 128, 57, 26, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 251, 55, 225, 103, 252, 146, 255, 0, 15, 255, 0, 215, 168, 254, 102, 190, 50, 175, 179, 126, 21, 255, 0, 201, 47, 240, 247, 253, 122, 143, 230, 104, 3, 175, 175, 59, 241, 238, 191, 189, 191, 178, 173, 155, 142, 179, 17, 252, 171, 167, 241, 46, 177, 54, 151, 167, 159, 178, 195, 44, 183, 79, 194, 109, 82, 113, 239, 94, 75, 37, 165, 252, 172, 204, 246, 151, 44, 204, 114, 73, 67, 214, 128, 43, 209, 83, 125, 134, 247, 254, 125, 39, 255, 0, 191, 70, 143, 176, 222, 255, 0, 207, 164, 255, 0, 247, 232, 208, 4, 52, 84, 223, 97, 189, 255, 0, 159, 73, 255, 0, 239, 209, 163, 236, 55, 191, 243, 233, 63, 253, 250, 52, 1, 13, 21, 55, 216, 111, 127, 231, 210, 127, 251, 244, 104, 251, 13, 239, 252, 250, 79, 255, 0, 126, 141, 0, 22, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 187, 240, 7, 252, 141, 254, 60, 255, 0, 176, 170, 255, 0, 232, 177, 92, 109, 149, 141, 216, 212, 45, 201, 180, 159, 2, 85, 255, 0, 150, 71, 214, 187, 31, 0, 15, 248, 171, 252, 123, 255, 0, 97, 85, 255, 0, 209, 98, 128, 59, 250, 40, 252, 40, 252, 40, 0, 162, 143, 194, 143, 194, 128, 62, 109, 248, 203, 227, 31, 17, 104, 159, 16, 101, 179, 211, 53, 139, 171, 91, 113, 109, 19, 8, 226, 108, 12, 145, 94, 125, 255, 0, 11, 43, 198, 127, 244, 49, 223, 255, 0, 223, 202, 233, 126, 61, 255, 0, 201, 79, 184, 255, 0, 175, 88, 127, 149, 121, 141, 0, 117, 63, 240, 178, 188, 103, 255, 0, 67, 29, 255, 0, 253, 252, 163, 254, 22, 87, 140, 255, 0, 232, 99, 191, 255, 0, 191, 149, 203, 81, 64, 29, 101, 191, 140, 188, 69, 173, 234, 154, 117, 158, 167, 172, 93, 93, 91, 27, 200, 88, 199, 43, 228, 103, 112, 175, 124, 241, 23, 137, 117, 155, 77, 122, 250, 11, 123, 246, 72, 145, 240, 171, 180, 113, 95, 51, 104, 95, 242, 48, 105, 159, 245, 247, 23, 254, 134, 43, 232, 95, 21, 127, 200, 207, 168, 127, 215, 90, 0, 119, 252, 37, 190, 33, 255, 0, 160, 155, 127, 223, 34, 143, 248, 75, 124, 67, 255, 0, 65, 54, 255, 0, 190, 69, 99, 81, 64, 27, 63, 240, 150, 248, 135, 254, 130, 109, 255, 0, 124, 138, 63, 225, 45, 241, 15, 253, 4, 219, 254, 249, 21, 141, 69, 0, 108, 255, 0, 194, 91, 226, 31, 250, 9, 183, 253, 242, 40, 255, 0, 132, 183, 196, 63, 244, 19, 111, 251, 228, 86, 53, 20, 1, 179, 255, 0, 9, 111, 136, 127, 232, 38, 223, 247, 200, 166, 159, 22, 120, 131, 254, 130, 114, 127, 223, 34, 178, 40, 160, 15, 87, 240, 239, 136, 173, 124, 67, 167, 155, 91, 160, 130, 114, 187, 36, 140, 244, 113, 210, 171, 127, 194, 171, 240, 47, 253, 11, 54, 127, 175, 248, 215, 156, 233, 174, 240, 106, 118, 174, 140, 85, 132, 171, 130, 62, 181, 235, 118, 222, 36, 181, 155, 89, 186, 211, 102, 34, 41, 161, 98, 170, 79, 70, 20, 1, 149, 255, 0, 10, 171, 192, 191, 244, 44, 217, 254, 71, 252, 104, 255, 0, 133, 85, 224, 95, 250, 22, 108, 255, 0, 35, 254, 53, 216, 209, 64, 28, 119, 252, 42, 191, 2, 255, 0, 208, 179, 103, 249, 31, 241, 163, 254, 21, 95, 129, 127, 232, 89, 179, 252, 143, 248, 215, 99, 69, 0, 113, 223, 240, 170, 252, 11, 255, 0, 66, 205, 159, 228, 127, 198, 143, 248, 85, 126, 5, 255, 0, 161, 102, 207, 242, 63, 227, 93, 141, 20, 1, 199, 127, 194, 171, 240, 47, 253, 11, 54, 127, 145, 255, 0, 26, 63, 225, 85, 248, 23, 254, 133, 155, 63, 200, 255, 0, 141, 118, 52, 80, 7, 33, 23, 195, 15, 5, 91, 205, 28, 209, 120, 118, 209, 100, 141, 131, 43, 12, 240, 71, 78, 245, 53, 255, 0, 195, 191, 8, 234, 215, 211, 95, 95, 232, 86, 211, 221, 78, 119, 73, 35, 231, 44, 127, 58, 234, 104, 160, 14, 59, 254, 21, 95, 129, 127, 232, 89, 179, 253, 127, 198, 143, 248, 85, 126, 5, 255, 0, 161, 102, 207, 245, 255, 0, 26, 236, 104, 160, 14, 59, 254, 21, 95, 129, 127, 232, 89, 179, 252, 143, 248, 209, 255, 0, 10, 175, 192, 191, 244, 44, 217, 254, 71, 252, 107, 177, 162, 128, 56, 239, 248, 85, 126, 5, 255, 0, 161, 102, 207, 245, 255, 0, 26, 63, 225, 85, 248, 23, 254, 133, 155, 63, 215, 252, 107, 177, 162, 128, 56, 239, 248, 85, 126, 5, 255, 0, 161, 102, 207, 245, 255, 0, 26, 63, 225, 85, 248, 23, 254, 133, 155, 63, 215, 252, 107, 177, 162, 128, 56, 239, 248, 85, 126, 5, 255, 0, 161, 102, 207, 245, 255, 0, 26, 189, 125, 168, 105, 158, 13, 209, 98, 181, 181, 138, 56, 150, 53, 217, 111, 108, 189, 191, 250, 213, 99, 89, 241, 29, 158, 148, 241, 192, 24, 61, 204, 140, 0, 140, 123, 158, 245, 230, 126, 45, 103, 127, 20, 95, 239, 98, 219, 95, 11, 158, 194, 128, 6, 241, 110, 190, 93, 217, 117, 25, 20, 19, 144, 187, 65, 197, 47, 252, 37, 158, 33, 255, 0, 160, 163, 127, 223, 34, 177, 168, 160, 13, 159, 248, 75, 124, 67, 255, 0, 65, 54, 255, 0, 190, 69, 31, 240, 150, 248, 135, 254, 130, 109, 255, 0, 124, 138, 198, 162, 128, 54, 127, 225, 45, 241, 15, 253, 4, 219, 254, 249, 20, 127, 194, 91, 226, 31, 250, 9, 183, 253, 242, 43, 26, 138, 0, 217, 255, 0, 132, 183, 196, 63, 244, 19, 111, 251, 228, 81, 255, 0, 9, 111, 136, 127, 232, 38, 223, 247, 200, 172, 106, 40, 3, 118, 215, 197, 122, 243, 94, 66, 173, 169, 49, 86, 144, 2, 54, 142, 153, 164, 241, 39, 252, 140, 151, 223, 245, 215, 250, 86, 85, 135, 252, 132, 109, 191, 235, 170, 255, 0, 58, 213, 241, 39, 252, 140, 151, 223, 245, 215, 250, 85, 195, 115, 231, 120, 143, 253, 222, 62, 191, 163, 50, 168, 162, 138, 208, 248, 208, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 197, 143, 252, 132, 45, 191, 235, 178, 255, 0, 58, 220, 241, 23, 137, 117, 171, 93, 126, 250, 11, 125, 65, 146, 20, 124, 42, 133, 28, 113, 88, 54, 95, 241, 253, 109, 255, 0, 93, 87, 249, 213, 175, 21, 255, 0, 200, 211, 168, 127, 215, 95, 233, 89, 84, 62, 183, 134, 126, 26, 191, 33, 223, 240, 150, 120, 131, 254, 130, 114, 127, 223, 34, 143, 248, 75, 60, 65, 255, 0, 65, 57, 63, 239, 145, 88, 212, 84, 88, 250, 115, 103, 254, 18, 207, 16, 127, 208, 78, 79, 251, 228, 81, 255, 0, 9, 103, 136, 63, 232, 39, 39, 253, 242, 43, 26, 138, 44, 6, 207, 252, 37, 158, 32, 255, 0, 160, 156, 159, 247, 200, 163, 254, 18, 207, 16, 127, 208, 78, 79, 251, 228, 86, 53, 20, 88, 13, 159, 248, 75, 60, 65, 255, 0, 65, 57, 63, 239, 145, 71, 252, 37, 158, 32, 255, 0, 160, 156, 159, 247, 200, 172, 106, 40, 176, 27, 246, 190, 41, 215, 90, 242, 5, 125, 77, 202, 52, 160, 17, 180, 116, 205, 91, 241, 15, 137, 117, 171, 77, 122, 246, 11, 109, 65, 146, 36, 124, 42, 237, 28, 87, 55, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 87, 255, 0, 35, 70, 161, 255, 0, 93, 169, 128, 239, 248, 75, 60, 67, 255, 0, 65, 70, 255, 0, 190, 69, 31, 240, 150, 120, 135, 254, 130, 141, 255, 0, 124, 138, 198, 162, 128, 54, 127, 225, 44, 241, 15, 253, 5, 27, 254, 249, 20, 127, 194, 93, 226, 15, 250, 9, 201, 255, 0, 124, 138, 198, 160, 144, 6, 115, 140, 12, 208, 5, 221, 79, 199, 218, 222, 153, 99, 45, 212, 186, 177, 1, 6, 64, 32, 124, 199, 210, 188, 27, 90, 214, 239, 252, 65, 169, 201, 168, 106, 119, 47, 61, 195, 245, 102, 244, 236, 43, 75, 197, 218, 241, 214, 53, 15, 42, 60, 11, 88, 9, 17, 227, 248, 189, 235, 156, 160, 15, 69, 248, 73, 163, 233, 218, 190, 171, 168, 197, 169, 90, 37, 202, 36, 10, 200, 31, 177, 205, 122, 207, 252, 33, 30, 23, 255, 0, 160, 37, 175, 229, 94, 101, 240, 79, 254, 67, 58, 167, 253, 123, 175, 254, 133, 94, 215, 64, 24, 63, 240, 132, 248, 95, 254, 128, 150, 191, 149, 31, 240, 132, 248, 95, 254, 128, 150, 191, 149, 111, 81, 64, 24, 63, 240, 132, 248, 95, 254, 128, 150, 191, 149, 31, 240, 132, 248, 95, 254, 128, 150, 191, 149, 111, 81, 64, 28, 39, 141, 60, 37, 225, 251, 47, 7, 106, 151, 54, 218, 77, 188, 51, 69, 1, 41, 34, 14, 65, 175, 159, 171, 233, 159, 31, 127, 200, 137, 172, 255, 0, 215, 185, 254, 117, 243, 53, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 123, 111, 195, 31, 13, 104, 154, 167, 131, 163, 185, 212, 52, 232, 110, 38, 243, 228, 5, 152, 115, 142, 43, 177, 255, 0, 132, 35, 194, 223, 244, 2, 181, 252, 171, 7, 225, 23, 252, 136, 177, 255, 0, 215, 196, 159, 206, 187, 202, 0, 193, 255, 0, 132, 35, 194, 223, 244, 3, 180, 255, 0, 190, 104, 255, 0, 132, 35, 194, 223, 244, 3, 180, 255, 0, 190, 107, 122, 138, 0, 177, 21, 245, 204, 80, 199, 18, 206, 202, 136, 54, 128, 59, 10, 119, 246, 141, 239, 252, 252, 201, 85, 104, 160, 14, 19, 226, 215, 138, 117, 221, 31, 74, 211, 36, 211, 245, 75, 155, 103, 146, 102, 12, 99, 56, 200, 197, 121, 63, 252, 44, 159, 25, 127, 208, 197, 127, 255, 0, 127, 43, 208, 62, 54, 255, 0, 200, 31, 75, 255, 0, 175, 134, 255, 0, 208, 107, 197, 168, 3, 169, 255, 0, 133, 147, 227, 47, 250, 24, 175, 255, 0, 239, 229, 31, 240, 178, 124, 101, 255, 0, 67, 21, 255, 0, 253, 252, 174, 90, 138, 0, 234, 127, 225, 100, 248, 203, 254, 134, 43, 255, 0, 251, 249, 71, 252, 44, 159, 25, 127, 208, 197, 127, 255, 0, 127, 43, 150, 162, 128, 58, 159, 248, 89, 62, 50, 255, 0, 161, 138, 255, 0, 254, 254, 81, 255, 0, 11, 39, 198, 95, 244, 49, 95, 255, 0, 223, 202, 229, 168, 160, 15, 175, 52, 205, 87, 80, 147, 74, 179, 145, 238, 221, 164, 120, 16, 177, 207, 83, 129, 86, 191, 180, 239, 127, 231, 234, 79, 206, 178, 116, 175, 249, 3, 216, 255, 0, 215, 188, 127, 200, 85, 202, 0, 181, 253, 167, 123, 255, 0, 63, 50, 126, 116, 127, 105, 222, 255, 0, 207, 204, 159, 157, 85, 162, 128, 45, 127, 105, 222, 255, 0, 207, 204, 159, 157, 31, 218, 119, 191, 243, 243, 39, 231, 85, 104, 160, 15, 29, 248, 153, 227, 127, 19, 105, 158, 49, 146, 222, 199, 90, 187, 183, 135, 200, 140, 136, 227, 124, 10, 227, 191, 225, 100, 248, 203, 254, 134, 59, 255, 0, 251, 249, 90, 63, 23, 127, 228, 123, 147, 254, 189, 226, 254, 85, 194, 208, 7, 83, 255, 0, 11, 39, 198, 127, 244, 49, 223, 255, 0, 223, 202, 63, 225, 100, 248, 207, 254, 134, 59, 255, 0, 251, 249, 92, 181, 20, 1, 212, 255, 0, 194, 201, 241, 159, 253, 12, 119, 255, 0, 247, 242, 143, 248, 89, 62, 51, 255, 0, 161, 142, 255, 0, 254, 254, 87, 45, 69, 0, 117, 63, 240, 178, 124, 103, 255, 0, 67, 29, 255, 0, 253, 252, 173, 223, 6, 120, 255, 0, 197, 119, 158, 48, 210, 237, 174, 117, 219, 201, 33, 146, 112, 29, 25, 248, 34, 188, 230, 186, 79, 1, 127, 200, 247, 163, 127, 215, 192, 254, 84, 1, 245, 23, 246, 157, 239, 252, 252, 201, 71, 246, 157, 239, 252, 252, 201, 85, 104, 160, 11, 95, 218, 119, 191, 243, 243, 37, 31, 218, 119, 191, 243, 243, 37, 85, 162, 128, 45, 127, 105, 222, 255, 0, 207, 204, 148, 127, 105, 222, 255, 0, 207, 204, 149, 86, 138, 0, 249, 223, 82, 248, 137, 227, 8, 181, 75, 184, 211, 196, 55, 193, 82, 121, 2, 129, 39, 65, 147, 85, 63, 225, 100, 248, 207, 254, 134, 59, 255, 0, 251, 249, 88, 90, 191, 252, 134, 111, 191, 235, 226, 79, 253, 8, 213, 58, 0, 234, 127, 225, 100, 248, 207, 254, 134, 59, 255, 0, 251, 249, 71, 252, 44, 159, 25, 255, 0, 208, 199, 127, 255, 0, 127, 43, 150, 162, 128, 58, 159, 248, 89, 62, 51, 255, 0, 161, 142, 255, 0, 254, 254, 81, 255, 0, 11, 39, 198, 127, 244, 49, 223, 255, 0, 223, 202, 229, 168, 160, 14, 167, 254, 22, 79, 140, 255, 0, 232, 99, 191, 255, 0, 191, 149, 232, 191, 9, 60, 97, 226, 45, 99, 87, 212, 34, 212, 117, 139, 171, 136, 210, 5, 42, 36, 108, 224, 230, 188, 70, 189, 71, 224, 159, 252, 134, 117, 79, 250, 247, 95, 253, 10, 128, 61, 215, 251, 78, 247, 254, 126, 100, 163, 251, 78, 247, 254, 126, 100, 170, 180, 80, 5, 175, 237, 59, 223, 249, 249, 146, 143, 237, 59, 223, 249, 249, 146, 170, 209, 64, 22, 191, 180, 239, 127, 231, 230, 74, 194, 241, 166, 187, 169, 217, 248, 55, 84, 185, 182, 191, 154, 57, 162, 131, 49, 200, 167, 144, 114, 43, 78, 185, 191, 30, 255, 0, 200, 137, 172, 255, 0, 215, 191, 245, 20, 1, 226, 31, 240, 178, 188, 103, 255, 0, 67, 29, 255, 0, 253, 252, 163, 254, 22, 87, 140, 255, 0, 232, 99, 191, 255, 0, 191, 149, 203, 81, 64, 29, 79, 252, 44, 175, 25, 255, 0, 208, 199, 127, 255, 0, 127, 40, 255, 0, 133, 149, 227, 63, 250, 24, 239, 255, 0, 239, 229, 114, 212, 80, 7, 83, 255, 0, 11, 43, 198, 127, 244, 49, 223, 255, 0, 223, 202, 63, 225, 101, 120, 207, 254, 134, 59, 255, 0, 251, 249, 92, 181, 20, 1, 212, 255, 0, 194, 202, 241, 159, 253, 12, 119, 255, 0, 247, 242, 189, 183, 225, 151, 136, 181, 141, 83, 193, 209, 220, 223, 234, 83, 220, 77, 231, 72, 11, 49, 201, 198, 107, 230, 154, 250, 11, 225, 23, 252, 136, 145, 255, 0, 215, 196, 159, 206, 128, 61, 19, 251, 78, 247, 254, 126, 164, 163, 251, 78, 247, 254, 126, 164, 170, 180, 80, 5, 175, 237, 59, 223, 249, 250, 146, 143, 237, 59, 223, 249, 250, 146, 170, 209, 64, 22, 191, 180, 239, 127, 231, 234, 74, 243, 191, 139, 126, 40, 215, 116, 125, 43, 78, 125, 63, 84, 184, 182, 121, 39, 112, 198, 54, 198, 70, 43, 186, 175, 45, 248, 219, 255, 0, 32, 125, 47, 254, 187, 183, 254, 131, 64, 30, 125, 255, 0, 11, 39, 198, 95, 244, 49, 95, 255, 0, 223, 202, 63, 225, 100, 248, 203, 254, 134, 43, 255, 0, 251, 249, 92, 181, 20, 0, 249, 36, 121, 101, 105, 29, 139, 51, 29, 196, 158, 230, 153, 69, 20, 0, 81, 69, 20, 0, 87, 210, 122, 95, 130, 252, 51, 46, 147, 103, 44, 154, 53, 187, 72, 240, 70, 88, 227, 169, 192, 175, 155, 43, 235, 13, 39, 254, 64, 246, 31, 245, 239, 31, 254, 130, 40, 3, 51, 254, 16, 143, 11, 255, 0, 208, 18, 215, 242, 163, 254, 16, 143, 11, 255, 0, 208, 18, 215, 242, 173, 250, 40, 3, 3, 254, 16, 143, 11, 255, 0, 208, 18, 215, 242, 163, 254, 16, 143, 11, 255, 0, 208, 18, 215, 242, 173, 250, 40, 3, 3, 254, 16, 143, 11, 127, 208, 18, 215, 242, 175, 19, 248, 155, 167, 89, 105, 126, 49, 146, 218, 198, 221, 109, 224, 16, 70, 66, 39, 76, 226, 190, 139, 175, 159, 126, 46, 127, 200, 245, 47, 253, 112, 143, 249, 80, 7, 11, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 7, 166, 252, 23, 181, 130, 95, 17, 221, 220, 201, 18, 52, 214, 177, 44, 144, 49, 254, 6, 207, 81, 94, 169, 168, 248, 135, 196, 86, 87, 143, 24, 212, 228, 242, 207, 42, 118, 14, 149, 229, 255, 0, 5, 63, 228, 49, 170, 127, 215, 186, 255, 0, 58, 246, 29, 70, 197, 111, 173, 124, 174, 227, 149, 62, 148, 1, 135, 255, 0, 9, 103, 136, 127, 232, 40, 255, 0, 247, 200, 163, 254, 18, 207, 16, 255, 0, 208, 81, 255, 0, 239, 145, 88, 239, 25, 70, 42, 220, 58, 158, 71, 165, 37, 0, 108, 255, 0, 194, 89, 226, 31, 250, 10, 63, 253, 242, 40, 255, 0, 132, 179, 196, 63, 244, 20, 127, 251, 228, 86, 53, 20, 1, 191, 107, 226, 173, 121, 175, 32, 89, 53, 54, 40, 101, 0, 141, 163, 145, 154, 185, 226, 15, 18, 107, 54, 218, 245, 245, 189, 190, 160, 201, 18, 62, 21, 118, 142, 5, 115, 86, 63, 241, 255, 0, 107, 255, 0, 93, 151, 249, 214, 143, 138, 191, 228, 105, 212, 63, 235, 175, 244, 160, 5, 255, 0, 132, 179, 196, 63, 244, 18, 147, 254, 249, 20, 127, 194, 89, 226, 31, 250, 9, 73, 255, 0, 124, 138, 199, 162, 144, 27, 63, 240, 150, 120, 131, 254, 130, 114, 127, 223, 34, 143, 248, 75, 60, 65, 255, 0, 65, 57, 63, 239, 145, 88, 212, 80, 6, 199, 252, 37, 158, 33, 255, 0, 160, 148, 159, 247, 200, 163, 254, 18, 207, 16, 255, 0, 208, 74, 79, 251, 228, 86, 61, 20, 1, 179, 255, 0, 9, 103, 136, 63, 232, 39, 39, 253, 242, 40, 255, 0, 132, 179, 196, 31, 244, 19, 147, 254, 249, 21, 141, 69, 0, 116, 22, 190, 42, 215, 100, 188, 129, 95, 83, 98, 134, 80, 8, 218, 61, 106, 167, 138, 255, 0, 228, 107, 212, 63, 235, 175, 244, 21, 66, 199, 254, 66, 22, 191, 245, 213, 127, 157, 104, 120, 175, 254, 70, 157, 67, 254, 186, 255, 0, 65, 92, 24, 255, 0, 225, 163, 42, 255, 0, 9, 141, 69, 20, 87, 148, 114, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 22, 44, 127, 228, 33, 107, 255, 0, 93, 87, 249, 215, 75, 226, 31, 18, 235, 118, 154, 245, 245, 189, 190, 160, 201, 18, 75, 133, 93, 163, 138, 230, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 151, 138, 191, 228, 103, 212, 63, 235, 173, 122, 153, 126, 204, 222, 143, 81, 223, 240, 150, 248, 135, 254, 130, 109, 255, 0, 124, 138, 63, 225, 45, 241, 15, 253, 4, 219, 254, 249, 21, 141, 69, 122, 39, 65, 179, 255, 0, 9, 111, 136, 127, 232, 38, 223, 247, 200, 163, 254, 18, 223, 16, 255, 0, 208, 77, 191, 239, 145, 88, 212, 80, 6, 207, 252, 37, 190, 33, 255, 0, 160, 155, 127, 223, 34, 143, 248, 75, 124, 67, 255, 0, 65, 54, 255, 0, 190, 69, 99, 81, 64, 27, 63, 240, 150, 248, 135, 254, 130, 109, 255, 0, 124, 138, 105, 241, 103, 136, 15, 252, 196, 228, 252, 20, 86, 69, 20, 1, 234, 222, 30, 241, 29, 183, 136, 116, 243, 107, 117, 176, 79, 183, 203, 150, 51, 252, 96, 241, 197, 87, 255, 0, 133, 85, 224, 95, 250, 22, 108, 255, 0, 35, 254, 53, 231, 58, 115, 188, 26, 157, 171, 163, 21, 34, 101, 193, 7, 222, 189, 114, 219, 196, 118, 147, 107, 55, 90, 116, 164, 71, 60, 44, 85, 115, 209, 133, 0, 100, 127, 194, 170, 240, 47, 253, 11, 86, 127, 145, 255, 0, 26, 63, 225, 85, 120, 23, 254, 133, 171, 63, 200, 255, 0, 141, 118, 84, 80, 7, 27, 255, 0, 10, 171, 192, 191, 244, 45, 89, 254, 71, 252, 104, 255, 0, 133, 85, 224, 95, 250, 22, 172, 255, 0, 35, 254, 53, 217, 81, 64, 28, 111, 252, 42, 175, 2, 255, 0, 208, 181, 103, 249, 31, 241, 163, 254, 21, 87, 129, 127, 232, 90, 179, 252, 143, 248, 215, 101, 69, 0, 113, 191, 240, 170, 188, 11, 255, 0, 66, 213, 159, 228, 127, 198, 143, 248, 85, 94, 5, 255, 0, 161, 106, 207, 242, 63, 227, 93, 149, 20, 1, 200, 199, 240, 195, 193, 80, 76, 147, 69, 225, 203, 69, 146, 54, 12, 164, 3, 193, 29, 59, 212, 183, 255, 0, 14, 252, 35, 171, 95, 77, 125, 127, 161, 91, 79, 117, 57, 221, 36, 143, 156, 177, 252, 235, 169, 162, 128, 56, 239, 248, 85, 94, 5, 255, 0, 161, 102, 207, 242, 63, 227, 71, 252, 42, 175, 2, 255, 0, 208, 179, 103, 249, 31, 241, 174, 198, 138, 0, 227, 191, 225, 85, 120, 23, 254, 133, 155, 63, 200, 255, 0, 141, 31, 240, 170, 188, 11, 255, 0, 66, 205, 159, 228, 127, 198, 187, 26, 40, 3, 142, 255, 0, 133, 85, 224, 95, 250, 22, 108, 255, 0, 35, 254, 52, 127, 194, 170, 240, 47, 253, 11, 54, 127, 145, 255, 0, 26, 236, 104, 160, 14, 59, 254, 21, 87, 129, 127, 232, 89, 179, 252, 143, 248, 209, 255, 0, 10, 171, 192, 191, 244, 44, 217, 254, 71, 252, 107, 177, 162, 128, 56, 239, 248, 85, 126, 5, 255, 0, 161, 102, 207, 245, 255, 0, 26, 189, 127, 127, 166, 120, 55, 69, 138, 214, 210, 40, 227, 72, 215, 203, 183, 182, 94, 223, 253, 106, 159, 90, 241, 29, 166, 149, 36, 112, 100, 73, 114, 236, 20, 70, 15, 191, 122, 243, 79, 22, 59, 191, 138, 47, 247, 177, 109, 175, 129, 158, 194, 128, 6, 241, 110, 188, 93, 153, 117, 22, 85, 39, 33, 112, 56, 165, 255, 0, 132, 179, 196, 63, 244, 20, 111, 251, 228, 86, 53, 20, 1, 181, 255, 0, 9, 119, 136, 127, 232, 38, 255, 0, 247, 200, 163, 254, 18, 239, 16, 255, 0, 208, 77, 255, 0, 239, 145, 88, 180, 80, 6, 215, 252, 37, 222, 33, 255, 0, 160, 155, 255, 0, 223, 34, 143, 248, 75, 188, 67, 255, 0, 65, 55, 255, 0, 190, 69, 98, 209, 64, 27, 95, 240, 151, 120, 135, 254, 130, 111, 255, 0, 124, 138, 63, 225, 46, 241, 15, 253, 4, 223, 254, 249, 21, 139, 69, 0, 111, 218, 248, 171, 94, 107, 200, 22, 77, 77, 138, 23, 0, 141, 163, 158, 107, 202, 252, 119, 226, 141, 115, 195, 223, 18, 188, 75, 22, 145, 170, 92, 217, 164, 151, 123, 157, 98, 108, 110, 56, 21, 221, 216, 255, 0, 200, 66, 215, 254, 186, 175, 243, 175, 43, 248, 167, 255, 0, 37, 63, 196, 31, 245, 246, 127, 144, 160, 8, 127, 225, 100, 248, 207, 254, 134, 59, 255, 0, 251, 249, 71, 252, 44, 159, 25, 255, 0, 208, 199, 127, 255, 0, 127, 43, 150, 162, 128, 58, 159, 248, 89, 62, 51, 255, 0, 161, 142, 255, 0, 254, 254, 87, 83, 240, 239, 199, 126, 41, 212, 254, 33, 104, 150, 87, 186, 229, 220, 246, 211, 92, 133, 120, 221, 248, 97, 131, 94, 91, 93, 119, 194, 207, 249, 41, 254, 31, 255, 0, 175, 177, 252, 141, 0, 116, 63, 31, 63, 228, 168, 92, 127, 215, 172, 63, 202, 188, 194, 189, 63, 227, 231, 252, 149, 11, 143, 250, 245, 135, 249, 87, 152, 80, 1, 69, 20, 80, 5, 253, 11, 254, 70, 13, 51, 254, 190, 226, 255, 0, 208, 197, 125, 11, 226, 175, 249, 25, 245, 15, 250, 235, 95, 61, 104, 95, 242, 48, 105, 159, 245, 247, 23, 254, 134, 43, 232, 95, 21, 127, 200, 207, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 219, 127, 215, 85, 254, 117, 163, 226, 146, 71, 138, 175, 202, 146, 8, 155, 32, 250, 116, 172, 251, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 26, 117, 15, 250, 235, 64, 29, 7, 135, 252, 116, 208, 17, 107, 170, 101, 211, 180, 221, 197, 122, 20, 23, 16, 93, 68, 36, 130, 69, 117, 235, 193, 205, 120, 53, 104, 105, 122, 229, 254, 145, 41, 107, 89, 155, 103, 241, 71, 158, 13, 0, 123, 125, 21, 200, 105, 30, 60, 177, 190, 219, 29, 224, 251, 60, 164, 241, 233, 93, 92, 114, 164, 209, 230, 39, 87, 30, 170, 115, 64, 18, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 76, 121, 22, 52, 220, 236, 20, 122, 177, 197, 115, 122, 191, 141, 180, 237, 59, 114, 64, 222, 124, 253, 128, 251, 191, 157, 0, 116, 114, 74, 145, 33, 119, 112, 136, 59, 147, 129, 92, 63, 136, 188, 116, 144, 230, 219, 75, 229, 240, 65, 151, 251, 191, 74, 228, 245, 175, 18, 106, 26, 217, 62, 108, 165, 34, 255, 0, 158, 42, 120, 172, 138, 0, 181, 109, 44, 179, 234, 150, 242, 206, 229, 229, 121, 148, 150, 61, 249, 171, 190, 43, 255, 0, 145, 167, 80, 255, 0, 174, 191, 210, 179, 172, 127, 227, 254, 215, 254, 187, 47, 243, 173, 31, 21, 255, 0, 200, 211, 168, 127, 215, 95, 233, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 79, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 181, 124, 73, 255, 0, 35, 37, 247, 253, 117, 254, 149, 149, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 181, 124, 73, 255, 0, 35, 37, 247, 253, 117, 254, 149, 112, 220, 249, 222, 35, 255, 0, 119, 143, 175, 232, 204, 170, 40, 162, 180, 62, 52, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 203, 254, 63, 173, 191, 235, 170, 255, 0, 58, 181, 226, 191, 249, 26, 117, 15, 250, 235, 253, 42, 173, 151, 252, 127, 91, 127, 215, 85, 254, 117, 107, 197, 127, 242, 52, 234, 31, 245, 215, 250, 84, 72, 250, 222, 25, 248, 106, 252, 140, 138, 40, 162, 179, 62, 156, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 157, 67, 254, 187, 86, 117, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 58, 135, 253, 118, 160, 12, 138, 40, 162, 128, 10, 228, 124, 117, 174, 53, 133, 162, 216, 219, 190, 217, 230, 228, 145, 217, 127, 250, 245, 209, 106, 23, 208, 233, 186, 116, 183, 115, 127, 171, 140, 126, 126, 213, 227, 58, 133, 244, 218, 141, 236, 151, 51, 179, 51, 49, 239, 216, 122, 80, 5, 74, 40, 162, 128, 61, 75, 224, 151, 252, 134, 53, 79, 250, 247, 95, 253, 10, 189, 170, 188, 87, 224, 151, 252, 134, 53, 79, 250, 247, 95, 253, 10, 189, 170, 128, 10, 40, 162, 128, 10, 40, 162, 128, 57, 207, 31, 127, 200, 137, 172, 255, 0, 215, 185, 254, 117, 243, 53, 125, 51, 227, 239, 249, 17, 53, 159, 250, 247, 63, 206, 190, 102, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 15, 160, 62, 17, 127, 200, 139, 31, 253, 124, 73, 252, 235, 188, 174, 15, 225, 23, 252, 136, 177, 255, 0, 215, 196, 159, 206, 187, 202, 0, 40, 162, 138, 0, 40, 162, 138, 0, 242, 207, 141, 191, 242, 7, 210, 255, 0, 235, 225, 191, 244, 26, 241, 106, 246, 159, 141, 191, 242, 7, 210, 255, 0, 235, 225, 191, 244, 26, 241, 106, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 250, 195, 74, 255, 0, 144, 61, 143, 253, 123, 199, 252, 133, 92, 170, 122, 87, 252, 129, 236, 127, 235, 222, 63, 228, 42, 229, 0, 20, 81, 69, 0, 20, 81, 69, 0, 124, 251, 241, 119, 254, 71, 185, 63, 235, 222, 47, 229, 92, 45, 119, 95, 23, 127, 228, 123, 147, 254, 189, 226, 254, 85, 194, 208, 1, 69, 20, 80, 1, 69, 20, 80, 1, 93, 39, 128, 191, 228, 123, 209, 191, 235, 224, 127, 42, 230, 235, 164, 240, 23, 252, 143, 122, 55, 253, 124, 15, 229, 64, 31, 76, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 242, 126, 175, 255, 0, 33, 155, 239, 250, 248, 147, 255, 0, 66, 53, 78, 174, 106, 255, 0, 242, 25, 190, 255, 0, 175, 137, 63, 244, 35, 84, 232, 0, 162, 138, 40, 0, 162, 138, 40, 0, 175, 79, 248, 43, 255, 0, 33, 189, 67, 254, 184, 175, 243, 53, 230, 21, 233, 255, 0, 5, 127, 228, 55, 168, 127, 215, 21, 254, 102, 128, 61, 182, 138, 40, 160, 2, 138, 40, 160, 2, 185, 191, 30, 255, 0, 200, 137, 172, 255, 0, 215, 191, 245, 21, 210, 87, 55, 227, 223, 249, 17, 53, 159, 250, 247, 254, 162, 128, 62, 103, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 175, 160, 190, 17, 127, 200, 137, 23, 253, 119, 147, 249, 215, 207, 181, 244, 23, 194, 47, 249, 17, 34, 255, 0, 174, 242, 127, 58, 0, 238, 168, 162, 138, 0, 40, 162, 138, 0, 43, 203, 254, 53, 127, 200, 19, 79, 255, 0, 174, 199, 249, 10, 245, 10, 242, 255, 0, 141, 95, 242, 4, 211, 255, 0, 235, 177, 254, 66, 128, 60, 78, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 190, 176, 210, 127, 228, 15, 97, 255, 0, 94, 241, 255, 0, 232, 34, 190, 79, 175, 172, 52, 159, 249, 3, 216, 127, 215, 188, 127, 250, 8, 160, 11, 148, 81, 69, 0, 20, 81, 69, 0, 21, 243, 247, 197, 207, 249, 30, 166, 255, 0, 174, 17, 215, 208, 53, 243, 247, 197, 207, 249, 30, 166, 255, 0, 174, 17, 208, 7, 9, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 7, 169, 124, 19, 255, 0, 144, 198, 169, 255, 0, 94, 235, 252, 235, 218, 171, 197, 126, 9, 255, 0, 200, 99, 84, 255, 0, 175, 117, 254, 117, 237, 84, 1, 129, 175, 216, 244, 187, 136, 123, 73, 143, 231, 92, 253, 119, 178, 70, 178, 198, 81, 198, 81, 134, 8, 174, 46, 254, 204, 217, 93, 201, 17, 233, 213, 79, 168, 160, 10, 212, 81, 69, 0, 79, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 78, 161, 255, 0, 93, 191, 165, 103, 216, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 15, 21, 127, 200, 211, 168, 127, 215, 111, 233, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 175, 248, 175, 254, 70, 141, 67, 254, 186, 255, 0, 65, 84, 44, 127, 228, 35, 107, 255, 0, 93, 87, 249, 213, 255, 0, 21, 255, 0, 200, 209, 168, 127, 215, 95, 232, 43, 135, 48, 248, 17, 133, 127, 132, 199, 162, 138, 43, 200, 57, 194, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 11, 22, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 75, 197, 95, 242, 51, 234, 31, 245, 214, 179, 108, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 151, 138, 191, 228, 103, 212, 63, 235, 173, 122, 153, 126, 204, 222, 143, 83, 34, 138, 40, 175, 68, 232, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 126, 41, 36, 120, 166, 252, 171, 16, 68, 185, 7, 210, 179, 44, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 173, 0, 116, 62, 31, 241, 212, 144, 17, 107, 169, 146, 241, 246, 155, 189, 122, 12, 23, 80, 93, 66, 36, 130, 69, 116, 35, 60, 26, 240, 106, 208, 210, 245, 203, 237, 30, 82, 109, 102, 111, 47, 248, 163, 207, 13, 64, 30, 223, 69, 114, 26, 63, 142, 236, 111, 182, 69, 120, 62, 207, 49, 237, 252, 53, 213, 199, 42, 76, 155, 226, 117, 113, 234, 167, 52, 1, 37, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 199, 145, 99, 77, 206, 193, 71, 171, 28, 87, 55, 171, 248, 219, 78, 211, 119, 71, 11, 121, 247, 3, 162, 143, 187, 249, 208, 7, 73, 44, 145, 198, 155, 228, 112, 136, 59, 147, 138, 225, 188, 69, 227, 164, 139, 54, 218, 95, 205, 39, 32, 203, 232, 125, 171, 147, 214, 188, 75, 168, 107, 100, 249, 143, 178, 47, 249, 226, 167, 138, 200, 160, 11, 80, 75, 44, 250, 180, 50, 204, 229, 229, 105, 148, 146, 79, 94, 106, 239, 138, 191, 228, 103, 212, 63, 235, 173, 103, 88, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 31, 21, 127, 200, 207, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 123, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 229, 95, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 21, 234, 182, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 202, 190, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 40, 3, 144, 162, 138, 40, 0, 174, 187, 225, 103, 252, 148, 255, 0, 15, 255, 0, 215, 216, 254, 70, 185, 26, 235, 190, 22, 127, 201, 79, 240, 255, 0, 253, 125, 143, 228, 104, 3, 161, 248, 249, 255, 0, 37, 66, 227, 254, 189, 97, 254, 85, 230, 21, 233, 255, 0, 31, 63, 228, 168, 92, 127, 215, 172, 63, 202, 188, 194, 128, 10, 40, 162, 128, 47, 232, 95, 242, 48, 105, 159, 245, 247, 23, 254, 134, 43, 232, 95, 21, 127, 200, 207, 168, 127, 215, 90, 249, 235, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 95, 66, 248, 171, 254, 70, 125, 67, 254, 186, 208, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 211, 168, 127, 215, 83, 89, 246, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 67, 197, 95, 242, 52, 234, 31, 245, 212, 208, 6, 69, 20, 81, 64, 13, 171, 246, 26, 198, 161, 166, 31, 244, 91, 169, 16, 122, 103, 131, 84, 168, 160, 14, 230, 195, 226, 52, 200, 2, 222, 91, 6, 245, 96, 121, 174, 142, 203, 198, 186, 61, 222, 23, 205, 40, 223, 237, 10, 242, 58, 40, 3, 221, 163, 190, 179, 147, 152, 238, 161, 32, 250, 48, 169, 132, 136, 221, 28, 31, 161, 175, 2, 86, 104, 190, 227, 21, 252, 106, 228, 58, 182, 163, 31, 250, 155, 185, 87, 241, 160, 15, 116, 162, 188, 106, 199, 196, 122, 207, 219, 32, 143, 251, 70, 92, 52, 170, 8, 246, 205, 95, 241, 38, 191, 171, 193, 226, 11, 203, 120, 111, 164, 72, 146, 92, 42, 142, 212, 1, 234, 101, 148, 117, 96, 62, 166, 162, 123, 203, 88, 190, 245, 204, 43, 245, 113, 94, 43, 38, 181, 169, 191, 223, 189, 148, 254, 53, 82, 73, 158, 95, 191, 43, 55, 212, 208, 7, 175, 94, 120, 199, 71, 178, 63, 61, 193, 99, 255, 0, 76, 198, 107, 157, 189, 248, 143, 212, 89, 218, 130, 59, 51, 87, 159, 209, 64, 26, 154, 134, 191, 169, 234, 71, 109, 197, 203, 24, 255, 0, 186, 15, 21, 151, 78, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 133, 175, 253, 118, 95, 231, 90, 30, 43, 255, 0, 145, 167, 80, 255, 0, 174, 191, 210, 179, 236, 127, 228, 33, 107, 255, 0, 93, 151, 249, 214, 135, 138, 255, 0, 228, 105, 212, 63, 235, 175, 244, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 190, 36, 255, 0, 145, 146, 251, 254, 186, 255, 0, 74, 202, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 190, 36, 255, 0, 145, 146, 251, 254, 186, 255, 0, 74, 184, 110, 124, 239, 17, 255, 0, 187, 199, 215, 244, 102, 85, 20, 81, 90, 31, 26, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 101, 255, 0, 31, 214, 223, 245, 213, 127, 157, 90, 241, 95, 252, 141, 26, 135, 253, 117, 254, 149, 86, 203, 254, 63, 173, 191, 235, 170, 255, 0, 58, 181, 226, 191, 249, 26, 53, 15, 250, 235, 253, 42, 36, 125, 111, 12, 252, 53, 126, 70, 69, 20, 81, 89, 159, 78, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 97, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 171, 58, 195, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 157, 67, 254, 187, 80, 6, 69, 20, 86, 47, 136, 117, 149, 209, 180, 169, 36, 207, 239, 88, 98, 17, 239, 64, 28, 119, 142, 245, 179, 115, 120, 52, 235, 121, 115, 4, 92, 190, 58, 22, 174, 54, 148, 177, 102, 36, 156, 146, 114, 105, 40, 0, 162, 138, 40, 3, 212, 190, 9, 127, 200, 99, 84, 255, 0, 175, 117, 255, 0, 208, 171, 218, 171, 197, 126, 9, 127, 200, 99, 84, 255, 0, 175, 117, 255, 0, 208, 171, 218, 168, 0, 162, 138, 40, 0, 162, 138, 40, 3, 156, 241, 247, 252, 136, 154, 207, 253, 123, 159, 231, 95, 51, 87, 211, 62, 62, 255, 0, 145, 19, 89, 255, 0, 175, 115, 252, 235, 230, 106, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 250, 3, 225, 23, 252, 136, 177, 255, 0, 215, 196, 159, 206, 187, 202, 224, 254, 17, 127, 200, 139, 31, 253, 124, 73, 252, 235, 188, 160, 2, 138, 40, 160, 2, 138, 40, 160, 15, 44, 248, 219, 255, 0, 32, 125, 47, 254, 190, 27, 255, 0, 65, 175, 22, 175, 105, 248, 219, 255, 0, 32, 125, 47, 254, 190, 27, 255, 0, 65, 175, 22, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 15, 172, 52, 175, 249, 3, 216, 255, 0, 215, 188, 127, 200, 85, 202, 167, 165, 127, 200, 30, 199, 254, 189, 227, 254, 66, 174, 80, 1, 69, 20, 80, 1, 69, 20, 80, 7, 207, 191, 23, 127, 228, 123, 147, 254, 189, 226, 254, 85, 194, 215, 117, 241, 119, 254, 71, 185, 63, 235, 222, 47, 229, 92, 45, 0, 20, 81, 69, 0, 20, 81, 69, 0, 21, 210, 120, 11, 254, 71, 189, 27, 254, 190, 7, 242, 174, 110, 186, 79, 1, 127, 200, 247, 163, 127, 215, 192, 254, 84, 1, 244, 197, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 31, 39, 234, 255, 0, 242, 25, 190, 255, 0, 175, 137, 63, 244, 35, 84, 234, 230, 175, 255, 0, 33, 155, 239, 250, 248, 147, 255, 0, 66, 53, 78, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 245, 47, 130, 95, 242, 24, 213, 63, 235, 221, 127, 244, 42, 242, 218, 245, 47, 130, 95, 242, 24, 213, 63, 235, 221, 127, 244, 42, 0, 246, 170, 40, 162, 128, 10, 40, 162, 128, 10, 230, 252, 123, 255, 0, 34, 38, 179, 255, 0, 94, 255, 0, 212, 87, 73, 92, 223, 143, 127, 228, 68, 214, 127, 235, 223, 250, 138, 0, 249, 158, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 190, 130, 248, 69, 255, 0, 34, 36, 95, 245, 222, 79, 231, 95, 62, 215, 208, 95, 8, 191, 228, 68, 139, 254, 187, 201, 252, 232, 3, 186, 162, 138, 40, 0, 162, 138, 40, 0, 175, 45, 248, 219, 255, 0, 32, 109, 43, 254, 187, 183, 254, 131, 94, 165, 94, 91, 241, 183, 254, 64, 218, 87, 253, 119, 111, 253, 6, 128, 60, 86, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 190, 176, 210, 127, 228, 15, 97, 255, 0, 94, 241, 255, 0, 232, 34, 190, 79, 175, 172, 52, 159, 249, 3, 216, 127, 215, 188, 127, 250, 8, 160, 11, 148, 81, 69, 0, 20, 81, 69, 0, 21, 243, 247, 197, 207, 249, 30, 166, 255, 0, 174, 17, 215, 208, 53, 243, 247, 197, 207, 249, 30, 166, 255, 0, 174, 17, 208, 7, 9, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 7, 169, 124, 19, 255, 0, 144, 198, 169, 255, 0, 94, 235, 252, 235, 218, 171, 197, 126, 9, 255, 0, 200, 99, 84, 255, 0, 175, 117, 254, 117, 237, 84, 0, 86, 102, 179, 99, 246, 171, 66, 232, 185, 149, 57, 30, 254, 213, 167, 69, 0, 112, 52, 149, 169, 173, 216, 181, 181, 209, 144, 15, 221, 57, 207, 208, 214, 93, 0, 79, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 78, 161, 255, 0, 93, 191, 165, 103, 216, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 15, 21, 127, 200, 211, 168, 127, 215, 111, 233, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 175, 248, 175, 254, 70, 141, 67, 254, 186, 255, 0, 65, 84, 44, 127, 228, 35, 107, 255, 0, 93, 87, 249, 213, 255, 0, 21, 255, 0, 200, 209, 168, 127, 215, 95, 232, 43, 135, 48, 248, 17, 133, 127, 132, 199, 162, 138, 43, 200, 57, 194, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 11, 22, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 75, 197, 95, 242, 51, 234, 31, 245, 214, 179, 108, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 151, 138, 191, 228, 103, 212, 63, 235, 173, 122, 153, 126, 204, 222, 143, 83, 34, 138, 40, 175, 68, 232, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 176, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 157, 97, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 174, 216, 107, 58, 134, 152, 127, 209, 110, 164, 65, 253, 220, 240, 106, 149, 20, 1, 220, 216, 124, 69, 157, 0, 91, 203, 101, 111, 86, 7, 154, 232, 236, 188, 109, 163, 221, 224, 121, 204, 140, 127, 188, 43, 200, 232, 160, 15, 118, 75, 235, 73, 121, 75, 168, 72, 62, 146, 10, 152, 72, 141, 247, 93, 79, 227, 94, 4, 178, 52, 95, 113, 138, 254, 53, 114, 29, 95, 81, 79, 245, 87, 146, 175, 227, 64, 30, 233, 69, 120, 213, 143, 136, 245, 159, 182, 65, 31, 246, 140, 184, 105, 84, 31, 166, 106, 255, 0, 137, 53, 253, 94, 15, 16, 94, 91, 195, 125, 34, 68, 146, 225, 84, 118, 160, 15, 83, 44, 163, 171, 1, 245, 53, 19, 222, 90, 197, 247, 174, 97, 95, 171, 138, 241, 89, 53, 173, 77, 254, 253, 236, 167, 241, 170, 146, 76, 242, 253, 249, 89, 190, 166, 128, 61, 122, 243, 198, 58, 61, 145, 249, 238, 11, 31, 250, 102, 51, 92, 237, 247, 196, 127, 188, 44, 109, 65, 29, 153, 171, 207, 233, 212, 1, 169, 169, 107, 250, 158, 164, 74, 220, 92, 177, 143, 251, 160, 241, 89, 52, 234, 40, 0, 162, 138, 40, 2, 123, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 25, 245, 15, 250, 235, 89, 246, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 67, 197, 95, 242, 51, 234, 31, 245, 214, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 22, 191, 245, 213, 127, 157, 121, 87, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 122, 173, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 242, 175, 138, 127, 242, 83, 252, 65, 255, 0, 95, 103, 249, 10, 0, 228, 40, 162, 138, 0, 43, 174, 248, 89, 255, 0, 37, 63, 195, 255, 0, 245, 246, 63, 145, 174, 70, 186, 239, 133, 159, 242, 83, 252, 63, 255, 0, 95, 99, 249, 26, 0, 232, 126, 62, 127, 201, 80, 184, 255, 0, 175, 88, 127, 149, 121, 133, 122, 127, 199, 207, 249, 42, 23, 31, 245, 235, 15, 242, 175, 48, 160, 2, 138, 40, 160, 11, 250, 23, 252, 140, 26, 103, 253, 125, 197, 255, 0, 161, 138, 250, 23, 197, 95, 242, 51, 234, 31, 245, 214, 190, 122, 208, 191, 228, 96, 211, 63, 235, 238, 47, 253, 12, 87, 208, 190, 42, 255, 0, 145, 159, 80, 255, 0, 174, 180, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 246, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 75, 197, 95, 242, 52, 223, 255, 0, 215, 83, 89, 182, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 75, 197, 95, 242, 52, 223, 255, 0, 215, 83, 64, 24, 212, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 107, 58, 199, 254, 66, 22, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 157, 67, 254, 186, 208, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 66, 215, 254, 187, 47, 243, 173, 15, 21, 255, 0, 200, 211, 168, 127, 215, 95, 233, 89, 246, 63, 242, 16, 181, 255, 0, 174, 203, 252, 235, 67, 197, 127, 242, 52, 234, 31, 245, 215, 250, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 95, 18, 127, 200, 201, 125, 255, 0, 93, 127, 165, 101, 88, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 95, 18, 127, 200, 201, 125, 255, 0, 93, 127, 165, 92, 55, 62, 119, 136, 255, 0, 221, 227, 235, 250, 51, 42, 138, 40, 173, 15, 141, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 178, 255, 0, 143, 235, 111, 250, 234, 191, 206, 173, 120, 175, 254, 70, 141, 67, 254, 186, 255, 0, 74, 171, 101, 255, 0, 31, 214, 223, 245, 213, 127, 157, 90, 241, 95, 252, 141, 26, 135, 253, 117, 254, 149, 18, 62, 183, 134, 126, 26, 191, 35, 34, 138, 40, 172, 207, 167, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 167, 80, 255, 0, 174, 213, 157, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 168, 3, 26, 188, 159, 198, 90, 183, 246, 150, 176, 209, 33, 253, 205, 191, 200, 190, 231, 185, 174, 231, 197, 154, 224, 209, 244, 204, 69, 131, 60, 191, 42, 131, 252, 235, 200, 201, 44, 73, 39, 36, 208, 1, 69, 20, 80, 1, 69, 20, 80, 7, 169, 124, 18, 255, 0, 144, 198, 169, 255, 0, 94, 235, 255, 0, 161, 87, 181, 87, 138, 252, 18, 255, 0, 144, 198, 169, 255, 0, 94, 235, 255, 0, 161, 87, 181, 80, 1, 69, 20, 80, 1, 69, 20, 80, 7, 57, 227, 239, 249, 17, 53, 159, 250, 247, 63, 206, 190, 102, 175, 166, 124, 125, 255, 0, 34, 38, 179, 255, 0, 94, 231, 249, 215, 204, 212, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 244, 7, 194, 47, 249, 17, 99, 255, 0, 175, 137, 63, 157, 119, 149, 193, 252, 34, 255, 0, 145, 22, 63, 250, 248, 147, 249, 215, 121, 64, 5, 20, 81, 64, 5, 20, 81, 64, 30, 89, 241, 183, 254, 64, 250, 95, 253, 124, 55, 254, 131, 94, 45, 94, 211, 241, 183, 254, 64, 250, 95, 253, 124, 55, 254, 131, 94, 45, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 31, 88, 105, 95, 242, 7, 177, 255, 0, 175, 120, 255, 0, 144, 171, 149, 79, 74, 255, 0, 144, 61, 143, 253, 123, 199, 252, 133, 92, 160, 2, 138, 40, 160, 2, 138, 40, 160, 15, 159, 126, 46, 255, 0, 200, 247, 39, 253, 123, 197, 252, 171, 133, 174, 235, 226, 239, 252, 143, 114, 127, 215, 188, 95, 202, 184, 90, 0, 40, 162, 138, 0, 40, 162, 138, 0, 43, 164, 240, 23, 252, 143, 122, 55, 253, 124, 15, 229, 92, 221, 116, 158, 2, 255, 0, 145, 239, 70, 255, 0, 175, 129, 252, 168, 3, 233, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 62, 79, 213, 255, 0, 228, 51, 125, 255, 0, 95, 18, 127, 232, 70, 169, 213, 205, 95, 254, 67, 55, 223, 245, 241, 39, 254, 132, 106, 157, 0, 20, 81, 69, 0, 20, 81, 69, 0, 21, 234, 95, 4, 191, 228, 49, 170, 127, 215, 186, 255, 0, 232, 85, 229, 181, 234, 95, 4, 191, 228, 49, 170, 127, 215, 186, 255, 0, 232, 84, 1, 237, 84, 81, 69, 0, 20, 81, 69, 0, 21, 205, 248, 247, 254, 68, 77, 103, 254, 189, 255, 0, 168, 174, 146, 185, 191, 30, 255, 0, 200, 137, 172, 255, 0, 215, 191, 245, 20, 1, 243, 61, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 125, 5, 240, 139, 254, 68, 72, 191, 235, 188, 159, 206, 190, 125, 175, 160, 190, 17, 127, 200, 137, 23, 253, 119, 147, 249, 208, 7, 117, 69, 20, 80, 1, 69, 20, 80, 1, 94, 91, 241, 183, 254, 64, 218, 87, 253, 119, 111, 253, 6, 189, 74, 188, 183, 227, 111, 252, 129, 180, 175, 250, 238, 223, 250, 13, 0, 120, 173, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 125, 97, 164, 255, 0, 200, 30, 195, 254, 189, 227, 255, 0, 208, 69, 124, 159, 95, 88, 105, 63, 242, 7, 176, 255, 0, 175, 120, 255, 0, 244, 17, 64, 23, 40, 162, 138, 0, 40, 162, 138, 0, 43, 231, 239, 139, 159, 242, 61, 77, 255, 0, 92, 35, 175, 160, 107, 231, 239, 139, 159, 242, 61, 77, 255, 0, 92, 35, 160, 14, 18, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 15, 82, 248, 39, 255, 0, 33, 141, 83, 254, 189, 215, 249, 215, 181, 87, 138, 252, 19, 255, 0, 144, 198, 169, 255, 0, 94, 235, 252, 235, 218, 168, 0, 162, 138, 40, 2, 174, 163, 109, 246, 203, 41, 34, 254, 62, 163, 235, 92, 91, 13, 140, 84, 245, 28, 87, 125, 92, 182, 187, 97, 228, 77, 246, 133, 251, 142, 121, 246, 160, 10, 22, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 67, 197, 95, 242, 52, 234, 31, 245, 219, 250, 86, 117, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 58, 135, 253, 118, 254, 148, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 234, 255, 0, 138, 255, 0, 228, 104, 212, 63, 235, 175, 244, 21, 66, 199, 254, 66, 54, 191, 245, 213, 127, 157, 95, 241, 95, 252, 141, 26, 135, 253, 117, 254, 130, 184, 115, 15, 129, 24, 87, 248, 76, 122, 40, 162, 188, 131, 156, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 177, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 188, 85, 255, 0, 35, 62, 161, 255, 0, 93, 107, 54, 199, 254, 66, 22, 191, 245, 213, 127, 157, 105, 120, 171, 254, 70, 125, 67, 254, 186, 215, 169, 151, 236, 205, 232, 245, 50, 40, 162, 138, 244, 78, 128, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 235, 89, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 214, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 157, 67, 254, 187, 86, 117, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 58, 135, 253, 118, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 166, 255, 0, 254, 186, 214, 125, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 141, 55, 255, 0, 245, 214, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 22, 191, 245, 213, 127, 157, 121, 87, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 122, 173, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 242, 175, 138, 127, 242, 83, 252, 65, 255, 0, 95, 103, 249, 10, 0, 228, 40, 162, 138, 0, 43, 174, 248, 89, 255, 0, 37, 63, 195, 255, 0, 245, 246, 63, 145, 174, 70, 186, 239, 133, 159, 242, 83, 252, 63, 255, 0, 95, 99, 249, 26, 0, 232, 126, 62, 127, 201, 80, 184, 255, 0, 175, 88, 127, 149, 121, 133, 122, 119, 199, 207, 249, 42, 23, 31, 245, 235, 15, 242, 175, 49, 160, 2, 138, 40, 160, 11, 250, 23, 252, 140, 26, 103, 253, 125, 197, 255, 0, 161, 138, 250, 23, 197, 95, 242, 51, 234, 31, 245, 214, 190, 122, 208, 191, 228, 96, 211, 63, 235, 238, 47, 253, 12, 87, 208, 158, 43, 32, 120, 167, 80, 228, 127, 173, 160, 12, 154, 41, 187, 151, 251, 226, 141, 203, 253, 241, 64, 14, 162, 155, 185, 127, 190, 40, 220, 191, 223, 20, 0, 234, 41, 187, 151, 251, 226, 141, 203, 253, 241, 64, 14, 162, 155, 185, 127, 190, 40, 220, 191, 223, 20, 1, 102, 199, 254, 66, 54, 223, 245, 213, 127, 157, 104, 120, 168, 127, 197, 83, 168, 127, 215, 83, 89, 182, 36, 127, 104, 219, 124, 195, 253, 106, 255, 0, 58, 209, 241, 89, 31, 240, 148, 95, 242, 63, 214, 208, 6, 77, 20, 221, 203, 234, 40, 220, 190, 162, 128, 29, 69, 55, 114, 250, 138, 55, 47, 168, 160, 7, 81, 77, 220, 190, 162, 141, 203, 234, 40, 1, 212, 83, 119, 47, 168, 163, 114, 250, 138, 0, 177, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 107, 50, 192, 143, 237, 27, 95, 152, 127, 173, 95, 231, 90, 94, 43, 97, 255, 0, 9, 78, 161, 146, 63, 214, 208, 6, 77, 20, 221, 203, 253, 241, 70, 229, 254, 248, 160, 7, 81, 77, 220, 191, 223, 20, 110, 95, 239, 138, 0, 117, 20, 221, 203, 253, 241, 70, 229, 254, 248, 160, 7, 81, 77, 220, 191, 223, 20, 110, 95, 239, 138, 0, 177, 99, 255, 0, 31, 246, 191, 245, 217, 127, 157, 104, 248, 175, 254, 70, 157, 67, 254, 186, 255, 0, 74, 205, 176, 35, 251, 66, 215, 230, 31, 235, 151, 249, 214, 143, 138, 216, 127, 194, 83, 168, 114, 63, 214, 208, 6, 77, 20, 221, 203, 253, 241, 70, 229, 254, 248, 160, 7, 81, 77, 220, 191, 223, 20, 110, 95, 239, 138, 0, 117, 20, 221, 203, 253, 241, 70, 229, 254, 248, 160, 7, 81, 77, 220, 191, 223, 20, 110, 95, 239, 138, 0, 179, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 181, 124, 73, 255, 0, 35, 37, 247, 253, 117, 254, 149, 145, 98, 71, 246, 141, 183, 204, 63, 214, 175, 243, 173, 127, 18, 127, 200, 201, 125, 255, 0, 93, 127, 165, 92, 55, 62, 119, 136, 255, 0, 221, 227, 235, 250, 51, 42, 138, 40, 173, 15, 141, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 178, 255, 0, 143, 235, 111, 250, 234, 191, 206, 173, 120, 175, 254, 70, 141, 67, 254, 186, 255, 0, 74, 171, 101, 255, 0, 31, 214, 223, 245, 213, 127, 157, 89, 241, 91, 1, 226, 141, 67, 145, 254, 183, 252, 42, 36, 125, 111, 12, 252, 53, 126, 70, 77, 20, 221, 203, 253, 241, 70, 229, 254, 248, 172, 207, 167, 29, 69, 55, 114, 255, 0, 124, 81, 185, 127, 190, 40, 1, 212, 83, 119, 47, 247, 197, 27, 151, 251, 226, 128, 29, 69, 55, 114, 255, 0, 124, 81, 185, 127, 190, 40, 2, 197, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 89, 199, 137, 181, 34, 122, 9, 79, 242, 172, 203, 2, 63, 180, 109, 126, 97, 254, 181, 127, 157, 86, 248, 173, 168, 45, 133, 198, 179, 251, 205, 178, 200, 222, 90, 99, 174, 72, 20, 1, 228, 126, 41, 213, 191, 181, 181, 169, 29, 78, 97, 143, 228, 143, 252, 107, 14, 138, 49, 78, 192, 20, 81, 138, 49, 69, 128, 40, 163, 20, 98, 139, 1, 234, 95, 4, 191, 228, 49, 170, 127, 215, 186, 255, 0, 232, 85, 237, 85, 226, 159, 4, 255, 0, 228, 51, 170, 127, 215, 186, 255, 0, 232, 85, 237, 116, 89, 128, 81, 69, 20, 89, 246, 0, 162, 138, 40, 179, 236, 7, 57, 227, 239, 249, 17, 53, 159, 250, 247, 63, 206, 190, 102, 175, 166, 60, 123, 255, 0, 34, 38, 179, 255, 0, 94, 231, 249, 215, 204, 248, 162, 192, 20, 81, 138, 49, 72, 2, 138, 49, 70, 40, 0, 162, 140, 81, 138, 0, 250, 7, 225, 23, 252, 136, 145, 255, 0, 215, 196, 159, 206, 187, 186, 224, 254, 17, 15, 248, 161, 163, 255, 0, 175, 137, 63, 157, 119, 148, 92, 118, 97, 69, 20, 81, 112, 179, 10, 40, 162, 139, 133, 153, 229, 159, 27, 127, 228, 15, 165, 255, 0, 215, 195, 127, 232, 53, 226, 213, 237, 63, 27, 63, 228, 15, 165, 127, 215, 118, 255, 0, 208, 107, 197, 177, 64, 88, 40, 163, 20, 98, 129, 5, 20, 98, 140, 80, 1, 69, 24, 163, 20, 1, 245, 142, 149, 255, 0, 32, 123, 31, 250, 247, 143, 249, 10, 183, 84, 244, 175, 249, 3, 216, 255, 0, 215, 188, 127, 200, 85, 202, 122, 142, 193, 69, 20, 81, 168, 88, 40, 162, 138, 53, 11, 31, 62, 252, 93, 255, 0, 145, 238, 79, 250, 247, 139, 249, 87, 11, 93, 215, 197, 193, 255, 0, 21, 220, 191, 245, 239, 23, 242, 174, 23, 20, 8, 40, 163, 20, 98, 128, 10, 40, 197, 24, 160, 2, 186, 79, 1, 127, 200, 247, 163, 127, 215, 192, 254, 85, 205, 226, 186, 63, 1, 15, 248, 174, 180, 111, 250, 249, 20, 1, 244, 205, 20, 81, 70, 163, 176, 81, 69, 20, 106, 22, 10, 40, 162, 141, 66, 199, 201, 250, 183, 252, 134, 111, 191, 235, 226, 79, 253, 8, 213, 58, 187, 170, 255, 0, 200, 102, 247, 254, 190, 36, 255, 0, 208, 141, 82, 193, 164, 32, 162, 140, 26, 48, 104, 0, 162, 140, 26, 48, 104, 0, 175, 82, 248, 37, 255, 0, 33, 141, 83, 254, 189, 215, 255, 0, 66, 175, 45, 193, 175, 81, 248, 38, 63, 226, 113, 170, 127, 215, 186, 255, 0, 232, 84, 1, 237, 116, 81, 131, 70, 15, 165, 43, 161, 93, 5, 20, 96, 250, 81, 131, 233, 69, 208, 93, 5, 115, 126, 61, 255, 0, 145, 19, 89, 255, 0, 175, 127, 234, 43, 164, 193, 244, 174, 111, 199, 163, 254, 40, 77, 103, 254, 184, 127, 81, 69, 208, 93, 31, 51, 209, 70, 13, 24, 52, 198, 20, 81, 131, 70, 13, 0, 20, 81, 131, 70, 13, 0, 21, 244, 23, 194, 47, 249, 17, 34, 255, 0, 174, 242, 127, 58, 249, 247, 21, 244, 23, 194, 17, 255, 0, 20, 36, 127, 245, 240, 255, 0, 206, 128, 185, 221, 81, 78, 193, 163, 6, 141, 69, 116, 54, 138, 118, 13, 24, 52, 106, 23, 67, 107, 203, 126, 54, 255, 0, 200, 27, 74, 255, 0, 174, 237, 255, 0, 160, 215, 170, 96, 215, 150, 124, 108, 7, 251, 31, 75, 255, 0, 174, 237, 255, 0, 160, 208, 23, 71, 138, 81, 70, 13, 24, 52, 12, 40, 163, 6, 140, 26, 0, 40, 163, 6, 140, 26, 0, 43, 235, 29, 39, 254, 64, 246, 31, 245, 239, 31, 254, 130, 43, 228, 236, 26, 250, 199, 73, 7, 251, 30, 195, 254, 189, 227, 255, 0, 208, 69, 2, 109, 22, 232, 167, 96, 209, 131, 69, 152, 93, 13, 162, 157, 131, 70, 13, 22, 97, 116, 54, 190, 126, 248, 185, 255, 0, 35, 212, 223, 245, 194, 58, 250, 11, 105, 244, 175, 159, 126, 46, 12, 120, 238, 95, 250, 247, 143, 249, 81, 116, 51, 132, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 3, 212, 190, 9, 255, 0, 200, 99, 84, 255, 0, 175, 117, 254, 117, 237, 85, 226, 191, 4, 193, 58, 198, 169, 255, 0, 94, 235, 252, 235, 218, 176, 125, 41, 93, 0, 81, 70, 15, 165, 24, 62, 148, 93, 0, 85, 123, 219, 113, 121, 105, 36, 39, 184, 200, 250, 213, 140, 31, 74, 48, 125, 40, 186, 3, 136, 179, 141, 162, 213, 45, 213, 250, 137, 148, 31, 206, 175, 248, 171, 254, 70, 157, 67, 254, 187, 127, 74, 177, 169, 219, 249, 90, 253, 172, 219, 112, 175, 42, 243, 239, 154, 173, 226, 178, 63, 225, 41, 212, 57, 31, 235, 104, 184, 25, 52, 83, 119, 47, 168, 163, 114, 250, 138, 96, 58, 138, 110, 229, 245, 20, 110, 95, 81, 64, 14, 162, 155, 185, 125, 69, 27, 151, 212, 80, 3, 168, 166, 238, 95, 81, 70, 229, 245, 20, 1, 98, 199, 254, 66, 54, 191, 245, 213, 127, 157, 95, 241, 95, 252, 141, 26, 135, 253, 117, 254, 130, 179, 172, 8, 254, 209, 181, 249, 135, 250, 213, 254, 117, 163, 226, 191, 249, 26, 53, 15, 250, 235, 253, 5, 121, 249, 135, 240, 209, 133, 127, 132, 199, 162, 138, 43, 202, 57, 194, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 11, 22, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 75, 197, 95, 242, 51, 234, 31, 245, 214, 179, 108, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 143, 138, 200, 255, 0, 132, 167, 80, 228, 127, 173, 175, 83, 47, 217, 155, 209, 234, 100, 209, 77, 220, 190, 162, 141, 203, 234, 43, 209, 58, 7, 81, 77, 220, 190, 162, 141, 203, 234, 40, 1, 212, 83, 119, 47, 168, 163, 114, 250, 138, 0, 117, 20, 221, 203, 234, 40, 220, 190, 162, 128, 44, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 207, 168, 127, 215, 90, 204, 176, 35, 251, 66, 215, 230, 31, 235, 87, 249, 214, 151, 138, 200, 255, 0, 132, 167, 80, 228, 127, 174, 160, 12, 154, 41, 187, 151, 251, 226, 141, 203, 253, 241, 64, 14, 162, 155, 185, 127, 190, 40, 220, 191, 223, 20, 0, 234, 41, 187, 151, 251, 226, 141, 203, 253, 241, 64, 14, 162, 155, 185, 127, 190, 40, 220, 191, 223, 20, 1, 102, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 120, 171, 254, 70, 157, 67, 254, 187, 86, 117, 129, 31, 218, 54, 191, 48, 255, 0, 92, 191, 206, 180, 60, 86, 195, 254, 18, 157, 67, 145, 254, 182, 128, 50, 104, 166, 238, 95, 239, 138, 55, 47, 247, 197, 0, 58, 138, 110, 229, 254, 248, 163, 114, 255, 0, 124, 80, 3, 168, 166, 238, 95, 239, 138, 55, 47, 247, 197, 0, 58, 138, 110, 229, 254, 248, 163, 114, 255, 0, 124, 80, 5, 155, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 26, 111, 255, 0, 235, 173, 102, 216, 145, 253, 163, 109, 243, 15, 245, 171, 252, 235, 71, 197, 100, 127, 194, 83, 168, 114, 63, 214, 208, 6, 77, 20, 221, 203, 234, 40, 220, 190, 162, 128, 29, 69, 55, 114, 250, 138, 55, 47, 168, 160, 7, 81, 77, 220, 190, 162, 141, 203, 234, 40, 1, 212, 83, 119, 47, 168, 163, 114, 250, 138, 0, 177, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 188, 175, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 189, 78, 192, 143, 237, 11, 94, 71, 250, 213, 254, 117, 229, 159, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 20, 1, 200, 81, 69, 20, 0, 87, 93, 240, 179, 254, 74, 127, 135, 255, 0, 235, 236, 127, 35, 92, 141, 117, 223, 11, 63, 228, 167, 248, 127, 254, 190, 199, 242, 52, 1, 245, 94, 173, 224, 79, 12, 107, 215, 230, 255, 0, 86, 209, 173, 238, 174, 138, 133, 50, 73, 156, 224, 116, 239, 84, 127, 225, 85, 120, 23, 254, 133, 155, 63, 215, 252, 107, 177, 162, 128, 56, 239, 248, 85, 94, 5, 255, 0, 161, 102, 207, 245, 255, 0, 26, 63, 225, 85, 120, 23, 254, 133, 155, 63, 215, 252, 107, 177, 162, 128, 60, 123, 226, 47, 129, 124, 47, 160, 104, 22, 119, 250, 94, 139, 5, 173, 215, 246, 141, 178, 9, 99, 206, 64, 50, 12, 247, 173, 93, 127, 94, 182, 182, 215, 46, 224, 147, 69, 179, 152, 171, 224, 200, 253, 77, 92, 248, 189, 255, 0, 34, 141, 159, 253, 133, 109, 63, 244, 96, 174, 95, 197, 95, 242, 52, 234, 31, 245, 219, 250, 80, 5, 207, 248, 73, 236, 191, 232, 94, 176, 163, 254, 18, 123, 47, 250, 23, 172, 43, 156, 162, 128, 58, 31, 248, 74, 44, 255, 0, 232, 94, 176, 163, 254, 18, 139, 63, 250, 23, 172, 43, 158, 162, 128, 58, 31, 248, 74, 44, 255, 0, 232, 94, 176, 163, 254, 18, 139, 63, 250, 23, 172, 43, 158, 162, 128, 58, 31, 248, 74, 44, 255, 0, 232, 94, 176, 163, 254, 18, 139, 63, 250, 23, 172, 43, 158, 162, 128, 58, 107, 95, 18, 90, 61, 228, 42, 52, 11, 37, 203, 129, 145, 219, 154, 187, 175, 235, 214, 214, 186, 229, 220, 13, 162, 89, 204, 85, 240, 100, 126, 173, 92, 149, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 209, 241, 95, 252, 141, 26, 135, 253, 117, 160, 11, 159, 240, 147, 217, 127, 208, 189, 97, 71, 252, 36, 246, 95, 244, 47, 88, 87, 57, 69, 0, 116, 127, 240, 147, 217, 127, 208, 189, 97, 71, 252, 36, 246, 95, 244, 47, 88, 87, 57, 69, 0, 116, 127, 240, 147, 217, 127, 208, 189, 97, 71, 252, 36, 246, 95, 244, 47, 88, 87, 57, 69, 0, 116, 127, 240, 147, 217, 127, 208, 189, 97, 71, 252, 36, 246, 95, 244, 47, 88, 87, 57, 69, 0, 116, 214, 190, 37, 180, 123, 200, 20, 104, 22, 75, 151, 3, 35, 183, 53, 119, 95, 215, 173, 173, 181, 235, 184, 31, 69, 179, 152, 171, 224, 200, 253, 90, 185, 59, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 161, 226, 175, 249, 25, 245, 15, 250, 237, 64, 22, 191, 225, 39, 178, 255, 0, 161, 122, 194, 143, 248, 73, 236, 191, 232, 94, 176, 174, 122, 138, 0, 232, 127, 225, 39, 178, 255, 0, 161, 122, 202, 143, 248, 73, 236, 191, 232, 94, 178, 174, 122, 138, 0, 232, 127, 225, 39, 178, 255, 0, 161, 122, 202, 143, 248, 73, 236, 191, 232, 94, 178, 174, 122, 138, 0, 232, 127, 225, 39, 178, 255, 0, 161, 122, 202, 143, 248, 73, 236, 191, 232, 94, 178, 174, 122, 138, 0, 233, 173, 124, 75, 104, 247, 144, 47, 246, 5, 146, 229, 192, 200, 237, 205, 93, 215, 245, 235, 107, 109, 118, 238, 23, 209, 44, 231, 42, 248, 50, 63, 86, 174, 74, 199, 254, 66, 22, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 141, 67, 254, 187, 26, 0, 181, 255, 0, 9, 61, 151, 253, 11, 214, 20, 127, 194, 79, 101, 255, 0, 66, 245, 133, 115, 148, 80, 7, 71, 255, 0, 9, 61, 151, 253, 11, 214, 20, 127, 194, 79, 101, 255, 0, 66, 245, 133, 115, 148, 80, 7, 71, 255, 0, 9, 61, 151, 253, 11, 214, 20, 127, 194, 79, 101, 255, 0, 66, 245, 133, 115, 148, 80, 7, 71, 255, 0, 9, 61, 151, 253, 11, 214, 20, 127, 194, 79, 101, 255, 0, 66, 245, 133, 115, 148, 80, 7, 81, 105, 226, 91, 71, 189, 133, 127, 176, 44, 151, 46, 6, 71, 110, 106, 175, 137, 63, 228, 100, 190, 255, 0, 174, 191, 210, 178, 108, 63, 228, 35, 109, 255, 0, 93, 87, 249, 214, 183, 137, 63, 228, 100, 190, 255, 0, 174, 191, 210, 174, 27, 159, 59, 196, 127, 238, 241, 245, 253, 25, 149, 69, 20, 86, 135, 198, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 89, 127, 199, 245, 183, 253, 117, 95, 231, 93, 54, 191, 175, 91, 91, 235, 151, 112, 62, 139, 103, 57, 87, 193, 145, 250, 181, 115, 54, 95, 241, 253, 109, 255, 0, 93, 87, 249, 213, 175, 21, 255, 0, 200, 209, 168, 127, 215, 99, 252, 170, 36, 125, 111, 12, 252, 53, 126, 69, 175, 248, 73, 236, 191, 232, 94, 176, 163, 254, 18, 123, 47, 250, 23, 172, 43, 158, 162, 179, 62, 156, 232, 127, 225, 39, 178, 255, 0, 161, 122, 194, 143, 248, 73, 236, 191, 232, 94, 176, 174, 122, 138, 0, 232, 127, 225, 39, 178, 255, 0, 161, 122, 194, 143, 248, 73, 236, 191, 232, 94, 176, 174, 122, 138, 0, 232, 127, 225, 39, 178, 255, 0, 161, 122, 194, 143, 248, 73, 236, 191, 232, 94, 176, 174, 122, 138, 0, 233, 173, 124, 75, 104, 247, 176, 47, 246, 5, 146, 229, 192, 200, 29, 57, 174, 159, 90, 240, 190, 133, 175, 93, 59, 106, 218, 68, 19, 178, 185, 218, 73, 235, 238, 125, 235, 130, 208, 236, 205, 246, 173, 109, 16, 56, 195, 110, 39, 208, 10, 245, 46, 181, 242, 124, 75, 154, 79, 12, 163, 70, 132, 173, 45, 223, 161, 209, 70, 55, 213, 156, 183, 252, 43, 111, 4, 255, 0, 208, 187, 109, 249, 154, 63, 225, 91, 120, 39, 254, 133, 219, 111, 204, 215, 83, 69, 124, 127, 246, 222, 97, 255, 0, 63, 153, 183, 179, 143, 99, 150, 255, 0, 133, 109, 224, 159, 250, 23, 109, 191, 51, 71, 252, 43, 111, 4, 255, 0, 208, 187, 109, 249, 154, 234, 104, 163, 251, 111, 48, 255, 0, 159, 204, 61, 156, 123, 28, 183, 252, 43, 111, 4, 255, 0, 208, 187, 109, 249, 154, 63, 225, 91, 120, 39, 254, 133, 219, 111, 204, 215, 83, 69, 31, 219, 121, 135, 252, 254, 97, 236, 227, 216, 197, 210, 252, 33, 225, 221, 18, 105, 38, 211, 52, 136, 109, 164, 113, 177, 138, 158, 162, 181, 62, 201, 111, 255, 0, 60, 133, 77, 69, 31, 219, 89, 135, 252, 254, 97, 236, 227, 216, 135, 236, 150, 255, 0, 243, 200, 81, 246, 75, 127, 249, 228, 42, 106, 40, 254, 218, 204, 63, 231, 243, 15, 103, 30, 196, 63, 100, 183, 255, 0, 158, 66, 143, 178, 91, 255, 0, 207, 33, 83, 81, 71, 246, 214, 97, 255, 0, 63, 152, 123, 56, 246, 40, 221, 233, 26, 117, 253, 164, 182, 183, 118, 171, 53, 188, 131, 107, 198, 123, 138, 196, 255, 0, 133, 105, 224, 159, 250, 23, 109, 127, 51, 93, 77, 20, 127, 109, 230, 31, 243, 249, 135, 179, 93, 143, 51, 111, 2, 248, 80, 49, 3, 66, 135, 0, 241, 201, 166, 255, 0, 194, 11, 225, 95, 250, 1, 67, 249, 154, 232, 228, 255, 0, 90, 223, 83, 76, 175, 222, 41, 80, 164, 233, 166, 215, 67, 241, 154, 153, 198, 61, 77, 165, 85, 238, 115, 223, 240, 129, 248, 87, 254, 128, 112, 254, 116, 127, 194, 7, 225, 95, 250, 1, 195, 249, 215, 67, 69, 95, 213, 169, 118, 51, 254, 218, 204, 63, 231, 243, 57, 239, 248, 64, 252, 43, 255, 0, 64, 56, 127, 58, 63, 225, 3, 240, 175, 253, 0, 225, 252, 235, 161, 162, 143, 171, 82, 236, 31, 219, 89, 135, 252, 254, 101, 109, 55, 77, 180, 210, 44, 254, 201, 167, 64, 45, 237, 193, 45, 180, 122, 247, 171, 155, 155, 214, 153, 69, 31, 86, 165, 252, 161, 253, 181, 143, 255, 0, 159, 204, 126, 246, 245, 163, 123, 122, 211, 40, 163, 234, 212, 191, 148, 63, 182, 179, 15, 249, 252, 199, 239, 111, 90, 55, 183, 173, 50, 138, 62, 173, 75, 249, 67, 251, 107, 48, 255, 0, 159, 204, 163, 169, 104, 250, 118, 183, 10, 199, 169, 218, 173, 210, 161, 202, 134, 236, 107, 51, 254, 16, 63, 10, 255, 0, 208, 14, 31, 204, 215, 67, 69, 31, 86, 165, 252, 161, 253, 181, 152, 127, 207, 230, 115, 223, 240, 129, 248, 87, 254, 128, 112, 254, 102, 143, 248, 64, 252, 43, 255, 0, 64, 56, 127, 51, 93, 13, 20, 125, 90, 151, 242, 135, 246, 214, 97, 255, 0, 63, 153, 207, 127, 194, 7, 225, 95, 250, 1, 195, 249, 154, 63, 225, 3, 240, 175, 253, 0, 225, 252, 205, 116, 52, 81, 245, 106, 95, 202, 31, 219, 89, 135, 252, 254, 103, 61, 255, 0, 8, 31, 133, 127, 232, 7, 15, 230, 104, 255, 0, 132, 15, 194, 191, 244, 3, 135, 243, 53, 208, 209, 71, 213, 169, 127, 40, 127, 109, 102, 31, 243, 249, 152, 255, 0, 104, 158, 32, 34, 137, 246, 198, 131, 10, 190, 130, 159, 246, 219, 175, 249, 236, 106, 22, 251, 199, 235, 77, 175, 201, 106, 102, 24, 149, 38, 189, 163, 220, 237, 254, 213, 198, 255, 0, 207, 214, 88, 251, 109, 215, 252, 247, 52, 125, 182, 235, 254, 123, 154, 175, 69, 79, 246, 142, 43, 254, 126, 49, 255, 0, 106, 227, 127, 231, 235, 44, 125, 182, 235, 254, 123, 154, 62, 221, 117, 255, 0, 61, 141, 87, 162, 143, 237, 28, 87, 252, 252, 97, 253, 171, 141, 255, 0, 159, 172, 207, 212, 116, 29, 43, 87, 187, 55, 90, 141, 138, 220, 92, 16, 19, 204, 62, 131, 165, 84, 255, 0, 132, 55, 195, 159, 244, 9, 139, 243, 173, 186, 40, 254, 209, 197, 127, 207, 198, 31, 218, 184, 223, 249, 250, 204, 79, 248, 67, 124, 57, 255, 0, 64, 136, 191, 58, 63, 225, 13, 240, 231, 253, 2, 34, 252, 235, 110, 138, 63, 180, 113, 95, 243, 241, 135, 246, 182, 55, 254, 126, 179, 19, 254, 16, 223, 14, 127, 208, 34, 47, 206, 143, 248, 67, 124, 57, 255, 0, 64, 136, 191, 58, 219, 162, 143, 237, 28, 87, 252, 252, 97, 253, 173, 141, 255, 0, 159, 172, 196, 255, 0, 132, 55, 195, 159, 244, 8, 139, 243, 169, 237, 188, 53, 162, 88, 93, 197, 117, 105, 167, 69, 12, 241, 157, 201, 32, 61, 13, 106, 81, 71, 246, 142, 43, 254, 126, 48, 254, 213, 198, 255, 0, 207, 214, 88, 251, 109, 215, 252, 247, 52, 125, 182, 235, 254, 123, 154, 175, 69, 31, 218, 56, 175, 249, 248, 195, 251, 87, 27, 255, 0, 63, 89, 99, 237, 183, 95, 243, 220, 209, 246, 219, 175, 249, 238, 106, 189, 20, 127, 104, 226, 191, 231, 227, 15, 237, 92, 111, 252, 253, 101, 143, 182, 221, 127, 207, 115, 71, 219, 110, 191, 231, 185, 170, 244, 81, 253, 163, 138, 255, 0, 159, 140, 63, 181, 113, 191, 243, 245, 156, 45, 198, 131, 164, 61, 204, 174, 214, 17, 150, 103, 36, 156, 247, 38, 163, 255, 0, 132, 119, 70, 255, 0, 160, 124, 127, 157, 106, 75, 254, 186, 79, 173, 50, 191, 119, 163, 151, 225, 157, 52, 221, 53, 178, 63, 165, 232, 101, 152, 55, 74, 45, 211, 91, 25, 223, 240, 142, 104, 223, 244, 15, 143, 243, 163, 254, 17, 205, 27, 254, 129, 241, 254, 117, 167, 69, 95, 246, 118, 23, 254, 125, 163, 95, 236, 172, 23, 252, 250, 70, 103, 252, 35, 154, 55, 253, 3, 227, 252, 232, 255, 0, 132, 115, 70, 255, 0, 160, 124, 127, 157, 105, 209, 71, 246, 118, 23, 254, 125, 160, 254, 202, 193, 127, 207, 164, 102, 127, 194, 57, 163, 127, 208, 62, 63, 206, 175, 105, 112, 67, 162, 75, 36, 186, 98, 11, 87, 113, 134, 43, 220, 84, 180, 81, 253, 157, 133, 255, 0, 159, 104, 63, 178, 176, 95, 243, 233, 23, 191, 183, 53, 63, 249, 253, 111, 202, 143, 237, 205, 79, 254, 127, 91, 242, 170, 52, 81, 253, 157, 133, 255, 0, 159, 104, 63, 178, 176, 95, 243, 233, 23, 191, 183, 53, 63, 249, 253, 111, 202, 143, 237, 205, 79, 254, 127, 91, 242, 170, 52, 81, 253, 157, 133, 255, 0, 159, 104, 63, 178, 176, 95, 243, 233, 23, 191, 182, 245, 63, 249, 252, 106, 130, 239, 80, 187, 191, 179, 150, 210, 238, 115, 52, 18, 13, 175, 25, 238, 42, 181, 20, 127, 103, 225, 127, 145, 7, 246, 86, 11, 254, 125, 35, 59, 254, 17, 221, 27, 254, 129, 241, 254, 116, 127, 194, 59, 163, 127, 208, 62, 63, 206, 180, 232, 163, 251, 59, 11, 255, 0, 62, 208, 127, 101, 96, 191, 231, 210, 51, 63, 225, 29, 209, 191, 232, 31, 31, 231, 71, 252, 35, 186, 55, 253, 3, 227, 252, 235, 78, 138, 63, 179, 176, 191, 243, 237, 11, 251, 43, 5, 255, 0, 62, 145, 153, 255, 0, 8, 238, 141, 255, 0, 64, 248, 255, 0, 58, 63, 225, 29, 209, 191, 232, 31, 31, 231, 90, 116, 81, 253, 157, 133, 255, 0, 159, 104, 63, 178, 176, 95, 243, 233, 28, 163, 104, 154, 104, 99, 254, 138, 159, 157, 107, 233, 186, 133, 238, 145, 103, 246, 93, 58, 229, 173, 224, 201, 111, 45, 125, 77, 87, 147, 253, 97, 164, 175, 201, 106, 87, 170, 164, 245, 59, 255, 0, 177, 114, 255, 0, 249, 242, 141, 79, 248, 73, 53, 191, 250, 9, 75, 249, 81, 255, 0, 9, 38, 183, 255, 0, 65, 41, 127, 42, 202, 162, 163, 235, 53, 127, 152, 63, 177, 114, 255, 0, 249, 242, 141, 95, 248, 73, 53, 191, 250, 9, 75, 249, 81, 255, 0, 9, 38, 183, 255, 0, 65, 41, 127, 42, 202, 162, 143, 172, 213, 254, 96, 254, 197, 203, 255, 0, 231, 202, 53, 127, 225, 36, 214, 255, 0, 232, 37, 47, 229, 84, 53, 75, 169, 245, 168, 99, 135, 83, 148, 221, 42, 28, 168, 110, 198, 161, 162, 143, 172, 213, 254, 96, 254, 197, 203, 255, 0, 231, 202, 40, 255, 0, 98, 233, 191, 243, 232, 191, 157, 31, 216, 186, 111, 252, 250, 47, 231, 87, 168, 163, 235, 53, 127, 152, 63, 177, 114, 255, 0, 249, 242, 138, 63, 216, 186, 111, 252, 250, 47, 231, 71, 246, 46, 155, 255, 0, 62, 139, 249, 213, 234, 40, 250, 205, 95, 230, 15, 236, 92, 191, 254, 124, 162, 143, 246, 46, 155, 255, 0, 62, 139, 249, 209, 253, 139, 166, 255, 0, 207, 162, 254, 117, 122, 138, 62, 179, 87, 249, 131, 251, 23, 47, 255, 0, 159, 40, 163, 253, 139, 166, 255, 0, 207, 162, 254, 117, 208, 69, 226, 29, 98, 24, 99, 133, 53, 9, 2, 32, 10, 6, 59, 86, 109, 20, 125, 102, 175, 243, 7, 246, 46, 95, 255, 0, 62, 81, 171, 255, 0, 9, 46, 183, 255, 0, 65, 41, 104, 255, 0, 132, 151, 91, 255, 0, 160, 148, 181, 149, 69, 31, 89, 169, 220, 63, 177, 114, 255, 0, 249, 242, 141, 79, 248, 73, 53, 191, 250, 9, 75, 71, 252, 36, 154, 223, 253, 4, 165, 172, 186, 40, 250, 205, 78, 225, 253, 139, 151, 255, 0, 207, 148, 103, 203, 227, 63, 19, 137, 8, 26, 204, 216, 7, 208, 86, 46, 163, 117, 113, 171, 221, 253, 175, 80, 152, 220, 92, 16, 19, 204, 111, 65, 210, 146, 111, 245, 207, 245, 168, 235, 247, 122, 57, 70, 5, 211, 77, 210, 91, 35, 241, 122, 149, 26, 168, 210, 238, 67, 246, 88, 63, 184, 40, 251, 44, 31, 220, 21, 53, 21, 175, 246, 38, 95, 255, 0, 62, 81, 30, 214, 93, 200, 126, 203, 7, 247, 5, 31, 101, 131, 251, 130, 166, 162, 143, 236, 76, 191, 254, 124, 160, 246, 178, 238, 67, 246, 88, 63, 184, 40, 251, 44, 31, 220, 21, 53, 20, 127, 98, 101, 255, 0, 243, 229, 7, 181, 151, 114, 214, 151, 169, 94, 232, 147, 60, 186, 101, 203, 91, 59, 141, 172, 87, 184, 173, 63, 248, 77, 124, 79, 255, 0, 65, 153, 255, 0, 33, 88, 84, 81, 253, 139, 151, 255, 0, 207, 164, 30, 214, 93, 205, 223, 248, 77, 124, 79, 255, 0, 65, 153, 255, 0, 33, 71, 252, 38, 190, 39, 255, 0, 160, 204, 255, 0, 144, 172, 42, 40, 254, 196, 203, 255, 0, 231, 202, 15, 107, 46, 230, 239, 252, 38, 190, 39, 255, 0, 160, 204, 255, 0, 144, 163, 254, 19, 95, 19, 255, 0, 208, 102, 127, 200, 86, 21, 20, 127, 98, 101, 255, 0, 243, 229, 7, 181, 151, 115, 182, 240, 175, 142, 181, 72, 60, 77, 100, 250, 180, 226, 250, 212, 201, 181, 146, 97, 194, 231, 248, 191, 10, 245, 253, 123, 95, 181, 131, 91, 187, 133, 180, 91, 57, 202, 191, 250, 215, 234, 220, 87, 205, 85, 233, 94, 29, 213, 166, 213, 180, 240, 247, 14, 90, 226, 60, 70, 196, 247, 192, 227, 244, 175, 148, 226, 108, 170, 20, 35, 26, 244, 35, 101, 179, 253, 13, 168, 212, 111, 70, 119, 63, 240, 148, 89, 255, 0, 208, 189, 97, 250, 209, 255, 0, 9, 69, 159, 253, 11, 214, 31, 173, 115, 180, 87, 199, 29, 39, 69, 255, 0, 9, 69, 159, 253, 11, 214, 31, 173, 31, 240, 148, 89, 255, 0, 208, 189, 97, 250, 215, 59, 69, 0, 116, 95, 240, 148, 89, 255, 0, 208, 189, 97, 250, 209, 255, 0, 9, 69, 159, 253, 11, 214, 31, 173, 115, 180, 80, 7, 69, 255, 0, 9, 69, 159, 253, 11, 214, 31, 173, 31, 240, 148, 89, 255, 0, 208, 189, 97, 250, 215, 59, 69, 0, 116, 214, 190, 37, 181, 123, 216, 23, 251, 2, 201, 114, 224, 100, 118, 230, 179, 188, 87, 255, 0, 35, 70, 161, 255, 0, 93, 127, 160, 170, 54, 63, 242, 17, 181, 255, 0, 174, 171, 252, 234, 247, 138, 255, 0, 228, 104, 212, 63, 235, 175, 244, 21, 231, 230, 31, 195, 70, 21, 254, 19, 30, 138, 40, 175, 40, 231, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 44, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 174, 187, 95, 215, 173, 173, 117, 203, 184, 36, 209, 44, 230, 42, 248, 50, 63, 86, 174, 70, 199, 254, 66, 22, 191, 245, 213, 127, 157, 105, 120, 171, 254, 70, 157, 67, 254, 186, 215, 169, 151, 236, 205, 232, 245, 45, 127, 194, 79, 101, 255, 0, 66, 245, 133, 31, 240, 147, 217, 127, 208, 189, 97, 92, 245, 21, 232, 157, 7, 67, 255, 0, 9, 61, 151, 253, 11, 214, 20, 127, 194, 79, 101, 255, 0, 66, 245, 133, 115, 212, 80, 7, 67, 255, 0, 9, 61, 151, 253, 11, 214, 20, 127, 194, 79, 101, 255, 0, 66, 245, 133, 115, 212, 80, 7, 67, 255, 0, 9, 61, 151, 253, 11, 214, 20, 127, 194, 79, 101, 255, 0, 66, 245, 133, 115, 212, 80, 7, 77, 107, 226, 91, 71, 188, 129, 127, 176, 44, 151, 46, 6, 71, 110, 106, 238, 191, 175, 90, 218, 235, 151, 112, 54, 137, 103, 59, 171, 255, 0, 172, 126, 173, 92, 149, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 26, 135, 253, 118, 52, 1, 107, 254, 18, 123, 47, 250, 23, 172, 40, 255, 0, 132, 158, 203, 254, 133, 235, 10, 231, 168, 160, 14, 135, 254, 18, 123, 47, 250, 23, 172, 40, 255, 0, 132, 158, 203, 254, 133, 235, 10, 231, 168, 160, 14, 135, 254, 18, 123, 47, 250, 23, 172, 40, 255, 0, 132, 158, 203, 254, 133, 235, 10, 231, 168, 160, 14, 135, 254, 18, 123, 47, 250, 23, 172, 40, 255, 0, 132, 158, 203, 254, 133, 235, 10, 231, 168, 160, 14, 154, 215, 196, 182, 143, 123, 2, 255, 0, 96, 89, 46, 92, 12, 142, 220, 213, 221, 127, 94, 182, 183, 215, 110, 224, 147, 68, 179, 156, 171, 224, 200, 221, 90, 185, 43, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 64, 22, 191, 225, 39, 178, 255, 0, 161, 122, 202, 143, 248, 73, 236, 191, 232, 94, 178, 174, 122, 138, 0, 232, 127, 225, 39, 178, 255, 0, 161, 122, 202, 143, 248, 73, 236, 191, 232, 94, 178, 174, 122, 138, 0, 232, 127, 225, 39, 178, 255, 0, 161, 122, 202, 143, 248, 73, 236, 191, 232, 94, 178, 174, 122, 138, 0, 232, 127, 225, 39, 178, 255, 0, 161, 122, 202, 143, 248, 73, 236, 191, 232, 94, 178, 174, 122, 138, 0, 233, 173, 124, 75, 106, 247, 144, 175, 246, 5, 146, 146, 224, 100, 118, 230, 174, 235, 250, 245, 181, 174, 185, 119, 4, 154, 37, 156, 197, 95, 30, 99, 245, 106, 228, 172, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 105, 191, 255, 0, 174, 180, 1, 115, 254, 18, 107, 63, 250, 23, 172, 104, 255, 0, 132, 154, 207, 254, 133, 235, 26, 231, 40, 160, 14, 143, 254, 18, 107, 63, 250, 23, 172, 104, 255, 0, 132, 154, 207, 254, 133, 235, 26, 231, 40, 160, 14, 143, 254, 18, 107, 63, 250, 23, 172, 104, 255, 0, 132, 154, 207, 254, 133, 235, 26, 231, 40, 160, 14, 143, 254, 18, 107, 63, 250, 23, 172, 104, 255, 0, 132, 154, 207, 254, 133, 235, 26, 231, 40, 160, 14, 154, 215, 196, 182, 143, 121, 2, 255, 0, 96, 89, 46, 92, 12, 142, 220, 211, 124, 61, 225, 13, 3, 196, 126, 52, 241, 180, 250, 206, 149, 13, 236, 176, 234, 65, 35, 50, 231, 129, 176, 26, 193, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 93, 223, 128, 63, 228, 111, 241, 231, 253, 133, 87, 255, 0, 69, 138, 0, 187, 255, 0, 10, 171, 192, 191, 244, 44, 217, 254, 191, 227, 71, 252, 42, 175, 2, 255, 0, 208, 179, 103, 250, 255, 0, 141, 118, 52, 80, 7, 29, 255, 0, 10, 171, 192, 191, 244, 44, 217, 254, 191, 227, 86, 44, 62, 29, 120, 71, 74, 190, 134, 250, 199, 66, 183, 130, 234, 22, 221, 28, 137, 156, 169, 252, 235, 169, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 60, 255, 0, 226, 247, 252, 138, 54, 127, 246, 21, 180, 255, 0, 209, 130, 185, 127, 21, 127, 200, 211, 168, 127, 215, 111, 233, 93, 71, 197, 239, 249, 20, 108, 255, 0, 236, 43, 105, 255, 0, 163, 5, 114, 254, 42, 255, 0, 145, 167, 80, 255, 0, 174, 223, 210, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 54, 223, 245, 217, 127, 157, 104, 120, 171, 254, 70, 125, 67, 254, 186, 214, 125, 143, 252, 132, 109, 191, 235, 178, 255, 0, 58, 208, 241, 87, 252, 140, 250, 135, 253, 117, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 213, 159, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 143, 138, 255, 0, 228, 103, 212, 63, 235, 177, 172, 235, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 163, 226, 191, 249, 25, 245, 15, 250, 236, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 37, 109, 255, 0, 93, 87, 249, 214, 175, 137, 63, 228, 100, 190, 255, 0, 174, 191, 210, 178, 172, 127, 228, 37, 109, 255, 0, 93, 87, 249, 214, 175, 137, 63, 228, 100, 190, 255, 0, 174, 191, 210, 174, 27, 159, 59, 196, 127, 238, 241, 245, 253, 25, 149, 69, 20, 86, 135, 198, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 89, 127, 199, 245, 183, 253, 117, 95, 231, 86, 188, 87, 255, 0, 35, 70, 161, 255, 0, 93, 143, 242, 170, 182, 95, 241, 253, 109, 255, 0, 93, 87, 249, 213, 175, 21, 255, 0, 200, 209, 168, 127, 215, 99, 252, 170, 36, 125, 111, 12, 252, 53, 126, 70, 69, 20, 81, 89, 159, 78, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 78, 138, 38, 150, 85, 141, 122, 177, 192, 169, 147, 178, 187, 3, 177, 240, 86, 157, 136, 228, 190, 117, 235, 242, 166, 127, 83, 93, 125, 85, 211, 237, 126, 193, 167, 67, 109, 215, 203, 92, 102, 173, 87, 228, 121, 158, 45, 226, 241, 82, 173, 210, 250, 122, 30, 132, 99, 202, 172, 58, 138, 40, 175, 48, 160, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 3, 146, 147, 253, 107, 125, 77, 50, 159, 39, 250, 214, 250, 154, 101, 127, 73, 81, 248, 35, 232, 126, 5, 95, 248, 146, 245, 97, 69, 20, 86, 166, 33, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 6, 35, 125, 227, 245, 166, 211, 155, 239, 31, 173, 54, 191, 18, 171, 252, 70, 122, 97, 69, 20, 86, 96, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 114, 211, 127, 174, 147, 234, 106, 58, 146, 111, 245, 210, 125, 77, 71, 95, 210, 52, 62, 8, 250, 31, 214, 216, 111, 224, 199, 209, 14, 162, 138, 43, 67, 96, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 3, 14, 79, 245, 134, 146, 150, 79, 245, 134, 146, 191, 19, 169, 241, 51, 209, 18, 138, 40, 168, 40, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 229, 39, 255, 0, 93, 39, 214, 163, 169, 39, 255, 0, 93, 39, 214, 163, 175, 232, 250, 31, 195, 143, 162, 63, 1, 171, 241, 191, 80, 162, 138, 43, 115, 16, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 174, 139, 194, 122, 135, 217, 53, 31, 179, 51, 126, 234, 127, 95, 94, 213, 206, 211, 226, 144, 197, 42, 184, 234, 164, 17, 92, 88, 220, 52, 113, 56, 121, 81, 125, 81, 81, 118, 119, 61, 122, 138, 173, 99, 116, 183, 182, 144, 220, 175, 221, 117, 205, 89, 175, 199, 106, 211, 116, 228, 227, 45, 209, 232, 133, 20, 81, 82, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 234, 255, 0, 138, 255, 0, 228, 105, 212, 63, 235, 175, 244, 21, 66, 199, 254, 66, 54, 191, 245, 213, 127, 157, 95, 241, 95, 252, 141, 58, 135, 253, 117, 254, 130, 184, 115, 15, 129, 24, 87, 248, 76, 122, 40, 162, 188, 131, 156, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 177, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 188, 85, 255, 0, 35, 62, 161, 255, 0, 93, 171, 54, 199, 254, 66, 22, 191, 245, 213, 127, 157, 105, 120, 171, 254, 70, 125, 67, 254, 187, 87, 169, 151, 236, 205, 232, 245, 50, 40, 162, 138, 244, 78, 128, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 53, 15, 250, 236, 107, 58, 199, 254, 66, 22, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 141, 67, 254, 187, 26, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 15, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 53, 15, 250, 236, 107, 58, 195, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 141, 67, 254, 187, 26, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 123, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 26, 111, 255, 0, 235, 173, 103, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 211, 127, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 215, 119, 224, 15, 249, 27, 252, 121, 255, 0, 97, 85, 255, 0, 209, 98, 184, 75, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 221, 248, 3, 254, 70, 255, 0, 30, 127, 216, 85, 127, 244, 88, 160, 14, 250, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 15, 63, 248, 189, 255, 0, 34, 141, 159, 253, 133, 109, 63, 244, 96, 174, 95, 197, 95, 242, 52, 234, 31, 245, 219, 250, 87, 81, 241, 123, 254, 69, 27, 63, 251, 10, 218, 127, 232, 193, 92, 191, 138, 191, 228, 105, 212, 63, 235, 183, 244, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 43, 255, 0, 145, 163, 80, 255, 0, 174, 181, 159, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 60, 87, 255, 0, 35, 70, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 103, 212, 63, 235, 181, 103, 216, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 15, 21, 127, 200, 207, 168, 127, 215, 106, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 163, 226, 191, 249, 25, 245, 15, 250, 236, 107, 58, 199, 254, 66, 22, 191, 245, 213, 127, 157, 104, 248, 175, 254, 70, 125, 67, 254, 187, 26, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 123, 31, 249, 9, 91, 127, 215, 85, 254, 117, 171, 226, 79, 249, 25, 47, 191, 235, 175, 244, 172, 171, 31, 249, 9, 91, 127, 215, 85, 254, 117, 171, 226, 79, 249, 25, 47, 191, 235, 175, 244, 171, 134, 231, 206, 241, 31, 251, 188, 125, 127, 70, 101, 81, 69, 21, 161, 241, 161, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 95, 241, 253, 109, 255, 0, 93, 87, 249, 213, 175, 21, 255, 0, 200, 209, 168, 127, 215, 99, 252, 170, 173, 151, 252, 127, 91, 127, 215, 85, 254, 117, 107, 197, 127, 242, 52, 106, 31, 245, 216, 255, 0, 42, 137, 31, 91, 195, 63, 13, 95, 145, 145, 69, 20, 86, 103, 211, 133, 20, 81, 64, 5, 20, 81, 64, 5, 110, 120, 82, 196, 222, 106, 201, 49, 226, 56, 6, 227, 238, 123, 86, 29, 119, 254, 14, 179, 16, 233, 63, 104, 63, 126, 115, 159, 194, 188, 78, 33, 197, 253, 91, 3, 43, 110, 244, 251, 255, 0, 224, 26, 82, 133, 228, 116, 180, 81, 69, 126, 82, 119, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 28, 147, 253, 246, 250, 154, 101, 61, 254, 251, 125, 77, 50, 191, 164, 232, 255, 0, 14, 62, 135, 224, 85, 255, 0, 137, 47, 86, 20, 81, 69, 104, 98, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 98, 55, 222, 63, 90, 109, 57, 190, 241, 250, 211, 107, 241, 42, 191, 196, 103, 166, 20, 81, 69, 102, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 7, 45, 55, 250, 233, 62, 180, 218, 116, 223, 235, 164, 250, 211, 107, 250, 70, 135, 193, 31, 67, 250, 219, 15, 252, 24, 250, 47, 200, 40, 162, 138, 208, 216, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 195, 147, 253, 97, 164, 165, 147, 253, 97, 164, 175, 196, 234, 124, 76, 244, 68, 162, 138, 42, 10, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 57, 73, 191, 215, 63, 214, 163, 169, 38, 255, 0, 92, 255, 0, 90, 142, 191, 163, 232, 127, 14, 62, 136, 252, 6, 175, 198, 253, 66, 138, 40, 173, 204, 66, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 14, 219, 193, 87, 187, 173, 230, 180, 45, 247, 14, 229, 30, 198, 186, 186, 243, 47, 14, 222, 155, 45, 98, 22, 63, 113, 206, 214, 207, 189, 122, 109, 126, 97, 196, 216, 95, 97, 140, 115, 91, 75, 95, 159, 83, 178, 139, 188, 66, 138, 40, 175, 157, 55, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 87, 252, 87, 255, 0, 35, 78, 161, 255, 0, 93, 127, 194, 168, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 171, 254, 43, 255, 0, 145, 167, 80, 255, 0, 174, 191, 225, 92, 57, 135, 192, 140, 43, 252, 38, 61, 20, 81, 94, 65, 206, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 88, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 90, 94, 42, 255, 0, 145, 159, 80, 255, 0, 174, 213, 155, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 188, 85, 255, 0, 35, 62, 161, 255, 0, 93, 171, 212, 203, 246, 102, 244, 122, 153, 20, 81, 69, 122, 39, 64, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 26, 135, 253, 118, 53, 157, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 70, 161, 255, 0, 93, 141, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 135, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 26, 135, 253, 118, 53, 157, 97, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 70, 161, 255, 0, 93, 141, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 141, 55, 255, 0, 245, 214, 179, 236, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 105, 191, 255, 0, 174, 180, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 187, 240, 7, 252, 141, 254, 60, 255, 0, 176, 170, 255, 0, 232, 177, 92, 37, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 238, 252, 1, 255, 0, 35, 127, 143, 63, 236, 42, 191, 250, 44, 80, 7, 125, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 7, 159, 252, 94, 255, 0, 145, 70, 207, 254, 194, 182, 159, 250, 48, 87, 47, 226, 175, 249, 26, 117, 15, 250, 237, 253, 43, 168, 248, 189, 255, 0, 34, 141, 159, 253, 133, 109, 63, 244, 96, 174, 95, 197, 95, 242, 52, 234, 31, 245, 219, 250, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 255, 0, 200, 209, 168, 127, 215, 90, 207, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 43, 255, 0, 145, 163, 80, 255, 0, 174, 180, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 246, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 67, 197, 95, 242, 51, 234, 31, 245, 218, 179, 236, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 103, 212, 63, 235, 181, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 209, 241, 95, 252, 140, 250, 135, 253, 118, 53, 157, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 87, 255, 0, 35, 62, 161, 255, 0, 93, 141, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 173, 191, 235, 170, 255, 0, 58, 213, 241, 39, 252, 140, 151, 223, 245, 215, 250, 86, 85, 143, 252, 132, 173, 191, 235, 170, 255, 0, 58, 213, 241, 39, 252, 140, 151, 223, 245, 215, 250, 85, 195, 115, 231, 120, 143, 253, 222, 62, 191, 163, 50, 168, 162, 138, 208, 248, 208, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 47, 248, 254, 182, 255, 0, 174, 171, 252, 234, 215, 138, 255, 0, 228, 104, 212, 63, 235, 177, 254, 85, 86, 203, 254, 63, 173, 191, 235, 170, 255, 0, 58, 181, 226, 191, 249, 26, 53, 15, 250, 236, 127, 149, 68, 143, 173, 225, 159, 134, 175, 200, 200, 162, 138, 43, 51, 233, 194, 138, 40, 160, 2, 138, 40, 160, 7, 195, 11, 79, 52, 112, 175, 86, 108, 12, 87, 172, 218, 192, 182, 150, 145, 64, 163, 1, 23, 21, 193, 120, 66, 207, 237, 26, 200, 124, 124, 176, 13, 199, 235, 218, 189, 14, 191, 62, 226, 220, 95, 61, 104, 208, 93, 53, 126, 172, 234, 160, 180, 184, 234, 40, 162, 190, 60, 232, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 57, 39, 251, 237, 245, 52, 202, 123, 253, 246, 250, 154, 101, 127, 73, 209, 254, 28, 125, 15, 192, 171, 255, 0, 18, 94, 172, 40, 162, 138, 208, 196, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 196, 111, 188, 126, 180, 218, 115, 125, 227, 245, 166, 215, 226, 85, 127, 136, 207, 76, 40, 162, 138, 204, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 14, 90, 111, 245, 210, 125, 105, 180, 233, 191, 215, 73, 245, 166, 215, 244, 141, 15, 130, 62, 135, 245, 182, 31, 248, 49, 244, 95, 144, 81, 69, 21, 161, 176, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 135, 39, 250, 195, 73, 75, 39, 250, 195, 73, 95, 137, 212, 248, 153, 232, 137, 69, 20, 84, 20, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 114, 147, 127, 174, 127, 173, 71, 82, 77, 254, 185, 254, 181, 29, 127, 71, 208, 254, 28, 125, 17, 248, 13, 95, 141, 250, 133, 20, 81, 91, 152, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 10, 9, 86, 4, 28, 16, 114, 43, 212, 244, 171, 159, 182, 105, 144, 79, 156, 239, 94, 107, 202, 235, 182, 240, 77, 224, 107, 121, 173, 24, 242, 135, 114, 143, 99, 95, 41, 197, 88, 111, 107, 132, 85, 86, 241, 127, 131, 55, 162, 236, 206, 174, 138, 40, 175, 206, 78, 192, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 127, 197, 95, 242, 52, 234, 31, 245, 215, 252, 42, 133, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 191, 226, 175, 249, 26, 117, 15, 250, 235, 254, 21, 195, 152, 124, 8, 194, 191, 194, 99, 209, 69, 21, 228, 28, 225, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 5, 139, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 165, 226, 175, 249, 25, 245, 15, 250, 237, 89, 182, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 75, 197, 95, 242, 51, 234, 31, 245, 218, 189, 76, 191, 102, 111, 71, 169, 145, 69, 20, 87, 162, 116, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 209, 168, 127, 215, 99, 89, 214, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 52, 106, 31, 245, 216, 208, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 88, 127, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 209, 168, 127, 215, 99, 89, 214, 31, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 52, 106, 31, 245, 216, 208, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 211, 127, 255, 0, 93, 107, 62, 199, 254, 66, 54, 223, 245, 213, 127, 157, 104, 120, 171, 254, 70, 155, 255, 0, 250, 235, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 187, 191, 0, 127, 200, 223, 227, 207, 251, 10, 175, 254, 139, 21, 194, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 174, 239, 192, 31, 242, 55, 248, 243, 254, 194, 171, 255, 0, 162, 197, 0, 119, 212, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 112, 31, 23, 191, 228, 81, 179, 255, 0, 176, 173, 167, 254, 140, 21, 203, 120, 171, 254, 70, 157, 67, 254, 187, 127, 74, 234, 62, 47, 255, 0, 200, 163, 105, 255, 0, 97, 91, 79, 253, 25, 92, 191, 138, 200, 255, 0, 132, 167, 80, 231, 254, 90, 255, 0, 74, 0, 200, 162, 155, 145, 235, 70, 71, 173, 0, 58, 138, 110, 71, 173, 25, 30, 180, 0, 234, 41, 185, 30, 180, 100, 122, 208, 3, 168, 166, 228, 122, 209, 145, 235, 64, 22, 108, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 135, 138, 255, 0, 228, 104, 212, 63, 235, 173, 102, 216, 145, 253, 163, 109, 207, 252, 181, 95, 231, 90, 94, 43, 35, 254, 18, 141, 67, 159, 249, 107, 64, 25, 20, 83, 114, 61, 69, 25, 30, 180, 0, 234, 41, 185, 30, 162, 140, 143, 81, 64, 14, 162, 155, 145, 234, 40, 200, 245, 20, 0, 234, 41, 185, 30, 162, 140, 143, 81, 64, 22, 44, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 143, 138, 255, 0, 228, 103, 212, 63, 235, 177, 172, 235, 18, 63, 180, 109, 121, 31, 235, 87, 249, 214, 143, 138, 200, 30, 41, 212, 57, 255, 0, 150, 223, 210, 128, 50, 40, 166, 228, 122, 138, 50, 61, 69, 0, 58, 138, 110, 71, 168, 163, 35, 212, 80, 3, 168, 166, 228, 122, 138, 50, 61, 69, 0, 58, 138, 110, 71, 168, 163, 35, 212, 80, 5, 139, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 163, 226, 159, 249, 25, 245, 31, 250, 236, 107, 58, 196, 143, 237, 27, 94, 71, 250, 213, 254, 117, 163, 226, 178, 63, 225, 41, 212, 57, 255, 0, 150, 180, 1, 145, 69, 55, 35, 212, 81, 145, 234, 40, 1, 212, 83, 114, 61, 69, 25, 30, 162, 128, 29, 69, 55, 35, 212, 81, 145, 234, 40, 1, 212, 83, 114, 61, 69, 25, 30, 162, 128, 44, 216, 255, 0, 200, 74, 219, 254, 186, 175, 243, 173, 95, 18, 127, 200, 201, 125, 255, 0, 93, 127, 165, 100, 216, 145, 253, 163, 109, 207, 252, 181, 95, 231, 90, 222, 36, 255, 0, 145, 146, 251, 254, 186, 255, 0, 74, 184, 110, 124, 239, 17, 255, 0, 187, 199, 215, 244, 102, 85, 20, 81, 90, 31, 26, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 101, 255, 0, 31, 214, 223, 245, 213, 127, 157, 90, 241, 95, 252, 141, 26, 135, 253, 118, 63, 202, 170, 217, 127, 199, 245, 183, 253, 117, 95, 231, 86, 188, 86, 71, 252, 37, 26, 135, 63, 242, 215, 250, 84, 72, 250, 222, 25, 248, 106, 252, 140, 138, 41, 185, 30, 162, 140, 143, 81, 89, 159, 78, 58, 138, 110, 71, 168, 163, 35, 212, 80, 3, 168, 166, 228, 122, 138, 50, 15, 122, 0, 239, 188, 21, 108, 98, 211, 165, 157, 151, 30, 107, 124, 167, 216, 87, 77, 85, 52, 187, 127, 179, 105, 150, 208, 127, 118, 49, 86, 235, 241, 220, 203, 17, 245, 140, 85, 74, 189, 217, 232, 69, 89, 88, 117, 20, 81, 92, 5, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 28, 147, 253, 246, 250, 154, 101, 61, 254, 251, 125, 77, 50, 191, 164, 232, 255, 0, 14, 62, 135, 224, 85, 255, 0, 137, 47, 86, 20, 81, 69, 104, 98, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 98, 55, 222, 63, 90, 109, 57, 190, 241, 250, 211, 107, 241, 42, 191, 196, 103, 166, 20, 81, 69, 102, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 7, 43, 55, 250, 233, 62, 180, 202, 146, 111, 245, 210, 125, 77, 71, 95, 210, 52, 127, 133, 31, 67, 250, 218, 135, 240, 99, 232, 135, 81, 69, 21, 169, 176, 81, 69, 20, 128, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 195, 147, 253, 97, 164, 165, 147, 253, 97, 164, 175, 196, 234, 124, 76, 244, 68, 162, 138, 42, 10, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 57, 73, 191, 215, 63, 214, 163, 169, 38, 255, 0, 92, 255, 0, 90, 142, 191, 163, 232, 127, 14, 62, 136, 252, 6, 175, 198, 253, 66, 138, 40, 173, 204, 66, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 182, 188, 45, 116, 45, 117, 200, 195, 54, 4, 128, 199, 237, 88, 180, 248, 159, 202, 153, 31, 25, 218, 192, 215, 46, 42, 130, 173, 66, 84, 187, 171, 20, 157, 157, 207, 94, 162, 162, 130, 117, 158, 8, 229, 220, 62, 112, 15, 20, 252, 143, 90, 252, 102, 73, 167, 102, 122, 35, 168, 166, 228, 122, 209, 145, 235, 72, 7, 81, 77, 200, 245, 163, 35, 214, 128, 44, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 171, 254, 42, 255, 0, 145, 167, 80, 255, 0, 174, 191, 225, 84, 44, 72, 254, 209, 181, 228, 127, 173, 95, 231, 87, 252, 85, 255, 0, 35, 78, 161, 255, 0, 93, 127, 194, 188, 252, 195, 248, 104, 194, 191, 194, 99, 209, 69, 21, 229, 28, 225, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 5, 139, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 165, 226, 175, 249, 25, 245, 15, 250, 237, 89, 182, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 75, 197, 68, 127, 194, 81, 168, 115, 255, 0, 45, 107, 212, 203, 246, 102, 244, 122, 153, 20, 83, 114, 61, 69, 25, 30, 181, 232, 157, 3, 168, 166, 228, 122, 138, 50, 61, 69, 0, 58, 138, 110, 71, 168, 163, 35, 212, 80, 3, 168, 166, 228, 122, 138, 50, 61, 69, 0, 88, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 157, 98, 71, 246, 141, 175, 35, 253, 106, 255, 0, 58, 209, 241, 81, 31, 240, 148, 234, 28, 255, 0, 203, 106, 0, 200, 162, 155, 145, 234, 40, 200, 245, 20, 0, 234, 41, 185, 30, 162, 140, 143, 81, 64, 14, 162, 155, 145, 234, 40, 200, 245, 20, 0, 234, 41, 185, 30, 162, 140, 143, 81, 64, 22, 44, 63, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 181, 103, 88, 145, 253, 163, 107, 207, 252, 181, 95, 231, 90, 62, 42, 35, 254, 18, 157, 67, 159, 249, 107, 64, 25, 20, 83, 114, 61, 69, 25, 30, 162, 128, 29, 69, 55, 35, 212, 81, 145, 234, 40, 1, 212, 83, 114, 61, 69, 25, 30, 162, 128, 29, 69, 55, 35, 212, 81, 145, 234, 40, 2, 205, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 141, 55, 255, 0, 245, 214, 179, 172, 72, 254, 209, 182, 231, 254, 90, 175, 243, 173, 31, 21, 17, 255, 0, 9, 78, 161, 255, 0, 93, 104, 3, 34, 138, 110, 71, 168, 163, 35, 212, 80, 3, 168, 166, 228, 122, 138, 50, 61, 69, 0, 58, 138, 110, 71, 168, 163, 35, 212, 80, 3, 168, 166, 228, 122, 138, 50, 61, 69, 0, 88, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 93, 223, 128, 63, 228, 111, 241, 231, 253, 133, 87, 255, 0, 69, 138, 225, 44, 72, 254, 209, 181, 228, 127, 173, 95, 231, 93, 223, 128, 63, 228, 111, 241, 231, 253, 133, 87, 255, 0, 69, 138, 0, 239, 168, 162, 138, 0, 40, 162, 140, 208, 7, 141, 252, 70, 248, 197, 169, 248, 43, 197, 178, 104, 246, 154, 101, 181, 196, 75, 10, 73, 190, 86, 32, 229, 135, 181, 114, 95, 240, 210, 58, 231, 253, 0, 236, 63, 239, 227, 86, 31, 199, 191, 249, 41, 243, 127, 215, 172, 63, 202, 188, 194, 128, 61, 175, 254, 26, 71, 92, 255, 0, 160, 29, 135, 253, 252, 106, 63, 225, 164, 117, 207, 250, 1, 216, 127, 223, 198, 175, 20, 162, 128, 61, 103, 87, 248, 197, 169, 248, 212, 88, 104, 215, 122, 109, 173, 188, 77, 125, 4, 134, 72, 152, 147, 195, 143, 90, 245, 93, 123, 92, 177, 183, 215, 111, 32, 151, 195, 240, 92, 72, 175, 131, 43, 57, 203, 87, 204, 26, 23, 252, 140, 26, 103, 253, 125, 197, 255, 0, 161, 138, 250, 23, 197, 95, 242, 52, 234, 31, 245, 218, 128, 44, 255, 0, 194, 69, 166, 255, 0, 208, 175, 107, 255, 0, 125, 154, 63, 225, 34, 211, 127, 232, 87, 181, 255, 0, 190, 205, 115, 244, 80, 7, 65, 255, 0, 9, 22, 155, 255, 0, 66, 189, 175, 253, 246, 104, 255, 0, 132, 139, 77, 255, 0, 161, 94, 215, 254, 251, 53, 207, 209, 64, 29, 7, 252, 36, 90, 111, 253, 10, 246, 191, 247, 217, 163, 254, 18, 45, 55, 254, 133, 123, 95, 251, 236, 215, 63, 69, 0, 116, 31, 240, 145, 105, 191, 244, 43, 218, 255, 0, 223, 102, 143, 248, 72, 180, 223, 250, 21, 237, 127, 239, 179, 92, 253, 20, 1, 210, 218, 248, 131, 78, 146, 242, 21, 95, 12, 218, 163, 151, 0, 62, 243, 199, 53, 115, 95, 215, 44, 45, 245, 219, 200, 37, 240, 253, 181, 196, 138, 252, 202, 207, 203, 87, 41, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 104, 2, 207, 252, 36, 58, 111, 253, 10, 246, 191, 247, 217, 163, 254, 18, 29, 55, 254, 133, 123, 95, 251, 236, 215, 63, 69, 0, 116, 31, 240, 144, 233, 191, 244, 43, 218, 255, 0, 223, 102, 143, 248, 72, 116, 223, 250, 21, 237, 127, 239, 179, 92, 253, 20, 1, 208, 127, 194, 67, 166, 255, 0, 208, 175, 107, 255, 0, 125, 154, 63, 225, 33, 211, 127, 232, 87, 181, 255, 0, 190, 205, 115, 244, 80, 7, 65, 255, 0, 9, 14, 155, 255, 0, 66, 189, 175, 253, 246, 104, 255, 0, 132, 135, 77, 255, 0, 161, 94, 215, 254, 251, 53, 207, 209, 64, 29, 53, 175, 136, 52, 231, 188, 129, 23, 195, 86, 168, 229, 128, 7, 121, 227, 154, 183, 175, 107, 150, 22, 250, 237, 228, 18, 248, 122, 222, 226, 69, 124, 25, 89, 249, 106, 229, 44, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 183, 244, 160, 11, 63, 240, 145, 105, 191, 244, 43, 218, 255, 0, 223, 102, 143, 248, 72, 180, 223, 250, 21, 237, 127, 239, 179, 92, 253, 20, 1, 208, 127, 194, 69, 166, 255, 0, 208, 175, 107, 255, 0, 125, 154, 63, 225, 34, 211, 127, 232, 87, 181, 255, 0, 190, 205, 115, 244, 80, 7, 65, 255, 0, 9, 22, 155, 255, 0, 66, 189, 175, 253, 246, 104, 255, 0, 132, 139, 77, 255, 0, 161, 94, 215, 254, 251, 53, 207, 209, 64, 29, 7, 252, 36, 90, 111, 253, 10, 246, 191, 247, 217, 163, 254, 18, 45, 55, 254, 133, 123, 95, 251, 236, 215, 63, 69, 0, 116, 214, 158, 32, 211, 94, 242, 4, 95, 13, 90, 163, 150, 0, 29, 253, 57, 171, 122, 254, 185, 99, 111, 174, 222, 65, 47, 135, 173, 238, 36, 87, 193, 149, 152, 229, 171, 148, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 223, 210, 128, 44, 255, 0, 194, 69, 166, 255, 0, 208, 175, 107, 255, 0, 125, 154, 63, 225, 34, 211, 127, 232, 87, 181, 255, 0, 190, 205, 115, 244, 80, 7, 65, 255, 0, 9, 22, 155, 255, 0, 66, 189, 175, 253, 246, 104, 255, 0, 132, 139, 77, 255, 0, 161, 94, 215, 254, 251, 53, 207, 209, 64, 29, 7, 252, 36, 90, 111, 253, 10, 246, 191, 247, 217, 163, 254, 18, 45, 55, 254, 133, 123, 95, 251, 236, 215, 63, 69, 0, 116, 31, 240, 145, 105, 191, 244, 43, 218, 255, 0, 223, 102, 143, 248, 72, 180, 223, 250, 21, 237, 127, 239, 179, 92, 253, 20, 1, 210, 218, 248, 135, 78, 146, 242, 21, 95, 12, 218, 171, 23, 0, 55, 153, 211, 154, 173, 226, 79, 249, 25, 47, 191, 235, 175, 244, 172, 155, 31, 249, 9, 91, 127, 215, 85, 254, 117, 173, 226, 79, 249, 25, 47, 191, 235, 175, 244, 171, 134, 231, 206, 241, 31, 251, 188, 125, 127, 70, 101, 81, 69, 21, 161, 241, 161, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 95, 241, 253, 109, 255, 0, 93, 87, 249, 215, 73, 175, 235, 150, 54, 250, 237, 228, 18, 248, 126, 11, 137, 21, 240, 101, 103, 57, 106, 230, 236, 191, 227, 250, 219, 254, 186, 175, 243, 171, 94, 42, 255, 0, 145, 159, 80, 255, 0, 174, 223, 210, 162, 71, 214, 240, 207, 195, 87, 228, 89, 255, 0, 132, 139, 77, 255, 0, 161, 94, 215, 254, 251, 52, 127, 194, 69, 166, 255, 0, 208, 175, 107, 255, 0, 125, 154, 231, 232, 172, 207, 167, 58, 15, 248, 72, 180, 223, 250, 21, 237, 127, 239, 179, 71, 252, 36, 90, 111, 253, 10, 246, 191, 247, 217, 174, 126, 138, 0, 232, 127, 225, 34, 211, 63, 232, 87, 181, 255, 0, 191, 134, 174, 105, 122, 190, 157, 125, 169, 67, 110, 60, 53, 108, 155, 219, 239, 6, 206, 43, 146, 174, 155, 193, 80, 121, 154, 156, 147, 242, 60, 184, 241, 245, 205, 112, 102, 184, 143, 171, 224, 167, 87, 203, 241, 42, 154, 187, 72, 239, 168, 162, 138, 252, 116, 244, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 14, 73, 254, 251, 125, 77, 50, 158, 255, 0, 125, 190, 166, 153, 95, 210, 116, 127, 135, 31, 67, 240, 42, 255, 0, 196, 151, 171, 10, 40, 162, 180, 49, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 49, 27, 239, 31, 173, 54, 156, 223, 120, 253, 105, 181, 248, 149, 95, 226, 51, 211, 10, 40, 162, 179, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 175, 49, 185, 248, 159, 127, 5, 220, 176, 174, 159, 109, 133, 98, 58, 154, 244, 234, 249, 219, 84, 255, 0, 144, 157, 207, 253, 116, 53, 238, 228, 152, 106, 85, 221, 79, 106, 175, 107, 31, 73, 195, 184, 74, 24, 135, 63, 109, 27, 218, 223, 169, 219, 127, 194, 212, 212, 127, 232, 29, 109, 249, 154, 79, 248, 90, 154, 143, 253, 3, 173, 127, 51, 94, 127, 69, 125, 15, 246, 110, 19, 249, 17, 245, 63, 217, 56, 31, 249, 244, 143, 64, 255, 0, 133, 169, 168, 255, 0, 208, 58, 215, 243, 53, 107, 79, 248, 151, 127, 117, 169, 218, 219, 201, 167, 219, 4, 150, 101, 140, 144, 78, 64, 39, 21, 230, 181, 127, 67, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 33, 71, 246, 110, 19, 249, 16, 127, 100, 224, 127, 231, 210, 59, 175, 25, 120, 134, 127, 15, 248, 187, 84, 210, 160, 130, 57, 34, 181, 156, 198, 174, 231, 146, 43, 15, 254, 19, 171, 191, 249, 244, 135, 243, 167, 124, 83, 255, 0, 146, 159, 226, 15, 250, 251, 63, 200, 87, 33, 94, 202, 204, 113, 105, 91, 218, 51, 232, 86, 107, 141, 74, 202, 171, 58, 223, 248, 78, 174, 191, 231, 210, 31, 206, 143, 248, 78, 174, 191, 231, 210, 31, 206, 185, 42, 41, 255, 0, 105, 98, 255, 0, 157, 149, 253, 175, 142, 255, 0, 159, 172, 235, 127, 225, 58, 187, 255, 0, 159, 56, 127, 58, 238, 34, 99, 36, 74, 255, 0, 222, 80, 107, 198, 171, 216, 173, 63, 227, 210, 47, 247, 71, 242, 175, 115, 36, 196, 214, 175, 41, 42, 146, 185, 244, 92, 61, 140, 175, 136, 148, 213, 89, 94, 214, 39, 162, 138, 43, 232, 79, 170, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 48, 228, 255, 0, 88, 105, 41, 100, 255, 0, 88, 105, 43, 241, 58, 159, 19, 61, 17, 40, 162, 138, 130, 130, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 14, 82, 111, 245, 207, 245, 168, 234, 73, 191, 215, 63, 214, 163, 175, 232, 250, 31, 195, 143, 162, 63, 1, 171, 241, 191, 80, 162, 138, 43, 115, 16, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 3, 216, 124, 25, 226, 59, 1, 225, 123, 91, 121, 124, 61, 109, 60, 144, 126, 236, 202, 95, 150, 247, 174, 135, 254, 18, 45, 55, 254, 133, 123, 95, 251, 249, 94, 87, 224, 137, 254, 107, 155, 110, 57, 196, 153, 205, 118, 117, 249, 46, 123, 135, 246, 24, 249, 199, 187, 191, 222, 119, 82, 119, 138, 58, 15, 248, 72, 52, 223, 250, 21, 237, 127, 239, 237, 31, 240, 144, 105, 191, 244, 43, 218, 255, 0, 223, 218, 231, 232, 175, 32, 212, 232, 63, 225, 32, 211, 127, 232, 87, 181, 255, 0, 191, 180, 127, 194, 65, 166, 255, 0, 208, 175, 107, 255, 0, 127, 107, 159, 162, 128, 58, 107, 95, 16, 233, 207, 121, 2, 47, 134, 109, 81, 203, 0, 15, 153, 211, 154, 206, 241, 87, 252, 141, 58, 135, 253, 117, 255, 0, 10, 161, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 175, 248, 171, 254, 70, 157, 67, 254, 186, 255, 0, 133, 121, 249, 135, 240, 209, 133, 127, 132, 199, 162, 138, 43, 202, 57, 194, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 11, 22, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 172, 215, 245, 203, 8, 53, 203, 200, 37, 240, 253, 181, 196, 138, 252, 202, 207, 203, 87, 39, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 188, 85, 255, 0, 35, 69, 255, 0, 253, 117, 175, 83, 47, 217, 155, 209, 234, 89, 255, 0, 132, 139, 77, 255, 0, 161, 94, 215, 254, 251, 52, 127, 194, 69, 166, 255, 0, 208, 175, 107, 255, 0, 125, 154, 231, 232, 175, 68, 232, 58, 15, 248, 72, 180, 223, 250, 21, 237, 127, 239, 179, 71, 252, 36, 90, 111, 253, 10, 246, 191, 247, 217, 174, 126, 138, 0, 232, 63, 225, 34, 211, 127, 232, 87, 181, 255, 0, 190, 205, 31, 240, 145, 105, 191, 244, 43, 218, 255, 0, 223, 102, 185, 250, 40, 3, 160, 255, 0, 132, 139, 77, 255, 0, 161, 94, 215, 254, 251, 52, 127, 194, 69, 166, 255, 0, 208, 175, 107, 255, 0, 125, 154, 231, 232, 160, 14, 154, 215, 196, 58, 116, 151, 144, 42, 248, 102, 213, 28, 176, 0, 239, 233, 205, 91, 215, 245, 203, 27, 125, 118, 242, 9, 124, 61, 111, 113, 34, 190, 12, 172, 231, 45, 92, 165, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 140, 250, 135, 253, 118, 254, 148, 1, 103, 254, 18, 29, 55, 254, 133, 123, 95, 251, 236, 209, 255, 0, 9, 14, 155, 255, 0, 66, 189, 175, 253, 246, 107, 159, 162, 128, 58, 15, 248, 72, 116, 223, 250, 21, 237, 127, 239, 179, 71, 252, 36, 58, 111, 253, 10, 246, 191, 247, 217, 174, 126, 138, 0, 232, 63, 225, 33, 211, 127, 232, 87, 181, 255, 0, 190, 205, 31, 240, 144, 233, 191, 244, 43, 218, 255, 0, 223, 102, 185, 250, 40, 3, 160, 255, 0, 132, 135, 77, 255, 0, 161, 94, 215, 254, 251, 52, 127, 194, 67, 166, 255, 0, 208, 175, 107, 255, 0, 125, 154, 231, 232, 160, 14, 154, 215, 196, 26, 115, 222, 64, 139, 225, 171, 84, 114, 192, 3, 188, 241, 205, 91, 215, 245, 203, 27, 125, 114, 242, 9, 124, 61, 111, 113, 34, 190, 12, 172, 252, 181, 114, 150, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 52, 234, 31, 245, 219, 250, 80, 5, 159, 248, 72, 116, 223, 250, 21, 237, 127, 239, 179, 71, 252, 36, 58, 111, 253, 10, 246, 191, 247, 217, 174, 126, 138, 0, 232, 63, 225, 33, 211, 127, 232, 87, 181, 255, 0, 190, 205, 31, 240, 144, 233, 191, 244, 43, 218, 255, 0, 223, 102, 185, 250, 40, 3, 160, 255, 0, 132, 135, 77, 255, 0, 161, 94, 215, 254, 251, 52, 127, 194, 67, 166, 255, 0, 208, 175, 107, 255, 0, 125, 154, 231, 232, 160, 14, 131, 254, 18, 29, 55, 254, 133, 123, 95, 251, 236, 209, 255, 0, 9, 14, 155, 255, 0, 66, 189, 175, 253, 246, 107, 159, 162, 128, 58, 91, 95, 16, 105, 207, 121, 10, 167, 134, 109, 145, 203, 128, 27, 121, 227, 154, 185, 175, 235, 150, 22, 250, 237, 228, 18, 248, 126, 218, 226, 69, 126, 101, 103, 229, 171, 148, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 166, 255, 0, 254, 186, 208, 5, 159, 248, 72, 180, 223, 250, 21, 237, 127, 239, 233, 163, 254, 18, 45, 55, 254, 133, 123, 95, 251, 250, 107, 159, 162, 128, 58, 31, 248, 72, 116, 207, 250, 21, 237, 127, 239, 186, 63, 225, 33, 211, 63, 232, 87, 181, 255, 0, 190, 235, 158, 162, 128, 58, 31, 248, 72, 116, 207, 250, 21, 237, 127, 239, 186, 63, 225, 33, 211, 63, 232, 87, 181, 255, 0, 190, 235, 158, 162, 128, 58, 31, 248, 72, 116, 207, 250, 21, 237, 127, 239, 186, 63, 225, 33, 211, 63, 232, 87, 181, 255, 0, 190, 235, 158, 162, 128, 58, 107, 95, 16, 105, 175, 121, 2, 175, 134, 109, 145, 217, 192, 13, 188, 241, 205, 113, 26, 175, 197, 27, 255, 0, 0, 124, 64, 241, 93, 165, 157, 133, 189, 210, 92, 223, 9, 9, 153, 136, 32, 133, 3, 181, 107, 216, 255, 0, 200, 66, 215, 254, 186, 175, 243, 175, 43, 248, 169, 255, 0, 37, 63, 196, 63, 245, 246, 127, 144, 160, 14, 243, 254, 26, 71, 92, 255, 0, 160, 29, 135, 253, 252, 106, 63, 225, 164, 117, 207, 250, 1, 216, 127, 223, 198, 175, 20, 162, 128, 61, 175, 254, 26, 71, 92, 255, 0, 160, 29, 135, 253, 252, 106, 219, 240, 135, 199, 77, 87, 196, 126, 45, 211, 180, 105, 244, 155, 56, 99, 187, 155, 203, 103, 141, 219, 35, 173, 124, 243, 93, 119, 194, 207, 249, 41, 254, 31, 255, 0, 175, 177, 252, 141, 0, 116, 63, 30, 255, 0, 228, 167, 205, 255, 0, 94, 176, 255, 0, 42, 243, 10, 244, 255, 0, 143, 127, 242, 83, 230, 255, 0, 175, 88, 127, 149, 121, 133, 0, 20, 81, 69, 0, 95, 208, 191, 228, 96, 211, 127, 235, 234, 47, 253, 12, 87, 208, 190, 43, 255, 0, 145, 163, 80, 255, 0, 174, 213, 243, 214, 133, 255, 0, 35, 6, 155, 255, 0, 95, 81, 127, 232, 98, 190, 133, 241, 95, 252, 141, 26, 135, 253, 118, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 118, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 159, 99, 255, 0, 33, 27, 111, 250, 236, 191, 206, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 183, 244, 172, 235, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 253, 40, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 183, 244, 172, 235, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 253, 40, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 37, 109, 255, 0, 93, 151, 249, 214, 175, 137, 63, 228, 100, 190, 255, 0, 174, 191, 210, 178, 172, 127, 228, 37, 109, 255, 0, 93, 151, 249, 214, 175, 137, 63, 228, 100, 190, 255, 0, 174, 191, 210, 174, 27, 159, 59, 196, 127, 238, 241, 245, 253, 25, 149, 69, 20, 86, 135, 198, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 89, 127, 199, 245, 183, 253, 117, 95, 231, 86, 188, 87, 255, 0, 35, 70, 161, 255, 0, 93, 143, 242, 170, 182, 95, 241, 253, 109, 255, 0, 93, 87, 249, 213, 175, 21, 255, 0, 200, 209, 168, 127, 215, 99, 252, 170, 36, 125, 111, 12, 252, 53, 126, 70, 69, 20, 81, 89, 159, 78, 20, 81, 69, 0, 21, 222, 120, 38, 1, 30, 147, 44, 185, 207, 153, 39, 79, 76, 87, 7, 94, 159, 160, 219, 253, 159, 67, 181, 93, 187, 78, 220, 156, 122, 154, 249, 110, 44, 173, 203, 130, 84, 251, 179, 122, 11, 91, 154, 180, 81, 69, 126, 110, 117, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 28, 147, 253, 246, 250, 154, 101, 61, 254, 251, 125, 77, 50, 191, 164, 232, 255, 0, 14, 62, 135, 224, 85, 255, 0, 137, 47, 86, 20, 81, 69, 104, 98, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 98, 55, 222, 63, 90, 109, 57, 190, 241, 250, 211, 107, 241, 42, 191, 196, 103, 166, 20, 81, 69, 102, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 95, 58, 234, 95, 242, 20, 186, 255, 0, 174, 173, 252, 235, 232, 170, 249, 215, 82, 255, 0, 144, 165, 215, 253, 117, 111, 231, 95, 73, 195, 219, 212, 249, 126, 167, 214, 240, 182, 245, 126, 95, 169, 86, 138, 40, 175, 167, 62, 196, 42, 254, 135, 255, 0, 35, 6, 155, 255, 0, 95, 81, 127, 232, 66, 168, 85, 253, 15, 254, 70, 13, 55, 254, 190, 162, 255, 0, 208, 133, 0, 111, 252, 83, 255, 0, 146, 159, 226, 15, 250, 251, 63, 200, 87, 35, 93, 119, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 114, 52, 0, 81, 69, 20, 0, 87, 177, 218, 255, 0, 199, 180, 95, 238, 15, 229, 94, 57, 94, 199, 107, 255, 0, 30, 209, 127, 184, 63, 149, 125, 23, 15, 252, 85, 62, 71, 213, 240, 183, 199, 87, 209, 126, 164, 212, 81, 69, 125, 65, 246, 97, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 6, 28, 159, 235, 13, 37, 44, 159, 235, 13, 37, 126, 39, 83, 226, 103, 162, 37, 20, 81, 80, 80, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 202, 77, 254, 185, 254, 181, 29, 73, 55, 250, 231, 250, 212, 117, 253, 31, 67, 248, 113, 244, 71, 224, 53, 126, 55, 234, 20, 81, 69, 110, 98, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 108, 248, 94, 115, 6, 187, 7, 25, 223, 242, 126, 117, 233, 21, 228, 150, 115, 24, 47, 33, 148, 54, 221, 174, 14, 125, 43, 214, 20, 137, 20, 56, 228, 17, 156, 215, 231, 188, 95, 70, 213, 225, 87, 186, 252, 191, 225, 206, 186, 15, 160, 250, 40, 162, 190, 64, 232, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 87, 188, 85, 255, 0, 35, 78, 161, 255, 0, 93, 127, 194, 168, 216, 255, 0, 200, 70, 215, 254, 186, 175, 243, 171, 222, 42, 255, 0, 145, 167, 80, 255, 0, 174, 191, 225, 92, 57, 135, 192, 140, 43, 252, 38, 61, 20, 81, 94, 65, 206, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 88, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 90, 94, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 155, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 188, 85, 255, 0, 35, 62, 161, 255, 0, 93, 107, 212, 203, 246, 102, 244, 122, 153, 20, 81, 69, 122, 39, 64, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 140, 250, 135, 253, 118, 254, 149, 157, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 191, 165, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 58, 135, 253, 118, 254, 149, 157, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 191, 165, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 109, 191, 235, 178, 255, 0, 58, 208, 241, 87, 252, 140, 250, 135, 253, 117, 172, 251, 31, 249, 8, 219, 127, 215, 101, 254, 117, 161, 226, 175, 249, 25, 245, 15, 250, 235, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 188, 175, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 189, 82, 199, 254, 66, 22, 191, 245, 213, 127, 157, 121, 95, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 0, 114, 20, 81, 69, 0, 21, 215, 124, 44, 255, 0, 146, 159, 225, 255, 0, 250, 251, 31, 200, 215, 35, 93, 119, 194, 207, 249, 41, 254, 31, 255, 0, 175, 177, 252, 141, 0, 116, 63, 30, 255, 0, 228, 167, 205, 255, 0, 94, 176, 255, 0, 42, 243, 10, 244, 255, 0, 143, 127, 242, 83, 230, 255, 0, 175, 88, 127, 149, 121, 133, 0, 20, 81, 69, 0, 95, 208, 191, 228, 96, 211, 127, 235, 234, 47, 253, 12, 87, 208, 190, 43, 255, 0, 145, 163, 80, 255, 0, 174, 213, 243, 214, 133, 255, 0, 35, 6, 155, 255, 0, 95, 81, 127, 232, 98, 190, 133, 241, 95, 252, 141, 26, 135, 253, 118, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 118, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 159, 99, 255, 0, 33, 27, 111, 250, 236, 191, 206, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 183, 244, 172, 235, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 253, 40, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 183, 244, 172, 235, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 253, 40, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 37, 109, 255, 0, 93, 151, 249, 214, 175, 137, 63, 228, 100, 190, 255, 0, 174, 191, 210, 178, 172, 127, 228, 37, 109, 255, 0, 93, 151, 249, 214, 175, 137, 63, 228, 100, 190, 255, 0, 174, 191, 210, 174, 27, 159, 59, 196, 127, 238, 241, 245, 253, 25, 149, 69, 20, 86, 135, 198, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 89, 127, 199, 245, 183, 253, 117, 95, 231, 86, 188, 87, 255, 0, 35, 70, 161, 255, 0, 93, 143, 242, 170, 182, 95, 241, 253, 109, 255, 0, 93, 87, 249, 213, 175, 21, 255, 0, 200, 209, 168, 127, 215, 99, 252, 170, 36, 125, 111, 12, 252, 53, 126, 70, 69, 20, 81, 89, 159, 78, 20, 81, 69, 0, 62, 21, 243, 167, 141, 27, 161, 96, 43, 215, 98, 79, 42, 36, 65, 209, 70, 43, 203, 244, 24, 4, 250, 229, 170, 178, 229, 119, 100, 215, 169, 87, 193, 113, 117, 78, 106, 212, 169, 246, 77, 255, 0, 95, 113, 213, 65, 105, 113, 212, 81, 69, 124, 89, 208, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 114, 79, 247, 219, 234, 105, 148, 247, 251, 237, 245, 52, 202, 254, 147, 163, 252, 56, 250, 31, 129, 87, 254, 36, 189, 88, 81, 69, 21, 161, 136, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 136, 223, 120, 253, 105, 180, 230, 251, 199, 235, 77, 175, 196, 170, 255, 0, 17, 158, 152, 81, 69, 21, 152, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 124, 235, 169, 255, 0, 200, 86, 235, 254, 186, 183, 243, 175, 162, 171, 231, 93, 79, 254, 66, 183, 95, 245, 213, 191, 157, 125, 39, 15, 111, 83, 229, 250, 159, 91, 194, 219, 213, 249, 126, 165, 90, 40, 162, 190, 156, 251, 16, 171, 250, 31, 252, 140, 26, 111, 253, 125, 69, 255, 0, 161, 10, 161, 87, 244, 63, 249, 24, 52, 223, 250, 250, 139, 255, 0, 66, 20, 1, 191, 241, 79, 254, 74, 127, 136, 63, 235, 236, 255, 0, 33, 92, 141, 117, 223, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 21, 200, 208, 1, 69, 20, 80, 1, 94, 199, 107, 255, 0, 30, 209, 127, 184, 63, 149, 120, 229, 123, 29, 175, 252, 123, 69, 254, 224, 254, 85, 244, 92, 63, 241, 84, 249, 31, 87, 194, 223, 29, 95, 69, 250, 147, 81, 69, 21, 245, 7, 217, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 24, 114, 127, 172, 52, 148, 178, 127, 172, 52, 149, 248, 157, 79, 137, 158, 136, 148, 81, 69, 65, 65, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 7, 41, 55, 250, 231, 250, 212, 117, 36, 223, 235, 159, 235, 81, 215, 244, 125, 15, 225, 199, 209, 31, 128, 213, 248, 223, 168, 81, 69, 21, 185, 136, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 87, 169, 233, 19, 27, 141, 30, 214, 98, 49, 152, 135, 2, 188, 178, 189, 15, 194, 83, 121, 154, 18, 41, 124, 149, 98, 49, 232, 43, 228, 184, 182, 149, 240, 113, 169, 217, 254, 103, 69, 7, 173, 141, 234, 40, 162, 191, 59, 58, 194, 138, 40, 160, 9, 236, 127, 228, 35, 107, 255, 0, 93, 87, 249, 213, 239, 21, 127, 200, 211, 168, 127, 215, 95, 240, 170, 54, 63, 242, 17, 181, 255, 0, 174, 171, 252, 234, 247, 138, 191, 228, 105, 212, 63, 235, 175, 248, 87, 14, 97, 240, 35, 10, 255, 0, 9, 143, 69, 20, 87, 144, 115, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 22, 44, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 151, 138, 191, 228, 103, 212, 63, 235, 173, 102, 216, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 47, 21, 127, 200, 207, 168, 127, 215, 90, 245, 50, 253, 153, 189, 30, 166, 69, 20, 81, 94, 137, 208, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 191, 165, 103, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 207, 168, 127, 215, 111, 233, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 191, 165, 103, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 211, 168, 127, 215, 111, 233, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 79, 99, 255, 0, 33, 27, 111, 250, 236, 191, 206, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 107, 62, 199, 254, 66, 54, 223, 245, 217, 127, 157, 104, 120, 171, 254, 70, 125, 67, 254, 186, 208, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 175, 43, 248, 167, 255, 0, 37, 63, 196, 31, 245, 246, 127, 144, 175, 84, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 94, 87, 241, 79, 254, 74, 127, 136, 63, 235, 236, 255, 0, 33, 64, 28, 133, 20, 81, 64, 5, 117, 223, 11, 63, 228, 167, 248, 127, 254, 190, 199, 242, 53, 200, 215, 93, 240, 179, 254, 74, 127, 135, 255, 0, 235, 236, 127, 35, 64, 29, 15, 199, 191, 249, 41, 243, 127, 215, 172, 63, 202, 188, 194, 189, 63, 227, 223, 252, 148, 249, 191, 235, 214, 31, 229, 94, 97, 64, 5, 20, 81, 64, 23, 244, 47, 249, 24, 52, 223, 250, 250, 139, 255, 0, 67, 21, 244, 47, 138, 255, 0, 228, 104, 212, 63, 235, 181, 124, 245, 161, 127, 200, 193, 166, 255, 0, 215, 212, 95, 250, 24, 175, 161, 124, 87, 255, 0, 35, 70, 161, 255, 0, 93, 168, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 35, 109, 255, 0, 93, 151, 249, 214, 135, 138, 191, 228, 103, 212, 63, 235, 173, 103, 216, 255, 0, 200, 70, 219, 254, 187, 47, 243, 173, 15, 21, 127, 200, 207, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 253, 43, 58, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 187, 127, 74, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 253, 43, 58, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 187, 127, 74, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 123, 31, 249, 9, 91, 127, 215, 101, 254, 117, 171, 226, 79, 249, 25, 47, 191, 235, 175, 244, 172, 171, 31, 249, 9, 91, 127, 215, 101, 254, 117, 171, 226, 79, 249, 25, 47, 191, 235, 175, 244, 171, 134, 231, 206, 241, 31, 251, 188, 125, 127, 70, 101, 81, 69, 21, 161, 241, 161, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 95, 241, 253, 109, 255, 0, 93, 87, 249, 213, 175, 21, 255, 0, 200, 209, 168, 127, 215, 99, 252, 170, 173, 151, 252, 127, 91, 127, 215, 85, 254, 117, 107, 197, 127, 242, 52, 106, 31, 245, 216, 255, 0, 42, 137, 31, 91, 195, 63, 13, 95, 145, 145, 69, 20, 86, 103, 211, 133, 20, 81, 64, 29, 15, 131, 85, 206, 180, 88, 12, 160, 136, 230, 189, 6, 184, 191, 3, 68, 222, 117, 212, 248, 249, 48, 23, 241, 174, 210, 191, 49, 226, 106, 156, 249, 131, 93, 146, 95, 215, 222, 118, 81, 94, 232, 234, 40, 162, 190, 112, 216, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 228, 159, 239, 183, 212, 211, 41, 239, 247, 219, 234, 105, 149, 253, 39, 71, 248, 113, 244, 63, 2, 175, 252, 73, 122, 176, 162, 138, 43, 67, 16, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 3, 17, 190, 241, 250, 211, 105, 205, 247, 143, 214, 155, 95, 137, 85, 254, 35, 61, 48, 162, 138, 43, 48, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 249, 215, 83, 255, 0, 144, 173, 215, 253, 117, 111, 231, 95, 69, 87, 206, 186, 159, 252, 133, 110, 191, 235, 171, 127, 58, 250, 78, 30, 222, 167, 203, 245, 62, 183, 133, 183, 171, 242, 253, 74, 180, 81, 69, 125, 57, 246, 33, 87, 244, 63, 249, 24, 52, 223, 250, 250, 139, 255, 0, 66, 21, 66, 175, 232, 127, 242, 48, 105, 191, 245, 245, 23, 254, 132, 40, 3, 127, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 185, 26, 235, 190, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 43, 145, 160, 2, 138, 40, 160, 2, 189, 142, 215, 254, 61, 162, 255, 0, 112, 127, 42, 241, 202, 246, 59, 95, 248, 246, 139, 253, 193, 252, 171, 232, 184, 127, 226, 169, 242, 62, 175, 133, 190, 58, 190, 139, 245, 38, 162, 138, 43, 234, 15, 179, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 48, 228, 255, 0, 88, 105, 41, 100, 255, 0, 88, 105, 43, 241, 58, 159, 19, 61, 17, 40, 162, 138, 130, 130, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 14, 82, 111, 245, 207, 245, 168, 234, 73, 191, 215, 63, 214, 163, 175, 232, 250, 31, 195, 143, 162, 63, 1, 171, 241, 191, 80, 162, 138, 43, 115, 16, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 174, 211, 192, 242, 47, 147, 117, 30, 126, 125, 192, 227, 219, 21, 197, 215, 79, 224, 153, 86, 61, 74, 104, 207, 222, 104, 184, 252, 43, 194, 207, 233, 115, 229, 181, 99, 243, 252, 77, 105, 59, 73, 29, 213, 20, 81, 95, 149, 157, 193, 69, 20, 80, 4, 246, 63, 242, 17, 181, 255, 0, 174, 171, 252, 234, 247, 138, 191, 228, 105, 212, 63, 235, 175, 248, 85, 27, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 123, 197, 95, 242, 52, 234, 31, 245, 215, 252, 43, 135, 48, 248, 17, 133, 127, 132, 199, 162, 138, 43, 200, 57, 194, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 11, 22, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 75, 197, 95, 242, 51, 234, 31, 245, 214, 179, 108, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 151, 138, 191, 228, 103, 212, 63, 235, 173, 122, 153, 126, 204, 222, 143, 83, 34, 138, 40, 175, 68, 232, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 223, 210, 179, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 183, 244, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 167, 80, 255, 0, 174, 223, 210, 179, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 105, 212, 63, 235, 183, 244, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 118, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 159, 99, 255, 0, 33, 27, 111, 250, 236, 191, 206, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 215, 149, 252, 83, 255, 0, 146, 159, 226, 15, 250, 251, 63, 200, 87, 170, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 175, 43, 248, 167, 255, 0, 37, 63, 196, 31, 245, 246, 127, 144, 160, 14, 66, 138, 40, 160, 2, 186, 239, 133, 159, 242, 83, 252, 63, 255, 0, 95, 99, 249, 26, 228, 107, 174, 248, 89, 255, 0, 37, 63, 195, 255, 0, 245, 246, 63, 145, 160, 14, 135, 227, 223, 252, 148, 249, 191, 235, 214, 31, 229, 94, 97, 94, 159, 241, 239, 254, 74, 132, 255, 0, 245, 235, 15, 242, 175, 48, 160, 2, 138, 40, 160, 11, 250, 23, 252, 140, 26, 111, 253, 125, 69, 255, 0, 161, 138, 250, 23, 197, 127, 242, 52, 106, 31, 245, 218, 190, 122, 208, 191, 228, 96, 211, 63, 235, 238, 47, 253, 12, 87, 208, 190, 43, 255, 0, 145, 163, 80, 255, 0, 174, 212, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 246, 63, 242, 17, 182, 255, 0, 174, 203, 252, 235, 67, 197, 95, 242, 52, 234, 31, 245, 214, 179, 236, 71, 252, 76, 109, 191, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 26, 135, 253, 117, 160, 12, 122, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 118, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 223, 210, 179, 236, 127, 228, 35, 107, 255, 0, 93, 151, 249, 214, 135, 138, 191, 228, 104, 212, 63, 235, 177, 254, 84, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 17, 181, 255, 0, 174, 203, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 219, 250, 86, 125, 143, 252, 132, 109, 127, 235, 178, 255, 0, 58, 208, 241, 87, 252, 141, 26, 135, 253, 118, 63, 202, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 86, 223, 245, 217, 127, 157, 106, 248, 151, 254, 70, 75, 255, 0, 250, 235, 253, 43, 42, 195, 254, 66, 54, 223, 245, 213, 127, 157, 106, 248, 151, 254, 70, 75, 255, 0, 250, 235, 253, 42, 225, 185, 243, 188, 71, 254, 239, 31, 95, 209, 153, 84, 81, 69, 104, 124, 104, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 151, 252, 127, 91, 127, 215, 85, 254, 117, 107, 197, 127, 242, 52, 106, 31, 245, 216, 255, 0, 42, 171, 101, 255, 0, 31, 214, 223, 245, 213, 127, 157, 92, 241, 95, 252, 141, 26, 135, 253, 118, 254, 149, 18, 62, 183, 134, 126, 26, 191, 35, 26, 138, 40, 172, 207, 167, 10, 40, 162, 128, 59, 175, 4, 194, 235, 167, 79, 41, 251, 175, 39, 203, 248, 87, 81, 88, 62, 15, 4, 104, 43, 145, 140, 179, 17, 154, 222, 175, 200, 243, 169, 243, 227, 235, 75, 204, 238, 167, 240, 161, 212, 81, 69, 121, 70, 129, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 7, 37, 39, 250, 214, 250, 154, 101, 61, 255, 0, 214, 63, 214, 153, 95, 210, 84, 127, 133, 31, 67, 240, 42, 223, 196, 151, 168, 81, 69, 21, 169, 136, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 136, 223, 120, 253, 105, 180, 230, 251, 199, 235, 77, 175, 196, 170, 252, 76, 244, 194, 138, 40, 172, 192, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 43, 231, 93, 79, 254, 66, 183, 95, 245, 213, 191, 157, 125, 21, 95, 59, 106, 127, 242, 20, 186, 255, 0, 174, 135, 249, 215, 210, 112, 246, 245, 62, 95, 169, 245, 188, 45, 189, 95, 151, 234, 84, 162, 138, 43, 233, 207, 177, 10, 191, 161, 255, 0, 200, 193, 166, 255, 0, 215, 212, 95, 250, 16, 170, 21, 127, 67, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 33, 64, 27, 255, 0, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 21, 200, 215, 93, 241, 79, 254, 74, 127, 136, 63, 235, 236, 255, 0, 33, 92, 141, 0, 20, 81, 69, 0, 21, 236, 86, 223, 241, 237, 23, 253, 115, 31, 202, 188, 115, 181, 123, 37, 183, 252, 122, 197, 255, 0, 92, 199, 242, 175, 162, 225, 255, 0, 138, 167, 200, 250, 190, 22, 248, 234, 250, 47, 212, 154, 138, 40, 175, 169, 62, 204, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 64, 20, 81, 69, 48, 10, 40, 162, 144, 24, 114, 127, 172, 52, 148, 178, 127, 172, 52, 149, 248, 149, 79, 137, 158, 136, 148, 82, 209, 82, 49, 40, 162, 138, 6, 20, 82, 209, 64, 132, 162, 138, 40, 24, 81, 75, 69, 2, 18, 138, 90, 40, 1, 40, 165, 162, 128, 18, 138, 90, 40, 1, 40, 162, 138, 6, 114, 147, 127, 174, 127, 173, 71, 82, 77, 254, 185, 254, 181, 29, 127, 71, 208, 254, 28, 125, 17, 248, 5, 95, 141, 250, 133, 20, 81, 91, 153, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 109, 248, 86, 101, 135, 94, 139, 119, 241, 2, 163, 235, 88, 149, 165, 161, 16, 53, 203, 34, 72, 31, 56, 174, 28, 194, 159, 180, 194, 213, 143, 147, 252, 138, 142, 232, 244, 250, 40, 162, 191, 28, 61, 16, 162, 138, 40, 2, 123, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 123, 197, 95, 242, 52, 234, 31, 245, 215, 252, 42, 141, 136, 255, 0, 137, 141, 175, 253, 117, 95, 231, 87, 188, 85, 255, 0, 35, 78, 161, 255, 0, 93, 127, 194, 184, 115, 15, 129, 24, 87, 248, 76, 122, 40, 162, 188, 131, 156, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 177, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 188, 85, 255, 0, 35, 62, 161, 255, 0, 93, 107, 54, 199, 254, 66, 22, 191, 245, 213, 127, 157, 105, 120, 171, 254, 70, 139, 255, 0, 250, 235, 94, 166, 95, 179, 55, 163, 212, 200, 162, 138, 43, 209, 58, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 183, 244, 172, 251, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 161, 226, 175, 249, 25, 245, 15, 250, 237, 253, 40, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 63, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 105, 212, 63, 235, 183, 244, 172, 235, 1, 255, 0, 19, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 191, 165, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 109, 191, 235, 178, 255, 0, 58, 208, 241, 87, 252, 141, 58, 135, 253, 117, 172, 251, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 25, 245, 15, 250, 235, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 11, 95, 250, 234, 191, 204, 87, 149, 252, 83, 255, 0, 146, 159, 226, 15, 250, 251, 63, 200, 87, 170, 216, 255, 0, 200, 66, 215, 254, 186, 175, 243, 21, 229, 95, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 20, 1, 200, 81, 69, 20, 0, 87, 93, 240, 179, 254, 74, 127, 135, 255, 0, 235, 236, 127, 35, 92, 141, 117, 223, 11, 63, 228, 167, 248, 127, 254, 190, 199, 242, 52, 1, 244, 7, 141, 190, 13, 216, 248, 215, 196, 114, 107, 19, 234, 247, 22, 178, 52, 107, 30, 196, 140, 17, 199, 214, 185, 239, 248, 102, 205, 43, 254, 134, 11, 223, 251, 240, 181, 237, 244, 80, 7, 136, 127, 195, 54, 105, 95, 244, 48, 94, 255, 0, 223, 133, 163, 254, 25, 179, 74, 255, 0, 161, 130, 247, 254, 252, 45, 123, 125, 20, 1, 243, 167, 137, 254, 13, 216, 248, 38, 214, 195, 88, 182, 213, 238, 46, 100, 93, 66, 222, 63, 46, 72, 192, 28, 184, 244, 174, 243, 95, 182, 240, 203, 235, 183, 134, 238, 250, 245, 39, 223, 251, 197, 141, 120, 6, 180, 62, 47, 127, 200, 161, 103, 255, 0, 97, 91, 79, 253, 24, 43, 150, 241, 87, 252, 141, 26, 135, 253, 118, 52, 1, 99, 236, 158, 16, 255, 0, 160, 150, 163, 255, 0, 124, 81, 246, 79, 8, 127, 208, 75, 81, 255, 0, 190, 43, 2, 138, 0, 223, 251, 39, 132, 63, 232, 37, 168, 255, 0, 223, 20, 125, 147, 194, 31, 244, 18, 212, 127, 239, 138, 192, 162, 128, 55, 254, 201, 225, 15, 250, 9, 106, 63, 247, 197, 31, 100, 240, 135, 253, 4, 181, 31, 251, 226, 176, 40, 160, 13, 255, 0, 178, 120, 67, 254, 130, 90, 143, 253, 241, 71, 217, 60, 33, 255, 0, 65, 45, 71, 254, 248, 172, 10, 40, 3, 165, 181, 181, 240, 160, 188, 135, 202, 212, 117, 2, 251, 198, 1, 78, 51, 154, 185, 175, 219, 120, 101, 181, 203, 195, 121, 127, 122, 151, 5, 255, 0, 120, 177, 175, 0, 215, 41, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 77, 255, 0, 253, 117, 160, 11, 31, 101, 240, 135, 253, 4, 181, 47, 251, 247, 71, 217, 124, 33, 255, 0, 65, 45, 75, 254, 253, 214, 5, 20, 1, 191, 246, 95, 8, 127, 208, 75, 82, 255, 0, 191, 116, 125, 151, 194, 31, 244, 18, 212, 191, 239, 221, 96, 81, 64, 27, 255, 0, 101, 240, 135, 253, 4, 181, 47, 251, 247, 71, 217, 124, 33, 255, 0, 65, 45, 75, 254, 253, 214, 5, 20, 1, 191, 246, 95, 8, 127, 208, 75, 82, 255, 0, 191, 116, 125, 151, 194, 31, 244, 18, 212, 191, 239, 221, 96, 81, 64, 29, 45, 165, 175, 133, 5, 228, 38, 45, 71, 80, 50, 121, 131, 104, 41, 198, 115, 87, 53, 251, 111, 12, 190, 189, 120, 110, 239, 239, 82, 227, 127, 206, 177, 175, 0, 226, 185, 75, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 253, 40, 2, 199, 217, 60, 33, 255, 0, 65, 45, 71, 254, 248, 163, 236, 158, 16, 255, 0, 160, 150, 163, 255, 0, 124, 86, 5, 20, 1, 191, 246, 79, 8, 127, 208, 75, 81, 255, 0, 190, 40, 251, 39, 132, 63, 232, 37, 168, 255, 0, 223, 21, 129, 69, 0, 111, 253, 147, 194, 31, 244, 18, 212, 127, 239, 138, 62, 201, 225, 15, 250, 9, 106, 63, 247, 197, 96, 81, 64, 27, 255, 0, 100, 240, 135, 253, 4, 181, 31, 251, 226, 143, 178, 120, 67, 254, 130, 90, 143, 253, 241, 88, 20, 80, 7, 75, 107, 105, 225, 65, 121, 9, 139, 81, 212, 12, 155, 198, 1, 78, 249, 171, 122, 253, 183, 134, 95, 94, 188, 55, 119, 247, 169, 62, 255, 0, 222, 44, 107, 192, 56, 174, 86, 199, 254, 66, 22, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 187, 80, 5, 143, 178, 248, 67, 254, 130, 90, 143, 253, 251, 20, 125, 151, 194, 31, 244, 18, 212, 127, 239, 216, 172, 10, 40, 3, 127, 236, 190, 16, 255, 0, 160, 150, 163, 255, 0, 126, 197, 31, 101, 240, 135, 253, 4, 181, 31, 251, 246, 43, 2, 138, 0, 223, 251, 47, 132, 63, 232, 37, 168, 255, 0, 223, 177, 71, 217, 124, 33, 255, 0, 65, 45, 71, 254, 253, 138, 192, 162, 128, 55, 254, 203, 225, 15, 250, 9, 106, 63, 247, 236, 81, 246, 95, 8, 127, 208, 75, 81, 255, 0, 191, 98, 176, 40, 160, 14, 150, 214, 215, 194, 159, 109, 135, 202, 212, 117, 2, 251, 198, 1, 94, 51, 154, 173, 226, 79, 249, 25, 47, 191, 235, 175, 244, 172, 155, 31, 249, 9, 91, 127, 215, 85, 254, 117, 173, 226, 79, 249, 25, 47, 191, 235, 175, 244, 171, 134, 231, 206, 241, 31, 251, 188, 125, 127, 70, 101, 81, 69, 21, 161, 241, 161, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 95, 241, 253, 109, 255, 0, 93, 87, 249, 215, 73, 175, 219, 248, 102, 77, 122, 240, 222, 95, 222, 165, 198, 255, 0, 222, 44, 107, 192, 53, 205, 217, 127, 199, 245, 183, 253, 117, 95, 231, 86, 188, 85, 255, 0, 35, 62, 161, 255, 0, 93, 191, 165, 68, 143, 173, 225, 159, 134, 175, 200, 177, 246, 79, 8, 255, 0, 208, 75, 81, 255, 0, 191, 116, 125, 147, 194, 63, 244, 18, 212, 127, 239, 221, 96, 81, 89, 159, 78, 111, 253, 151, 194, 63, 244, 18, 212, 191, 239, 138, 62, 203, 225, 31, 250, 9, 106, 95, 247, 197, 96, 81, 64, 20, 117, 63, 140, 243, 248, 119, 81, 159, 73, 211, 244, 168, 110, 109, 109, 31, 203, 138, 105, 156, 134, 97, 238, 5, 84, 255, 0, 134, 130, 213, 63, 232, 5, 105, 255, 0, 127, 154, 188, 191, 196, 51, 165, 199, 136, 111, 230, 140, 229, 26, 83, 138, 203, 175, 54, 89, 62, 95, 38, 229, 42, 74, 236, 191, 107, 46, 231, 178, 127, 195, 65, 234, 127, 244, 2, 180, 255, 0, 191, 205, 71, 252, 52, 30, 167, 255, 0, 64, 43, 79, 251, 252, 213, 227, 116, 84, 255, 0, 97, 229, 223, 243, 229, 7, 180, 151, 115, 219, 108, 62, 60, 106, 87, 122, 141, 173, 179, 104, 150, 170, 37, 153, 99, 36, 72, 120, 201, 197, 104, 248, 183, 227, 53, 255, 0, 134, 252, 85, 168, 232, 240, 233, 54, 210, 199, 105, 49, 140, 72, 206, 65, 106, 241, 13, 11, 254, 70, 13, 55, 254, 190, 162, 255, 0, 208, 197, 116, 31, 21, 63, 228, 167, 248, 135, 254, 190, 207, 242, 20, 127, 97, 229, 223, 243, 229, 11, 218, 75, 185, 218, 255, 0, 195, 65, 234, 127, 244, 2, 180, 255, 0, 191, 205, 71, 252, 52, 30, 167, 255, 0, 64, 43, 79, 251, 252, 213, 227, 116, 81, 253, 135, 151, 127, 207, 148, 63, 105, 46, 231, 178, 127, 195, 65, 234, 127, 244, 2, 180, 255, 0, 191, 205, 71, 252, 52, 30, 167, 255, 0, 64, 43, 79, 251, 252, 213, 227, 116, 81, 253, 135, 151, 127, 207, 148, 30, 210, 93, 207, 100, 255, 0, 134, 131, 212, 255, 0, 232, 5, 105, 255, 0, 127, 154, 143, 248, 104, 61, 79, 254, 128, 86, 159, 247, 249, 171, 198, 232, 163, 251, 15, 46, 255, 0, 159, 40, 61, 164, 187, 158, 201, 255, 0, 13, 7, 169, 255, 0, 208, 10, 211, 254, 255, 0, 53, 31, 240, 208, 122, 159, 253, 0, 173, 63, 239, 243, 87, 141, 209, 71, 246, 30, 93, 255, 0, 62, 80, 123, 73, 119, 61, 182, 199, 227, 198, 165, 119, 168, 91, 91, 29, 18, 212, 9, 166, 88, 201, 18, 156, 140, 156, 86, 143, 139, 126, 51, 95, 248, 119, 197, 122, 142, 143, 14, 147, 109, 52, 118, 147, 24, 196, 143, 41, 5, 171, 196, 52, 63, 249, 15, 233, 191, 245, 245, 23, 254, 132, 43, 127, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 143, 236, 60, 187, 254, 124, 160, 246, 146, 238, 118, 223, 240, 208, 122, 159, 253, 0, 173, 63, 239, 243, 81, 255, 0, 13, 7, 169, 255, 0, 208, 10, 211, 254, 255, 0, 53, 120, 221, 20, 127, 97, 229, 223, 243, 229, 7, 180, 151, 115, 217, 63, 225, 160, 245, 63, 250, 1, 90, 127, 223, 230, 163, 254, 26, 15, 83, 255, 0, 160, 21, 167, 253, 254, 106, 241, 186, 40, 254, 195, 203, 191, 231, 202, 15, 105, 46, 231, 168, 159, 140, 218, 129, 98, 127, 178, 45, 185, 255, 0, 166, 166, 147, 254, 23, 46, 161, 255, 0, 64, 139, 111, 251, 248, 107, 203, 232, 175, 109, 87, 170, 149, 147, 60, 135, 146, 101, 207, 87, 69, 30, 161, 255, 0, 11, 151, 80, 255, 0, 160, 69, 183, 253, 252, 52, 127, 194, 229, 212, 63, 232, 17, 109, 255, 0, 127, 13, 121, 125, 20, 125, 106, 183, 243, 7, 246, 30, 93, 255, 0, 62, 81, 235, 54, 31, 23, 111, 239, 53, 27, 91, 102, 210, 173, 212, 75, 50, 198, 72, 115, 198, 78, 43, 71, 197, 191, 18, 238, 252, 55, 226, 173, 71, 71, 135, 78, 130, 104, 237, 38, 242, 196, 142, 196, 22, 175, 36, 208, 191, 228, 96, 211, 127, 235, 234, 47, 253, 12, 87, 65, 241, 79, 254, 74, 127, 136, 63, 235, 236, 255, 0, 33, 71, 214, 171, 127, 48, 127, 97, 229, 223, 243, 229, 29, 15, 252, 46, 93, 67, 254, 129, 22, 223, 247, 240, 209, 255, 0, 11, 151, 80, 255, 0, 160, 69, 183, 253, 246, 107, 203, 232, 163, 235, 85, 191, 152, 63, 176, 242, 239, 249, 242, 143, 80, 255, 0, 133, 203, 168, 127, 208, 34, 219, 254, 251, 52, 127, 194, 229, 212, 63, 232, 17, 109, 255, 0, 125, 154, 242, 250, 40, 250, 213, 111, 230, 15, 236, 60, 187, 254, 124, 163, 212, 63, 225, 114, 234, 31, 244, 8, 182, 255, 0, 190, 205, 31, 240, 185, 117, 15, 250, 4, 91, 127, 223, 102, 188, 190, 138, 62, 181, 91, 249, 131, 251, 15, 46, 255, 0, 159, 40, 245, 15, 248, 92, 186, 135, 253, 2, 45, 191, 239, 179, 71, 252, 46, 93, 67, 254, 129, 22, 223, 247, 217, 175, 47, 162, 143, 173, 86, 254, 96, 254, 195, 203, 191, 231, 202, 61, 102, 195, 226, 237, 253, 230, 163, 107, 108, 218, 85, 186, 137, 102, 88, 201, 14, 120, 201, 197, 104, 248, 183, 226, 93, 223, 134, 252, 85, 168, 232, 240, 233, 208, 77, 29, 164, 222, 88, 145, 216, 130, 213, 228, 154, 31, 252, 140, 26, 111, 253, 125, 69, 255, 0, 161, 10, 232, 62, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 40, 250, 213, 111, 230, 15, 236, 60, 187, 254, 124, 163, 161, 255, 0, 133, 203, 168, 127, 208, 34, 219, 254, 254, 26, 63, 225, 114, 234, 31, 244, 8, 182, 255, 0, 191, 134, 188, 190, 138, 62, 181, 91, 249, 131, 251, 15, 46, 255, 0, 159, 40, 245, 15, 248, 92, 186, 135, 253, 2, 45, 191, 239, 225, 163, 254, 23, 46, 161, 255, 0, 64, 123, 95, 251, 250, 107, 203, 232, 163, 235, 85, 191, 152, 63, 176, 242, 239, 249, 242, 143, 68, 63, 21, 111, 137, 39, 251, 46, 14, 127, 219, 52, 159, 240, 181, 111, 191, 232, 25, 7, 253, 246, 107, 207, 40, 175, 45, 229, 184, 71, 255, 0, 46, 202, 254, 198, 192, 127, 207, 164, 122, 31, 252, 45, 75, 255, 0, 250, 6, 65, 255, 0, 125, 154, 63, 225, 106, 95, 255, 0, 208, 50, 15, 251, 236, 215, 158, 81, 71, 246, 110, 15, 254, 125, 135, 246, 54, 3, 254, 125, 35, 210, 236, 126, 37, 222, 93, 234, 22, 214, 205, 166, 194, 162, 89, 86, 50, 67, 158, 50, 113, 90, 94, 44, 241, 213, 207, 135, 60, 85, 168, 232, 240, 217, 69, 52, 118, 147, 121, 97, 217, 136, 45, 94, 99, 161, 255, 0, 200, 193, 166, 255, 0, 215, 212, 95, 250, 16, 174, 131, 226, 151, 252, 148, 255, 0, 16, 127, 215, 209, 254, 66, 143, 236, 220, 31, 252, 251, 15, 236, 108, 7, 252, 250, 70, 167, 252, 45, 75, 255, 0, 250, 6, 65, 255, 0, 125, 154, 63, 225, 106, 95, 255, 0, 208, 50, 15, 251, 236, 215, 158, 81, 71, 246, 110, 15, 254, 125, 135, 246, 54, 3, 254, 125, 35, 208, 255, 0, 225, 106, 95, 255, 0, 208, 50, 15, 251, 236, 209, 255, 0, 11, 82, 255, 0, 254, 129, 144, 127, 223, 102, 188, 242, 138, 63, 179, 112, 127, 243, 236, 63, 177, 176, 31, 243, 233, 30, 135, 255, 0, 11, 82, 255, 0, 254, 129, 144, 127, 223, 102, 143, 248, 90, 151, 255, 0, 244, 12, 131, 254, 251, 53, 231, 148, 81, 253, 155, 131, 255, 0, 159, 97, 253, 141, 128, 255, 0, 159, 72, 244, 63, 248, 90, 151, 255, 0, 244, 12, 131, 254, 251, 52, 127, 194, 212, 191, 255, 0, 160, 100, 31, 247, 217, 175, 60, 162, 143, 236, 220, 31, 252, 251, 15, 236, 108, 7, 252, 250, 71, 166, 88, 124, 77, 187, 188, 212, 109, 109, 155, 77, 133, 68, 179, 44, 100, 135, 60, 100, 129, 92, 159, 141, 180, 180, 208, 252, 103, 170, 233, 177, 76, 101, 75, 121, 202, 135, 35, 4, 247, 172, 253, 15, 254, 70, 13, 55, 254, 190, 226, 255, 0, 208, 133, 111, 252, 83, 255, 0, 146, 159, 226, 15, 250, 251, 63, 200, 86, 180, 112, 180, 104, 55, 236, 163, 99, 162, 134, 15, 15, 135, 109, 209, 141, 174, 114, 20, 81, 69, 116, 29, 65, 87, 244, 63, 249, 24, 52, 223, 250, 250, 139, 255, 0, 66, 21, 66, 175, 232, 127, 242, 48, 105, 191, 245, 245, 23, 254, 132, 40, 3, 127, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 185, 26, 235, 190, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 43, 145, 160, 2, 138, 40, 160, 11, 122, 125, 176, 188, 212, 109, 45, 89, 182, 172, 211, 44, 101, 135, 108, 156, 87, 121, 226, 125, 118, 127, 12, 120, 154, 251, 68, 130, 36, 158, 59, 39, 242, 68, 142, 112, 91, 3, 173, 113, 26, 23, 252, 140, 26, 103, 253, 125, 197, 255, 0, 161, 10, 223, 248, 167, 255, 0, 37, 63, 196, 31, 245, 246, 127, 144, 173, 232, 226, 107, 80, 119, 164, 236, 116, 80, 197, 215, 195, 182, 232, 202, 215, 23, 254, 19, 203, 175, 249, 240, 139, 254, 250, 52, 127, 194, 121, 117, 255, 0, 62, 17, 127, 223, 70, 184, 250, 43, 127, 237, 44, 103, 243, 179, 171, 251, 103, 31, 255, 0, 63, 89, 216, 127, 194, 121, 117, 255, 0, 62, 17, 127, 223, 70, 143, 248, 79, 46, 191, 231, 194, 47, 251, 232, 215, 31, 69, 31, 218, 88, 207, 231, 97, 253, 179, 143, 255, 0, 159, 172, 236, 63, 225, 60, 186, 255, 0, 159, 8, 191, 239, 163, 71, 252, 39, 151, 95, 243, 225, 23, 253, 244, 107, 143, 162, 143, 237, 44, 103, 243, 176, 254, 217, 199, 255, 0, 207, 214, 118, 31, 240, 158, 93, 127, 207, 132, 95, 247, 209, 163, 254, 19, 203, 175, 249, 240, 139, 254, 250, 53, 199, 209, 71, 246, 150, 51, 249, 216, 127, 108, 227, 255, 0, 231, 235, 59, 139, 15, 25, 92, 93, 234, 54, 214, 205, 105, 26, 137, 230, 88, 201, 13, 211, 39, 21, 165, 226, 221, 126, 111, 13, 248, 171, 81, 209, 225, 133, 38, 75, 73, 188, 177, 35, 156, 22, 174, 19, 67, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 33, 91, 255, 0, 20, 191, 228, 167, 248, 131, 254, 190, 143, 242, 20, 127, 105, 99, 63, 157, 135, 246, 206, 63, 254, 126, 177, 223, 240, 158, 93, 127, 207, 132, 95, 247, 209, 163, 254, 19, 203, 175, 249, 240, 139, 254, 250, 53, 199, 209, 71, 246, 150, 51, 249, 216, 127, 108, 227, 255, 0, 231, 235, 59, 15, 248, 79, 46, 191, 231, 194, 47, 251, 232, 209, 255, 0, 9, 229, 215, 252, 248, 69, 255, 0, 125, 26, 227, 232, 163, 251, 75, 25, 252, 236, 63, 182, 49, 223, 243, 245, 157, 33, 241, 92, 228, 147, 246, 88, 249, 247, 164, 255, 0, 132, 174, 127, 249, 245, 143, 243, 174, 114, 138, 242, 158, 26, 139, 214, 197, 255, 0, 110, 102, 63, 243, 249, 157, 31, 252, 37, 115, 255, 0, 207, 172, 127, 157, 31, 240, 149, 207, 255, 0, 62, 177, 254, 117, 206, 81, 71, 213, 104, 255, 0, 40, 127, 110, 102, 63, 243, 249, 157, 101, 135, 136, 101, 188, 212, 173, 109, 154, 221, 20, 77, 50, 198, 72, 61, 50, 113, 90, 62, 45, 191, 127, 13, 248, 167, 81, 209, 225, 65, 52, 118, 147, 121, 98, 70, 56, 45, 92, 142, 135, 255, 0, 35, 6, 155, 255, 0, 95, 81, 127, 232, 66, 186, 15, 138, 127, 242, 83, 252, 65, 255, 0, 95, 103, 249, 10, 62, 171, 71, 249, 67, 251, 115, 49, 255, 0, 159, 204, 167, 255, 0, 9, 92, 255, 0, 243, 235, 31, 253, 245, 71, 252, 37, 115, 255, 0, 207, 172, 127, 247, 213, 115, 148, 81, 245, 90, 63, 202, 31, 219, 153, 143, 252, 254, 103, 71, 255, 0, 9, 92, 255, 0, 243, 235, 31, 231, 71, 252, 37, 115, 255, 0, 207, 172, 127, 157, 115, 148, 81, 245, 90, 63, 202, 31, 219, 153, 143, 252, 254, 103, 71, 255, 0, 9, 92, 255, 0, 243, 235, 31, 231, 71, 252, 37, 115, 255, 0, 207, 172, 127, 157, 115, 148, 81, 245, 90, 63, 202, 31, 219, 153, 143, 252, 254, 103, 71, 255, 0, 9, 92, 255, 0, 243, 235, 31, 231, 71, 252, 37, 115, 255, 0, 207, 172, 127, 157, 115, 148, 81, 245, 90, 63, 202, 31, 219, 153, 143, 252, 254, 103, 89, 97, 226, 25, 111, 53, 43, 91, 102, 183, 69, 19, 76, 177, 146, 15, 76, 156, 86, 143, 139, 111, 223, 195, 126, 42, 212, 116, 120, 80, 77, 29, 164, 222, 88, 149, 142, 11, 116, 174, 71, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 93, 7, 197, 79, 249, 41, 254, 33, 255, 0, 175, 179, 252, 133, 31, 85, 163, 252, 161, 253, 185, 152, 255, 0, 207, 230, 83, 255, 0, 132, 174, 227, 254, 125, 99, 255, 0, 190, 168, 255, 0, 132, 174, 227, 254, 125, 99, 255, 0, 190, 171, 156, 162, 143, 170, 209, 254, 80, 254, 220, 204, 127, 231, 243, 58, 63, 248, 74, 231, 255, 0, 159, 88, 255, 0, 58, 63, 225, 43, 159, 254, 125, 99, 252, 235, 156, 162, 143, 170, 209, 236, 31, 219, 153, 143, 252, 254, 101, 243, 169, 57, 98, 118, 14, 79, 173, 55, 251, 65, 191, 231, 152, 252, 234, 149, 21, 238, 44, 239, 48, 74, 202, 171, 60, 135, 78, 44, 187, 253, 160, 255, 0, 243, 204, 126, 116, 127, 104, 63, 252, 243, 31, 157, 82, 162, 159, 246, 230, 97, 255, 0, 63, 88, 189, 156, 123, 26, 182, 19, 27, 189, 74, 218, 212, 141, 162, 121, 150, 50, 125, 50, 113, 90, 94, 45, 179, 30, 27, 241, 86, 163, 163, 194, 230, 104, 237, 38, 242, 195, 183, 5, 171, 31, 66, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 49, 91, 255, 0, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 20, 191, 183, 51, 31, 249, 252, 195, 217, 199, 177, 207, 127, 104, 55, 252, 243, 31, 157, 31, 218, 13, 255, 0, 60, 199, 231, 84, 168, 167, 253, 185, 152, 127, 207, 214, 30, 206, 61, 139, 191, 218, 13, 255, 0, 60, 199, 231, 71, 246, 131, 127, 207, 49, 249, 213, 42, 40, 254, 220, 204, 63, 231, 235, 15, 103, 30, 197, 223, 237, 6, 255, 0, 158, 99, 243, 163, 251, 65, 191, 231, 152, 252, 234, 149, 20, 127, 110, 102, 31, 243, 245, 135, 179, 143, 98, 239, 246, 131, 127, 207, 49, 249, 209, 253, 160, 223, 243, 204, 126, 117, 74, 138, 63, 183, 51, 15, 249, 250, 195, 217, 199, 177, 171, 167, 202, 111, 53, 27, 91, 86, 27, 68, 243, 44, 100, 142, 217, 56, 173, 47, 22, 217, 143, 13, 248, 171, 81, 209, 225, 115, 60, 118, 147, 121, 98, 70, 224, 183, 21, 143, 161, 127, 200, 193, 166, 255, 0, 215, 212, 95, 250, 24, 174, 131, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 151, 246, 230, 99, 255, 0, 63, 152, 123, 56, 246, 57, 223, 237, 6, 255, 0, 158, 99, 243, 163, 251, 65, 191, 231, 152, 252, 234, 149, 20, 255, 0, 183, 51, 15, 249, 252, 195, 217, 199, 177, 119, 251, 65, 191, 231, 152, 252, 234, 197, 133, 233, 109, 70, 213, 93, 112, 166, 101, 4, 131, 206, 51, 89, 85, 53, 171, 132, 187, 133, 219, 162, 184, 39, 243, 164, 243, 188, 193, 255, 0, 203, 230, 30, 206, 61, 143, 165, 190, 201, 225, 15, 250, 9, 106, 63, 247, 197, 31, 100, 240, 135, 253, 4, 181, 31, 251, 226, 185, 228, 144, 75, 26, 58, 159, 149, 134, 69, 58, 188, 162, 205, 255, 0, 178, 120, 67, 254, 130, 90, 143, 253, 241, 71, 217, 60, 33, 255, 0, 65, 45, 71, 254, 248, 172, 10, 40, 3, 165, 181, 180, 240, 160, 189, 128, 197, 168, 234, 6, 77, 227, 0, 167, 4, 230, 179, 252, 85, 255, 0, 35, 78, 161, 255, 0, 93, 127, 194, 168, 216, 255, 0, 200, 70, 215, 254, 186, 175, 243, 21, 123, 197, 95, 242, 52, 234, 31, 245, 215, 252, 43, 207, 204, 63, 134, 140, 43, 252, 38, 61, 20, 81, 94, 81, 206, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 88, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 93, 102, 191, 109, 225, 153, 53, 235, 195, 121, 127, 122, 151, 5, 255, 0, 120, 177, 175, 0, 215, 39, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 188, 85, 255, 0, 35, 77, 255, 0, 253, 117, 175, 83, 47, 217, 155, 209, 234, 88, 251, 39, 132, 63, 232, 37, 168, 255, 0, 223, 20, 125, 147, 194, 31, 244, 18, 212, 127, 239, 138, 192, 162, 189, 19, 160, 223, 251, 39, 132, 63, 232, 37, 168, 255, 0, 223, 20, 125, 147, 194, 31, 244, 18, 212, 127, 239, 138, 192, 162, 128, 55, 254, 201, 225, 15, 250, 9, 106, 63, 247, 197, 31, 100, 240, 135, 253, 4, 181, 31, 251, 226, 176, 40, 160, 13, 255, 0, 178, 120, 67, 254, 130, 90, 143, 253, 241, 71, 217, 60, 33, 255, 0, 65, 45, 71, 254, 248, 172, 10, 40, 3, 165, 180, 180, 240, 160, 188, 128, 197, 168, 234, 6, 79, 48, 109, 5, 56, 39, 53, 115, 95, 182, 240, 211, 235, 215, 141, 119, 127, 122, 147, 239, 249, 214, 53, 224, 26, 229, 44, 127, 228, 35, 107, 255, 0, 93, 87, 249, 138, 209, 241, 87, 252, 140, 250, 135, 253, 118, 160, 11, 31, 101, 240, 143, 253, 4, 181, 47, 251, 224, 81, 246, 95, 8, 255, 0, 208, 75, 82, 255, 0, 190, 5, 96, 81, 64, 27, 255, 0, 101, 240, 143, 253, 4, 181, 47, 251, 224, 81, 246, 95, 8, 255, 0, 208, 75, 82, 255, 0, 190, 5, 96, 81, 64, 27, 255, 0, 101, 240, 143, 253, 4, 181, 47, 251, 224, 81, 246, 95, 8, 255, 0, 208, 75, 82, 255, 0, 190, 5, 96, 81, 64, 27, 255, 0, 101, 240, 143, 253, 4, 181, 47, 251, 224, 81, 246, 95, 8, 255, 0, 208, 75, 82, 255, 0, 190, 5, 96, 81, 64, 29, 45, 173, 175, 133, 5, 228, 6, 45, 71, 80, 50, 121, 131, 0, 167, 25, 205, 91, 215, 237, 188, 50, 250, 237, 225, 188, 191, 189, 75, 141, 255, 0, 50, 198, 188, 3, 92, 173, 143, 252, 132, 109, 127, 235, 170, 255, 0, 49, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 212, 1, 99, 236, 190, 17, 255, 0, 160, 150, 163, 255, 0, 124, 10, 62, 203, 225, 31, 250, 9, 106, 63, 247, 192, 172, 10, 40, 3, 127, 236, 190, 17, 255, 0, 160, 150, 163, 255, 0, 124, 10, 62, 203, 225, 31, 250, 9, 106, 63, 247, 192, 172, 10, 40, 3, 127, 236, 190, 17, 255, 0, 160, 150, 163, 255, 0, 124, 10, 62, 203, 225, 31, 250, 9, 106, 63, 247, 192, 172, 10, 40, 3, 127, 236, 190, 17, 255, 0, 160, 150, 163, 255, 0, 124, 10, 62, 203, 225, 31, 250, 9, 106, 63, 247, 192, 172, 10, 40, 3, 165, 181, 181, 240, 160, 188, 135, 202, 212, 117, 2, 251, 198, 1, 78, 249, 171, 122, 253, 183, 134, 95, 92, 188, 55, 119, 215, 169, 112, 95, 247, 139, 26, 240, 13, 114, 182, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 52, 223, 255, 0, 215, 90, 0, 177, 246, 79, 8, 127, 208, 75, 81, 255, 0, 190, 40, 251, 39, 132, 63, 232, 37, 168, 255, 0, 223, 21, 129, 69, 0, 111, 253, 147, 194, 31, 244, 18, 212, 127, 239, 138, 62, 201, 225, 15, 250, 9, 106, 63, 247, 197, 96, 81, 64, 27, 255, 0, 100, 240, 135, 253, 4, 181, 31, 251, 226, 143, 178, 120, 67, 254, 130, 90, 143, 253, 241, 88, 20, 80, 6, 255, 0, 217, 60, 33, 255, 0, 65, 45, 71, 254, 248, 163, 236, 158, 16, 255, 0, 160, 150, 163, 255, 0, 124, 86, 5, 20, 1, 210, 218, 218, 248, 80, 94, 64, 98, 212, 117, 3, 38, 241, 128, 83, 190, 107, 155, 255, 0, 133, 91, 105, 227, 255, 0, 30, 248, 190, 234, 231, 83, 154, 208, 218, 234, 30, 88, 88, 144, 54, 114, 160, 231, 154, 154, 199, 254, 66, 54, 191, 245, 213, 127, 157, 119, 30, 0, 255, 0, 145, 187, 199, 191, 246, 21, 95, 253, 0, 80, 7, 33, 255, 0, 12, 217, 165, 127, 208, 193, 123, 255, 0, 126, 22, 143, 248, 102, 205, 43, 254, 134, 11, 223, 251, 240, 181, 237, 244, 80, 7, 136, 127, 195, 54, 105, 95, 244, 48, 94, 255, 0, 223, 133, 173, 63, 13, 124, 10, 211, 252, 55, 226, 59, 13, 94, 45, 106, 234, 105, 45, 37, 243, 4, 111, 16, 1, 171, 215, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 14, 3, 226, 247, 252, 138, 22, 127, 246, 21, 180, 255, 0, 209, 130, 185, 111, 21, 127, 200, 209, 168, 127, 215, 99, 93, 79, 197, 239, 249, 20, 44, 255, 0, 236, 43, 105, 255, 0, 163, 5, 114, 222, 42, 255, 0, 145, 163, 80, 255, 0, 174, 198, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 54, 223, 245, 217, 127, 157, 104, 120, 171, 254, 70, 125, 67, 254, 186, 214, 125, 143, 252, 132, 109, 191, 235, 178, 255, 0, 58, 208, 241, 87, 252, 140, 250, 135, 253, 117, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 223, 210, 179, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 183, 244, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 213, 157, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 37, 109, 255, 0, 93, 87, 249, 214, 175, 137, 127, 228, 100, 191, 255, 0, 174, 191, 210, 178, 172, 127, 228, 37, 109, 255, 0, 93, 87, 249, 214, 175, 137, 191, 228, 99, 191, 255, 0, 174, 191, 210, 174, 27, 159, 59, 196, 127, 238, 241, 245, 253, 25, 149, 69, 20, 86, 167, 198, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 88, 255, 0, 199, 253, 183, 253, 117, 95, 231, 86, 188, 85, 255, 0, 35, 62, 161, 255, 0, 93, 191, 165, 85, 177, 255, 0, 143, 251, 111, 250, 234, 191, 206, 174, 120, 171, 254, 70, 141, 67, 254, 187, 127, 74, 206, 71, 214, 112, 215, 195, 87, 228, 99, 81, 69, 21, 153, 245, 1, 69, 20, 80, 7, 133, 95, 127, 199, 253, 207, 253, 117, 111, 231, 85, 234, 197, 247, 252, 132, 46, 191, 235, 171, 127, 58, 175, 64, 5, 20, 81, 64, 23, 244, 47, 249, 24, 52, 207, 250, 251, 139, 255, 0, 67, 21, 208, 124, 84, 255, 0, 146, 159, 226, 31, 250, 251, 63, 200, 87, 63, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 174, 131, 226, 167, 252, 148, 255, 0, 16, 255, 0, 215, 217, 254, 66, 128, 57, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 47, 232, 127, 242, 48, 105, 191, 245, 245, 23, 254, 132, 43, 127, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 176, 52, 63, 249, 24, 52, 223, 250, 250, 139, 255, 0, 66, 21, 191, 241, 79, 254, 74, 127, 136, 63, 235, 236, 255, 0, 33, 64, 28, 141, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 23, 244, 47, 249, 24, 52, 207, 250, 251, 139, 255, 0, 67, 21, 208, 124, 83, 255, 0, 146, 159, 226, 15, 250, 251, 63, 200, 87, 63, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 174, 131, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 128, 57, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 47, 232, 127, 242, 48, 105, 191, 245, 245, 23, 254, 132, 43, 160, 248, 167, 255, 0, 37, 63, 196, 31, 245, 246, 127, 144, 174, 127, 67, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 33, 93, 7, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 0, 114, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 95, 208, 255, 0, 228, 96, 211, 127, 235, 234, 47, 253, 8, 87, 65, 241, 79, 254, 74, 127, 136, 63, 235, 236, 255, 0, 33, 92, 254, 135, 255, 0, 35, 6, 155, 255, 0, 95, 81, 127, 232, 66, 186, 15, 138, 127, 242, 83, 252, 65, 255, 0, 95, 103, 249, 10, 0, 228, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 191, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 173, 255, 0, 138, 127, 242, 83, 252, 65, 255, 0, 95, 103, 249, 10, 192, 208, 191, 228, 96, 211, 63, 235, 238, 47, 253, 12, 86, 255, 0, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 0, 114, 52, 81, 69, 0, 21, 127, 67, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 33, 84, 42, 254, 135, 255, 0, 35, 6, 155, 255, 0, 95, 81, 127, 232, 66, 128, 55, 254, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 43, 145, 174, 187, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 185, 26, 0, 40, 162, 138, 0, 191, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 174, 131, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 185, 253, 11, 254, 70, 13, 51, 254, 190, 226, 255, 0, 208, 197, 116, 31, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 20, 1, 200, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 127, 67, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 33, 91, 255, 0, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 21, 129, 161, 255, 0, 200, 193, 166, 255, 0, 215, 212, 95, 250, 16, 173, 255, 0, 138, 127, 242, 83, 252, 65, 255, 0, 95, 103, 249, 10, 0, 228, 104, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 191, 161, 255, 0, 200, 193, 166, 255, 0, 215, 212, 95, 250, 16, 174, 131, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 185, 253, 15, 254, 70, 13, 55, 254, 190, 162, 255, 0, 208, 133, 116, 31, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 20, 1, 200, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 127, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 93, 7, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 115, 250, 23, 252, 140, 26, 103, 253, 125, 197, 255, 0, 161, 138, 232, 62, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 40, 3, 144, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 254, 135, 255, 0, 35, 6, 155, 255, 0, 95, 81, 127, 232, 66, 183, 254, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 43, 3, 67, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 33, 91, 255, 0, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 20, 1, 200, 209, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 127, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 93, 7, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 115, 250, 23, 252, 140, 26, 103, 253, 125, 197, 255, 0, 161, 138, 232, 62, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 40, 3, 144, 162, 138, 40, 0, 162, 138, 40, 3, 221, 44, 127, 227, 194, 215, 254, 185, 47, 242, 21, 102, 171, 88, 255, 0, 199, 133, 175, 253, 114, 95, 228, 42, 205, 0, 20, 81, 69, 0, 79, 99, 255, 0, 33, 27, 95, 250, 234, 191, 204, 85, 239, 21, 127, 200, 211, 168, 127, 215, 95, 240, 170, 54, 63, 242, 17, 181, 255, 0, 174, 171, 252, 197, 94, 241, 87, 252, 141, 58, 135, 253, 117, 255, 0, 10, 225, 204, 62, 4, 97, 95, 225, 49, 232, 162, 138, 242, 14, 112, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 197, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 210, 241, 87, 252, 141, 55, 255, 0, 245, 214, 179, 108, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 151, 138, 191, 228, 105, 191, 255, 0, 174, 181, 233, 229, 251, 72, 222, 143, 83, 34, 138, 40, 175, 72, 232, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 213, 157, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 138, 209, 241, 87, 252, 140, 250, 135, 253, 118, 172, 235, 31, 249, 8, 218, 255, 0, 215, 85, 254, 98, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 35, 109, 255, 0, 93, 151, 249, 214, 135, 138, 191, 228, 105, 212, 63, 235, 173, 103, 216, 255, 0, 200, 70, 219, 254, 187, 47, 243, 173, 15, 21, 127, 200, 211, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 221, 120, 3, 254, 70, 255, 0, 30, 127, 216, 85, 127, 244, 88, 174, 22, 199, 254, 66, 54, 191, 245, 213, 127, 157, 119, 126, 0, 255, 0, 145, 191, 199, 159, 246, 21, 95, 253, 22, 40, 3, 190, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 3, 128, 248, 189, 255, 0, 34, 133, 159, 253, 133, 109, 63, 244, 96, 174, 91, 197, 95, 242, 52, 106, 31, 245, 216, 215, 83, 241, 123, 254, 69, 11, 63, 251, 10, 218, 127, 232, 193, 92, 183, 138, 191, 228, 104, 212, 63, 235, 177, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 118, 95, 231, 90, 30, 42, 255, 0, 145, 162, 255, 0, 254, 186, 214, 125, 143, 252, 132, 109, 191, 235, 178, 255, 0, 58, 208, 241, 87, 252, 141, 23, 255, 0, 245, 214, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 199, 254, 66, 22, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 187, 127, 74, 206, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 223, 210, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 199, 254, 66, 22, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 187, 86, 117, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 140, 250, 135, 253, 118, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 149, 183, 253, 117, 95, 230, 43, 91, 196, 131, 62, 35, 190, 63, 244, 215, 250, 86, 77, 143, 252, 132, 173, 191, 235, 170, 255, 0, 49, 86, 188, 87, 126, 177, 120, 167, 80, 92, 116, 151, 31, 165, 84, 93, 153, 229, 230, 185, 110, 35, 29, 73, 83, 195, 43, 180, 238, 85, 193, 163, 6, 168, 127, 105, 199, 232, 105, 63, 180, 215, 208, 214, 188, 232, 241, 63, 213, 44, 211, 254, 125, 154, 24, 52, 96, 214, 127, 246, 154, 250, 26, 63, 180, 215, 208, 209, 206, 131, 253, 82, 205, 63, 231, 217, 161, 131, 70, 13, 103, 255, 0, 105, 175, 161, 163, 251, 77, 125, 13, 28, 232, 63, 213, 44, 211, 254, 125, 154, 24, 52, 96, 214, 127, 246, 154, 250, 26, 63, 180, 215, 208, 209, 206, 131, 253, 82, 205, 63, 231, 217, 177, 99, 255, 0, 31, 246, 223, 245, 217, 127, 157, 88, 241, 87, 252, 141, 58, 135, 253, 118, 254, 149, 143, 97, 168, 41, 212, 109, 70, 58, 202, 191, 206, 182, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 191, 165, 101, 38, 143, 103, 42, 202, 177, 56, 5, 37, 137, 86, 185, 145, 69, 20, 84, 158, 176, 81, 69, 20, 1, 225, 87, 223, 241, 255, 0, 115, 255, 0, 93, 91, 249, 213, 122, 244, 105, 116, 175, 134, 15, 43, 153, 252, 75, 173, 172, 197, 137, 96, 44, 129, 0, 247, 166, 255, 0, 100, 124, 42, 255, 0, 161, 163, 92, 255, 0, 192, 17, 254, 20, 1, 231, 116, 87, 162, 127, 100, 124, 42, 255, 0, 161, 163, 92, 255, 0, 192, 17, 254, 20, 127, 100, 124, 42, 255, 0, 161, 163, 92, 255, 0, 192, 17, 254, 20, 1, 197, 104, 127, 242, 48, 105, 191, 245, 245, 23, 254, 132, 43, 160, 248, 169, 255, 0, 37, 63, 196, 63, 245, 246, 127, 144, 173, 253, 51, 73, 248, 96, 53, 91, 51, 15, 137, 181, 167, 152, 78, 155, 3, 89, 0, 9, 200, 197, 107, 248, 243, 76, 248, 121, 39, 142, 117, 137, 53, 95, 16, 234, 240, 95, 155, 130, 102, 138, 27, 80, 202, 173, 129, 208, 208, 7, 141, 81, 94, 135, 253, 145, 240, 171, 254, 134, 141, 115, 255, 0, 0, 69, 31, 217, 31, 10, 191, 232, 104, 215, 63, 240, 4, 80, 7, 158, 81, 94, 135, 253, 145, 240, 171, 254, 134, 141, 115, 255, 0, 0, 69, 31, 217, 31, 10, 191, 232, 104, 215, 63, 240, 4, 80, 7, 158, 81, 94, 135, 253, 145, 240, 171, 254, 134, 141, 115, 255, 0, 0, 69, 31, 217, 31, 10, 191, 232, 104, 215, 63, 240, 4, 80, 7, 158, 81, 94, 135, 253, 145, 240, 171, 254, 134, 141, 115, 255, 0, 0, 69, 31, 217, 31, 10, 191, 232, 104, 215, 63, 240, 4, 80, 7, 23, 161, 255, 0, 200, 193, 166, 255, 0, 215, 212, 95, 250, 16, 173, 255, 0, 138, 95, 242, 83, 252, 65, 255, 0, 95, 71, 249, 10, 232, 52, 205, 39, 225, 138, 106, 182, 102, 31, 19, 107, 111, 48, 157, 10, 6, 178, 0, 19, 145, 138, 215, 241, 222, 153, 240, 242, 79, 28, 106, 239, 170, 248, 135, 87, 130, 252, 220, 31, 58, 40, 109, 67, 170, 156, 14, 134, 128, 60, 106, 138, 244, 79, 236, 143, 133, 63, 244, 52, 235, 159, 248, 2, 63, 194, 143, 236, 143, 133, 63, 244, 52, 235, 159, 248, 2, 63, 194, 128, 60, 238, 138, 244, 79, 236, 143, 133, 63, 244, 52, 235, 159, 248, 2, 63, 194, 143, 236, 143, 133, 63, 244, 52, 235, 159, 248, 2, 63, 194, 128, 60, 238, 138, 244, 79, 236, 143, 133, 63, 244, 52, 235, 159, 248, 2, 63, 194, 143, 236, 143, 133, 63, 244, 52, 235, 159, 248, 2, 63, 194, 128, 60, 238, 138, 244, 79, 236, 143, 133, 63, 244, 52, 235, 159, 248, 2, 63, 194, 143, 236, 143, 133, 63, 244, 52, 235, 159, 248, 2, 63, 194, 128, 56, 173, 11, 254, 70, 13, 55, 254, 190, 162, 255, 0, 208, 197, 116, 31, 21, 63, 228, 167, 248, 135, 254, 190, 207, 242, 21, 191, 166, 105, 63, 12, 70, 171, 102, 97, 241, 54, 178, 242, 137, 147, 96, 123, 32, 1, 57, 24, 173, 127, 30, 105, 159, 15, 36, 241, 206, 177, 38, 171, 226, 29, 94, 11, 243, 112, 76, 209, 67, 106, 25, 85, 176, 58, 26, 0, 241, 170, 43, 208, 255, 0, 178, 62, 21, 127, 208, 209, 174, 127, 224, 8, 163, 251, 35, 225, 87, 253, 13, 26, 231, 254, 0, 138, 0, 243, 202, 43, 208, 255, 0, 178, 62, 21, 127, 208, 209, 174, 127, 224, 8, 163, 251, 35, 225, 87, 253, 13, 26, 231, 254, 0, 138, 0, 243, 202, 43, 208, 255, 0, 178, 62, 21, 127, 208, 209, 174, 127, 224, 8, 163, 251, 35, 225, 87, 253, 13, 26, 231, 254, 0, 138, 0, 243, 202, 43, 208, 255, 0, 178, 62, 21, 127, 208, 209, 174, 127, 224, 8, 163, 251, 35, 225, 87, 253, 13, 26, 231, 254, 0, 138, 0, 226, 244, 63, 249, 24, 52, 223, 250, 250, 139, 255, 0, 66, 21, 208, 124, 84, 255, 0, 146, 159, 226, 31, 250, 251, 63, 200, 86, 254, 153, 164, 252, 48, 26, 173, 153, 135, 196, 218, 211, 202, 38, 77, 129, 172, 128, 4, 228, 98, 181, 252, 121, 166, 124, 60, 147, 199, 58, 196, 154, 175, 136, 117, 120, 47, 205, 193, 51, 69, 13, 168, 101, 86, 192, 232, 104, 3, 198, 168, 175, 67, 254, 200, 248, 85, 255, 0, 67, 70, 185, 255, 0, 128, 34, 143, 236, 143, 133, 95, 244, 52, 107, 159, 248, 2, 40, 3, 207, 40, 175, 67, 254, 200, 248, 85, 255, 0, 67, 70, 185, 255, 0, 128, 34, 143, 236, 143, 133, 95, 244, 52, 107, 159, 248, 2, 40, 3, 207, 40, 175, 67, 254, 200, 248, 85, 255, 0, 67, 70, 185, 255, 0, 128, 34, 143, 236, 143, 133, 95, 244, 52, 107, 159, 248, 2, 40, 3, 207, 40, 175, 68, 254, 200, 248, 83, 255, 0, 67, 78, 185, 255, 0, 128, 35, 252, 40, 254, 200, 248, 83, 255, 0, 67, 78, 185, 255, 0, 128, 35, 252, 40, 3, 138, 208, 255, 0, 228, 96, 211, 127, 235, 234, 47, 253, 8, 87, 65, 241, 75, 254, 74, 127, 136, 63, 235, 232, 255, 0, 33, 91, 250, 102, 147, 240, 196, 106, 182, 134, 31, 19, 107, 77, 48, 157, 54, 6, 178, 0, 19, 145, 138, 215, 241, 222, 153, 240, 242, 79, 28, 106, 239, 170, 248, 135, 87, 130, 252, 220, 31, 58, 40, 109, 67, 170, 156, 14, 134, 128, 60, 106, 138, 244, 63, 236, 127, 133, 95, 244, 52, 107, 159, 248, 2, 40, 254, 199, 248, 85, 255, 0, 67, 70, 185, 255, 0, 128, 34, 128, 60, 242, 138, 244, 63, 236, 127, 133, 95, 244, 52, 107, 159, 248, 2, 40, 254, 199, 248, 85, 255, 0, 67, 70, 185, 255, 0, 128, 34, 128, 60, 242, 138, 244, 63, 236, 127, 133, 95, 244, 52, 107, 159, 248, 2, 40, 254, 199, 248, 85, 255, 0, 67, 70, 185, 255, 0, 128, 34, 128, 60, 242, 138, 244, 63, 236, 127, 133, 95, 244, 52, 107, 159, 248, 2, 40, 254, 199, 248, 85, 255, 0, 67, 70, 185, 255, 0, 128, 34, 128, 56, 189, 11, 254, 70, 13, 55, 254, 190, 162, 255, 0, 208, 197, 116, 31, 21, 63, 228, 167, 248, 135, 254, 190, 207, 242, 21, 191, 166, 105, 63, 12, 6, 171, 102, 97, 241, 54, 178, 242, 137, 147, 96, 123, 32, 1, 57, 24, 173, 127, 30, 105, 159, 15, 36, 241, 206, 177, 38, 171, 226, 29, 94, 11, 243, 112, 76, 209, 67, 106, 25, 85, 176, 58, 26, 0, 241, 170, 43, 208, 255, 0, 178, 62, 21, 127, 208, 209, 174, 127, 224, 8, 163, 251, 35, 225, 87, 253, 13, 26, 231, 254, 0, 138, 0, 243, 202, 191, 161, 255, 0, 200, 127, 77, 255, 0, 175, 168, 191, 244, 33, 93, 167, 246, 71, 194, 175, 250, 26, 53, 207, 252, 1, 21, 209, 120, 35, 68, 248, 95, 47, 139, 108, 68, 58, 230, 161, 119, 48, 108, 199, 13, 229, 184, 138, 38, 97, 211, 38, 128, 56, 143, 138, 95, 242, 83, 252, 65, 255, 0, 95, 71, 249, 10, 228, 107, 223, 126, 42, 232, 223, 14, 79, 139, 158, 77, 83, 87, 188, 177, 212, 37, 93, 211, 199, 101, 8, 148, 19, 234, 222, 134, 184, 95, 236, 127, 133, 95, 244, 52, 107, 159, 248, 2, 40, 3, 207, 40, 175, 67, 254, 199, 248, 85, 255, 0, 67, 70, 185, 255, 0, 128, 34, 143, 236, 127, 133, 95, 244, 52, 107, 159, 248, 2, 40, 3, 139, 208, 191, 228, 96, 211, 63, 235, 238, 47, 253, 12, 87, 65, 241, 83, 254, 74, 127, 136, 127, 235, 236, 255, 0, 33, 91, 250, 102, 147, 240, 196, 106, 182, 102, 31, 19, 107, 79, 40, 157, 54, 7, 178, 0, 19, 145, 138, 215, 241, 230, 153, 240, 242, 79, 28, 235, 18, 106, 190, 33, 213, 160, 191, 55, 4, 205, 20, 54, 161, 149, 91, 3, 161, 160, 15, 26, 162, 189, 15, 251, 35, 225, 87, 253, 13, 26, 231, 254, 0, 138, 63, 178, 62, 21, 127, 208, 209, 174, 127, 224, 8, 160, 15, 60, 162, 189, 15, 251, 35, 225, 87, 253, 13, 26, 231, 254, 0, 138, 63, 178, 62, 21, 127, 208, 209, 174, 127, 224, 8, 160, 15, 60, 162, 189, 15, 251, 35, 225, 87, 253, 13, 26, 231, 254, 0, 138, 63, 178, 62, 21, 127, 208, 209, 174, 127, 224, 8, 160, 15, 60, 162, 189, 15, 251, 35, 225, 87, 253, 13, 26, 231, 254, 0, 138, 63, 178, 62, 21, 127, 208, 209, 174, 127, 224, 8, 160, 14, 47, 67, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 33, 93, 7, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 111, 233, 154, 79, 195, 1, 170, 218, 24, 124, 77, 173, 52, 194, 116, 216, 26, 200, 0, 78, 70, 43, 95, 199, 122, 103, 195, 201, 124, 113, 171, 190, 171, 226, 29, 94, 11, 243, 112, 124, 232, 162, 181, 14, 170, 112, 58, 26, 0, 241, 170, 43, 209, 63, 177, 254, 20, 255, 0, 208, 211, 174, 127, 224, 8, 255, 0, 10, 63, 177, 254, 20, 255, 0, 208, 211, 174, 127, 224, 8, 255, 0, 10, 0, 243, 186, 43, 209, 63, 177, 254, 20, 255, 0, 208, 211, 174, 127, 224, 8, 255, 0, 10, 63, 177, 254, 20, 255, 0, 208, 211, 174, 127, 224, 8, 255, 0, 10, 0, 243, 186, 43, 209, 63, 177, 254, 20, 255, 0, 208, 211, 174, 127, 224, 8, 255, 0, 10, 63, 177, 254, 20, 255, 0, 208, 211, 174, 127, 224, 8, 255, 0, 10, 0, 243, 186, 43, 209, 63, 177, 254, 20, 255, 0, 208, 211, 174, 127, 224, 8, 255, 0, 10, 63, 177, 254, 20, 255, 0, 208, 211, 174, 127, 224, 8, 255, 0, 10, 0, 226, 180, 63, 249, 24, 52, 223, 250, 250, 139, 255, 0, 66, 21, 208, 124, 84, 255, 0, 146, 159, 226, 31, 250, 251, 63, 200, 86, 254, 153, 164, 252, 48, 26, 173, 153, 135, 196, 218, 203, 202, 38, 77, 129, 236, 128, 4, 228, 98, 181, 252, 121, 166, 124, 60, 147, 199, 58, 196, 154, 175, 136, 117, 120, 47, 205, 193, 51, 69, 13, 168, 101, 86, 192, 232, 104, 3, 198, 168, 175, 67, 254, 200, 248, 85, 255, 0, 67, 70, 185, 255, 0, 128, 34, 143, 236, 143, 133, 95, 244, 52, 107, 159, 248, 2, 40, 3, 207, 40, 175, 67, 254, 200, 248, 85, 255, 0, 67, 70, 185, 255, 0, 128, 34, 143, 236, 143, 133, 95, 244, 52, 107, 159, 248, 2, 40, 3, 207, 40, 175, 67, 254, 200, 248, 85, 255, 0, 67, 70, 185, 255, 0, 128, 34, 143, 236, 143, 133, 95, 244, 52, 107, 159, 248, 2, 40, 3, 207, 40, 175, 68, 254, 200, 248, 83, 255, 0, 67, 78, 185, 255, 0, 128, 35, 252, 40, 254, 200, 248, 83, 255, 0, 67, 78, 185, 255, 0, 128, 35, 252, 40, 3, 138, 208, 199, 252, 84, 26, 111, 253, 125, 69, 255, 0, 161, 10, 232, 62, 42, 127, 201, 79, 241, 15, 253, 125, 159, 228, 43, 127, 76, 210, 126, 24, 141, 86, 204, 195, 226, 109, 105, 229, 19, 166, 192, 246, 64, 2, 114, 49, 90, 254, 60, 211, 62, 30, 73, 227, 157, 98, 77, 87, 196, 58, 188, 23, 230, 224, 153, 162, 134, 212, 50, 171, 96, 116, 52, 1, 227, 84, 87, 161, 255, 0, 100, 124, 42, 255, 0, 161, 163, 92, 255, 0, 192, 17, 71, 246, 71, 194, 175, 250, 26, 53, 207, 252, 1, 20, 1, 231, 148, 87, 161, 255, 0, 100, 124, 42, 255, 0, 161, 163, 92, 255, 0, 192, 17, 71, 246, 71, 194, 175, 250, 26, 53, 207, 252, 1, 20, 1, 231, 148, 87, 161, 255, 0, 100, 124, 42, 255, 0, 161, 163, 92, 255, 0, 192, 17, 71, 246, 71, 194, 175, 250, 26, 53, 207, 252, 1, 20, 1, 231, 148, 87, 161, 255, 0, 100, 124, 42, 255, 0, 161, 163, 92, 255, 0, 192, 17, 71, 246, 71, 194, 175, 250, 26, 53, 207, 252, 1, 20, 1, 197, 232, 127, 242, 48, 105, 191, 245, 245, 23, 254, 132, 43, 127, 226, 151, 252, 148, 255, 0, 16, 127, 215, 209, 254, 66, 186, 13, 51, 73, 248, 98, 53, 91, 67, 15, 137, 181, 166, 152, 78, 155, 3, 89, 0, 9, 200, 197, 107, 248, 239, 76, 248, 121, 39, 142, 53, 119, 213, 124, 67, 171, 193, 126, 110, 15, 157, 20, 54, 161, 213, 78, 7, 67, 64, 30, 53, 69, 122, 31, 246, 63, 194, 175, 250, 26, 117, 207, 252, 1, 20, 127, 99, 252, 42, 255, 0, 161, 163, 92, 255, 0, 192, 17, 64, 30, 121, 69, 122, 31, 246, 63, 194, 175, 250, 26, 53, 207, 252, 1, 20, 127, 99, 252, 42, 255, 0, 161, 163, 92, 255, 0, 192, 17, 64, 30, 121, 69, 122, 31, 246, 63, 194, 175, 250, 26, 53, 207, 252, 1, 20, 127, 99, 252, 42, 255, 0, 161, 163, 92, 255, 0, 192, 17, 64, 30, 121, 69, 122, 31, 246, 63, 194, 175, 250, 26, 53, 207, 252, 1, 20, 127, 99, 252, 42, 255, 0, 161, 163, 92, 255, 0, 192, 17, 64, 28, 94, 135, 255, 0, 35, 6, 155, 255, 0, 95, 81, 127, 232, 66, 186, 15, 138, 159, 242, 83, 252, 67, 255, 0, 95, 103, 249, 10, 223, 211, 52, 159, 134, 3, 85, 179, 48, 248, 155, 89, 121, 68, 201, 176, 61, 144, 0, 156, 140, 86, 191, 143, 52, 207, 135, 146, 120, 231, 88, 147, 85, 241, 14, 175, 5, 249, 184, 38, 104, 161, 181, 12, 170, 216, 29, 13, 0, 120, 213, 21, 232, 127, 217, 31, 10, 191, 232, 104, 215, 63, 240, 4, 81, 253, 145, 240, 171, 254, 134, 141, 115, 255, 0, 0, 69, 0, 121, 229, 21, 232, 127, 217, 31, 10, 191, 232, 104, 215, 63, 240, 4, 81, 253, 145, 240, 171, 254, 134, 141, 115, 255, 0, 0, 69, 0, 118, 54, 31, 242, 14, 181, 255, 0, 174, 75, 252, 133, 89, 168, 160, 17, 45, 188, 66, 217, 139, 91, 237, 1, 25, 186, 145, 216, 254, 85, 45, 0, 20, 81, 69, 0, 79, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 175, 120, 175, 254, 70, 157, 67, 254, 186, 255, 0, 65, 84, 108, 127, 228, 33, 107, 255, 0, 93, 87, 249, 213, 191, 21, 183, 252, 85, 58, 143, 253, 117, 254, 130, 179, 171, 131, 173, 139, 247, 105, 43, 180, 97, 87, 225, 50, 104, 166, 111, 163, 125, 97, 254, 175, 227, 255, 0, 148, 231, 179, 31, 69, 51, 205, 163, 205, 163, 253, 95, 199, 255, 0, 40, 89, 143, 162, 155, 230, 81, 230, 81, 254, 175, 227, 255, 0, 148, 44, 199, 81, 76, 243, 104, 243, 104, 255, 0, 87, 241, 255, 0, 202, 22, 101, 203, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 165, 226, 159, 249, 26, 47, 255, 0, 235, 173, 101, 88, 203, 255, 0, 19, 11, 111, 250, 234, 191, 206, 181, 124, 85, 255, 0, 35, 77, 255, 0, 253, 117, 173, 105, 101, 245, 240, 122, 86, 86, 185, 189, 19, 34, 138, 40, 173, 142, 128, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 89, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 218, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 199, 254, 66, 54, 191, 245, 213, 127, 152, 173, 31, 21, 127, 200, 207, 168, 127, 215, 106, 206, 177, 255, 0, 144, 141, 175, 253, 117, 95, 230, 43, 71, 197, 95, 242, 51, 234, 31, 245, 218, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 54, 223, 245, 217, 127, 157, 104, 120, 171, 254, 70, 157, 67, 254, 186, 214, 125, 143, 252, 132, 109, 191, 235, 178, 255, 0, 58, 208, 241, 87, 252, 141, 58, 135, 253, 117, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 93, 223, 128, 63, 228, 111, 241, 231, 253, 133, 87, 255, 0, 69, 138, 225, 44, 127, 228, 35, 107, 255, 0, 93, 87, 249, 215, 119, 224, 15, 249, 27, 252, 121, 255, 0, 97, 85, 255, 0, 209, 98, 128, 59, 234, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 56, 15, 139, 223, 242, 40, 89, 255, 0, 216, 86, 211, 255, 0, 70, 10, 229, 188, 85, 255, 0, 35, 70, 161, 255, 0, 93, 141, 117, 63, 23, 191, 228, 80, 179, 255, 0, 176, 173, 167, 254, 140, 21, 203, 120, 171, 254, 70, 141, 67, 254, 187, 26, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 123, 31, 249, 8, 219, 127, 215, 101, 254, 117, 161, 226, 175, 249, 26, 47, 255, 0, 235, 173, 103, 216, 255, 0, 200, 70, 219, 254, 187, 47, 243, 173, 15, 21, 127, 200, 209, 127, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 183, 244, 172, 235, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 253, 40, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 181, 103, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 207, 168, 127, 215, 106, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 123, 31, 249, 9, 91, 127, 215, 85, 254, 98, 161, 241, 151, 252, 141, 186, 159, 253, 118, 254, 149, 53, 143, 252, 132, 173, 191, 235, 170, 255, 0, 49, 80, 248, 203, 254, 70, 237, 79, 254, 187, 127, 65, 65, 236, 228, 191, 199, 151, 161, 133, 69, 20, 80, 125, 40, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 107, 77, 255, 0, 144, 165, 167, 253, 118, 95, 231, 93, 79, 138, 191, 228, 103, 212, 63, 235, 181, 114, 218, 111, 252, 133, 173, 63, 235, 178, 255, 0, 58, 234, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 62, 123, 60, 222, 31, 51, 34, 138, 40, 160, 240, 130, 138, 40, 160, 15, 9, 190, 255, 0, 143, 251, 159, 250, 234, 223, 206, 160, 171, 23, 223, 241, 255, 0, 115, 255, 0, 93, 91, 249, 213, 122, 0, 40, 162, 138, 0, 191, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 174, 131, 226, 167, 252, 149, 15, 16, 255, 0, 215, 217, 254, 66, 185, 253, 11, 254, 70, 13, 51, 254, 190, 226, 255, 0, 208, 197, 116, 31, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 20, 1, 200, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 127, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 91, 255, 0, 20, 191, 228, 167, 248, 131, 254, 190, 143, 242, 21, 129, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 173, 255, 0, 138, 127, 242, 83, 252, 65, 255, 0, 95, 103, 249, 10, 0, 228, 104, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 191, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 174, 131, 226, 167, 252, 149, 15, 16, 255, 0, 215, 217, 254, 66, 185, 253, 11, 254, 70, 13, 51, 254, 190, 226, 255, 0, 208, 197, 116, 31, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 20, 1, 200, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 127, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 93, 7, 197, 79, 249, 42, 30, 33, 255, 0, 175, 179, 252, 133, 115, 250, 31, 252, 140, 26, 111, 253, 125, 69, 255, 0, 161, 10, 232, 62, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 40, 3, 144, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 254, 135, 255, 0, 35, 6, 155, 255, 0, 95, 81, 127, 232, 66, 183, 254, 41, 127, 201, 79, 241, 7, 253, 125, 31, 228, 43, 3, 67, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 33, 91, 255, 0, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 20, 1, 200, 209, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 127, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 93, 7, 197, 79, 249, 42, 30, 33, 255, 0, 175, 179, 252, 133, 115, 250, 23, 252, 140, 26, 103, 253, 125, 197, 255, 0, 161, 138, 232, 62, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 40, 3, 144, 162, 138, 40, 0, 171, 250, 31, 252, 135, 244, 223, 250, 250, 139, 255, 0, 66, 21, 66, 175, 232, 127, 242, 48, 105, 191, 245, 245, 23, 254, 132, 40, 3, 127, 226, 151, 252, 148, 255, 0, 16, 127, 215, 209, 254, 66, 185, 26, 235, 190, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 43, 145, 160, 2, 138, 40, 160, 11, 250, 23, 252, 140, 26, 103, 253, 125, 197, 255, 0, 161, 138, 232, 62, 42, 127, 201, 79, 241, 15, 253, 125, 159, 228, 43, 159, 208, 191, 228, 96, 211, 63, 235, 238, 47, 253, 12, 87, 65, 241, 79, 254, 74, 127, 136, 63, 235, 236, 255, 0, 33, 64, 28, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 23, 244, 47, 249, 24, 52, 207, 250, 251, 139, 255, 0, 67, 21, 191, 241, 75, 254, 74, 127, 136, 63, 235, 232, 255, 0, 33, 88, 26, 23, 252, 140, 26, 103, 253, 125, 197, 255, 0, 161, 138, 223, 248, 167, 255, 0, 37, 63, 196, 31, 245, 246, 127, 144, 160, 14, 70, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 11, 250, 23, 252, 140, 26, 103, 253, 125, 197, 255, 0, 161, 138, 232, 62, 42, 127, 201, 80, 241, 15, 253, 125, 159, 228, 43, 159, 208, 191, 228, 96, 211, 63, 235, 238, 47, 253, 12, 87, 65, 241, 79, 254, 74, 127, 136, 63, 235, 236, 255, 0, 33, 64, 28, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 23, 244, 47, 249, 24, 52, 223, 250, 250, 139, 255, 0, 67, 21, 208, 124, 84, 255, 0, 146, 161, 226, 31, 250, 251, 63, 200, 87, 63, 161, 127, 200, 193, 166, 255, 0, 215, 212, 95, 250, 24, 174, 131, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 128, 57, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 47, 232, 127, 242, 48, 105, 191, 245, 245, 23, 254, 132, 43, 127, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 176, 52, 63, 249, 24, 52, 223, 250, 250, 139, 255, 0, 66, 21, 191, 241, 79, 254, 74, 127, 136, 63, 235, 236, 255, 0, 33, 64, 28, 141, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 23, 244, 47, 249, 24, 52, 223, 250, 250, 139, 255, 0, 67, 21, 208, 124, 84, 255, 0, 146, 159, 226, 31, 250, 251, 63, 200, 87, 63, 161, 127, 200, 193, 166, 255, 0, 215, 212, 95, 250, 24, 174, 131, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 128, 57, 10, 40, 162, 128, 10, 40, 162, 128, 61, 210, 199, 254, 65, 246, 191, 245, 201, 127, 149, 89, 170, 214, 31, 242, 15, 181, 255, 0, 174, 75, 252, 170, 205, 0, 20, 81, 69, 0, 79, 101, 255, 0, 33, 27, 95, 250, 234, 191, 206, 172, 248, 187, 254, 70, 157, 75, 254, 186, 255, 0, 133, 86, 178, 255, 0, 144, 141, 175, 253, 117, 95, 231, 86, 124, 93, 255, 0, 35, 78, 165, 255, 0, 93, 127, 194, 189, 204, 139, 248, 239, 211, 245, 70, 53, 54, 49, 168, 162, 138, 250, 147, 32, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 205, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 215, 241, 87, 252, 141, 55, 255, 0, 245, 214, 178, 44, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 191, 138, 191, 228, 105, 191, 255, 0, 174, 181, 243, 25, 247, 197, 79, 230, 107, 72, 200, 162, 138, 43, 193, 54, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 213, 157, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 138, 209, 241, 87, 252, 140, 250, 135, 253, 118, 172, 235, 31, 249, 8, 218, 255, 0, 215, 85, 254, 98, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 35, 109, 255, 0, 93, 151, 249, 214, 135, 138, 191, 228, 105, 212, 63, 235, 173, 103, 216, 255, 0, 200, 70, 219, 254, 187, 47, 243, 173, 15, 21, 127, 200, 211, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 221, 248, 3, 254, 70, 255, 0, 30, 127, 216, 85, 127, 244, 88, 174, 18, 199, 254, 66, 54, 191, 245, 213, 127, 157, 119, 126, 0, 255, 0, 145, 191, 199, 159, 246, 21, 95, 253, 22, 40, 3, 190, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 3, 128, 248, 189, 255, 0, 34, 141, 159, 253, 133, 109, 63, 244, 96, 174, 91, 197, 95, 242, 52, 106, 31, 245, 216, 215, 83, 241, 127, 254, 69, 27, 79, 251, 10, 218, 127, 232, 193, 92, 183, 138, 191, 228, 103, 212, 63, 235, 181, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 109, 191, 235, 178, 255, 0, 58, 208, 241, 87, 252, 141, 23, 255, 0, 245, 214, 179, 236, 127, 228, 35, 7, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 180, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 219, 250, 86, 125, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 208, 241, 87, 252, 140, 250, 135, 253, 118, 254, 148, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 218, 179, 236, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 103, 212, 63, 235, 181, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 173, 191, 235, 170, 255, 0, 58, 135, 198, 95, 242, 55, 106, 127, 245, 219, 250, 10, 154, 199, 254, 66, 54, 223, 245, 213, 127, 157, 67, 227, 47, 249, 27, 181, 63, 250, 237, 253, 5, 7, 179, 146, 255, 0, 29, 250, 24, 84, 81, 69, 7, 210, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 22, 116, 223, 249, 10, 218, 127, 215, 101, 254, 117, 213, 120, 171, 254, 70, 157, 67, 254, 187, 127, 74, 229, 116, 223, 249, 10, 218, 127, 215, 101, 254, 117, 213, 120, 171, 254, 70, 157, 67, 254, 187, 127, 74, 15, 158, 207, 55, 135, 204, 200, 162, 138, 40, 60, 32, 162, 138, 40, 3, 194, 111, 191, 227, 254, 231, 254, 186, 183, 243, 168, 43, 67, 93, 183, 91, 93, 114, 242, 4, 206, 197, 148, 227, 53, 159, 64, 5, 20, 81, 64, 23, 244, 63, 249, 24, 52, 223, 250, 250, 139, 255, 0, 66, 21, 208, 124, 83, 255, 0, 146, 159, 226, 15, 250, 251, 63, 200, 87, 63, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 174, 131, 226, 167, 252, 149, 15, 16, 255, 0, 215, 217, 254, 66, 128, 57, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 47, 232, 95, 242, 48, 105, 159, 245, 247, 23, 254, 134, 43, 127, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 176, 52, 47, 249, 24, 52, 207, 250, 251, 139, 255, 0, 67, 21, 191, 241, 79, 254, 74, 127, 136, 63, 235, 236, 255, 0, 33, 64, 28, 141, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 23, 244, 47, 249, 24, 52, 207, 250, 251, 139, 255, 0, 67, 21, 208, 124, 83, 255, 0, 146, 159, 226, 15, 250, 251, 63, 200, 87, 63, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 174, 131, 226, 167, 252, 148, 255, 0, 16, 255, 0, 215, 217, 254, 66, 128, 57, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 47, 232, 127, 242, 48, 105, 191, 245, 245, 23, 254, 132, 43, 160, 248, 167, 255, 0, 37, 63, 196, 31, 245, 246, 127, 144, 174, 127, 67, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 33, 93, 7, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 0, 114, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 95, 208, 255, 0, 228, 96, 211, 127, 235, 234, 47, 253, 8, 86, 255, 0, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 96, 104, 127, 242, 48, 105, 191, 245, 245, 23, 254, 132, 43, 127, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 128, 57, 26, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 47, 232, 95, 242, 48, 105, 159, 245, 247, 23, 254, 134, 43, 160, 248, 167, 255, 0, 37, 63, 196, 31, 245, 246, 127, 144, 174, 127, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 93, 7, 197, 79, 249, 41, 254, 33, 255, 0, 175, 179, 252, 133, 0, 114, 20, 81, 69, 0, 21, 127, 67, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 33, 84, 42, 254, 135, 255, 0, 35, 6, 155, 255, 0, 95, 81, 127, 232, 66, 128, 55, 254, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 43, 145, 174, 187, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 185, 26, 0, 40, 162, 138, 0, 191, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 174, 131, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 185, 253, 11, 254, 70, 13, 51, 254, 190, 226, 255, 0, 208, 197, 116, 31, 21, 63, 228, 168, 120, 135, 254, 190, 207, 242, 20, 1, 200, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 127, 67, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 33, 91, 255, 0, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 21, 129, 161, 255, 0, 200, 193, 166, 255, 0, 215, 212, 95, 250, 16, 173, 255, 0, 138, 127, 242, 83, 252, 65, 255, 0, 95, 103, 249, 10, 0, 228, 104, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 191, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 174, 131, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 185, 253, 11, 254, 70, 13, 51, 254, 190, 226, 255, 0, 208, 197, 116, 31, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 20, 1, 200, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 127, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 93, 7, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 115, 250, 23, 252, 140, 26, 111, 253, 125, 69, 255, 0, 161, 138, 232, 62, 42, 127, 201, 79, 241, 15, 253, 125, 159, 228, 40, 3, 144, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 254, 135, 255, 0, 35, 6, 155, 255, 0, 95, 81, 127, 232, 66, 183, 254, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 43, 3, 67, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 33, 91, 255, 0, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 20, 1, 200, 209, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 127, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 93, 7, 197, 79, 249, 41, 254, 33, 255, 0, 175, 179, 252, 133, 115, 250, 23, 252, 140, 26, 111, 253, 125, 69, 255, 0, 161, 138, 232, 62, 42, 127, 201, 79, 241, 15, 253, 125, 159, 228, 40, 3, 144, 162, 138, 40, 0, 162, 138, 150, 4, 18, 92, 69, 25, 56, 12, 192, 103, 241, 160, 15, 111, 177, 255, 0, 144, 117, 175, 253, 114, 95, 229, 86, 106, 56, 20, 69, 4, 81, 14, 136, 0, 252, 170, 74, 0, 40, 162, 138, 0, 154, 195, 254, 66, 54, 191, 245, 213, 127, 157, 90, 241, 119, 252, 141, 58, 151, 253, 117, 255, 0, 10, 173, 97, 255, 0, 33, 27, 95, 250, 234, 191, 206, 172, 248, 187, 254, 70, 157, 75, 254, 186, 255, 0, 133, 123, 153, 23, 241, 223, 167, 234, 136, 169, 177, 141, 69, 20, 87, 212, 156, 225, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 5, 155, 31, 249, 8, 219, 127, 215, 85, 254, 117, 175, 226, 175, 249, 26, 111, 255, 0, 235, 173, 100, 88, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 127, 21, 127, 200, 209, 127, 255, 0, 93, 107, 230, 51, 239, 138, 159, 204, 214, 145, 145, 69, 20, 87, 130, 108, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 171, 62, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 120, 171, 254, 70, 125, 67, 254, 187, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 21, 163, 226, 175, 249, 25, 245, 15, 250, 237, 89, 246, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 67, 197, 95, 242, 51, 234, 31, 245, 218, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 54, 223, 245, 217, 127, 157, 104, 120, 171, 254, 70, 157, 67, 254, 186, 214, 125, 135, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 141, 58, 135, 253, 117, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 93, 215, 128, 63, 228, 111, 241, 231, 253, 133, 87, 255, 0, 69, 138, 225, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 215, 117, 224, 15, 249, 27, 252, 121, 255, 0, 97, 85, 255, 0, 209, 98, 128, 59, 234, 40, 162, 128, 10, 40, 162, 128, 56, 111, 19, 252, 86, 240, 207, 132, 181, 150, 210, 181, 73, 46, 197, 202, 198, 178, 31, 42, 29, 195, 7, 167, 53, 143, 255, 0, 11, 243, 192, 255, 0, 243, 210, 255, 0, 255, 0, 1, 255, 0, 250, 245, 228, 127, 30, 255, 0, 228, 167, 205, 255, 0, 94, 176, 255, 0, 42, 243, 10, 0, 250, 175, 254, 23, 231, 129, 255, 0, 231, 165, 255, 0, 254, 3, 255, 0, 245, 232, 255, 0, 133, 249, 224, 127, 249, 233, 127, 255, 0, 128, 255, 0, 253, 122, 249, 82, 138, 0, 250, 23, 198, 223, 21, 124, 51, 226, 237, 42, 207, 74, 210, 222, 237, 174, 91, 81, 182, 144, 121, 176, 237, 24, 14, 51, 93, 78, 191, 105, 225, 183, 215, 175, 26, 235, 86, 184, 134, 224, 190, 100, 141, 97, 200, 6, 190, 96, 208, 191, 228, 96, 211, 63, 235, 238, 47, 253, 12, 87, 208, 190, 42, 255, 0, 145, 163, 80, 255, 0, 174, 191, 210, 128, 44, 125, 135, 194, 95, 244, 26, 186, 255, 0, 191, 52, 125, 135, 194, 127, 244, 26, 187, 255, 0, 191, 53, 129, 69, 0, 111, 253, 135, 194, 127, 244, 26, 187, 255, 0, 191, 52, 125, 135, 194, 127, 244, 26, 187, 255, 0, 191, 53, 129, 69, 0, 111, 253, 135, 194, 127, 244, 26, 187, 255, 0, 191, 52, 125, 135, 194, 127, 244, 26, 187, 255, 0, 191, 53, 129, 69, 0, 111, 253, 135, 194, 127, 244, 26, 187, 255, 0, 191, 52, 125, 135, 194, 127, 244, 26, 187, 255, 0, 191, 53, 129, 69, 0, 116, 214, 182, 126, 22, 23, 144, 249, 122, 205, 209, 125, 224, 168, 242, 122, 156, 213, 189, 126, 211, 195, 79, 174, 222, 53, 214, 173, 113, 21, 193, 124, 201, 26, 197, 144, 13, 114, 150, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 214, 128, 44, 125, 139, 194, 95, 244, 28, 187, 255, 0, 191, 52, 125, 139, 194, 95, 244, 28, 187, 255, 0, 191, 53, 129, 69, 0, 111, 253, 139, 194, 95, 244, 28, 187, 255, 0, 191, 52, 125, 139, 194, 95, 244, 28, 187, 255, 0, 191, 53, 129, 69, 0, 111, 253, 139, 194, 95, 244, 28, 187, 255, 0, 191, 52, 125, 139, 194, 95, 244, 28, 187, 255, 0, 191, 53, 129, 69, 0, 111, 253, 139, 194, 95, 244, 28, 187, 255, 0, 191, 52, 125, 139, 194, 95, 244, 28, 187, 255, 0, 191, 53, 129, 69, 0, 116, 214, 182, 126, 22, 23, 144, 24, 245, 171, 162, 251, 193, 65, 228, 245, 231, 165, 91, 215, 237, 124, 55, 38, 189, 120, 215, 90, 181, 196, 55, 5, 242, 241, 172, 89, 0, 215, 43, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 70, 161, 255, 0, 93, 141, 0, 88, 251, 23, 132, 191, 232, 53, 119, 255, 0, 126, 104, 251, 23, 132, 191, 232, 53, 119, 255, 0, 126, 107, 2, 138, 0, 223, 251, 23, 132, 191, 232, 53, 119, 255, 0, 126, 104, 251, 23, 132, 191, 232, 53, 119, 255, 0, 126, 107, 2, 138, 0, 223, 251, 23, 132, 191, 232, 53, 119, 255, 0, 126, 104, 251, 23, 132, 191, 232, 53, 119, 255, 0, 126, 107, 2, 138, 0, 223, 251, 23, 132, 191, 232, 53, 119, 255, 0, 126, 104, 251, 23, 132, 191, 232, 53, 119, 255, 0, 126, 107, 2, 138, 0, 233, 173, 108, 252, 44, 47, 32, 49, 235, 87, 69, 247, 130, 131, 201, 235, 207, 74, 185, 175, 218, 248, 110, 77, 122, 241, 174, 181, 107, 136, 110, 11, 254, 242, 53, 139, 32, 26, 229, 44, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 104, 212, 63, 235, 177, 160, 11, 31, 98, 240, 151, 253, 6, 174, 255, 0, 239, 205, 31, 98, 240, 151, 253, 6, 174, 255, 0, 239, 205, 96, 81, 64, 27, 255, 0, 98, 240, 151, 253, 6, 174, 255, 0, 239, 205, 31, 98, 240, 151, 253, 6, 174, 255, 0, 239, 205, 96, 81, 64, 27, 255, 0, 98, 240, 151, 253, 6, 174, 255, 0, 239, 205, 31, 98, 240, 151, 253, 6, 174, 255, 0, 239, 205, 96, 81, 64, 27, 255, 0, 98, 240, 151, 253, 6, 174, 255, 0, 239, 205, 31, 98, 240, 151, 253, 6, 174, 255, 0, 239, 205, 96, 81, 64, 29, 53, 173, 159, 133, 133, 228, 62, 94, 181, 116, 95, 120, 32, 121, 61, 78, 107, 154, 241, 151, 252, 141, 218, 159, 253, 118, 254, 130, 165, 178, 255, 0, 144, 141, 183, 253, 117, 95, 231, 81, 120, 203, 254, 70, 237, 79, 254, 187, 127, 65, 65, 236, 228, 191, 199, 126, 134, 21, 20, 81, 65, 244, 161, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 5, 157, 55, 254, 66, 182, 159, 245, 217, 127, 157, 122, 38, 191, 107, 225, 185, 53, 235, 198, 186, 213, 174, 33, 184, 50, 101, 163, 88, 178, 1, 197, 121, 222, 155, 255, 0, 33, 91, 79, 250, 236, 191, 206, 186, 175, 21, 127, 200, 209, 168, 127, 215, 99, 65, 243, 217, 230, 240, 249, 150, 62, 197, 225, 47, 250, 14, 93, 255, 0, 223, 154, 62, 197, 225, 47, 250, 14, 93, 255, 0, 223, 154, 192, 162, 131, 194, 55, 254, 197, 225, 47, 250, 13, 93, 127, 223, 154, 62, 197, 225, 47, 250, 13, 93, 127, 223, 154, 192, 162, 128, 60, 127, 198, 107, 110, 158, 47, 213, 22, 214, 86, 150, 1, 49, 8, 236, 48, 72, 172, 42, 233, 124, 115, 26, 71, 226, 105, 124, 181, 198, 228, 82, 125, 205, 115, 84, 0, 81, 69, 20, 1, 111, 76, 157, 44, 245, 107, 43, 153, 51, 178, 41, 210, 70, 199, 160, 32, 214, 191, 142, 117, 123, 93, 127, 198, 186, 174, 173, 100, 92, 218, 221, 79, 230, 71, 188, 96, 227, 3, 181, 115, 180, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 5, 189, 50, 116, 180, 213, 44, 238, 36, 206, 200, 166, 73, 27, 30, 128, 131, 94, 165, 241, 31, 225, 214, 191, 121, 168, 235, 94, 50, 138, 56, 14, 145, 47, 250, 90, 147, 47, 207, 176, 129, 219, 214, 188, 138, 190, 189, 241, 175, 252, 144, 219, 223, 251, 4, 199, 252, 150, 128, 62, 102, 240, 143, 130, 117, 143, 27, 93, 92, 219, 232, 235, 11, 73, 110, 129, 223, 205, 147, 111, 4, 226, 170, 248, 163, 194, 250, 151, 132, 53, 134, 210, 245, 69, 137, 110, 66, 9, 63, 116, 251, 134, 15, 78, 107, 213, 63, 102, 223, 249, 24, 181, 191, 250, 244, 143, 255, 0, 66, 172, 15, 143, 159, 242, 83, 166, 255, 0, 175, 72, 127, 145, 160, 12, 221, 75, 225, 23, 138, 116, 191, 13, 201, 174, 220, 197, 104, 44, 163, 128, 78, 74, 207, 150, 218, 113, 219, 241, 172, 111, 8, 248, 39, 88, 241, 181, 213, 205, 190, 142, 176, 180, 150, 232, 29, 252, 217, 54, 240, 78, 43, 233, 159, 26, 255, 0, 201, 15, 189, 255, 0, 176, 76, 127, 201, 107, 203, 255, 0, 102, 239, 249, 24, 181, 191, 250, 244, 143, 255, 0, 67, 160, 15, 44, 241, 71, 134, 53, 31, 8, 235, 47, 165, 106, 139, 18, 220, 170, 9, 63, 116, 219, 134, 15, 78, 107, 163, 212, 126, 17, 120, 167, 75, 240, 220, 186, 237, 196, 86, 159, 98, 142, 1, 59, 21, 159, 45, 180, 227, 183, 227, 90, 95, 31, 63, 228, 167, 205, 255, 0, 94, 176, 255, 0, 35, 94, 219, 227, 111, 249, 33, 183, 223, 246, 10, 143, 249, 45, 0, 124, 207, 225, 31, 4, 234, 254, 54, 186, 184, 182, 209, 210, 22, 146, 221, 3, 191, 155, 38, 222, 9, 197, 85, 241, 71, 133, 245, 47, 8, 235, 13, 165, 234, 139, 16, 185, 8, 36, 196, 79, 184, 96, 244, 230, 189, 79, 246, 110, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 58, 193, 248, 249, 255, 0, 37, 58, 111, 250, 244, 135, 249, 26, 0, 130, 63, 133, 126, 38, 208, 108, 173, 252, 77, 125, 21, 176, 211, 173, 124, 171, 185, 10, 77, 150, 242, 242, 15, 3, 215, 21, 29, 214, 131, 123, 241, 83, 226, 6, 191, 123, 225, 149, 71, 137, 164, 243, 255, 0, 210, 27, 203, 59, 79, 21, 239, 62, 54, 255, 0, 146, 31, 123, 255, 0, 96, 152, 255, 0, 146, 215, 152, 126, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 64, 30, 87, 226, 127, 11, 234, 62, 17, 214, 91, 75, 213, 22, 33, 114, 16, 73, 136, 159, 112, 193, 233, 205, 116, 122, 143, 194, 31, 20, 233, 126, 27, 151, 93, 185, 138, 208, 89, 71, 0, 157, 136, 159, 45, 180, 227, 183, 227, 90, 95, 31, 63, 228, 167, 207, 255, 0, 94, 176, 255, 0, 35, 94, 219, 227, 111, 249, 33, 215, 223, 246, 10, 143, 249, 45, 0, 124, 207, 225, 31, 4, 234, 254, 54, 186, 184, 182, 209, 146, 22, 146, 221, 4, 143, 230, 201, 183, 130, 113, 85, 124, 81, 225, 141, 71, 194, 58, 203, 233, 90, 162, 196, 183, 42, 130, 79, 221, 54, 225, 131, 211, 154, 245, 63, 217, 187, 254, 70, 45, 111, 254, 189, 35, 255, 0, 208, 235, 7, 227, 231, 252, 149, 9, 255, 0, 235, 214, 31, 229, 64, 24, 122, 247, 195, 47, 17, 248, 115, 195, 145, 235, 183, 241, 219, 11, 23, 217, 130, 147, 101, 190, 110, 156, 82, 232, 31, 12, 124, 71, 226, 79, 14, 73, 174, 233, 241, 219, 27, 20, 223, 146, 243, 97, 190, 94, 188, 87, 180, 252, 94, 255, 0, 146, 29, 103, 255, 0, 110, 159, 202, 143, 131, 255, 0, 242, 68, 110, 254, 183, 127, 202, 128, 60, 27, 194, 30, 9, 214, 60, 109, 119, 115, 111, 163, 172, 45, 37, 186, 7, 127, 54, 77, 131, 4, 226, 162, 255, 0, 132, 67, 84, 255, 0, 132, 203, 254, 17, 93, 177, 127, 105, 249, 254, 70, 55, 252, 187, 177, 158, 181, 233, 255, 0, 179, 111, 252, 140, 90, 223, 253, 122, 71, 255, 0, 161, 85, 3, 255, 0, 39, 63, 255, 0, 113, 95, 253, 150, 128, 56, 253, 111, 194, 26, 175, 195, 239, 16, 233, 95, 219, 169, 18, 238, 145, 103, 30, 75, 239, 249, 85, 134, 107, 164, 248, 173, 224, 157, 98, 45, 71, 81, 241, 145, 88, 127, 178, 47, 103, 89, 34, 127, 51, 231, 195, 129, 140, 138, 219, 253, 164, 191, 228, 98, 209, 63, 235, 210, 79, 253, 10, 186, 255, 0, 139, 223, 242, 67, 172, 190, 150, 159, 200, 80, 7, 139, 104, 31, 12, 60, 71, 226, 79, 13, 190, 187, 167, 197, 106, 108, 83, 126, 75, 205, 134, 249, 122, 241, 89, 254, 17, 240, 78, 177, 227, 107, 155, 139, 109, 29, 33, 105, 45, 208, 59, 249, 178, 109, 224, 156, 87, 189, 124, 31, 255, 0, 146, 35, 117, 255, 0, 111, 127, 202, 184, 255, 0, 217, 183, 254, 70, 45, 111, 254, 189, 99, 255, 0, 208, 168, 3, 203, 255, 0, 225, 17, 213, 63, 225, 50, 255, 0, 132, 91, 108, 95, 218, 126, 127, 145, 141, 255, 0, 46, 239, 173, 77, 226, 255, 0, 4, 235, 30, 9, 186, 183, 183, 214, 18, 21, 123, 133, 46, 158, 84, 155, 198, 1, 197, 119, 63, 243, 115, 223, 247, 21, 255, 0, 217, 107, 71, 246, 145, 255, 0, 145, 131, 67, 255, 0, 175, 89, 63, 244, 42, 0, 225, 117, 239, 134, 62, 35, 240, 231, 134, 211, 93, 212, 34, 181, 22, 79, 179, 5, 38, 220, 223, 55, 78, 41, 52, 15, 134, 62, 35, 241, 39, 135, 36, 215, 116, 248, 237, 141, 146, 111, 201, 121, 176, 223, 47, 94, 43, 218, 254, 47, 127, 201, 14, 181, 255, 0, 183, 79, 228, 41, 62, 16, 127, 201, 14, 188, 255, 0, 183, 191, 229, 64, 30, 13, 225, 15, 4, 235, 30, 54, 186, 184, 182, 209, 214, 22, 146, 221, 3, 191, 155, 38, 222, 9, 197, 69, 255, 0, 8, 150, 171, 255, 0, 9, 151, 252, 34, 187, 98, 254, 211, 243, 252, 140, 111, 249, 119, 117, 235, 94, 159, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 103, 255, 0, 205, 207, 255, 0, 220, 87, 255, 0, 101, 160, 14, 67, 92, 240, 126, 169, 240, 251, 196, 26, 87, 246, 234, 66, 187, 164, 89, 199, 146, 251, 254, 85, 97, 154, 218, 248, 185, 225, 141, 70, 207, 196, 51, 248, 158, 81, 31, 246, 110, 177, 63, 153, 106, 67, 252, 196, 21, 7, 145, 219, 138, 233, 127, 105, 47, 249, 24, 116, 79, 250, 244, 127, 253, 10, 175, 252, 116, 255, 0, 146, 123, 225, 15, 195, 255, 0, 69, 10, 0, 242, 191, 18, 248, 7, 92, 240, 166, 149, 97, 168, 234, 113, 192, 32, 189, 255, 0, 82, 99, 147, 113, 233, 158, 125, 56, 163, 196, 190, 1, 215, 60, 43, 165, 88, 106, 58, 156, 112, 44, 23, 191, 234, 140, 114, 238, 61, 51, 207, 225, 94, 171, 241, 219, 254, 73, 239, 132, 127, 15, 253, 20, 40, 248, 237, 255, 0, 36, 251, 194, 63, 135, 254, 138, 20, 1, 229, 94, 37, 240, 14, 185, 225, 77, 42, 195, 81, 212, 227, 129, 96, 189, 255, 0, 85, 229, 203, 184, 244, 207, 63, 133, 30, 37, 240, 14, 185, 225, 77, 42, 195, 81, 212, 227, 129, 96, 189, 255, 0, 85, 229, 203, 184, 244, 207, 63, 133, 122, 175, 199, 111, 249, 39, 222, 17, 252, 63, 244, 80, 163, 227, 183, 252, 147, 223, 8, 254, 31, 250, 40, 80, 7, 149, 120, 147, 192, 58, 231, 133, 116, 171, 13, 71, 83, 142, 5, 130, 251, 253, 73, 142, 77, 199, 166, 121, 244, 226, 143, 18, 120, 7, 92, 240, 174, 149, 97, 168, 234, 113, 192, 176, 95, 113, 9, 142, 77, 199, 166, 121, 244, 226, 189, 87, 227, 167, 252, 147, 175, 8, 255, 0, 192, 127, 244, 72, 163, 227, 167, 252, 147, 191, 8, 255, 0, 192, 127, 244, 80, 160, 15, 42, 241, 39, 128, 117, 207, 10, 233, 86, 26, 142, 167, 28, 11, 5, 247, 16, 152, 228, 220, 122, 103, 159, 78, 40, 241, 39, 128, 117, 207, 10, 233, 86, 26, 142, 167, 28, 11, 5, 239, 250, 147, 28, 155, 143, 76, 243, 233, 197, 122, 175, 199, 79, 249, 39, 126, 17, 255, 0, 128, 255, 0, 232, 161, 71, 199, 111, 249, 39, 222, 17, 252, 63, 244, 80, 160, 15, 53, 212, 124, 19, 172, 120, 36, 232, 186, 214, 178, 144, 173, 157, 196, 241, 200, 158, 84, 155, 155, 3, 13, 211, 233, 89, 190, 57, 213, 237, 117, 255, 0, 26, 234, 186, 181, 145, 127, 178, 221, 79, 230, 71, 188, 96, 227, 3, 181, 122, 231, 199, 111, 249, 39, 190, 17, 252, 63, 244, 80, 175, 1, 160, 2, 138, 40, 160, 2, 175, 232, 127, 242, 48, 105, 191, 245, 245, 23, 254, 132, 42, 133, 95, 208, 255, 0, 228, 96, 211, 127, 235, 234, 47, 253, 8, 80, 6, 255, 0, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 114, 53, 215, 124, 83, 255, 0, 146, 159, 226, 15, 250, 251, 63, 200, 87, 35, 64, 5, 20, 81, 64, 22, 244, 201, 214, 207, 86, 179, 185, 147, 59, 34, 157, 36, 108, 122, 2, 13, 118, 158, 56, 209, 238, 181, 247, 213, 124, 127, 100, 20, 232, 119, 87, 190, 90, 59, 182, 37, 207, 3, 149, 174, 2, 189, 123, 254, 109, 131, 254, 226, 191, 251, 53, 0, 113, 215, 127, 14, 117, 251, 45, 99, 70, 210, 229, 142, 223, 237, 58, 194, 9, 45, 113, 47, 4, 31, 83, 218, 139, 63, 135, 90, 253, 238, 179, 172, 233, 80, 199, 7, 218, 180, 132, 50, 93, 3, 47, 0, 15, 67, 222, 189, 131, 196, 95, 242, 83, 126, 24, 127, 215, 178, 127, 33, 71, 135, 191, 228, 168, 252, 78, 255, 0, 175, 71, 254, 84, 1, 226, 31, 240, 136, 234, 159, 240, 134, 255, 0, 194, 83, 182, 47, 236, 207, 63, 200, 207, 153, 243, 110, 250, 86, 133, 223, 195, 173, 126, 203, 89, 209, 116, 169, 210, 220, 92, 235, 10, 30, 212, 9, 114, 48, 125, 125, 43, 175, 255, 0, 155, 97, 255, 0, 184, 175, 254, 205, 93, 135, 136, 255, 0, 228, 166, 124, 47, 255, 0, 175, 100, 254, 66, 128, 60, 130, 211, 225, 207, 136, 47, 117, 157, 103, 74, 138, 59, 127, 181, 105, 8, 94, 232, 25, 120, 3, 216, 247, 170, 31, 240, 136, 106, 191, 240, 134, 255, 0, 194, 83, 182, 47, 236, 191, 63, 200, 206, 255, 0, 155, 118, 113, 210, 189, 187, 195, 255, 0, 242, 83, 254, 39, 127, 215, 171, 127, 42, 228, 71, 252, 155, 9, 255, 0, 176, 175, 254, 205, 64, 28, 109, 223, 195, 157, 126, 203, 88, 209, 180, 185, 99, 183, 251, 78, 174, 130, 75, 80, 37, 224, 131, 234, 123, 82, 218, 252, 57, 241, 5, 238, 181, 172, 233, 81, 71, 7, 218, 180, 132, 50, 93, 3, 47, 0, 123, 30, 245, 235, 254, 34, 255, 0, 146, 157, 240, 195, 254, 189, 23, 249, 81, 225, 223, 249, 42, 95, 19, 127, 235, 209, 191, 149, 0, 120, 230, 157, 225, 141, 74, 211, 66, 180, 241, 147, 170, 127, 100, 69, 122, 177, 150, 18, 124, 249, 13, 233, 91, 255, 0, 16, 60, 49, 168, 234, 126, 53, 241, 46, 171, 108, 34, 54, 177, 194, 186, 147, 22, 108, 31, 38, 64, 54, 241, 235, 90, 191, 243, 108, 31, 247, 21, 255, 0, 217, 171, 160, 215, 255, 0, 230, 112, 255, 0, 177, 82, 203, 250, 80, 7, 149, 221, 120, 3, 92, 180, 251, 127, 153, 28, 3, 236, 54, 81, 223, 205, 137, 122, 68, 253, 49, 234, 104, 186, 240, 6, 185, 103, 246, 255, 0, 54, 56, 7, 216, 108, 163, 191, 155, 18, 244, 137, 250, 99, 212, 215, 170, 248, 131, 254, 103, 31, 251, 21, 44, 191, 165, 26, 255, 0, 252, 206, 31, 246, 42, 89, 127, 74, 0, 242, 171, 175, 0, 107, 150, 191, 111, 243, 82, 15, 244, 27, 40, 239, 166, 196, 159, 242, 201, 250, 99, 212, 210, 92, 248, 7, 92, 181, 251, 127, 154, 150, 255, 0, 232, 54, 81, 223, 77, 137, 63, 229, 147, 244, 199, 169, 246, 175, 86, 215, 255, 0, 230, 112, 255, 0, 177, 82, 203, 250, 83, 117, 238, 158, 48, 255, 0, 177, 82, 203, 250, 80, 7, 150, 92, 248, 3, 91, 179, 251, 127, 154, 144, 127, 160, 217, 69, 125, 54, 37, 255, 0, 150, 79, 211, 30, 244, 92, 248, 3, 91, 179, 251, 127, 154, 144, 127, 160, 217, 69, 125, 54, 37, 255, 0, 150, 79, 211, 30, 245, 234, 122, 255, 0, 252, 205, 255, 0, 246, 42, 217, 127, 74, 53, 255, 0, 249, 155, 255, 0, 236, 85, 178, 254, 148, 1, 229, 151, 62, 0, 214, 236, 254, 223, 230, 164, 31, 232, 54, 81, 95, 77, 137, 127, 229, 147, 244, 199, 189, 23, 62, 0, 215, 45, 62, 223, 230, 71, 8, 251, 13, 140, 119, 243, 98, 78, 145, 63, 76, 122, 154, 245, 61, 127, 254, 102, 255, 0, 251, 21, 108, 191, 165, 59, 95, 233, 226, 255, 0, 251, 21, 108, 191, 165, 0, 121, 173, 183, 130, 53, 157, 35, 86, 123, 155, 168, 225, 242, 244, 184, 96, 212, 174, 54, 190, 127, 114, 196, 17, 143, 83, 237, 90, 159, 16, 124, 49, 169, 106, 126, 53, 241, 46, 171, 108, 34, 54, 177, 193, 30, 164, 73, 108, 31, 38, 64, 54, 241, 235, 237, 93, 182, 189, 255, 0, 51, 135, 253, 138, 182, 95, 210, 141, 127, 167, 140, 63, 236, 84, 178, 254, 148, 1, 229, 87, 94, 0, 214, 236, 133, 255, 0, 156, 144, 127, 160, 217, 71, 125, 54, 217, 51, 251, 169, 58, 99, 222, 139, 159, 0, 235, 118, 159, 111, 50, 164, 31, 232, 54, 81, 223, 77, 137, 63, 229, 148, 157, 49, 239, 237, 94, 169, 175, 127, 204, 223, 255, 0, 98, 173, 151, 244, 166, 235, 221, 60, 97, 255, 0, 98, 173, 151, 244, 160, 15, 45, 185, 240, 6, 183, 103, 246, 255, 0, 53, 32, 255, 0, 65, 178, 138, 250, 108, 75, 255, 0, 44, 159, 166, 61, 232, 185, 240, 6, 183, 103, 246, 255, 0, 53, 32, 255, 0, 65, 178, 138, 250, 108, 75, 255, 0, 44, 159, 166, 61, 235, 212, 245, 255, 0, 249, 155, 255, 0, 236, 85, 178, 254, 148, 107, 255, 0, 243, 55, 255, 0, 216, 171, 101, 253, 40, 3, 202, 191, 225, 0, 215, 127, 231, 156, 63, 247, 242, 143, 248, 64, 53, 223, 249, 231, 7, 253, 253, 175, 84, 236, 62, 180, 239, 241, 160, 15, 41, 255, 0, 132, 3, 93, 255, 0, 158, 112, 127, 223, 218, 63, 225, 0, 215, 127, 231, 156, 31, 247, 246, 189, 91, 214, 143, 90, 0, 243, 93, 47, 193, 26, 205, 166, 173, 103, 113, 34, 66, 18, 41, 227, 145, 177, 39, 96, 65, 173, 95, 28, 248, 99, 82, 215, 252, 109, 170, 234, 182, 41, 25, 181, 186, 155, 204, 136, 187, 96, 227, 3, 181, 118, 191, 225, 77, 255, 0, 10, 0, 242, 191, 248, 64, 53, 223, 249, 231, 15, 253, 253, 163, 254, 16, 13, 115, 254, 121, 67, 255, 0, 127, 43, 213, 135, 106, 7, 106, 0, 242, 159, 248, 64, 53, 239, 249, 229, 15, 253, 252, 163, 254, 16, 13, 123, 254, 121, 67, 255, 0, 127, 43, 213, 191, 198, 155, 254, 52, 1, 229, 127, 240, 128, 107, 159, 243, 206, 15, 251, 251, 71, 252, 32, 26, 231, 252, 243, 131, 254, 254, 215, 171, 122, 210, 250, 208, 7, 148, 127, 194, 1, 174, 127, 207, 56, 63, 239, 237, 31, 240, 128, 107, 159, 243, 206, 15, 251, 251, 94, 169, 254, 20, 239, 226, 31, 74, 0, 243, 77, 51, 192, 250, 213, 182, 169, 103, 112, 241, 194, 18, 57, 146, 70, 196, 157, 129, 6, 179, 124, 115, 171, 90, 235, 254, 53, 213, 117, 107, 45, 230, 218, 234, 115, 36, 123, 198, 14, 48, 43, 214, 199, 106, 240, 58, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 183, 166, 78, 150, 122, 181, 149, 204, 153, 217, 20, 233, 35, 99, 208, 16, 107, 95, 199, 58, 189, 174, 191, 227, 93, 87, 86, 178, 46, 109, 110, 167, 243, 35, 222, 48, 113, 129, 218, 185, 218, 40, 0, 162, 138, 40, 0, 171, 90, 112, 79, 237, 43, 79, 48, 225, 60, 213, 220, 125, 6, 106, 173, 106, 248, 110, 36, 159, 196, 118, 9, 34, 134, 67, 40, 200, 61, 232, 3, 232, 127, 177, 120, 75, 254, 131, 87, 127, 247, 230, 143, 177, 120, 75, 254, 131, 87, 127, 247, 230, 176, 40, 160, 13, 255, 0, 177, 120, 75, 254, 131, 87, 127, 247, 230, 143, 177, 120, 75, 254, 131, 87, 127, 247, 230, 176, 40, 160, 14, 154, 214, 207, 194, 194, 242, 3, 30, 181, 116, 95, 120, 40, 60, 158, 188, 244, 172, 159, 23, 127, 200, 211, 169, 127, 215, 95, 240, 170, 182, 63, 242, 17, 181, 255, 0, 174, 171, 252, 234, 215, 139, 191, 228, 105, 212, 191, 235, 175, 248, 87, 185, 145, 127, 29, 250, 126, 168, 202, 166, 198, 53, 20, 81, 95, 82, 98, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 89, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 93, 142, 191, 107, 225, 183, 215, 111, 26, 239, 86, 184, 134, 225, 159, 50, 70, 177, 228, 10, 227, 172, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 191, 138, 191, 228, 104, 191, 255, 0, 174, 181, 243, 25, 247, 197, 79, 230, 107, 72, 177, 246, 47, 9, 127, 208, 106, 235, 254, 252, 209, 246, 47, 9, 127, 208, 106, 235, 254, 252, 214, 5, 21, 224, 155, 27, 255, 0, 98, 240, 151, 253, 6, 174, 191, 239, 205, 31, 98, 240, 151, 253, 6, 174, 191, 239, 205, 96, 81, 64, 27, 255, 0, 98, 240, 151, 253, 6, 174, 191, 239, 205, 31, 98, 240, 151, 253, 6, 174, 191, 239, 205, 96, 81, 64, 27, 255, 0, 98, 240, 151, 253, 6, 174, 191, 239, 205, 31, 98, 240, 151, 253, 6, 174, 191, 239, 205, 96, 81, 64, 29, 53, 173, 159, 133, 133, 228, 6, 61, 106, 232, 190, 240, 80, 121, 61, 121, 233, 86, 245, 251, 79, 13, 62, 189, 120, 215, 122, 181, 196, 51, 151, 204, 145, 172, 89, 0, 215, 41, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 2, 199, 216, 124, 37, 255, 0, 65, 187, 191, 251, 243, 71, 216, 124, 37, 255, 0, 65, 187, 191, 251, 243, 88, 20, 80, 6, 255, 0, 216, 124, 37, 255, 0, 65, 187, 191, 251, 243, 71, 216, 124, 37, 255, 0, 65, 187, 191, 251, 243, 88, 20, 80, 6, 255, 0, 216, 124, 37, 255, 0, 65, 187, 191, 251, 243, 71, 216, 124, 37, 255, 0, 65, 187, 191, 251, 243, 88, 20, 80, 6, 255, 0, 216, 124, 37, 255, 0, 65, 187, 191, 251, 243, 71, 216, 124, 37, 255, 0, 65, 187, 191, 251, 243, 88, 20, 80, 7, 77, 107, 103, 225, 113, 121, 1, 143, 90, 186, 47, 188, 20, 30, 79, 94, 122, 85, 189, 126, 211, 195, 79, 175, 94, 53, 222, 173, 113, 12, 229, 243, 36, 107, 22, 64, 53, 202, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 207, 168, 127, 215, 106, 0, 177, 246, 31, 9, 127, 208, 110, 239, 254, 252, 209, 246, 31, 9, 127, 208, 110, 239, 254, 252, 214, 5, 20, 1, 191, 246, 31, 9, 127, 208, 110, 239, 254, 252, 209, 246, 31, 9, 127, 208, 110, 239, 254, 252, 214, 5, 20, 1, 191, 246, 31, 9, 127, 208, 110, 239, 254, 252, 209, 246, 31, 9, 127, 208, 110, 239, 254, 252, 214, 5, 20, 1, 191, 246, 31, 9, 127, 208, 110, 239, 254, 252, 209, 246, 31, 9, 127, 208, 110, 239, 254, 252, 214, 5, 20, 1, 211, 91, 89, 248, 88, 94, 66, 99, 214, 174, 139, 239, 4, 15, 39, 169, 205, 91, 215, 237, 60, 55, 38, 187, 120, 215, 122, 181, 196, 55, 5, 243, 36, 107, 22, 64, 174, 82, 199, 254, 66, 54, 223, 245, 213, 127, 157, 104, 248, 171, 254, 70, 139, 255, 0, 250, 235, 64, 22, 62, 197, 225, 47, 250, 13, 93, 255, 0, 223, 154, 62, 197, 225, 47, 250, 13, 93, 255, 0, 223, 154, 192, 162, 128, 55, 254, 197, 225, 47, 250, 13, 93, 255, 0, 223, 154, 62, 197, 225, 47, 250, 13, 93, 255, 0, 223, 154, 192, 162, 128, 55, 254, 197, 225, 47, 250, 13, 93, 255, 0, 223, 154, 62, 197, 225, 47, 250, 13, 93, 255, 0, 223, 154, 192, 162, 128, 55, 254, 197, 225, 47, 250, 13, 93, 255, 0, 223, 154, 62, 197, 225, 47, 250, 13, 93, 255, 0, 223, 154, 192, 162, 128, 58, 107, 107, 63, 11, 11, 200, 12, 122, 213, 209, 125, 224, 168, 242, 122, 156, 214, 93, 135, 196, 93, 3, 193, 62, 56, 241, 157, 182, 174, 215, 11, 37, 198, 162, 36, 79, 38, 45, 220, 5, 2, 170, 88, 255, 0, 200, 70, 215, 254, 187, 47, 243, 175, 42, 248, 169, 255, 0, 37, 63, 196, 63, 245, 246, 127, 144, 160, 15, 125, 255, 0, 133, 249, 224, 127, 249, 237, 168, 127, 224, 57, 255, 0, 26, 63, 225, 126, 120, 31, 254, 123, 106, 31, 248, 14, 127, 198, 190, 83, 162, 128, 62, 172, 255, 0, 133, 249, 224, 127, 249, 237, 168, 127, 224, 57, 255, 0, 26, 187, 163, 124, 102, 240, 150, 187, 172, 90, 233, 86, 50, 94, 27, 155, 151, 242, 227, 243, 32, 192, 207, 215, 53, 242, 53, 117, 223, 11, 63, 228, 167, 248, 127, 254, 190, 199, 242, 52, 1, 208, 252, 123, 255, 0, 146, 161, 63, 253, 122, 195, 252, 171, 204, 43, 211, 254, 61, 255, 0, 201, 80, 159, 254, 189, 97, 254, 85, 230, 20, 0, 81, 69, 20, 1, 127, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 95, 66, 248, 171, 254, 70, 141, 67, 254, 186, 255, 0, 74, 249, 235, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 95, 66, 248, 171, 254, 70, 141, 67, 254, 186, 255, 0, 74, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 123, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 25, 245, 15, 250, 235, 89, 246, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 67, 197, 95, 242, 51, 234, 31, 245, 214, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 22, 191, 245, 213, 127, 157, 104, 120, 171, 254, 70, 125, 67, 254, 187, 86, 125, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 208, 241, 87, 252, 140, 250, 135, 253, 118, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 213, 159, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 191, 228, 35, 109, 255, 0, 93, 87, 249, 212, 62, 50, 255, 0, 145, 187, 83, 255, 0, 174, 223, 208, 84, 214, 95, 242, 17, 182, 255, 0, 174, 171, 252, 234, 31, 25, 127, 200, 221, 169, 255, 0, 215, 111, 232, 40, 61, 156, 151, 248, 239, 208, 194, 162, 138, 40, 62, 148, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 179, 166, 255, 0, 200, 86, 211, 254, 187, 47, 243, 174, 171, 197, 95, 242, 52, 106, 31, 245, 216, 215, 43, 166, 255, 0, 200, 86, 211, 254, 187, 47, 243, 174, 171, 197, 95, 242, 52, 106, 31, 245, 216, 208, 124, 246, 121, 188, 62, 102, 69, 20, 81, 65, 225, 5, 20, 81, 64, 30, 101, 241, 14, 216, 67, 173, 67, 56, 98, 76, 209, 114, 61, 49, 197, 113, 245, 223, 124, 72, 183, 31, 232, 87, 91, 185, 230, 60, 126, 181, 192, 208, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 95, 94, 248, 215, 254, 72, 109, 239, 253, 130, 99, 254, 75, 95, 33, 87, 215, 190, 53, 255, 0, 146, 29, 125, 255, 0, 96, 168, 255, 0, 146, 208, 7, 152, 126, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 88, 31, 31, 63, 228, 167, 77, 255, 0, 94, 144, 255, 0, 35, 91, 255, 0, 179, 111, 252, 140, 90, 223, 253, 122, 71, 255, 0, 161, 86, 7, 199, 207, 249, 41, 211, 127, 215, 164, 63, 200, 208, 7, 183, 120, 215, 254, 72, 125, 239, 253, 130, 99, 254, 75, 94, 95, 251, 55, 127, 200, 197, 173, 255, 0, 215, 164, 127, 250, 29, 122, 135, 141, 127, 228, 135, 222, 255, 0, 216, 38, 63, 228, 181, 229, 255, 0, 179, 119, 252, 140, 90, 223, 253, 122, 71, 255, 0, 161, 208, 6, 15, 199, 223, 249, 41, 243, 255, 0, 215, 164, 63, 200, 215, 182, 248, 219, 254, 72, 109, 247, 253, 130, 163, 254, 75, 94, 37, 241, 247, 254, 74, 124, 255, 0, 245, 233, 15, 242, 53, 237, 190, 54, 255, 0, 146, 27, 125, 255, 0, 96, 168, 255, 0, 146, 208, 7, 152, 254, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 88, 63, 31, 127, 228, 167, 205, 255, 0, 94, 144, 255, 0, 35, 91, 223, 179, 111, 252, 140, 90, 223, 253, 122, 71, 255, 0, 161, 86, 15, 199, 223, 249, 41, 243, 127, 215, 164, 63, 200, 208, 7, 182, 120, 215, 254, 72, 117, 239, 253, 130, 99, 254, 75, 94, 99, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 122, 119, 141, 127, 228, 135, 94, 255, 0, 216, 38, 63, 228, 181, 230, 63, 179, 111, 252, 140, 90, 223, 253, 122, 71, 255, 0, 161, 80, 6, 7, 199, 207, 249, 41, 211, 127, 215, 164, 63, 200, 215, 182, 248, 215, 254, 72, 117, 239, 253, 130, 99, 254, 75, 94, 37, 241, 243, 254, 74, 116, 223, 245, 233, 15, 242, 53, 237, 190, 53, 255, 0, 146, 29, 123, 255, 0, 96, 152, 255, 0, 146, 208, 7, 152, 254, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 88, 31, 31, 63, 228, 168, 79, 255, 0, 94, 176, 255, 0, 42, 223, 253, 155, 127, 228, 98, 214, 255, 0, 235, 210, 63, 253, 10, 176, 62, 62, 127, 201, 80, 159, 254, 189, 97, 254, 84, 1, 233, 223, 23, 191, 228, 135, 89, 255, 0, 219, 167, 242, 163, 224, 255, 0, 252, 145, 27, 191, 173, 223, 242, 163, 226, 247, 252, 144, 235, 63, 251, 116, 254, 84, 124, 31, 255, 0, 146, 35, 119, 245, 187, 254, 84, 1, 200, 126, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 84, 15, 252, 156, 255, 0, 253, 197, 127, 246, 90, 191, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 80, 63, 242, 115, 255, 0, 247, 21, 255, 0, 217, 104, 2, 255, 0, 237, 37, 255, 0, 35, 22, 137, 255, 0, 94, 146, 127, 232, 85, 215, 252, 94, 255, 0, 146, 29, 101, 244, 180, 254, 66, 185, 15, 218, 75, 254, 70, 45, 19, 254, 189, 36, 255, 0, 208, 171, 175, 248, 189, 255, 0, 36, 58, 203, 233, 105, 252, 133, 0, 47, 193, 239, 249, 34, 55, 95, 246, 247, 252, 171, 143, 253, 155, 127, 228, 98, 214, 255, 0, 235, 210, 63, 253, 10, 187, 15, 131, 223, 242, 68, 110, 191, 237, 239, 249, 87, 31, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 0, 103, 127, 205, 207, 127, 220, 87, 255, 0, 101, 173, 31, 218, 71, 254, 70, 13, 15, 254, 189, 100, 255, 0, 208, 171, 59, 254, 110, 123, 254, 226, 191, 251, 45, 104, 254, 210, 63, 242, 48, 104, 127, 245, 235, 39, 254, 133, 64, 29, 135, 197, 239, 249, 33, 214, 191, 246, 233, 252, 133, 39, 194, 15, 249, 33, 215, 159, 246, 247, 252, 169, 126, 47, 127, 201, 14, 181, 255, 0, 183, 79, 228, 41, 62, 16, 127, 201, 14, 188, 255, 0, 183, 191, 229, 64, 28, 135, 236, 219, 255, 0, 35, 22, 183, 255, 0, 94, 145, 255, 0, 232, 85, 64, 127, 201, 207, 255, 0, 220, 87, 255, 0, 101, 171, 255, 0, 179, 111, 252, 140, 90, 223, 253, 122, 71, 255, 0, 161, 85, 1, 255, 0, 39, 63, 255, 0, 113, 95, 253, 150, 128, 47, 254, 210, 95, 242, 48, 232, 159, 245, 232, 255, 0, 250, 21, 95, 248, 233, 255, 0, 36, 243, 194, 31, 135, 254, 138, 21, 67, 246, 146, 255, 0, 145, 135, 68, 255, 0, 175, 71, 255, 0, 208, 170, 255, 0, 199, 79, 249, 39, 158, 16, 252, 63, 244, 80, 160, 5, 248, 237, 255, 0, 36, 247, 194, 63, 135, 254, 138, 20, 124, 118, 255, 0, 146, 125, 225, 31, 195, 255, 0, 69, 10, 62, 59, 127, 201, 61, 240, 143, 225, 255, 0, 162, 133, 31, 29, 191, 228, 159, 120, 71, 240, 255, 0, 209, 66, 128, 15, 142, 223, 242, 79, 188, 35, 248, 127, 232, 161, 71, 199, 111, 249, 39, 190, 17, 252, 63, 244, 80, 163, 227, 183, 252, 147, 239, 8, 254, 31, 250, 40, 81, 241, 219, 254, 73, 239, 132, 127, 15, 253, 20, 40, 0, 248, 233, 255, 0, 36, 235, 194, 63, 240, 31, 253, 18, 40, 248, 233, 255, 0, 36, 239, 194, 63, 240, 31, 253, 20, 40, 248, 233, 255, 0, 36, 235, 194, 63, 240, 31, 253, 18, 40, 248, 233, 255, 0, 36, 239, 194, 63, 240, 31, 253, 20, 40, 0, 248, 233, 255, 0, 36, 239, 194, 63, 240, 31, 253, 20, 40, 248, 237, 255, 0, 36, 251, 194, 63, 135, 254, 138, 20, 124, 116, 255, 0, 146, 119, 225, 31, 248, 15, 254, 138, 20, 124, 118, 255, 0, 146, 125, 225, 31, 195, 255, 0, 69, 10, 0, 62, 59, 127, 201, 61, 240, 143, 225, 255, 0, 162, 133, 120, 13, 123, 247, 199, 111, 249, 39, 190, 17, 252, 63, 244, 80, 175, 1, 160, 2, 138, 40, 160, 2, 175, 232, 127, 242, 48, 105, 191, 245, 245, 23, 254, 132, 42, 133, 95, 208, 255, 0, 228, 96, 211, 127, 235, 234, 47, 253, 8, 80, 6, 255, 0, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 114, 53, 215, 124, 83, 255, 0, 146, 159, 226, 15, 250, 251, 63, 200, 87, 35, 64, 5, 20, 81, 64, 5, 122, 247, 252, 219, 7, 253, 197, 127, 246, 106, 242, 26, 245, 239, 249, 182, 15, 251, 138, 255, 0, 236, 212, 1, 215, 248, 139, 254, 74, 111, 195, 15, 250, 246, 79, 228, 40, 240, 247, 252, 149, 31, 137, 223, 245, 232, 255, 0, 202, 143, 17, 127, 201, 77, 248, 97, 255, 0, 94, 201, 252, 133, 30, 30, 255, 0, 146, 163, 241, 59, 254, 189, 31, 249, 80, 7, 31, 255, 0, 54, 195, 255, 0, 113, 95, 253, 154, 187, 15, 17, 255, 0, 201, 77, 248, 95, 255, 0, 94, 201, 252, 133, 113, 255, 0, 243, 108, 63, 247, 21, 255, 0, 217, 171, 176, 241, 31, 252, 148, 223, 133, 255, 0, 245, 236, 159, 200, 80, 1, 225, 255, 0, 249, 41, 255, 0, 19, 191, 235, 213, 191, 149, 114, 35, 254, 77, 128, 255, 0, 216, 87, 255, 0, 102, 174, 187, 195, 255, 0, 242, 83, 254, 39, 127, 215, 171, 127, 42, 228, 71, 252, 155, 1, 255, 0, 176, 175, 254, 205, 64, 29, 119, 136, 127, 228, 167, 124, 48, 255, 0, 175, 69, 254, 84, 120, 119, 254, 74, 151, 196, 223, 250, 244, 111, 229, 71, 136, 127, 228, 167, 124, 48, 255, 0, 175, 69, 254, 84, 120, 119, 254, 74, 151, 196, 223, 250, 244, 111, 229, 64, 28, 135, 252, 219, 7, 253, 197, 127, 246, 106, 232, 53, 255, 0, 249, 156, 63, 236, 84, 178, 254, 149, 207, 255, 0, 205, 176, 127, 220, 87, 255, 0, 102, 174, 131, 95, 255, 0, 153, 195, 254, 197, 75, 47, 233, 64, 11, 226, 15, 249, 156, 127, 236, 84, 178, 254, 148, 107, 223, 243, 56, 127, 216, 169, 101, 253, 40, 241, 7, 252, 206, 63, 246, 42, 89, 127, 74, 53, 255, 0, 249, 156, 127, 236, 85, 178, 254, 148, 0, 107, 255, 0, 243, 56, 127, 216, 169, 101, 253, 41, 186, 247, 79, 24, 127, 216, 169, 101, 253, 41, 218, 255, 0, 252, 206, 31, 246, 42, 89, 127, 74, 110, 189, 211, 198, 31, 246, 42, 89, 127, 74, 0, 60, 65, 255, 0, 51, 127, 253, 138, 182, 95, 210, 143, 16, 127, 204, 223, 255, 0, 98, 173, 151, 244, 163, 196, 31, 243, 55, 255, 0, 216, 171, 101, 253, 40, 241, 7, 252, 205, 255, 0, 246, 42, 217, 127, 74, 0, 53, 255, 0, 249, 155, 255, 0, 236, 85, 178, 254, 148, 237, 127, 167, 140, 127, 236, 85, 178, 254, 148, 221, 127, 254, 102, 255, 0, 251, 21, 108, 191, 165, 59, 95, 233, 227, 31, 251, 21, 108, 191, 165, 0, 26, 247, 252, 206, 31, 246, 42, 217, 127, 74, 53, 254, 158, 48, 255, 0, 177, 82, 203, 250, 81, 175, 127, 204, 225, 255, 0, 98, 173, 151, 244, 163, 95, 233, 227, 15, 251, 21, 44, 191, 165, 0, 38, 189, 255, 0, 51, 143, 253, 138, 182, 95, 210, 155, 175, 116, 241, 135, 253, 138, 182, 95, 210, 157, 175, 127, 204, 227, 255, 0, 98, 173, 151, 244, 166, 235, 221, 60, 97, 255, 0, 98, 173, 151, 244, 160, 5, 241, 7, 252, 205, 255, 0, 246, 42, 217, 127, 74, 60, 65, 255, 0, 51, 127, 253, 138, 182, 95, 210, 143, 16, 127, 204, 223, 255, 0, 98, 173, 151, 244, 163, 196, 31, 243, 55, 255, 0, 216, 171, 101, 253, 40, 1, 127, 132, 125, 105, 191, 227, 78, 254, 17, 245, 166, 255, 0, 141, 0, 59, 214, 143, 90, 61, 104, 245, 160, 3, 252, 41, 191, 225, 78, 255, 0, 10, 111, 248, 80, 3, 135, 106, 7, 106, 7, 106, 7, 106, 0, 63, 198, 143, 241, 163, 252, 104, 255, 0, 26, 0, 61, 105, 125, 105, 61, 105, 125, 104, 1, 159, 225, 78, 254, 33, 244, 166, 255, 0, 133, 59, 248, 135, 210, 128, 1, 218, 188, 6, 189, 248, 118, 175, 1, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 186, 15, 6, 91, 11, 143, 19, 219, 101, 136, 242, 243, 39, 229, 92, 253, 117, 223, 15, 109, 196, 186, 212, 179, 19, 254, 170, 46, 7, 174, 120, 160, 15, 79, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 107, 197, 223, 242, 52, 234, 95, 245, 215, 252, 42, 173, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 181, 226, 239, 249, 26, 117, 47, 250, 235, 254, 21, 238, 100, 95, 199, 126, 159, 170, 34, 166, 198, 53, 20, 81, 95, 82, 115, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 22, 108, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 191, 138, 191, 228, 104, 191, 255, 0, 174, 181, 145, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 181, 252, 85, 255, 0, 35, 69, 255, 0, 253, 117, 175, 152, 207, 190, 42, 127, 51, 90, 70, 69, 20, 81, 94, 9, 176, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 140, 250, 135, 253, 118, 172, 235, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 171, 58, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 187, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 209, 127, 255, 0, 93, 107, 62, 199, 254, 66, 54, 223, 245, 213, 127, 157, 104, 120, 171, 254, 70, 139, 255, 0, 250, 235, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 79, 99, 255, 0, 33, 27, 95, 250, 236, 191, 206, 188, 171, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 189, 86, 199, 254, 66, 54, 191, 245, 217, 127, 157, 121, 87, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 0, 114, 20, 81, 69, 0, 21, 215, 124, 44, 255, 0, 146, 159, 225, 255, 0, 250, 251, 31, 200, 215, 35, 93, 119, 194, 207, 249, 41, 254, 31, 255, 0, 175, 177, 252, 141, 0, 116, 63, 30, 255, 0, 228, 168, 79, 255, 0, 94, 176, 255, 0, 42, 243, 10, 244, 255, 0, 143, 127, 242, 84, 39, 255, 0, 175, 88, 127, 149, 121, 133, 0, 20, 81, 69, 0, 95, 208, 191, 228, 96, 211, 63, 235, 238, 47, 253, 12, 87, 208, 190, 42, 255, 0, 145, 163, 80, 255, 0, 174, 191, 210, 190, 122, 208, 191, 228, 96, 211, 63, 235, 238, 47, 253, 12, 87, 208, 190, 42, 255, 0, 145, 163, 80, 255, 0, 174, 191, 210, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 54, 223, 245, 213, 127, 157, 104, 120, 171, 254, 70, 125, 67, 254, 186, 214, 125, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 140, 250, 135, 253, 117, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 213, 159, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 103, 212, 63, 235, 181, 103, 216, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 15, 21, 127, 200, 207, 168, 127, 215, 106, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 123, 31, 249, 8, 219, 127, 215, 85, 254, 117, 15, 140, 191, 228, 110, 212, 255, 0, 235, 183, 244, 21, 53, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 135, 198, 95, 242, 55, 106, 127, 245, 219, 250, 10, 15, 103, 37, 254, 59, 244, 48, 168, 162, 138, 15, 165, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 44, 233, 191, 242, 21, 180, 255, 0, 174, 203, 252, 235, 170, 241, 87, 252, 141, 26, 135, 253, 118, 53, 202, 233, 191, 242, 21, 180, 255, 0, 174, 203, 252, 235, 170, 241, 87, 252, 141, 26, 135, 253, 118, 52, 31, 61, 158, 111, 15, 153, 145, 69, 20, 80, 120, 65, 69, 20, 80, 7, 39, 241, 6, 0, 254, 30, 89, 152, 115, 28, 195, 31, 141, 121, 117, 123, 39, 138, 237, 196, 222, 26, 190, 12, 187, 200, 77, 202, 61, 8, 239, 94, 55, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 125, 123, 227, 95, 249, 33, 215, 223, 246, 10, 143, 249, 45, 124, 133, 95, 94, 248, 215, 254, 72, 117, 247, 253, 130, 163, 254, 75, 64, 30, 97, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 96, 124, 124, 255, 0, 146, 157, 55, 253, 122, 67, 252, 141, 111, 254, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 88, 31, 31, 63, 228, 167, 77, 255, 0, 94, 144, 255, 0, 35, 64, 30, 221, 227, 95, 249, 33, 247, 191, 246, 9, 143, 249, 45, 121, 127, 236, 221, 255, 0, 35, 22, 183, 255, 0, 94, 145, 255, 0, 232, 117, 234, 30, 53, 255, 0, 146, 31, 123, 255, 0, 96, 152, 255, 0, 146, 215, 151, 254, 205, 223, 242, 49, 107, 127, 245, 233, 31, 254, 135, 64, 24, 63, 31, 63, 228, 167, 205, 255, 0, 94, 176, 255, 0, 35, 94, 219, 227, 111, 249, 33, 183, 223, 246, 10, 143, 249, 45, 120, 151, 199, 207, 249, 41, 243, 127, 215, 172, 63, 200, 215, 182, 248, 219, 254, 72, 109, 247, 253, 130, 163, 254, 75, 64, 30, 99, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 96, 252, 125, 255, 0, 146, 159, 55, 253, 122, 67, 252, 141, 111, 126, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 88, 63, 31, 127, 228, 167, 205, 255, 0, 94, 144, 255, 0, 35, 64, 30, 217, 227, 95, 249, 33, 215, 191, 246, 9, 143, 249, 45, 121, 143, 236, 219, 255, 0, 35, 22, 183, 255, 0, 94, 145, 255, 0, 232, 85, 233, 222, 53, 255, 0, 146, 29, 123, 255, 0, 96, 152, 255, 0, 146, 215, 152, 254, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 64, 24, 31, 31, 63, 228, 167, 207, 255, 0, 94, 176, 255, 0, 35, 94, 219, 227, 111, 249, 33, 215, 223, 246, 10, 143, 249, 45, 120, 151, 199, 207, 249, 41, 243, 255, 0, 215, 172, 63, 200, 215, 182, 248, 219, 254, 72, 117, 247, 253, 130, 163, 254, 75, 64, 30, 99, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 96, 124, 124, 255, 0, 146, 161, 63, 253, 122, 195, 252, 171, 127, 246, 109, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 42, 192, 248, 249, 255, 0, 37, 66, 127, 250, 245, 135, 249, 80, 7, 167, 124, 94, 255, 0, 146, 29, 103, 255, 0, 110, 159, 202, 143, 131, 255, 0, 242, 68, 110, 254, 183, 127, 202, 143, 139, 223, 242, 67, 172, 255, 0, 237, 211, 249, 81, 240, 127, 254, 72, 141, 223, 214, 239, 249, 80, 7, 33, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 80, 63, 242, 115, 255, 0, 247, 21, 255, 0, 217, 106, 255, 0, 236, 219, 255, 0, 35, 22, 183, 255, 0, 94, 145, 255, 0, 232, 85, 64, 255, 0, 201, 207, 255, 0, 220, 87, 255, 0, 101, 160, 11, 255, 0, 180, 151, 252, 140, 90, 39, 253, 122, 73, 255, 0, 161, 87, 95, 241, 123, 254, 72, 117, 151, 210, 211, 249, 10, 228, 63, 105, 47, 249, 24, 180, 79, 250, 244, 147, 255, 0, 66, 174, 191, 226, 247, 252, 144, 235, 47, 165, 167, 242, 20, 0, 191, 7, 191, 228, 136, 221, 127, 219, 223, 242, 174, 63, 246, 109, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 42, 236, 62, 15, 127, 201, 17, 186, 255, 0, 183, 191, 229, 92, 127, 236, 219, 255, 0, 35, 22, 183, 255, 0, 94, 145, 255, 0, 232, 84, 1, 157, 255, 0, 55, 61, 255, 0, 113, 95, 253, 150, 180, 127, 105, 31, 249, 24, 52, 63, 250, 245, 147, 255, 0, 66, 172, 239, 249, 185, 239, 251, 138, 255, 0, 236, 181, 163, 251, 72, 255, 0, 200, 193, 161, 255, 0, 215, 172, 159, 250, 21, 0, 118, 31, 23, 191, 228, 135, 90, 255, 0, 219, 167, 242, 20, 159, 8, 63, 228, 135, 94, 127, 219, 223, 242, 165, 248, 189, 255, 0, 36, 58, 215, 254, 221, 63, 144, 164, 248, 65, 255, 0, 36, 58, 243, 254, 222, 255, 0, 149, 0, 114, 31, 179, 111, 252, 140, 90, 223, 253, 122, 71, 255, 0, 161, 86, 127, 252, 220, 255, 0, 253, 197, 127, 246, 90, 208, 253, 155, 127, 228, 98, 214, 255, 0, 235, 210, 63, 253, 10, 179, 255, 0, 230, 231, 255, 0, 238, 43, 255, 0, 178, 208, 6, 135, 237, 37, 255, 0, 35, 14, 137, 255, 0, 94, 143, 255, 0, 161, 85, 255, 0, 142, 159, 242, 79, 60, 33, 248, 127, 232, 161, 84, 63, 105, 47, 249, 24, 116, 79, 250, 244, 127, 253, 10, 175, 252, 116, 255, 0, 146, 121, 225, 15, 195, 255, 0, 69, 10, 0, 95, 142, 223, 242, 79, 124, 35, 248, 127, 232, 161, 71, 199, 111, 249, 39, 222, 17, 252, 63, 244, 80, 163, 227, 183, 252, 147, 223, 8, 254, 31, 250, 40, 81, 241, 219, 254, 73, 247, 132, 127, 15, 253, 20, 40, 0, 248, 237, 255, 0, 36, 251, 194, 63, 135, 254, 138, 20, 124, 118, 255, 0, 146, 123, 225, 31, 195, 255, 0, 69, 10, 62, 59, 127, 201, 62, 240, 143, 225, 255, 0, 162, 133, 31, 29, 191, 228, 158, 248, 71, 240, 255, 0, 209, 66, 128, 15, 142, 159, 242, 78, 188, 35, 255, 0, 1, 255, 0, 209, 34, 143, 142, 159, 242, 78, 252, 35, 255, 0, 1, 255, 0, 209, 66, 143, 142, 159, 242, 78, 188, 35, 255, 0, 1, 255, 0, 209, 34, 143, 142, 159, 242, 78, 252, 35, 255, 0, 1, 255, 0, 209, 66, 128, 15, 142, 159, 242, 78, 252, 35, 255, 0, 1, 255, 0, 209, 66, 143, 142, 223, 242, 79, 188, 35, 248, 127, 232, 161, 71, 199, 79, 249, 39, 126, 17, 255, 0, 128, 255, 0, 232, 161, 71, 199, 111, 249, 39, 222, 17, 252, 63, 244, 80, 160, 3, 227, 183, 252, 147, 223, 8, 254, 31, 250, 40, 87, 128, 215, 191, 124, 118, 255, 0, 146, 123, 225, 31, 195, 255, 0, 69, 10, 240, 26, 0, 40, 162, 138, 0, 42, 254, 135, 255, 0, 35, 6, 155, 255, 0, 95, 81, 127, 232, 66, 168, 85, 253, 15, 254, 70, 13, 55, 254, 190, 162, 255, 0, 208, 133, 0, 111, 252, 83, 255, 0, 146, 159, 226, 15, 250, 251, 63, 200, 87, 35, 93, 119, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 114, 52, 0, 81, 69, 20, 0, 87, 175, 127, 205, 176, 127, 220, 87, 255, 0, 102, 175, 33, 175, 94, 255, 0, 155, 96, 255, 0, 184, 175, 254, 205, 64, 29, 127, 136, 191, 228, 166, 252, 48, 255, 0, 175, 100, 254, 66, 143, 15, 127, 201, 81, 248, 157, 255, 0, 94, 143, 252, 168, 241, 23, 252, 148, 223, 134, 31, 245, 236, 159, 200, 81, 225, 239, 249, 42, 63, 19, 191, 235, 209, 255, 0, 149, 0, 113, 255, 0, 243, 108, 63, 247, 21, 255, 0, 217, 171, 176, 241, 31, 252, 148, 223, 133, 255, 0, 245, 236, 159, 200, 87, 31, 255, 0, 54, 195, 255, 0, 113, 95, 253, 154, 187, 15, 17, 255, 0, 201, 77, 248, 95, 255, 0, 94, 201, 252, 133, 0, 30, 31, 255, 0, 146, 159, 241, 59, 254, 189, 91, 249, 87, 34, 63, 228, 216, 15, 253, 133, 127, 246, 106, 235, 188, 63, 255, 0, 37, 63, 226, 119, 253, 122, 183, 242, 174, 68, 127, 201, 176, 31, 251, 10, 255, 0, 236, 212, 1, 215, 120, 139, 254, 74, 119, 195, 15, 250, 244, 95, 229, 71, 135, 127, 228, 169, 124, 77, 255, 0, 175, 70, 254, 84, 120, 139, 254, 74, 119, 195, 15, 250, 244, 95, 229, 71, 135, 127, 228, 169, 124, 77, 255, 0, 175, 70, 254, 84, 1, 200, 127, 205, 176, 127, 220, 87, 255, 0, 102, 174, 131, 95, 255, 0, 153, 195, 254, 197, 75, 47, 233, 92, 255, 0, 252, 219, 7, 253, 197, 127, 246, 106, 232, 53, 255, 0, 249, 156, 63, 236, 84, 178, 254, 148, 0, 190, 32, 255, 0, 153, 199, 254, 197, 75, 47, 233, 70, 191, 255, 0, 51, 143, 253, 138, 182, 95, 210, 143, 16, 127, 204, 227, 255, 0, 98, 165, 151, 244, 163, 95, 255, 0, 153, 199, 254, 197, 91, 47, 233, 64, 6, 189, 247, 124, 95, 255, 0, 98, 165, 151, 244, 164, 215, 255, 0, 230, 112, 255, 0, 177, 82, 203, 250, 82, 235, 223, 119, 197, 255, 0, 246, 42, 89, 127, 74, 77, 127, 254, 103, 15, 251, 21, 44, 191, 165, 0, 39, 136, 63, 230, 111, 255, 0, 177, 86, 203, 250, 81, 226, 15, 249, 155, 255, 0, 236, 85, 178, 254, 148, 120, 131, 254, 102, 255, 0, 251, 21, 108, 191, 165, 30, 32, 255, 0, 153, 191, 254, 197, 91, 47, 233, 64, 7, 136, 63, 230, 111, 255, 0, 177, 86, 203, 250, 83, 188, 65, 255, 0, 51, 143, 253, 138, 182, 95, 210, 155, 226, 15, 249, 155, 255, 0, 236, 85, 178, 254, 148, 239, 16, 127, 204, 227, 255, 0, 98, 173, 151, 244, 160, 3, 94, 255, 0, 153, 195, 254, 197, 91, 47, 233, 70, 191, 211, 198, 31, 246, 42, 89, 127, 74, 53, 239, 249, 156, 63, 236, 85, 178, 254, 148, 107, 253, 60, 97, 255, 0, 98, 165, 151, 244, 160, 4, 215, 191, 230, 113, 255, 0, 177, 86, 203, 250, 83, 117, 238, 158, 48, 255, 0, 177, 86, 203, 250, 83, 181, 239, 249, 156, 127, 236, 85, 178, 254, 148, 221, 123, 167, 140, 63, 236, 85, 178, 254, 148, 0, 190, 32, 255, 0, 153, 191, 254, 197, 91, 47, 233, 71, 136, 63, 230, 111, 255, 0, 177, 86, 203, 250, 81, 226, 15, 249, 155, 255, 0, 236, 85, 178, 254, 148, 120, 131, 254, 102, 255, 0, 251, 21, 108, 191, 165, 0, 47, 240, 143, 173, 55, 252, 105, 223, 194, 62, 180, 223, 241, 160, 7, 122, 209, 235, 71, 173, 30, 180, 0, 127, 133, 55, 252, 41, 223, 225, 77, 255, 0, 10, 0, 112, 237, 64, 237, 64, 237, 64, 237, 64, 7, 248, 209, 254, 52, 127, 141, 31, 227, 64, 7, 173, 47, 173, 39, 173, 47, 173, 0, 51, 252, 41, 223, 196, 62, 148, 223, 240, 167, 127, 16, 250, 80, 0, 59, 87, 128, 215, 191, 14, 213, 224, 52, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 87, 160, 252, 56, 133, 124, 139, 251, 143, 226, 220, 19, 240, 235, 94, 125, 94, 169, 224, 59, 97, 23, 135, 124, 205, 155, 94, 89, 9, 39, 212, 118, 160, 14, 166, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 213, 175, 23, 127, 200, 211, 169, 127, 215, 95, 240, 170, 182, 63, 242, 17, 181, 255, 0, 174, 171, 252, 234, 215, 139, 191, 228, 105, 212, 191, 235, 175, 248, 87, 185, 145, 127, 29, 250, 126, 168, 138, 155, 24, 212, 81, 69, 125, 73, 206, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 89, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 254, 42, 255, 0, 145, 162, 255, 0, 254, 186, 214, 69, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 215, 241, 87, 252, 141, 23, 255, 0, 245, 214, 190, 99, 62, 248, 169, 252, 205, 105, 25, 20, 81, 69, 120, 38, 193, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 218, 179, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 181, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 140, 250, 135, 253, 118, 172, 235, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 79, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 69, 255, 0, 253, 117, 172, 251, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 26, 47, 255, 0, 235, 173, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 109, 127, 235, 178, 255, 0, 58, 242, 175, 138, 127, 242, 83, 252, 65, 255, 0, 95, 103, 249, 10, 245, 91, 31, 249, 8, 218, 255, 0, 215, 101, 254, 117, 229, 95, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 20, 1, 200, 81, 69, 20, 0, 87, 93, 240, 179, 254, 74, 127, 135, 255, 0, 235, 236, 127, 35, 92, 141, 117, 223, 11, 63, 228, 167, 248, 127, 254, 190, 199, 242, 52, 1, 208, 252, 123, 255, 0, 146, 161, 63, 253, 122, 195, 252, 171, 204, 43, 211, 254, 61, 255, 0, 201, 80, 159, 254, 189, 97, 254, 85, 230, 20, 0, 81, 69, 20, 1, 127, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 95, 66, 248, 171, 254, 70, 141, 67, 254, 186, 255, 0, 74, 249, 235, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 95, 66, 248, 171, 254, 70, 141, 67, 254, 186, 255, 0, 74, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 123, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 25, 245, 15, 250, 235, 89, 246, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 67, 197, 95, 242, 51, 234, 31, 245, 214, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 22, 191, 245, 213, 127, 157, 104, 120, 171, 254, 70, 125, 67, 254, 187, 86, 125, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 208, 241, 87, 252, 140, 250, 135, 253, 118, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 213, 159, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 35, 109, 255, 0, 93, 87, 249, 212, 62, 50, 255, 0, 145, 187, 83, 255, 0, 174, 223, 208, 84, 214, 63, 242, 17, 182, 255, 0, 174, 171, 252, 234, 31, 25, 127, 200, 221, 169, 255, 0, 215, 111, 232, 40, 61, 156, 151, 248, 239, 208, 194, 162, 138, 40, 62, 148, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 179, 166, 255, 0, 200, 86, 211, 254, 187, 47, 243, 174, 171, 197, 95, 242, 52, 106, 31, 245, 216, 215, 43, 166, 255, 0, 200, 86, 211, 254, 187, 47, 243, 174, 171, 197, 95, 242, 52, 106, 31, 245, 216, 208, 124, 246, 121, 188, 62, 102, 69, 20, 81, 65, 225, 5, 20, 81, 64, 16, 92, 70, 101, 181, 153, 7, 86, 140, 129, 249, 87, 133, 201, 25, 138, 70, 70, 234, 167, 6, 189, 238, 188, 87, 95, 182, 22, 186, 237, 236, 35, 56, 18, 146, 51, 223, 60, 208, 6, 101, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 125, 123, 227, 95, 249, 33, 215, 223, 246, 10, 143, 249, 45, 124, 133, 95, 94, 248, 215, 254, 72, 117, 247, 253, 130, 163, 254, 75, 64, 30, 97, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 96, 124, 124, 255, 0, 146, 157, 55, 253, 122, 67, 252, 141, 111, 254, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 88, 31, 31, 63, 228, 167, 77, 255, 0, 94, 144, 255, 0, 35, 64, 30, 221, 227, 95, 249, 33, 247, 191, 246, 9, 143, 249, 45, 121, 127, 236, 221, 255, 0, 35, 22, 183, 255, 0, 94, 145, 255, 0, 232, 117, 234, 30, 53, 255, 0, 146, 31, 123, 255, 0, 96, 152, 255, 0, 146, 215, 151, 254, 205, 223, 242, 49, 107, 127, 245, 233, 31, 254, 135, 64, 24, 63, 31, 127, 228, 167, 207, 255, 0, 94, 144, 255, 0, 35, 94, 219, 227, 111, 249, 33, 183, 223, 246, 10, 143, 249, 45, 120, 151, 199, 223, 249, 41, 243, 255, 0, 215, 164, 63, 200, 215, 182, 248, 219, 254, 72, 109, 247, 253, 130, 163, 254, 75, 64, 30, 99, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 96, 252, 125, 255, 0, 146, 159, 55, 253, 122, 67, 252, 141, 111, 126, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 88, 63, 31, 127, 228, 167, 205, 255, 0, 94, 144, 255, 0, 35, 64, 30, 217, 227, 95, 249, 33, 215, 191, 246, 9, 143, 249, 45, 121, 143, 236, 219, 255, 0, 35, 22, 183, 255, 0, 94, 145, 255, 0, 232, 85, 233, 222, 53, 255, 0, 146, 29, 123, 255, 0, 96, 152, 255, 0, 146, 215, 152, 254, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 64, 24, 31, 31, 63, 228, 167, 77, 255, 0, 94, 144, 255, 0, 35, 94, 219, 227, 95, 249, 33, 215, 191, 246, 9, 143, 249, 45, 120, 151, 199, 207, 249, 41, 211, 127, 215, 164, 63, 200, 215, 182, 248, 215, 254, 72, 117, 239, 253, 130, 99, 254, 75, 64, 30, 99, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 96, 124, 124, 255, 0, 146, 161, 63, 253, 122, 195, 252, 171, 127, 246, 109, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 42, 192, 248, 249, 255, 0, 37, 66, 127, 250, 245, 135, 249, 80, 7, 167, 124, 94, 255, 0, 146, 29, 103, 255, 0, 110, 159, 202, 143, 131, 255, 0, 242, 68, 110, 254, 183, 127, 202, 143, 139, 223, 242, 67, 172, 255, 0, 237, 211, 249, 81, 240, 127, 254, 72, 141, 223, 214, 239, 249, 80, 7, 33, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 80, 63, 242, 115, 255, 0, 247, 21, 255, 0, 217, 106, 255, 0, 236, 219, 255, 0, 35, 22, 183, 255, 0, 94, 145, 255, 0, 232, 85, 64, 255, 0, 201, 207, 255, 0, 220, 87, 255, 0, 101, 160, 11, 255, 0, 180, 151, 252, 140, 90, 39, 253, 122, 73, 255, 0, 161, 87, 95, 241, 123, 254, 72, 117, 151, 210, 211, 249, 10, 228, 63, 105, 47, 249, 24, 180, 79, 250, 244, 147, 255, 0, 66, 174, 191, 226, 247, 252, 144, 235, 47, 165, 167, 242, 20, 0, 191, 7, 191, 228, 136, 221, 127, 219, 223, 242, 174, 63, 246, 109, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 42, 236, 62, 15, 127, 201, 17, 186, 255, 0, 183, 191, 229, 92, 127, 236, 219, 255, 0, 35, 22, 183, 255, 0, 94, 145, 255, 0, 232, 84, 1, 157, 255, 0, 55, 61, 255, 0, 113, 95, 253, 150, 180, 127, 105, 31, 249, 24, 52, 63, 250, 245, 147, 255, 0, 66, 172, 239, 249, 185, 239, 251, 138, 255, 0, 236, 181, 163, 251, 72, 255, 0, 200, 193, 161, 255, 0, 215, 172, 159, 250, 21, 0, 118, 31, 23, 191, 228, 135, 90, 255, 0, 219, 167, 242, 20, 159, 8, 63, 228, 135, 94, 127, 219, 223, 242, 165, 248, 189, 255, 0, 36, 58, 215, 254, 221, 63, 144, 164, 248, 65, 255, 0, 36, 58, 243, 254, 222, 255, 0, 149, 0, 114, 31, 179, 111, 252, 140, 90, 223, 253, 122, 71, 255, 0, 161, 85, 1, 255, 0, 39, 63, 255, 0, 113, 95, 253, 150, 175, 254, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 84, 7, 252, 156, 255, 0, 253, 197, 127, 246, 90, 0, 191, 251, 73, 127, 200, 195, 162, 127, 215, 163, 255, 0, 232, 85, 127, 227, 167, 252, 147, 207, 8, 126, 31, 250, 40, 85, 15, 218, 75, 254, 70, 29, 19, 254, 189, 31, 255, 0, 66, 171, 255, 0, 29, 63, 228, 158, 120, 67, 240, 255, 0, 209, 66, 128, 23, 227, 183, 252, 147, 223, 8, 254, 31, 250, 40, 81, 241, 219, 254, 73, 247, 132, 127, 15, 253, 20, 40, 248, 237, 255, 0, 36, 247, 194, 63, 135, 254, 138, 20, 124, 118, 255, 0, 146, 125, 225, 31, 195, 255, 0, 69, 10, 0, 62, 59, 127, 201, 62, 240, 143, 225, 255, 0, 162, 133, 31, 29, 191, 228, 158, 248, 71, 240, 255, 0, 209, 66, 143, 142, 223, 242, 79, 188, 35, 248, 127, 232, 161, 71, 199, 111, 249, 39, 190, 17, 252, 63, 244, 80, 160, 3, 227, 167, 252, 147, 175, 8, 255, 0, 192, 127, 244, 72, 163, 227, 167, 252, 147, 191, 8, 255, 0, 192, 127, 244, 80, 163, 227, 167, 252, 147, 175, 8, 255, 0, 192, 127, 244, 72, 163, 227, 167, 252, 147, 191, 8, 255, 0, 192, 127, 244, 80, 160, 3, 227, 167, 252, 147, 191, 8, 255, 0, 192, 127, 244, 80, 163, 227, 183, 252, 147, 239, 8, 254, 31, 250, 40, 81, 241, 211, 254, 73, 223, 132, 127, 224, 63, 250, 40, 81, 241, 219, 254, 73, 247, 132, 127, 15, 253, 20, 40, 0, 248, 237, 255, 0, 36, 247, 194, 63, 135, 254, 138, 21, 224, 53, 239, 223, 29, 191, 228, 158, 248, 71, 240, 255, 0, 209, 66, 188, 6, 128, 10, 40, 162, 128, 10, 191, 161, 255, 0, 200, 193, 166, 255, 0, 215, 212, 95, 250, 16, 170, 21, 127, 67, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 33, 64, 27, 255, 0, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 21, 200, 215, 93, 241, 79, 254, 74, 127, 136, 63, 235, 236, 255, 0, 33, 92, 141, 0, 20, 81, 69, 0, 21, 235, 223, 243, 108, 31, 247, 21, 255, 0, 217, 171, 200, 107, 215, 191, 230, 216, 63, 238, 43, 255, 0, 179, 80, 7, 95, 226, 47, 249, 41, 191, 12, 63, 235, 217, 63, 144, 163, 195, 223, 242, 84, 126, 39, 127, 215, 163, 255, 0, 42, 60, 69, 255, 0, 37, 55, 225, 135, 253, 123, 39, 242, 20, 120, 123, 254, 74, 143, 196, 239, 250, 244, 127, 229, 64, 28, 127, 252, 219, 15, 253, 197, 127, 246, 106, 236, 60, 71, 255, 0, 37, 55, 225, 127, 253, 123, 39, 242, 21, 199, 255, 0, 205, 176, 255, 0, 220, 87, 255, 0, 102, 174, 195, 196, 127, 242, 83, 126, 23, 255, 0, 215, 178, 127, 33, 64, 7, 135, 255, 0, 228, 167, 252, 78, 255, 0, 175, 86, 254, 85, 200, 143, 249, 54, 3, 255, 0, 97, 95, 253, 154, 186, 239, 15, 255, 0, 201, 79, 248, 157, 255, 0, 94, 173, 252, 171, 145, 31, 242, 108, 7, 254, 194, 191, 251, 53, 0, 117, 222, 33, 255, 0, 146, 157, 240, 195, 254, 189, 23, 249, 81, 225, 223, 249, 42, 95, 19, 127, 235, 209, 191, 149, 30, 33, 255, 0, 146, 157, 240, 195, 254, 189, 23, 249, 81, 225, 223, 249, 42, 95, 19, 127, 235, 209, 191, 149, 0, 114, 31, 243, 108, 31, 247, 21, 255, 0, 217, 171, 160, 215, 255, 0, 230, 112, 255, 0, 177, 82, 203, 250, 87, 63, 255, 0, 54, 193, 255, 0, 113, 95, 253, 154, 186, 13, 127, 254, 103, 15, 251, 21, 44, 191, 165, 0, 47, 136, 63, 230, 113, 255, 0, 177, 82, 203, 250, 81, 175, 255, 0, 204, 227, 255, 0, 98, 173, 151, 244, 163, 196, 31, 243, 56, 255, 0, 216, 169, 101, 253, 40, 215, 255, 0, 230, 113, 255, 0, 177, 86, 203, 250, 80, 1, 175, 255, 0, 204, 225, 255, 0, 98, 165, 151, 244, 166, 235, 221, 60, 97, 255, 0, 98, 165, 151, 244, 167, 107, 255, 0, 243, 56, 127, 216, 169, 101, 253, 41, 186, 247, 79, 24, 127, 216, 169, 101, 253, 40, 0, 241, 7, 252, 205, 255, 0, 246, 42, 217, 127, 74, 60, 65, 255, 0, 51, 127, 253, 138, 182, 95, 210, 143, 16, 127, 204, 223, 255, 0, 98, 173, 151, 244, 163, 196, 31, 243, 55, 255, 0, 216, 171, 101, 253, 40, 0, 241, 7, 252, 205, 255, 0, 246, 42, 217, 127, 74, 119, 136, 63, 230, 113, 255, 0, 177, 86, 203, 250, 83, 124, 65, 255, 0, 51, 127, 253, 138, 182, 95, 210, 157, 226, 15, 249, 156, 127, 236, 85, 178, 254, 148, 0, 107, 223, 243, 56, 127, 216, 171, 101, 253, 40, 215, 250, 120, 195, 254, 197, 75, 47, 233, 70, 189, 255, 0, 51, 135, 253, 138, 182, 95, 210, 141, 127, 167, 140, 63, 236, 84, 178, 254, 148, 0, 154, 247, 252, 206, 63, 246, 42, 217, 127, 74, 110, 189, 211, 198, 31, 246, 42, 217, 127, 74, 118, 189, 255, 0, 51, 143, 253, 138, 182, 95, 210, 155, 175, 116, 241, 135, 253, 138, 182, 95, 210, 128, 23, 196, 31, 243, 55, 255, 0, 216, 171, 101, 253, 40, 241, 7, 252, 205, 255, 0, 246, 42, 217, 127, 74, 60, 65, 255, 0, 51, 127, 253, 138, 182, 95, 210, 143, 16, 127, 204, 223, 255, 0, 98, 173, 151, 244, 160, 5, 254, 17, 245, 166, 255, 0, 141, 59, 248, 71, 214, 155, 254, 52, 0, 239, 90, 61, 104, 245, 163, 214, 128, 15, 240, 166, 255, 0, 133, 59, 252, 41, 191, 225, 64, 14, 29, 168, 29, 168, 29, 168, 29, 168, 0, 255, 0, 26, 63, 198, 143, 241, 163, 252, 104, 0, 245, 165, 245, 164, 245, 165, 245, 160, 6, 127, 133, 59, 248, 135, 210, 155, 254, 20, 239, 226, 31, 74, 0, 7, 106, 240, 26, 247, 225, 218, 188, 6, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 246, 175, 15, 194, 246, 222, 31, 177, 134, 64, 3, 44, 67, 56, 175, 28, 180, 136, 207, 119, 12, 60, 252, 238, 7, 29, 122, 215, 185, 68, 130, 40, 35, 65, 209, 70, 5, 0, 73, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 234, 215, 139, 191, 228, 105, 212, 191, 235, 175, 248, 85, 91, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 107, 197, 223, 242, 52, 234, 95, 245, 215, 252, 43, 220, 200, 191, 142, 253, 63, 84, 69, 77, 140, 106, 40, 162, 190, 164, 231, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 44, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 127, 21, 127, 200, 209, 127, 255, 0, 93, 107, 34, 199, 254, 66, 54, 223, 245, 213, 127, 157, 107, 248, 171, 254, 70, 139, 255, 0, 250, 235, 95, 49, 159, 124, 84, 254, 102, 180, 140, 138, 40, 162, 188, 19, 96, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 89, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 218, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 187, 86, 117, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 140, 250, 135, 253, 118, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 162, 255, 0, 254, 186, 214, 125, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 141, 23, 255, 0, 245, 214, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 54, 191, 245, 217, 127, 157, 121, 87, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 122, 173, 143, 252, 132, 109, 127, 235, 178, 255, 0, 58, 242, 175, 138, 127, 242, 83, 252, 65, 255, 0, 95, 103, 249, 10, 0, 228, 40, 162, 138, 0, 43, 174, 248, 89, 255, 0, 37, 63, 195, 255, 0, 245, 246, 63, 145, 174, 70, 186, 239, 133, 159, 242, 83, 252, 63, 255, 0, 95, 99, 249, 26, 0, 232, 126, 61, 255, 0, 201, 80, 159, 254, 189, 97, 254, 85, 230, 21, 233, 255, 0, 30, 255, 0, 228, 168, 79, 255, 0, 94, 176, 255, 0, 42, 243, 10, 0, 40, 162, 138, 0, 191, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 175, 161, 124, 85, 255, 0, 35, 70, 161, 255, 0, 93, 127, 165, 124, 245, 161, 255, 0, 200, 193, 166, 255, 0, 215, 212, 95, 250, 16, 175, 161, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 103, 212, 63, 235, 173, 103, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 207, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 53, 15, 250, 236, 107, 58, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 187, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 209, 168, 127, 215, 99, 89, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 214, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 54, 223, 245, 213, 127, 157, 67, 227, 47, 249, 27, 181, 63, 250, 237, 253, 5, 77, 99, 255, 0, 33, 43, 111, 250, 234, 191, 206, 161, 241, 151, 252, 141, 218, 159, 253, 118, 254, 130, 131, 217, 201, 127, 142, 253, 12, 42, 40, 162, 131, 233, 66, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 11, 90, 111, 252, 133, 173, 63, 235, 178, 255, 0, 58, 234, 124, 85, 255, 0, 35, 70, 161, 255, 0, 93, 141, 114, 218, 111, 252, 133, 173, 63, 235, 178, 255, 0, 58, 234, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 62, 123, 60, 222, 31, 51, 34, 138, 40, 160, 240, 130, 138, 40, 160, 2, 188, 191, 226, 13, 187, 197, 175, 164, 231, 27, 100, 132, 109, 252, 43, 212, 43, 139, 248, 137, 103, 230, 233, 208, 93, 128, 63, 116, 251, 9, 239, 131, 64, 30, 109, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 95, 94, 248, 215, 254, 72, 117, 247, 253, 130, 163, 254, 75, 95, 33, 87, 215, 190, 53, 255, 0, 146, 29, 125, 255, 0, 96, 168, 255, 0, 146, 208, 7, 152, 126, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 88, 31, 31, 63, 228, 167, 77, 255, 0, 94, 144, 255, 0, 35, 91, 255, 0, 179, 111, 252, 140, 90, 223, 253, 122, 71, 255, 0, 161, 86, 7, 199, 207, 249, 41, 211, 127, 215, 164, 63, 200, 208, 7, 183, 120, 215, 254, 72, 125, 239, 253, 130, 99, 254, 75, 94, 95, 251, 55, 127, 200, 197, 173, 255, 0, 215, 164, 127, 250, 29, 122, 135, 141, 127, 228, 135, 222, 255, 0, 216, 38, 63, 228, 181, 229, 255, 0, 179, 119, 252, 140, 90, 223, 253, 122, 71, 255, 0, 161, 208, 6, 15, 199, 207, 249, 41, 243, 127, 215, 172, 63, 200, 215, 182, 248, 219, 254, 72, 109, 247, 253, 130, 163, 254, 75, 94, 37, 241, 243, 254, 74, 124, 223, 245, 235, 15, 242, 53, 237, 190, 54, 255, 0, 146, 27, 125, 255, 0, 96, 168, 255, 0, 146, 208, 7, 152, 254, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 88, 63, 31, 127, 228, 167, 205, 255, 0, 94, 144, 255, 0, 35, 91, 223, 179, 111, 252, 140, 90, 223, 253, 122, 71, 255, 0, 161, 86, 15, 199, 223, 249, 41, 243, 127, 215, 164, 63, 200, 208, 7, 182, 120, 215, 254, 72, 117, 239, 253, 130, 99, 254, 75, 94, 99, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 122, 119, 141, 127, 228, 135, 94, 255, 0, 216, 38, 63, 228, 181, 230, 63, 179, 111, 252, 140, 90, 223, 253, 122, 71, 255, 0, 161, 80, 6, 7, 199, 207, 249, 41, 243, 255, 0, 215, 172, 63, 200, 215, 182, 248, 219, 254, 72, 117, 247, 253, 130, 163, 254, 75, 94, 37, 241, 243, 254, 74, 124, 255, 0, 245, 235, 15, 242, 53, 237, 190, 54, 255, 0, 146, 29, 125, 255, 0, 96, 168, 255, 0, 146, 208, 7, 152, 254, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 88, 31, 31, 63, 228, 168, 79, 255, 0, 94, 176, 255, 0, 42, 223, 253, 155, 127, 228, 98, 214, 255, 0, 235, 210, 63, 253, 10, 176, 62, 62, 127, 201, 80, 159, 254, 189, 97, 254, 84, 1, 233, 223, 23, 191, 228, 135, 89, 255, 0, 219, 167, 242, 163, 224, 255, 0, 252, 145, 27, 191, 173, 223, 242, 163, 226, 247, 252, 144, 235, 63, 251, 116, 254, 84, 124, 31, 255, 0, 146, 35, 119, 245, 187, 254, 84, 1, 200, 126, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 84, 15, 252, 156, 255, 0, 253, 197, 127, 246, 90, 191, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 80, 63, 242, 115, 255, 0, 247, 21, 255, 0, 217, 104, 2, 255, 0, 237, 37, 255, 0, 35, 22, 137, 255, 0, 94, 146, 127, 232, 85, 215, 252, 94, 255, 0, 146, 29, 101, 244, 180, 254, 66, 185, 15, 218, 75, 254, 70, 45, 19, 254, 189, 36, 255, 0, 208, 171, 175, 248, 189, 255, 0, 36, 58, 203, 233, 105, 252, 133, 0, 47, 193, 239, 249, 34, 55, 95, 246, 247, 252, 171, 143, 253, 155, 127, 228, 98, 214, 255, 0, 235, 210, 63, 253, 10, 187, 15, 131, 223, 242, 68, 110, 191, 237, 239, 249, 87, 31, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 0, 103, 127, 205, 207, 127, 220, 87, 255, 0, 101, 173, 31, 218, 71, 254, 70, 13, 15, 254, 189, 100, 255, 0, 208, 171, 59, 254, 110, 123, 254, 226, 191, 251, 45, 104, 254, 210, 63, 242, 48, 104, 127, 245, 235, 39, 254, 133, 64, 29, 135, 197, 239, 249, 33, 214, 191, 246, 233, 252, 133, 39, 194, 15, 249, 33, 215, 159, 246, 247, 252, 169, 126, 47, 127, 201, 14, 181, 255, 0, 183, 79, 228, 41, 62, 16, 127, 201, 14, 188, 255, 0, 183, 191, 229, 64, 28, 135, 236, 219, 255, 0, 35, 22, 183, 255, 0, 94, 145, 255, 0, 232, 85, 159, 255, 0, 55, 63, 255, 0, 113, 95, 253, 150, 180, 63, 102, 223, 249, 24, 181, 191, 250, 244, 143, 255, 0, 66, 172, 255, 0, 249, 185, 255, 0, 251, 138, 255, 0, 236, 180, 1, 161, 251, 73, 127, 200, 195, 162, 127, 215, 163, 255, 0, 232, 85, 127, 227, 167, 252, 147, 207, 8, 126, 31, 250, 40, 85, 15, 218, 75, 254, 70, 29, 19, 254, 189, 31, 255, 0, 66, 171, 255, 0, 29, 63, 228, 158, 120, 67, 240, 255, 0, 209, 66, 128, 23, 227, 183, 252, 147, 223, 8, 254, 31, 250, 40, 81, 241, 219, 254, 73, 247, 132, 127, 15, 253, 20, 40, 248, 237, 255, 0, 36, 247, 194, 63, 135, 254, 138, 20, 124, 118, 255, 0, 146, 125, 225, 31, 195, 255, 0, 69, 10, 0, 62, 59, 127, 201, 62, 240, 143, 225, 255, 0, 162, 133, 31, 29, 191, 228, 158, 248, 71, 240, 255, 0, 209, 66, 143, 142, 223, 242, 79, 188, 35, 248, 127, 232, 161, 71, 199, 111, 249, 39, 190, 17, 252, 63, 244, 80, 160, 3, 227, 167, 252, 147, 175, 8, 255, 0, 192, 127, 244, 72, 163, 227, 167, 252, 147, 191, 8, 255, 0, 192, 127, 244, 80, 163, 227, 167, 252, 147, 175, 8, 255, 0, 192, 127, 244, 72, 163, 227, 167, 252, 147, 191, 8, 255, 0, 192, 127, 244, 80, 160, 3, 227, 167, 252, 147, 191, 8, 255, 0, 192, 127, 244, 80, 163, 227, 183, 252, 147, 239, 8, 254, 31, 250, 40, 81, 241, 211, 254, 73, 223, 132, 127, 224, 63, 250, 40, 81, 241, 219, 254, 73, 247, 132, 127, 15, 253, 20, 40, 0, 248, 237, 255, 0, 36, 247, 194, 63, 135, 254, 138, 21, 224, 53, 239, 223, 29, 191, 228, 158, 248, 71, 240, 255, 0, 209, 66, 188, 6, 128, 10, 40, 162, 128, 10, 191, 161, 255, 0, 200, 193, 166, 255, 0, 215, 212, 95, 250, 16, 170, 21, 127, 67, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 33, 64, 27, 255, 0, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 21, 200, 215, 93, 241, 75, 254, 74, 127, 136, 63, 235, 232, 255, 0, 33, 92, 141, 0, 20, 81, 69, 0, 21, 235, 223, 243, 108, 31, 247, 21, 255, 0, 217, 171, 200, 107, 215, 191, 230, 216, 63, 238, 43, 255, 0, 179, 80, 7, 95, 226, 47, 249, 41, 191, 12, 63, 235, 217, 63, 144, 163, 195, 223, 242, 84, 126, 39, 127, 215, 163, 255, 0, 42, 60, 69, 255, 0, 37, 55, 225, 135, 253, 123, 39, 242, 20, 120, 123, 254, 74, 143, 196, 239, 250, 244, 127, 229, 64, 28, 127, 252, 219, 15, 253, 197, 127, 246, 106, 236, 60, 71, 255, 0, 37, 55, 225, 127, 253, 123, 39, 242, 21, 199, 255, 0, 205, 176, 255, 0, 220, 87, 255, 0, 102, 174, 195, 196, 127, 242, 83, 126, 23, 255, 0, 215, 178, 127, 33, 64, 7, 135, 255, 0, 228, 167, 252, 78, 255, 0, 175, 86, 254, 85, 200, 143, 249, 54, 3, 255, 0, 97, 95, 253, 154, 186, 239, 15, 255, 0, 201, 79, 248, 157, 255, 0, 94, 173, 252, 171, 145, 31, 242, 108, 7, 254, 194, 191, 251, 53, 0, 117, 222, 34, 255, 0, 146, 157, 240, 195, 254, 189, 23, 249, 81, 225, 223, 249, 42, 95, 19, 127, 235, 209, 191, 149, 30, 34, 255, 0, 146, 157, 240, 195, 254, 189, 23, 249, 81, 225, 223, 249, 42, 95, 19, 127, 235, 209, 191, 149, 0, 114, 31, 243, 108, 31, 247, 21, 255, 0, 217, 171, 160, 215, 255, 0, 230, 112, 255, 0, 177, 82, 203, 250, 87, 63, 255, 0, 54, 193, 255, 0, 113, 95, 253, 154, 186, 13, 127, 254, 103, 15, 251, 21, 44, 191, 165, 0, 47, 136, 63, 230, 113, 255, 0, 177, 82, 203, 250, 81, 175, 255, 0, 204, 227, 255, 0, 98, 173, 151, 244, 163, 196, 31, 243, 56, 255, 0, 216, 169, 101, 253, 40, 215, 255, 0, 230, 113, 255, 0, 177, 86, 203, 250, 80, 1, 175, 125, 223, 23, 255, 0, 216, 169, 101, 253, 41, 53, 255, 0, 249, 156, 63, 236, 84, 178, 254, 148, 186, 247, 221, 241, 127, 253, 138, 150, 95, 210, 147, 95, 255, 0, 153, 195, 254, 197, 75, 47, 233, 64, 9, 226, 15, 249, 155, 255, 0, 236, 85, 178, 254, 148, 120, 131, 254, 102, 255, 0, 251, 21, 108, 191, 165, 30, 32, 255, 0, 153, 191, 254, 197, 91, 47, 233, 71, 136, 63, 230, 111, 255, 0, 177, 86, 203, 250, 80, 1, 226, 15, 249, 155, 255, 0, 236, 85, 178, 254, 148, 239, 16, 127, 204, 227, 255, 0, 98, 173, 151, 244, 166, 248, 131, 254, 102, 255, 0, 251, 21, 108, 191, 165, 59, 196, 31, 243, 56, 255, 0, 216, 171, 101, 253, 40, 0, 215, 191, 230, 112, 255, 0, 177, 86, 203, 250, 81, 175, 244, 241, 135, 253, 138, 150, 95, 210, 141, 123, 254, 103, 15, 251, 21, 108, 191, 165, 26, 255, 0, 79, 24, 127, 216, 169, 101, 253, 40, 1, 53, 239, 249, 156, 127, 236, 85, 178, 254, 148, 221, 123, 167, 140, 63, 236, 85, 178, 254, 148, 237, 123, 254, 103, 31, 251, 21, 108, 191, 165, 55, 94, 233, 227, 15, 251, 21, 108, 191, 165, 0, 47, 136, 63, 230, 111, 255, 0, 177, 86, 203, 250, 81, 226, 15, 249, 155, 255, 0, 236, 85, 178, 254, 148, 120, 131, 254, 102, 255, 0, 251, 21, 108, 191, 165, 30, 32, 255, 0, 153, 191, 254, 197, 91, 47, 233, 64, 11, 252, 35, 235, 77, 255, 0, 26, 119, 240, 143, 173, 55, 252, 104, 1, 222, 180, 122, 209, 235, 71, 173, 0, 31, 225, 77, 255, 0, 10, 119, 248, 83, 127, 194, 128, 28, 59, 80, 59, 80, 59, 80, 59, 80, 1, 254, 52, 127, 141, 31, 227, 71, 248, 208, 1, 235, 75, 235, 73, 235, 75, 235, 64, 12, 255, 0, 10, 119, 241, 15, 165, 55, 252, 41, 223, 196, 62, 148, 0, 14, 213, 224, 53, 239, 195, 181, 120, 13, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 110, 248, 66, 9, 39, 241, 61, 166, 204, 124, 135, 204, 57, 244, 21, 236, 21, 231, 159, 14, 172, 247, 92, 221, 222, 21, 4, 32, 8, 167, 184, 53, 232, 116, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 135, 252, 132, 109, 127, 235, 170, 255, 0, 58, 177, 226, 207, 249, 26, 117, 31, 250, 235, 254, 21, 94, 195, 254, 66, 54, 191, 245, 213, 127, 157, 88, 241, 103, 252, 141, 58, 143, 253, 117, 255, 0, 10, 247, 50, 47, 227, 191, 79, 213, 17, 83, 99, 34, 138, 40, 175, 169, 57, 194, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 11, 54, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 95, 197, 95, 242, 51, 234, 31, 245, 214, 178, 44, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 191, 138, 191, 228, 103, 212, 63, 235, 173, 124, 198, 125, 241, 83, 249, 154, 210, 50, 40, 162, 138, 240, 77, 130, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 181, 103, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 209, 168, 127, 215, 95, 233, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 171, 58, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 141, 67, 254, 186, 255, 0, 74, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 123, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 26, 47, 255, 0, 235, 173, 103, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 205, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 101, 254, 117, 229, 127, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 21, 234, 150, 63, 242, 17, 181, 255, 0, 174, 203, 252, 235, 202, 254, 42, 127, 201, 79, 241, 15, 253, 125, 159, 228, 40, 3, 144, 162, 138, 40, 0, 174, 187, 225, 103, 252, 148, 255, 0, 15, 255, 0, 215, 216, 254, 70, 185, 26, 235, 190, 22, 127, 201, 79, 240, 255, 0, 253, 125, 143, 228, 104, 3, 212, 254, 42, 252, 45, 241, 63, 139, 60, 111, 46, 169, 165, 91, 192, 246, 173, 4, 81, 130, 243, 5, 57, 3, 158, 43, 137, 255, 0, 133, 17, 227, 175, 249, 243, 181, 255, 0, 192, 129, 95, 88, 209, 64, 31, 39, 127, 194, 136, 241, 215, 252, 249, 218, 255, 0, 224, 64, 163, 254, 20, 71, 142, 191, 231, 206, 215, 255, 0, 2, 5, 125, 99, 69, 0, 124, 143, 63, 194, 239, 20, 248, 82, 227, 79, 213, 117, 75, 120, 18, 217, 111, 96, 143, 41, 48, 99, 146, 195, 28, 87, 181, 107, 190, 23, 189, 188, 215, 47, 46, 34, 185, 177, 84, 145, 248, 18, 74, 1, 28, 85, 239, 139, 223, 242, 40, 217, 255, 0, 216, 86, 211, 255, 0, 70, 10, 229, 252, 84, 51, 226, 141, 67, 254, 187, 127, 74, 0, 179, 255, 0, 8, 110, 165, 255, 0, 63, 186, 111, 253, 255, 0, 20, 159, 240, 134, 234, 95, 243, 251, 166, 255, 0, 223, 241, 92, 246, 7, 191, 231, 70, 7, 191, 231, 64, 29, 15, 252, 33, 186, 151, 252, 254, 233, 191, 247, 252, 81, 255, 0, 8, 110, 165, 255, 0, 63, 186, 111, 253, 255, 0, 21, 207, 96, 123, 254, 116, 96, 123, 254, 116, 1, 208, 255, 0, 194, 27, 169, 127, 207, 238, 155, 255, 0, 127, 197, 31, 240, 134, 234, 95, 243, 251, 166, 255, 0, 223, 241, 92, 246, 7, 191, 231, 70, 7, 191, 231, 64, 29, 15, 252, 33, 186, 151, 252, 254, 233, 191, 247, 252, 81, 255, 0, 8, 110, 165, 255, 0, 63, 186, 111, 253, 255, 0, 21, 207, 96, 123, 254, 116, 96, 123, 254, 116, 1, 212, 218, 248, 67, 81, 138, 242, 25, 13, 222, 156, 66, 56, 60, 78, 51, 214, 173, 107, 190, 22, 190, 188, 215, 111, 46, 34, 186, 176, 84, 119, 200, 73, 37, 193, 174, 78, 196, 127, 196, 198, 219, 254, 186, 175, 243, 173, 47, 21, 15, 248, 170, 53, 14, 191, 235, 125, 104, 2, 199, 252, 33, 186, 151, 252, 254, 233, 191, 247, 252, 81, 255, 0, 8, 110, 165, 255, 0, 63, 186, 111, 253, 255, 0, 21, 207, 99, 235, 249, 209, 143, 175, 231, 64, 29, 15, 252, 33, 186, 151, 252, 254, 233, 191, 247, 252, 81, 255, 0, 8, 110, 165, 255, 0, 63, 186, 111, 253, 255, 0, 21, 207, 99, 235, 249, 209, 143, 175, 231, 64, 29, 15, 252, 33, 186, 151, 252, 254, 233, 191, 247, 252, 81, 255, 0, 8, 110, 165, 255, 0, 63, 186, 111, 253, 255, 0, 21, 207, 99, 235, 249, 209, 143, 175, 231, 64, 29, 15, 252, 33, 186, 151, 252, 254, 233, 191, 247, 252, 81, 255, 0, 8, 110, 165, 255, 0, 63, 186, 111, 253, 255, 0, 21, 207, 99, 235, 249, 209, 143, 175, 231, 64, 29, 69, 175, 131, 245, 24, 174, 224, 144, 221, 233, 216, 87, 7, 137, 185, 235, 86, 245, 223, 11, 223, 94, 107, 151, 151, 17, 93, 88, 170, 72, 252, 9, 37, 193, 174, 82, 196, 127, 196, 198, 215, 254, 186, 175, 127, 122, 209, 241, 88, 255, 0, 138, 167, 80, 255, 0, 174, 190, 190, 212, 1, 99, 254, 16, 221, 75, 254, 127, 116, 223, 251, 255, 0, 71, 252, 33, 186, 151, 252, 254, 233, 191, 247, 254, 185, 236, 125, 127, 58, 49, 245, 252, 232, 3, 161, 255, 0, 132, 55, 82, 255, 0, 159, 221, 55, 254, 255, 0, 138, 63, 225, 13, 212, 191, 231, 247, 77, 255, 0, 191, 226, 185, 236, 125, 127, 58, 49, 245, 252, 232, 3, 161, 255, 0, 132, 55, 82, 255, 0, 159, 221, 55, 254, 255, 0, 138, 63, 225, 13, 212, 191, 231, 247, 77, 255, 0, 191, 226, 185, 236, 125, 127, 58, 49, 245, 252, 232, 3, 161, 255, 0, 132, 55, 82, 255, 0, 159, 221, 55, 254, 255, 0, 138, 63, 225, 13, 212, 191, 231, 247, 77, 255, 0, 191, 226, 185, 236, 125, 127, 58, 49, 245, 252, 232, 3, 168, 181, 240, 134, 163, 21, 212, 18, 27, 189, 59, 8, 224, 241, 48, 207, 90, 183, 174, 248, 94, 250, 243, 92, 188, 184, 138, 230, 197, 82, 71, 224, 73, 46, 13, 114, 150, 35, 254, 38, 54, 189, 127, 214, 175, 127, 122, 209, 241, 88, 255, 0, 138, 167, 80, 235, 254, 187, 215, 218, 128, 44, 127, 194, 27, 169, 127, 207, 238, 155, 255, 0, 127, 197, 31, 240, 134, 234, 95, 243, 251, 166, 255, 0, 223, 241, 92, 246, 62, 191, 157, 24, 250, 254, 116, 1, 208, 255, 0, 194, 27, 169, 127, 207, 238, 155, 255, 0, 127, 197, 31, 240, 134, 234, 95, 243, 251, 166, 255, 0, 223, 241, 92, 246, 62, 191, 157, 24, 250, 254, 116, 1, 208, 255, 0, 194, 27, 169, 127, 207, 238, 155, 255, 0, 127, 197, 31, 240, 134, 234, 95, 243, 251, 166, 255, 0, 223, 241, 92, 246, 62, 191, 157, 24, 250, 254, 116, 1, 208, 255, 0, 194, 27, 169, 127, 207, 238, 155, 255, 0, 127, 197, 31, 240, 134, 234, 95, 243, 251, 166, 255, 0, 223, 241, 92, 246, 62, 191, 157, 24, 250, 254, 116, 1, 212, 219, 120, 63, 81, 142, 242, 41, 13, 222, 156, 66, 184, 60, 79, 207, 90, 230, 124, 101, 255, 0, 35, 118, 167, 255, 0, 93, 191, 160, 169, 108, 71, 252, 76, 173, 186, 255, 0, 173, 94, 254, 245, 23, 140, 191, 228, 110, 212, 255, 0, 235, 183, 244, 20, 30, 206, 75, 252, 119, 232, 97, 81, 69, 20, 31, 74, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 89, 211, 127, 228, 43, 105, 255, 0, 93, 151, 249, 215, 162, 107, 222, 22, 190, 188, 215, 47, 46, 34, 185, 177, 84, 145, 242, 4, 146, 224, 215, 157, 233, 191, 242, 21, 180, 255, 0, 174, 203, 252, 235, 170, 241, 88, 255, 0, 138, 167, 80, 235, 254, 183, 250, 80, 124, 246, 121, 188, 62, 101, 143, 248, 67, 117, 47, 249, 253, 211, 127, 239, 248, 163, 254, 16, 221, 75, 254, 127, 116, 223, 251, 254, 43, 158, 199, 215, 243, 163, 31, 95, 206, 131, 194, 58, 31, 248, 67, 117, 47, 249, 253, 211, 127, 239, 248, 163, 254, 16, 221, 75, 254, 127, 116, 223, 251, 254, 43, 158, 199, 215, 243, 163, 31, 95, 206, 128, 58, 31, 248, 67, 117, 47, 249, 253, 211, 127, 239, 248, 172, 175, 19, 120, 11, 80, 185, 240, 237, 250, 155, 141, 53, 217, 99, 50, 1, 231, 247, 28, 213, 60, 125, 127, 58, 67, 26, 149, 195, 12, 169, 24, 35, 61, 104, 3, 193, 104, 171, 154, 173, 169, 177, 213, 46, 109, 152, 0, 99, 114, 48, 59, 85, 58, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 43, 235, 223, 26, 255, 0, 201, 14, 190, 255, 0, 176, 84, 127, 201, 107, 228, 42, 250, 247, 198, 191, 242, 67, 175, 191, 236, 21, 31, 242, 90, 0, 243, 15, 217, 183, 254, 70, 45, 111, 254, 189, 35, 255, 0, 208, 171, 3, 227, 231, 252, 148, 233, 191, 235, 210, 31, 228, 107, 127, 246, 109, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 42, 192, 248, 249, 255, 0, 37, 58, 111, 250, 244, 135, 249, 26, 0, 246, 239, 26, 255, 0, 201, 15, 189, 255, 0, 176, 76, 127, 201, 107, 203, 255, 0, 102, 239, 249, 24, 181, 191, 250, 244, 143, 255, 0, 67, 175, 80, 241, 175, 252, 144, 251, 223, 251, 4, 199, 252, 150, 188, 191, 246, 110, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 58, 0, 193, 248, 251, 255, 0, 37, 62, 127, 250, 244, 135, 249, 26, 246, 223, 27, 127, 201, 13, 190, 255, 0, 176, 84, 127, 201, 107, 196, 190, 62, 255, 0, 201, 79, 159, 254, 189, 33, 254, 70, 189, 183, 198, 223, 242, 67, 111, 191, 236, 21, 31, 242, 90, 0, 243, 31, 217, 183, 254, 70, 45, 111, 254, 189, 35, 255, 0, 208, 171, 7, 227, 239, 252, 148, 249, 191, 235, 210, 31, 228, 107, 123, 246, 109, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 42, 193, 248, 251, 255, 0, 37, 62, 111, 250, 244, 135, 249, 26, 0, 246, 207, 26, 255, 0, 201, 14, 189, 255, 0, 176, 76, 127, 201, 107, 204, 127, 102, 223, 249, 24, 181, 191, 250, 244, 143, 255, 0, 66, 175, 78, 241, 175, 252, 144, 235, 223, 251, 4, 199, 252, 150, 188, 199, 246, 109, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 42, 0, 192, 248, 249, 255, 0, 37, 58, 111, 250, 244, 135, 249, 26, 246, 223, 26, 255, 0, 201, 14, 189, 255, 0, 176, 76, 127, 201, 107, 196, 190, 62, 127, 201, 78, 155, 254, 189, 33, 254, 70, 189, 183, 198, 191, 242, 67, 175, 127, 236, 19, 31, 242, 90, 0, 243, 31, 217, 183, 254, 70, 45, 111, 254, 189, 35, 255, 0, 208, 171, 3, 227, 231, 252, 149, 9, 255, 0, 235, 214, 31, 229, 91, 255, 0, 179, 111, 252, 140, 90, 223, 253, 122, 71, 255, 0, 161, 86, 7, 199, 207, 249, 42, 19, 255, 0, 215, 172, 63, 202, 128, 61, 59, 226, 247, 252, 144, 235, 63, 251, 116, 254, 84, 124, 31, 255, 0, 146, 35, 119, 245, 187, 254, 84, 124, 94, 255, 0, 146, 29, 103, 255, 0, 110, 159, 202, 143, 131, 255, 0, 242, 68, 110, 254, 183, 127, 202, 128, 57, 15, 217, 183, 254, 70, 45, 111, 254, 189, 35, 255, 0, 208, 170, 129, 255, 0, 147, 159, 255, 0, 184, 175, 254, 203, 87, 255, 0, 102, 223, 249, 24, 181, 191, 250, 244, 143, 255, 0, 66, 170, 7, 254, 78, 127, 254, 226, 191, 251, 45, 0, 95, 253, 164, 191, 228, 98, 209, 63, 235, 210, 79, 253, 10, 186, 255, 0, 139, 223, 242, 67, 172, 190, 150, 159, 200, 87, 33, 251, 73, 127, 200, 197, 162, 127, 215, 164, 159, 250, 21, 117, 255, 0, 23, 191, 228, 135, 89, 125, 45, 63, 144, 160, 5, 248, 61, 255, 0, 36, 70, 235, 254, 222, 255, 0, 149, 113, 255, 0, 179, 111, 252, 140, 90, 223, 253, 122, 71, 255, 0, 161, 87, 97, 240, 123, 254, 72, 141, 215, 253, 189, 255, 0, 42, 227, 255, 0, 102, 223, 249, 24, 181, 191, 250, 244, 143, 255, 0, 66, 160, 12, 239, 249, 185, 239, 251, 138, 255, 0, 236, 181, 163, 251, 72, 255, 0, 200, 193, 161, 255, 0, 215, 172, 159, 250, 21, 103, 127, 205, 207, 127, 220, 87, 255, 0, 101, 173, 31, 218, 71, 254, 70, 13, 15, 254, 189, 100, 255, 0, 208, 168, 3, 176, 248, 189, 255, 0, 36, 58, 215, 254, 221, 63, 144, 164, 248, 65, 255, 0, 36, 58, 243, 254, 222, 255, 0, 149, 47, 197, 239, 249, 33, 214, 191, 246, 233, 252, 133, 39, 194, 15, 249, 33, 215, 159, 246, 247, 252, 168, 3, 144, 253, 155, 127, 228, 98, 214, 255, 0, 235, 210, 63, 253, 10, 168, 15, 249, 57, 255, 0, 251, 138, 255, 0, 236, 181, 127, 246, 109, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 42, 160, 63, 228, 231, 255, 0, 238, 43, 255, 0, 178, 208, 5, 255, 0, 218, 75, 254, 70, 29, 19, 254, 189, 31, 255, 0, 66, 171, 255, 0, 29, 63, 228, 158, 120, 67, 240, 255, 0, 209, 66, 168, 126, 210, 95, 242, 48, 232, 159, 245, 232, 255, 0, 250, 21, 95, 248, 233, 255, 0, 36, 243, 194, 31, 135, 254, 138, 20, 0, 191, 29, 191, 228, 158, 248, 71, 240, 255, 0, 209, 66, 143, 142, 223, 242, 79, 188, 35, 248, 127, 232, 161, 71, 199, 111, 249, 39, 190, 17, 252, 63, 244, 80, 163, 227, 183, 252, 147, 239, 8, 254, 31, 250, 40, 80, 1, 241, 219, 254, 73, 247, 132, 127, 15, 253, 20, 40, 248, 237, 255, 0, 36, 247, 194, 63, 135, 254, 138, 20, 124, 118, 255, 0, 146, 125, 225, 31, 195, 255, 0, 69, 10, 62, 59, 127, 201, 61, 240, 143, 225, 255, 0, 162, 133, 0, 31, 29, 63, 228, 157, 120, 71, 254, 3, 255, 0, 162, 69, 31, 29, 63, 228, 157, 248, 71, 254, 3, 255, 0, 162, 133, 31, 29, 63, 228, 157, 120, 71, 254, 3, 255, 0, 162, 69, 31, 29, 63, 228, 157, 248, 71, 254, 3, 255, 0, 162, 133, 0, 31, 29, 63, 228, 157, 248, 71, 254, 3, 255, 0, 162, 133, 31, 29, 191, 228, 159, 120, 71, 240, 255, 0, 209, 66, 143, 142, 159, 242, 78, 252, 35, 255, 0, 1, 255, 0, 209, 66, 143, 142, 223, 242, 79, 188, 35, 248, 127, 232, 161, 64, 7, 199, 111, 249, 39, 190, 17, 252, 63, 244, 80, 175, 40, 241, 31, 128, 245, 223, 11, 105, 150, 58, 134, 169, 4, 73, 111, 123, 254, 164, 164, 155, 137, 227, 60, 250, 113, 94, 175, 241, 219, 254, 73, 239, 132, 127, 15, 253, 20, 40, 248, 237, 255, 0, 36, 247, 194, 63, 135, 254, 138, 20, 1, 229, 30, 34, 240, 30, 187, 225, 109, 50, 199, 80, 213, 32, 137, 45, 239, 127, 212, 149, 144, 49, 60, 103, 145, 219, 138, 60, 67, 224, 61, 119, 194, 250, 101, 142, 161, 170, 65, 18, 91, 222, 255, 0, 169, 43, 40, 36, 241, 158, 125, 56, 175, 87, 248, 237, 255, 0, 36, 247, 194, 63, 135, 254, 138, 20, 124, 117, 255, 0, 146, 121, 225, 31, 195, 255, 0, 69, 10, 0, 242, 127, 17, 120, 19, 93, 240, 190, 153, 101, 168, 234, 112, 196, 150, 247, 191, 234, 138, 74, 24, 158, 51, 252, 170, 221, 247, 130, 245, 159, 6, 182, 139, 172, 235, 49, 71, 29, 149, 196, 241, 188, 102, 55, 220, 113, 195, 116, 250, 87, 166, 252, 116, 255, 0, 146, 121, 225, 31, 248, 15, 254, 138, 20, 124, 116, 31, 241, 111, 60, 35, 255, 0, 1, 255, 0, 209, 66, 128, 56, 223, 136, 158, 18, 213, 117, 15, 137, 223, 232, 209, 70, 127, 225, 32, 151, 206, 176, 203, 227, 114, 144, 58, 250, 87, 61, 109, 240, 243, 196, 55, 186, 190, 175, 165, 195, 4, 70, 235, 73, 93, 215, 74, 101, 24, 81, 236, 123, 215, 177, 120, 135, 254, 74, 111, 194, 255, 0, 250, 245, 143, 249, 10, 60, 55, 255, 0, 37, 63, 226, 119, 253, 122, 55, 242, 160, 15, 14, 255, 0, 132, 79, 85, 255, 0, 132, 71, 254, 18, 127, 42, 63, 236, 207, 59, 200, 223, 191, 230, 221, 244, 171, 247, 63, 15, 124, 67, 105, 171, 233, 26, 84, 214, 241, 11, 173, 89, 67, 218, 143, 52, 97, 129, 245, 61, 171, 180, 31, 242, 108, 7, 254, 194, 191, 251, 53, 117, 222, 35, 255, 0, 146, 159, 240, 195, 254, 189, 35, 254, 84, 1, 227, 182, 223, 15, 124, 65, 119, 172, 107, 26, 92, 54, 241, 27, 173, 37, 12, 151, 67, 204, 224, 1, 232, 123, 215, 103, 255, 0, 54, 193, 255, 0, 113, 95, 253, 154, 186, 255, 0, 14, 255, 0, 201, 81, 248, 157, 255, 0, 94, 111, 252, 171, 144, 255, 0, 155, 96, 255, 0, 184, 175, 254, 205, 64, 29, 127, 136, 191, 228, 166, 252, 48, 255, 0, 175, 100, 254, 66, 143, 15, 127, 201, 81, 248, 157, 255, 0, 94, 143, 252, 168, 241, 23, 252, 148, 223, 134, 31, 245, 236, 159, 200, 81, 225, 239, 249, 42, 63, 19, 191, 235, 209, 255, 0, 149, 0, 113, 255, 0, 243, 108, 63, 247, 21, 255, 0, 217, 171, 176, 241, 31, 252, 148, 223, 133, 255, 0, 245, 236, 159, 200, 87, 31, 255, 0, 54, 195, 255, 0, 113, 95, 253, 154, 187, 15, 17, 255, 0, 201, 77, 248, 95, 255, 0, 94, 201, 252, 133, 0, 30, 31, 255, 0, 146, 159, 241, 59, 254, 189, 91, 249, 87, 34, 63, 228, 216, 15, 253, 133, 127, 246, 106, 235, 188, 63, 255, 0, 37, 63, 226, 119, 253, 122, 183, 242, 174, 68, 127, 201, 176, 31, 251, 10, 255, 0, 236, 212, 1, 215, 120, 135, 254, 74, 119, 195, 15, 250, 244, 95, 229, 71, 135, 127, 228, 169, 124, 77, 255, 0, 175, 70, 254, 84, 120, 135, 254, 74, 119, 195, 15, 250, 244, 95, 229, 71, 135, 127, 228, 169, 124, 77, 255, 0, 175, 70, 254, 84, 1, 200, 127, 205, 176, 127, 220, 87, 255, 0, 102, 174, 131, 95, 255, 0, 153, 195, 254, 197, 75, 47, 233, 92, 255, 0, 252, 219, 7, 253, 197, 127, 246, 106, 232, 53, 255, 0, 249, 156, 63, 236, 84, 178, 254, 148, 0, 190, 32, 255, 0, 153, 199, 254, 197, 75, 47, 233, 70, 191, 255, 0, 51, 143, 253, 138, 182, 95, 210, 143, 16, 127, 204, 227, 255, 0, 98, 165, 151, 244, 163, 95, 255, 0, 153, 199, 254, 197, 91, 47, 233, 64, 6, 191, 255, 0, 51, 135, 253, 138, 150, 95, 210, 155, 175, 116, 241, 135, 253, 138, 150, 95, 210, 157, 175, 255, 0, 204, 225, 255, 0, 98, 165, 151, 244, 166, 235, 221, 60, 97, 255, 0, 98, 165, 151, 244, 160, 3, 196, 31, 243, 55, 255, 0, 216, 171, 101, 253, 40, 241, 7, 252, 205, 255, 0, 246, 42, 217, 127, 74, 60, 65, 255, 0, 51, 127, 253, 138, 182, 95, 210, 143, 16, 127, 204, 223, 255, 0, 98, 173, 151, 244, 160, 3, 196, 31, 243, 55, 255, 0, 216, 171, 101, 253, 41, 222, 32, 255, 0, 153, 199, 254, 197, 91, 47, 233, 77, 241, 7, 252, 205, 255, 0, 246, 42, 217, 127, 74, 119, 136, 63, 230, 113, 255, 0, 177, 86, 203, 250, 80, 1, 175, 127, 204, 225, 255, 0, 98, 173, 151, 244, 163, 95, 233, 227, 15, 251, 21, 44, 191, 165, 26, 247, 252, 206, 31, 246, 42, 217, 127, 74, 53, 254, 158, 48, 255, 0, 177, 82, 203, 250, 80, 2, 107, 223, 243, 56, 255, 0, 216, 171, 101, 253, 41, 186, 247, 79, 24, 127, 216, 171, 101, 253, 41, 218, 247, 252, 206, 63, 246, 42, 217, 127, 74, 110, 189, 211, 198, 31, 246, 42, 217, 127, 74, 0, 95, 16, 127, 204, 223, 255, 0, 98, 173, 151, 244, 163, 196, 31, 243, 55, 255, 0, 216, 171, 101, 253, 40, 241, 7, 252, 205, 255, 0, 246, 42, 217, 127, 74, 60, 65, 255, 0, 51, 127, 253, 138, 182, 95, 210, 128, 23, 248, 71, 214, 155, 254, 52, 239, 225, 31, 90, 111, 248, 208, 3, 189, 104, 245, 163, 214, 143, 90, 0, 63, 194, 155, 254, 20, 239, 240, 166, 255, 0, 133, 0, 56, 118, 160, 118, 160, 118, 160, 118, 160, 3, 252, 104, 255, 0, 26, 63, 198, 143, 241, 160, 3, 214, 151, 214, 147, 214, 151, 214, 128, 25, 254, 20, 239, 226, 31, 74, 111, 248, 83, 191, 136, 125, 40, 0, 29, 171, 192, 107, 223, 135, 106, 240, 26, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 159, 18, 25, 101, 84, 29, 88, 128, 40, 3, 219, 254, 30, 120, 38, 253, 188, 43, 111, 120, 179, 105, 209, 139, 175, 222, 141, 243, 0, 196, 118, 205, 117, 95, 240, 134, 234, 95, 243, 251, 166, 255, 0, 223, 241, 92, 189, 149, 178, 218, 233, 246, 246, 225, 66, 249, 104, 6, 1, 226, 167, 192, 247, 252, 232, 3, 161, 255, 0, 132, 55, 82, 255, 0, 159, 221, 55, 254, 255, 0, 138, 63, 225, 13, 212, 191, 231, 247, 77, 255, 0, 191, 226, 185, 236, 15, 127, 206, 140, 15, 127, 206, 128, 58, 31, 248, 67, 117, 47, 249, 253, 211, 127, 239, 248, 163, 254, 16, 221, 75, 254, 127, 116, 223, 251, 254, 43, 158, 192, 247, 252, 232, 192, 247, 252, 232, 3, 168, 181, 240, 118, 161, 21, 212, 18, 27, 189, 59, 8, 224, 241, 48, 207, 90, 201, 241, 119, 252, 141, 58, 151, 253, 117, 255, 0, 10, 171, 96, 63, 226, 99, 107, 215, 253, 106, 247, 247, 171, 94, 46, 255, 0, 145, 167, 82, 255, 0, 174, 191, 225, 94, 230, 69, 252, 119, 233, 250, 163, 42, 155, 24, 212, 81, 69, 125, 73, 136, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 102, 199, 254, 66, 54, 223, 245, 213, 127, 157, 118, 58, 247, 134, 47, 175, 53, 203, 203, 136, 238, 172, 21, 36, 124, 133, 146, 92, 26, 227, 172, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 183, 138, 135, 252, 85, 58, 135, 95, 245, 190, 181, 243, 25, 247, 197, 79, 230, 107, 72, 181, 255, 0, 8, 110, 165, 255, 0, 63, 186, 111, 253, 255, 0, 20, 127, 194, 27, 169, 127, 207, 238, 155, 255, 0, 127, 197, 115, 184, 250, 254, 116, 99, 235, 249, 215, 130, 108, 116, 95, 240, 134, 234, 95, 243, 251, 166, 255, 0, 223, 241, 71, 252, 33, 186, 151, 252, 254, 233, 191, 247, 252, 87, 59, 143, 175, 231, 70, 62, 191, 157, 0, 116, 95, 240, 134, 234, 95, 243, 251, 166, 255, 0, 223, 241, 71, 252, 33, 186, 151, 252, 254, 233, 191, 247, 252, 87, 59, 143, 175, 231, 70, 62, 191, 157, 0, 116, 95, 240, 134, 234, 95, 243, 251, 166, 255, 0, 223, 241, 71, 252, 33, 186, 151, 252, 254, 233, 191, 247, 252, 87, 59, 143, 175, 231, 70, 62, 191, 157, 0, 117, 22, 190, 14, 212, 34, 187, 129, 205, 222, 157, 133, 112, 120, 155, 158, 181, 111, 94, 240, 189, 245, 230, 185, 121, 113, 21, 205, 138, 164, 143, 194, 73, 54, 13, 114, 150, 35, 254, 38, 54, 189, 127, 214, 175, 127, 122, 209, 241, 88, 255, 0, 138, 167, 80, 235, 254, 187, 215, 218, 128, 44, 127, 194, 27, 169, 127, 207, 238, 155, 255, 0, 127, 232, 255, 0, 132, 55, 82, 255, 0, 159, 221, 55, 254, 255, 0, 215, 61, 143, 175, 231, 70, 62, 191, 157, 0, 116, 63, 240, 134, 234, 95, 243, 251, 166, 255, 0, 223, 250, 63, 225, 13, 212, 191, 231, 247, 77, 255, 0, 191, 245, 207, 99, 235, 249, 209, 143, 175, 231, 64, 29, 15, 252, 33, 186, 151, 252, 254, 233, 191, 247, 254, 143, 248, 67, 117, 47, 249, 253, 211, 127, 239, 253, 115, 216, 250, 254, 116, 99, 235, 249, 208, 7, 67, 255, 0, 8, 110, 165, 255, 0, 63, 186, 111, 253, 255, 0, 163, 254, 16, 221, 75, 254, 127, 116, 223, 251, 255, 0, 92, 246, 62, 191, 157, 24, 250, 254, 116, 1, 212, 90, 248, 63, 80, 138, 238, 9, 13, 222, 157, 133, 112, 120, 155, 158, 181, 111, 94, 240, 189, 245, 230, 185, 121, 113, 21, 213, 138, 164, 143, 194, 201, 54, 15, 74, 229, 44, 71, 252, 76, 109, 122, 255, 0, 173, 94, 254, 245, 163, 226, 177, 255, 0, 21, 78, 161, 215, 253, 119, 175, 176, 160, 11, 63, 240, 134, 234, 127, 243, 251, 166, 255, 0, 223, 225, 71, 252, 33, 186, 159, 252, 254, 233, 191, 247, 248, 87, 59, 143, 175, 231, 70, 62, 191, 157, 0, 116, 95, 240, 134, 234, 127, 243, 251, 166, 255, 0, 223, 225, 71, 252, 33, 186, 159, 252, 254, 233, 191, 247, 248, 87, 59, 143, 175, 231, 70, 62, 191, 157, 0, 116, 95, 240, 134, 234, 127, 243, 251, 166, 255, 0, 223, 225, 71, 252, 33, 186, 159, 252, 254, 233, 191, 247, 248, 87, 59, 143, 175, 231, 70, 62, 191, 157, 0, 116, 95, 240, 134, 234, 127, 243, 251, 166, 255, 0, 223, 225, 71, 252, 33, 186, 159, 252, 254, 233, 191, 247, 248, 87, 59, 143, 175, 231, 70, 62, 191, 157, 0, 117, 54, 190, 15, 212, 99, 188, 138, 67, 123, 167, 97, 92, 30, 38, 231, 173, 90, 215, 188, 45, 127, 121, 174, 94, 92, 69, 115, 96, 168, 239, 144, 178, 73, 130, 43, 148, 177, 31, 241, 50, 182, 235, 254, 181, 123, 251, 214, 143, 138, 135, 252, 85, 26, 135, 95, 245, 190, 180, 1, 99, 254, 16, 221, 75, 254, 127, 52, 223, 251, 255, 0, 71, 252, 33, 186, 151, 252, 254, 105, 191, 247, 254, 185, 236, 125, 127, 58, 49, 245, 252, 232, 3, 161, 255, 0, 132, 55, 82, 255, 0, 159, 205, 55, 254, 255, 0, 209, 255, 0, 8, 110, 165, 255, 0, 63, 154, 111, 253, 255, 0, 174, 123, 31, 95, 206, 140, 125, 127, 58, 0, 232, 127, 225, 13, 212, 191, 231, 243, 77, 255, 0, 191, 244, 127, 194, 27, 169, 127, 207, 230, 155, 255, 0, 127, 235, 158, 199, 215, 243, 163, 31, 95, 206, 128, 58, 31, 248, 67, 117, 47, 249, 252, 211, 127, 239, 253, 31, 240, 134, 234, 95, 243, 249, 166, 255, 0, 223, 250, 231, 177, 245, 252, 232, 199, 215, 243, 160, 14, 162, 215, 193, 250, 132, 87, 112, 72, 110, 244, 236, 43, 131, 196, 220, 245, 175, 53, 241, 63, 195, 223, 16, 120, 207, 226, 47, 138, 103, 209, 160, 138, 72, 224, 189, 242, 228, 50, 72, 23, 146, 1, 174, 170, 196, 127, 196, 194, 215, 175, 250, 213, 239, 239, 93, 215, 128, 63, 228, 112, 241, 239, 253, 133, 87, 255, 0, 69, 208, 7, 134, 255, 0, 194, 136, 241, 215, 252, 249, 218, 255, 0, 224, 64, 163, 254, 20, 71, 142, 191, 231, 206, 215, 255, 0, 2, 5, 125, 99, 69, 0, 124, 157, 255, 0, 10, 35, 199, 95, 243, 231, 107, 255, 0, 129, 2, 186, 15, 3, 124, 31, 241, 118, 133, 227, 109, 31, 84, 190, 182, 183, 91, 91, 107, 129, 36, 133, 39, 4, 129, 138, 250, 70, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 224, 62, 47, 127, 200, 165, 105, 255, 0, 97, 91, 79, 253, 24, 43, 150, 241, 95, 252, 141, 26, 135, 253, 117, 254, 130, 186, 159, 139, 255, 0, 242, 40, 218, 127, 216, 86, 211, 255, 0, 70, 10, 229, 188, 87, 255, 0, 35, 70, 161, 255, 0, 93, 127, 160, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 117, 95, 230, 43, 67, 197, 95, 242, 51, 234, 31, 245, 214, 179, 236, 127, 228, 35, 109, 255, 0, 93, 87, 249, 138, 208, 241, 87, 252, 140, 250, 135, 253, 117, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 43, 255, 0, 145, 167, 80, 255, 0, 174, 191, 210, 179, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 255, 0, 228, 105, 212, 63, 235, 175, 244, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 163, 80, 255, 0, 174, 223, 208, 86, 117, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 26, 135, 253, 118, 254, 130, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 86, 223, 245, 213, 127, 152, 168, 124, 101, 255, 0, 35, 118, 167, 255, 0, 93, 191, 160, 169, 172, 127, 228, 37, 109, 255, 0, 93, 87, 249, 138, 135, 198, 95, 242, 55, 106, 127, 245, 219, 250, 10, 15, 103, 37, 254, 59, 244, 48, 168, 162, 138, 15, 165, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 44, 233, 191, 242, 21, 180, 255, 0, 174, 203, 252, 235, 170, 241, 95, 252, 141, 58, 135, 253, 117, 254, 149, 202, 233, 191, 242, 21, 180, 255, 0, 174, 203, 252, 235, 170, 241, 95, 252, 141, 58, 135, 253, 117, 254, 148, 31, 61, 158, 111, 15, 153, 145, 69, 20, 80, 120, 65, 69, 20, 80, 1, 69, 20, 80, 7, 151, 248, 250, 197, 45, 181, 181, 157, 6, 60, 245, 220, 220, 119, 21, 201, 87, 169, 120, 247, 79, 251, 86, 135, 246, 149, 235, 108, 219, 191, 3, 94, 91, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 125, 123, 227, 95, 249, 33, 215, 223, 246, 10, 143, 249, 45, 124, 133, 95, 94, 248, 215, 254, 72, 117, 247, 253, 130, 163, 254, 75, 64, 30, 97, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 96, 124, 124, 255, 0, 146, 157, 55, 253, 122, 67, 252, 141, 111, 254, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 88, 31, 31, 63, 228, 167, 77, 255, 0, 94, 144, 255, 0, 35, 64, 30, 221, 227, 95, 249, 33, 247, 191, 246, 9, 143, 249, 45, 121, 127, 236, 221, 255, 0, 35, 22, 183, 255, 0, 94, 145, 255, 0, 232, 117, 234, 30, 53, 255, 0, 146, 31, 123, 255, 0, 96, 152, 255, 0, 146, 215, 151, 254, 205, 223, 242, 49, 107, 127, 245, 233, 31, 254, 135, 64, 24, 63, 31, 63, 228, 167, 205, 255, 0, 94, 176, 255, 0, 35, 94, 219, 227, 111, 249, 33, 183, 223, 246, 10, 143, 249, 45, 120, 151, 199, 207, 249, 41, 243, 127, 215, 172, 63, 200, 215, 182, 248, 219, 254, 72, 109, 247, 253, 130, 163, 254, 75, 64, 30, 99, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 96, 252, 125, 255, 0, 146, 159, 55, 253, 122, 67, 252, 141, 111, 126, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 88, 63, 31, 127, 228, 167, 205, 255, 0, 94, 144, 255, 0, 35, 64, 30, 217, 227, 95, 249, 33, 215, 191, 246, 9, 143, 249, 45, 121, 143, 236, 219, 255, 0, 35, 22, 183, 255, 0, 94, 145, 255, 0, 232, 85, 233, 222, 53, 255, 0, 146, 29, 123, 255, 0, 96, 152, 255, 0, 146, 215, 152, 254, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 64, 24, 31, 31, 63, 228, 167, 207, 255, 0, 94, 176, 255, 0, 35, 94, 219, 227, 111, 249, 33, 215, 223, 246, 10, 143, 249, 45, 120, 151, 199, 207, 249, 41, 243, 255, 0, 215, 172, 63, 200, 215, 182, 248, 219, 254, 72, 117, 247, 253, 130, 163, 254, 75, 64, 30, 99, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 96, 124, 124, 255, 0, 146, 161, 63, 253, 122, 195, 252, 171, 127, 246, 109, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 42, 192, 248, 249, 255, 0, 37, 66, 127, 250, 245, 135, 249, 80, 7, 167, 124, 94, 255, 0, 146, 29, 103, 255, 0, 110, 159, 202, 143, 131, 255, 0, 242, 68, 110, 254, 183, 127, 202, 143, 139, 223, 242, 67, 172, 255, 0, 237, 211, 249, 81, 240, 127, 254, 72, 141, 223, 214, 239, 249, 80, 7, 33, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 80, 63, 242, 115, 255, 0, 247, 21, 255, 0, 217, 106, 255, 0, 236, 219, 255, 0, 35, 22, 183, 255, 0, 94, 145, 255, 0, 232, 85, 64, 255, 0, 201, 207, 255, 0, 220, 87, 255, 0, 101, 160, 11, 255, 0, 180, 151, 252, 140, 90, 39, 253, 122, 73, 255, 0, 161, 87, 95, 241, 123, 254, 72, 117, 151, 210, 211, 249, 10, 228, 63, 105, 47, 249, 24, 180, 79, 250, 244, 147, 255, 0, 66, 174, 191, 226, 247, 252, 144, 235, 47, 165, 167, 242, 20, 0, 191, 7, 191, 228, 136, 221, 127, 219, 223, 242, 174, 63, 246, 109, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 42, 236, 62, 15, 127, 201, 17, 186, 255, 0, 183, 191, 229, 92, 127, 236, 219, 255, 0, 35, 22, 183, 255, 0, 94, 145, 255, 0, 232, 84, 1, 157, 255, 0, 55, 61, 255, 0, 113, 95, 253, 150, 180, 127, 105, 31, 249, 24, 52, 63, 250, 245, 147, 255, 0, 66, 172, 239, 249, 185, 239, 251, 138, 255, 0, 236, 181, 163, 251, 72, 255, 0, 200, 193, 161, 255, 0, 215, 172, 159, 250, 21, 0, 118, 31, 23, 191, 228, 135, 90, 255, 0, 219, 167, 242, 20, 159, 8, 63, 228, 135, 94, 127, 219, 223, 242, 165, 248, 189, 255, 0, 36, 58, 215, 254, 221, 63, 144, 164, 248, 65, 255, 0, 36, 58, 243, 254, 222, 255, 0, 149, 0, 114, 31, 179, 111, 252, 140, 90, 223, 253, 122, 71, 255, 0, 161, 86, 127, 252, 220, 255, 0, 253, 197, 127, 246, 90, 208, 253, 155, 127, 228, 98, 214, 255, 0, 235, 210, 63, 253, 10, 179, 255, 0, 230, 231, 255, 0, 238, 43, 255, 0, 178, 208, 6, 135, 237, 37, 255, 0, 35, 14, 137, 255, 0, 94, 143, 255, 0, 161, 85, 255, 0, 142, 159, 242, 79, 60, 33, 248, 127, 232, 161, 84, 63, 105, 47, 249, 24, 116, 79, 250, 244, 127, 253, 10, 175, 252, 116, 255, 0, 146, 121, 225, 15, 195, 255, 0, 69, 10, 0, 95, 142, 223, 242, 79, 124, 35, 248, 127, 232, 161, 71, 199, 111, 249, 39, 222, 17, 252, 63, 244, 80, 163, 227, 183, 252, 147, 223, 8, 254, 31, 250, 40, 81, 241, 219, 254, 73, 247, 132, 127, 15, 253, 20, 40, 0, 248, 237, 255, 0, 36, 251, 194, 63, 135, 254, 138, 20, 124, 118, 255, 0, 146, 123, 225, 31, 195, 255, 0, 69, 10, 62, 59, 127, 201, 62, 240, 143, 225, 255, 0, 162, 133, 31, 29, 191, 228, 158, 248, 71, 240, 255, 0, 209, 66, 128, 15, 142, 159, 242, 78, 188, 35, 255, 0, 1, 255, 0, 209, 34, 143, 142, 159, 242, 78, 252, 35, 255, 0, 1, 255, 0, 209, 66, 143, 142, 159, 242, 78, 188, 35, 255, 0, 1, 255, 0, 209, 34, 143, 142, 159, 242, 78, 252, 35, 255, 0, 1, 255, 0, 209, 66, 128, 15, 142, 159, 242, 78, 252, 35, 255, 0, 1, 255, 0, 209, 66, 143, 142, 223, 242, 79, 188, 35, 248, 127, 232, 161, 71, 199, 79, 249, 39, 126, 17, 255, 0, 128, 255, 0, 232, 161, 71, 199, 111, 249, 39, 222, 17, 252, 63, 244, 80, 160, 3, 227, 183, 252, 147, 223, 8, 254, 31, 250, 40, 81, 241, 219, 254, 73, 239, 132, 127, 15, 253, 20, 40, 248, 237, 255, 0, 36, 247, 194, 63, 135, 254, 138, 20, 124, 118, 255, 0, 146, 123, 225, 31, 195, 255, 0, 69, 10, 0, 62, 59, 127, 201, 61, 240, 143, 225, 255, 0, 162, 133, 31, 29, 127, 228, 158, 120, 71, 240, 255, 0, 209, 66, 143, 142, 223, 242, 79, 124, 35, 248, 127, 232, 161, 71, 199, 95, 249, 39, 158, 17, 252, 63, 244, 80, 160, 3, 227, 167, 252, 147, 207, 8, 255, 0, 192, 127, 244, 80, 163, 227, 167, 252, 147, 207, 8, 255, 0, 192, 127, 244, 80, 163, 227, 167, 252, 147, 207, 8, 255, 0, 192, 127, 244, 80, 163, 227, 167, 252, 147, 207, 8, 255, 0, 192, 127, 244, 80, 160, 11, 254, 33, 255, 0, 146, 155, 240, 191, 254, 189, 99, 254, 66, 143, 13, 255, 0, 201, 79, 248, 157, 255, 0, 94, 141, 252, 168, 241, 15, 252, 148, 223, 133, 255, 0, 245, 235, 31, 242, 20, 120, 111, 254, 74, 127, 196, 239, 250, 244, 111, 229, 64, 28, 136, 255, 0, 147, 96, 63, 246, 21, 255, 0, 217, 171, 174, 241, 31, 252, 148, 255, 0, 134, 31, 245, 233, 31, 242, 174, 68, 127, 201, 176, 31, 251, 10, 255, 0, 236, 213, 215, 120, 143, 254, 74, 127, 195, 15, 250, 244, 143, 249, 80, 1, 225, 223, 249, 42, 63, 19, 191, 235, 205, 255, 0, 149, 114, 31, 243, 108, 31, 247, 21, 255, 0, 217, 171, 175, 240, 239, 252, 149, 31, 137, 223, 245, 230, 255, 0, 202, 185, 15, 249, 182, 15, 251, 138, 255, 0, 236, 212, 1, 215, 248, 139, 254, 74, 111, 195, 15, 250, 246, 79, 228, 40, 240, 247, 252, 149, 31, 137, 223, 245, 232, 255, 0, 202, 143, 17, 127, 201, 77, 248, 97, 255, 0, 94, 201, 252, 133, 30, 30, 255, 0, 146, 163, 241, 59, 254, 189, 31, 249, 80, 7, 31, 255, 0, 54, 195, 255, 0, 113, 95, 253, 154, 187, 15, 17, 255, 0, 201, 77, 248, 95, 255, 0, 94, 201, 252, 133, 113, 255, 0, 243, 108, 63, 247, 21, 255, 0, 217, 171, 176, 241, 31, 252, 148, 223, 133, 255, 0, 245, 236, 159, 200, 80, 1, 225, 255, 0, 249, 41, 255, 0, 19, 191, 235, 213, 191, 149, 114, 35, 254, 77, 128, 255, 0, 216, 87, 255, 0, 102, 174, 187, 195, 255, 0, 242, 83, 254, 39, 127, 215, 171, 127, 42, 228, 71, 252, 155, 1, 255, 0, 176, 175, 254, 205, 64, 29, 119, 136, 191, 228, 167, 124, 48, 255, 0, 175, 69, 254, 84, 120, 119, 254, 74, 151, 196, 223, 250, 244, 111, 229, 71, 136, 191, 228, 167, 124, 48, 255, 0, 175, 69, 254, 84, 120, 119, 254, 74, 151, 196, 223, 250, 244, 111, 229, 64, 28, 135, 252, 219, 7, 253, 197, 127, 246, 106, 232, 53, 255, 0, 249, 156, 63, 236, 84, 178, 254, 149, 207, 255, 0, 205, 176, 127, 220, 87, 255, 0, 102, 174, 131, 95, 255, 0, 153, 195, 254, 197, 75, 47, 233, 64, 11, 226, 15, 249, 156, 127, 236, 84, 178, 254, 148, 107, 255, 0, 243, 56, 255, 0, 216, 171, 101, 253, 40, 241, 7, 252, 206, 63, 246, 42, 89, 127, 74, 53, 255, 0, 249, 156, 127, 236, 85, 178, 254, 148, 0, 107, 223, 119, 197, 255, 0, 246, 42, 89, 127, 74, 77, 127, 254, 103, 15, 251, 21, 44, 191, 165, 46, 189, 247, 124, 95, 255, 0, 98, 165, 151, 244, 164, 215, 255, 0, 230, 112, 255, 0, 177, 82, 203, 250, 80, 2, 120, 131, 254, 102, 255, 0, 251, 21, 108, 191, 165, 30, 32, 255, 0, 153, 191, 254, 197, 91, 47, 233, 71, 136, 63, 230, 111, 255, 0, 177, 86, 203, 250, 81, 226, 15, 249, 155, 255, 0, 236, 85, 178, 254, 148, 0, 120, 131, 254, 102, 255, 0, 251, 21, 108, 191, 165, 59, 196, 31, 243, 56, 255, 0, 216, 171, 101, 253, 41, 190, 32, 255, 0, 153, 191, 254, 197, 91, 47, 233, 78, 241, 7, 252, 206, 63, 246, 42, 217, 127, 74, 0, 53, 239, 249, 156, 63, 236, 85, 178, 254, 148, 107, 253, 60, 97, 255, 0, 98, 165, 151, 244, 163, 94, 255, 0, 153, 195, 254, 197, 91, 47, 233, 70, 191, 211, 198, 31, 246, 42, 89, 127, 74, 0, 77, 123, 254, 103, 31, 251, 21, 108, 191, 165, 55, 94, 233, 227, 15, 251, 21, 108, 191, 165, 59, 94, 255, 0, 153, 199, 254, 197, 91, 47, 233, 77, 215, 186, 120, 195, 254, 197, 91, 47, 233, 64, 11, 226, 15, 249, 155, 255, 0, 236, 85, 178, 254, 148, 120, 131, 254, 102, 255, 0, 251, 21, 108, 191, 165, 30, 32, 255, 0, 153, 191, 254, 197, 91, 47, 233, 71, 136, 63, 230, 111, 255, 0, 177, 86, 203, 250, 80, 2, 255, 0, 8, 250, 211, 127, 198, 157, 252, 35, 235, 77, 255, 0, 26, 0, 119, 173, 30, 180, 122, 209, 235, 64, 7, 248, 83, 127, 194, 157, 254, 20, 223, 240, 160, 7, 14, 212, 14, 212, 14, 212, 14, 212, 0, 127, 141, 31, 227, 71, 248, 209, 254, 52, 0, 122, 210, 250, 210, 122, 210, 250, 208, 3, 63, 194, 157, 252, 67, 233, 77, 255, 0, 10, 119, 241, 15, 165, 0, 3, 181, 120, 13, 123, 240, 237, 94, 3, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 110, 248, 70, 193, 47, 252, 67, 2, 200, 50, 145, 254, 241, 135, 210, 176, 171, 208, 190, 29, 105, 248, 134, 234, 253, 250, 55, 238, 215, 240, 160, 14, 238, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 63, 228, 35, 107, 255, 0, 93, 87, 249, 213, 175, 23, 127, 200, 211, 169, 127, 215, 95, 240, 170, 182, 31, 242, 17, 181, 255, 0, 174, 171, 252, 234, 215, 139, 191, 228, 105, 212, 191, 235, 175, 248, 87, 185, 145, 127, 29, 250, 126, 168, 138, 155, 24, 212, 81, 69, 125, 73, 206, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 89, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 254, 42, 255, 0, 145, 167, 80, 255, 0, 174, 181, 145, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 181, 252, 85, 255, 0, 35, 78, 161, 255, 0, 93, 107, 230, 51, 239, 138, 159, 204, 214, 145, 145, 69, 20, 87, 130, 108, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 171, 58, 199, 254, 66, 22, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 187, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 211, 168, 127, 215, 111, 233, 89, 214, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 52, 234, 31, 245, 219, 250, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 70, 219, 254, 187, 47, 243, 173, 15, 21, 127, 200, 207, 168, 127, 215, 90, 207, 177, 255, 0, 144, 141, 183, 253, 118, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 180, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 186, 240, 7, 252, 141, 254, 61, 255, 0, 176, 170, 255, 0, 232, 186, 225, 108, 127, 228, 33, 107, 255, 0, 93, 87, 249, 215, 117, 224, 15, 249, 27, 252, 123, 255, 0, 97, 85, 255, 0, 209, 116, 1, 223, 209, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 231, 255, 0, 23, 191, 228, 81, 179, 255, 0, 176, 173, 167, 254, 140, 21, 203, 248, 175, 254, 70, 141, 67, 254, 186, 255, 0, 65, 93, 71, 197, 239, 249, 20, 108, 255, 0, 236, 43, 105, 255, 0, 163, 5, 114, 254, 43, 255, 0, 145, 163, 80, 255, 0, 174, 191, 208, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 21, 161, 226, 175, 249, 25, 245, 15, 250, 235, 89, 246, 63, 242, 17, 182, 255, 0, 174, 171, 252, 197, 104, 120, 171, 254, 70, 125, 67, 254, 186, 208, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 255, 0, 200, 211, 168, 127, 215, 95, 233, 89, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 127, 242, 52, 234, 31, 245, 215, 250, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 209, 168, 127, 215, 111, 232, 43, 58, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 141, 67, 254, 187, 127, 65, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 79, 99, 255, 0, 33, 43, 111, 250, 234, 191, 204, 84, 62, 50, 255, 0, 145, 187, 83, 255, 0, 174, 223, 208, 84, 214, 63, 242, 18, 182, 255, 0, 174, 171, 252, 197, 67, 227, 47, 249, 27, 181, 63, 250, 237, 253, 5, 7, 179, 146, 255, 0, 29, 250, 24, 84, 81, 69, 7, 210, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 22, 116, 223, 249, 10, 218, 127, 215, 101, 254, 117, 213, 120, 175, 254, 70, 157, 67, 254, 186, 255, 0, 74, 229, 116, 223, 249, 10, 218, 127, 215, 101, 254, 117, 213, 120, 175, 254, 70, 157, 67, 254, 186, 255, 0, 74, 15, 158, 207, 55, 135, 204, 200, 162, 138, 40, 60, 32, 162, 138, 40, 0, 162, 138, 40, 2, 189, 229, 180, 119, 182, 114, 219, 56, 200, 145, 74, 215, 136, 92, 192, 109, 174, 165, 133, 179, 148, 98, 188, 215, 187, 215, 149, 120, 234, 192, 218, 235, 237, 56, 31, 37, 200, 222, 62, 189, 232, 3, 151, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 175, 175, 124, 107, 255, 0, 36, 58, 251, 254, 193, 81, 255, 0, 37, 175, 144, 171, 235, 223, 26, 255, 0, 201, 14, 190, 255, 0, 176, 84, 127, 201, 104, 3, 204, 63, 102, 223, 249, 24, 181, 191, 250, 244, 143, 255, 0, 66, 172, 15, 143, 159, 242, 83, 166, 255, 0, 175, 72, 127, 145, 173, 255, 0, 217, 183, 254, 70, 45, 111, 254, 189, 35, 255, 0, 208, 171, 3, 227, 231, 252, 148, 233, 191, 235, 210, 31, 228, 104, 3, 219, 188, 107, 255, 0, 36, 62, 247, 254, 193, 49, 255, 0, 37, 175, 47, 253, 155, 191, 228, 98, 214, 255, 0, 235, 210, 63, 253, 14, 189, 67, 198, 191, 242, 67, 239, 127, 236, 19, 31, 242, 90, 242, 255, 0, 217, 187, 254, 70, 45, 111, 254, 189, 35, 255, 0, 208, 232, 3, 7, 227, 239, 252, 148, 249, 255, 0, 235, 210, 31, 228, 107, 219, 124, 109, 255, 0, 36, 54, 251, 254, 193, 81, 255, 0, 37, 175, 18, 248, 251, 255, 0, 37, 62, 127, 250, 244, 135, 249, 26, 246, 223, 27, 127, 201, 13, 190, 255, 0, 176, 84, 127, 201, 104, 3, 204, 127, 102, 223, 249, 24, 181, 191, 250, 244, 143, 255, 0, 66, 172, 31, 143, 191, 242, 83, 230, 255, 0, 175, 72, 127, 145, 173, 239, 217, 183, 254, 70, 45, 111, 254, 189, 35, 255, 0, 208, 171, 7, 227, 239, 252, 148, 249, 191, 235, 210, 31, 228, 104, 3, 219, 60, 107, 255, 0, 36, 58, 247, 254, 193, 49, 255, 0, 37, 175, 49, 253, 155, 127, 228, 98, 214, 255, 0, 235, 210, 63, 253, 10, 189, 59, 198, 191, 242, 67, 175, 127, 236, 19, 31, 242, 90, 243, 31, 217, 183, 254, 70, 45, 111, 254, 189, 35, 255, 0, 208, 168, 3, 3, 227, 231, 252, 148, 233, 191, 235, 210, 31, 228, 107, 219, 124, 107, 255, 0, 36, 58, 247, 254, 193, 49, 255, 0, 37, 175, 18, 248, 249, 255, 0, 37, 58, 111, 250, 244, 135, 249, 26, 246, 223, 26, 255, 0, 201, 14, 189, 255, 0, 176, 76, 127, 201, 104, 3, 204, 127, 102, 223, 249, 24, 181, 191, 250, 244, 143, 255, 0, 66, 172, 15, 143, 159, 242, 84, 39, 255, 0, 175, 88, 127, 149, 111, 254, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 88, 31, 31, 63, 228, 168, 79, 255, 0, 94, 176, 255, 0, 42, 0, 244, 239, 139, 223, 242, 67, 172, 255, 0, 237, 211, 249, 81, 240, 127, 254, 72, 141, 223, 214, 239, 249, 81, 241, 123, 254, 72, 117, 159, 253, 186, 127, 42, 62, 15, 255, 0, 201, 17, 187, 250, 221, 255, 0, 42, 0, 228, 63, 102, 223, 249, 24, 181, 191, 250, 244, 143, 255, 0, 66, 170, 7, 254, 78, 127, 254, 226, 191, 251, 45, 95, 253, 155, 127, 228, 98, 214, 255, 0, 235, 210, 63, 253, 10, 168, 31, 249, 57, 255, 0, 251, 138, 255, 0, 236, 180, 1, 127, 246, 146, 255, 0, 145, 139, 68, 255, 0, 175, 73, 63, 244, 42, 235, 254, 47, 127, 201, 14, 178, 250, 90, 127, 33, 92, 135, 237, 37, 255, 0, 35, 22, 137, 255, 0, 94, 146, 127, 232, 85, 215, 252, 94, 255, 0, 146, 29, 101, 244, 180, 254, 66, 128, 23, 224, 247, 252, 145, 27, 175, 251, 123, 254, 85, 199, 254, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 93, 135, 193, 239, 249, 34, 55, 95, 246, 247, 252, 171, 143, 253, 155, 127, 228, 98, 214, 255, 0, 235, 210, 63, 253, 10, 128, 51, 191, 230, 231, 191, 238, 43, 255, 0, 178, 214, 143, 237, 35, 255, 0, 35, 6, 135, 255, 0, 94, 178, 127, 232, 85, 157, 255, 0, 55, 61, 255, 0, 113, 95, 253, 150, 180, 127, 105, 31, 249, 24, 52, 63, 250, 245, 147, 255, 0, 66, 160, 14, 195, 226, 247, 252, 144, 235, 95, 251, 116, 254, 66, 147, 225, 7, 252, 144, 235, 207, 251, 123, 254, 84, 191, 23, 191, 228, 135, 90, 255, 0, 219, 167, 242, 20, 159, 8, 63, 228, 135, 94, 127, 219, 223, 242, 160, 14, 67, 246, 109, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 42, 207, 255, 0, 155, 159, 255, 0, 184, 175, 254, 203, 90, 31, 179, 111, 252, 140, 90, 223, 253, 122, 71, 255, 0, 161, 86, 127, 252, 220, 255, 0, 253, 197, 127, 246, 90, 0, 208, 253, 164, 191, 228, 97, 209, 63, 235, 209, 255, 0, 244, 42, 191, 241, 211, 254, 73, 231, 132, 63, 15, 253, 20, 42, 135, 237, 37, 255, 0, 35, 14, 137, 255, 0, 94, 143, 255, 0, 161, 85, 255, 0, 142, 159, 242, 79, 60, 33, 248, 127, 232, 161, 64, 11, 241, 219, 254, 73, 239, 132, 127, 15, 253, 20, 40, 248, 237, 255, 0, 36, 251, 194, 63, 135, 254, 138, 20, 124, 118, 255, 0, 146, 123, 225, 31, 195, 255, 0, 69, 10, 62, 59, 127, 201, 62, 240, 143, 225, 255, 0, 162, 133, 0, 31, 29, 191, 228, 159, 120, 71, 240, 255, 0, 209, 66, 143, 142, 223, 242, 79, 124, 35, 248, 127, 232, 161, 71, 199, 111, 249, 39, 222, 17, 252, 63, 244, 80, 163, 227, 183, 252, 147, 223, 8, 254, 31, 250, 40, 80, 1, 241, 211, 254, 73, 215, 132, 127, 224, 63, 250, 36, 81, 241, 211, 254, 73, 223, 132, 127, 224, 63, 250, 40, 81, 241, 211, 254, 73, 215, 132, 127, 224, 63, 250, 36, 81, 241, 211, 254, 73, 223, 132, 127, 224, 63, 250, 40, 80, 1, 241, 211, 254, 73, 223, 132, 127, 224, 63, 250, 40, 81, 241, 219, 254, 73, 247, 132, 127, 15, 253, 20, 40, 248, 233, 255, 0, 36, 239, 194, 63, 240, 31, 253, 20, 40, 248, 237, 255, 0, 36, 251, 194, 63, 135, 254, 138, 20, 0, 124, 118, 255, 0, 146, 123, 225, 31, 195, 255, 0, 69, 10, 62, 59, 127, 201, 61, 240, 143, 225, 255, 0, 162, 133, 31, 29, 191, 228, 158, 248, 71, 240, 255, 0, 209, 66, 143, 142, 223, 242, 79, 124, 35, 248, 127, 232, 161, 64, 7, 199, 111, 249, 39, 190, 17, 252, 63, 244, 80, 163, 227, 175, 252, 147, 207, 8, 254, 31, 250, 40, 81, 241, 219, 254, 73, 239, 132, 127, 15, 253, 20, 40, 248, 235, 255, 0, 36, 243, 194, 63, 135, 254, 138, 20, 0, 124, 116, 255, 0, 146, 121, 225, 31, 248, 15, 254, 138, 20, 124, 116, 255, 0, 146, 121, 225, 31, 248, 15, 254, 138, 20, 124, 116, 255, 0, 146, 121, 225, 31, 248, 15, 254, 138, 20, 124, 116, 255, 0, 146, 121, 225, 31, 248, 15, 254, 138, 20, 1, 127, 196, 63, 242, 83, 126, 23, 255, 0, 215, 172, 127, 200, 81, 225, 191, 249, 41, 255, 0, 19, 191, 235, 209, 191, 149, 30, 33, 255, 0, 146, 155, 240, 191, 254, 189, 99, 254, 66, 143, 13, 255, 0, 201, 79, 248, 157, 255, 0, 94, 141, 252, 168, 3, 145, 31, 242, 108, 7, 254, 194, 191, 251, 53, 117, 222, 35, 255, 0, 146, 159, 240, 195, 254, 189, 35, 254, 85, 200, 143, 249, 54, 3, 255, 0, 97, 95, 253, 154, 186, 239, 17, 255, 0, 201, 79, 248, 97, 255, 0, 94, 145, 255, 0, 42, 0, 60, 59, 255, 0, 37, 71, 226, 119, 253, 121, 191, 242, 174, 67, 254, 109, 131, 254, 226, 191, 251, 53, 117, 254, 29, 255, 0, 146, 163, 241, 59, 254, 188, 223, 249, 87, 33, 255, 0, 54, 193, 255, 0, 113, 95, 253, 154, 128, 58, 255, 0, 17, 127, 201, 77, 248, 97, 255, 0, 94, 201, 252, 133, 30, 30, 255, 0, 146, 163, 241, 59, 254, 189, 31, 249, 81, 226, 47, 249, 41, 191, 12, 63, 235, 217, 63, 144, 163, 195, 223, 242, 84, 126, 39, 127, 215, 163, 255, 0, 42, 0, 227, 255, 0, 230, 216, 127, 238, 43, 255, 0, 179, 87, 97, 226, 63, 249, 41, 191, 11, 255, 0, 235, 217, 63, 144, 174, 63, 254, 109, 135, 254, 226, 191, 251, 53, 118, 30, 35, 255, 0, 146, 155, 240, 191, 254, 189, 147, 249, 10, 0, 60, 63, 255, 0, 37, 63, 226, 119, 253, 122, 183, 242, 174, 68, 127, 201, 176, 31, 251, 10, 255, 0, 236, 213, 215, 120, 127, 254, 74, 127, 196, 239, 250, 245, 111, 229, 92, 136, 255, 0, 147, 96, 63, 246, 21, 255, 0, 217, 168, 3, 174, 241, 15, 252, 148, 239, 134, 31, 245, 232, 191, 202, 143, 14, 255, 0, 201, 82, 248, 155, 255, 0, 94, 141, 252, 168, 241, 15, 252, 148, 239, 134, 31, 245, 232, 191, 202, 143, 14, 255, 0, 201, 82, 248, 155, 255, 0, 94, 141, 252, 168, 3, 144, 255, 0, 155, 96, 255, 0, 184, 175, 254, 205, 93, 6, 191, 255, 0, 51, 135, 253, 138, 150, 95, 210, 185, 255, 0, 249, 182, 15, 251, 138, 255, 0, 236, 213, 208, 107, 255, 0, 243, 56, 127, 216, 169, 101, 253, 40, 1, 124, 65, 255, 0, 51, 143, 253, 138, 150, 95, 210, 141, 127, 254, 103, 31, 251, 21, 108, 191, 165, 30, 32, 255, 0, 153, 199, 254, 197, 75, 47, 233, 70, 191, 255, 0, 51, 143, 253, 138, 182, 95, 210, 128, 13, 127, 254, 103, 15, 251, 21, 44, 191, 165, 55, 94, 233, 227, 15, 251, 21, 44, 191, 165, 59, 95, 255, 0, 153, 195, 254, 197, 75, 47, 233, 77, 215, 186, 120, 195, 254, 197, 75, 47, 233, 64, 7, 136, 63, 230, 111, 255, 0, 177, 86, 203, 250, 81, 226, 15, 249, 155, 255, 0, 236, 85, 178, 254, 148, 120, 131, 254, 102, 255, 0, 251, 21, 108, 191, 165, 30, 32, 255, 0, 153, 191, 254, 197, 91, 47, 233, 64, 7, 136, 63, 230, 111, 255, 0, 177, 86, 203, 250, 83, 188, 65, 255, 0, 51, 143, 253, 138, 182, 95, 210, 155, 226, 15, 249, 155, 255, 0, 236, 85, 178, 254, 148, 239, 16, 127, 204, 227, 255, 0, 98, 173, 151, 244, 160, 3, 94, 255, 0, 153, 195, 254, 197, 91, 47, 233, 70, 191, 211, 198, 31, 246, 42, 89, 127, 74, 53, 239, 249, 156, 63, 236, 85, 178, 254, 148, 107, 253, 60, 97, 255, 0, 98, 165, 151, 244, 160, 4, 215, 191, 230, 113, 255, 0, 177, 86, 203, 250, 83, 117, 238, 158, 48, 255, 0, 177, 86, 203, 250, 83, 181, 239, 249, 156, 127, 236, 85, 178, 254, 148, 221, 123, 167, 140, 63, 236, 85, 178, 254, 148, 0, 190, 32, 255, 0, 153, 191, 254, 197, 91, 47, 233, 71, 136, 63, 230, 111, 255, 0, 177, 86, 203, 250, 81, 226, 15, 249, 155, 255, 0, 236, 85, 178, 254, 148, 120, 131, 254, 102, 255, 0, 251, 21, 108, 191, 165, 0, 47, 240, 143, 173, 55, 252, 105, 223, 194, 62, 180, 223, 241, 160, 7, 122, 209, 235, 71, 173, 30, 180, 0, 127, 133, 55, 252, 41, 223, 225, 77, 255, 0, 10, 0, 112, 237, 64, 237, 64, 237, 64, 237, 64, 7, 248, 209, 254, 52, 127, 141, 31, 227, 64, 7, 173, 47, 173, 39, 173, 47, 173, 0, 51, 252, 41, 223, 196, 62, 148, 223, 240, 167, 127, 16, 250, 80, 0, 59, 87, 128, 215, 191, 14, 213, 224, 52, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 1, 158, 7, 90, 246, 175, 15, 216, 141, 63, 66, 182, 183, 11, 130, 23, 50, 123, 147, 94, 91, 225, 155, 3, 168, 235, 246, 208, 227, 42, 14, 246, 250, 10, 246, 90, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 195, 254, 66, 54, 191, 245, 213, 127, 157, 90, 241, 119, 252, 141, 58, 151, 253, 117, 255, 0, 10, 171, 97, 255, 0, 33, 27, 95, 250, 234, 191, 206, 173, 120, 187, 254, 70, 157, 75, 254, 186, 255, 0, 133, 123, 153, 23, 241, 223, 167, 234, 136, 169, 177, 141, 69, 20, 87, 212, 156, 225, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 5, 155, 31, 249, 8, 219, 127, 215, 85, 254, 117, 175, 226, 175, 249, 26, 117, 15, 250, 235, 89, 22, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 95, 197, 95, 242, 52, 234, 31, 245, 214, 190, 99, 62, 248, 169, 252, 205, 105, 25, 20, 81, 69, 120, 38, 193, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 218, 179, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 181, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 58, 135, 253, 118, 254, 149, 157, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 191, 165, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 140, 250, 135, 253, 117, 172, 251, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 25, 245, 15, 250, 235, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 187, 175, 0, 127, 200, 223, 227, 223, 251, 10, 175, 254, 139, 174, 22, 199, 254, 66, 22, 191, 245, 213, 127, 157, 119, 94, 0, 255, 0, 145, 191, 199, 191, 246, 21, 95, 253, 23, 64, 29, 253, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 30, 127, 241, 123, 254, 69, 27, 63, 251, 10, 218, 127, 232, 193, 92, 191, 138, 255, 0, 228, 104, 212, 63, 235, 175, 244, 21, 212, 124, 94, 255, 0, 145, 70, 207, 254, 194, 182, 159, 250, 48, 87, 47, 226, 191, 249, 26, 53, 15, 250, 235, 253, 5, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 140, 250, 135, 253, 117, 172, 251, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 25, 245, 15, 250, 235, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 87, 255, 0, 35, 78, 161, 255, 0, 93, 127, 165, 103, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 255, 0, 200, 211, 168, 127, 215, 95, 233, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 70, 161, 255, 0, 93, 191, 160, 172, 235, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 53, 15, 250, 237, 253, 5, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 173, 191, 235, 170, 255, 0, 49, 80, 248, 203, 254, 70, 237, 79, 254, 187, 127, 65, 83, 88, 255, 0, 200, 74, 219, 254, 186, 175, 243, 21, 15, 140, 191, 228, 110, 212, 255, 0, 235, 183, 244, 20, 30, 206, 75, 252, 119, 232, 97, 81, 69, 20, 31, 74, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 89, 211, 127, 228, 43, 105, 255, 0, 93, 151, 249, 215, 85, 226, 175, 249, 26, 117, 15, 250, 237, 253, 43, 149, 211, 127, 228, 43, 105, 255, 0, 93, 151, 249, 215, 85, 226, 175, 249, 26, 117, 15, 250, 237, 253, 40, 62, 123, 60, 222, 31, 51, 34, 138, 40, 160, 240, 130, 138, 40, 160, 2, 138, 40, 160, 2, 185, 63, 30, 233, 226, 231, 69, 23, 75, 147, 37, 187, 103, 167, 99, 214, 186, 202, 134, 226, 221, 110, 160, 150, 7, 229, 36, 82, 167, 241, 160, 15, 8, 162, 172, 234, 22, 111, 97, 127, 53, 172, 156, 180, 77, 180, 213, 106, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 43, 235, 223, 26, 255, 0, 201, 14, 190, 255, 0, 176, 84, 127, 201, 107, 228, 42, 250, 247, 198, 191, 242, 67, 175, 191, 236, 21, 31, 242, 90, 0, 243, 15, 217, 183, 254, 70, 45, 111, 254, 189, 35, 255, 0, 208, 171, 3, 227, 231, 252, 148, 233, 191, 235, 210, 31, 228, 107, 127, 246, 109, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 42, 192, 248, 249, 255, 0, 37, 58, 111, 250, 244, 135, 249, 26, 0, 246, 239, 26, 255, 0, 201, 15, 189, 255, 0, 176, 76, 127, 201, 107, 203, 255, 0, 102, 239, 249, 24, 181, 191, 250, 244, 143, 255, 0, 67, 175, 80, 241, 175, 252, 144, 251, 223, 251, 4, 199, 252, 150, 188, 191, 246, 110, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 58, 0, 193, 248, 249, 255, 0, 37, 62, 111, 250, 245, 135, 249, 26, 246, 223, 27, 127, 201, 13, 190, 255, 0, 176, 84, 127, 201, 107, 196, 190, 62, 127, 201, 79, 155, 254, 189, 97, 254, 70, 189, 183, 198, 223, 242, 67, 111, 191, 236, 21, 31, 242, 90, 0, 243, 31, 217, 183, 254, 70, 45, 111, 254, 189, 35, 255, 0, 208, 171, 7, 227, 239, 252, 148, 249, 191, 235, 210, 31, 228, 107, 123, 246, 109, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 42, 193, 248, 251, 255, 0, 37, 62, 111, 250, 244, 135, 249, 26, 0, 246, 207, 26, 255, 0, 201, 14, 189, 255, 0, 176, 76, 127, 201, 107, 203, 127, 103, 31, 249, 25, 117, 127, 250, 247, 95, 230, 107, 212, 188, 107, 255, 0, 36, 58, 247, 254, 193, 49, 255, 0, 37, 175, 45, 253, 156, 127, 228, 101, 213, 255, 0, 235, 221, 127, 153, 160, 12, 79, 143, 159, 242, 83, 166, 255, 0, 175, 72, 127, 145, 175, 109, 241, 175, 252, 144, 235, 223, 251, 4, 199, 252, 150, 188, 75, 227, 231, 252, 148, 233, 191, 235, 210, 31, 228, 107, 219, 124, 107, 255, 0, 36, 58, 247, 254, 193, 49, 255, 0, 37, 160, 15, 49, 253, 155, 127, 228, 98, 214, 255, 0, 235, 210, 63, 253, 10, 176, 62, 62, 127, 201, 80, 159, 254, 189, 97, 254, 85, 191, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 96, 124, 124, 255, 0, 146, 161, 63, 253, 122, 195, 252, 168, 3, 211, 190, 47, 127, 201, 14, 179, 255, 0, 183, 79, 229, 71, 193, 255, 0, 249, 34, 55, 127, 91, 191, 229, 71, 197, 239, 249, 33, 214, 127, 246, 233, 252, 168, 248, 63, 255, 0, 36, 70, 239, 235, 119, 252, 168, 3, 144, 253, 155, 127, 228, 98, 214, 255, 0, 235, 210, 63, 253, 10, 168, 31, 249, 57, 255, 0, 251, 138, 255, 0, 236, 181, 127, 246, 109, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 42, 160, 127, 228, 231, 255, 0, 238, 43, 255, 0, 178, 208, 5, 255, 0, 218, 75, 254, 70, 45, 19, 254, 189, 36, 255, 0, 208, 171, 175, 248, 189, 255, 0, 36, 58, 203, 233, 105, 252, 133, 114, 31, 180, 151, 252, 140, 90, 39, 253, 122, 73, 255, 0, 161, 87, 95, 241, 123, 254, 72, 117, 151, 210, 211, 249, 10, 0, 95, 131, 223, 242, 68, 110, 191, 237, 239, 249, 87, 31, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 118, 31, 7, 191, 228, 136, 221, 127, 219, 223, 242, 174, 63, 246, 109, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 42, 0, 206, 255, 0, 155, 158, 255, 0, 184, 175, 254, 203, 90, 63, 180, 143, 252, 140, 26, 31, 253, 122, 201, 255, 0, 161, 86, 119, 252, 220, 247, 253, 197, 127, 246, 90, 209, 253, 164, 127, 228, 96, 208, 255, 0, 235, 214, 79, 253, 10, 128, 59, 15, 139, 223, 242, 67, 173, 127, 237, 211, 249, 10, 79, 132, 31, 242, 67, 175, 63, 237, 239, 249, 82, 252, 94, 255, 0, 146, 29, 107, 255, 0, 110, 159, 200, 82, 124, 32, 255, 0, 146, 29, 121, 255, 0, 111, 127, 202, 128, 57, 15, 217, 183, 254, 70, 45, 111, 254, 189, 35, 255, 0, 208, 171, 63, 254, 110, 127, 254, 226, 191, 251, 45, 104, 126, 205, 191, 242, 49, 107, 127, 245, 233, 31, 254, 133, 89, 255, 0, 243, 115, 255, 0, 247, 21, 255, 0, 217, 104, 3, 67, 246, 146, 255, 0, 145, 135, 68, 255, 0, 175, 71, 255, 0, 208, 170, 255, 0, 199, 79, 249, 39, 158, 16, 252, 63, 244, 80, 170, 31, 180, 151, 252, 140, 58, 39, 253, 122, 63, 254, 133, 87, 254, 58, 127, 201, 60, 240, 135, 225, 255, 0, 162, 133, 0, 47, 199, 111, 249, 39, 190, 17, 252, 63, 244, 80, 163, 227, 183, 252, 147, 239, 8, 254, 31, 250, 40, 81, 241, 219, 254, 73, 239, 132, 127, 15, 253, 20, 40, 248, 237, 255, 0, 36, 251, 194, 63, 135, 254, 138, 20, 0, 124, 118, 255, 0, 146, 125, 225, 31, 195, 255, 0, 69, 10, 62, 59, 127, 201, 61, 240, 143, 225, 255, 0, 162, 133, 31, 29, 191, 228, 159, 120, 71, 240, 255, 0, 209, 66, 143, 142, 223, 242, 79, 124, 35, 248, 127, 232, 161, 64, 7, 199, 79, 249, 39, 94, 17, 255, 0, 128, 255, 0, 232, 145, 71, 199, 79, 249, 39, 126, 17, 255, 0, 128, 255, 0, 232, 161, 71, 199, 79, 249, 39, 94, 17, 255, 0, 128, 255, 0, 232, 145, 71, 199, 79, 249, 39, 126, 17, 255, 0, 128, 255, 0, 232, 161, 64, 7, 199, 79, 249, 39, 126, 17, 255, 0, 128, 255, 0, 232, 161, 71, 199, 111, 249, 39, 222, 17, 252, 63, 244, 80, 163, 227, 167, 252, 147, 191, 8, 255, 0, 192, 127, 244, 80, 163, 227, 183, 252, 147, 239, 8, 254, 31, 250, 40, 80, 1, 241, 219, 254, 73, 239, 132, 127, 15, 253, 20, 40, 248, 237, 255, 0, 36, 247, 194, 63, 135, 254, 138, 20, 124, 118, 255, 0, 146, 123, 225, 31, 195, 255, 0, 69, 10, 62, 59, 127, 201, 61, 240, 143, 225, 255, 0, 162, 133, 0, 31, 29, 191, 228, 158, 248, 71, 240, 255, 0, 209, 66, 143, 142, 191, 242, 79, 60, 35, 248, 127, 232, 161, 71, 199, 111, 249, 39, 190, 17, 252, 63, 244, 80, 163, 227, 175, 252, 147, 207, 8, 254, 31, 250, 40, 80, 1, 241, 211, 254, 73, 231, 132, 127, 224, 63, 250, 40, 81, 241, 211, 254, 73, 231, 132, 127, 224, 63, 250, 40, 81, 241, 211, 254, 73, 231, 132, 127, 224, 63, 250, 40, 81, 241, 211, 254, 73, 231, 132, 127, 224, 63, 250, 40, 80, 5, 255, 0, 16, 255, 0, 201, 77, 248, 95, 255, 0, 94, 177, 255, 0, 33, 71, 134, 255, 0, 228, 167, 252, 78, 255, 0, 175, 70, 254, 84, 120, 135, 254, 74, 111, 194, 255, 0, 250, 245, 143, 249, 10, 60, 55, 255, 0, 37, 63, 226, 119, 253, 122, 55, 242, 160, 14, 68, 127, 201, 176, 31, 251, 10, 255, 0, 236, 213, 215, 120, 143, 254, 74, 127, 195, 15, 250, 244, 143, 249, 87, 34, 63, 228, 216, 15, 253, 133, 127, 246, 106, 235, 188, 71, 255, 0, 37, 63, 225, 135, 253, 122, 71, 252, 168, 0, 240, 239, 252, 149, 31, 137, 223, 245, 230, 255, 0, 202, 185, 15, 249, 182, 15, 251, 138, 255, 0, 236, 213, 215, 248, 119, 254, 74, 143, 196, 239, 250, 243, 127, 229, 92, 135, 252, 219, 7, 253, 197, 127, 246, 106, 0, 235, 252, 69, 255, 0, 37, 55, 225, 135, 253, 123, 39, 242, 20, 120, 123, 254, 74, 143, 196, 239, 250, 244, 127, 229, 71, 136, 191, 228, 166, 252, 48, 255, 0, 175, 100, 254, 66, 143, 15, 127, 201, 81, 248, 157, 255, 0, 94, 143, 252, 168, 3, 143, 255, 0, 155, 97, 255, 0, 184, 175, 254, 205, 93, 135, 136, 255, 0, 228, 166, 252, 47, 255, 0, 175, 100, 254, 66, 184, 255, 0, 249, 182, 31, 251, 138, 255, 0, 236, 213, 216, 120, 143, 254, 74, 111, 194, 255, 0, 250, 246, 79, 228, 40, 0, 240, 255, 0, 252, 148, 255, 0, 137, 223, 245, 234, 223, 202, 185, 17, 255, 0, 38, 192, 127, 236, 43, 255, 0, 179, 87, 93, 225, 255, 0, 249, 41, 255, 0, 19, 191, 235, 213, 191, 149, 114, 35, 254, 77, 128, 255, 0, 216, 87, 255, 0, 102, 160, 14, 187, 196, 95, 242, 83, 190, 24, 127, 215, 162, 255, 0, 42, 60, 59, 255, 0, 37, 75, 226, 111, 253, 122, 55, 242, 163, 196, 95, 242, 83, 190, 24, 127, 215, 162, 255, 0, 42, 60, 59, 255, 0, 37, 75, 226, 111, 253, 122, 55, 242, 160, 14, 67, 254, 109, 131, 254, 226, 191, 251, 53, 116, 26, 255, 0, 252, 206, 31, 246, 42, 89, 127, 74, 231, 255, 0, 230, 216, 63, 238, 43, 255, 0, 179, 87, 65, 175, 255, 0, 204, 225, 255, 0, 98, 165, 151, 244, 160, 5, 241, 7, 252, 206, 63, 246, 42, 89, 127, 74, 53, 255, 0, 249, 156, 127, 236, 85, 178, 254, 148, 120, 131, 254, 103, 31, 251, 21, 44, 191, 165, 26, 255, 0, 252, 206, 63, 246, 42, 217, 127, 74, 0, 53, 239, 187, 226, 255, 0, 251, 21, 44, 191, 165, 38, 191, 255, 0, 51, 135, 253, 138, 150, 95, 210, 151, 94, 251, 190, 47, 255, 0, 177, 82, 203, 250, 82, 107, 255, 0, 243, 56, 127, 216, 169, 101, 253, 40, 1, 60, 65, 255, 0, 51, 127, 253, 138, 182, 95, 210, 143, 16, 127, 204, 223, 255, 0, 98, 173, 151, 244, 163, 196, 31, 243, 55, 255, 0, 216, 171, 101, 253, 40, 241, 7, 252, 205, 255, 0, 246, 42, 217, 127, 74, 0, 60, 65, 255, 0, 51, 127, 253, 138, 182, 95, 210, 157, 226, 15, 249, 156, 127, 236, 85, 178, 254, 148, 223, 16, 127, 204, 223, 255, 0, 98, 173, 151, 244, 167, 120, 131, 254, 103, 31, 251, 21, 108, 191, 165, 0, 26, 247, 252, 206, 31, 246, 42, 217, 127, 74, 53, 254, 158, 48, 255, 0, 177, 82, 203, 250, 81, 175, 127, 204, 225, 255, 0, 98, 173, 151, 244, 163, 95, 233, 227, 15, 251, 21, 44, 191, 165, 0, 38, 189, 255, 0, 51, 143, 253, 138, 182, 95, 210, 155, 175, 116, 241, 135, 253, 138, 182, 95, 210, 157, 175, 127, 204, 227, 255, 0, 98, 173, 151, 244, 166, 235, 221, 60, 97, 255, 0, 98, 173, 151, 244, 160, 5, 241, 7, 252, 205, 255, 0, 246, 42, 217, 127, 74, 60, 65, 255, 0, 51, 127, 253, 138, 182, 95, 210, 143, 16, 127, 204, 223, 255, 0, 98, 173, 151, 244, 163, 196, 31, 243, 55, 255, 0, 216, 171, 101, 253, 40, 1, 127, 132, 125, 105, 191, 227, 78, 254, 17, 245, 166, 255, 0, 141, 0, 59, 214, 143, 90, 61, 104, 245, 160, 3, 252, 41, 191, 225, 78, 255, 0, 10, 111, 248, 80, 3, 135, 106, 7, 106, 7, 106, 7, 106, 0, 63, 198, 143, 241, 163, 252, 104, 255, 0, 26, 0, 61, 105, 125, 105, 61, 105, 125, 104, 1, 159, 225, 78, 254, 33, 244, 166, 255, 0, 133, 59, 248, 135, 210, 128, 1, 218, 188, 6, 189, 248, 118, 175, 1, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 41, 209, 198, 101, 145, 81, 122, 177, 192, 160, 14, 255, 0, 225, 213, 130, 133, 185, 191, 124, 228, 145, 26, 241, 219, 185, 174, 242, 179, 244, 141, 56, 105, 122, 76, 22, 92, 101, 23, 230, 62, 167, 189, 104, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 31, 242, 17, 181, 255, 0, 174, 171, 252, 234, 215, 139, 191, 228, 105, 212, 191, 235, 175, 248, 85, 91, 15, 249, 8, 218, 255, 0, 215, 85, 254, 117, 107, 197, 223, 242, 52, 234, 95, 245, 215, 252, 43, 220, 200, 191, 142, 253, 63, 84, 69, 77, 140, 106, 40, 162, 190, 164, 231, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 44, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 127, 21, 127, 200, 211, 168, 127, 215, 90, 200, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 254, 42, 255, 0, 145, 167, 80, 255, 0, 174, 181, 243, 25, 247, 197, 79, 230, 107, 72, 200, 162, 138, 43, 193, 54, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 213, 157, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 168, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 105, 212, 63, 235, 183, 244, 172, 235, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 117, 15, 250, 237, 253, 40, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 103, 212, 63, 235, 173, 103, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 207, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 221, 120, 3, 254, 70, 255, 0, 30, 255, 0, 216, 85, 127, 244, 93, 112, 182, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 186, 240, 7, 252, 141, 254, 61, 255, 0, 176, 170, 255, 0, 232, 186, 0, 239, 232, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 243, 255, 0, 139, 223, 242, 40, 217, 255, 0, 216, 86, 211, 255, 0, 70, 10, 229, 252, 87, 255, 0, 35, 70, 161, 255, 0, 93, 127, 160, 174, 163, 226, 247, 252, 138, 54, 127, 246, 21, 180, 255, 0, 209, 130, 185, 127, 21, 255, 0, 200, 209, 168, 127, 215, 95, 232, 40, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 103, 212, 63, 235, 173, 103, 88, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 31, 21, 127, 200, 207, 168, 127, 215, 106, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 191, 249, 26, 117, 15, 250, 235, 253, 43, 62, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 120, 175, 254, 70, 157, 67, 254, 186, 255, 0, 74, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 117, 15, 250, 235, 254, 21, 157, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 37, 109, 255, 0, 93, 87, 249, 138, 135, 198, 95, 242, 55, 106, 127, 245, 219, 250, 10, 150, 199, 254, 66, 86, 223, 245, 217, 127, 157, 69, 227, 47, 249, 27, 181, 63, 250, 237, 253, 5, 7, 179, 146, 255, 0, 29, 250, 24, 84, 81, 69, 7, 210, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 22, 180, 223, 249, 10, 90, 127, 215, 101, 254, 117, 212, 248, 175, 254, 70, 157, 67, 254, 186, 255, 0, 74, 229, 180, 223, 249, 10, 90, 127, 215, 101, 254, 117, 212, 248, 175, 254, 70, 157, 67, 254, 186, 255, 0, 74, 15, 158, 207, 55, 135, 204, 200, 162, 138, 40, 60, 32, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 3, 205, 254, 32, 105, 63, 103, 188, 143, 80, 137, 127, 119, 63, 18, 127, 188, 43, 138, 175, 101, 241, 54, 153, 46, 173, 160, 205, 109, 16, 204, 163, 231, 140, 14, 228, 118, 175, 28, 100, 40, 197, 88, 97, 129, 193, 7, 181, 0, 54, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 190, 189, 241, 175, 252, 144, 235, 239, 251, 5, 71, 252, 150, 190, 66, 175, 175, 124, 107, 255, 0, 36, 58, 251, 254, 193, 81, 255, 0, 37, 160, 15, 48, 253, 155, 127, 228, 98, 214, 255, 0, 235, 210, 63, 253, 10, 176, 62, 62, 127, 201, 78, 155, 254, 189, 33, 254, 70, 183, 255, 0, 102, 223, 249, 24, 181, 191, 250, 244, 143, 255, 0, 66, 172, 15, 143, 159, 242, 83, 166, 255, 0, 175, 72, 127, 145, 160, 15, 110, 241, 175, 252, 144, 251, 239, 251, 4, 167, 242, 90, 243, 15, 217, 183, 254, 70, 45, 111, 254, 189, 35, 255, 0, 208, 171, 211, 252, 107, 255, 0, 36, 62, 247, 254, 193, 49, 255, 0, 37, 175, 48, 253, 155, 127, 228, 97, 214, 255, 0, 235, 209, 63, 244, 42, 0, 192, 248, 249, 255, 0, 37, 62, 111, 250, 245, 135, 249, 26, 246, 223, 27, 127, 201, 13, 190, 255, 0, 176, 84, 127, 201, 107, 196, 190, 62, 127, 201, 79, 155, 254, 189, 97, 254, 70, 189, 183, 198, 223, 242, 67, 175, 191, 236, 21, 31, 242, 90, 0, 243, 31, 217, 183, 254, 70, 45, 111, 254, 189, 35, 255, 0, 208, 171, 7, 227, 239, 252, 148, 249, 191, 235, 210, 31, 228, 107, 123, 246, 109, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 42, 192, 248, 249, 255, 0, 37, 58, 111, 250, 244, 135, 249, 26, 0, 246, 239, 27, 127, 201, 15, 189, 255, 0, 176, 76, 127, 201, 107, 204, 63, 102, 223, 249, 24, 181, 191, 250, 244, 143, 255, 0, 66, 175, 79, 241, 175, 252, 144, 251, 223, 251, 4, 199, 252, 150, 188, 195, 246, 109, 255, 0, 145, 139, 91, 255, 0, 175, 72, 255, 0, 244, 42, 0, 192, 248, 249, 255, 0, 37, 58, 111, 250, 244, 135, 249, 26, 246, 223, 27, 127, 201, 13, 190, 255, 0, 176, 84, 127, 201, 107, 196, 190, 62, 127, 201, 78, 155, 254, 189, 33, 254, 70, 189, 183, 198, 223, 242, 67, 175, 191, 236, 21, 31, 242, 90, 0, 243, 31, 217, 183, 254, 70, 45, 111, 254, 189, 35, 255, 0, 208, 171, 3, 227, 231, 252, 149, 9, 255, 0, 235, 214, 31, 229, 91, 223, 179, 119, 252, 140, 58, 223, 253, 122, 39, 254, 135, 88, 63, 31, 63, 228, 168, 79, 255, 0, 94, 176, 255, 0, 42, 0, 244, 239, 139, 223, 242, 67, 172, 255, 0, 237, 211, 249, 81, 240, 127, 254, 72, 141, 223, 214, 239, 249, 81, 241, 123, 254, 72, 117, 159, 253, 186, 127, 42, 62, 15, 255, 0, 201, 17, 187, 250, 221, 255, 0, 42, 0, 228, 127, 102, 207, 249, 24, 117, 207, 250, 244, 79, 253, 10, 179, 207, 252, 157, 15, 253, 197, 127, 246, 90, 191, 251, 54, 255, 0, 200, 197, 173, 255, 0, 215, 164, 127, 250, 21, 80, 63, 242, 115, 255, 0, 247, 21, 255, 0, 217, 104, 2, 255, 0, 237, 37, 255, 0, 35, 22, 137, 255, 0, 94, 146, 127, 232, 85, 215, 252, 94, 255, 0, 146, 29, 101, 244, 180, 254, 66, 185, 15, 218, 75, 254, 70, 45, 19, 254, 189, 36, 255, 0, 208, 171, 175, 248, 189, 255, 0, 36, 54, 207, 233, 105, 252, 133, 0, 47, 193, 255, 0, 249, 34, 55, 95, 246, 247, 252, 171, 143, 253, 155, 127, 228, 98, 214, 255, 0, 235, 210, 63, 253, 10, 187, 15, 131, 255, 0, 242, 68, 110, 191, 237, 239, 249, 87, 31, 251, 54, 255, 0, 200, 195, 173, 255, 0, 215, 162, 127, 232, 84, 1, 157, 255, 0, 55, 61, 255, 0, 113, 95, 253, 150, 180, 127, 105, 31, 249, 24, 52, 63, 250, 245, 147, 255, 0, 66, 172, 239, 249, 185, 239, 251, 138, 255, 0, 236, 181, 163, 251, 72, 255, 0, 200, 193, 161, 255, 0, 215, 172, 159, 250, 21, 0, 118, 31, 23, 191, 228, 135, 90, 255, 0, 219, 167, 242, 20, 159, 8, 63, 228, 135, 94, 127, 219, 223, 242, 165, 248, 189, 255, 0, 36, 58, 215, 254, 221, 63, 144, 164, 248, 65, 255, 0, 36, 58, 243, 254, 222, 255, 0, 149, 0, 114, 31, 179, 111, 252, 140, 90, 223, 253, 122, 71, 255, 0, 161, 86, 127, 252, 220, 255, 0, 253, 197, 127, 246, 90, 208, 253, 155, 127, 228, 98, 214, 255, 0, 235, 210, 63, 253, 10, 179, 255, 0, 230, 231, 255, 0, 238, 43, 255, 0, 178, 208, 6, 135, 237, 37, 255, 0, 35, 14, 135, 255, 0, 94, 175, 255, 0, 161, 213, 255, 0, 142, 159, 242, 79, 60, 33, 248, 127, 232, 161, 84, 63, 105, 47, 249, 24, 116, 79, 250, 244, 127, 253, 10, 175, 252, 116, 255, 0, 146, 121, 225, 15, 195, 255, 0, 69, 10, 0, 95, 142, 223, 242, 79, 124, 35, 248, 127, 232, 161, 71, 199, 111, 249, 39, 222, 17, 252, 63, 244, 80, 163, 227, 183, 252, 147, 223, 8, 254, 31, 250, 40, 81, 241, 219, 254, 73, 247, 132, 127, 15, 253, 20, 40, 0, 248, 237, 255, 0, 36, 251, 194, 63, 135, 254, 138, 20, 124, 118, 255, 0, 146, 123, 225, 31, 195, 255, 0, 69, 10, 62, 59, 127, 201, 62, 240, 143, 225, 255, 0, 162, 133, 31, 29, 191, 228, 158, 248, 71, 240, 255, 0, 209, 66, 128, 15, 142, 159, 242, 78, 188, 35, 255, 0, 1, 255, 0, 209, 34, 143, 142, 159, 242, 78, 252, 35, 255, 0, 1, 255, 0, 209, 66, 143, 142, 159, 242, 78, 252, 35, 255, 0, 1, 255, 0, 209, 66, 143, 142, 159, 242, 78, 252, 35, 255, 0, 1, 255, 0, 209, 66, 128, 15, 142, 159, 242, 78, 252, 35, 255, 0, 1, 255, 0, 209, 66, 143, 142, 223, 242, 79, 188, 35, 248, 127, 232, 161, 71, 199, 79, 249, 39, 126, 17, 255, 0, 128, 255, 0, 232, 161, 71, 199, 111, 249, 39, 190, 17, 252, 63, 244, 80, 160, 3, 227, 183, 252, 147, 223, 8, 254, 31, 250, 40, 81, 241, 219, 254, 73, 239, 132, 127, 15, 253, 20, 40, 248, 237, 255, 0, 36, 247, 194, 63, 135, 254, 138, 20, 124, 118, 255, 0, 146, 123, 225, 31, 195, 255, 0, 69, 10, 0, 62, 59, 127, 201, 61, 240, 143, 225, 255, 0, 162, 133, 31, 29, 63, 228, 157, 248, 75, 254, 3, 255, 0, 162, 133, 31, 29, 191, 228, 158, 248, 71, 240, 255, 0, 209, 66, 143, 142, 159, 242, 78, 252, 37, 255, 0, 1, 255, 0, 209, 66, 128, 15, 142, 159, 242, 79, 60, 35, 255, 0, 1, 255, 0, 209, 66, 143, 142, 159, 242, 79, 60, 35, 255, 0, 1, 255, 0, 209, 66, 143, 142, 159, 242, 79, 60, 35, 255, 0, 1, 255, 0, 209, 66, 143, 142, 159, 242, 79, 60, 35, 255, 0, 1, 255, 0, 209, 66, 128, 47, 248, 135, 254, 74, 111, 194, 255, 0, 250, 245, 143, 249, 10, 60, 55, 255, 0, 37, 63, 226, 119, 253, 122, 55, 242, 163, 196, 63, 242, 83, 126, 23, 255, 0, 215, 172, 127, 200, 81, 225, 191, 249, 41, 255, 0, 19, 191, 235, 209, 191, 149, 0, 114, 35, 254, 77, 128, 255, 0, 216, 87, 255, 0, 102, 174, 187, 196, 127, 242, 83, 254, 24, 127, 215, 164, 127, 202, 185, 17, 255, 0, 38, 192, 127, 236, 43, 255, 0, 179, 87, 93, 226, 63, 249, 41, 255, 0, 12, 63, 235, 210, 63, 229, 64, 7, 135, 127, 228, 168, 252, 78, 255, 0, 175, 55, 254, 85, 200, 127, 205, 176, 127, 220, 87, 255, 0, 102, 174, 191, 195, 191, 242, 84, 126, 39, 127, 215, 155, 255, 0, 42, 228, 63, 230, 216, 63, 238, 43, 255, 0, 179, 80, 7, 95, 226, 47, 249, 41, 191, 12, 63, 235, 217, 63, 144, 163, 195, 223, 242, 84, 126, 39, 127, 215, 163, 255, 0, 42, 60, 69, 255, 0, 37, 55, 225, 135, 253, 123, 39, 242, 20, 120, 123, 254, 74, 143, 196, 239, 250, 244, 127, 229, 64, 28, 127, 252, 219, 15, 253, 197, 127, 246, 106, 236, 60, 71, 255, 0, 37, 55, 225, 127, 253, 123, 39, 242, 21, 199, 255, 0, 205, 176, 255, 0, 220, 87, 255, 0, 102, 174, 195, 196, 127, 242, 83, 62, 23, 255, 0, 215, 178, 127, 33, 64, 11, 225, 223, 249, 41, 255, 0, 19, 191, 235, 209, 191, 149, 114, 3, 254, 77, 128, 255, 0, 216, 87, 255, 0, 102, 174, 191, 195, 191, 242, 83, 254, 39, 127, 215, 163, 127, 42, 228, 7, 252, 155, 1, 255, 0, 176, 175, 254, 205, 64, 29, 119, 136, 191, 228, 167, 124, 48, 255, 0, 175, 69, 254, 84, 120, 119, 254, 74, 151, 196, 223, 250, 244, 111, 229, 71, 136, 191, 228, 167, 124, 48, 255, 0, 175, 69, 254, 84, 120, 119, 254, 74, 151, 196, 223, 250, 244, 111, 229, 64, 28, 135, 252, 219, 7, 253, 197, 127, 246, 106, 232, 53, 255, 0, 249, 156, 63, 236, 84, 178, 254, 149, 207, 255, 0, 205, 176, 127, 220, 87, 255, 0, 102, 174, 131, 94, 255, 0, 153, 199, 254, 197, 91, 47, 233, 64, 11, 226, 15, 249, 156, 127, 236, 84, 178, 254, 148, 107, 255, 0, 243, 56, 255, 0, 216, 171, 101, 253, 40, 241, 7, 252, 206, 63, 246, 42, 89, 127, 74, 53, 255, 0, 249, 156, 127, 236, 85, 178, 254, 148, 0, 107, 255, 0, 243, 56, 127, 216, 169, 101, 253, 41, 60, 65, 255, 0, 51, 135, 253, 138, 150, 95, 210, 151, 95, 255, 0, 153, 195, 254, 197, 75, 47, 233, 77, 241, 7, 252, 205, 255, 0, 246, 42, 217, 127, 74, 0, 60, 65, 255, 0, 51, 127, 253, 138, 182, 95, 210, 143, 16, 127, 204, 223, 255, 0, 98, 173, 151, 244, 163, 196, 31, 243, 55, 255, 0, 216, 171, 101, 253, 40, 241, 7, 252, 205, 255, 0, 246, 42, 217, 127, 74, 0, 60, 65, 255, 0, 51, 127, 253, 138, 182, 95, 210, 157, 226, 15, 249, 156, 127, 236, 85, 178, 254, 148, 223, 16, 127, 204, 223, 255, 0, 98, 173, 151, 244, 167, 120, 131, 254, 103, 31, 251, 21, 108, 191, 165, 0, 26, 247, 252, 206, 31, 246, 42, 217, 127, 74, 53, 254, 158, 48, 255, 0, 177, 82, 203, 250, 81, 175, 255, 0, 204, 227, 255, 0, 98, 173, 151, 244, 163, 95, 233, 227, 15, 251, 21, 44, 191, 165, 0, 38, 189, 255, 0, 51, 143, 253, 138, 182, 95, 210, 155, 175, 116, 241, 135, 253, 138, 182, 95, 210, 157, 175, 127, 204, 227, 255, 0, 98, 173, 151, 244, 166, 235, 221, 60, 97, 255, 0, 98, 173, 151, 244, 160, 5, 241, 7, 252, 205, 255, 0, 246, 42, 217, 127, 74, 60, 65, 255, 0, 51, 127, 253, 138, 182, 95, 210, 143, 16, 127, 204, 223, 255, 0, 98, 173, 151, 244, 163, 196, 31, 243, 55, 255, 0, 216, 171, 101, 253, 40, 1, 127, 132, 125, 105, 191, 227, 78, 237, 248, 209, 143, 231, 64, 7, 173, 30, 180, 122, 209, 235, 64, 7, 248, 83, 127, 194, 159, 254, 20, 207, 240, 160, 7, 14, 212, 14, 212, 14, 212, 14, 212, 0, 127, 141, 31, 227, 71, 248, 209, 254, 52, 0, 122, 210, 250, 210, 122, 210, 250, 208, 3, 63, 194, 157, 252, 67, 233, 77, 255, 0, 10, 119, 241, 15, 165, 0, 3, 181, 120, 13, 123, 240, 237, 94, 3, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 116, 190, 10, 210, 63, 180, 181, 165, 146, 69, 204, 16, 124, 205, 245, 237, 92, 213, 122, 183, 130, 116, 169, 116, 237, 20, 203, 48, 43, 37, 195, 111, 242, 200, 232, 59, 80, 7, 79, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 31, 242, 17, 181, 255, 0, 174, 171, 252, 234, 215, 139, 191, 228, 105, 212, 191, 235, 175, 248, 85, 107, 15, 249, 8, 218, 255, 0, 215, 85, 254, 117, 103, 197, 223, 242, 52, 234, 95, 245, 215, 252, 43, 220, 200, 191, 142, 253, 63, 84, 69, 77, 140, 106, 40, 162, 190, 164, 231, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 44, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 127, 21, 127, 200, 211, 168, 127, 215, 90, 200, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 254, 42, 31, 241, 84, 234, 31, 245, 214, 190, 99, 62, 248, 169, 252, 205, 105, 25, 20, 81, 69, 120, 38, 193, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 218, 179, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 181, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 58, 135, 253, 118, 254, 149, 157, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 191, 160, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 157, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 215, 117, 224, 15, 249, 27, 252, 123, 255, 0, 97, 85, 255, 0, 209, 117, 194, 216, 255, 0, 200, 66, 215, 254, 186, 175, 243, 174, 235, 192, 31, 242, 55, 248, 243, 254, 194, 171, 255, 0, 162, 232, 3, 191, 162, 138, 40, 0, 162, 138, 40, 2, 141, 198, 173, 167, 90, 72, 97, 185, 212, 45, 32, 148, 12, 237, 146, 101, 83, 249, 19, 81, 255, 0, 111, 232, 223, 244, 23, 211, 255, 0, 240, 33, 127, 198, 190, 100, 248, 249, 255, 0, 37, 66, 127, 250, 245, 135, 249, 87, 152, 80, 7, 221, 95, 219, 250, 55, 253, 5, 244, 255, 0, 252, 8, 95, 241, 163, 251, 127, 70, 255, 0, 160, 190, 159, 255, 0, 129, 11, 254, 53, 240, 173, 20, 1, 245, 143, 197, 93, 87, 78, 188, 240, 181, 164, 54, 186, 133, 172, 242, 255, 0, 106, 90, 159, 46, 41, 149, 143, 223, 29, 129, 166, 107, 254, 22, 212, 47, 53, 219, 187, 136, 158, 223, 203, 119, 200, 15, 32, 6, 190, 96, 208, 191, 228, 96, 211, 127, 235, 234, 47, 253, 12, 87, 208, 190, 43, 255, 0, 145, 167, 80, 229, 191, 214, 250, 251, 80, 5, 143, 248, 67, 181, 111, 249, 233, 105, 255, 0, 127, 133, 31, 240, 134, 234, 223, 223, 180, 255, 0, 191, 194, 185, 236, 31, 239, 55, 253, 244, 104, 193, 254, 243, 127, 223, 70, 128, 58, 31, 248, 67, 117, 111, 239, 218, 127, 223, 225, 71, 252, 33, 186, 183, 247, 237, 63, 239, 240, 174, 123, 7, 251, 205, 255, 0, 125, 26, 48, 127, 188, 223, 247, 209, 160, 14, 135, 254, 16, 221, 91, 251, 246, 159, 247, 248, 81, 255, 0, 8, 110, 173, 253, 251, 79, 251, 252, 43, 158, 193, 254, 243, 127, 223, 70, 140, 31, 239, 55, 253, 244, 104, 3, 161, 255, 0, 132, 55, 86, 254, 253, 167, 253, 254, 20, 127, 194, 27, 171, 127, 126, 211, 254, 255, 0, 10, 231, 176, 127, 188, 223, 247, 209, 163, 7, 251, 205, 255, 0, 125, 26, 0, 233, 173, 124, 31, 169, 199, 123, 11, 22, 181, 194, 184, 39, 19, 15, 90, 187, 175, 248, 91, 81, 188, 215, 46, 238, 98, 123, 127, 46, 73, 114, 3, 202, 1, 174, 82, 196, 31, 237, 27, 110, 91, 253, 106, 255, 0, 17, 245, 173, 31, 21, 127, 200, 209, 168, 114, 223, 235, 189, 104, 2, 199, 252, 33, 218, 191, 247, 237, 63, 239, 240, 163, 254, 16, 237, 95, 251, 246, 159, 247, 248, 87, 61, 131, 234, 255, 0, 247, 209, 163, 7, 213, 255, 0, 239, 163, 64, 29, 15, 252, 33, 218, 191, 247, 237, 63, 239, 240, 163, 254, 16, 237, 95, 251, 246, 159, 247, 248, 87, 61, 131, 234, 255, 0, 247, 209, 163, 7, 213, 255, 0, 239, 163, 64, 29, 15, 252, 33, 218, 191, 247, 237, 63, 239, 240, 163, 254, 16, 237, 95, 251, 246, 159, 247, 248, 87, 61, 131, 234, 255, 0, 247, 209, 163, 7, 213, 255, 0, 239, 163, 64, 29, 15, 252, 33, 218, 191, 247, 237, 63, 239, 240, 163, 254, 16, 237, 95, 251, 246, 159, 247, 248, 87, 61, 131, 234, 255, 0, 247, 209, 163, 7, 213, 255, 0, 239, 163, 64, 29, 61, 175, 132, 53, 56, 239, 96, 145, 154, 215, 11, 40, 39, 19, 15, 90, 185, 175, 248, 87, 80, 187, 215, 174, 238, 98, 123, 127, 45, 223, 32, 60, 128, 30, 149, 202, 88, 3, 253, 163, 109, 243, 55, 250, 213, 254, 35, 235, 90, 62, 43, 231, 197, 58, 135, 204, 223, 235, 125, 125, 168, 2, 199, 252, 33, 186, 191, 252, 244, 180, 255, 0, 191, 194, 143, 248, 67, 117, 127, 249, 233, 105, 255, 0, 127, 133, 115, 216, 62, 175, 255, 0, 125, 26, 48, 125, 95, 254, 250, 52, 1, 208, 255, 0, 194, 27, 171, 255, 0, 207, 75, 79, 251, 252, 40, 255, 0, 132, 55, 87, 255, 0, 158, 150, 159, 247, 248, 87, 61, 131, 234, 255, 0, 247, 209, 163, 7, 213, 255, 0, 239, 163, 64, 29, 15, 252, 33, 186, 191, 252, 244, 180, 255, 0, 191, 194, 143, 248, 67, 117, 127, 249, 233, 105, 255, 0, 127, 133, 115, 216, 62, 175, 255, 0, 125, 26, 48, 125, 95, 254, 250, 52, 1, 208, 255, 0, 194, 27, 171, 255, 0, 207, 75, 79, 251, 252, 40, 255, 0, 132, 55, 87, 255, 0, 158, 150, 159, 247, 248, 87, 61, 131, 234, 255, 0, 247, 209, 163, 7, 213, 255, 0, 239, 163, 64, 29, 61, 175, 131, 245, 56, 239, 96, 145, 154, 215, 2, 80, 78, 38, 30, 181, 115, 95, 240, 182, 161, 119, 175, 93, 221, 68, 246, 254, 91, 190, 64, 121, 64, 61, 43, 149, 177, 7, 251, 70, 219, 230, 111, 245, 171, 252, 71, 214, 180, 60, 87, 207, 138, 117, 15, 153, 191, 214, 250, 251, 80, 5, 143, 248, 67, 117, 111, 239, 218, 127, 223, 225, 71, 252, 33, 186, 183, 247, 237, 63, 239, 240, 174, 123, 7, 251, 205, 255, 0, 125, 26, 48, 127, 188, 223, 247, 209, 160, 14, 135, 254, 16, 221, 91, 251, 246, 159, 247, 248, 81, 255, 0, 8, 110, 173, 253, 251, 79, 251, 252, 43, 158, 193, 245, 127, 251, 232, 209, 131, 234, 255, 0, 247, 209, 160, 14, 135, 254, 16, 221, 91, 251, 246, 159, 247, 248, 81, 255, 0, 8, 110, 173, 253, 251, 79, 251, 252, 43, 158, 193, 245, 127, 251, 232, 209, 131, 234, 255, 0, 247, 209, 160, 14, 135, 254, 16, 221, 91, 251, 246, 159, 247, 248, 81, 255, 0, 8, 110, 173, 253, 251, 79, 251, 252, 43, 158, 193, 245, 127, 251, 232, 209, 131, 234, 255, 0, 247, 209, 160, 14, 158, 215, 193, 250, 156, 119, 176, 177, 107, 92, 43, 130, 113, 48, 245, 174, 111, 198, 95, 242, 55, 106, 127, 245, 219, 250, 10, 150, 192, 31, 237, 27, 110, 91, 253, 106, 255, 0, 17, 245, 168, 188, 101, 255, 0, 35, 118, 167, 255, 0, 93, 191, 160, 160, 246, 114, 95, 227, 191, 67, 10, 138, 40, 160, 250, 80, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 214, 155, 255, 0, 33, 75, 79, 250, 236, 191, 206, 189, 15, 95, 240, 174, 161, 121, 175, 93, 220, 196, 246, 254, 91, 190, 64, 105, 64, 61, 43, 207, 52, 223, 249, 10, 90, 127, 215, 101, 254, 117, 212, 248, 175, 254, 70, 157, 67, 230, 111, 245, 190, 190, 194, 131, 231, 179, 205, 225, 243, 44, 127, 194, 29, 171, 255, 0, 126, 211, 254, 255, 0, 10, 63, 225, 14, 213, 255, 0, 191, 105, 255, 0, 127, 133, 115, 219, 79, 247, 155, 254, 250, 52, 109, 63, 222, 111, 251, 232, 208, 120, 71, 67, 255, 0, 8, 118, 175, 253, 251, 79, 251, 252, 40, 255, 0, 132, 59, 87, 254, 253, 167, 253, 254, 21, 207, 109, 63, 222, 111, 251, 232, 209, 180, 255, 0, 121, 191, 239, 163, 64, 29, 15, 252, 33, 218, 191, 247, 237, 63, 239, 240, 163, 254, 16, 237, 95, 251, 246, 159, 247, 248, 87, 61, 180, 255, 0, 121, 191, 239, 163, 70, 211, 253, 230, 255, 0, 190, 141, 0, 116, 63, 240, 135, 106, 255, 0, 223, 180, 255, 0, 191, 194, 143, 248, 67, 181, 127, 239, 218, 127, 223, 225, 92, 246, 211, 253, 230, 255, 0, 190, 141, 27, 79, 247, 155, 254, 250, 52, 1, 211, 218, 248, 71, 84, 142, 246, 9, 25, 173, 112, 37, 4, 226, 97, 235, 94, 61, 241, 127, 194, 237, 225, 207, 28, 221, 73, 26, 70, 150, 119, 204, 102, 132, 33, 233, 234, 61, 185, 175, 66, 177, 7, 251, 70, 215, 150, 255, 0, 90, 191, 196, 125, 107, 63, 226, 229, 130, 223, 207, 171, 49, 25, 150, 222, 95, 53, 49, 201, 232, 50, 40, 3, 195, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 43, 234, 255, 0, 24, 107, 26, 100, 159, 6, 47, 45, 226, 212, 236, 222, 83, 166, 70, 161, 22, 101, 44, 78, 7, 24, 205, 124, 161, 69, 0, 123, 63, 236, 241, 123, 105, 99, 174, 235, 79, 119, 117, 5, 186, 53, 178, 0, 102, 144, 46, 126, 111, 122, 194, 248, 229, 117, 111, 119, 241, 30, 89, 173, 103, 138, 120, 141, 172, 67, 124, 76, 24, 116, 61, 197, 121, 173, 20, 1, 245, 143, 140, 53, 141, 50, 79, 131, 87, 214, 241, 234, 118, 111, 41, 211, 17, 66, 44, 202, 88, 156, 14, 49, 154, 243, 79, 217, 230, 242, 210, 203, 94, 214, 90, 238, 234, 8, 21, 173, 148, 3, 52, 129, 115, 243, 123, 215, 140, 209, 64, 30, 153, 241, 198, 84, 188, 248, 149, 52, 214, 206, 147, 198, 109, 161, 27, 162, 59, 135, 79, 81, 94, 205, 227, 13, 70, 202, 79, 130, 247, 182, 241, 222, 91, 180, 199, 76, 141, 68, 107, 40, 44, 78, 7, 24, 175, 158, 97, 226, 24, 254, 130, 159, 140, 30, 255, 0, 157, 0, 119, 95, 179, 204, 240, 89, 107, 218, 203, 93, 207, 29, 184, 107, 85, 0, 204, 193, 65, 249, 189, 235, 15, 227, 148, 137, 119, 241, 30, 89, 173, 157, 38, 139, 236, 177, 0, 209, 29, 195, 161, 238, 43, 8, 243, 64, 226, 128, 62, 131, 241, 134, 165, 103, 39, 193, 155, 235, 120, 239, 109, 154, 83, 166, 42, 132, 89, 65, 98, 112, 56, 197, 121, 175, 236, 243, 60, 54, 90, 246, 178, 215, 83, 199, 110, 26, 217, 0, 50, 176, 92, 252, 222, 245, 194, 224, 123, 254, 116, 189, 122, 208, 6, 239, 199, 41, 18, 239, 226, 68, 179, 91, 58, 79, 17, 181, 136, 6, 136, 238, 29, 15, 113, 94, 203, 227, 13, 74, 198, 79, 130, 247, 182, 233, 121, 110, 211, 29, 50, 53, 17, 172, 160, 177, 56, 28, 98, 190, 125, 233, 73, 143, 175, 231, 64, 29, 215, 236, 243, 60, 22, 90, 254, 178, 215, 115, 199, 110, 26, 217, 64, 51, 48, 92, 252, 222, 245, 135, 241, 198, 68, 187, 248, 143, 44, 214, 174, 179, 198, 109, 162, 27, 227, 59, 135, 79, 81, 88, 71, 158, 180, 116, 160, 15, 100, 248, 173, 123, 105, 113, 240, 102, 214, 222, 11, 184, 37, 152, 125, 151, 247, 105, 32, 45, 192, 231, 138, 95, 132, 215, 182, 150, 223, 6, 110, 224, 184, 187, 130, 41, 79, 218, 190, 71, 144, 6, 233, 233, 94, 51, 140, 31, 254, 189, 4, 103, 255, 0, 215, 64, 29, 215, 236, 241, 60, 54, 90, 246, 178, 215, 83, 199, 110, 26, 217, 0, 50, 176, 92, 252, 254, 245, 69, 166, 139, 254, 26, 75, 237, 126, 106, 125, 159, 251, 83, 119, 155, 159, 147, 27, 125, 107, 148, 235, 71, 108, 80, 7, 115, 251, 67, 207, 13, 238, 191, 163, 53, 172, 241, 220, 5, 181, 96, 76, 76, 27, 31, 55, 181, 117, 191, 21, 111, 109, 110, 62, 11, 218, 219, 193, 119, 4, 179, 15, 178, 252, 137, 32, 45, 192, 29, 171, 198, 71, 29, 63, 90, 76, 96, 247, 252, 232, 3, 217, 254, 20, 94, 218, 91, 124, 25, 186, 130, 226, 234, 8, 164, 63, 106, 249, 30, 64, 27, 145, 199, 21, 201, 126, 207, 51, 193, 101, 175, 107, 77, 119, 60, 118, 225, 173, 80, 3, 51, 5, 207, 205, 239, 92, 41, 25, 63, 253, 122, 94, 180, 1, 213, 249, 177, 255, 0, 195, 72, 253, 171, 204, 143, 236, 223, 218, 155, 188, 237, 223, 38, 49, 215, 61, 42, 255, 0, 237, 15, 60, 23, 186, 238, 138, 214, 179, 199, 112, 22, 217, 193, 49, 48, 108, 124, 222, 213, 194, 246, 197, 32, 24, 160, 15, 106, 248, 171, 60, 23, 63, 6, 45, 96, 130, 100, 150, 97, 246, 92, 162, 54, 91, 128, 51, 197, 31, 10, 46, 33, 180, 248, 51, 117, 4, 243, 36, 83, 31, 181, 126, 237, 219, 13, 200, 227, 138, 225, 160, 255, 0, 84, 159, 65, 79, 198, 104, 2, 207, 236, 242, 69, 150, 189, 172, 181, 209, 22, 225, 173, 80, 3, 55, 202, 15, 205, 239, 84, 176, 127, 225, 164, 254, 213, 255, 0, 46, 223, 218, 155, 188, 239, 224, 198, 222, 185, 233, 82, 30, 104, 237, 138, 0, 181, 251, 67, 145, 123, 175, 104, 173, 106, 68, 234, 182, 174, 9, 135, 230, 3, 230, 246, 171, 223, 27, 36, 91, 191, 1, 120, 82, 59, 118, 19, 72, 152, 220, 177, 157, 229, 127, 116, 58, 226, 177, 199, 20, 14, 40, 3, 107, 227, 100, 139, 121, 224, 79, 10, 199, 110, 226, 119, 76, 110, 88, 206, 226, 191, 186, 29, 64, 163, 227, 100, 139, 121, 224, 79, 10, 199, 110, 226, 119, 76, 110, 88, 206, 226, 191, 186, 29, 64, 172, 94, 148, 14, 40, 3, 107, 227, 100, 139, 121, 224, 79, 10, 199, 110, 226, 119, 76, 110, 88, 206, 226, 191, 186, 29, 64, 163, 227, 100, 139, 119, 224, 63, 10, 197, 108, 226, 102, 76, 110, 88, 142, 226, 191, 186, 29, 64, 172, 81, 197, 3, 138, 0, 218, 248, 215, 34, 221, 248, 11, 194, 177, 91, 184, 158, 68, 198, 229, 136, 238, 43, 251, 161, 212, 10, 62, 53, 200, 183, 126, 2, 240, 172, 86, 238, 39, 116, 198, 229, 136, 238, 43, 251, 161, 212, 10, 197, 233, 64, 226, 128, 54, 190, 53, 200, 183, 158, 2, 240, 172, 86, 238, 39, 116, 219, 185, 99, 59, 138, 254, 232, 117, 2, 143, 141, 146, 45, 231, 129, 60, 43, 29, 187, 137, 221, 49, 185, 99, 59, 138, 254, 232, 117, 2, 177, 71, 20, 14, 40, 3, 107, 227, 100, 139, 121, 224, 79, 10, 199, 110, 226, 119, 76, 110, 88, 206, 226, 191, 186, 29, 64, 163, 227, 100, 139, 121, 224, 79, 10, 199, 110, 226, 102, 76, 110, 88, 206, 226, 191, 186, 29, 64, 172, 81, 197, 3, 138, 0, 218, 248, 217, 34, 222, 120, 19, 194, 177, 91, 184, 157, 211, 27, 150, 35, 184, 175, 238, 135, 80, 40, 248, 214, 235, 119, 224, 31, 10, 197, 110, 226, 105, 19, 27, 150, 38, 220, 87, 247, 67, 168, 21, 138, 56, 160, 113, 64, 27, 95, 26, 228, 91, 191, 1, 120, 86, 43, 119, 19, 72, 155, 119, 44, 103, 113, 95, 221, 14, 160, 81, 241, 174, 69, 187, 240, 23, 133, 98, 183, 113, 60, 137, 141, 203, 17, 220, 87, 247, 67, 168, 21, 138, 56, 160, 113, 64, 29, 86, 190, 165, 254, 34, 124, 54, 153, 6, 98, 134, 217, 4, 174, 58, 39, 3, 169, 237, 75, 225, 241, 229, 252, 74, 248, 145, 51, 252, 177, 77, 106, 194, 54, 61, 31, 142, 199, 189, 73, 15, 250, 149, 250, 10, 147, 182, 40, 3, 139, 242, 38, 255, 0, 134, 109, 54, 190, 83, 125, 167, 251, 83, 119, 147, 143, 159, 25, 235, 142, 181, 213, 235, 227, 204, 248, 145, 240, 222, 101, 27, 162, 134, 217, 68, 140, 58, 39, 215, 210, 173, 119, 205, 37, 0, 87, 208, 70, 207, 137, 63, 18, 38, 110, 34, 150, 213, 132, 78, 120, 14, 113, 216, 247, 174, 79, 200, 155, 254, 25, 183, 236, 158, 92, 159, 104, 254, 211, 221, 228, 237, 249, 177, 187, 174, 58, 215, 105, 219, 20, 189, 243, 64, 21, 181, 241, 191, 226, 63, 195, 105, 151, 152, 161, 181, 81, 35, 14, 137, 199, 115, 218, 143, 15, 141, 159, 18, 126, 35, 202, 227, 108, 83, 90, 184, 137, 207, 1, 248, 236, 123, 213, 138, 59, 98, 128, 56, 175, 34, 111, 248, 102, 223, 178, 249, 79, 246, 143, 237, 76, 249, 59, 126, 108, 103, 174, 58, 215, 91, 226, 1, 191, 226, 63, 195, 121, 148, 22, 138, 27, 100, 18, 48, 232, 135, 220, 246, 171, 61, 243, 73, 64, 21, 244, 17, 229, 252, 73, 248, 145, 51, 241, 20, 214, 172, 35, 99, 209, 248, 236, 123, 215, 41, 246, 121, 191, 225, 155, 77, 175, 150, 223, 105, 254, 212, 221, 228, 227, 231, 198, 238, 184, 235, 93, 159, 108, 82, 247, 205, 0, 86, 215, 135, 153, 241, 31, 225, 180, 203, 150, 138, 43, 101, 18, 48, 232, 135, 29, 207, 106, 52, 0, 83, 226, 79, 196, 137, 155, 229, 138, 107, 86, 17, 185, 232, 252, 118, 61, 234, 197, 29, 168, 3, 139, 242, 38, 255, 0, 134, 110, 251, 39, 148, 255, 0, 104, 254, 212, 221, 228, 237, 249, 177, 158, 184, 235, 91, 186, 220, 111, 39, 252, 37, 123, 20, 183, 153, 225, 139, 56, 215, 3, 239, 48, 198, 64, 247, 173, 142, 249, 164, 160, 12, 141, 114, 54, 147, 254, 18, 189, 138, 91, 127, 134, 44, 227, 82, 7, 222, 97, 140, 129, 239, 237, 70, 185, 27, 73, 255, 0, 9, 94, 197, 45, 230, 120, 98, 206, 53, 32, 125, 230, 24, 200, 30, 254, 213, 175, 75, 64, 24, 250, 236, 109, 39, 252, 37, 123, 20, 182, 255, 0, 12, 217, 198, 164, 15, 188, 195, 25, 3, 223, 218, 147, 92, 86, 127, 248, 74, 246, 169, 62, 103, 134, 44, 227, 92, 15, 188, 195, 25, 3, 223, 218, 182, 41, 104, 3, 43, 90, 182, 184, 147, 254, 18, 173, 176, 202, 222, 103, 134, 44, 209, 112, 135, 230, 97, 140, 129, 239, 70, 185, 107, 113, 47, 252, 37, 123, 32, 148, 239, 240, 197, 156, 107, 133, 63, 51, 12, 100, 15, 83, 237, 94, 137, 23, 250, 152, 254, 130, 164, 205, 0, 121, 190, 185, 107, 113, 47, 252, 37, 123, 32, 148, 239, 240, 197, 156, 107, 133, 63, 51, 12, 100, 15, 83, 237, 75, 175, 90, 220, 73, 255, 0, 9, 94, 200, 101, 111, 51, 195, 54, 113, 169, 10, 126, 102, 24, 200, 30, 167, 218, 189, 31, 52, 102, 128, 60, 227, 93, 181, 184, 147, 254, 18, 176, 144, 202, 219, 252, 49, 103, 26, 144, 167, 230, 97, 140, 129, 234, 125, 168, 215, 109, 110, 36, 255, 0, 132, 175, 100, 18, 183, 153, 225, 155, 56, 212, 133, 63, 51, 12, 100, 15, 83, 237, 94, 143, 154, 51, 64, 30, 113, 174, 90, 220, 63, 252, 37, 123, 98, 148, 239, 240, 197, 156, 106, 66, 147, 185, 134, 50, 7, 191, 181, 38, 183, 107, 113, 39, 252, 37, 123, 32, 148, 239, 240, 197, 156, 106, 66, 159, 153, 134, 50, 7, 169, 246, 175, 72, 205, 25, 160, 15, 55, 215, 45, 110, 37, 255, 0, 132, 171, 100, 50, 157, 254, 24, 179, 141, 112, 167, 230, 97, 140, 129, 234, 125, 168, 215, 45, 110, 37, 255, 0, 132, 175, 100, 18, 157, 254, 24, 179, 141, 112, 167, 230, 97, 140, 129, 234, 125, 171, 210, 51, 69, 0, 121, 191, 217, 238, 56, 255, 0, 71, 155, 254, 249, 163, 236, 247, 31, 243, 239, 55, 95, 238, 215, 163, 209, 64, 30, 111, 246, 107, 142, 127, 209, 230, 255, 0, 190, 105, 126, 207, 113, 255, 0, 62, 243, 127, 223, 53, 232, 244, 80, 7, 156, 125, 154, 227, 254, 125, 230, 233, 253, 218, 62, 205, 113, 255, 0, 62, 243, 116, 254, 237, 122, 62, 104, 205, 0, 121, 191, 217, 174, 56, 255, 0, 71, 155, 254, 249, 163, 236, 215, 28, 127, 163, 205, 255, 0, 124, 215, 164, 102, 150, 128, 60, 223, 236, 215, 31, 243, 239, 55, 95, 238, 209, 246, 107, 143, 249, 247, 155, 175, 247, 107, 209, 232, 160, 15, 58, 251, 5, 247, 252, 248, 221, 127, 223, 6, 151, 236, 23, 220, 255, 0, 160, 220, 255, 0, 223, 179, 94, 233, 23, 250, 152, 254, 130, 159, 64, 30, 17, 246, 11, 255, 0, 249, 241, 185, 255, 0, 191, 116, 125, 134, 255, 0, 143, 244, 11, 159, 251, 224, 215, 187, 209, 64, 30, 15, 246, 27, 254, 63, 208, 46, 127, 239, 217, 175, 12, 255, 0, 132, 127, 89, 255, 0, 160, 69, 255, 0, 254, 3, 63, 248, 87, 221, 116, 102, 128, 62, 20, 255, 0, 132, 127, 89, 255, 0, 160, 69, 255, 0, 254, 3, 63, 248, 81, 255, 0, 8, 254, 179, 255, 0, 64, 139, 255, 0, 252, 6, 127, 240, 175, 186, 243, 70, 104, 3, 225, 79, 248, 71, 245, 159, 250, 4, 95, 255, 0, 224, 51, 255, 0, 133, 31, 240, 143, 235, 63, 244, 8, 191, 255, 0, 192, 103, 255, 0, 10, 251, 175, 52, 102, 128, 62, 20, 255, 0, 132, 127, 89, 255, 0, 160, 69, 255, 0, 254, 3, 63, 248, 81, 255, 0, 8, 254, 179, 255, 0, 64, 139, 255, 0, 252, 6, 127, 240, 175, 186, 243, 70, 104, 3, 225, 79, 248, 71, 245, 159, 250, 4, 95, 255, 0, 224, 51, 255, 0, 133, 31, 240, 143, 235, 63, 244, 8, 191, 255, 0, 192, 103, 255, 0, 10, 251, 175, 52, 102, 128, 62, 49, 240, 135, 130, 181, 77, 107, 197, 22, 86, 83, 233, 243, 69, 11, 56, 105, 13, 196, 101, 20, 168, 235, 201, 175, 127, 214, 252, 37, 123, 54, 179, 116, 246, 191, 101, 72, 55, 13, 138, 101, 3, 3, 28, 113, 86, 188, 105, 168, 188, 190, 37, 177, 176, 4, 121, 112, 201, 27, 240, 123, 147, 92, 239, 138, 255, 0, 228, 105, 212, 62, 102, 255, 0, 91, 235, 237, 64, 19, 255, 0, 194, 29, 171, 255, 0, 126, 211, 254, 255, 0, 10, 79, 248, 67, 181, 127, 239, 218, 127, 223, 225, 92, 254, 15, 247, 155, 243, 52, 96, 255, 0, 121, 191, 51, 64, 29, 7, 252, 33, 218, 191, 247, 237, 63, 239, 240, 163, 254, 16, 237, 95, 251, 246, 159, 247, 248, 87, 63, 131, 253, 230, 252, 205, 24, 63, 222, 111, 204, 208, 7, 65, 255, 0, 8, 118, 175, 253, 251, 79, 251, 252, 40, 255, 0, 132, 59, 87, 254, 253, 167, 253, 254, 21, 207, 224, 255, 0, 121, 191, 51, 70, 15, 247, 155, 243, 52, 1, 208, 127, 194, 29, 171, 255, 0, 126, 211, 254, 255, 0, 10, 63, 225, 14, 213, 255, 0, 191, 105, 255, 0, 127, 133, 115, 248, 63, 222, 111, 204, 209, 131, 253, 230, 252, 205, 0, 116, 246, 158, 16, 212, 227, 189, 130, 70, 107, 92, 9, 65, 56, 152, 122, 214, 87, 139, 191, 228, 105, 212, 191, 235, 175, 248, 85, 107, 16, 127, 180, 173, 190, 102, 255, 0, 90, 191, 196, 125, 106, 207, 139, 191, 228, 105, 212, 191, 235, 175, 248, 87, 185, 145, 127, 29, 250, 126, 168, 202, 166, 198, 53, 20, 81, 95, 82, 98, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 89, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 93, 142, 191, 225, 109, 70, 243, 92, 187, 185, 137, 237, 252, 185, 101, 200, 221, 40, 6, 184, 235, 31, 249, 8, 219, 127, 215, 85, 254, 117, 173, 226, 175, 249, 26, 117, 14, 91, 253, 111, 173, 124, 198, 125, 241, 83, 249, 154, 210, 44, 255, 0, 194, 29, 171, 127, 207, 75, 79, 251, 252, 40, 255, 0, 132, 59, 86, 255, 0, 158, 150, 159, 247, 248, 87, 61, 131, 234, 255, 0, 247, 209, 163, 7, 213, 255, 0, 239, 163, 94, 9, 177, 208, 255, 0, 194, 29, 171, 127, 207, 75, 79, 251, 252, 40, 255, 0, 132, 59, 86, 255, 0, 158, 150, 159, 247, 248, 87, 61, 131, 234, 255, 0, 247, 209, 163, 7, 213, 255, 0, 239, 163, 64, 29, 15, 252, 33, 218, 183, 252, 244, 180, 255, 0, 191, 194, 143, 248, 67, 181, 111, 249, 233, 105, 255, 0, 127, 133, 115, 216, 62, 175, 255, 0, 125, 26, 48, 125, 95, 254, 250, 52, 1, 208, 255, 0, 194, 29, 171, 127, 207, 75, 79, 251, 252, 40, 255, 0, 132, 59, 86, 255, 0, 158, 150, 159, 247, 248, 87, 61, 131, 234, 255, 0, 247, 209, 163, 7, 213, 255, 0, 239, 163, 64, 29, 61, 167, 132, 53, 56, 239, 96, 145, 154, 215, 2, 85, 39, 19, 15, 90, 185, 175, 248, 87, 80, 187, 215, 175, 46, 98, 123, 127, 46, 71, 200, 15, 32, 6, 185, 75, 16, 127, 180, 109, 190, 102, 255, 0, 90, 191, 196, 125, 107, 71, 197, 124, 248, 167, 80, 249, 155, 253, 111, 175, 176, 160, 11, 31, 240, 135, 106, 255, 0, 223, 180, 255, 0, 191, 194, 143, 248, 67, 181, 127, 239, 218, 127, 223, 225, 92, 246, 15, 247, 155, 254, 250, 52, 96, 255, 0, 121, 191, 239, 163, 64, 29, 15, 252, 33, 218, 191, 247, 237, 63, 239, 240, 163, 254, 16, 237, 95, 251, 246, 159, 247, 248, 87, 61, 131, 253, 230, 255, 0, 190, 141, 24, 63, 222, 111, 251, 232, 208, 7, 67, 255, 0, 8, 118, 175, 253, 251, 79, 251, 252, 40, 255, 0, 132, 59, 87, 254, 253, 167, 253, 254, 21, 207, 96, 255, 0, 121, 191, 239, 163, 70, 15, 247, 155, 254, 250, 52, 1, 208, 255, 0, 194, 29, 171, 255, 0, 126, 211, 254, 255, 0, 10, 63, 225, 14, 213, 255, 0, 191, 105, 255, 0, 127, 133, 115, 216, 63, 222, 111, 251, 232, 209, 131, 253, 230, 255, 0, 190, 141, 0, 116, 246, 190, 17, 212, 227, 189, 130, 70, 107, 92, 9, 65, 56, 152, 122, 213, 205, 127, 194, 186, 133, 222, 185, 119, 115, 19, 219, 249, 110, 249, 1, 165, 0, 244, 174, 82, 196, 31, 237, 27, 111, 153, 191, 214, 175, 241, 31, 90, 209, 241, 87, 252, 141, 58, 135, 45, 254, 183, 215, 218, 128, 44, 127, 194, 29, 171, 127, 207, 75, 79, 251, 252, 40, 255, 0, 132, 59, 86, 255, 0, 158, 150, 159, 247, 248, 87, 61, 131, 253, 230, 255, 0, 190, 141, 24, 63, 222, 111, 251, 232, 208, 7, 67, 255, 0, 8, 118, 175, 253, 251, 79, 251, 252, 40, 255, 0, 132, 59, 87, 254, 253, 167, 253, 254, 21, 207, 96, 255, 0, 121, 191, 239, 163, 70, 15, 247, 155, 254, 250, 52, 1, 208, 255, 0, 194, 29, 171, 255, 0, 126, 211, 254, 255, 0, 10, 63, 225, 14, 213, 255, 0, 191, 105, 255, 0, 127, 133, 115, 216, 63, 222, 111, 251, 232, 209, 131, 253, 230, 255, 0, 190, 141, 0, 116, 63, 240, 135, 106, 255, 0, 223, 180, 255, 0, 191, 194, 143, 248, 67, 181, 127, 239, 218, 127, 223, 225, 92, 246, 15, 247, 155, 254, 250, 52, 96, 255, 0, 121, 191, 239, 163, 64, 29, 53, 167, 131, 245, 56, 239, 97, 114, 214, 184, 87, 4, 226, 97, 235, 87, 117, 255, 0, 11, 106, 55, 154, 229, 221, 204, 79, 111, 229, 203, 46, 70, 233, 64, 53, 202, 88, 131, 253, 163, 109, 203, 127, 173, 95, 226, 62, 181, 163, 226, 175, 249, 26, 117, 15, 153, 191, 214, 250, 208, 5, 143, 248, 67, 181, 111, 249, 233, 105, 255, 0, 127, 133, 31, 240, 135, 106, 223, 243, 210, 211, 254, 255, 0, 10, 231, 112, 127, 188, 223, 247, 209, 163, 7, 251, 205, 255, 0, 125, 26, 0, 232, 191, 225, 14, 213, 255, 0, 191, 105, 255, 0, 127, 133, 31, 240, 135, 106, 255, 0, 223, 180, 255, 0, 191, 194, 185, 220, 31, 239, 55, 253, 244, 104, 193, 254, 243, 127, 223, 70, 128, 58, 31, 248, 67, 117, 127, 249, 233, 105, 255, 0, 127, 133, 31, 240, 134, 234, 255, 0, 243, 210, 211, 254, 255, 0, 10, 231, 240, 127, 188, 223, 247, 209, 163, 7, 251, 205, 255, 0, 125, 26, 0, 232, 127, 225, 14, 213, 255, 0, 191, 105, 255, 0, 127, 133, 31, 240, 135, 106, 255, 0, 223, 180, 255, 0, 191, 194, 185, 220, 31, 239, 55, 253, 244, 104, 193, 254, 243, 127, 223, 70, 128, 58, 139, 95, 8, 234, 145, 222, 193, 35, 53, 166, 4, 170, 78, 38, 30, 181, 161, 224, 189, 70, 198, 199, 197, 254, 58, 75, 187, 219, 123, 114, 218, 160, 32, 77, 32, 82, 126, 65, 207, 53, 200, 88, 131, 253, 163, 107, 243, 55, 250, 213, 254, 35, 235, 94, 87, 241, 83, 254, 74, 135, 136, 127, 235, 236, 255, 0, 33, 64, 31, 93, 255, 0, 194, 65, 163, 127, 208, 95, 79, 255, 0, 192, 149, 255, 0, 26, 63, 225, 32, 209, 191, 232, 47, 167, 255, 0, 224, 74, 255, 0, 141, 124, 43, 69, 0, 125, 213, 255, 0, 9, 6, 141, 255, 0, 65, 125, 63, 255, 0, 2, 87, 252, 105, 241, 235, 58, 92, 210, 44, 49, 106, 118, 114, 74, 231, 10, 137, 58, 177, 63, 134, 107, 225, 42, 235, 190, 22, 127, 201, 79, 240, 255, 0, 253, 125, 143, 228, 104, 3, 161, 248, 247, 255, 0, 37, 66, 127, 250, 245, 135, 249, 87, 152, 87, 167, 252, 123, 255, 0, 146, 161, 63, 253, 122, 195, 252, 171, 204, 40, 0, 162, 138, 40, 2, 254, 133, 255, 0, 35, 6, 155, 255, 0, 95, 81, 127, 232, 98, 190, 133, 241, 87, 252, 140, 250, 135, 253, 117, 175, 158, 180, 47, 249, 24, 52, 223, 250, 250, 139, 255, 0, 67, 21, 244, 47, 138, 191, 228, 103, 212, 63, 235, 173, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 140, 250, 135, 253, 118, 172, 251, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 25, 245, 15, 250, 237, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 87, 255, 0, 35, 78, 161, 255, 0, 93, 127, 165, 103, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 31, 21, 255, 0, 200, 211, 168, 127, 215, 95, 233, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 70, 161, 255, 0, 93, 127, 165, 103, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 209, 168, 127, 215, 95, 233, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 79, 101, 255, 0, 33, 43, 111, 250, 234, 191, 206, 161, 241, 151, 252, 141, 218, 159, 253, 118, 254, 130, 166, 178, 255, 0, 144, 149, 183, 253, 117, 95, 231, 80, 248, 203, 254, 70, 237, 79, 254, 187, 127, 65, 65, 236, 228, 191, 199, 126, 134, 21, 20, 81, 65, 244, 161, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 5, 157, 55, 254, 66, 182, 159, 245, 217, 127, 157, 117, 94, 42, 255, 0, 145, 167, 80, 255, 0, 174, 223, 210, 185, 93, 55, 254, 66, 182, 159, 245, 217, 127, 157, 117, 94, 42, 255, 0, 145, 167, 80, 255, 0, 174, 223, 210, 131, 231, 179, 205, 225, 243, 50, 40, 162, 138, 15, 8, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 172, 3, 226, 109, 72, 17, 144, 101, 193, 31, 133, 103, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 211, 168, 127, 215, 90, 0, 240, 31, 16, 105, 109, 164, 106, 210, 219, 227, 247, 103, 231, 140, 255, 0, 178, 107, 38, 189, 91, 198, 154, 43, 106, 218, 114, 79, 108, 155, 167, 183, 228, 123, 175, 113, 94, 83, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 29, 108, 63, 234, 163, 250, 10, 125, 50, 31, 245, 81, 253, 5, 62, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 59, 8, 191, 212, 71, 244, 21, 37, 71, 23, 250, 136, 254, 130, 164, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 14, 186, 47, 245, 49, 253, 5, 73, 81, 197, 254, 166, 63, 160, 169, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 3, 176, 139, 253, 76, 127, 65, 79, 166, 69, 254, 166, 63, 160, 167, 208, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 7, 97, 23, 250, 152, 254, 130, 159, 76, 139, 253, 76, 127, 65, 79, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 169, 234, 90, 132, 90, 102, 159, 53, 220, 167, 11, 26, 231, 30, 167, 176, 171, 149, 231, 31, 16, 53, 229, 184, 149, 116, 171, 118, 202, 198, 119, 76, 71, 175, 97, 64, 28, 170, 221, 203, 123, 174, 199, 115, 49, 204, 146, 78, 9, 252, 234, 207, 138, 191, 228, 105, 212, 63, 235, 173, 103, 88, 255, 0, 199, 253, 175, 253, 118, 95, 231, 90, 62, 42, 255, 0, 145, 167, 80, 255, 0, 174, 180, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 246, 31, 242, 17, 181, 255, 0, 174, 171, 252, 234, 207, 139, 191, 228, 105, 212, 191, 235, 175, 248, 85, 107, 15, 249, 8, 218, 255, 0, 215, 85, 254, 117, 103, 197, 223, 242, 52, 234, 95, 245, 215, 252, 43, 220, 200, 191, 142, 253, 63, 84, 69, 77, 140, 106, 40, 162, 190, 164, 231, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 44, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 127, 21, 127, 200, 211, 127, 255, 0, 93, 107, 34, 199, 254, 66, 54, 223, 245, 213, 127, 157, 107, 248, 171, 254, 70, 155, 255, 0, 250, 235, 95, 49, 159, 124, 84, 254, 102, 180, 140, 138, 40, 162, 188, 19, 96, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 235, 254, 21, 157, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 127, 194, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 199, 254, 66, 54, 191, 245, 217, 127, 157, 104, 248, 171, 254, 70, 141, 67, 254, 186, 255, 0, 74, 206, 177, 255, 0, 144, 141, 175, 253, 118, 95, 231, 90, 62, 42, 255, 0, 145, 163, 80, 255, 0, 174, 191, 210, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 54, 223, 245, 213, 127, 157, 104, 120, 171, 254, 70, 157, 67, 254, 186, 214, 125, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 141, 58, 135, 253, 117, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 94, 87, 241, 79, 254, 74, 127, 136, 63, 235, 236, 255, 0, 33, 94, 169, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 188, 175, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 128, 57, 10, 40, 162, 128, 10, 235, 190, 22, 127, 201, 79, 240, 255, 0, 253, 125, 143, 228, 107, 145, 174, 187, 225, 103, 252, 148, 255, 0, 15, 255, 0, 215, 216, 254, 70, 128, 58, 31, 143, 127, 242, 84, 39, 255, 0, 175, 88, 127, 149, 121, 133, 122, 127, 199, 191, 249, 42, 19, 255, 0, 215, 172, 63, 202, 188, 194, 128, 10, 40, 162, 128, 47, 232, 95, 242, 48, 105, 191, 245, 245, 23, 254, 134, 43, 232, 95, 21, 127, 200, 211, 168, 127, 215, 95, 232, 43, 231, 173, 11, 254, 70, 13, 55, 254, 190, 162, 255, 0, 208, 197, 125, 11, 226, 175, 249, 26, 117, 15, 250, 235, 253, 5, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 208, 241, 87, 252, 141, 23, 255, 0, 245, 214, 179, 236, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 104, 191, 255, 0, 174, 180, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 52, 115, 211, 159, 165, 74, 176, 204, 221, 33, 144, 253, 22, 128, 31, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 87, 255, 0, 35, 78, 161, 255, 0, 93, 127, 165, 87, 177, 180, 185, 254, 208, 183, 63, 101, 159, 30, 106, 255, 0, 1, 245, 171, 222, 40, 182, 185, 147, 196, 183, 204, 182, 211, 16, 101, 224, 132, 56, 52, 1, 133, 69, 57, 173, 238, 23, 172, 18, 15, 170, 211, 15, 201, 215, 143, 173, 0, 45, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 209, 168, 127, 215, 95, 233, 89, 214, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 52, 106, 31, 245, 215, 250, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 74, 219, 254, 186, 175, 243, 168, 124, 101, 255, 0, 35, 118, 167, 255, 0, 93, 191, 160, 169, 172, 127, 228, 37, 109, 255, 0, 93, 87, 249, 212, 62, 50, 255, 0, 145, 187, 83, 255, 0, 174, 223, 208, 80, 123, 57, 47, 241, 223, 161, 133, 69, 20, 80, 125, 40, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 103, 77, 255, 0, 144, 173, 167, 253, 118, 95, 231, 93, 87, 138, 191, 228, 105, 212, 63, 235, 183, 244, 174, 87, 77, 255, 0, 144, 173, 167, 253, 118, 95, 231, 93, 87, 138, 191, 228, 105, 212, 63, 235, 183, 244, 160, 249, 236, 243, 120, 124, 204, 138, 40, 162, 131, 194, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 176, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 167, 80, 255, 0, 174, 181, 157, 97, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 104, 3, 34, 188, 131, 197, 154, 73, 210, 181, 169, 2, 140, 67, 47, 207, 31, 248, 87, 175, 215, 63, 226, 205, 16, 106, 250, 75, 149, 31, 233, 16, 101, 163, 247, 246, 160, 15, 34, 162, 142, 135, 154, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 3, 173, 135, 253, 84, 127, 65, 79, 166, 67, 254, 170, 63, 160, 167, 208, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 7, 97, 23, 250, 136, 254, 130, 164, 168, 226, 255, 0, 81, 31, 208, 84, 148, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 215, 69, 254, 166, 63, 160, 169, 42, 56, 191, 212, 199, 244, 21, 37, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 118, 17, 127, 169, 143, 232, 41, 244, 200, 191, 212, 199, 244, 20, 250, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 236, 34, 255, 0, 83, 31, 208, 83, 233, 145, 127, 169, 143, 232, 41, 244, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 155, 174, 106, 137, 164, 233, 83, 221, 55, 85, 24, 81, 234, 107, 197, 36, 150, 73, 230, 121, 101, 57, 103, 57, 38, 186, 191, 29, 107, 159, 110, 191, 254, 206, 136, 254, 226, 220, 242, 71, 241, 53, 114, 84, 1, 53, 143, 252, 127, 218, 255, 0, 215, 101, 254, 117, 163, 226, 175, 249, 26, 117, 15, 250, 235, 89, 214, 63, 241, 255, 0, 107, 255, 0, 93, 151, 249, 214, 143, 138, 191, 228, 105, 212, 63, 235, 173, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 135, 252, 132, 109, 127, 235, 170, 255, 0, 58, 179, 226, 239, 249, 26, 117, 47, 250, 235, 254, 21, 90, 195, 254, 66, 54, 191, 245, 213, 127, 157, 89, 241, 119, 252, 141, 58, 151, 253, 117, 255, 0, 10, 247, 50, 47, 227, 191, 79, 213, 17, 83, 99, 26, 138, 40, 175, 169, 57, 194, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 11, 54, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 95, 197, 95, 242, 52, 223, 255, 0, 215, 90, 200, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 254, 42, 255, 0, 145, 166, 255, 0, 254, 186, 215, 204, 103, 223, 21, 63, 153, 173, 35, 34, 138, 40, 175, 4, 216, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 186, 255, 0, 133, 103, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 207, 168, 127, 215, 95, 240, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 41, 163, 158, 156, 253, 42, 85, 134, 102, 233, 12, 135, 232, 180, 0, 251, 31, 249, 8, 218, 255, 0, 215, 101, 254, 117, 163, 226, 175, 249, 26, 53, 15, 250, 235, 253, 42, 189, 141, 165, 207, 246, 140, 7, 236, 179, 99, 205, 94, 124, 179, 235, 87, 188, 79, 109, 115, 39, 137, 111, 221, 109, 166, 32, 203, 193, 8, 112, 104, 3, 10, 138, 115, 91, 220, 47, 91, 121, 7, 213, 105, 135, 228, 235, 199, 214, 128, 22, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 35, 109, 255, 0, 93, 151, 249, 214, 135, 138, 191, 228, 105, 212, 63, 235, 173, 103, 216, 255, 0, 200, 70, 219, 254, 187, 47, 243, 173, 15, 21, 127, 200, 211, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 229, 127, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 21, 234, 150, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 202, 254, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 40, 3, 144, 162, 138, 40, 0, 174, 187, 225, 103, 252, 148, 255, 0, 15, 255, 0, 215, 216, 254, 70, 185, 26, 235, 190, 22, 127, 201, 79, 240, 255, 0, 253, 125, 143, 228, 104, 3, 161, 248, 247, 255, 0, 37, 66, 127, 250, 245, 135, 249, 87, 152, 87, 167, 252, 123, 255, 0, 146, 161, 63, 253, 122, 195, 252, 171, 204, 40, 0, 162, 138, 40, 2, 254, 133, 255, 0, 35, 6, 155, 255, 0, 95, 81, 127, 232, 98, 190, 133, 241, 87, 252, 141, 58, 135, 253, 117, 254, 130, 190, 122, 208, 191, 228, 96, 211, 127, 235, 234, 47, 253, 12, 87, 208, 190, 42, 255, 0, 145, 167, 80, 255, 0, 174, 191, 208, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 209, 127, 255, 0, 93, 107, 62, 199, 254, 66, 54, 223, 245, 213, 127, 157, 104, 120, 171, 254, 70, 139, 255, 0, 250, 235, 64, 25, 20, 83, 106, 213, 149, 141, 205, 252, 190, 85, 172, 76, 236, 125, 7, 20, 1, 94, 166, 183, 183, 184, 185, 97, 246, 120, 26, 67, 254, 200, 205, 119, 90, 63, 195, 236, 98, 93, 78, 78, 71, 62, 82, 114, 13, 118, 182, 122, 117, 150, 158, 155, 45, 109, 227, 136, 123, 10, 0, 243, 29, 63, 192, 122, 181, 206, 30, 93, 176, 198, 125, 79, 53, 210, 218, 124, 59, 176, 139, 13, 60, 242, 72, 125, 49, 197, 118, 116, 80, 6, 69, 191, 134, 116, 107, 113, 242, 88, 69, 159, 83, 87, 146, 194, 210, 31, 185, 111, 24, 252, 42, 205, 20, 0, 128, 1, 209, 64, 250, 10, 8, 7, 168, 7, 235, 75, 69, 0, 66, 214, 86, 210, 253, 248, 35, 63, 133, 81, 151, 195, 154, 60, 255, 0, 126, 194, 35, 248, 86, 165, 20, 1, 200, 94, 124, 62, 211, 174, 27, 48, 200, 240, 251, 10, 231, 111, 126, 31, 106, 80, 18, 109, 153, 38, 65, 234, 112, 107, 212, 104, 160, 15, 8, 186, 177, 186, 178, 37, 103, 130, 68, 3, 185, 94, 42, 173, 123, 221, 205, 172, 23, 145, 24, 238, 33, 89, 19, 209, 171, 143, 213, 254, 31, 91, 205, 186, 93, 57, 252, 169, 58, 136, 143, 221, 160, 15, 54, 162, 174, 234, 26, 85, 246, 149, 43, 37, 212, 4, 16, 122, 142, 159, 157, 80, 160, 11, 22, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 52, 106, 31, 245, 215, 250, 86, 117, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 26, 135, 253, 117, 254, 148, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 246, 63, 242, 18, 182, 255, 0, 174, 171, 252, 234, 31, 25, 127, 200, 221, 169, 255, 0, 215, 111, 232, 42, 107, 31, 249, 9, 91, 127, 215, 85, 254, 117, 15, 140, 191, 228, 110, 212, 255, 0, 235, 183, 244, 20, 30, 206, 75, 252, 119, 232, 97, 81, 69, 20, 31, 74, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 89, 211, 127, 228, 43, 105, 255, 0, 93, 151, 249, 215, 85, 226, 175, 249, 26, 117, 15, 250, 237, 253, 43, 149, 211, 127, 228, 43, 105, 255, 0, 93, 151, 249, 215, 85, 226, 175, 249, 26, 117, 15, 250, 237, 253, 40, 62, 123, 60, 222, 31, 51, 34, 138, 40, 160, 240, 130, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 105, 212, 63, 235, 173, 103, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 211, 168, 127, 215, 90, 0, 200, 162, 138, 40, 3, 203, 60, 109, 161, 255, 0, 103, 106, 127, 105, 130, 61, 182, 211, 243, 199, 69, 61, 235, 149, 175, 111, 213, 244, 244, 213, 244, 185, 172, 159, 248, 198, 84, 250, 30, 213, 226, 183, 54, 242, 90, 92, 60, 19, 41, 89, 16, 224, 130, 40, 2, 42, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 58, 216, 127, 213, 71, 244, 20, 250, 100, 63, 234, 163, 250, 10, 125, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 118, 17, 127, 168, 143, 232, 42, 74, 142, 47, 245, 17, 253, 5, 73, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 29, 116, 95, 234, 99, 250, 10, 146, 163, 139, 253, 76, 127, 65, 82, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 7, 97, 23, 250, 152, 254, 130, 159, 76, 139, 253, 76, 127, 65, 79, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 14, 194, 47, 245, 49, 253, 5, 62, 153, 23, 250, 152, 254, 130, 159, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 97, 120, 163, 90, 93, 31, 74, 119, 86, 2, 119, 226, 33, 223, 62, 181, 181, 36, 139, 26, 23, 114, 21, 20, 100, 147, 218, 188, 119, 197, 58, 193, 214, 53, 151, 148, 127, 169, 143, 247, 104, 61, 189, 104, 3, 26, 70, 50, 54, 230, 229, 216, 228, 154, 74, 40, 160, 9, 172, 127, 227, 254, 215, 254, 187, 47, 243, 173, 31, 21, 127, 200, 211, 168, 127, 215, 90, 206, 177, 255, 0, 143, 251, 95, 250, 236, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 63, 228, 35, 107, 255, 0, 93, 87, 249, 213, 159, 23, 127, 200, 211, 169, 127, 215, 95, 240, 170, 214, 31, 242, 17, 181, 255, 0, 174, 171, 252, 234, 207, 139, 191, 228, 105, 212, 191, 235, 175, 248, 87, 185, 145, 127, 29, 250, 126, 168, 138, 155, 24, 212, 81, 69, 125, 73, 206, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 89, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 254, 42, 255, 0, 145, 166, 255, 0, 254, 186, 214, 69, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 215, 241, 87, 252, 141, 55, 255, 0, 245, 214, 190, 99, 62, 248, 169, 252, 205, 105, 25, 20, 81, 69, 120, 38, 193, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 215, 252, 43, 58, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 186, 255, 0, 133, 0, 100, 81, 77, 171, 86, 86, 55, 58, 132, 190, 85, 172, 76, 238, 125, 7, 20, 1, 94, 166, 183, 182, 184, 185, 35, 236, 240, 52, 159, 65, 93, 214, 143, 240, 251, 27, 37, 212, 229, 249, 135, 62, 82, 242, 13, 118, 182, 122, 117, 150, 158, 155, 45, 109, 210, 33, 236, 40, 3, 204, 108, 60, 7, 171, 92, 225, 229, 9, 12, 103, 212, 243, 93, 45, 159, 195, 221, 62, 44, 25, 231, 146, 95, 106, 236, 232, 160, 12, 136, 60, 51, 163, 64, 62, 75, 8, 179, 234, 106, 252, 118, 22, 144, 253, 203, 120, 215, 240, 171, 20, 80, 2, 0, 7, 69, 3, 232, 40, 56, 61, 64, 63, 90, 90, 40, 2, 22, 178, 182, 151, 239, 193, 25, 252, 42, 140, 190, 28, 209, 231, 251, 246, 17, 31, 194, 181, 40, 160, 14, 70, 243, 225, 246, 155, 57, 204, 50, 60, 63, 74, 231, 47, 126, 30, 234, 86, 228, 155, 87, 142, 100, 30, 167, 6, 189, 70, 138, 0, 240, 139, 155, 27, 171, 44, 172, 240, 72, 158, 251, 120, 170, 245, 239, 55, 22, 144, 93, 197, 229, 220, 66, 178, 39, 161, 21, 199, 235, 62, 0, 183, 159, 116, 186, 115, 121, 82, 245, 17, 31, 187, 64, 30, 109, 69, 93, 212, 116, 171, 237, 42, 86, 75, 184, 8, 35, 184, 233, 249, 213, 10, 0, 179, 99, 255, 0, 33, 27, 111, 250, 236, 191, 206, 180, 60, 85, 255, 0, 35, 78, 161, 255, 0, 93, 107, 62, 199, 254, 66, 54, 223, 245, 213, 127, 152, 173, 15, 21, 127, 200, 211, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 229, 127, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 21, 234, 150, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 202, 254, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 40, 3, 144, 162, 138, 40, 0, 174, 187, 225, 103, 252, 148, 255, 0, 15, 255, 0, 215, 216, 254, 70, 185, 26, 235, 190, 22, 127, 201, 79, 240, 255, 0, 253, 125, 143, 228, 104, 3, 161, 248, 247, 255, 0, 37, 66, 127, 250, 245, 135, 249, 87, 152, 87, 167, 252, 123, 255, 0, 146, 161, 63, 253, 122, 195, 252, 171, 204, 40, 0, 162, 138, 40, 2, 254, 133, 255, 0, 35, 6, 155, 255, 0, 95, 81, 127, 232, 98, 190, 133, 241, 87, 252, 141, 58, 135, 253, 117, 254, 130, 190, 122, 208, 191, 228, 96, 211, 127, 235, 234, 47, 253, 12, 87, 208, 190, 42, 255, 0, 145, 167, 80, 255, 0, 174, 191, 208, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 209, 127, 255, 0, 93, 106, 134, 158, 11, 106, 118, 160, 12, 159, 53, 120, 31, 90, 245, 24, 60, 39, 3, 235, 215, 90, 165, 224, 18, 111, 124, 198, 157, 177, 235, 64, 28, 126, 129, 224, 155, 173, 83, 19, 93, 131, 5, 177, 245, 251, 198, 189, 38, 195, 76, 181, 211, 32, 242, 236, 224, 72, 253, 72, 239, 87, 104, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 10, 247, 118, 118, 247, 208, 24, 110, 97, 89, 35, 61, 141, 121, 223, 136, 188, 9, 45, 174, 235, 141, 55, 50, 69, 213, 144, 245, 95, 165, 122, 101, 20, 1, 225, 22, 104, 209, 106, 150, 234, 195, 107, 137, 151, 32, 253, 106, 255, 0, 138, 191, 228, 104, 212, 63, 235, 175, 244, 175, 66, 214, 252, 37, 111, 127, 115, 29, 237, 170, 136, 238, 82, 64, 196, 118, 110, 121, 175, 63, 241, 88, 35, 197, 23, 249, 29, 101, 200, 160, 12, 106, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 178, 255, 0, 144, 149, 183, 253, 117, 95, 231, 80, 248, 203, 254, 70, 237, 79, 254, 187, 127, 65, 82, 217, 127, 200, 74, 219, 254, 186, 175, 243, 168, 188, 101, 255, 0, 35, 118, 167, 255, 0, 93, 191, 160, 160, 246, 114, 95, 227, 191, 67, 10, 138, 40, 160, 250, 80, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 214, 155, 255, 0, 33, 107, 79, 250, 236, 191, 206, 186, 159, 21, 127, 200, 211, 168, 127, 215, 111, 233, 92, 182, 155, 255, 0, 33, 107, 79, 250, 236, 191, 206, 186, 159, 21, 127, 200, 211, 168, 127, 215, 111, 233, 65, 243, 217, 230, 240, 249, 153, 20, 81, 69, 7, 132, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 127, 160, 172, 251, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 161, 226, 175, 249, 26, 117, 15, 250, 235, 253, 5, 0, 100, 81, 69, 20, 0, 87, 11, 227, 253, 24, 206, 145, 234, 144, 46, 100, 95, 146, 80, 7, 81, 216, 215, 117, 77, 101, 5, 92, 48, 202, 17, 130, 61, 168, 3, 193, 40, 173, 191, 18, 232, 114, 104, 186, 129, 27, 127, 209, 229, 36, 194, 125, 171, 18, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 58, 216, 127, 213, 71, 244, 20, 250, 100, 63, 234, 163, 250, 10, 125, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 118, 17, 127, 168, 143, 232, 42, 74, 142, 47, 245, 17, 253, 5, 73, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 29, 116, 95, 234, 99, 250, 10, 146, 163, 139, 253, 76, 127, 65, 82, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 7, 97, 23, 250, 152, 254, 130, 159, 76, 139, 253, 76, 127, 65, 79, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 14, 194, 47, 245, 49, 253, 5, 62, 153, 23, 250, 152, 254, 130, 159, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 86, 110, 179, 170, 219, 232, 246, 6, 234, 227, 232, 163, 213, 187, 80, 7, 51, 227, 221, 115, 200, 179, 254, 204, 129, 243, 36, 223, 235, 72, 61, 23, 210, 188, 226, 166, 187, 184, 150, 246, 242, 91, 169, 206, 101, 144, 228, 212, 52, 0, 81, 69, 20, 1, 53, 143, 252, 127, 218, 255, 0, 215, 101, 254, 117, 163, 226, 175, 249, 26, 117, 15, 250, 235, 89, 214, 63, 241, 255, 0, 107, 255, 0, 93, 151, 249, 214, 143, 138, 191, 228, 105, 212, 63, 235, 173, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 135, 252, 132, 109, 127, 235, 170, 255, 0, 58, 179, 226, 239, 249, 26, 117, 47, 250, 235, 254, 21, 90, 195, 254, 66, 54, 191, 245, 213, 127, 157, 89, 241, 119, 252, 141, 58, 151, 253, 117, 255, 0, 10, 247, 50, 47, 227, 191, 79, 213, 25, 84, 216, 198, 162, 138, 43, 234, 76, 66, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 11, 54, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 95, 197, 95, 242, 52, 234, 31, 245, 214, 178, 44, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 191, 138, 191, 228, 105, 212, 63, 235, 173, 124, 198, 125, 241, 83, 249, 154, 210, 50, 40, 162, 138, 240, 77, 130, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 105, 212, 7, 253, 54, 255, 0, 10, 161, 96, 9, 212, 109, 64, 25, 62, 114, 240, 62, 181, 234, 80, 248, 78, 222, 77, 122, 235, 84, 188, 2, 77, 239, 148, 67, 211, 30, 180, 1, 199, 104, 30, 10, 185, 212, 241, 53, 216, 48, 91, 31, 95, 188, 127, 10, 244, 155, 13, 50, 215, 76, 131, 203, 180, 129, 35, 245, 35, 189, 93, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 43, 221, 217, 219, 223, 64, 97, 185, 133, 100, 140, 255, 0, 9, 175, 59, 241, 23, 129, 37, 182, 15, 115, 166, 230, 72, 250, 180, 103, 170, 253, 43, 211, 40, 160, 15, 10, 179, 141, 163, 212, 173, 209, 198, 214, 89, 151, 32, 246, 230, 174, 248, 171, 254, 70, 157, 67, 254, 186, 215, 160, 235, 158, 18, 130, 254, 230, 59, 235, 85, 17, 220, 171, 134, 35, 179, 243, 222, 184, 15, 21, 130, 60, 81, 127, 145, 214, 92, 138, 0, 198, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 229, 127, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 21, 234, 150, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 202, 254, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 40, 3, 144, 162, 138, 40, 0, 174, 187, 225, 103, 252, 148, 255, 0, 15, 255, 0, 215, 216, 254, 70, 185, 26, 235, 190, 22, 127, 201, 79, 240, 255, 0, 253, 125, 143, 228, 104, 3, 169, 248, 233, 167, 222, 221, 124, 75, 158, 88, 109, 39, 146, 63, 179, 66, 55, 36, 100, 142, 149, 230, 191, 216, 250, 151, 253, 3, 174, 255, 0, 239, 195, 127, 133, 125, 220, 99, 83, 213, 84, 253, 69, 51, 202, 143, 251, 145, 255, 0, 223, 52, 1, 240, 167, 246, 62, 165, 255, 0, 64, 235, 191, 251, 240, 223, 225, 71, 246, 62, 165, 255, 0, 64, 235, 191, 251, 240, 223, 225, 95, 117, 249, 81, 255, 0, 114, 63, 251, 230, 143, 41, 63, 231, 154, 127, 223, 52, 1, 241, 6, 147, 167, 222, 91, 235, 154, 116, 179, 218, 79, 20, 127, 106, 139, 230, 120, 136, 31, 120, 122, 215, 208, 62, 38, 177, 190, 151, 196, 247, 237, 21, 157, 195, 161, 151, 32, 170, 18, 13, 116, 95, 23, 81, 71, 132, 109, 8, 85, 31, 241, 53, 180, 237, 255, 0, 77, 5, 101, 120, 143, 95, 214, 45, 117, 251, 232, 109, 245, 9, 98, 141, 101, 33, 16, 118, 226, 128, 57, 223, 236, 237, 71, 254, 129, 247, 95, 247, 232, 209, 253, 155, 168, 255, 0, 208, 58, 235, 254, 253, 26, 189, 255, 0, 9, 86, 191, 255, 0, 65, 89, 191, 74, 63, 225, 42, 215, 255, 0, 232, 43, 55, 233, 64, 20, 127, 179, 117, 31, 250, 7, 93, 127, 223, 163, 71, 246, 110, 163, 255, 0, 64, 235, 175, 251, 244, 106, 247, 252, 37, 90, 255, 0, 253, 5, 102, 253, 40, 255, 0, 132, 171, 95, 255, 0, 160, 172, 223, 165, 0, 81, 254, 205, 212, 127, 232, 29, 117, 255, 0, 126, 141, 31, 217, 186, 143, 253, 3, 174, 191, 239, 209, 171, 223, 240, 149, 107, 223, 244, 21, 155, 244, 163, 254, 18, 173, 123, 254, 130, 179, 126, 148, 1, 71, 251, 55, 81, 255, 0, 160, 117, 215, 253, 250, 52, 159, 217, 250, 128, 235, 167, 221, 127, 223, 163, 87, 255, 0, 225, 42, 215, 191, 232, 43, 55, 233, 93, 255, 0, 131, 147, 88, 154, 15, 183, 106, 151, 146, 184, 113, 251, 184, 159, 211, 214, 128, 43, 120, 79, 194, 177, 105, 112, 141, 71, 80, 11, 246, 156, 110, 0, 244, 140, 122, 215, 69, 253, 191, 163, 127, 208, 98, 195, 255, 0, 2, 23, 252, 105, 117, 223, 249, 23, 181, 47, 250, 245, 151, 255, 0, 65, 53, 240, 157, 0, 125, 215, 253, 191, 163, 127, 208, 98, 195, 255, 0, 2, 23, 252, 104, 254, 223, 209, 191, 232, 49, 97, 255, 0, 129, 11, 254, 53, 240, 165, 20, 1, 247, 95, 246, 254, 141, 255, 0, 65, 139, 15, 252, 8, 95, 241, 163, 251, 127, 70, 255, 0, 160, 197, 135, 254, 4, 47, 248, 215, 194, 148, 80, 7, 221, 127, 219, 250, 55, 253, 6, 44, 63, 240, 33, 127, 198, 143, 237, 253, 27, 254, 131, 22, 31, 248, 16, 191, 227, 95, 10, 81, 64, 31, 117, 255, 0, 111, 232, 223, 244, 24, 176, 255, 0, 192, 133, 255, 0, 26, 63, 183, 244, 111, 250, 12, 88, 127, 224, 66, 255, 0, 141, 124, 41, 69, 0, 125, 214, 186, 238, 142, 89, 66, 234, 214, 36, 158, 0, 23, 11, 207, 235, 75, 38, 179, 165, 193, 43, 67, 46, 167, 103, 28, 170, 112, 200, 243, 168, 35, 240, 205, 124, 69, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 174, 131, 226, 167, 252, 148, 255, 0, 16, 255, 0, 215, 217, 254, 66, 128, 62, 188, 254, 223, 209, 191, 232, 47, 97, 255, 0, 129, 11, 254, 52, 127, 111, 232, 223, 244, 23, 176, 255, 0, 192, 133, 255, 0, 26, 248, 82, 138, 0, 251, 175, 254, 18, 13, 27, 254, 131, 22, 31, 248, 16, 159, 227, 71, 252, 36, 26, 55, 253, 6, 44, 63, 240, 33, 63, 198, 190, 20, 162, 128, 62, 235, 254, 223, 209, 191, 232, 47, 97, 255, 0, 129, 11, 254, 52, 127, 111, 232, 223, 244, 23, 176, 255, 0, 192, 133, 255, 0, 26, 248, 82, 138, 0, 251, 175, 254, 18, 13, 27, 254, 131, 22, 31, 248, 16, 159, 227, 71, 252, 36, 26, 55, 253, 6, 44, 63, 240, 33, 63, 198, 190, 20, 162, 128, 62, 234, 254, 223, 209, 255, 0, 232, 49, 167, 255, 0, 224, 66, 255, 0, 141, 100, 248, 135, 195, 246, 190, 35, 211, 214, 234, 205, 209, 174, 2, 230, 57, 80, 228, 56, 244, 205, 124, 87, 95, 102, 124, 43, 255, 0, 146, 97, 225, 255, 0, 250, 244, 31, 204, 208, 7, 157, 29, 51, 80, 141, 138, 29, 62, 228, 237, 56, 56, 67, 76, 254, 205, 212, 63, 232, 31, 117, 255, 0, 126, 141, 122, 223, 137, 173, 245, 57, 108, 60, 237, 46, 234, 72, 102, 143, 157, 137, 252, 66, 188, 207, 254, 18, 109, 126, 63, 148, 234, 83, 2, 56, 35, 210, 128, 41, 127, 102, 234, 63, 244, 14, 187, 255, 0, 191, 70, 143, 236, 221, 71, 254, 129, 215, 127, 247, 232, 213, 223, 248, 74, 181, 239, 250, 10, 205, 71, 252, 37, 90, 247, 253, 5, 102, 160, 10, 95, 217, 186, 143, 253, 3, 174, 255, 0, 239, 209, 163, 251, 55, 81, 255, 0, 160, 117, 223, 253, 250, 53, 119, 254, 18, 157, 123, 254, 130, 179, 81, 255, 0, 9, 78, 189, 255, 0, 65, 89, 168, 2, 151, 246, 110, 163, 255, 0, 64, 235, 191, 251, 244, 104, 254, 205, 212, 127, 232, 29, 119, 255, 0, 126, 141, 93, 255, 0, 132, 167, 94, 255, 0, 160, 172, 212, 127, 194, 83, 175, 127, 208, 86, 106, 0, 134, 203, 79, 191, 26, 132, 4, 233, 247, 95, 235, 87, 172, 71, 214, 168, 120, 203, 254, 70, 237, 79, 254, 187, 127, 65, 91, 150, 158, 38, 214, 222, 254, 4, 125, 74, 82, 166, 85, 4, 122, 140, 214, 31, 140, 191, 228, 110, 212, 255, 0, 235, 183, 244, 20, 30, 206, 75, 252, 119, 232, 97, 81, 69, 20, 31, 74, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 90, 211, 63, 228, 41, 105, 255, 0, 93, 151, 249, 215, 99, 226, 107, 27, 233, 188, 77, 126, 241, 88, 220, 178, 25, 114, 25, 99, 36, 30, 43, 133, 12, 99, 96, 232, 112, 202, 114, 13, 117, 99, 197, 58, 254, 209, 255, 0, 19, 89, 186, 123, 87, 30, 47, 22, 176, 201, 55, 212, 242, 115, 44, 28, 171, 184, 181, 208, 131, 251, 55, 81, 255, 0, 160, 117, 223, 253, 250, 52, 127, 102, 234, 63, 244, 14, 187, 255, 0, 191, 70, 172, 127, 194, 83, 175, 127, 208, 74, 95, 200, 81, 255, 0, 9, 78, 189, 255, 0, 65, 41, 127, 33, 92, 63, 219, 20, 251, 30, 95, 246, 85, 78, 229, 127, 236, 221, 71, 254, 129, 215, 127, 247, 232, 209, 253, 155, 168, 255, 0, 208, 58, 239, 254, 253, 26, 177, 255, 0, 9, 78, 189, 255, 0, 65, 41, 127, 33, 71, 252, 37, 58, 247, 253, 4, 165, 252, 133, 31, 219, 20, 251, 7, 246, 85, 78, 229, 127, 236, 221, 71, 254, 129, 215, 127, 247, 232, 209, 253, 155, 168, 255, 0, 208, 58, 239, 254, 253, 26, 177, 255, 0, 9, 78, 189, 255, 0, 65, 41, 127, 33, 71, 252, 37, 58, 247, 253, 4, 165, 252, 133, 31, 219, 20, 251, 7, 246, 85, 78, 229, 127, 236, 221, 71, 254, 129, 215, 127, 247, 232, 209, 253, 155, 168, 255, 0, 208, 58, 239, 254, 253, 26, 177, 255, 0, 9, 78, 189, 255, 0, 65, 41, 127, 33, 71, 252, 37, 58, 247, 253, 4, 165, 252, 133, 31, 219, 20, 251, 7, 246, 85, 78, 226, 89, 105, 247, 235, 125, 108, 78, 159, 116, 0, 149, 121, 49, 31, 90, 191, 226, 107, 27, 201, 124, 77, 126, 209, 89, 220, 178, 25, 114, 25, 80, 144, 106, 181, 159, 138, 53, 217, 111, 173, 149, 181, 41, 72, 50, 168, 35, 142, 70, 107, 83, 196, 94, 33, 213, 237, 124, 65, 125, 4, 26, 132, 177, 70, 175, 133, 81, 218, 187, 176, 152, 181, 136, 187, 93, 14, 76, 78, 26, 84, 26, 79, 169, 207, 255, 0, 102, 234, 63, 244, 15, 186, 255, 0, 191, 70, 143, 236, 221, 71, 254, 129, 247, 95, 247, 232, 213, 207, 248, 74, 181, 239, 250, 10, 205, 71, 252, 37, 90, 247, 253, 5, 102, 174, 195, 152, 167, 253, 155, 168, 255, 0, 208, 62, 235, 254, 253, 26, 63, 179, 117, 31, 250, 7, 221, 127, 223, 163, 87, 63, 225, 42, 215, 191, 232, 43, 53, 31, 240, 149, 107, 223, 244, 21, 154, 128, 48, 53, 207, 10, 220, 235, 90, 107, 91, 182, 153, 117, 230, 0, 124, 166, 49, 31, 149, 171, 198, 229, 208, 181, 120, 101, 104, 223, 76, 188, 14, 167, 4, 121, 13, 254, 21, 244, 31, 252, 37, 90, 247, 253, 5, 102, 174, 135, 194, 126, 43, 158, 91, 255, 0, 178, 106, 146, 44, 162, 99, 242, 76, 224, 124, 167, 210, 128, 62, 88, 254, 199, 212, 191, 232, 29, 119, 255, 0, 126, 27, 252, 40, 254, 199, 212, 191, 232, 29, 119, 255, 0, 126, 27, 252, 43, 238, 191, 45, 58, 132, 79, 251, 230, 143, 42, 63, 238, 71, 255, 0, 124, 208, 7, 194, 159, 216, 250, 151, 253, 3, 174, 255, 0, 239, 195, 127, 133, 31, 216, 250, 151, 253, 3, 174, 255, 0, 239, 195, 127, 133, 125, 215, 229, 71, 253, 200, 255, 0, 239, 154, 60, 168, 255, 0, 185, 31, 253, 243, 64, 31, 10, 127, 99, 234, 95, 244, 14, 187, 255, 0, 191, 13, 254, 20, 127, 99, 234, 95, 244, 14, 187, 255, 0, 191, 13, 254, 21, 247, 95, 149, 31, 247, 35, 255, 0, 190, 104, 242, 163, 254, 228, 127, 247, 205, 0, 124, 41, 253, 143, 169, 127, 208, 58, 239, 254, 252, 55, 248, 81, 253, 143, 169, 127, 208, 58, 239, 254, 252, 55, 248, 87, 221, 126, 84, 127, 220, 143, 254, 249, 163, 202, 143, 251, 145, 255, 0, 223, 52, 1, 241, 236, 90, 102, 163, 228, 175, 252, 75, 238, 186, 15, 249, 100, 105, 255, 0, 217, 154, 143, 253, 3, 238, 191, 239, 201, 175, 176, 118, 47, 247, 87, 242, 163, 98, 255, 0, 117, 127, 42, 0, 248, 251, 251, 51, 81, 255, 0, 160, 125, 215, 253, 249, 52, 127, 102, 106, 63, 244, 15, 186, 255, 0, 191, 38, 190, 193, 216, 191, 221, 95, 202, 141, 139, 253, 213, 252, 168, 3, 227, 239, 236, 205, 71, 254, 129, 247, 95, 247, 228, 209, 253, 153, 168, 255, 0, 208, 62, 235, 254, 252, 154, 251, 7, 98, 255, 0, 117, 127, 42, 54, 47, 247, 87, 242, 160, 15, 143, 191, 179, 53, 31, 250, 7, 221, 127, 223, 147, 71, 246, 102, 163, 255, 0, 64, 251, 175, 251, 242, 107, 236, 29, 139, 253, 213, 252, 168, 216, 191, 221, 95, 202, 128, 62, 62, 254, 204, 212, 127, 232, 31, 117, 255, 0, 126, 77, 31, 217, 154, 143, 253, 3, 238, 191, 239, 201, 175, 176, 118, 47, 247, 87, 242, 163, 98, 255, 0, 117, 127, 42, 0, 248, 209, 157, 84, 149, 103, 80, 65, 193, 4, 210, 121, 177, 255, 0, 207, 85, 252, 235, 3, 93, 255, 0, 145, 135, 83, 255, 0, 175, 169, 127, 244, 51, 84, 40, 3, 174, 243, 99, 255, 0, 158, 171, 249, 209, 230, 199, 255, 0, 61, 87, 243, 174, 70, 138, 0, 235, 188, 216, 255, 0, 231, 170, 254, 116, 121, 177, 255, 0, 207, 85, 252, 235, 145, 162, 128, 58, 239, 54, 63, 249, 234, 191, 157, 30, 108, 127, 243, 213, 127, 58, 228, 104, 160, 14, 187, 205, 143, 254, 122, 175, 231, 71, 155, 31, 252, 245, 95, 206, 185, 26, 40, 3, 214, 226, 184, 183, 242, 35, 31, 104, 139, 160, 254, 33, 82, 125, 166, 223, 254, 126, 34, 255, 0, 190, 133, 121, 6, 79, 169, 163, 39, 212, 208, 7, 175, 253, 166, 223, 254, 126, 34, 255, 0, 190, 133, 31, 105, 183, 255, 0, 159, 136, 191, 239, 161, 94, 65, 147, 235, 70, 79, 173, 0, 122, 255, 0, 218, 109, 255, 0, 231, 226, 47, 251, 232, 81, 246, 155, 127, 249, 248, 139, 254, 250, 21, 228, 25, 62, 180, 100, 250, 208, 7, 175, 253, 166, 223, 254, 126, 34, 255, 0, 190, 133, 31, 105, 183, 255, 0, 159, 136, 191, 239, 161, 94, 65, 147, 235, 70, 79, 173, 0, 122, 255, 0, 218, 109, 255, 0, 231, 226, 47, 251, 232, 81, 246, 155, 127, 249, 248, 139, 254, 250, 21, 228, 25, 62, 180, 100, 250, 208, 7, 175, 253, 166, 223, 254, 126, 34, 255, 0, 190, 133, 31, 105, 183, 255, 0, 159, 136, 191, 239, 161, 94, 65, 147, 235, 70, 79, 173, 0, 122, 255, 0, 218, 109, 255, 0, 231, 226, 47, 251, 232, 81, 246, 155, 127, 249, 248, 139, 254, 250, 21, 228, 25, 62, 180, 100, 250, 208, 7, 175, 253, 166, 223, 254, 126, 34, 255, 0, 190, 133, 31, 105, 183, 255, 0, 159, 136, 191, 239, 161, 94, 65, 147, 235, 70, 79, 173, 0, 122, 255, 0, 218, 109, 255, 0, 231, 226, 47, 251, 232, 81, 246, 155, 127, 249, 248, 139, 254, 250, 21, 228, 25, 62, 180, 100, 250, 208, 7, 175, 253, 166, 223, 254, 126, 34, 255, 0, 190, 133, 31, 105, 183, 255, 0, 159, 136, 191, 239, 161, 94, 65, 147, 235, 70, 79, 173, 0, 125, 25, 21, 237, 167, 147, 31, 250, 92, 29, 7, 252, 180, 20, 255, 0, 182, 218, 127, 207, 220, 31, 247, 240, 87, 206, 59, 219, 251, 199, 243, 163, 123, 127, 120, 254, 116, 1, 244, 119, 219, 109, 63, 231, 238, 15, 251, 248, 40, 251, 109, 167, 252, 253, 193, 255, 0, 127, 5, 124, 227, 189, 191, 188, 127, 58, 55, 183, 247, 143, 231, 64, 31, 71, 125, 182, 211, 254, 126, 224, 255, 0, 191, 130, 143, 182, 218, 127, 207, 220, 31, 247, 240, 87, 206, 59, 219, 251, 199, 243, 163, 123, 127, 120, 254, 116, 1, 244, 119, 219, 109, 63, 231, 238, 15, 251, 248, 40, 251, 109, 167, 252, 253, 193, 255, 0, 127, 5, 124, 227, 189, 191, 188, 127, 58, 55, 183, 247, 143, 231, 64, 31, 71, 125, 182, 211, 254, 126, 224, 255, 0, 191, 130, 143, 182, 218, 127, 207, 220, 31, 247, 240, 87, 206, 59, 219, 251, 199, 243, 163, 123, 127, 120, 254, 116, 1, 244, 119, 219, 109, 63, 231, 238, 15, 251, 248, 40, 251, 109, 167, 252, 253, 193, 255, 0, 127, 5, 124, 227, 189, 191, 188, 127, 58, 55, 183, 247, 143, 231, 64, 31, 71, 125, 182, 211, 254, 126, 224, 255, 0, 191, 130, 143, 182, 218, 127, 207, 220, 31, 247, 240, 87, 206, 59, 219, 251, 199, 243, 163, 123, 127, 120, 254, 116, 1, 244, 119, 219, 109, 63, 231, 238, 15, 251, 248, 40, 251, 109, 167, 252, 253, 193, 255, 0, 127, 5, 124, 227, 189, 191, 188, 127, 58, 55, 183, 247, 143, 231, 64, 31, 71, 125, 182, 211, 254, 126, 224, 255, 0, 191, 130, 143, 182, 218, 127, 207, 220, 31, 247, 240, 87, 206, 59, 219, 251, 199, 243, 163, 123, 127, 120, 254, 116, 1, 244, 119, 219, 109, 63, 231, 238, 15, 251, 248, 40, 251, 109, 167, 252, 253, 193, 255, 0, 127, 5, 124, 227, 189, 191, 188, 127, 58, 55, 183, 247, 143, 231, 64, 31, 94, 197, 169, 105, 254, 76, 121, 191, 181, 232, 63, 229, 168, 165, 254, 211, 211, 255, 0, 232, 33, 107, 255, 0, 127, 69, 124, 131, 189, 191, 188, 127, 58, 55, 183, 247, 143, 231, 64, 31, 95, 127, 105, 233, 255, 0, 244, 16, 181, 255, 0, 191, 162, 143, 237, 61, 63, 254, 130, 22, 191, 247, 244, 87, 200, 59, 219, 251, 199, 243, 163, 123, 127, 120, 254, 116, 1, 245, 247, 246, 158, 159, 255, 0, 65, 11, 95, 251, 250, 40, 254, 211, 211, 255, 0, 232, 33, 107, 255, 0, 127, 69, 124, 131, 189, 191, 188, 127, 58, 55, 183, 247, 143, 231, 64, 31, 95, 127, 105, 233, 255, 0, 244, 16, 181, 255, 0, 191, 162, 143, 237, 61, 63, 254, 130, 22, 191, 247, 244, 87, 200, 59, 219, 251, 199, 243, 163, 123, 127, 120, 254, 116, 1, 245, 247, 246, 158, 159, 255, 0, 65, 11, 95, 251, 250, 40, 254, 211, 211, 255, 0, 232, 33, 107, 255, 0, 127, 69, 124, 131, 189, 191, 188, 127, 58, 55, 183, 247, 143, 231, 64, 31, 101, 42, 51, 40, 101, 86, 32, 140, 130, 5, 30, 84, 159, 243, 205, 191, 42, 232, 116, 15, 249, 23, 180, 207, 250, 244, 139, 255, 0, 65, 21, 163, 197, 0, 113, 190, 84, 159, 243, 205, 191, 42, 60, 169, 63, 231, 155, 126, 85, 217, 113, 71, 20, 1, 198, 249, 82, 127, 207, 54, 252, 168, 242, 164, 255, 0, 158, 109, 249, 87, 101, 197, 28, 80, 7, 27, 229, 73, 255, 0, 60, 219, 242, 163, 202, 147, 254, 121, 183, 229, 93, 151, 20, 113, 64, 28, 111, 149, 39, 252, 243, 111, 202, 143, 42, 79, 249, 230, 223, 149, 118, 92, 81, 197, 0, 71, 23, 250, 152, 254, 130, 159, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 87, 147, 248, 178, 235, 82, 214, 53, 73, 2, 217, 94, 27, 88, 78, 34, 95, 40, 227, 211, 53, 191, 227, 79, 20, 203, 102, 227, 79, 211, 230, 219, 38, 55, 73, 42, 30, 87, 218, 184, 255, 0, 248, 74, 181, 239, 250, 10, 205, 64, 20, 255, 0, 179, 181, 31, 250, 7, 93, 127, 223, 163, 71, 246, 118, 163, 255, 0, 64, 235, 175, 251, 244, 106, 231, 252, 37, 90, 247, 253, 5, 102, 163, 254, 18, 173, 123, 254, 130, 179, 80, 5, 63, 236, 237, 71, 254, 129, 215, 95, 247, 232, 209, 253, 157, 168, 255, 0, 208, 58, 235, 254, 253, 26, 185, 255, 0, 9, 86, 189, 255, 0, 65, 89, 168, 255, 0, 132, 171, 94, 255, 0, 160, 172, 212, 1, 13, 150, 159, 126, 47, 173, 137, 211, 238, 184, 149, 79, 250, 163, 235, 87, 252, 77, 99, 123, 47, 137, 175, 228, 138, 202, 229, 144, 203, 195, 42, 18, 13, 54, 211, 196, 218, 219, 223, 64, 143, 169, 74, 80, 200, 160, 143, 94, 106, 127, 17, 248, 139, 88, 182, 241, 5, 244, 16, 95, 202, 145, 164, 184, 85, 29, 184, 174, 92, 78, 37, 97, 226, 164, 206, 140, 53, 7, 93, 217, 24, 159, 217, 186, 143, 253, 3, 174, 255, 0, 239, 209, 163, 251, 55, 81, 255, 0, 160, 117, 223, 253, 250, 53, 63, 252, 37, 90, 247, 253, 4, 164, 253, 40, 255, 0, 132, 171, 94, 255, 0, 160, 148, 159, 165, 112, 127, 108, 210, 236, 118, 127, 101, 84, 238, 65, 253, 155, 168, 255, 0, 208, 58, 239, 254, 253, 26, 63, 179, 117, 31, 250, 7, 93, 255, 0, 223, 163, 83, 255, 0, 194, 85, 175, 127, 208, 74, 79, 210, 143, 248, 74, 181, 239, 250, 9, 73, 250, 81, 253, 179, 75, 176, 127, 101, 84, 238, 65, 253, 155, 168, 255, 0, 208, 58, 239, 254, 253, 26, 63, 179, 117, 31, 250, 7, 93, 255, 0, 223, 163, 83, 255, 0, 194, 85, 175, 127, 208, 74, 79, 210, 143, 248, 74, 181, 239, 250, 9, 73, 250, 81, 253, 179, 75, 176, 127, 101, 84, 238, 65, 253, 155, 168, 255, 0, 208, 58, 239, 254, 253, 26, 63, 179, 117, 31, 250, 7, 93, 255, 0, 223, 163, 83, 255, 0, 194, 85, 175, 127, 208, 74, 79, 210, 143, 248, 74, 181, 239, 250, 9, 73, 250, 81, 253, 179, 75, 176, 127, 101, 84, 238, 22, 90, 126, 160, 47, 109, 137, 211, 238, 176, 37, 94, 177, 31, 90, 60, 93, 199, 138, 181, 12, 255, 0, 207, 90, 63, 225, 43, 215, 255, 0, 232, 37, 47, 233, 89, 55, 23, 50, 221, 92, 53, 196, 238, 100, 145, 185, 102, 61, 77, 125, 79, 11, 226, 214, 42, 180, 218, 232, 191, 63, 248, 99, 135, 27, 132, 149, 4, 175, 212, 101, 20, 81, 95, 106, 121, 193, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 5, 155, 31, 249, 8, 219, 127, 215, 85, 254, 117, 191, 226, 107, 27, 201, 124, 77, 126, 209, 217, 92, 58, 25, 114, 25, 80, 144, 107, 2, 199, 254, 66, 54, 223, 245, 213, 127, 157, 117, 94, 33, 241, 14, 175, 107, 175, 223, 65, 6, 161, 44, 81, 172, 184, 85, 29, 171, 230, 51, 239, 138, 159, 204, 214, 145, 207, 127, 102, 234, 63, 244, 14, 187, 255, 0, 191, 70, 143, 236, 221, 71, 254, 129, 215, 127, 247, 232, 213, 223, 248, 74, 181, 239, 250, 10, 205, 71, 252, 37, 90, 247, 253, 5, 102, 175, 4, 216, 165, 253, 155, 168, 255, 0, 208, 58, 239, 254, 253, 26, 63, 179, 117, 31, 250, 7, 93, 255, 0, 223, 163, 87, 127, 225, 42, 215, 191, 232, 43, 53, 31, 240, 149, 107, 223, 244, 21, 154, 128, 41, 127, 102, 234, 63, 244, 14, 187, 255, 0, 191, 70, 143, 236, 221, 71, 254, 129, 215, 127, 247, 232, 213, 223, 248, 74, 181, 239, 250, 10, 205, 71, 252, 37, 90, 247, 253, 5, 102, 160, 10, 95, 217, 186, 143, 253, 3, 174, 255, 0, 239, 209, 166, 255, 0, 103, 234, 3, 174, 159, 117, 255, 0, 126, 141, 95, 255, 0, 132, 171, 94, 255, 0, 160, 172, 213, 223, 248, 58, 61, 98, 107, 127, 183, 106, 119, 178, 186, 184, 253, 220, 79, 233, 235, 64, 21, 188, 41, 225, 88, 180, 184, 191, 180, 117, 0, 62, 211, 247, 128, 110, 145, 143, 90, 232, 191, 225, 32, 209, 191, 232, 49, 97, 255, 0, 129, 9, 254, 52, 186, 239, 252, 139, 186, 159, 253, 122, 75, 255, 0, 160, 154, 248, 78, 128, 62, 235, 255, 0, 132, 131, 70, 255, 0, 160, 197, 135, 254, 4, 39, 248, 209, 255, 0, 9, 6, 141, 255, 0, 65, 139, 15, 252, 8, 79, 241, 175, 133, 40, 160, 15, 186, 255, 0, 225, 32, 209, 191, 232, 49, 97, 255, 0, 129, 9, 254, 52, 127, 194, 65, 163, 127, 208, 98, 195, 255, 0, 2, 19, 252, 107, 225, 74, 40, 3, 238, 191, 248, 72, 52, 111, 250, 12, 88, 127, 224, 66, 127, 141, 31, 240, 144, 104, 223, 244, 24, 176, 255, 0, 192, 132, 255, 0, 26, 248, 82, 138, 0, 251, 175, 254, 18, 13, 27, 254, 131, 22, 31, 248, 16, 159, 227, 71, 252, 36, 26, 55, 253, 6, 44, 63, 240, 33, 63, 198, 190, 20, 162, 128, 62, 235, 93, 119, 71, 44, 161, 117, 107, 18, 79, 0, 11, 133, 57, 253, 105, 100, 214, 180, 184, 37, 104, 101, 213, 44, 227, 149, 14, 25, 30, 117, 4, 126, 25, 175, 136, 180, 47, 249, 24, 52, 207, 250, 251, 139, 255, 0, 67, 21, 208, 124, 84, 255, 0, 146, 159, 226, 31, 250, 251, 63, 200, 80, 7, 215, 159, 219, 250, 55, 253, 6, 44, 63, 240, 33, 127, 198, 143, 237, 253, 27, 254, 131, 22, 31, 248, 16, 191, 227, 95, 10, 81, 64, 31, 117, 255, 0, 194, 65, 163, 127, 208, 94, 195, 255, 0, 2, 23, 252, 104, 26, 246, 144, 221, 53, 123, 3, 244, 184, 95, 241, 175, 133, 41, 85, 217, 62, 235, 17, 244, 52, 1, 247, 103, 246, 222, 149, 255, 0, 65, 75, 47, 251, 254, 191, 227, 71, 246, 222, 149, 255, 0, 65, 75, 47, 251, 254, 191, 227, 95, 11, 121, 243, 127, 207, 70, 252, 232, 243, 230, 255, 0, 158, 141, 249, 208, 7, 220, 223, 219, 218, 56, 56, 254, 215, 211, 243, 255, 0, 95, 11, 254, 52, 127, 111, 232, 255, 0, 244, 24, 211, 255, 0, 240, 33, 127, 198, 190, 21, 36, 177, 201, 36, 159, 83, 69, 0, 125, 213, 253, 191, 163, 255, 0, 208, 99, 79, 255, 0, 192, 133, 255, 0, 26, 201, 241, 7, 135, 237, 124, 69, 96, 46, 173, 30, 54, 159, 25, 142, 68, 57, 18, 123, 102, 190, 43, 175, 179, 126, 21, 255, 0, 201, 47, 240, 247, 253, 122, 143, 230, 104, 3, 206, 142, 153, 168, 35, 21, 58, 125, 201, 218, 113, 194, 26, 103, 246, 110, 161, 255, 0, 64, 235, 175, 251, 244, 107, 214, 124, 77, 111, 169, 203, 97, 231, 233, 183, 82, 67, 52, 124, 148, 95, 226, 21, 230, 159, 240, 148, 107, 233, 242, 182, 165, 48, 35, 168, 244, 160, 10, 63, 217, 218, 143, 253, 3, 238, 191, 239, 209, 163, 251, 59, 81, 255, 0, 160, 125, 215, 253, 250, 53, 123, 254, 18, 173, 123, 254, 130, 179, 81, 255, 0, 9, 86, 189, 255, 0, 65, 89, 168, 2, 143, 246, 118, 163, 255, 0, 64, 251, 175, 251, 244, 104, 254, 206, 212, 127, 232, 31, 117, 255, 0, 126, 141, 94, 255, 0, 132, 171, 94, 255, 0, 160, 172, 212, 127, 194, 85, 175, 127, 208, 86, 106, 0, 163, 253, 157, 168, 255, 0, 208, 62, 235, 254, 253, 26, 63, 179, 181, 31, 250, 7, 221, 127, 223, 163, 87, 191, 225, 42, 215, 191, 232, 43, 53, 31, 240, 149, 107, 223, 244, 21, 154, 128, 33, 178, 211, 239, 197, 245, 177, 58, 125, 215, 250, 213, 63, 234, 143, 173, 121, 79, 196, 187, 59, 171, 175, 137, 222, 34, 107, 123, 105, 166, 81, 118, 65, 49, 161, 108, 112, 61, 43, 216, 237, 60, 79, 174, 61, 244, 8, 250, 148, 174, 134, 85, 92, 122, 243, 93, 23, 128, 145, 79, 139, 124, 121, 149, 7, 254, 38, 171, 212, 127, 211, 49, 64, 31, 40, 127, 99, 234, 95, 244, 14, 187, 255, 0, 191, 13, 254, 20, 127, 99, 234, 95, 244, 14, 187, 255, 0, 191, 13, 254, 21, 247, 103, 148, 159, 243, 205, 127, 42, 60, 164, 254, 226, 255, 0, 223, 52, 1, 240, 159, 246, 62, 165, 255, 0, 64, 235, 191, 251, 240, 223, 225, 93, 103, 195, 45, 50, 254, 31, 137, 90, 12, 178, 89, 92, 162, 45, 208, 37, 154, 22, 0, 112, 107, 235, 255, 0, 41, 63, 231, 154, 255, 0, 223, 52, 190, 88, 29, 21, 71, 225, 64, 15, 162, 138, 40, 0, 162, 138, 40, 3, 128, 248, 191, 255, 0, 34, 141, 167, 253, 133, 109, 63, 244, 96, 174, 91, 197, 95, 242, 51, 234, 31, 245, 214, 186, 143, 139, 223, 242, 40, 90, 127, 216, 86, 211, 255, 0, 70, 10, 229, 252, 85, 255, 0, 35, 62, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 41, 246, 246, 239, 119, 117, 28, 16, 140, 200, 231, 0, 80, 7, 65, 225, 15, 15, 29, 99, 80, 243, 102, 31, 232, 144, 156, 183, 185, 244, 175, 90, 10, 0, 0, 12, 0, 49, 129, 89, 250, 30, 148, 154, 70, 151, 13, 162, 168, 200, 25, 115, 234, 107, 74, 128, 51, 245, 223, 249, 23, 181, 63, 250, 245, 151, 255, 0, 65, 53, 240, 157, 125, 217, 174, 255, 0, 200, 189, 169, 127, 215, 172, 191, 250, 9, 175, 132, 232, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 254, 133, 255, 0, 35, 6, 153, 255, 0, 95, 113, 127, 232, 98, 183, 254, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 43, 3, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 91, 255, 0, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 20, 1, 200, 209, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 87, 217, 191, 10, 255, 0, 228, 151, 248, 123, 254, 189, 71, 243, 53, 241, 149, 125, 155, 240, 175, 254, 73, 127, 135, 191, 235, 212, 127, 51, 64, 29, 125, 121, 151, 142, 124, 59, 246, 43, 143, 237, 27, 85, 196, 82, 31, 222, 1, 252, 38, 189, 54, 171, 222, 217, 197, 127, 103, 45, 180, 195, 41, 34, 224, 208, 7, 132, 81, 86, 245, 61, 62, 93, 51, 81, 150, 214, 97, 141, 135, 143, 113, 235, 85, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 9, 91, 127, 215, 85, 254, 98, 162, 241, 151, 252, 141, 218, 159, 253, 118, 254, 130, 166, 177, 255, 0, 144, 149, 183, 253, 117, 95, 231, 80, 248, 203, 254, 70, 237, 79, 254, 187, 127, 65, 65, 236, 228, 191, 199, 126, 134, 21, 20, 81, 65, 244, 161, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 90, 35, 238, 143, 165, 103, 86, 136, 251, 163, 233, 94, 30, 117, 180, 126, 102, 117, 71, 209, 69, 21, 243, 230, 33, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 5, 157, 59, 254, 66, 86, 191, 245, 213, 127, 157, 107, 120, 171, 254, 70, 125, 67, 254, 187, 86, 78, 157, 255, 0, 33, 43, 95, 250, 234, 191, 206, 181, 188, 85, 255, 0, 35, 62, 161, 255, 0, 93, 171, 232, 50, 93, 165, 242, 60, 44, 219, 120, 252, 204, 138, 40, 162, 189, 195, 200, 10, 40, 162, 128, 10, 109, 58, 138, 0, 245, 63, 6, 120, 143, 251, 82, 207, 236, 183, 12, 5, 204, 32, 1, 147, 247, 197, 117, 149, 224, 150, 119, 51, 89, 93, 197, 115, 11, 21, 150, 51, 145, 138, 246, 93, 11, 91, 183, 215, 108, 68, 241, 241, 34, 241, 34, 255, 0, 116, 208, 6, 181, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 31, 9, 107, 191, 242, 48, 106, 127, 245, 247, 47, 254, 134, 106, 133, 104, 107, 223, 242, 48, 234, 127, 245, 245, 47, 254, 132, 107, 62, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 62, 236, 208, 191, 228, 93, 211, 63, 235, 210, 47, 253, 4, 86, 133, 103, 232, 95, 242, 46, 233, 159, 245, 233, 23, 254, 130, 43, 66, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 193, 241, 62, 188, 186, 30, 155, 185, 8, 107, 151, 226, 52, 207, 235, 90, 26, 166, 167, 111, 164, 216, 73, 119, 112, 126, 69, 236, 59, 154, 241, 173, 95, 85, 155, 89, 212, 100, 187, 152, 159, 155, 162, 255, 0, 116, 122, 80, 5, 71, 145, 165, 145, 221, 142, 93, 206, 77, 37, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 246, 63, 242, 16, 181, 255, 0, 174, 171, 252, 234, 215, 138, 255, 0, 228, 105, 212, 191, 235, 175, 244, 170, 182, 63, 242, 17, 181, 255, 0, 174, 171, 252, 234, 215, 138, 255, 0, 228, 105, 212, 191, 235, 175, 244, 175, 31, 56, 254, 20, 125, 79, 79, 42, 254, 43, 244, 49, 168, 162, 138, 249, 179, 232, 66, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 146, 150, 146, 190, 243, 129, 254, 58, 254, 139, 245, 60, 28, 239, 104, 124, 194, 138, 40, 175, 209, 79, 158, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 44, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 127, 21, 127, 200, 207, 168, 127, 215, 90, 200, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 254, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 243, 25, 247, 197, 79, 230, 107, 72, 200, 162, 138, 43, 193, 54, 10, 40, 162, 128, 10, 40, 167, 193, 110, 247, 119, 17, 195, 16, 221, 35, 156, 1, 64, 29, 7, 132, 60, 62, 117, 155, 239, 58, 97, 254, 139, 9, 203, 123, 159, 74, 245, 160, 161, 64, 0, 96, 1, 128, 5, 103, 232, 122, 84, 122, 62, 151, 13, 162, 129, 144, 50, 199, 212, 214, 149, 0, 103, 235, 191, 242, 47, 106, 127, 245, 235, 47, 254, 130, 107, 225, 58, 251, 179, 93, 255, 0, 145, 119, 83, 255, 0, 175, 73, 127, 244, 19, 95, 9, 208, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 5, 253, 11, 254, 70, 13, 51, 254, 190, 226, 255, 0, 208, 197, 116, 31, 21, 63, 228, 167, 248, 135, 254, 190, 207, 242, 21, 207, 232, 95, 242, 48, 105, 159, 245, 247, 23, 254, 134, 43, 160, 248, 169, 255, 0, 37, 63, 196, 63, 245, 246, 127, 144, 160, 14, 66, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 190, 206, 248, 89, 255, 0, 36, 195, 195, 223, 245, 234, 63, 153, 175, 140, 107, 236, 239, 133, 159, 242, 76, 60, 61, 255, 0, 94, 163, 249, 154, 0, 235, 171, 204, 188, 115, 225, 239, 177, 207, 253, 163, 108, 184, 138, 67, 153, 0, 254, 19, 94, 155, 85, 239, 108, 226, 191, 179, 150, 218, 97, 148, 144, 96, 208, 7, 132, 81, 86, 245, 61, 62, 93, 51, 81, 150, 214, 97, 202, 30, 61, 197, 84, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 227, 254, 215, 254, 187, 47, 243, 174, 239, 192, 31, 242, 55, 248, 243, 254, 194, 171, 255, 0, 162, 197, 112, 150, 63, 242, 17, 181, 255, 0, 174, 203, 252, 235, 187, 240, 7, 252, 141, 254, 60, 255, 0, 176, 170, 255, 0, 232, 177, 64, 29, 245, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 30, 127, 241, 127, 254, 69, 27, 63, 251, 10, 218, 127, 232, 193, 92, 191, 138, 191, 228, 103, 212, 63, 235, 181, 117, 31, 23, 255, 0, 228, 81, 179, 255, 0, 176, 173, 167, 254, 140, 21, 203, 248, 171, 254, 70, 125, 67, 254, 187, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 118, 191, 15, 116, 127, 58, 246, 77, 74, 69, 249, 35, 226, 60, 250, 215, 20, 170, 210, 176, 137, 121, 36, 224, 15, 122, 246, 221, 3, 78, 26, 102, 141, 5, 182, 48, 192, 101, 190, 180, 1, 165, 69, 20, 80, 6, 126, 187, 255, 0, 34, 246, 165, 255, 0, 94, 178, 255, 0, 232, 38, 190, 19, 175, 187, 53, 223, 249, 23, 181, 47, 250, 245, 151, 255, 0, 65, 53, 240, 157, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 95, 208, 191, 228, 96, 211, 63, 235, 238, 47, 253, 12, 87, 65, 241, 79, 254, 74, 127, 136, 63, 235, 236, 255, 0, 33, 92, 254, 133, 255, 0, 35, 6, 153, 255, 0, 95, 113, 127, 232, 98, 186, 15, 138, 127, 242, 83, 252, 65, 255, 0, 95, 103, 249, 10, 0, 228, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 43, 236, 207, 133, 127, 242, 76, 60, 63, 255, 0, 94, 131, 249, 154, 248, 206, 190, 204, 248, 87, 255, 0, 36, 195, 195, 255, 0, 245, 232, 63, 153, 160, 14, 194, 138, 40, 160, 14, 23, 226, 14, 145, 231, 91, 166, 165, 18, 243, 31, 203, 38, 61, 43, 206, 171, 221, 239, 109, 86, 246, 206, 107, 103, 25, 73, 23, 21, 225, 151, 150, 210, 89, 221, 203, 3, 140, 58, 49, 20, 1, 29, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 74, 219, 254, 186, 175, 243, 168, 124, 101, 255, 0, 35, 118, 167, 255, 0, 93, 191, 160, 169, 172, 127, 228, 37, 109, 255, 0, 93, 87, 249, 212, 62, 50, 255, 0, 145, 187, 83, 255, 0, 174, 223, 208, 80, 123, 57, 47, 241, 223, 161, 133, 69, 20, 80, 125, 40, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 86, 136, 251, 163, 233, 89, 213, 162, 62, 232, 250, 87, 135, 157, 109, 31, 153, 21, 71, 209, 69, 21, 243, 230, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 5, 157, 63, 254, 66, 54, 223, 245, 213, 127, 157, 107, 120, 171, 254, 70, 125, 67, 254, 187, 86, 78, 159, 255, 0, 33, 27, 111, 250, 234, 191, 206, 181, 188, 85, 255, 0, 35, 62, 161, 255, 0, 93, 171, 232, 50, 93, 165, 242, 60, 44, 219, 120, 252, 204, 138, 40, 162, 189, 195, 200, 10, 40, 162, 128, 10, 40, 162, 128, 10, 211, 208, 245, 187, 157, 14, 240, 79, 1, 204, 103, 135, 140, 244, 97, 89, 148, 80, 7, 187, 89, 94, 67, 127, 103, 29, 204, 12, 26, 55, 25, 224, 244, 246, 171, 53, 228, 62, 19, 241, 12, 186, 78, 163, 29, 185, 98, 109, 39, 112, 172, 191, 221, 207, 113, 94, 189, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 31, 9, 235, 223, 242, 48, 234, 127, 245, 245, 47, 254, 132, 107, 62, 180, 53, 239, 249, 24, 117, 63, 250, 250, 151, 255, 0, 66, 53, 159, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 31, 118, 104, 95, 242, 46, 233, 159, 245, 233, 23, 254, 130, 43, 66, 179, 244, 47, 249, 23, 116, 207, 250, 244, 139, 255, 0, 65, 21, 161, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 71, 44, 177, 193, 19, 75, 35, 5, 81, 212, 154, 146, 188, 211, 199, 122, 251, 92, 220, 62, 153, 110, 236, 177, 70, 113, 48, 254, 241, 160, 12, 175, 18, 248, 138, 109, 110, 241, 144, 29, 182, 177, 182, 21, 71, 127, 122, 192, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 199, 254, 66, 22, 191, 245, 213, 127, 157, 91, 241, 95, 252, 141, 58, 135, 253, 117, 254, 149, 82, 199, 254, 66, 22, 191, 245, 213, 127, 157, 91, 241, 95, 252, 141, 58, 135, 253, 117, 254, 149, 228, 103, 31, 194, 143, 169, 234, 101, 63, 197, 126, 134, 53, 20, 81, 95, 52, 125, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 83, 105, 212, 218, 251, 222, 7, 254, 37, 127, 69, 250, 158, 14, 119, 240, 195, 230, 45, 20, 81, 95, 162, 31, 60, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 89, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 254, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 145, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 181, 252, 85, 255, 0, 35, 62, 161, 255, 0, 93, 107, 230, 51, 239, 138, 159, 204, 214, 145, 145, 69, 20, 87, 130, 108, 20, 81, 69, 0, 21, 218, 124, 61, 210, 4, 215, 111, 168, 202, 185, 88, 248, 143, 62, 181, 198, 4, 50, 176, 69, 228, 147, 128, 43, 218, 180, 29, 56, 105, 154, 44, 22, 248, 195, 5, 203, 125, 104, 3, 82, 138, 40, 160, 12, 253, 119, 254, 69, 221, 79, 254, 189, 37, 255, 0, 208, 77, 124, 39, 95, 118, 107, 191, 242, 46, 234, 127, 245, 233, 47, 254, 130, 107, 225, 58, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 191, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 174, 131, 226, 167, 252, 148, 255, 0, 16, 255, 0, 215, 217, 254, 66, 185, 253, 11, 254, 70, 13, 51, 254, 190, 226, 255, 0, 208, 197, 116, 31, 21, 63, 228, 167, 248, 135, 254, 190, 207, 242, 20, 1, 200, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 87, 217, 223, 11, 63, 228, 152, 120, 123, 254, 189, 71, 243, 53, 241, 141, 125, 157, 240, 179, 254, 73, 135, 135, 191, 235, 212, 127, 51, 64, 29, 117, 20, 81, 64, 28, 47, 196, 29, 35, 205, 130, 61, 74, 37, 230, 63, 150, 92, 119, 21, 231, 85, 238, 215, 182, 203, 123, 103, 53, 180, 131, 228, 117, 34, 188, 54, 242, 217, 172, 239, 37, 183, 113, 135, 70, 34, 128, 35, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 221, 248, 3, 254, 70, 255, 0, 30, 127, 216, 85, 127, 244, 88, 174, 18, 199, 254, 66, 22, 191, 245, 213, 127, 157, 119, 126, 0, 255, 0, 145, 191, 199, 159, 246, 21, 95, 253, 22, 40, 3, 190, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 3, 207, 254, 47, 255, 0, 200, 163, 103, 255, 0, 97, 91, 79, 253, 24, 43, 151, 241, 87, 252, 141, 26, 135, 253, 118, 53, 212, 124, 95, 255, 0, 145, 70, 207, 254, 194, 182, 159, 250, 48, 87, 47, 226, 175, 249, 26, 53, 15, 250, 236, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 13, 207, 8, 88, 125, 191, 196, 54, 234, 70, 81, 15, 152, 127, 10, 246, 58, 243, 255, 0, 134, 246, 127, 241, 247, 120, 71, 164, 96, 215, 160, 80, 1, 69, 20, 80, 6, 126, 187, 255, 0, 34, 246, 165, 255, 0, 94, 178, 255, 0, 232, 38, 190, 19, 175, 187, 53, 223, 249, 0, 106, 63, 245, 235, 47, 254, 130, 107, 225, 58, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 191, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 173, 255, 0, 138, 127, 242, 83, 252, 65, 255, 0, 95, 103, 249, 10, 192, 208, 191, 228, 96, 211, 63, 235, 238, 47, 253, 12, 86, 255, 0, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 0, 114, 52, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 21, 246, 111, 194, 191, 249, 37, 254, 30, 255, 0, 175, 81, 252, 205, 124, 101, 95, 102, 252, 43, 255, 0, 146, 95, 225, 239, 250, 245, 31, 204, 208, 7, 95, 69, 20, 80, 1, 94, 87, 227, 253, 63, 236, 218, 208, 184, 81, 136, 238, 23, 63, 143, 122, 245, 74, 227, 254, 32, 217, 249, 186, 36, 119, 42, 57, 129, 255, 0, 67, 64, 30, 97, 69, 20, 80, 1, 69, 20, 80, 4, 246, 63, 242, 18, 182, 255, 0, 174, 171, 252, 234, 31, 25, 127, 200, 221, 169, 255, 0, 215, 111, 232, 42, 107, 31, 249, 9, 91, 127, 215, 85, 254, 117, 15, 140, 191, 228, 110, 212, 255, 0, 235, 183, 244, 20, 30, 206, 75, 252, 119, 232, 97, 81, 69, 20, 31, 74, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 21, 162, 62, 232, 250, 86, 117, 104, 143, 186, 62, 149, 225, 231, 91, 71, 230, 69, 81, 244, 81, 69, 124, 249, 128, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 103, 79, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 222, 42, 255, 0, 145, 159, 80, 255, 0, 174, 213, 147, 167, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 111, 21, 127, 200, 207, 168, 127, 215, 106, 250, 12, 151, 105, 124, 143, 11, 54, 222, 63, 51, 34, 138, 40, 175, 112, 242, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 109, 255, 0, 93, 87, 249, 215, 127, 7, 138, 100, 177, 241, 141, 222, 159, 114, 217, 181, 121, 240, 9, 254, 3, 138, 224, 108, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 102, 212, 63, 235, 173, 0, 123, 64, 33, 128, 32, 228, 30, 148, 87, 157, 120, 59, 197, 254, 81, 143, 77, 212, 95, 229, 233, 20, 167, 183, 177, 175, 69, 4, 17, 144, 114, 15, 52, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 240, 158, 189, 255, 0, 35, 14, 167, 255, 0, 95, 82, 255, 0, 232, 70, 179, 235, 67, 94, 255, 0, 145, 135, 83, 255, 0, 175, 169, 127, 244, 35, 89, 244, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 247, 102, 133, 255, 0, 34, 238, 153, 255, 0, 94, 145, 127, 232, 34, 180, 43, 63, 66, 255, 0, 145, 119, 76, 255, 0, 175, 72, 191, 244, 17, 90, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 113, 62, 47, 241, 112, 178, 87, 176, 211, 159, 55, 4, 124, 210, 15, 224, 250, 123, 208, 4, 94, 41, 241, 75, 174, 169, 6, 153, 102, 255, 0, 41, 117, 243, 101, 83, 215, 158, 149, 201, 120, 171, 254, 70, 141, 67, 254, 186, 154, 207, 177, 36, 234, 22, 199, 57, 38, 85, 36, 158, 252, 214, 135, 138, 191, 228, 104, 212, 63, 235, 169, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 86, 252, 87, 255, 0, 35, 78, 161, 255, 0, 93, 127, 165, 84, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 86, 252, 87, 255, 0, 35, 78, 161, 255, 0, 93, 127, 165, 120, 249, 199, 240, 163, 234, 122, 153, 79, 241, 95, 161, 141, 69, 20, 87, 205, 159, 64, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 218, 117, 54, 190, 247, 129, 255, 0, 137, 95, 209, 126, 167, 131, 157, 252, 48, 249, 139, 69, 20, 87, 232, 135, 207, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 22, 108, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 191, 138, 191, 228, 103, 212, 63, 235, 173, 100, 88, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 127, 21, 127, 200, 207, 168, 127, 215, 90, 249, 140, 251, 226, 167, 243, 53, 164, 100, 81, 69, 21, 224, 155, 5, 20, 81, 64, 27, 158, 16, 176, 251, 127, 136, 109, 212, 140, 162, 31, 48, 254, 21, 236, 117, 231, 255, 0, 13, 236, 248, 187, 188, 35, 210, 53, 53, 232, 20, 0, 81, 69, 20, 1, 159, 174, 255, 0, 200, 187, 169, 255, 0, 215, 164, 191, 250, 9, 175, 132, 235, 238, 205, 119, 254, 69, 221, 79, 254, 189, 37, 255, 0, 208, 77, 124, 39, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 23, 244, 47, 249, 24, 52, 207, 250, 251, 139, 255, 0, 67, 21, 208, 124, 84, 255, 0, 146, 159, 226, 31, 250, 251, 63, 200, 87, 63, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 174, 131, 226, 167, 252, 148, 255, 0, 16, 255, 0, 215, 217, 254, 66, 128, 57, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 251, 59, 225, 103, 252, 147, 15, 15, 127, 215, 168, 254, 102, 190, 49, 175, 179, 190, 22, 127, 201, 48, 240, 247, 253, 122, 143, 230, 104, 3, 174, 162, 138, 40, 0, 175, 43, 241, 254, 159, 246, 109, 108, 92, 168, 196, 119, 11, 159, 199, 189, 122, 165, 114, 31, 16, 108, 252, 221, 13, 46, 20, 124, 208, 63, 232, 104, 3, 203, 232, 162, 138, 0, 40, 162, 138, 0, 154, 199, 254, 66, 22, 191, 245, 213, 127, 157, 119, 126, 0, 255, 0, 145, 191, 199, 159, 246, 21, 95, 253, 22, 43, 132, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 93, 223, 128, 63, 228, 111, 241, 231, 253, 133, 87, 255, 0, 69, 138, 0, 239, 168, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 243, 255, 0, 139, 255, 0, 242, 40, 217, 255, 0, 216, 86, 211, 255, 0, 70, 10, 229, 252, 85, 255, 0, 35, 62, 161, 255, 0, 93, 171, 168, 248, 189, 255, 0, 34, 141, 159, 253, 133, 109, 63, 244, 96, 174, 95, 197, 95, 242, 51, 234, 31, 245, 218, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 245, 159, 3, 91, 249, 30, 25, 136, 227, 153, 24, 181, 116, 213, 151, 225, 200, 188, 143, 15, 88, 199, 233, 16, 173, 74, 0, 40, 162, 138, 0, 207, 215, 63, 228, 1, 169, 127, 215, 164, 191, 250, 9, 175, 132, 235, 238, 205, 115, 254, 69, 253, 75, 254, 189, 101, 255, 0, 208, 77, 124, 39, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 23, 244, 47, 249, 24, 52, 207, 250, 251, 139, 255, 0, 67, 21, 208, 124, 84, 255, 0, 146, 159, 226, 31, 250, 251, 63, 200, 87, 63, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 174, 131, 226, 167, 252, 148, 255, 0, 16, 255, 0, 215, 217, 254, 66, 128, 57, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 251, 51, 225, 95, 252, 147, 15, 15, 255, 0, 215, 160, 254, 102, 190, 51, 175, 179, 62, 21, 255, 0, 201, 48, 240, 255, 0, 253, 122, 15, 230, 104, 3, 176, 162, 138, 40, 0, 172, 175, 17, 219, 253, 171, 195, 247, 177, 99, 159, 40, 145, 90, 181, 5, 210, 239, 180, 153, 127, 188, 132, 126, 148, 1, 224, 244, 82, 200, 190, 92, 140, 190, 135, 20, 148, 0, 81, 69, 20, 1, 61, 143, 252, 132, 173, 191, 235, 170, 255, 0, 58, 135, 198, 95, 242, 55, 106, 127, 245, 219, 250, 10, 154, 199, 254, 66, 86, 223, 245, 213, 127, 157, 67, 227, 47, 249, 27, 181, 63, 250, 237, 253, 5, 7, 179, 146, 255, 0, 29, 250, 24, 84, 81, 69, 7, 210, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 104, 143, 186, 62, 149, 157, 90, 35, 238, 143, 165, 120, 121, 214, 209, 249, 145, 84, 125, 20, 81, 95, 62, 96, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 89, 211, 255, 0, 228, 35, 109, 255, 0, 93, 87, 249, 214, 183, 138, 191, 228, 103, 212, 63, 235, 181, 100, 233, 255, 0, 242, 17, 182, 255, 0, 174, 171, 252, 235, 91, 197, 95, 242, 51, 234, 31, 245, 218, 190, 131, 37, 218, 95, 35, 194, 205, 183, 143, 204, 200, 162, 138, 43, 220, 60, 128, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 123, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 26, 47, 255, 0, 235, 173, 103, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 209, 127, 255, 0, 93, 104, 3, 26, 187, 223, 7, 248, 187, 111, 151, 166, 234, 47, 199, 72, 166, 63, 200, 251, 87, 9, 77, 160, 15, 160, 65, 4, 100, 81, 94, 121, 224, 239, 24, 96, 174, 153, 168, 191, 180, 51, 55, 242, 53, 232, 125, 122, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 7, 194, 122, 247, 252, 140, 58, 159, 253, 125, 75, 255, 0, 161, 26, 207, 173, 13, 123, 254, 70, 29, 79, 254, 190, 165, 255, 0, 208, 141, 103, 208, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 7, 221, 154, 23, 252, 139, 186, 103, 253, 122, 69, 255, 0, 160, 138, 208, 172, 253, 11, 254, 69, 221, 51, 254, 189, 34, 255, 0, 208, 69, 104, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 21, 198, 120, 183, 197, 195, 79, 83, 97, 167, 184, 55, 68, 124, 206, 63, 128, 123, 123, 208, 2, 120, 187, 197, 203, 99, 27, 233, 250, 124, 153, 186, 35, 230, 144, 127, 7, 255, 0, 94, 188, 209, 137, 44, 75, 18, 73, 57, 36, 247, 166, 146, 75, 18, 73, 36, 156, 146, 123, 211, 168, 2, 107, 31, 249, 8, 219, 127, 215, 85, 254, 117, 163, 226, 175, 249, 26, 53, 15, 250, 234, 107, 62, 199, 254, 66, 54, 223, 245, 213, 127, 157, 104, 120, 171, 254, 70, 141, 67, 254, 186, 154, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 248, 255, 0, 181, 255, 0, 174, 203, 252, 234, 223, 138, 255, 0, 228, 105, 212, 127, 235, 175, 244, 21, 82, 199, 254, 63, 237, 127, 235, 178, 255, 0, 58, 183, 226, 191, 249, 26, 117, 31, 250, 235, 253, 5, 121, 25, 199, 240, 163, 234, 122, 121, 87, 241, 95, 161, 141, 69, 20, 87, 205, 31, 66, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 218, 117, 54, 190, 247, 129, 255, 0, 137, 95, 209, 126, 167, 131, 157, 252, 48, 249, 139, 69, 20, 87, 232, 135, 207, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 22, 108, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 191, 138, 191, 228, 103, 212, 63, 235, 173, 100, 88, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 127, 21, 127, 200, 207, 168, 127, 215, 90, 249, 140, 251, 226, 167, 243, 53, 164, 100, 81, 69, 21, 224, 155, 5, 20, 81, 64, 30, 181, 224, 107, 127, 35, 195, 49, 30, 242, 49, 106, 233, 107, 47, 195, 176, 249, 30, 31, 177, 95, 72, 133, 106, 80, 1, 69, 20, 80, 6, 126, 187, 255, 0, 34, 238, 167, 255, 0, 94, 146, 255, 0, 232, 38, 190, 19, 175, 187, 53, 223, 249, 23, 117, 63, 250, 244, 151, 255, 0, 65, 53, 240, 157, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 95, 208, 191, 228, 96, 211, 63, 235, 238, 47, 253, 12, 87, 65, 241, 83, 254, 74, 127, 136, 127, 235, 236, 255, 0, 33, 92, 254, 133, 255, 0, 35, 6, 153, 255, 0, 95, 113, 127, 232, 98, 186, 15, 138, 159, 242, 83, 252, 67, 255, 0, 95, 103, 249, 10, 0, 228, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 43, 236, 239, 133, 159, 242, 76, 60, 61, 255, 0, 94, 163, 249, 154, 248, 198, 190, 206, 248, 89, 255, 0, 36, 195, 195, 223, 245, 234, 63, 153, 160, 14, 186, 138, 40, 160, 2, 178, 124, 71, 109, 246, 175, 15, 222, 197, 223, 202, 200, 173, 106, 130, 233, 119, 218, 76, 191, 222, 66, 63, 74, 0, 240, 122, 41, 210, 46, 201, 25, 63, 186, 113, 77, 160, 2, 138, 40, 160, 9, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 215, 119, 224, 15, 249, 27, 252, 121, 255, 0, 97, 85, 255, 0, 209, 98, 184, 75, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 221, 248, 3, 254, 70, 255, 0, 30, 127, 216, 85, 127, 244, 88, 160, 14, 250, 138, 40, 160, 2, 138, 40, 160, 2, 142, 107, 231, 31, 140, 190, 54, 241, 54, 133, 241, 2, 91, 45, 51, 90, 186, 180, 182, 22, 241, 56, 138, 38, 192, 201, 28, 215, 159, 127, 194, 209, 241, 191, 253, 12, 183, 255, 0, 247, 242, 128, 62, 207, 230, 142, 107, 227, 15, 248, 90, 30, 55, 255, 0, 161, 150, 255, 0, 254, 254, 81, 255, 0, 11, 67, 198, 255, 0, 244, 50, 223, 255, 0, 223, 202, 0, 250, 67, 226, 240, 255, 0, 138, 66, 211, 143, 249, 138, 218, 127, 232, 193, 92, 223, 138, 45, 174, 95, 196, 183, 236, 182, 242, 176, 50, 240, 66, 156, 116, 175, 21, 135, 198, 222, 37, 215, 117, 29, 58, 203, 84, 214, 110, 174, 237, 205, 236, 46, 98, 149, 178, 50, 24, 98, 189, 235, 196, 94, 36, 213, 236, 252, 65, 121, 4, 23, 101, 98, 141, 240, 163, 104, 227, 138, 0, 230, 126, 197, 121, 255, 0, 62, 179, 255, 0, 223, 179, 71, 216, 175, 63, 231, 214, 127, 251, 246, 107, 87, 254, 18, 253, 119, 254, 127, 191, 241, 209, 73, 255, 0, 9, 118, 187, 255, 0, 63, 223, 248, 232, 160, 12, 191, 177, 221, 127, 207, 172, 255, 0, 247, 236, 209, 246, 59, 175, 249, 245, 159, 254, 253, 154, 212, 255, 0, 132, 187, 93, 255, 0, 159, 239, 252, 116, 81, 255, 0, 9, 118, 187, 255, 0, 63, 223, 248, 232, 160, 15, 91, 211, 208, 199, 166, 219, 41, 255, 0, 158, 75, 159, 202, 173, 85, 123, 41, 76, 214, 54, 242, 245, 44, 128, 147, 248, 85, 138, 0, 40, 162, 138, 0, 161, 173, 169, 109, 7, 80, 85, 25, 38, 218, 80, 0, 255, 0, 116, 215, 196, 31, 216, 186, 167, 253, 3, 47, 63, 239, 195, 127, 133, 125, 197, 170, 204, 214, 218, 69, 236, 241, 156, 73, 29, 187, 178, 159, 66, 20, 154, 249, 15, 254, 22, 207, 141, 63, 232, 51, 39, 253, 240, 191, 225, 64, 28, 207, 246, 46, 169, 255, 0, 64, 203, 207, 251, 240, 223, 225, 71, 246, 46, 169, 255, 0, 64, 203, 207, 251, 240, 223, 225, 93, 55, 252, 45, 159, 26, 127, 208, 102, 79, 251, 225, 127, 194, 143, 248, 91, 62, 52, 255, 0, 160, 204, 159, 247, 194, 255, 0, 133, 0, 115, 63, 216, 186, 167, 253, 3, 47, 63, 239, 195, 127, 133, 31, 216, 186, 167, 253, 3, 47, 63, 239, 195, 127, 133, 116, 223, 240, 182, 124, 105, 255, 0, 65, 153, 63, 239, 133, 255, 0, 10, 63, 225, 108, 248, 211, 254, 131, 50, 127, 223, 11, 254, 20, 1, 204, 255, 0, 98, 234, 159, 244, 12, 188, 255, 0, 191, 13, 254, 20, 127, 98, 234, 159, 244, 12, 188, 255, 0, 191, 13, 254, 21, 211, 127, 194, 217, 241, 167, 253, 6, 100, 255, 0, 190, 23, 252, 40, 255, 0, 133, 179, 227, 79, 250, 12, 201, 255, 0, 124, 47, 248, 80, 7, 51, 253, 139, 170, 127, 208, 50, 243, 254, 252, 55, 248, 81, 253, 139, 170, 127, 208, 50, 243, 254, 252, 55, 248, 87, 77, 255, 0, 11, 103, 198, 159, 244, 25, 147, 254, 248, 95, 240, 163, 254, 22, 207, 141, 63, 232, 51, 39, 253, 240, 191, 225, 64, 20, 60, 51, 225, 205, 98, 243, 196, 250, 100, 17, 105, 215, 33, 205, 202, 16, 94, 38, 0, 0, 114, 114, 113, 91, 223, 21, 188, 63, 170, 197, 241, 39, 88, 151, 236, 55, 18, 71, 113, 47, 157, 19, 71, 25, 96, 84, 143, 106, 191, 225, 47, 140, 94, 42, 183, 241, 37, 167, 219, 174, 197, 244, 18, 200, 34, 104, 157, 66, 253, 226, 6, 114, 7, 106, 217, 248, 161, 241, 91, 196, 86, 126, 51, 187, 210, 180, 185, 197, 148, 22, 14, 97, 37, 64, 99, 33, 235, 147, 154, 0, 242, 47, 236, 93, 83, 254, 129, 151, 159, 247, 225, 191, 194, 143, 236, 93, 83, 254, 129, 151, 159, 247, 225, 191, 194, 186, 111, 248, 91, 62, 53, 255, 0, 160, 212, 159, 247, 237, 127, 194, 143, 248, 91, 62, 53, 255, 0, 160, 212, 159, 247, 237, 127, 194, 128, 57, 159, 236, 93, 83, 254, 129, 151, 159, 247, 225, 191, 194, 143, 236, 93, 83, 254, 129, 151, 159, 247, 225, 191, 194, 186, 127, 248, 91, 94, 53, 255, 0, 160, 212, 159, 247, 237, 127, 194, 143, 248, 91, 94, 53, 255, 0, 160, 212, 159, 247, 237, 127, 194, 128, 57, 143, 236, 93, 83, 254, 129, 151, 159, 247, 225, 191, 194, 143, 236, 93, 83, 254, 129, 151, 159, 247, 225, 191, 194, 186, 111, 248, 91, 62, 53, 255, 0, 160, 212, 159, 247, 237, 127, 194, 143, 248, 91, 62, 53, 255, 0, 160, 212, 159, 247, 237, 127, 194, 128, 57, 159, 236, 93, 83, 254, 129, 151, 159, 247, 225, 191, 194, 143, 236, 93, 83, 254, 129, 151, 159, 247, 225, 191, 194, 186, 127, 248, 91, 94, 53, 255, 0, 160, 212, 159, 247, 237, 127, 194, 143, 248, 91, 94, 53, 255, 0, 160, 212, 159, 247, 237, 127, 194, 128, 57, 143, 236, 93, 83, 254, 129, 151, 159, 247, 225, 191, 194, 190, 193, 248, 97, 20, 144, 252, 52, 208, 98, 149, 25, 36, 91, 96, 10, 176, 193, 28, 154, 249, 147, 254, 22, 207, 141, 127, 232, 53, 39, 253, 251, 95, 240, 175, 168, 190, 30, 234, 55, 90, 183, 128, 116, 109, 66, 246, 95, 54, 230, 120, 3, 59, 99, 25, 57, 52, 1, 211, 81, 69, 20, 0, 82, 20, 202, 145, 234, 49, 75, 65, 251, 148, 1, 225, 183, 150, 87, 95, 109, 155, 253, 26, 99, 251, 195, 255, 0, 44, 207, 173, 65, 246, 59, 175, 249, 245, 159, 254, 253, 154, 217, 185, 241, 86, 180, 183, 114, 170, 222, 156, 7, 32, 124, 163, 214, 162, 255, 0, 132, 187, 93, 255, 0, 159, 239, 252, 116, 80, 6, 95, 216, 238, 191, 231, 214, 127, 251, 246, 104, 251, 29, 215, 252, 250, 207, 255, 0, 126, 205, 106, 127, 194, 93, 174, 255, 0, 207, 247, 254, 58, 40, 255, 0, 132, 187, 93, 255, 0, 159, 239, 252, 116, 80, 5, 43, 43, 59, 165, 212, 32, 38, 214, 108, 121, 171, 252, 7, 214, 169, 248, 203, 254, 70, 237, 79, 254, 187, 127, 65, 93, 5, 183, 138, 245, 166, 188, 133, 90, 244, 144, 210, 0, 126, 81, 235, 92, 255, 0, 140, 191, 228, 110, 212, 255, 0, 235, 183, 244, 20, 30, 206, 75, 252, 119, 232, 97, 81, 69, 20, 31, 74, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 21, 162, 62, 232, 250, 86, 117, 104, 143, 186, 62, 149, 225, 231, 91, 71, 230, 69, 81, 244, 81, 69, 124, 249, 128, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 103, 79, 255, 0, 144, 141, 183, 253, 117, 95, 231, 91, 126, 39, 182, 185, 147, 196, 215, 236, 150, 242, 176, 50, 240, 66, 158, 107, 19, 79, 255, 0, 144, 141, 183, 253, 117, 95, 231, 93, 95, 136, 188, 73, 171, 89, 248, 130, 242, 8, 46, 202, 196, 143, 133, 27, 71, 21, 244, 25, 46, 210, 249, 30, 22, 109, 188, 126, 103, 51, 246, 43, 207, 249, 245, 159, 254, 253, 154, 62, 197, 121, 255, 0, 62, 179, 255, 0, 223, 179, 90, 159, 240, 151, 107, 191, 243, 253, 255, 0, 142, 138, 63, 225, 46, 215, 127, 231, 251, 255, 0, 29, 21, 238, 30, 65, 151, 246, 43, 207, 249, 245, 159, 254, 253, 154, 62, 197, 121, 255, 0, 62, 179, 255, 0, 223, 179, 90, 159, 240, 151, 107, 191, 243, 253, 255, 0, 142, 138, 63, 225, 46, 215, 127, 231, 251, 255, 0, 29, 20, 1, 151, 246, 43, 207, 249, 245, 159, 254, 253, 154, 62, 197, 121, 255, 0, 62, 179, 255, 0, 223, 179, 90, 159, 240, 151, 107, 191, 243, 253, 255, 0, 142, 138, 63, 225, 46, 215, 127, 231, 251, 255, 0, 29, 20, 1, 151, 246, 43, 207, 249, 245, 159, 254, 253, 154, 62, 197, 121, 255, 0, 62, 179, 255, 0, 223, 179, 90, 159, 240, 151, 107, 191, 243, 253, 255, 0, 142, 138, 63, 225, 46, 215, 127, 231, 251, 255, 0, 29, 20, 1, 74, 202, 206, 233, 117, 8, 9, 181, 155, 253, 106, 255, 0, 1, 245, 171, 254, 39, 182, 185, 147, 196, 183, 236, 150, 243, 50, 153, 120, 33, 13, 75, 107, 226, 189, 106, 75, 200, 85, 175, 73, 13, 32, 7, 229, 30, 181, 111, 196, 94, 36, 213, 172, 245, 251, 200, 32, 187, 43, 18, 62, 20, 109, 28, 80, 7, 51, 246, 59, 175, 249, 245, 159, 254, 253, 154, 62, 199, 117, 255, 0, 62, 179, 255, 0, 223, 179, 90, 159, 240, 150, 235, 191, 243, 252, 127, 239, 145, 71, 252, 37, 186, 239, 252, 255, 0, 31, 251, 228, 80, 6, 87, 216, 174, 191, 231, 214, 127, 251, 246, 107, 185, 240, 191, 138, 175, 224, 242, 108, 53, 43, 89, 218, 46, 139, 62, 195, 145, 232, 13, 115, 127, 240, 150, 235, 191, 243, 252, 127, 239, 145, 71, 252, 37, 186, 239, 252, 255, 0, 31, 251, 228, 80, 7, 178, 125, 105, 115, 94, 87, 165, 248, 218, 254, 25, 130, 95, 203, 231, 70, 199, 239, 99, 149, 21, 220, 195, 122, 103, 133, 37, 138, 93, 202, 122, 26, 240, 179, 28, 235, 234, 21, 45, 82, 158, 143, 102, 105, 26, 124, 200, 219, 205, 25, 172, 127, 62, 95, 239, 81, 231, 203, 253, 239, 210, 188, 223, 245, 186, 135, 242, 26, 123, 6, 108, 102, 140, 214, 63, 159, 47, 247, 191, 74, 60, 249, 127, 189, 250, 81, 254, 183, 80, 254, 80, 246, 12, 216, 205, 25, 172, 127, 62, 95, 239, 126, 148, 121, 242, 255, 0, 123, 244, 163, 253, 110, 161, 252, 161, 236, 25, 177, 154, 51, 88, 254, 124, 191, 222, 253, 40, 243, 229, 254, 247, 233, 71, 250, 221, 67, 249, 67, 216, 51, 226, 189, 119, 254, 70, 29, 79, 31, 243, 245, 47, 254, 132, 107, 62, 190, 187, 127, 135, 254, 17, 158, 71, 154, 93, 6, 213, 164, 114, 75, 18, 15, 36, 245, 164, 255, 0, 133, 117, 224, 239, 250, 23, 173, 63, 35, 90, 127, 173, 216, 95, 229, 98, 246, 12, 249, 22, 138, 250, 231, 254, 21, 207, 131, 191, 232, 95, 180, 252, 141, 31, 240, 174, 124, 29, 255, 0, 66, 253, 167, 228, 105, 255, 0, 173, 216, 63, 229, 97, 236, 25, 242, 53, 21, 245, 207, 252, 43, 159, 7, 127, 208, 191, 105, 249, 26, 63, 225, 92, 248, 59, 254, 133, 251, 79, 200, 209, 254, 183, 96, 255, 0, 149, 135, 176, 103, 200, 212, 87, 215, 63, 240, 174, 124, 29, 255, 0, 66, 253, 167, 228, 104, 255, 0, 133, 115, 224, 239, 250, 23, 237, 63, 35, 71, 250, 221, 131, 254, 86, 30, 193, 159, 35, 81, 95, 92, 255, 0, 194, 185, 240, 119, 253, 11, 246, 159, 145, 163, 254, 21, 207, 131, 191, 232, 95, 180, 252, 141, 31, 235, 118, 15, 249, 88, 123, 6, 124, 141, 69, 125, 115, 255, 0, 10, 231, 193, 223, 244, 47, 218, 126, 70, 143, 248, 87, 62, 14, 255, 0, 161, 126, 211, 242, 52, 127, 173, 216, 63, 229, 97, 236, 25, 242, 53, 21, 245, 207, 252, 43, 159, 7, 127, 208, 191, 105, 249, 26, 63, 225, 92, 248, 59, 254, 133, 251, 79, 200, 209, 254, 183, 96, 255, 0, 149, 135, 176, 103, 200, 212, 87, 215, 63, 240, 174, 124, 29, 255, 0, 66, 253, 167, 228, 104, 255, 0, 133, 115, 224, 239, 250, 23, 237, 63, 35, 71, 250, 221, 131, 254, 86, 30, 193, 159, 35, 81, 95, 92, 255, 0, 194, 185, 240, 119, 253, 11, 246, 159, 145, 163, 254, 21, 207, 131, 191, 232, 95, 180, 252, 141, 31, 235, 118, 15, 249, 88, 123, 6, 124, 141, 69, 125, 115, 255, 0, 10, 231, 193, 223, 244, 47, 218, 126, 70, 143, 248, 87, 62, 14, 255, 0, 161, 126, 211, 242, 52, 127, 173, 216, 63, 229, 97, 236, 25, 242, 53, 21, 245, 207, 252, 43, 159, 7, 127, 208, 191, 105, 249, 26, 63, 225, 92, 248, 59, 254, 133, 251, 79, 200, 209, 254, 183, 96, 255, 0, 149, 135, 176, 103, 200, 212, 87, 215, 63, 240, 174, 124, 29, 255, 0, 66, 253, 167, 228, 104, 255, 0, 133, 115, 224, 239, 250, 23, 237, 63, 35, 71, 250, 221, 131, 254, 86, 30, 193, 159, 35, 82, 224, 215, 215, 31, 240, 174, 124, 27, 255, 0, 66, 245, 167, 228, 107, 193, 111, 180, 187, 24, 245, 11, 148, 138, 217, 68, 98, 86, 10, 1, 232, 51, 93, 184, 60, 250, 134, 46, 252, 137, 232, 119, 224, 50, 154, 184, 199, 37, 23, 177, 192, 237, 52, 109, 53, 220, 127, 103, 89, 255, 0, 207, 1, 249, 209, 253, 157, 103, 255, 0, 60, 7, 231, 94, 135, 215, 227, 216, 244, 255, 0, 213, 92, 71, 243, 35, 135, 218, 104, 218, 107, 184, 254, 206, 179, 255, 0, 158, 3, 243, 163, 251, 58, 207, 254, 120, 15, 206, 143, 175, 199, 176, 127, 170, 184, 143, 230, 71, 15, 180, 209, 180, 215, 113, 253, 157, 103, 255, 0, 60, 7, 231, 71, 246, 117, 159, 252, 240, 31, 157, 31, 95, 143, 96, 255, 0, 85, 113, 31, 204, 142, 31, 105, 163, 105, 174, 227, 251, 58, 207, 254, 120, 15, 206, 143, 236, 235, 63, 249, 224, 63, 58, 62, 191, 30, 193, 254, 170, 226, 63, 153, 28, 62, 13, 37, 119, 63, 217, 214, 127, 243, 192, 126, 117, 238, 250, 127, 195, 239, 8, 73, 166, 218, 201, 38, 129, 106, 93, 161, 82, 199, 29, 78, 43, 135, 25, 158, 80, 193, 164, 234, 39, 169, 231, 99, 242, 122, 184, 46, 94, 103, 185, 242, 125, 21, 245, 207, 252, 43, 175, 7, 127, 208, 191, 105, 249, 81, 255, 0, 10, 235, 193, 223, 244, 47, 218, 126, 85, 193, 254, 182, 224, 255, 0, 149, 158, 119, 176, 103, 200, 212, 87, 215, 63, 240, 174, 188, 29, 255, 0, 66, 253, 167, 229, 71, 252, 43, 175, 7, 127, 208, 191, 105, 249, 81, 254, 182, 224, 255, 0, 149, 135, 176, 103, 200, 212, 87, 215, 63, 240, 174, 188, 29, 255, 0, 66, 253, 167, 229, 71, 252, 43, 175, 7, 127, 208, 191, 105, 249, 81, 254, 182, 224, 255, 0, 149, 135, 176, 103, 200, 212, 87, 215, 63, 240, 174, 188, 29, 255, 0, 66, 253, 167, 229, 71, 252, 43, 175, 7, 127, 208, 191, 105, 249, 81, 254, 182, 224, 255, 0, 149, 135, 176, 103, 200, 212, 87, 215, 63, 240, 174, 188, 29, 255, 0, 66, 253, 167, 229, 71, 252, 43, 175, 7, 127, 208, 191, 105, 249, 81, 254, 182, 224, 255, 0, 149, 135, 176, 103, 200, 212, 87, 215, 63, 240, 174, 188, 29, 255, 0, 66, 253, 167, 229, 71, 252, 43, 175, 7, 127, 208, 191, 105, 249, 81, 254, 182, 224, 255, 0, 149, 135, 176, 103, 200, 212, 87, 215, 63, 240, 174, 188, 29, 255, 0, 66, 253, 167, 229, 71, 252, 43, 175, 7, 127, 208, 191, 105, 249, 81, 254, 182, 224, 255, 0, 149, 135, 176, 103, 200, 212, 87, 215, 63, 240, 174, 188, 29, 255, 0, 66, 253, 167, 229, 71, 252, 43, 175, 7, 127, 208, 191, 105, 249, 81, 254, 182, 224, 255, 0, 149, 135, 176, 103, 200, 212, 87, 215, 63, 240, 174, 188, 29, 255, 0, 66, 253, 167, 229, 71, 252, 43, 175, 7, 127, 208, 191, 105, 249, 81, 254, 182, 224, 255, 0, 149, 135, 176, 103, 200, 212, 87, 215, 63, 240, 174, 188, 29, 255, 0, 66, 253, 167, 229, 71, 252, 43, 175, 7, 127, 208, 191, 105, 249, 81, 254, 182, 224, 255, 0, 149, 135, 176, 103, 200, 212, 87, 215, 63, 240, 174, 188, 29, 255, 0, 66, 253, 167, 229, 71, 252, 43, 175, 7, 127, 208, 191, 105, 249, 81, 254, 182, 224, 255, 0, 149, 135, 176, 103, 200, 212, 87, 215, 63, 240, 174, 188, 29, 255, 0, 66, 253, 167, 229, 71, 252, 43, 175, 7, 127, 208, 191, 105, 249, 81, 254, 182, 224, 255, 0, 149, 135, 176, 103, 103, 161, 31, 248, 167, 116, 207, 250, 244, 139, 255, 0, 65, 21, 161, 154, 196, 70, 104, 34, 72, 98, 249, 99, 65, 133, 3, 176, 29, 5, 63, 207, 151, 251, 213, 151, 250, 221, 67, 249, 71, 236, 25, 177, 154, 51, 88, 254, 124, 191, 222, 163, 207, 151, 251, 212, 127, 173, 212, 63, 148, 61, 131, 54, 51, 70, 107, 31, 207, 151, 251, 212, 121, 242, 255, 0, 122, 143, 245, 186, 135, 242, 135, 176, 102, 198, 104, 205, 99, 249, 242, 255, 0, 122, 143, 62, 95, 239, 81, 254, 183, 80, 254, 80, 246, 12, 216, 200, 164, 226, 177, 218, 229, 149, 75, 51, 224, 14, 73, 61, 171, 138, 214, 252, 109, 114, 37, 123, 125, 61, 240, 20, 255, 0, 173, 239, 154, 239, 203, 243, 191, 175, 84, 246, 116, 105, 252, 201, 149, 62, 83, 107, 196, 222, 40, 188, 183, 146, 91, 13, 50, 218, 82, 248, 195, 207, 180, 252, 135, 219, 214, 188, 232, 218, 94, 150, 36, 219, 78, 92, 156, 146, 99, 60, 214, 160, 241, 118, 187, 255, 0, 63, 199, 254, 249, 20, 191, 240, 150, 235, 159, 243, 251, 255, 0, 142, 138, 250, 3, 19, 43, 236, 87, 95, 243, 235, 63, 253, 240, 104, 251, 21, 215, 252, 250, 207, 255, 0, 124, 26, 213, 255, 0, 132, 183, 92, 255, 0, 159, 223, 252, 116, 81, 255, 0, 9, 110, 185, 255, 0, 63, 191, 248, 232, 160, 10, 54, 86, 119, 75, 168, 64, 77, 172, 216, 243, 87, 248, 15, 173, 95, 241, 61, 173, 204, 158, 37, 191, 101, 183, 149, 144, 203, 193, 10, 106, 91, 111, 21, 235, 77, 121, 10, 181, 233, 33, 156, 2, 54, 143, 90, 183, 226, 15, 18, 106, 214, 122, 253, 228, 16, 93, 149, 137, 31, 10, 54, 142, 40, 3, 153, 251, 21, 215, 252, 250, 207, 255, 0, 124, 26, 62, 197, 117, 255, 0, 62, 179, 255, 0, 223, 6, 181, 63, 225, 45, 215, 127, 231, 255, 0, 255, 0, 29, 20, 127, 194, 91, 174, 255, 0, 207, 255, 0, 254, 58, 40, 3, 47, 236, 87, 95, 243, 235, 63, 253, 240, 104, 251, 21, 215, 252, 250, 207, 255, 0, 124, 26, 212, 255, 0, 132, 187, 93, 255, 0, 159, 239, 252, 116, 81, 255, 0, 9, 118, 187, 255, 0, 63, 223, 248, 232, 160, 12, 191, 177, 93, 127, 207, 172, 255, 0, 247, 193, 163, 236, 87, 95, 243, 235, 63, 253, 240, 107, 83, 254, 18, 237, 119, 254, 127, 191, 241, 209, 71, 252, 37, 218, 239, 252, 255, 0, 127, 227, 162, 128, 50, 254, 197, 117, 255, 0, 62, 179, 255, 0, 223, 6, 143, 177, 93, 127, 207, 172, 255, 0, 247, 193, 173, 79, 248, 75, 181, 223, 249, 254, 255, 0, 199, 69, 31, 240, 151, 107, 191, 243, 253, 255, 0, 142, 138, 0, 165, 101, 103, 116, 47, 173, 137, 181, 155, 137, 87, 248, 15, 173, 73, 226, 191, 249, 26, 117, 31, 250, 235, 253, 5, 104, 90, 248, 175, 90, 107, 216, 21, 175, 137, 5, 194, 17, 180, 122, 214, 127, 138, 255, 0, 228, 105, 212, 127, 235, 175, 244, 21, 227, 231, 31, 194, 143, 169, 233, 229, 95, 197, 126, 134, 53, 20, 81, 95, 54, 125, 8, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 83, 105, 212, 218, 251, 222, 7, 254, 37, 127, 69, 250, 158, 14, 119, 240, 195, 230, 45, 20, 81, 95, 162, 31, 60, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 89, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 91, 190, 39, 181, 185, 147, 196, 183, 236, 150, 242, 178, 153, 120, 33, 79, 53, 133, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 186, 239, 16, 120, 147, 86, 179, 215, 239, 32, 130, 236, 172, 72, 248, 81, 180, 113, 95, 49, 159, 124, 84, 254, 102, 180, 142, 95, 236, 87, 159, 243, 235, 63, 253, 251, 52, 125, 138, 243, 254, 125, 103, 255, 0, 191, 102, 181, 63, 225, 45, 215, 191, 231, 251, 255, 0, 29, 20, 127, 194, 91, 175, 127, 207, 247, 254, 58, 43, 193, 54, 50, 254, 197, 121, 255, 0, 62, 179, 255, 0, 223, 179, 71, 216, 175, 63, 231, 214, 127, 251, 246, 107, 83, 254, 18, 221, 123, 254, 127, 191, 241, 209, 71, 252, 37, 186, 247, 252, 255, 0, 127, 227, 162, 128, 61, 111, 79, 93, 154, 101, 178, 158, 8, 137, 114, 63, 10, 181, 85, 236, 220, 189, 140, 14, 121, 45, 24, 36, 254, 21, 98, 128, 10, 40, 162, 128, 51, 245, 197, 45, 160, 106, 42, 160, 146, 109, 165, 0, 14, 255, 0, 41, 175, 136, 127, 177, 117, 79, 250, 6, 94, 127, 223, 134, 255, 0, 10, 251, 135, 86, 153, 173, 244, 91, 233, 227, 56, 146, 59, 121, 29, 79, 161, 10, 77, 124, 137, 255, 0, 11, 103, 198, 159, 244, 25, 147, 254, 248, 95, 240, 160, 14, 103, 251, 23, 84, 255, 0, 160, 101, 231, 253, 248, 111, 240, 163, 251, 23, 84, 255, 0, 160, 101, 231, 253, 248, 111, 240, 174, 155, 254, 22, 207, 141, 63, 232, 51, 39, 253, 240, 191, 225, 71, 252, 45, 159, 26, 127, 208, 102, 79, 251, 225, 127, 194, 128, 57, 159, 236, 93, 83, 254, 129, 151, 159, 247, 225, 191, 194, 143, 236, 93, 83, 254, 129, 151, 159, 247, 225, 191, 194, 186, 111, 248, 91, 62, 52, 255, 0, 160, 204, 159, 247, 194, 255, 0, 133, 31, 240, 182, 124, 105, 255, 0, 65, 153, 63, 239, 133, 255, 0, 10, 0, 230, 127, 177, 117, 79, 250, 6, 94, 127, 223, 134, 255, 0, 10, 63, 177, 117, 79, 250, 6, 94, 127, 223, 134, 255, 0, 10, 233, 191, 225, 108, 248, 211, 254, 131, 50, 127, 223, 11, 254, 20, 127, 194, 217, 241, 167, 253, 6, 100, 255, 0, 190, 23, 252, 40, 3, 153, 254, 197, 213, 63, 232, 25, 121, 255, 0, 126, 27, 252, 40, 254, 197, 213, 63, 232, 25, 121, 255, 0, 126, 27, 252, 43, 166, 255, 0, 133, 179, 227, 79, 250, 12, 201, 255, 0, 124, 47, 248, 81, 255, 0, 11, 103, 198, 159, 244, 25, 147, 254, 248, 95, 240, 160, 12, 255, 0, 12, 248, 115, 89, 187, 241, 70, 153, 12, 90, 117, 200, 99, 114, 135, 47, 11, 0, 48, 65, 228, 226, 183, 254, 43, 120, 127, 85, 139, 226, 78, 177, 47, 216, 46, 36, 75, 137, 124, 232, 218, 56, 139, 2, 164, 122, 138, 208, 240, 159, 198, 47, 20, 219, 248, 146, 204, 95, 93, 11, 216, 37, 144, 68, 209, 58, 129, 247, 142, 51, 145, 233, 91, 31, 19, 254, 43, 120, 142, 207, 198, 87, 122, 78, 151, 56, 178, 130, 193, 204, 36, 168, 4, 202, 120, 57, 57, 160, 15, 34, 254, 197, 213, 63, 232, 25, 121, 255, 0, 126, 27, 252, 40, 254, 197, 213, 63, 232, 25, 121, 255, 0, 126, 27, 252, 43, 166, 255, 0, 133, 179, 227, 79, 250, 12, 201, 255, 0, 124, 47, 248, 81, 255, 0, 11, 103, 198, 159, 244, 25, 147, 254, 248, 95, 240, 160, 14, 103, 251, 23, 84, 255, 0, 160, 101, 231, 253, 248, 111, 240, 163, 251, 23, 84, 255, 0, 160, 101, 231, 253, 248, 111, 240, 174, 159, 254, 22, 215, 141, 127, 232, 53, 39, 253, 251, 95, 240, 163, 254, 22, 215, 141, 127, 232, 53, 39, 253, 251, 95, 240, 160, 14, 99, 251, 23, 84, 255, 0, 160, 101, 231, 253, 248, 111, 240, 163, 251, 23, 84, 255, 0, 160, 101, 231, 253, 248, 111, 240, 174, 155, 254, 22, 207, 141, 63, 232, 51, 39, 253, 240, 191, 225, 71, 252, 45, 159, 26, 127, 208, 102, 79, 251, 225, 127, 194, 128, 57, 159, 236, 93, 83, 254, 129, 151, 159, 247, 225, 191, 194, 143, 236, 93, 83, 254, 129, 151, 159, 247, 225, 191, 194, 186, 127, 248, 91, 94, 53, 255, 0, 160, 212, 159, 247, 237, 127, 194, 143, 248, 91, 94, 53, 255, 0, 160, 212, 159, 247, 237, 127, 194, 128, 57, 143, 236, 93, 83, 254, 129, 151, 159, 247, 225, 191, 194, 190, 193, 248, 99, 27, 195, 240, 211, 64, 138, 68, 100, 145, 109, 128, 42, 195, 4, 114, 107, 230, 95, 248, 91, 94, 53, 255, 0, 160, 212, 159, 247, 237, 127, 194, 190, 161, 248, 125, 168, 93, 106, 222, 2, 209, 175, 239, 100, 243, 46, 103, 183, 223, 35, 227, 25, 57, 52, 1, 211, 81, 69, 20, 0, 82, 17, 149, 35, 212, 98, 150, 131, 247, 40, 3, 195, 110, 172, 174, 126, 219, 62, 45, 166, 255, 0, 88, 216, 253, 217, 245, 168, 62, 199, 121, 255, 0, 62, 179, 255, 0, 223, 179, 91, 55, 62, 42, 214, 99, 187, 153, 86, 240, 224, 72, 66, 252, 163, 214, 162, 255, 0, 132, 183, 93, 255, 0, 159, 255, 0, 252, 116, 80, 6, 95, 216, 175, 63, 231, 214, 127, 251, 246, 104, 251, 21, 231, 252, 250, 207, 255, 0, 126, 205, 106, 127, 194, 91, 174, 255, 0, 207, 255, 0, 254, 58, 40, 255, 0, 132, 183, 93, 255, 0, 159, 255, 0, 252, 116, 80, 5, 43, 43, 59, 161, 125, 108, 77, 172, 216, 243, 87, 248, 15, 173, 118, 127, 15, 255, 0, 228, 110, 241, 231, 31, 243, 21, 95, 253, 22, 43, 2, 215, 197, 122, 211, 94, 192, 173, 122, 72, 46, 1, 27, 71, 60, 215, 149, 248, 231, 197, 122, 247, 135, 62, 37, 120, 150, 29, 31, 84, 185, 178, 73, 110, 242, 235, 17, 192, 99, 129, 64, 31, 89, 115, 233, 71, 62, 149, 241, 143, 252, 45, 31, 27, 255, 0, 208, 203, 125, 255, 0, 125, 143, 240, 165, 255, 0, 133, 161, 227, 111, 250, 25, 175, 255, 0, 239, 161, 64, 31, 102, 243, 233, 71, 225, 95, 25, 127, 194, 208, 241, 183, 253, 12, 215, 255, 0, 247, 208, 174, 155, 225, 231, 196, 15, 22, 106, 159, 16, 52, 91, 43, 221, 122, 242, 123, 105, 238, 2, 201, 19, 191, 12, 48, 120, 160, 8, 126, 61, 255, 0, 201, 79, 155, 254, 189, 97, 254, 85, 230, 21, 233, 255, 0, 30, 255, 0, 228, 167, 205, 255, 0, 94, 176, 255, 0, 42, 243, 10, 0, 40, 162, 138, 0, 191, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 175, 161, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 191, 165, 124, 245, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 175, 161, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 191, 165, 0, 100, 81, 69, 20, 0, 81, 69, 20, 1, 237, 250, 20, 158, 118, 131, 103, 39, 172, 66, 180, 43, 158, 240, 92, 254, 119, 133, 237, 191, 216, 202, 126, 85, 208, 208, 1, 69, 20, 80, 6, 126, 185, 255, 0, 32, 13, 75, 254, 189, 37, 255, 0, 208, 77, 124, 39, 95, 118, 107, 159, 242, 0, 212, 191, 235, 210, 95, 253, 4, 215, 194, 116, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 127, 66, 255, 0, 145, 131, 77, 255, 0, 175, 168, 191, 244, 49, 93, 7, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 115, 250, 23, 252, 140, 26, 111, 253, 125, 69, 255, 0, 161, 138, 232, 62, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 40, 3, 144, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 175, 179, 62, 21, 255, 0, 201, 48, 240, 255, 0, 253, 122, 15, 230, 107, 227, 58, 251, 51, 225, 95, 252, 147, 15, 15, 255, 0, 215, 160, 254, 102, 128, 59, 10, 40, 162, 128, 10, 138, 115, 178, 222, 83, 232, 164, 212, 181, 159, 174, 79, 246, 109, 10, 242, 110, 155, 98, 52, 1, 226, 83, 182, 233, 229, 62, 172, 77, 54, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 219, 127, 215, 101, 254, 117, 23, 140, 191, 228, 110, 212, 255, 0, 235, 183, 244, 21, 53, 151, 252, 132, 109, 191, 235, 170, 255, 0, 58, 135, 198, 95, 242, 55, 106, 127, 245, 219, 250, 10, 15, 103, 37, 254, 59, 244, 48, 168, 162, 138, 15, 165, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 209, 31, 116, 125, 43, 58, 180, 71, 221, 31, 74, 240, 243, 173, 163, 243, 34, 168, 250, 40, 162, 190, 124, 192, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 179, 167, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 111, 21, 255, 0, 200, 211, 168, 127, 215, 95, 233, 89, 58, 127, 252, 132, 109, 191, 235, 170, 255, 0, 58, 214, 241, 95, 252, 141, 58, 135, 253, 117, 254, 149, 244, 25, 46, 210, 249, 30, 22, 109, 188, 126, 102, 69, 20, 81, 94, 225, 228, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 70, 219, 254, 187, 47, 243, 173, 15, 21, 127, 200, 209, 127, 255, 0, 93, 107, 62, 199, 254, 66, 54, 223, 245, 213, 127, 157, 104, 120, 171, 254, 70, 139, 255, 0, 250, 235, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 21, 173, 162, 235, 179, 233, 83, 34, 151, 47, 109, 222, 51, 219, 212, 214, 77, 21, 141, 124, 53, 28, 69, 39, 78, 170, 186, 26, 109, 59, 158, 181, 101, 125, 109, 168, 67, 230, 219, 184, 97, 223, 212, 85, 138, 242, 141, 55, 83, 184, 211, 102, 243, 109, 219, 0, 253, 229, 236, 107, 208, 244, 141, 114, 219, 84, 132, 109, 96, 38, 3, 230, 142, 191, 55, 205, 242, 26, 184, 23, 237, 33, 172, 14, 184, 213, 79, 115, 90, 138, 40, 175, 156, 54, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 27, 218, 190, 109, 212, 191, 228, 39, 119, 255, 0, 93, 91, 249, 215, 210, 93, 171, 230, 221, 75, 254, 66, 119, 127, 245, 213, 191, 157, 125, 63, 14, 111, 87, 229, 250, 159, 77, 195, 159, 29, 79, 145, 82, 138, 40, 175, 169, 62, 176, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 43, 233, 61, 51, 254, 65, 118, 159, 245, 197, 127, 149, 124, 217, 95, 73, 233, 159, 242, 11, 180, 255, 0, 174, 43, 252, 171, 230, 248, 139, 248, 112, 245, 103, 203, 241, 46, 212, 190, 127, 161, 114, 138, 40, 175, 147, 62, 84, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 109, 67, 115, 115, 13, 156, 38, 107, 135, 10, 163, 214, 171, 106, 58, 165, 174, 157, 14, 235, 135, 0, 227, 133, 238, 107, 207, 117, 77, 110, 231, 87, 127, 223, 28, 68, 14, 68, 99, 160, 175, 123, 41, 201, 106, 227, 231, 119, 164, 58, 191, 242, 49, 149, 85, 18, 254, 187, 226, 73, 175, 229, 104, 45, 152, 165, 176, 224, 227, 248, 235, 159, 162, 138, 253, 43, 9, 132, 163, 133, 166, 161, 73, 89, 28, 141, 182, 238, 194, 138, 40, 174, 145, 5, 20, 81, 64, 19, 88, 255, 0, 200, 70, 219, 254, 187, 47, 243, 173, 31, 21, 127, 200, 207, 168, 127, 215, 90, 207, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 180, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 234, 223, 138, 255, 0, 228, 105, 212, 127, 235, 175, 244, 21, 82, 199, 254, 66, 54, 191, 245, 213, 127, 157, 91, 241, 95, 252, 141, 58, 143, 253, 117, 254, 130, 188, 140, 227, 248, 81, 245, 61, 60, 171, 248, 175, 208, 198, 162, 138, 43, 230, 143, 161, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 109, 58, 155, 95, 123, 192, 255, 0, 196, 175, 232, 191, 83, 193, 206, 254, 24, 124, 197, 162, 138, 43, 244, 67, 231, 130, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 11, 54, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 95, 197, 95, 242, 51, 234, 31, 245, 214, 178, 44, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 191, 138, 191, 228, 104, 212, 63, 235, 169, 175, 152, 207, 190, 42, 127, 51, 90, 70, 69, 20, 81, 94, 9, 176, 81, 69, 20, 1, 237, 186, 19, 249, 218, 13, 139, 250, 196, 43, 74, 185, 239, 5, 79, 231, 248, 98, 219, 253, 140, 173, 116, 52, 0, 81, 69, 20, 1, 159, 174, 255, 0, 200, 189, 169, 255, 0, 215, 172, 191, 250, 9, 175, 132, 235, 238, 205, 119, 254, 69, 237, 79, 254, 189, 101, 255, 0, 208, 77, 124, 39, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 23, 244, 47, 249, 24, 52, 207, 250, 251, 139, 255, 0, 67, 21, 208, 124, 84, 255, 0, 146, 159, 226, 31, 250, 251, 63, 200, 87, 63, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 174, 131, 226, 167, 252, 148, 255, 0, 16, 255, 0, 215, 217, 254, 66, 128, 57, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 251, 55, 225, 103, 252, 147, 15, 15, 127, 215, 168, 254, 102, 190, 50, 175, 179, 190, 22, 127, 201, 48, 240, 247, 253, 122, 143, 230, 104, 3, 174, 162, 138, 40, 0, 168, 167, 109, 182, 242, 159, 69, 39, 244, 169, 107, 59, 91, 159, 236, 218, 29, 236, 221, 54, 196, 127, 194, 128, 60, 78, 118, 221, 60, 167, 213, 137, 166, 209, 69, 0, 20, 81, 69, 0, 79, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 188, 171, 226, 167, 252, 149, 15, 16, 255, 0, 215, 217, 254, 66, 189, 86, 199, 254, 66, 22, 191, 245, 213, 127, 157, 121, 87, 197, 79, 249, 41, 254, 33, 255, 0, 175, 179, 252, 133, 0, 114, 20, 81, 69, 0, 21, 215, 124, 45, 255, 0, 146, 159, 225, 255, 0, 250, 250, 31, 200, 215, 35, 93, 119, 194, 207, 249, 41, 254, 31, 255, 0, 175, 177, 252, 141, 0, 116, 63, 30, 255, 0, 228, 167, 205, 255, 0, 94, 176, 255, 0, 42, 243, 10, 244, 255, 0, 143, 127, 242, 83, 230, 255, 0, 175, 88, 127, 149, 121, 133, 0, 20, 81, 69, 0, 95, 208, 191, 228, 96, 211, 63, 235, 238, 47, 253, 12, 87, 208, 190, 42, 255, 0, 145, 167, 80, 255, 0, 174, 223, 210, 190, 122, 208, 191, 228, 96, 211, 63, 235, 238, 47, 253, 12, 87, 208, 190, 42, 255, 0, 145, 167, 80, 255, 0, 174, 223, 210, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 244, 127, 135, 23, 91, 236, 174, 173, 73, 229, 91, 120, 30, 198, 187, 138, 242, 95, 3, 223, 139, 63, 16, 164, 108, 216, 142, 117, 219, 248, 246, 175, 90, 160, 2, 138, 40, 160, 12, 253, 115, 254, 64, 26, 159, 253, 122, 75, 255, 0, 160, 154, 248, 78, 190, 236, 215, 63, 228, 1, 169, 255, 0, 215, 164, 191, 250, 9, 175, 132, 232, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 254, 133, 255, 0, 35, 6, 155, 255, 0, 95, 81, 127, 232, 98, 186, 15, 138, 127, 242, 83, 252, 65, 255, 0, 95, 103, 249, 10, 231, 244, 47, 249, 24, 52, 223, 250, 250, 139, 255, 0, 67, 21, 208, 124, 83, 255, 0, 146, 159, 226, 15, 250, 251, 63, 200, 80, 7, 33, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 95, 102, 252, 43, 255, 0, 146, 97, 225, 239, 250, 244, 31, 204, 215, 198, 85, 246, 111, 194, 191, 249, 38, 30, 30, 255, 0, 175, 65, 252, 205, 0, 117, 244, 81, 69, 0, 21, 203, 248, 242, 235, 236, 254, 29, 104, 179, 204, 236, 19, 252, 107, 168, 175, 53, 248, 137, 127, 230, 223, 193, 100, 167, 136, 70, 230, 250, 154, 0, 226, 168, 162, 138, 0, 40, 162, 138, 0, 158, 203, 254, 66, 54, 223, 245, 213, 127, 157, 67, 227, 47, 249, 27, 181, 63, 250, 237, 253, 5, 77, 101, 255, 0, 33, 27, 111, 250, 234, 191, 206, 161, 241, 151, 252, 141, 218, 159, 253, 118, 254, 130, 131, 217, 201, 127, 142, 253, 12, 42, 40, 162, 131, 233, 66, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 180, 71, 221, 31, 74, 206, 173, 17, 247, 71, 210, 188, 60, 235, 104, 252, 200, 170, 62, 138, 40, 175, 159, 48, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 44, 233, 255, 0, 242, 17, 182, 255, 0, 174, 171, 252, 235, 91, 197, 127, 242, 52, 234, 31, 245, 215, 250, 86, 78, 159, 255, 0, 33, 27, 111, 250, 234, 191, 206, 181, 188, 87, 255, 0, 35, 78, 161, 255, 0, 93, 127, 165, 125, 6, 75, 180, 190, 71, 133, 155, 111, 31, 153, 145, 69, 20, 87, 184, 121, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 246, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 67, 197, 95, 242, 52, 95, 255, 0, 215, 90, 207, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 162, 255, 0, 254, 186, 208, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 62, 9, 165, 182, 152, 75, 3, 20, 145, 122, 17, 76, 162, 147, 180, 151, 44, 182, 3, 186, 208, 188, 84, 151, 30, 93, 181, 239, 203, 46, 48, 27, 251, 213, 212, 87, 146, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 174, 186, 255, 0, 196, 243, 233, 126, 39, 190, 183, 152, 121, 150, 194, 92, 15, 246, 7, 181, 124, 94, 109, 195, 23, 189, 92, 39, 220, 116, 211, 173, 210, 71, 95, 77, 170, 150, 87, 246, 247, 246, 226, 123, 103, 220, 61, 59, 213, 186, 248, 138, 144, 149, 55, 105, 43, 51, 167, 125, 135, 81, 77, 167, 86, 64, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 55, 181, 124, 219, 169, 127, 200, 78, 235, 254, 186, 183, 243, 175, 164, 187, 87, 205, 186, 151, 252, 132, 238, 191, 235, 171, 127, 58, 250, 126, 28, 222, 175, 203, 245, 62, 155, 135, 62, 58, 159, 34, 165, 20, 81, 95, 82, 125, 96, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 87, 210, 122, 103, 252, 130, 237, 63, 235, 138, 255, 0, 42, 249, 178, 190, 147, 211, 63, 228, 23, 105, 255, 0, 92, 87, 249, 87, 205, 241, 23, 240, 225, 234, 207, 151, 226, 93, 169, 124, 255, 0, 66, 229, 20, 81, 95, 38, 124, 168, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 218, 40, 168, 110, 46, 33, 179, 132, 203, 59, 133, 85, 25, 230, 180, 140, 28, 157, 163, 171, 2, 106, 193, 214, 252, 75, 14, 153, 190, 8, 134, 251, 145, 198, 15, 106, 202, 189, 241, 92, 183, 122, 140, 48, 89, 101, 33, 50, 175, 239, 59, 158, 107, 31, 197, 95, 242, 52, 234, 31, 245, 215, 250, 87, 217, 229, 28, 50, 229, 106, 184, 189, 186, 46, 254, 167, 53, 74, 221, 34, 103, 92, 222, 79, 125, 55, 159, 112, 229, 216, 250, 246, 168, 104, 162, 190, 226, 52, 213, 53, 203, 21, 100, 142, 96, 162, 138, 42, 128, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 54, 223, 245, 213, 127, 157, 104, 120, 171, 254, 70, 125, 67, 254, 186, 214, 125, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 140, 250, 135, 253, 117, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 86, 188, 87, 255, 0, 35, 78, 163, 255, 0, 93, 127, 160, 170, 182, 63, 242, 17, 181, 255, 0, 174, 171, 252, 234, 215, 138, 255, 0, 228, 105, 212, 127, 235, 175, 244, 21, 227, 231, 31, 194, 143, 169, 233, 229, 95, 197, 126, 134, 53, 20, 81, 95, 54, 125, 8, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 83, 105, 212, 218, 251, 222, 7, 254, 37, 127, 69, 250, 158, 14, 119, 240, 195, 230, 45, 20, 81, 95, 162, 31, 60, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 89, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 254, 42, 255, 0, 145, 167, 80, 255, 0, 174, 166, 178, 44, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 191, 138, 191, 228, 105, 212, 63, 235, 169, 175, 152, 207, 190, 42, 127, 51, 90, 70, 69, 20, 81, 94, 9, 176, 81, 69, 20, 1, 232, 255, 0, 14, 46, 247, 217, 92, 218, 19, 202, 54, 240, 61, 141, 119, 21, 228, 190, 7, 191, 251, 47, 136, 35, 70, 108, 71, 56, 41, 248, 246, 175, 90, 160, 2, 138, 40, 160, 12, 253, 115, 254, 69, 237, 79, 254, 189, 37, 255, 0, 208, 77, 124, 39, 95, 118, 107, 159, 242, 47, 106, 127, 245, 233, 47, 254, 130, 107, 225, 58, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 191, 161, 127, 200, 193, 166, 127, 215, 220, 95, 250, 24, 174, 131, 226, 159, 252, 148, 255, 0, 16, 127, 215, 217, 254, 66, 185, 253, 11, 254, 70, 13, 51, 254, 190, 226, 255, 0, 208, 197, 116, 31, 20, 255, 0, 228, 167, 248, 131, 254, 190, 207, 242, 20, 1, 200, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 87, 217, 223, 11, 63, 228, 152, 120, 123, 254, 189, 71, 243, 53, 241, 141, 125, 157, 240, 179, 254, 73, 135, 135, 191, 235, 212, 127, 51, 64, 29, 117, 20, 81, 64, 5, 114, 254, 60, 186, 251, 63, 135, 30, 44, 243, 59, 4, 255, 0, 26, 234, 43, 205, 62, 34, 223, 249, 183, 208, 88, 169, 226, 17, 185, 190, 166, 128, 56, 186, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 94, 85, 241, 83, 254, 74, 127, 136, 127, 235, 236, 255, 0, 33, 94, 171, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 188, 171, 226, 167, 252, 148, 255, 0, 16, 255, 0, 215, 217, 254, 66, 128, 57, 10, 40, 162, 128, 10, 235, 190, 22, 127, 201, 79, 240, 255, 0, 253, 125, 143, 228, 107, 145, 174, 187, 225, 103, 252, 148, 255, 0, 15, 255, 0, 215, 216, 254, 70, 128, 58, 31, 143, 127, 242, 83, 230, 255, 0, 175, 88, 127, 149, 121, 133, 122, 127, 199, 191, 249, 41, 243, 127, 215, 172, 63, 202, 188, 194, 128, 10, 40, 162, 128, 47, 232, 95, 242, 48, 105, 159, 245, 247, 23, 254, 134, 43, 232, 95, 21, 127, 200, 211, 168, 127, 215, 111, 233, 95, 61, 104, 95, 242, 48, 105, 159, 245, 247, 23, 254, 134, 43, 232, 95, 21, 127, 200, 211, 168, 127, 215, 111, 233, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 62, 222, 99, 111, 60, 83, 47, 5, 24, 17, 94, 227, 167, 93, 37, 246, 159, 13, 202, 156, 137, 20, 26, 240, 186, 244, 95, 135, 186, 168, 123, 73, 116, 217, 31, 231, 140, 238, 76, 250, 119, 160, 14, 234, 138, 40, 160, 12, 253, 115, 254, 64, 26, 159, 253, 122, 75, 255, 0, 160, 154, 248, 78, 190, 236, 215, 63, 228, 1, 169, 255, 0, 215, 164, 191, 250, 9, 175, 132, 232, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 254, 133, 255, 0, 35, 6, 155, 255, 0, 95, 81, 127, 232, 98, 186, 15, 138, 127, 242, 83, 252, 65, 255, 0, 95, 103, 249, 10, 231, 244, 47, 249, 24, 52, 223, 250, 250, 139, 255, 0, 67, 21, 208, 124, 83, 255, 0, 146, 159, 226, 15, 250, 251, 63, 200, 80, 7, 33, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 95, 102, 124, 43, 255, 0, 146, 97, 225, 255, 0, 250, 244, 31, 204, 215, 198, 117, 246, 103, 194, 191, 249, 38, 30, 31, 255, 0, 175, 65, 252, 205, 0, 118, 20, 81, 69, 0, 50, 73, 4, 49, 51, 185, 192, 81, 146, 107, 195, 245, 123, 211, 168, 234, 247, 55, 71, 248, 219, 143, 165, 122, 79, 142, 181, 113, 99, 163, 253, 153, 27, 18, 220, 124, 191, 65, 222, 188, 170, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 178, 255, 0, 144, 141, 183, 253, 117, 95, 231, 80, 248, 203, 254, 70, 237, 79, 254, 187, 127, 65, 83, 89, 127, 200, 70, 219, 254, 186, 175, 243, 168, 124, 101, 255, 0, 35, 118, 167, 255, 0, 93, 191, 160, 160, 246, 114, 95, 227, 191, 67, 10, 138, 40, 160, 250, 80, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 173, 17, 247, 71, 210, 179, 171, 68, 125, 209, 244, 175, 15, 58, 218, 63, 50, 42, 143, 162, 138, 43, 231, 204, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 11, 58, 127, 252, 132, 109, 191, 235, 170, 255, 0, 58, 214, 241, 95, 252, 141, 58, 135, 253, 117, 254, 149, 147, 167, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 111, 21, 255, 0, 200, 211, 168, 127, 215, 95, 233, 95, 65, 146, 237, 47, 145, 225, 102, 219, 199, 230, 100, 81, 69, 21, 238, 30, 64, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 141, 23, 255, 0, 245, 214, 179, 236, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 104, 191, 255, 0, 174, 180, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 246, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 67, 197, 127, 242, 52, 234, 31, 245, 215, 250, 86, 125, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 208, 241, 95, 252, 141, 58, 135, 253, 117, 254, 148, 1, 70, 199, 81, 184, 211, 165, 15, 111, 41, 95, 85, 236, 107, 183, 209, 252, 85, 111, 125, 178, 11, 172, 67, 112, 127, 47, 206, 188, 254, 138, 242, 179, 28, 159, 13, 143, 95, 188, 86, 151, 114, 163, 81, 199, 99, 216, 186, 140, 142, 134, 138, 243, 237, 35, 197, 55, 22, 4, 67, 113, 251, 232, 122, 100, 245, 81, 237, 93, 181, 142, 165, 109, 168, 68, 37, 183, 149, 78, 225, 247, 73, 230, 191, 60, 204, 50, 108, 78, 9, 251, 234, 235, 186, 58, 213, 72, 178, 237, 20, 83, 107, 198, 53, 29, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 3, 123, 87, 205, 186, 151, 252, 132, 238, 191, 235, 171, 127, 58, 250, 75, 181, 124, 219, 169, 127, 200, 78, 235, 254, 186, 183, 243, 175, 167, 225, 205, 234, 252, 191, 83, 233, 184, 115, 227, 169, 242, 42, 81, 69, 21, 245, 39, 214, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 125, 39, 166, 127, 200, 46, 211, 254, 184, 175, 242, 175, 155, 43, 233, 61, 51, 254, 65, 118, 159, 245, 197, 127, 149, 124, 223, 17, 127, 14, 30, 172, 249, 126, 37, 218, 151, 207, 244, 46, 81, 69, 21, 242, 103, 202, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 83, 104, 1, 212, 81, 77, 160, 2, 138, 130, 226, 242, 11, 85, 204, 210, 170, 253, 79, 53, 198, 234, 254, 47, 154, 224, 121, 58, 126, 99, 92, 231, 205, 239, 244, 175, 91, 3, 148, 98, 177, 146, 253, 212, 126, 243, 39, 82, 40, 222, 214, 124, 75, 105, 165, 174, 213, 34, 107, 140, 100, 40, 60, 126, 53, 194, 234, 154, 197, 222, 170, 217, 153, 200, 95, 249, 230, 58, 85, 15, 115, 201, 61, 105, 213, 250, 22, 91, 145, 225, 176, 58, 173, 101, 220, 229, 169, 85, 200, 154, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 157, 67, 254, 186, 255, 0, 74, 206, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 167, 80, 255, 0, 174, 191, 210, 189, 146, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 159, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 213, 191, 21, 255, 0, 200, 211, 168, 255, 0, 215, 95, 232, 42, 165, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 183, 226, 191, 249, 26, 117, 31, 250, 235, 253, 5, 121, 25, 199, 240, 163, 234, 122, 121, 87, 241, 95, 161, 141, 69, 20, 87, 205, 31, 66, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 218, 117, 54, 190, 247, 129, 255, 0, 137, 95, 209, 126, 167, 131, 157, 252, 48, 249, 139, 69, 20, 87, 232, 135, 207, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 22, 108, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 191, 138, 191, 228, 105, 212, 63, 235, 169, 172, 139, 31, 249, 8, 219, 127, 215, 85, 254, 117, 175, 226, 175, 249, 26, 117, 15, 250, 234, 107, 230, 51, 239, 138, 159, 204, 214, 145, 145, 69, 20, 87, 130, 108, 20, 81, 69, 0, 62, 218, 99, 111, 60, 115, 47, 5, 24, 17, 94, 231, 167, 221, 37, 245, 132, 55, 41, 200, 117, 6, 188, 38, 189, 23, 225, 246, 174, 37, 180, 151, 77, 145, 254, 120, 254, 100, 207, 167, 122, 0, 238, 168, 162, 138, 0, 207, 215, 127, 228, 94, 212, 255, 0, 235, 214, 95, 253, 4, 215, 194, 117, 247, 102, 187, 255, 0, 34, 246, 167, 255, 0, 94, 178, 255, 0, 232, 38, 190, 19, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 11, 250, 23, 252, 140, 26, 103, 253, 125, 197, 255, 0, 161, 138, 232, 62, 42, 127, 201, 79, 241, 15, 253, 125, 159, 228, 43, 159, 208, 191, 228, 96, 211, 63, 235, 238, 47, 253, 12, 87, 65, 241, 83, 254, 74, 127, 136, 127, 235, 236, 255, 0, 33, 64, 28, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 125, 157, 240, 179, 254, 73, 135, 135, 191, 235, 212, 127, 51, 95, 24, 215, 217, 223, 11, 63, 228, 152, 120, 123, 254, 189, 71, 243, 52, 1, 215, 81, 69, 20, 1, 28, 178, 8, 163, 119, 115, 128, 163, 36, 250, 87, 136, 106, 247, 199, 80, 213, 238, 110, 143, 71, 110, 62, 149, 233, 62, 57, 213, 254, 193, 163, 155, 116, 108, 75, 113, 242, 253, 5, 121, 69, 0, 58, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 33, 107, 255, 0, 93, 87, 249, 215, 149, 124, 84, 255, 0, 146, 159, 226, 31, 250, 251, 63, 200, 87, 170, 216, 255, 0, 200, 66, 215, 254, 186, 175, 243, 175, 42, 248, 169, 255, 0, 37, 63, 196, 63, 245, 246, 127, 144, 160, 14, 66, 138, 40, 160, 2, 186, 239, 133, 159, 242, 83, 252, 63, 255, 0, 95, 99, 249, 26, 228, 107, 174, 248, 89, 255, 0, 37, 63, 195, 255, 0, 245, 246, 63, 145, 160, 14, 135, 227, 223, 252, 148, 249, 191, 235, 214, 31, 229, 94, 97, 94, 159, 241, 239, 254, 74, 124, 223, 245, 235, 15, 242, 175, 48, 160, 2, 138, 40, 160, 11, 250, 23, 252, 140, 26, 103, 253, 125, 197, 255, 0, 161, 138, 250, 23, 197, 95, 242, 52, 234, 31, 245, 219, 250, 87, 207, 90, 23, 252, 140, 26, 103, 253, 125, 197, 255, 0, 161, 138, 250, 23, 197, 95, 242, 52, 234, 31, 245, 219, 250, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 91, 210, 181, 39, 210, 181, 40, 110, 211, 248, 15, 35, 212, 119, 170, 148, 80, 7, 187, 217, 220, 197, 123, 105, 21, 204, 7, 49, 184, 200, 171, 21, 231, 62, 4, 241, 7, 146, 199, 76, 185, 111, 145, 185, 132, 158, 199, 210, 189, 26, 128, 51, 245, 207, 249, 0, 106, 127, 245, 233, 47, 254, 130, 107, 225, 58, 251, 179, 92, 255, 0, 144, 6, 167, 255, 0, 94, 146, 255, 0, 232, 38, 190, 19, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 11, 250, 23, 252, 140, 26, 111, 253, 125, 69, 255, 0, 161, 138, 232, 62, 41, 255, 0, 201, 79, 241, 7, 253, 125, 159, 228, 43, 159, 208, 191, 228, 96, 211, 127, 235, 234, 47, 253, 12, 87, 65, 241, 79, 254, 74, 127, 136, 63, 235, 236, 255, 0, 33, 64, 28, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 125, 155, 240, 175, 254, 73, 135, 135, 191, 235, 208, 127, 51, 95, 25, 87, 217, 191, 10, 255, 0, 228, 152, 120, 123, 254, 189, 7, 243, 52, 1, 215, 211, 25, 214, 40, 203, 200, 112, 20, 100, 147, 218, 159, 92, 71, 142, 252, 65, 246, 123, 111, 236, 203, 103, 253, 236, 131, 247, 164, 118, 30, 148, 1, 199, 120, 155, 87, 58, 198, 177, 44, 202, 127, 116, 191, 42, 15, 106, 200, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 158, 199, 254, 66, 86, 223, 245, 213, 127, 157, 67, 227, 47, 249, 27, 117, 63, 250, 237, 253, 42, 107, 31, 249, 8, 219, 127, 215, 85, 254, 117, 15, 140, 191, 228, 109, 212, 255, 0, 235, 183, 244, 160, 246, 114, 95, 227, 63, 67, 10, 138, 40, 160, 250, 80, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 173, 53, 251, 163, 233, 89, 181, 164, 62, 232, 250, 87, 135, 157, 109, 31, 153, 141, 81, 104, 162, 138, 249, 243, 48, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 206, 157, 255, 0, 33, 27, 95, 250, 234, 191, 206, 181, 188, 85, 255, 0, 35, 78, 161, 255, 0, 93, 127, 165, 100, 233, 223, 242, 18, 181, 255, 0, 174, 171, 252, 235, 91, 197, 95, 242, 52, 234, 31, 245, 215, 250, 87, 208, 100, 187, 75, 228, 120, 89, 182, 241, 249, 153, 20, 81, 69, 123, 135, 144, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 79, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 69, 255, 0, 253, 117, 172, 251, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 26, 47, 255, 0, 235, 173, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 135, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 58, 135, 253, 118, 172, 235, 15, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 117, 15, 250, 237, 64, 25, 20, 81, 69, 0, 20, 248, 46, 37, 180, 148, 75, 4, 172, 142, 59, 138, 101, 20, 172, 164, 172, 192, 236, 244, 175, 25, 43, 48, 135, 80, 77, 163, 128, 36, 94, 255, 0, 90, 235, 34, 150, 41, 227, 221, 19, 171, 129, 220, 28, 215, 144, 85, 155, 29, 74, 239, 77, 99, 246, 91, 134, 76, 158, 71, 99, 95, 41, 153, 112, 189, 26, 169, 212, 194, 251, 175, 183, 67, 104, 214, 125, 79, 89, 162, 185, 109, 51, 198, 118, 243, 252, 151, 235, 228, 73, 156, 41, 94, 65, 174, 156, 50, 203, 24, 49, 176, 96, 122, 21, 57, 21, 241, 88, 204, 6, 35, 7, 62, 90, 209, 255, 0, 35, 169, 73, 50, 74, 40, 166, 215, 158, 80, 234, 40, 162, 152, 5, 20, 81, 72, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 6, 246, 175, 155, 117, 47, 249, 9, 221, 127, 215, 86, 254, 117, 244, 151, 106, 249, 183, 82, 255, 0, 144, 157, 215, 253, 117, 111, 231, 95, 79, 195, 155, 213, 249, 126, 167, 211, 112, 231, 199, 83, 228, 84, 162, 138, 43, 234, 79, 172, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 250, 79, 76, 255, 0, 144, 93, 167, 253, 113, 95, 229, 95, 54, 87, 210, 122, 103, 252, 130, 237, 63, 235, 138, 255, 0, 42, 249, 190, 34, 254, 28, 61, 89, 242, 252, 75, 181, 47, 159, 232, 92, 162, 138, 43, 228, 207, 149, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 152, 13, 162, 145, 164, 84, 140, 179, 156, 32, 234, 79, 106, 231, 117, 95, 23, 90, 89, 111, 138, 216, 121, 247, 10, 113, 143, 225, 252, 235, 179, 11, 131, 175, 139, 146, 167, 73, 92, 92, 233, 110, 116, 50, 72, 168, 187, 157, 130, 129, 220, 156, 87, 51, 171, 120, 194, 27, 86, 242, 108, 148, 79, 32, 56, 98, 122, 10, 229, 53, 61, 94, 247, 82, 44, 38, 152, 136, 152, 228, 70, 58, 10, 161, 95, 107, 150, 112, 180, 33, 106, 152, 189, 95, 110, 135, 44, 171, 55, 177, 61, 221, 229, 197, 252, 254, 109, 204, 165, 223, 182, 123, 84, 20, 81, 95, 91, 24, 198, 154, 81, 142, 137, 24, 5, 20, 81, 84, 4, 214, 31, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 52, 106, 31, 245, 215, 250, 86, 117, 135, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 26, 135, 253, 117, 254, 148, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 246, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 67, 197, 95, 242, 51, 234, 31, 245, 214, 179, 236, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 103, 212, 63, 235, 173, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 183, 226, 191, 249, 26, 117, 31, 250, 235, 253, 5, 84, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 86, 252, 87, 255, 0, 35, 78, 163, 255, 0, 93, 127, 160, 175, 35, 56, 254, 20, 125, 79, 79, 42, 254, 43, 244, 49, 168, 162, 138, 249, 163, 232, 66, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 3, 181, 37, 47, 106, 74, 251, 206, 7, 254, 37, 127, 151, 234, 120, 25, 222, 209, 249, 133, 20, 81, 95, 162, 159, 62, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 89, 177, 255, 0, 143, 251, 111, 250, 234, 191, 206, 181, 252, 85, 255, 0, 35, 62, 161, 255, 0, 93, 107, 34, 199, 254, 63, 237, 191, 235, 170, 255, 0, 58, 215, 241, 87, 252, 140, 250, 135, 253, 117, 175, 152, 207, 190, 42, 127, 51, 90, 70, 69, 20, 81, 94, 9, 176, 81, 69, 20, 0, 85, 189, 43, 80, 125, 43, 82, 134, 245, 63, 128, 242, 61, 71, 122, 169, 69, 0, 123, 189, 157, 204, 87, 182, 145, 92, 194, 115, 27, 140, 138, 177, 94, 115, 224, 79, 16, 121, 46, 116, 203, 166, 249, 95, 152, 73, 236, 125, 43, 209, 168, 3, 63, 92, 255, 0, 145, 123, 83, 255, 0, 175, 73, 127, 244, 19, 95, 9, 215, 221, 154, 231, 252, 139, 218, 159, 253, 122, 75, 255, 0, 160, 154, 248, 78, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 47, 232, 95, 242, 48, 105, 159, 245, 247, 23, 254, 134, 43, 160, 248, 167, 255, 0, 37, 63, 196, 31, 245, 246, 127, 144, 174, 127, 66, 255, 0, 145, 131, 76, 255, 0, 175, 184, 191, 244, 49, 93, 7, 197, 63, 249, 41, 254, 32, 255, 0, 175, 179, 252, 133, 0, 114, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 21, 246, 119, 194, 207, 249, 38, 30, 30, 255, 0, 175, 81, 252, 205, 124, 99, 95, 103, 124, 44, 255, 0, 146, 97, 225, 239, 250, 245, 31, 204, 208, 7, 93, 76, 103, 88, 208, 188, 135, 1, 70, 73, 61, 169, 245, 196, 120, 239, 196, 31, 102, 183, 254, 204, 182, 111, 222, 201, 254, 180, 131, 208, 122, 80, 7, 29, 226, 125, 96, 234, 250, 196, 179, 47, 250, 165, 249, 16, 123, 86, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 246, 63, 242, 16, 181, 255, 0, 174, 171, 252, 235, 202, 190, 42, 127, 201, 79, 241, 15, 253, 125, 159, 228, 43, 213, 108, 127, 228, 33, 107, 255, 0, 93, 87, 249, 215, 149, 124, 84, 255, 0, 146, 159, 226, 31, 250, 251, 63, 200, 80, 7, 33, 69, 20, 80, 1, 93, 119, 194, 207, 249, 41, 254, 31, 255, 0, 175, 177, 252, 141, 114, 53, 215, 124, 44, 255, 0, 146, 159, 225, 255, 0, 250, 251, 31, 200, 208, 7, 65, 241, 239, 254, 74, 124, 255, 0, 245, 235, 15, 242, 175, 49, 175, 181, 117, 191, 135, 254, 25, 241, 22, 162, 117, 13, 87, 75, 142, 226, 228, 168, 93, 196, 246, 21, 159, 255, 0, 10, 131, 192, 223, 244, 1, 135, 243, 52, 1, 241, 213, 21, 246, 47, 252, 42, 31, 3, 255, 0, 208, 10, 31, 204, 210, 127, 194, 161, 240, 55, 253, 0, 161, 252, 205, 0, 124, 149, 161, 127, 200, 193, 166, 255, 0, 215, 212, 95, 250, 24, 175, 161, 60, 86, 202, 60, 83, 168, 101, 135, 250, 223, 233, 82, 124, 66, 248, 127, 225, 159, 14, 232, 118, 122, 134, 151, 165, 199, 109, 116, 186, 141, 178, 9, 20, 246, 50, 12, 214, 214, 191, 174, 217, 219, 107, 183, 113, 62, 131, 103, 59, 171, 227, 205, 147, 171, 113, 64, 28, 71, 152, 191, 222, 79, 206, 143, 49, 127, 188, 159, 157, 116, 127, 240, 146, 88, 127, 208, 179, 97, 71, 252, 36, 150, 31, 244, 44, 216, 80, 7, 57, 230, 47, 247, 211, 243, 163, 204, 95, 239, 167, 231, 93, 31, 252, 36, 150, 31, 244, 44, 216, 81, 255, 0, 9, 37, 135, 253, 11, 54, 20, 1, 206, 121, 139, 253, 244, 252, 232, 243, 23, 251, 233, 249, 215, 71, 255, 0, 9, 37, 135, 253, 11, 54, 20, 127, 194, 73, 97, 255, 0, 66, 205, 133, 0, 115, 235, 56, 140, 134, 89, 64, 101, 57, 4, 30, 149, 235, 94, 20, 241, 44, 58, 205, 144, 138, 105, 87, 237, 145, 240, 195, 63, 123, 222, 184, 95, 248, 73, 44, 63, 232, 89, 176, 169, 173, 60, 93, 111, 101, 56, 154, 223, 195, 246, 112, 200, 58, 50, 147, 197, 0, 122, 78, 185, 255, 0, 32, 13, 79, 254, 189, 37, 255, 0, 208, 77, 124, 39, 95, 110, 105, 186, 173, 183, 138, 52, 89, 99, 87, 242, 154, 104, 140, 114, 168, 234, 185, 24, 226, 188, 199, 254, 25, 187, 70, 255, 0, 160, 253, 247, 253, 250, 90, 0, 249, 198, 138, 250, 59, 254, 25, 187, 70, 255, 0, 160, 253, 247, 253, 250, 90, 63, 225, 155, 180, 111, 250, 15, 223, 127, 223, 165, 160, 15, 156, 104, 175, 163, 191, 225, 155, 180, 111, 250, 15, 223, 127, 223, 165, 163, 254, 25, 187, 70, 255, 0, 160, 253, 247, 253, 250, 90, 0, 249, 198, 138, 250, 59, 254, 25, 187, 70, 255, 0, 160, 253, 247, 253, 250, 90, 63, 225, 155, 180, 111, 250, 15, 223, 127, 223, 165, 160, 15, 156, 104, 175, 163, 191, 225, 155, 180, 111, 250, 15, 223, 127, 223, 165, 163, 254, 25, 187, 70, 255, 0, 160, 253, 247, 253, 250, 90, 0, 240, 13, 11, 254, 70, 13, 55, 254, 190, 162, 255, 0, 208, 197, 116, 31, 21, 63, 228, 167, 248, 135, 254, 190, 207, 242, 21, 236, 182, 159, 179, 190, 145, 103, 123, 5, 210, 107, 151, 172, 97, 145, 100, 0, 196, 188, 224, 230, 175, 248, 143, 224, 94, 151, 226, 63, 16, 222, 235, 51, 235, 55, 144, 201, 119, 47, 154, 209, 172, 106, 66, 208, 7, 203, 148, 87, 209, 223, 240, 205, 218, 47, 253, 7, 239, 191, 239, 210, 209, 255, 0, 12, 221, 162, 255, 0, 208, 126, 251, 254, 253, 45, 0, 124, 227, 69, 125, 29, 255, 0, 12, 221, 162, 255, 0, 208, 126, 251, 254, 253, 45, 31, 240, 205, 218, 47, 253, 7, 239, 191, 239, 210, 208, 7, 206, 52, 87, 209, 223, 240, 205, 218, 47, 253, 7, 239, 191, 239, 210, 209, 255, 0, 12, 221, 162, 255, 0, 208, 126, 251, 254, 253, 45, 0, 124, 227, 69, 125, 29, 255, 0, 12, 221, 162, 255, 0, 208, 126, 251, 254, 253, 45, 31, 240, 205, 218, 47, 253, 7, 239, 191, 239, 210, 208, 7, 206, 53, 246, 111, 194, 191, 249, 38, 30, 30, 255, 0, 175, 65, 252, 205, 112, 31, 240, 205, 186, 63, 253, 12, 23, 255, 0, 247, 233, 107, 210, 172, 96, 177, 240, 55, 132, 173, 52, 230, 184, 105, 34, 179, 139, 203, 66, 223, 121, 255, 0, 15, 198, 128, 46, 107, 250, 245, 190, 133, 167, 180, 178, 50, 121, 199, 136, 227, 39, 169, 175, 26, 185, 188, 55, 183, 82, 92, 77, 48, 105, 28, 146, 73, 53, 212, 94, 248, 210, 45, 66, 96, 247, 90, 37, 164, 229, 70, 20, 200, 79, 74, 173, 255, 0, 9, 38, 159, 255, 0, 66, 205, 135, 235, 64, 28, 223, 152, 191, 223, 79, 206, 143, 49, 127, 190, 159, 157, 116, 127, 240, 145, 233, 255, 0, 244, 44, 216, 254, 180, 127, 194, 71, 167, 255, 0, 208, 179, 99, 250, 208, 7, 57, 230, 47, 247, 211, 243, 163, 204, 95, 239, 167, 231, 93, 31, 252, 36, 122, 127, 253, 11, 54, 63, 173, 31, 240, 145, 233, 255, 0, 244, 44, 216, 254, 180, 1, 206, 121, 139, 253, 244, 252, 232, 243, 23, 251, 233, 249, 215, 71, 255, 0, 9, 30, 159, 255, 0, 66, 205, 143, 235, 71, 252, 36, 122, 127, 253, 11, 54, 63, 173, 0, 98, 88, 50, 255, 0, 105, 91, 252, 195, 253, 114, 247, 247, 168, 60, 101, 34, 175, 139, 245, 48, 88, 15, 223, 122, 251, 10, 234, 45, 124, 69, 99, 37, 236, 42, 60, 59, 100, 187, 156, 13, 195, 183, 53, 63, 136, 53, 109, 62, 13, 126, 242, 41, 124, 61, 101, 113, 34, 190, 12, 178, 117, 111, 173, 7, 118, 3, 22, 176, 213, 28, 159, 84, 121, 159, 152, 159, 223, 31, 157, 30, 98, 127, 124, 126, 117, 220, 255, 0, 109, 233, 127, 244, 43, 233, 244, 127, 109, 233, 127, 244, 43, 233, 244, 30, 191, 246, 213, 46, 199, 13, 230, 39, 247, 199, 231, 71, 152, 159, 223, 31, 157, 119, 63, 219, 122, 95, 253, 10, 250, 125, 31, 219, 122, 95, 253, 10, 250, 125, 4, 255, 0, 109, 83, 236, 112, 222, 98, 127, 124, 126, 116, 121, 137, 253, 241, 249, 215, 115, 253, 183, 165, 255, 0, 208, 175, 167, 209, 253, 183, 165, 255, 0, 208, 175, 167, 208, 87, 246, 213, 46, 199, 13, 230, 39, 247, 199, 231, 71, 152, 159, 223, 31, 157, 119, 63, 219, 122, 95, 253, 10, 250, 125, 31, 219, 122, 95, 253, 10, 250, 125, 4, 255, 0, 109, 83, 236, 112, 222, 106, 255, 0, 207, 69, 252, 235, 77, 101, 77, 163, 230, 29, 61, 107, 172, 131, 87, 210, 101, 184, 138, 35, 225, 123, 0, 25, 192, 253, 106, 222, 173, 169, 233, 154, 102, 175, 115, 100, 158, 29, 177, 101, 129, 182, 130, 122, 154, 243, 241, 248, 71, 136, 73, 46, 132, 75, 56, 166, 250, 28, 86, 245, 254, 242, 254, 116, 111, 95, 239, 47, 231, 93, 79, 252, 36, 90, 127, 253, 11, 54, 20, 127, 194, 69, 167, 255, 0, 208, 179, 97, 94, 111, 246, 60, 251, 153, 255, 0, 106, 199, 177, 203, 111, 95, 239, 47, 231, 70, 245, 254, 242, 254, 117, 212, 255, 0, 194, 69, 167, 255, 0, 208, 179, 97, 71, 252, 36, 90, 127, 253, 11, 54, 20, 127, 99, 207, 184, 127, 106, 199, 177, 203, 111, 95, 239, 47, 231, 70, 245, 254, 242, 254, 117, 212, 255, 0, 194, 69, 167, 255, 0, 208, 179, 97, 71, 252, 36, 90, 127, 253, 11, 54, 20, 127, 99, 207, 184, 127, 106, 199, 177, 203, 111, 95, 239, 47, 231, 70, 245, 254, 242, 254, 117, 212, 255, 0, 194, 69, 167, 255, 0, 208, 179, 97, 71, 252, 36, 90, 127, 253, 11, 54, 20, 127, 99, 207, 184, 127, 106, 199, 177, 207, 105, 242, 47, 246, 149, 175, 204, 63, 215, 47, 127, 122, 216, 241, 91, 40, 241, 86, 161, 150, 31, 235, 125, 125, 170, 253, 175, 136, 52, 249, 47, 96, 81, 225, 203, 36, 38, 80, 55, 142, 220, 213, 253, 127, 93, 179, 183, 215, 46, 226, 125, 10, 206, 119, 87, 193, 149, 186, 183, 29, 235, 209, 192, 97, 30, 29, 52, 250, 156, 24, 204, 82, 174, 211, 93, 14, 35, 122, 255, 0, 124, 81, 189, 127, 190, 43, 163, 255, 0, 132, 146, 195, 254, 133, 155, 15, 214, 143, 248, 73, 44, 63, 232, 89, 176, 253, 107, 209, 56, 142, 115, 122, 255, 0, 124, 81, 189, 127, 190, 43, 163, 255, 0, 132, 146, 195, 254, 133, 187, 15, 214, 143, 248, 73, 44, 63, 232, 91, 176, 253, 104, 3, 156, 222, 191, 223, 20, 111, 95, 239, 138, 232, 255, 0, 225, 36, 176, 255, 0, 161, 110, 195, 245, 163, 254, 18, 75, 15, 250, 22, 236, 63, 90, 0, 231, 55, 175, 247, 197, 27, 215, 251, 226, 186, 63, 248, 73, 44, 63, 232, 91, 176, 253, 104, 255, 0, 132, 146, 195, 254, 133, 187, 15, 214, 128, 49, 44, 25, 127, 180, 109, 190, 97, 254, 181, 123, 251, 214, 143, 138, 217, 71, 138, 117, 15, 152, 127, 173, 173, 11, 95, 17, 88, 201, 123, 10, 143, 14, 89, 46, 231, 3, 120, 237, 205, 92, 215, 245, 235, 43, 93, 114, 238, 41, 52, 27, 57, 221, 95, 6, 87, 234, 212, 1, 197, 121, 139, 253, 228, 252, 232, 243, 23, 251, 201, 249, 215, 71, 255, 0, 9, 29, 135, 253, 11, 54, 20, 127, 194, 71, 97, 255, 0, 66, 205, 133, 0, 115, 158, 98, 255, 0, 121, 63, 58, 60, 197, 254, 242, 126, 117, 209, 255, 0, 194, 71, 97, 255, 0, 66, 205, 133, 31, 240, 145, 216, 127, 208, 179, 97, 64, 28, 231, 152, 191, 222, 79, 206, 143, 49, 127, 188, 159, 157, 116, 127, 240, 145, 216, 127, 208, 179, 97, 71, 252, 36, 118, 31, 244, 44, 216, 80, 7, 57, 230, 47, 247, 147, 243, 163, 204, 95, 239, 39, 231, 93, 31, 252, 36, 118, 31, 244, 44, 216, 81, 255, 0, 9, 29, 135, 253, 11, 54, 20, 1, 137, 96, 235, 253, 163, 107, 243, 15, 245, 171, 223, 222, 180, 124, 86, 202, 60, 83, 168, 100, 143, 245, 190, 181, 161, 107, 226, 11, 25, 47, 96, 65, 225, 203, 4, 203, 128, 8, 237, 205, 93, 215, 245, 235, 59, 125, 118, 238, 41, 52, 27, 57, 221, 95, 30, 108, 157, 91, 235, 64, 28, 79, 152, 191, 222, 79, 206, 143, 49, 127, 188, 159, 157, 116, 127, 240, 146, 105, 255, 0, 244, 44, 216, 81, 255, 0, 9, 38, 159, 255, 0, 66, 205, 133, 0, 115, 158, 98, 255, 0, 125, 63, 58, 60, 197, 254, 250, 126, 117, 210, 127, 194, 75, 97, 255, 0, 66, 205, 133, 31, 240, 146, 216, 127, 208, 179, 97, 64, 28, 223, 152, 191, 223, 79, 206, 141, 233, 253, 245, 252, 235, 164, 255, 0, 132, 150, 195, 254, 133, 155, 10, 63, 225, 37, 176, 255, 0, 161, 102, 194, 128, 57, 191, 49, 127, 188, 159, 157, 105, 233, 218, 237, 222, 156, 200, 33, 184, 6, 21, 57, 49, 19, 193, 173, 31, 248, 73, 44, 63, 232, 89, 176, 163, 254, 18, 75, 15, 250, 22, 108, 43, 26, 244, 105, 87, 135, 179, 170, 174, 134, 155, 91, 27, 58, 103, 141, 45, 46, 143, 149, 116, 190, 76, 172, 192, 71, 183, 144, 107, 167, 220, 187, 138, 100, 110, 94, 8, 207, 74, 225, 45, 124, 69, 99, 37, 236, 10, 60, 57, 98, 132, 184, 0, 142, 220, 214, 166, 175, 226, 211, 165, 235, 87, 214, 209, 105, 144, 28, 75, 243, 73, 184, 229, 142, 58, 154, 249, 124, 199, 133, 105, 78, 243, 194, 187, 62, 221, 13, 227, 89, 173, 206, 170, 155, 92, 157, 143, 141, 97, 145, 143, 219, 161, 242, 71, 240, 249, 124, 215, 73, 109, 127, 107, 117, 26, 52, 19, 43, 110, 232, 51, 205, 124, 118, 47, 44, 197, 97, 37, 203, 86, 38, 202, 164, 89, 106, 138, 41, 181, 231, 26, 14, 162, 138, 41, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 222, 213, 243, 110, 163, 255, 0, 33, 75, 175, 250, 234, 223, 206, 190, 146, 237, 95, 54, 234, 63, 242, 20, 186, 255, 0, 174, 173, 252, 235, 233, 248, 115, 122, 191, 47, 212, 250, 110, 28, 248, 234, 124, 138, 148, 81, 69, 125, 73, 245, 129, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 95, 73, 233, 127, 242, 9, 180, 255, 0, 174, 43, 252, 171, 230, 202, 250, 79, 75, 255, 0, 144, 85, 167, 253, 113, 95, 229, 95, 55, 196, 95, 195, 135, 171, 62, 95, 137, 118, 165, 243, 253, 11, 148, 81, 69, 124, 153, 242, 161, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 54, 138, 96, 20, 84, 82, 220, 65, 6, 124, 233, 99, 76, 12, 252, 199, 21, 206, 95, 248, 206, 214, 40, 255, 0, 208, 84, 207, 39, 125, 195, 2, 187, 240, 185, 110, 39, 21, 37, 26, 113, 51, 114, 72, 233, 217, 213, 70, 89, 128, 231, 28, 154, 192, 213, 188, 89, 105, 167, 203, 45, 186, 124, 247, 81, 156, 24, 207, 2, 179, 97, 241, 171, 93, 188, 54, 243, 233, 22, 236, 166, 85, 234, 199, 142, 122, 212, 154, 254, 189, 101, 107, 174, 94, 69, 38, 133, 103, 59, 171, 224, 203, 39, 86, 175, 176, 203, 248, 86, 49, 180, 241, 78, 239, 183, 67, 9, 86, 125, 14, 123, 84, 241, 45, 214, 167, 185, 76, 194, 24, 88, 96, 196, 167, 138, 201, 243, 23, 251, 194, 186, 79, 248, 73, 44, 63, 232, 89, 176, 163, 254, 18, 59, 15, 250, 22, 108, 43, 234, 168, 80, 163, 135, 143, 45, 24, 217, 24, 187, 189, 89, 205, 239, 95, 239, 15, 206, 141, 235, 253, 225, 249, 215, 71, 255, 0, 9, 29, 135, 253, 11, 54, 20, 127, 194, 71, 97, 255, 0, 66, 205, 133, 110, 35, 156, 243, 23, 251, 201, 249, 209, 230, 47, 247, 147, 243, 174, 143, 254, 18, 59, 15, 250, 22, 108, 40, 255, 0, 132, 142, 195, 254, 133, 155, 10, 0, 231, 60, 197, 254, 242, 126, 116, 121, 139, 253, 228, 252, 235, 163, 255, 0, 132, 142, 195, 254, 133, 155, 10, 63, 225, 35, 176, 255, 0, 161, 102, 194, 128, 49, 44, 29, 127, 180, 109, 126, 97, 254, 181, 123, 251, 214, 143, 138, 217, 71, 138, 117, 12, 176, 255, 0, 91, 235, 237, 90, 22, 158, 34, 177, 146, 246, 5, 30, 28, 178, 140, 151, 3, 120, 237, 205, 93, 215, 245, 235, 43, 109, 118, 238, 41, 52, 27, 57, 221, 100, 199, 154, 221, 91, 142, 244, 1, 196, 249, 139, 253, 244, 252, 232, 243, 23, 251, 233, 249, 215, 71, 255, 0, 9, 38, 159, 255, 0, 66, 205, 135, 235, 71, 252, 36, 154, 127, 253, 11, 54, 31, 173, 0, 115, 158, 98, 255, 0, 125, 63, 58, 60, 197, 254, 250, 126, 117, 209, 255, 0, 194, 73, 167, 255, 0, 208, 179, 97, 250, 209, 255, 0, 9, 38, 159, 255, 0, 66, 205, 135, 235, 64, 28, 231, 152, 191, 223, 79, 206, 143, 49, 127, 190, 159, 157, 116, 127, 240, 146, 105, 255, 0, 244, 44, 216, 126, 180, 127, 194, 73, 167, 255, 0, 208, 179, 97, 250, 208, 7, 57, 230, 47, 247, 211, 243, 163, 204, 95, 239, 167, 231, 93, 31, 252, 36, 154, 127, 253, 11, 54, 31, 173, 31, 240, 146, 105, 255, 0, 244, 44, 216, 126, 180, 1, 137, 96, 203, 253, 163, 109, 243, 15, 245, 171, 223, 222, 180, 124, 86, 202, 60, 83, 168, 124, 195, 253, 109, 104, 90, 248, 142, 197, 175, 97, 81, 225, 203, 5, 220, 224, 110, 29, 71, 53, 119, 95, 215, 172, 173, 117, 187, 184, 164, 208, 108, 231, 117, 124, 25, 95, 171, 80, 7, 19, 189, 127, 188, 63, 58, 55, 175, 247, 135, 231, 93, 39, 252, 36, 150, 31, 244, 44, 216, 126, 180, 127, 194, 73, 97, 255, 0, 66, 205, 135, 235, 64, 28, 222, 245, 254, 240, 252, 232, 222, 191, 222, 31, 157, 116, 159, 240, 146, 88, 127, 208, 179, 97, 250, 209, 255, 0, 9, 37, 135, 253, 11, 54, 31, 173, 0, 115, 123, 215, 251, 195, 243, 163, 122, 255, 0, 120, 126, 117, 210, 127, 194, 73, 97, 255, 0, 66, 205, 135, 235, 71, 252, 36, 150, 31, 244, 44, 216, 126, 180, 1, 205, 239, 95, 239, 15, 206, 141, 235, 253, 225, 249, 215, 73, 255, 0, 9, 37, 135, 253, 11, 54, 31, 173, 31, 240, 146, 88, 127, 208, 179, 97, 250, 208, 6, 29, 131, 175, 246, 141, 175, 204, 63, 214, 175, 127, 122, 181, 226, 183, 81, 226, 173, 75, 44, 63, 214, 250, 251, 86, 189, 167, 136, 172, 100, 189, 129, 7, 135, 44, 163, 203, 128, 8, 237, 205, 90, 215, 245, 171, 24, 53, 219, 184, 95, 65, 179, 158, 68, 147, 6, 86, 234, 213, 197, 143, 194, 188, 68, 20, 81, 215, 131, 196, 170, 18, 109, 156, 47, 152, 191, 222, 31, 157, 30, 98, 255, 0, 120, 126, 117, 212, 255, 0, 194, 67, 167, 255, 0, 208, 179, 97, 71, 252, 36, 58, 127, 253, 11, 54, 21, 229, 127, 99, 207, 185, 232, 255, 0, 107, 71, 177, 203, 121, 139, 253, 225, 249, 209, 230, 47, 247, 135, 231, 93, 79, 252, 36, 58, 127, 253, 11, 54, 20, 127, 194, 67, 167, 255, 0, 208, 179, 97, 71, 246, 60, 251, 135, 246, 180, 123, 28, 183, 152, 191, 222, 31, 157, 30, 98, 255, 0, 120, 126, 117, 212, 255, 0, 194, 67, 167, 255, 0, 208, 179, 97, 71, 252, 36, 58, 127, 253, 11, 54, 20, 127, 99, 207, 184, 127, 107, 71, 177, 203, 121, 139, 253, 225, 249, 209, 230, 47, 247, 135, 231, 93, 79, 252, 36, 58, 127, 253, 11, 54, 20, 127, 194, 67, 167, 255, 0, 208, 179, 97, 71, 246, 60, 251, 135, 246, 180, 123, 28, 183, 152, 191, 222, 31, 157, 55, 204, 95, 239, 15, 206, 187, 8, 53, 189, 58, 91, 136, 162, 255, 0, 132, 114, 192, 7, 112, 15, 231, 86, 53, 141, 79, 76, 211, 181, 139, 171, 37, 240, 229, 148, 139, 11, 96, 57, 239, 95, 69, 195, 255, 0, 240, 153, 41, 186, 154, 243, 91, 240, 60, 252, 195, 18, 177, 41, 37, 208, 226, 124, 197, 254, 250, 254, 116, 121, 139, 253, 245, 252, 235, 168, 255, 0, 132, 131, 79, 255, 0, 161, 102, 194, 143, 248, 72, 52, 255, 0, 250, 22, 108, 43, 233, 191, 183, 105, 255, 0, 41, 230, 123, 38, 114, 254, 98, 255, 0, 125, 127, 58, 60, 197, 254, 250, 254, 117, 212, 127, 194, 67, 167, 127, 208, 179, 97, 71, 252, 36, 58, 119, 253, 11, 54, 20, 127, 110, 211, 254, 81, 123, 38, 114, 254, 98, 255, 0, 125, 127, 58, 60, 197, 254, 250, 254, 117, 212, 127, 194, 65, 167, 255, 0, 208, 179, 97, 71, 252, 36, 26, 127, 253, 11, 54, 20, 127, 110, 211, 254, 81, 251, 38, 114, 254, 98, 255, 0, 125, 127, 58, 60, 197, 254, 250, 254, 117, 212, 127, 194, 67, 167, 127, 208, 179, 97, 71, 252, 36, 58, 119, 253, 11, 54, 20, 127, 110, 211, 254, 81, 123, 38, 115, 214, 46, 191, 218, 22, 191, 48, 255, 0, 90, 189, 253, 235, 103, 197, 108, 163, 197, 58, 135, 204, 63, 214, 213, 251, 77, 127, 78, 107, 200, 64, 240, 229, 146, 146, 224, 111, 29, 185, 171, 250, 254, 189, 101, 109, 173, 221, 197, 38, 131, 103, 59, 171, 224, 202, 221, 91, 235, 94, 86, 97, 141, 142, 45, 166, 150, 198, 177, 141, 142, 35, 204, 95, 239, 167, 231, 71, 152, 191, 223, 79, 206, 186, 79, 248, 73, 44, 63, 232, 89, 176, 253, 104, 255, 0, 132, 146, 195, 254, 133, 155, 15, 214, 188, 226, 206, 111, 204, 95, 239, 167, 231, 71, 152, 191, 223, 79, 206, 186, 79, 248, 73, 44, 63, 232, 89, 176, 253, 104, 255, 0, 132, 146, 195, 254, 133, 155, 15, 214, 128, 57, 191, 49, 127, 190, 159, 157, 30, 98, 255, 0, 125, 63, 58, 233, 63, 225, 36, 176, 255, 0, 161, 102, 195, 245, 163, 254, 18, 75, 15, 250, 22, 108, 63, 90, 0, 231, 150, 112, 132, 50, 203, 134, 83, 144, 115, 210, 189, 107, 194, 158, 37, 139, 89, 178, 17, 75, 42, 139, 200, 248, 97, 159, 189, 239, 92, 55, 252, 36, 150, 31, 244, 44, 216, 126, 181, 45, 175, 139, 96, 178, 156, 77, 111, 225, 251, 56, 100, 29, 25, 73, 226, 128, 61, 39, 93, 255, 0, 145, 123, 83, 255, 0, 175, 89, 127, 244, 19, 95, 9, 215, 219, 154, 110, 169, 109, 226, 141, 22, 104, 149, 252, 185, 37, 136, 197, 50, 142, 171, 144, 71, 21, 230, 95, 240, 205, 186, 47, 253, 7, 175, 255, 0, 239, 210, 80, 7, 206, 20, 87, 209, 255, 0, 240, 205, 218, 47, 253, 7, 239, 255, 0, 239, 210, 209, 255, 0, 12, 221, 162, 255, 0, 208, 126, 255, 0, 254, 253, 45, 0, 124, 225, 69, 125, 31, 255, 0, 12, 221, 162, 255, 0, 208, 126, 255, 0, 254, 253, 45, 31, 240, 205, 218, 47, 253, 7, 239, 255, 0, 239, 210, 208, 7, 206, 20, 87, 209, 255, 0, 240, 205, 218, 47, 253, 7, 239, 255, 0, 239, 210, 209, 255, 0, 12, 221, 162, 255, 0, 208, 126, 255, 0, 254, 253, 45, 0, 124, 225, 69, 125, 31, 255, 0, 12, 221, 162, 255, 0, 208, 126, 255, 0, 254, 253, 45, 31, 240, 205, 218, 47, 253, 7, 239, 255, 0, 239, 210, 208, 7, 207, 250, 23, 252, 140, 26, 103, 253, 125, 197, 255, 0, 161, 138, 232, 62, 42, 127, 201, 80, 241, 15, 253, 125, 159, 228, 43, 217, 173, 63, 103, 125, 34, 206, 242, 222, 233, 53, 219, 214, 48, 200, 178, 0, 98, 94, 112, 115, 87, 188, 73, 240, 47, 74, 241, 31, 136, 111, 117, 137, 245, 155, 200, 164, 187, 147, 204, 104, 210, 53, 33, 104, 3, 229, 202, 43, 232, 255, 0, 248, 102, 205, 27, 254, 131, 215, 255, 0, 247, 233, 40, 255, 0, 134, 108, 209, 191, 232, 61, 127, 255, 0, 126, 146, 128, 62, 112, 162, 190, 142, 255, 0, 134, 110, 209, 191, 232, 63, 125, 255, 0, 126, 150, 143, 248, 102, 237, 27, 254, 131, 247, 223, 247, 233, 104, 3, 231, 26, 43, 232, 255, 0, 248, 102, 205, 27, 254, 131, 215, 255, 0, 247, 233, 40, 255, 0, 134, 108, 209, 191, 232, 61, 127, 255, 0, 126, 146, 128, 62, 112, 162, 190, 142, 255, 0, 134, 110, 209, 191, 232, 63, 125, 255, 0, 126, 150, 143, 248, 102, 237, 27, 254, 131, 247, 223, 247, 233, 104, 3, 231, 26, 251, 55, 225, 103, 252, 147, 15, 15, 127, 215, 168, 254, 102, 184, 15, 248, 102, 205, 31, 254, 134, 11, 223, 251, 244, 149, 233, 86, 16, 216, 120, 19, 194, 54, 150, 15, 112, 210, 69, 105, 23, 151, 25, 111, 188, 255, 0, 133, 0, 92, 241, 6, 189, 111, 161, 233, 230, 89, 89, 124, 227, 247, 19, 61, 77, 120, 221, 205, 225, 189, 158, 75, 137, 166, 221, 36, 141, 146, 73, 174, 158, 247, 198, 145, 106, 19, 135, 187, 209, 45, 38, 219, 194, 151, 39, 165, 86, 255, 0, 132, 146, 195, 254, 133, 155, 10, 0, 230, 252, 197, 254, 250, 126, 116, 121, 139, 253, 244, 252, 235, 164, 255, 0, 132, 146, 195, 254, 133, 155, 10, 63, 225, 36, 176, 255, 0, 161, 102, 194, 128, 57, 191, 49, 127, 190, 159, 157, 30, 98, 255, 0, 125, 63, 58, 233, 63, 225, 36, 176, 255, 0, 161, 102, 194, 143, 248, 73, 44, 63, 232, 89, 176, 160, 14, 111, 204, 95, 239, 167, 231, 71, 152, 191, 223, 79, 206, 186, 79, 248, 73, 44, 63, 232, 89, 176, 163, 254, 18, 75, 15, 250, 22, 108, 40, 3, 14, 193, 215, 251, 70, 215, 230, 31, 235, 87, 191, 189, 121, 103, 197, 79, 249, 41, 254, 33, 255, 0, 175, 179, 252, 133, 123, 165, 167, 136, 44, 100, 189, 129, 7, 135, 108, 163, 203, 128, 8, 207, 28, 212, 58, 23, 130, 252, 63, 226, 143, 26, 248, 214, 109, 98, 193, 46, 164, 135, 82, 8, 133, 143, 65, 176, 26, 0, 249, 138, 138, 251, 23, 254, 21, 15, 129, 255, 0, 232, 5, 15, 230, 104, 255, 0, 133, 67, 224, 127, 250, 1, 67, 249, 154, 0, 248, 234, 186, 239, 133, 191, 242, 83, 252, 63, 255, 0, 95, 67, 249, 26, 250, 95, 254, 21, 15, 129, 255, 0, 232, 5, 15, 230, 106, 206, 155, 240, 207, 194, 90, 70, 165, 6, 161, 99, 164, 71, 13, 212, 13, 186, 39, 82, 120, 52, 1, 215, 81, 69, 20, 0, 81, 69, 20, 1, 231, 255, 0, 23, 255, 0, 228, 81, 180, 255, 0, 176, 173, 167, 254, 140, 21, 203, 248, 171, 254, 70, 141, 67, 254, 187, 26, 234, 62, 47, 255, 0, 200, 163, 105, 255, 0, 97, 91, 79, 253, 24, 43, 151, 241, 87, 252, 141, 26, 135, 253, 118, 52, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 5, 221, 26, 242, 123, 45, 82, 217, 237, 229, 40, 75, 132, 56, 238, 9, 175, 97, 182, 214, 45, 46, 111, 238, 44, 214, 76, 79, 3, 109, 101, 61, 254, 149, 226, 246, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 91, 196, 87, 19, 217, 248, 190, 250, 123, 119, 41, 42, 205, 144, 194, 128, 61, 142, 138, 226, 252, 59, 227, 136, 111, 49, 109, 168, 226, 25, 184, 195, 118, 106, 236, 99, 145, 100, 77, 202, 193, 148, 244, 35, 189, 0, 62, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 58, 87, 47, 175, 120, 206, 207, 75, 67, 21, 177, 19, 220, 250, 3, 192, 252, 104, 3, 99, 80, 213, 236, 244, 176, 159, 104, 147, 12, 196, 42, 175, 115, 94, 95, 227, 27, 201, 238, 60, 73, 116, 146, 202, 76, 112, 54, 216, 215, 210, 168, 253, 190, 227, 84, 214, 173, 231, 186, 144, 187, 25, 151, 175, 110, 106, 111, 21, 255, 0, 200, 211, 168, 127, 215, 95, 233, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 77, 255, 0, 253, 117, 172, 251, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 26, 111, 255, 0, 235, 173, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 58, 135, 253, 118, 172, 235, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 117, 15, 250, 237, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 11, 95, 250, 234, 191, 204, 86, 143, 138, 191, 228, 104, 212, 63, 235, 177, 254, 85, 157, 99, 255, 0, 33, 11, 95, 250, 234, 191, 204, 86, 143, 138, 191, 228, 104, 212, 63, 235, 177, 254, 84, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 214, 179, 236, 191, 228, 35, 109, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 103, 212, 63, 235, 173, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 58, 135, 253, 118, 172, 235, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 117, 15, 250, 237, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 191, 165, 103, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 211, 168, 127, 215, 111, 233, 64, 25, 20, 232, 165, 150, 218, 81, 52, 18, 178, 72, 58, 16, 105, 180, 82, 209, 171, 48, 58, 59, 31, 24, 94, 218, 71, 182, 113, 246, 142, 122, 183, 90, 233, 116, 255, 0, 19, 105, 247, 203, 26, 179, 249, 114, 158, 8, 60, 15, 206, 188, 222, 138, 240, 113, 124, 59, 130, 196, 47, 113, 114, 190, 232, 184, 214, 146, 61, 129, 101, 73, 70, 81, 149, 199, 177, 205, 58, 188, 154, 207, 80, 190, 178, 63, 232, 247, 12, 159, 67, 214, 183, 172, 252, 109, 115, 16, 9, 113, 2, 201, 254, 214, 121, 175, 154, 197, 112, 158, 38, 18, 253, 199, 188, 142, 133, 89, 61, 206, 238, 138, 197, 180, 241, 70, 153, 114, 184, 243, 182, 158, 225, 134, 57, 173, 120, 229, 138, 95, 245, 82, 198, 223, 67, 154, 249, 201, 225, 43, 195, 226, 139, 251, 141, 46, 137, 104, 162, 155, 92, 197, 142, 162, 138, 41, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 222, 213, 243, 110, 165, 255, 0, 33, 59, 175, 250, 234, 223, 206, 190, 146, 237, 95, 54, 234, 95, 242, 19, 186, 255, 0, 174, 173, 252, 235, 233, 248, 115, 122, 191, 47, 212, 250, 110, 28, 248, 234, 124, 138, 148, 81, 69, 125, 73, 245, 97, 69, 20, 80, 48, 162, 138, 40, 0, 162, 138, 40, 0, 175, 164, 244, 191, 249, 5, 90, 127, 215, 21, 254, 85, 243, 101, 125, 39, 165, 255, 0, 200, 42, 211, 254, 184, 175, 242, 175, 155, 226, 47, 225, 195, 213, 159, 47, 196, 187, 82, 249, 254, 133, 202, 40, 162, 190, 76, 249, 80, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 109, 0, 58, 138, 40, 160, 6, 209, 77, 105, 81, 51, 189, 213, 113, 215, 38, 178, 238, 124, 71, 166, 90, 238, 87, 159, 37, 78, 14, 222, 107, 166, 56, 122, 211, 248, 34, 223, 200, 158, 116, 107, 83, 75, 44, 95, 51, 144, 163, 212, 154, 226, 175, 124, 109, 43, 41, 91, 88, 0, 200, 251, 199, 173, 96, 94, 106, 247, 247, 164, 121, 247, 50, 50, 231, 56, 244, 175, 162, 194, 240, 174, 46, 163, 94, 219, 68, 100, 235, 37, 177, 232, 23, 254, 35, 211, 172, 50, 26, 109, 238, 7, 69, 230, 185, 139, 223, 25, 221, 79, 22, 203, 104, 68, 25, 255, 0, 150, 153, 230, 185, 170, 43, 233, 112, 156, 55, 130, 195, 223, 157, 123, 79, 83, 9, 86, 108, 150, 226, 234, 123, 217, 55, 220, 204, 210, 55, 76, 147, 81, 81, 69, 125, 2, 138, 138, 81, 91, 25, 147, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 207, 168, 127, 215, 90, 206, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 180, 192, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 235, 89, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 51, 234, 31, 245, 214, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 199, 254, 66, 54, 223, 245, 213, 127, 157, 104, 248, 171, 254, 70, 139, 255, 0, 250, 235, 89, 246, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 67, 197, 95, 242, 52, 95, 255, 0, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 191, 249, 26, 117, 15, 250, 235, 253, 43, 58, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 175, 254, 70, 157, 67, 254, 186, 255, 0, 74, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 101, 254, 117, 163, 226, 175, 249, 25, 245, 15, 250, 237, 89, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 52, 106, 31, 245, 216, 208, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 88, 255, 0, 200, 74, 219, 254, 187, 47, 243, 173, 31, 21, 127, 200, 209, 127, 255, 0, 93, 107, 62, 199, 254, 66, 86, 223, 245, 217, 127, 157, 104, 120, 171, 254, 70, 139, 255, 0, 250, 235, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 94, 209, 175, 39, 177, 213, 173, 158, 222, 82, 132, 184, 83, 142, 224, 154, 246, 11, 93, 90, 210, 230, 250, 230, 201, 100, 196, 240, 62, 25, 79, 244, 175, 23, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 90, 222, 34, 184, 158, 207, 198, 55, 211, 219, 202, 82, 69, 155, 32, 138, 0, 246, 58, 43, 140, 240, 239, 142, 33, 188, 197, 182, 163, 136, 166, 232, 27, 177, 174, 193, 29, 100, 93, 202, 192, 131, 208, 138, 0, 125, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 116, 230, 185, 109, 123, 198, 150, 154, 90, 24, 173, 136, 158, 235, 208, 116, 20, 1, 179, 168, 106, 246, 122, 98, 175, 218, 36, 249, 152, 133, 85, 239, 205, 121, 103, 140, 175, 39, 184, 241, 21, 212, 82, 202, 76, 80, 54, 212, 30, 149, 79, 237, 247, 26, 166, 179, 12, 215, 78, 93, 140, 171, 215, 183, 53, 63, 138, 191, 228, 104, 191, 255, 0, 174, 180, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 185, 240, 7, 252, 141, 254, 60, 255, 0, 176, 170, 255, 0, 232, 186, 225, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 215, 115, 224, 15, 249, 27, 252, 121, 255, 0, 97, 85, 255, 0, 209, 116, 1, 232, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 112, 31, 23, 255, 0, 228, 81, 179, 255, 0, 176, 173, 167, 254, 140, 21, 203, 120, 171, 254, 70, 141, 67, 254, 187, 26, 234, 126, 47, 255, 0, 200, 163, 103, 255, 0, 97, 91, 79, 253, 24, 43, 150, 241, 87, 252, 141, 26, 135, 253, 118, 52, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 246, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 67, 197, 95, 242, 51, 234, 31, 245, 214, 179, 236, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 103, 212, 63, 235, 173, 0, 99, 87, 69, 162, 120, 182, 251, 71, 219, 25, 62, 125, 184, 255, 0, 150, 108, 122, 87, 63, 69, 0, 123, 30, 145, 226, 173, 55, 86, 76, 71, 40, 142, 78, 232, 252, 86, 231, 81, 145, 210, 190, 126, 228, 28, 131, 130, 58, 17, 91, 250, 119, 140, 117, 109, 59, 229, 51, 27, 136, 199, 240, 201, 64, 30, 197, 69, 113, 182, 31, 16, 172, 38, 192, 189, 71, 133, 189, 134, 69, 116, 86, 186, 222, 157, 118, 63, 115, 117, 23, 226, 216, 160, 13, 10, 41, 162, 69, 127, 186, 67, 125, 13, 59, 7, 210, 128, 10, 40, 162, 128, 10, 40, 199, 181, 5, 130, 245, 56, 250, 208, 1, 69, 82, 185, 213, 172, 45, 6, 102, 186, 136, 127, 192, 134, 107, 159, 189, 241, 254, 153, 111, 149, 182, 13, 51, 251, 140, 10, 0, 235, 107, 43, 83, 241, 14, 155, 165, 68, 90, 226, 112, 79, 247, 84, 228, 215, 155, 234, 62, 56, 212, 245, 12, 164, 71, 236, 168, 123, 37, 115, 142, 207, 43, 23, 119, 44, 199, 169, 38, 128, 58, 157, 107, 199, 23, 186, 142, 97, 180, 63, 103, 135, 166, 71, 82, 43, 149, 250, 243, 78, 162, 128, 38, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 43, 255, 0, 145, 167, 80, 255, 0, 174, 191, 210, 179, 172, 127, 228, 35, 107, 255, 0, 93, 151, 249, 214, 143, 138, 255, 0, 228, 105, 212, 63, 235, 175, 244, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 167, 80, 255, 0, 174, 181, 159, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 78, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 105, 212, 63, 235, 181, 103, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 211, 168, 127, 215, 106, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 90, 255, 0, 215, 85, 254, 98, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 143, 242, 172, 235, 31, 249, 8, 90, 255, 0, 215, 85, 254, 98, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 143, 242, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 149, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 159, 99, 255, 0, 33, 43, 111, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 105, 212, 63, 235, 181, 103, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 211, 168, 127, 215, 106, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 107, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 53, 15, 250, 235, 253, 43, 58, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 141, 67, 254, 186, 255, 0, 74, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 169, 160, 188, 184, 182, 193, 130, 102, 77, 167, 35, 6, 161, 162, 148, 162, 164, 185, 90, 208, 14, 147, 78, 241, 86, 162, 46, 160, 134, 82, 38, 12, 193, 78, 238, 249, 61, 107, 162, 189, 241, 61, 149, 134, 175, 61, 149, 194, 176, 72, 78, 55, 1, 156, 215, 159, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 21, 167, 226, 175, 249, 26, 117, 15, 250, 235, 94, 61, 108, 135, 1, 85, 89, 66, 207, 185, 126, 214, 72, 238, 109, 181, 205, 62, 235, 103, 149, 112, 160, 176, 207, 204, 113, 87, 35, 154, 39, 0, 164, 170, 223, 67, 154, 242, 26, 158, 11, 235, 171, 96, 60, 137, 217, 54, 156, 140, 26, 241, 42, 240, 132, 44, 221, 58, 154, 155, 42, 239, 169, 235, 116, 87, 155, 65, 226, 173, 86, 44, 171, 77, 230, 100, 245, 110, 213, 165, 15, 142, 167, 202, 249, 214, 138, 19, 185, 7, 154, 242, 37, 194, 185, 130, 217, 39, 243, 43, 219, 68, 237, 232, 174, 110, 31, 26, 233, 229, 143, 156, 36, 78, 56, 192, 205, 93, 183, 241, 38, 149, 114, 9, 89, 241, 143, 239, 12, 87, 149, 91, 44, 197, 209, 118, 156, 25, 175, 180, 139, 53, 232, 170, 241, 234, 54, 82, 174, 86, 226, 44, 127, 189, 82, 44, 209, 73, 247, 101, 141, 190, 141, 154, 230, 120, 122, 203, 120, 191, 184, 119, 68, 157, 171, 230, 221, 79, 254, 66, 183, 95, 245, 213, 191, 157, 125, 35, 144, 122, 28, 215, 205, 218, 145, 31, 218, 119, 95, 245, 217, 191, 157, 125, 7, 15, 38, 157, 91, 174, 223, 169, 244, 252, 53, 252, 74, 159, 34, 165, 20, 184, 52, 96, 215, 211, 31, 89, 102, 37, 20, 184, 52, 96, 208, 61, 68, 162, 151, 6, 140, 26, 160, 212, 74, 41, 112, 104, 193, 169, 21, 152, 149, 244, 158, 151, 255, 0, 32, 155, 79, 250, 226, 191, 202, 190, 108, 175, 164, 180, 194, 63, 178, 109, 57, 255, 0, 150, 43, 252, 171, 231, 184, 133, 55, 78, 9, 119, 103, 203, 241, 46, 212, 190, 127, 161, 110, 138, 107, 76, 145, 174, 89, 213, 71, 185, 168, 154, 250, 209, 87, 38, 230, 44, 15, 246, 133, 124, 210, 195, 213, 123, 69, 253, 199, 202, 93, 19, 211, 171, 34, 127, 17, 105, 182, 209, 239, 51, 238, 29, 62, 94, 77, 80, 155, 198, 122, 118, 209, 228, 121, 140, 115, 206, 69, 116, 81, 203, 113, 85, 157, 161, 6, 39, 82, 39, 73, 70, 43, 140, 159, 199, 14, 178, 126, 230, 209, 89, 113, 212, 154, 203, 184, 241, 94, 167, 58, 225, 37, 242, 114, 120, 43, 94, 172, 120, 91, 48, 125, 23, 222, 101, 237, 162, 122, 43, 58, 196, 9, 102, 11, 142, 185, 56, 170, 87, 58, 197, 133, 175, 250, 219, 133, 63, 238, 156, 215, 154, 93, 106, 23, 183, 95, 241, 241, 115, 35, 228, 96, 243, 85, 71, 21, 235, 209, 225, 8, 184, 222, 173, 75, 50, 93, 126, 200, 244, 1, 227, 27, 22, 184, 138, 27, 116, 102, 222, 112, 73, 29, 57, 170, 30, 33, 241, 29, 245, 158, 175, 113, 103, 0, 8, 145, 54, 192, 71, 127, 122, 229, 236, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 102, 212, 63, 235, 173, 123, 84, 56, 127, 1, 74, 54, 112, 191, 169, 139, 171, 38, 80, 184, 212, 46, 239, 24, 253, 162, 226, 71, 200, 199, 94, 181, 86, 157, 69, 123, 52, 233, 198, 154, 229, 138, 178, 32, 40, 162, 138, 160, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 159, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 62, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 103, 212, 63, 235, 173, 103, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 207, 168, 127, 215, 90, 0, 200, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 2, 123, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 26, 47, 255, 0, 235, 173, 103, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 209, 127, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 255, 0, 228, 105, 212, 63, 235, 175, 244, 172, 235, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 163, 226, 191, 249, 26, 117, 15, 250, 235, 253, 40, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 104, 212, 63, 235, 177, 172, 251, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 161, 226, 175, 249, 26, 53, 15, 250, 236, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 37, 109, 255, 0, 93, 151, 249, 214, 135, 138, 191, 228, 104, 191, 255, 0, 174, 181, 159, 99, 255, 0, 33, 43, 111, 250, 236, 191, 206, 180, 60, 85, 255, 0, 35, 69, 255, 0, 253, 117, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 163, 80, 255, 0, 174, 191, 210, 179, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 104, 212, 63, 235, 175, 244, 160, 12, 106, 232, 116, 79, 23, 223, 233, 27, 99, 39, 237, 22, 227, 254, 89, 177, 233, 88, 20, 80, 7, 177, 233, 30, 42, 211, 117, 104, 254, 73, 68, 114, 119, 87, 226, 183, 50, 8, 200, 228, 87, 207, 195, 32, 228, 28, 99, 161, 21, 191, 167, 120, 199, 85, 211, 120, 243, 126, 209, 24, 255, 0, 150, 114, 80, 7, 177, 81, 92, 109, 135, 196, 45, 62, 108, 11, 212, 120, 27, 216, 100, 87, 67, 107, 173, 233, 215, 99, 247, 55, 113, 31, 171, 98, 128, 52, 104, 166, 9, 22, 79, 186, 193, 190, 134, 159, 131, 233, 64, 5, 20, 81, 64, 5, 20, 99, 218, 130, 66, 245, 56, 250, 208, 1, 69, 82, 184, 213, 108, 45, 6, 102, 186, 136, 127, 192, 134, 107, 158, 189, 241, 254, 153, 111, 145, 108, 26, 87, 247, 24, 20, 1, 215, 86, 94, 167, 226, 13, 59, 74, 136, 155, 137, 193, 63, 221, 83, 147, 94, 109, 168, 248, 223, 83, 191, 202, 196, 126, 202, 135, 178, 87, 61, 35, 60, 172, 93, 220, 180, 135, 169, 38, 128, 58, 141, 111, 198, 247, 186, 134, 248, 109, 137, 183, 135, 166, 71, 82, 43, 148, 247, 60, 154, 117, 20, 1, 53, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 23, 255, 0, 245, 214, 179, 236, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 104, 191, 255, 0, 174, 180, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 186, 240, 7, 252, 141, 254, 60, 255, 0, 176, 170, 255, 0, 232, 186, 225, 108, 127, 228, 35, 107, 255, 0, 93, 87, 249, 215, 117, 224, 15, 249, 27, 252, 121, 255, 0, 97, 85, 255, 0, 209, 116, 1, 223, 209, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 231, 255, 0, 23, 255, 0, 228, 80, 179, 255, 0, 176, 173, 167, 254, 140, 21, 203, 248, 171, 254, 70, 141, 67, 254, 187, 26, 234, 62, 47, 255, 0, 200, 161, 103, 255, 0, 97, 91, 79, 253, 24, 43, 151, 241, 87, 252, 141, 26, 135, 253, 118, 52, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 246, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 67, 197, 95, 242, 51, 234, 31, 245, 214, 179, 236, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 103, 212, 63, 235, 173, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 83, 121, 206, 122, 31, 99, 78, 162, 128, 46, 195, 173, 234, 112, 113, 13, 236, 171, 248, 213, 248, 124, 99, 173, 195, 214, 241, 159, 235, 88, 116, 80, 7, 93, 101, 227, 157, 78, 75, 184, 98, 109, 132, 59, 128, 127, 58, 183, 175, 248, 203, 82, 177, 214, 110, 172, 224, 218, 22, 39, 192, 174, 50, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 186, 208, 5, 137, 124, 103, 173, 73, 210, 232, 167, 210, 168, 75, 174, 234, 243, 255, 0, 173, 191, 148, 254, 53, 159, 69, 0, 33, 38, 86, 203, 146, 79, 169, 52, 180, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 88, 127, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 255, 0, 200, 211, 168, 127, 215, 95, 233, 89, 214, 31, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 127, 242, 52, 234, 31, 245, 215, 250, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 211, 168, 127, 215, 90, 207, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 167, 80, 255, 0, 174, 180, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 95, 242, 52, 234, 31, 245, 218, 179, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 191, 228, 105, 212, 63, 235, 181, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 143, 252, 132, 45, 127, 235, 170, 255, 0, 49, 90, 62, 42, 255, 0, 145, 167, 80, 255, 0, 174, 223, 210, 179, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 138, 209, 241, 87, 252, 141, 58, 135, 253, 118, 254, 148, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 246, 63, 242, 18, 182, 255, 0, 174, 171, 252, 235, 67, 197, 95, 242, 51, 234, 31, 245, 214, 179, 236, 127, 228, 37, 109, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 103, 212, 63, 235, 173, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 58, 135, 253, 118, 172, 235, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 117, 15, 250, 237, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 70, 161, 255, 0, 93, 127, 165, 103, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 209, 168, 127, 215, 95, 233, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 79, 99, 255, 0, 33, 27, 111, 250, 234, 191, 204, 86, 135, 138, 191, 228, 103, 212, 63, 235, 173, 103, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 21, 161, 226, 175, 249, 25, 245, 15, 250, 235, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 55, 31, 95, 206, 172, 67, 115, 53, 191, 16, 202, 202, 15, 92, 30, 181, 13, 20, 63, 121, 90, 64, 105, 88, 106, 151, 255, 0, 218, 54, 227, 237, 82, 13, 210, 0, 121, 236, 77, 87, 241, 38, 139, 167, 219, 248, 142, 253, 18, 214, 48, 162, 83, 138, 101, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 208, 241, 87, 252, 140, 250, 135, 253, 118, 254, 149, 135, 213, 168, 223, 155, 149, 92, 222, 142, 38, 181, 31, 225, 74, 199, 45, 46, 137, 106, 239, 242, 141, 158, 194, 155, 253, 131, 111, 253, 243, 90, 148, 83, 246, 20, 187, 29, 95, 218, 248, 235, 127, 21, 153, 95, 216, 22, 223, 222, 52, 127, 96, 91, 127, 120, 214, 173, 20, 189, 133, 46, 195, 254, 217, 199, 255, 0, 207, 214, 101, 127, 96, 91, 127, 120, 209, 253, 129, 109, 253, 227, 90, 180, 81, 236, 41, 118, 15, 237, 156, 127, 252, 253, 102, 87, 246, 21, 183, 247, 141, 57, 116, 59, 80, 192, 156, 156, 118, 53, 167, 69, 30, 194, 151, 97, 60, 223, 30, 213, 189, 171, 33, 179, 210, 180, 247, 188, 183, 71, 181, 82, 173, 42, 131, 249, 215, 75, 226, 59, 203, 171, 109, 122, 234, 214, 11, 134, 72, 96, 59, 99, 65, 209, 71, 165, 99, 216, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 15, 21, 127, 200, 211, 168, 127, 215, 95, 233, 75, 234, 212, 111, 119, 29, 142, 106, 184, 170, 245, 180, 171, 43, 153, 211, 94, 92, 78, 184, 154, 121, 24, 122, 19, 85, 241, 245, 252, 233, 212, 87, 66, 74, 42, 200, 231, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 162, 255, 0, 254, 186, 214, 125, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 141, 23, 255, 0, 245, 214, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 195, 254, 66, 22, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 186, 214, 117, 135, 252, 132, 45, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 140, 250, 135, 253, 117, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 176, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 181, 157, 97, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 104, 3, 34, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 9, 236, 127, 228, 35, 109, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 104, 191, 255, 0, 174, 181, 159, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 69, 255, 0, 253, 117, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 38, 176, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 43, 255, 0, 145, 167, 80, 255, 0, 174, 191, 210, 179, 172, 63, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 255, 0, 228, 105, 212, 63, 235, 175, 244, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 163, 80, 255, 0, 174, 198, 179, 236, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 104, 212, 63, 235, 177, 160, 12, 138, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 39, 177, 255, 0, 144, 149, 183, 253, 118, 95, 231, 90, 30, 42, 255, 0, 145, 162, 255, 0, 254, 186, 214, 125, 143, 252, 132, 173, 191, 235, 178, 255, 0, 58, 208, 241, 87, 252, 141, 23, 255, 0, 245, 214, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 154, 199, 254, 66, 22, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 141, 67, 254, 186, 255, 0, 74, 206, 177, 255, 0, 144, 133, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 163, 80, 255, 0, 174, 191, 210, 128, 50, 40, 162, 138, 0, 40, 162, 138, 0, 41, 163, 142, 71, 7, 216, 211, 168, 160, 11, 209, 107, 90, 156, 28, 67, 127, 42, 254, 53, 122, 31, 24, 235, 112, 245, 189, 103, 255, 0, 122, 176, 232, 160, 14, 186, 203, 199, 58, 156, 151, 112, 196, 193, 72, 119, 0, 231, 235, 86, 245, 223, 25, 106, 86, 58, 197, 213, 164, 59, 54, 70, 248, 6, 184, 203, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 117, 15, 250, 235, 64, 22, 37, 241, 158, 181, 39, 75, 162, 159, 74, 163, 46, 189, 171, 79, 254, 182, 254, 83, 248, 214, 117, 20, 0, 141, 153, 91, 46, 73, 62, 164, 210, 209, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 79, 99, 255, 0, 33, 27, 111, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 69, 255, 0, 253, 117, 172, 251, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 26, 47, 255, 0, 235, 173, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 238, 188, 1, 255, 0, 35, 127, 143, 63, 236, 42, 191, 250, 46, 184, 91, 31, 249, 8, 218, 255, 0, 215, 85, 254, 117, 221, 120, 3, 254, 70, 255, 0, 30, 127, 216, 85, 127, 244, 93, 0, 119, 244, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 121, 255, 0, 197, 255, 0, 249, 20, 44, 255, 0, 236, 43, 105, 255, 0, 163, 5, 114, 254, 42, 255, 0, 145, 163, 80, 255, 0, 174, 198, 186, 143, 139, 255, 0, 242, 40, 89, 255, 0, 216, 86, 211, 255, 0, 70, 10, 229, 252, 85, 255, 0, 35, 70, 161, 255, 0, 93, 141, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 61, 143, 252, 132, 109, 191, 235, 170, 255, 0, 58, 208, 241, 87, 252, 140, 250, 135, 253, 117, 172, 251, 31, 249, 8, 219, 127, 215, 85, 254, 117, 161, 226, 175, 249, 25, 245, 15, 250, 235, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 107, 58, 199, 254, 66, 54, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 186, 208, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 88, 127, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 255, 0, 200, 211, 168, 127, 215, 95, 233, 89, 214, 31, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 127, 242, 52, 234, 31, 245, 215, 250, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 211, 168, 127, 215, 90, 207, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 167, 80, 255, 0, 174, 180, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 127, 242, 52, 106, 31, 245, 218, 179, 172, 127, 228, 35, 107, 255, 0, 93, 87, 249, 214, 143, 138, 255, 0, 228, 104, 212, 63, 235, 181, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 143, 252, 132, 45, 127, 235, 170, 255, 0, 49, 90, 62, 42, 255, 0, 145, 167, 80, 255, 0, 174, 223, 210, 179, 172, 127, 228, 33, 107, 255, 0, 93, 87, 249, 138, 209, 241, 87, 252, 141, 58, 135, 253, 118, 254, 148, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 246, 63, 242, 18, 182, 255, 0, 174, 171, 252, 235, 67, 197, 95, 242, 51, 234, 31, 245, 214, 179, 236, 127, 228, 37, 109, 255, 0, 93, 87, 249, 214, 135, 138, 191, 228, 103, 212, 63, 235, 173, 0, 100, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 1, 53, 143, 252, 132, 45, 127, 235, 170, 255, 0, 58, 209, 241, 87, 252, 141, 58, 135, 253, 118, 172, 235, 31, 249, 8, 90, 255, 0, 215, 85, 254, 117, 163, 226, 175, 249, 26, 117, 15, 250, 237, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 97, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 70, 161, 255, 0, 93, 127, 165, 103, 88, 127, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 209, 168, 127, 215, 95, 233, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 79, 99, 255, 0, 33, 27, 111, 250, 234, 191, 204, 86, 135, 138, 191, 228, 103, 212, 63, 235, 173, 103, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 21, 161, 226, 175, 249, 25, 245, 15, 250, 235, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 79, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 180, 60, 85, 255, 0, 35, 78, 161, 255, 0, 93, 191, 165, 103, 216, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 15, 21, 127, 200, 211, 168, 127, 215, 111, 233, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 107, 58, 199, 254, 66, 22, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 157, 67, 254, 186, 208, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 209, 127, 255, 0, 93, 107, 62, 199, 254, 66, 54, 223, 245, 213, 127, 157, 104, 120, 171, 254, 70, 139, 255, 0, 250, 235, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 97, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 62, 161, 255, 0, 93, 107, 58, 195, 254, 66, 22, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 125, 67, 254, 186, 208, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 207, 168, 127, 215, 90, 206, 177, 255, 0, 144, 141, 175, 253, 117, 95, 231, 90, 62, 42, 255, 0, 145, 159, 80, 255, 0, 174, 180, 1, 145, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 4, 246, 63, 242, 17, 182, 255, 0, 174, 171, 252, 235, 67, 197, 95, 242, 52, 95, 255, 0, 215, 90, 207, 177, 255, 0, 144, 141, 183, 253, 117, 95, 231, 90, 30, 42, 255, 0, 145, 162, 255, 0, 254, 186, 208, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 88, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 31, 21, 255, 0, 200, 211, 168, 127, 215, 95, 233, 89, 214, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 71, 197, 127, 242, 52, 234, 31, 245, 215, 250, 80, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 70, 215, 254, 186, 175, 243, 173, 15, 21, 127, 200, 209, 168, 127, 215, 99, 89, 246, 63, 242, 17, 181, 255, 0, 174, 171, 252, 235, 67, 197, 95, 242, 52, 106, 31, 245, 216, 208, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 74, 219, 254, 187, 47, 243, 173, 15, 21, 127, 200, 209, 127, 255, 0, 93, 107, 62, 199, 254, 66, 86, 223, 245, 217, 127, 157, 104, 120, 171, 254, 70, 139, 255, 0, 250, 235, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 70, 161, 255, 0, 93, 127, 165, 103, 88, 255, 0, 200, 66, 215, 254, 186, 175, 243, 173, 31, 21, 127, 200, 209, 168, 127, 215, 95, 233, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 11, 95, 250, 234, 191, 206, 180, 124, 85, 255, 0, 35, 78, 161, 255, 0, 93, 107, 58, 199, 254, 66, 22, 191, 245, 213, 127, 157, 104, 248, 171, 254, 70, 157, 67, 254, 186, 208, 6, 69, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 19, 216, 255, 0, 200, 70, 219, 254, 186, 175, 243, 173, 15, 21, 127, 200, 209, 127, 255, 0, 93, 107, 62, 199, 254, 66, 54, 223, 245, 213, 127, 157, 104, 120, 171, 254, 70, 139, 255, 0, 250, 235, 64, 25, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 77, 99, 255, 0, 33, 27, 95, 250, 234, 191, 206, 187, 175, 0, 127, 200, 223, 227, 207, 251, 10, 175, 254, 139, 174, 22, 199, 254, 66, 54, 191, 245, 213, 127, 157, 119, 94, 0, 255, 0, 145, 191, 199, 159, 246, 21, 95, 253, 23, 64, 29, 253, 20, 81, 64, 5, 20, 81, 64, 5, 25, 175, 28, 248, 137, 241, 143, 81, 240, 87, 139, 36, 209, 173, 180, 171, 107, 152, 210, 20, 144, 60, 178, 16, 121, 250, 87, 39, 255, 0, 13, 37, 172, 255, 0, 208, 6, 195, 254, 254, 53, 0, 125, 31, 154, 51, 95, 56, 127, 195, 73, 107, 63, 244, 1, 176, 255, 0, 191, 141, 71, 252, 52, 150, 179, 255, 0, 64, 27, 15, 251, 248, 212, 1, 233, 255, 0, 23, 191, 228, 80, 179, 255, 0, 176, 173, 167, 254, 140, 21, 203, 120, 168, 143, 248, 74, 117, 14, 71, 250, 227, 92, 7, 137, 254, 54, 234, 94, 40, 211, 34, 177, 185, 210, 109, 96, 68, 185, 138, 227, 116, 110, 73, 202, 54, 113, 205, 122, 83, 79, 226, 141, 87, 23, 237, 224, 75, 55, 107, 144, 37, 222, 110, 58, 228, 113, 64, 28, 230, 71, 173, 25, 30, 181, 209, 125, 155, 197, 31, 244, 79, 236, 191, 240, 38, 143, 179, 120, 163, 254, 137, 253, 151, 254, 4, 208, 7, 59, 145, 235, 70, 71, 173, 116, 95, 103, 241, 71, 253, 19, 251, 47, 252, 8, 163, 236, 254, 40, 255, 0, 162, 127, 101, 255, 0, 129, 20, 1, 206, 228, 122, 209, 145, 235, 93, 23, 217, 252, 81, 255, 0, 68, 254, 203, 255, 0, 2, 40, 251, 63, 138, 63, 232, 159, 217, 127, 224, 69, 0, 115, 185, 30, 180, 100, 122, 215, 69, 246, 127, 20, 127, 209, 63, 178, 255, 0, 192, 138, 62, 207, 226, 143, 250, 39, 246, 95, 248, 17, 64, 24, 182, 63, 242, 17, 182, 231, 254, 90, 175, 243, 173, 31, 21, 17, 255, 0, 9, 78, 160, 51, 255, 0, 45, 106, 228, 113, 120, 162, 41, 17, 151, 192, 22, 97, 148, 228, 31, 180, 87, 9, 168, 124, 101, 181, 125, 66, 224, 222, 120, 74, 216, 221, 9, 10, 202, 124, 211, 212, 112, 104, 3, 91, 35, 214, 140, 143, 81, 88, 31, 240, 184, 244, 207, 250, 20, 109, 191, 239, 233, 163, 254, 23, 30, 153, 255, 0, 66, 141, 183, 253, 253, 52, 1, 191, 145, 234, 40, 200, 245, 21, 129, 255, 0, 11, 143, 76, 255, 0, 161, 70, 219, 254, 254, 154, 63, 225, 113, 233, 159, 244, 40, 219, 127, 223, 211, 64, 27, 249, 30, 162, 140, 143, 81, 88, 31, 240, 184, 244, 207, 250, 20, 109, 191, 239, 233, 163, 254, 23, 30, 153, 255, 0, 66, 141, 183, 253, 253, 52, 1, 191, 145, 234, 40, 200, 245, 21, 129, 255, 0, 11, 143, 76, 255, 0, 161, 70, 219, 254, 254, 154, 63, 225, 113, 233, 159, 244, 40, 219, 127, 223, 211, 64, 29, 61, 143, 252, 132, 109, 127, 235, 170, 255, 0, 58, 209, 241, 89, 255, 0, 138, 167, 80, 255, 0, 174, 181, 197, 71, 241, 163, 79, 138, 69, 116, 240, 157, 176, 117, 57, 7, 205, 53, 232, 45, 63, 138, 53, 92, 95, 183, 129, 44, 228, 55, 0, 73, 184, 220, 117, 200, 226, 128, 57, 172, 209, 154, 232, 190, 207, 226, 143, 250, 39, 246, 95, 248, 19, 71, 217, 188, 79, 255, 0, 68, 254, 203, 255, 0, 2, 104, 3, 157, 205, 25, 174, 139, 236, 254, 40, 255, 0, 162, 127, 101, 255, 0, 129, 52, 125, 159, 197, 31, 244, 79, 236, 191, 240, 38, 128, 57, 220, 209, 154, 232, 190, 207, 226, 143, 250, 39, 246, 95, 248, 19, 71, 217, 252, 81, 255, 0, 68, 254, 203, 255, 0, 2, 104, 3, 157, 205, 25, 174, 139, 236, 254, 40, 255, 0, 162, 127, 101, 255, 0, 129, 52, 125, 159, 197, 31, 244, 79, 236, 191, 240, 38, 128, 49, 108, 15, 252, 76, 109, 127, 235, 170, 255, 0, 58, 209, 241, 89, 255, 0, 138, 167, 80, 255, 0, 174, 191, 210, 174, 71, 23, 138, 18, 68, 120, 252, 1, 102, 29, 78, 65, 251, 69, 112, 154, 135, 198, 91, 86, 212, 39, 55, 190, 18, 182, 55, 1, 202, 202, 124, 211, 247, 135, 6, 128, 53, 179, 70, 107, 3, 254, 23, 38, 153, 255, 0, 66, 141, 183, 253, 253, 52, 127, 194, 228, 211, 63, 232, 81, 182, 255, 0, 191, 166, 128, 55, 242, 61, 69, 25, 30, 162, 176, 63, 225, 114, 105, 159, 244, 40, 219, 127, 223, 211, 71, 252, 46, 77, 51, 254, 133, 27, 111, 251, 250, 104, 3, 127, 35, 212, 81, 145, 234, 43, 3, 254, 23, 38, 153, 255, 0, 66, 141, 183, 253, 253, 52, 127, 194, 228, 211, 63, 232, 81, 182, 255, 0, 191, 166, 128, 55, 242, 61, 69, 25, 30, 162, 176, 63, 225, 114, 105, 159, 244, 40, 219, 127, 223, 211, 71, 252, 46, 77, 51, 254, 133, 27, 111, 251, 250, 104, 3, 167, 177, 35, 251, 70, 219, 159, 249, 106, 191, 206, 180, 124, 86, 71, 252, 37, 26, 135, 63, 242, 214, 184, 136, 254, 51, 105, 209, 58, 200, 190, 18, 182, 14, 167, 32, 249, 166, 189, 5, 174, 60, 79, 170, 129, 126, 222, 4, 179, 144, 220, 129, 46, 227, 113, 215, 35, 138, 0, 231, 50, 61, 104, 200, 245, 174, 139, 236, 254, 39, 255, 0, 162, 127, 101, 255, 0, 129, 20, 125, 159, 196, 255, 0, 244, 79, 236, 191, 240, 34, 128, 57, 220, 143, 90, 50, 61, 107, 162, 251, 63, 137, 255, 0, 232, 159, 217, 127, 224, 69, 31, 103, 241, 63, 253, 19, 251, 47, 252, 8, 160, 14, 119, 35, 214, 140, 143, 90, 232, 190, 207, 226, 127, 250, 39, 246, 95, 248, 17, 71, 217, 252, 79, 255, 0, 68, 254, 203, 255, 0, 2, 40, 3, 157, 200, 245, 163, 35, 214, 186, 47, 179, 248, 159, 254, 137, 253, 151, 254, 4, 209, 246, 127, 19, 255, 0, 209, 63, 178, 255, 0, 192, 154, 0, 197, 176, 35, 251, 70, 215, 159, 249, 106, 191, 206, 180, 124, 86, 71, 252, 37, 26, 135, 63, 242, 216, 213, 180, 139, 197, 17, 72, 174, 158, 0, 178, 14, 167, 32, 253, 162, 184, 109, 67, 227, 37, 171, 106, 51, 155, 223, 9, 91, 27, 144, 228, 72, 124, 211, 247, 135, 90, 0, 213, 205, 25, 172, 15, 248, 92, 122, 103, 253, 10, 54, 223, 247, 244, 209, 255, 0, 11, 143, 76, 255, 0, 161, 70, 219, 254, 254, 154, 0, 223, 205, 25, 172, 15, 248, 92, 122, 103, 253, 10, 54, 223, 247, 244, 209, 255, 0, 11, 143, 76, 255, 0, 161, 70, 219, 254, 254, 154, 0, 223, 205, 25, 172, 15, 248, 92, 122, 103, 253, 10, 54, 223, 247, 244, 209, 255, 0, 11, 143, 76, 255, 0, 161, 70, 219, 254, 254, 154, 0, 223, 205, 25, 172, 15, 248, 92, 122, 103, 253, 10, 54, 223, 247, 244, 209, 255, 0, 11, 143, 76, 255, 0, 161, 70, 219, 254, 254, 154, 0, 233, 236, 79, 252, 76, 109, 127, 235, 170, 255, 0, 49, 90, 30, 42, 35, 254, 18, 157, 67, 159, 249, 109, 253, 43, 139, 143, 227, 70, 159, 20, 138, 233, 225, 59, 96, 234, 114, 15, 154, 107, 191, 105, 252, 81, 170, 227, 80, 111, 2, 89, 200, 110, 64, 151, 113, 184, 235, 145, 197, 0, 115, 153, 30, 180, 100, 122, 215, 69, 246, 127, 20, 127, 209, 63, 178, 255, 0, 192, 154, 62, 207, 226, 143, 250, 39, 246, 95, 248, 19, 64, 28, 238, 71, 173, 25, 30, 181, 209, 125, 159, 197, 31, 244, 79, 236, 191, 240, 34, 143, 179, 248, 163, 254, 137, 253, 151, 254, 4, 80, 7, 59, 145, 235, 70, 71, 173, 116, 95, 103, 241, 71, 253, 19, 251, 47, 252, 8, 163, 236, 254, 40, 255, 0, 162, 127, 101, 255, 0, 129, 20, 1, 206, 228, 122, 138, 50, 61, 69, 116, 95, 103, 241, 71, 253, 19, 251, 47, 252, 9, 163, 236, 254, 40, 255, 0, 162, 127, 101, 255, 0, 129, 52, 1, 139, 99, 143, 237, 27, 110, 127, 229, 170, 255, 0, 58, 209, 241, 81, 31, 240, 148, 106, 28, 255, 0, 203, 90, 183, 28, 94, 40, 142, 69, 100, 240, 5, 152, 101, 57, 7, 237, 21, 194, 234, 31, 25, 109, 155, 80, 156, 222, 248, 78, 216, 221, 9, 8, 148, 249, 167, 239, 14, 40, 3, 91, 35, 212, 81, 145, 234, 43, 3, 254, 23, 30, 153, 255, 0, 66, 141, 183, 253, 253, 52, 127, 194, 227, 211, 63, 232, 81, 182, 255, 0, 191, 166, 128, 55, 242, 61, 69, 25, 30, 162, 176, 63, 225, 113, 233, 159, 244, 40, 219, 127, 223, 211, 71, 252, 46, 61, 51, 254, 133, 27, 111, 251, 250, 104, 3, 127, 35, 212, 81, 145, 234, 43, 3, 254, 23, 30, 153, 255, 0, 66, 141, 183, 253, 253, 52, 127, 194, 227, 211, 63, 232, 81, 182, 255, 0, 191, 166, 128, 55, 242, 61, 69, 25, 30, 162, 176, 63, 225, 113, 233, 159, 244, 40, 219, 127, 223, 211, 71, 252, 46, 61, 51, 254, 133, 27, 111, 251, 250, 104, 3, 167, 177, 35, 251, 70, 215, 159, 249, 106, 191, 206, 180, 124, 86, 127, 226, 169, 212, 63, 235, 181, 113, 75, 241, 163, 79, 138, 69, 145, 60, 39, 108, 25, 78, 65, 243, 77, 122, 11, 79, 226, 141, 87, 23, 237, 224, 75, 57, 13, 192, 18, 110, 55, 29, 114, 56, 160, 14, 107, 52, 102, 186, 47, 179, 248, 163, 254, 137, 253, 151, 254, 4, 209, 246, 127, 20, 127, 209, 63, 178, 255, 0, 192, 154, 0, 231, 115, 70, 107, 162, 251, 63, 138, 63, 232, 159, 217, 127, 224, 77, 31, 103, 241, 71, 253, 19, 251, 47, 252, 9, 160, 14, 119, 52, 102, 186, 47, 179, 248, 163, 254, 137, 253, 151, 254, 4, 209, 246, 127, 20, 127, 209, 63, 178, 255, 0, 192, 154, 0, 231, 115, 70, 107, 162, 251, 63, 138, 63, 232, 159, 217, 127, 224, 77, 31, 103, 241, 71, 253, 19, 251, 47, 252, 9, 160, 12, 91, 2, 63, 180, 109, 121, 255, 0, 150, 171, 252, 235, 67, 197, 71, 254, 42, 157, 67, 254, 186, 255, 0, 74, 187, 28, 94, 40, 73, 17, 227, 240, 5, 152, 117, 57, 7, 237, 21, 194, 106, 31, 25, 109, 91, 80, 156, 222, 248, 74, 216, 220, 7, 43, 41, 243, 79, 222, 28, 26, 0, 214, 227, 214, 142, 61, 107, 3, 254, 23, 30, 153, 255, 0, 66, 141, 183, 253, 253, 52, 127, 194, 227, 211, 63, 232, 81, 182, 255, 0, 191, 166, 128, 55, 248, 245, 163, 143, 90, 192, 255, 0, 133, 199, 166, 127, 208, 163, 109, 255, 0, 127, 77, 31, 240, 184, 244, 207, 250, 20, 109, 191, 239, 233, 160, 13, 254, 61, 104, 227, 214, 176, 63, 225, 113, 233, 159, 244, 40, 219, 127, 223, 211, 71, 252, 46, 61, 51, 254, 133, 27, 111, 251, 250, 104, 3, 127, 143, 90, 56, 245, 172, 15, 248, 92, 122, 103, 253, 10, 54, 223, 247, 244, 209, 255, 0, 11, 143, 76, 255, 0, 161, 70, 219, 254, 254, 154, 0, 233, 236, 72, 254, 209, 182, 231, 254, 90, 175, 243, 21, 163, 226, 162, 63, 225, 40, 212, 57, 255, 0, 150, 181, 196, 39, 198, 93, 58, 57, 21, 215, 194, 118, 193, 212, 228, 31, 52, 215, 160, 181, 199, 137, 245, 80, 53, 6, 240, 37, 156, 134, 228, 9, 119, 27, 142, 185, 28, 80, 7, 57, 145, 235, 70, 71, 173, 116, 95, 103, 241, 63, 253, 19, 251, 47, 252, 8, 163, 236, 254, 39, 255, 0, 162, 127, 101, 255, 0, 129, 20, 1, 206, 228, 122, 209, 145, 235, 93, 23, 217, 252, 79, 255, 0, 68, 254, 203, 255, 0, 2, 40, 251, 63, 137, 255, 0, 232, 159, 217, 127, 224, 69, 0, 115, 185, 30, 180, 100, 122, 215, 69, 246, 127, 19, 255, 0, 209, 63, 178, 255, 0, 192, 138, 62, 207, 226, 127, 250, 39, 246, 95, 248, 17, 64, 28, 238, 71, 173, 25, 30, 181, 209, 125, 159, 196, 255, 0, 244, 79, 236, 191, 240, 38, 143, 179, 248, 159, 254, 137, 253, 151, 254, 4, 208, 6, 45, 129, 31, 218, 54, 188, 255, 0, 203, 85, 254, 117, 163, 226, 162, 63, 225, 41, 212, 57, 255, 0, 150, 213, 114, 56, 188, 81, 19, 171, 167, 128, 44, 195, 41, 200, 63, 104, 174, 23, 80, 248, 201, 106, 218, 140, 230, 247, 194, 86, 198, 228, 57, 18, 31, 52, 253, 225, 214, 128, 53, 115, 70, 107, 3, 254, 23, 30, 149, 255, 0, 66, 141, 183, 253, 253, 52, 127, 194, 227, 210, 191, 232, 81, 182, 255, 0, 191, 166, 128, 55, 243, 70, 107, 3, 254, 23, 30, 149, 255, 0, 66, 141, 183, 253, 253, 52, 127, 194, 227, 210, 191, 232, 81, 182, 255, 0, 191, 166, 128, 55, 243, 70, 107, 3, 254, 23, 30, 149, 255, 0, 66, 141, 183, 253, 253, 52, 127, 194, 227, 210, 191, 232, 81, 182, 255, 0, 191, 166, 128, 55, 243, 70, 107, 3, 254, 23, 30, 149, 255, 0, 66, 141, 183, 253, 253, 52, 127, 194, 227, 210, 191, 232, 81, 182, 255, 0, 191, 166, 128, 58, 123, 18, 63, 180, 109, 121, 255, 0, 150, 171, 252, 235, 67, 197, 68, 127, 194, 83, 168, 114, 63, 214, 215, 22, 159, 25, 244, 232, 228, 87, 79, 9, 91, 7, 83, 144, 124, 211, 93, 249, 159, 197, 26, 174, 53, 6, 240, 37, 155, 155, 144, 36, 220, 110, 58, 228, 113, 64, 28, 230, 71, 173, 25, 30, 181, 209, 125, 159, 197, 31, 244, 79, 236, 191, 240, 38, 143, 179, 248, 163, 254, 137, 253, 151, 254, 4, 208, 7, 59, 145, 235, 70, 71, 173, 116, 95, 103, 241, 71, 253, 19, 251, 47, 252, 8, 163, 236, 254, 40, 255, 0, 162, 127, 101, 255, 0, 129, 20, 1, 206, 228, 122, 209, 145, 235, 93, 23, 217, 252, 81, 255, 0, 68, 254, 203, 255, 0, 2, 40, 251, 63, 138, 63, 232, 159, 217, 127, 224, 69, 0, 115, 185, 30, 162, 140, 143, 81, 93, 23, 217, 252, 81, 255, 0, 68, 254, 203, 255, 0, 2, 40, 251, 63, 138, 63, 232, 159, 217, 127, 224, 69, 0, 98, 216, 145, 253, 163, 109, 207, 252, 181, 95, 231, 90, 62, 42, 35, 254, 18, 155, 254, 127, 229, 173, 91, 142, 47, 20, 71, 34, 178, 120, 2, 204, 50, 156, 131, 246, 138, 225, 117, 15, 140, 182, 205, 168, 78, 111, 124, 39, 108, 110, 132, 132, 74, 124, 211, 247, 135, 20, 1, 173, 145, 235, 70, 71, 173, 96, 127, 194, 227, 211, 63, 232, 81, 182, 255, 0, 191, 166, 143, 248, 92, 122, 103, 253, 10, 54, 223, 247, 244, 208, 6, 254, 71, 173, 25, 30, 181, 129, 255, 0, 11, 143, 76, 255, 0, 161, 70, 219, 254, 254, 154, 63, 225, 113, 233, 159, 244, 40, 219, 127, 223, 211, 64, 27, 249, 30, 180, 100, 122, 214, 7, 252, 46, 61, 51, 254, 133, 27, 111, 251, 250, 104, 255, 0, 133, 199, 166, 127, 208, 163, 109, 255, 0, 127, 77, 0, 111, 228, 122, 209, 145, 235, 88, 31, 240, 184, 244, 207, 250, 20, 109, 191, 239, 233, 163, 254, 23, 30, 153, 255, 0, 66, 141, 183, 253, 253, 52, 1, 211, 216, 145, 253, 163, 107, 255, 0, 93, 151, 249, 214, 143, 138, 200, 255, 0, 132, 167, 80, 231, 254, 90, 215, 20, 191, 26, 52, 248, 164, 89, 19, 194, 118, 193, 148, 228, 31, 52, 215, 160, 180, 254, 40, 213, 113, 126, 222, 4, 179, 144, 220, 1, 38, 227, 113, 215, 35, 138, 0, 230, 179, 70, 107, 162, 251, 63, 138, 63, 232, 159, 217, 127, 224, 77, 31, 103, 241, 71, 253, 19, 251, 47, 252, 9, 160, 14, 119, 52, 102, 186, 47, 179, 248, 163, 254, 137, 253, 151, 254, 4, 209, 246, 127, 20, 127, 209, 63, 178, 255, 0, 192, 154, 0, 231, 115, 70, 107, 162, 251, 63, 138, 63, 232, 159, 217, 127, 224, 77, 31, 103, 241, 71, 253, 19, 251, 47, 252, 9, 160, 14, 119, 52, 102, 186, 47, 179, 248, 163, 254, 137, 253, 151, 254, 4, 209, 246, 127, 20, 127, 209, 63, 178, 255, 0, 192, 154, 0, 197, 176, 35, 251, 70, 215, 254, 186, 175, 243, 173, 31, 21, 159, 248, 170, 117, 15, 250, 235, 87, 35, 139, 197, 9, 34, 60, 126, 0, 179, 14, 167, 32, 253, 162, 184, 77, 67, 227, 45, 171, 106, 19, 155, 223, 9, 91, 27, 128, 229, 101, 62, 105, 251, 195, 131, 64, 26, 217, 30, 180, 100, 122, 214, 7, 252, 46, 77, 51, 254, 133, 27, 111, 251, 250, 104, 255, 0, 133, 201, 166, 127, 208, 163, 109, 255, 0, 127, 77, 0, 111, 241, 235, 71, 30, 181, 129, 255, 0, 11, 147, 76, 255, 0, 161, 70, 219, 254, 254, 154, 63, 225, 114, 105, 159, 244, 40, 219, 127, 223, 211, 64, 27, 252, 122, 209, 199, 173, 96, 127, 194, 228, 211, 63, 232, 81, 182, 255, 0, 191, 166, 143, 248, 92, 154, 103, 253, 10, 54, 223, 247, 244, 208, 6, 255, 0, 30, 180, 113, 235, 88, 31, 240, 185, 52, 207, 250, 20, 109, 191, 239, 233, 163, 254, 23, 38, 153, 255, 0, 66, 141, 183, 253, 253, 52, 1, 212, 88, 145, 253, 163, 109, 207, 252, 181, 95, 231, 90, 30, 42, 32, 120, 166, 255, 0, 159, 249, 107, 92, 84, 127, 25, 244, 232, 164, 71, 95, 9, 91, 7, 83, 144, 124, 211, 93, 251, 92, 120, 163, 85, 197, 251, 120, 18, 205, 205, 192, 18, 238, 55, 29, 114, 56, 160, 14, 115, 35, 214, 140, 143, 90, 232, 190, 207, 226, 143, 250, 39, 246, 127, 248, 17, 71, 217, 252, 81, 255, 0, 68, 254, 207, 255, 0, 2, 40, 3, 157, 200, 245, 163, 35, 214, 186, 47, 179, 248, 159, 254, 137, 253, 159, 254, 4, 209, 246, 127, 19, 255, 0, 209, 63, 179, 255, 0, 192, 154, 0, 231, 114, 61, 104, 200, 245, 174, 139, 236, 254, 40, 255, 0, 162, 127, 103, 255, 0, 129, 20, 125, 159, 197, 31, 244, 79, 236, 255, 0, 240, 34, 128, 57, 220, 143, 90, 50, 61, 107, 162, 251, 63, 137, 255, 0, 232, 159, 217, 255, 0, 224, 77, 31, 103, 241, 63, 253, 19, 251, 63, 252, 9, 160, 12, 91, 12, 127, 104, 218, 243, 255, 0, 45, 87, 249, 214, 143, 138, 207, 252, 85, 58, 135, 253, 117, 254, 149, 109, 34, 241, 68, 82, 43, 167, 128, 44, 131, 169, 200, 63, 104, 174, 27, 80, 248, 201, 108, 218, 141, 193, 189, 240, 149, 177, 184, 14, 67, 159, 52, 253, 225, 214, 128, 53, 115, 70, 107, 3, 254, 23, 38, 153, 255, 0, 66, 141, 183, 253, 253, 52, 127, 194, 228, 211, 63, 232, 81, 182, 255, 0, 191, 166, 128, 55, 243, 239, 70, 125, 235, 3, 254, 23, 38, 153, 255, 0, 66, 141, 183, 253, 253, 52, 127, 194, 228, 211, 63, 232, 81, 182, 255, 0, 191, 166, 128, 55, 243, 239, 70, 125, 235, 3, 254, 23, 38, 153, 255, 0, 66, 141, 183, 253, 253, 52, 127, 194, 228, 211, 63, 232, 81, 182, 255, 0, 191, 166, 128, 55, 243, 239, 70, 125, 235, 3, 254, 23, 38, 153, 255, 0, 66, 141, 183, 253, 253, 52, 127, 194, 228, 211, 63, 232, 81, 182, 255, 0, 191, 166, 128, 58, 123, 18, 63, 180, 109, 121, 255, 0, 150, 171, 252, 235, 67, 197, 68, 127, 194, 83, 168, 114, 63, 215, 87, 23, 31, 198, 141, 62, 41, 21, 211, 194, 118, 193, 212, 228, 31, 52, 215, 126, 211, 248, 163, 85, 198, 160, 222, 4, 179, 115, 114, 4, 155, 141, 199, 92, 142, 40, 3, 156, 200, 245, 20, 100, 122, 138, 232, 190, 205, 226, 143, 250, 39, 246, 95, 248, 17, 71, 217, 188, 81, 255, 0, 68, 254, 203, 255, 0, 2, 40, 3, 157, 200, 245, 163, 35, 214, 186, 47, 179, 248, 163, 254, 137, 253, 151, 254, 4, 81, 246, 127, 20, 127, 209, 63, 178, 255, 0, 192, 138, 0, 231, 115, 70, 107, 162, 251, 63, 137, 255, 0, 232, 159, 217, 127, 224, 69, 31, 103, 241, 63, 253, 19, 251, 47, 252, 8, 160, 14, 119, 62, 244, 103, 222, 186, 47, 179, 248, 159, 254, 137, 253, 151, 254, 4, 81, 246, 127, 19, 255, 0, 209, 63, 178, 255, 0, 192, 138, 0, 197, 177, 199, 246, 141, 183, 63, 242, 213, 127, 157, 104, 248, 168, 129, 226, 155, 254, 127, 229, 173, 92, 142, 47, 20, 69, 34, 50, 120, 2, 204, 50, 156, 131, 246, 138, 225, 53, 15, 140, 182, 173, 168, 92, 27, 223, 9, 91, 27, 160, 228, 74, 124, 211, 247, 135, 20, 1, 173, 145, 235, 70, 71, 173, 96, 127, 194, 227, 211, 63, 232, 81, 182, 255, 0, 191, 166, 143, 248, 92, 122, 103, 253, 10, 54, 223, 247, 244, 208, 6, 254, 71, 173, 25, 30, 181, 129, 255, 0, 11, 143, 76, 255, 0, 161, 70, 219, 254, 254, 154, 63, 225, 113, 233, 159, 244, 40, 219, 127, 223, 211, 64, 27, 249, 30, 180, 100, 122, 214, 7, 252, 46, 61, 51, 254, 133, 27, 111, 251, 250, 104, 255, 0, 133, 199, 166, 127, 208, 163, 109, 255, 0, 127, 77, 0, 111, 228, 122, 209, 145, 235, 88, 31, 240, 184, 244, 207, 250, 20, 109, 191, 239, 233, 163, 254, 23, 30, 153, 255, 0, 66, 141, 183, 253, 253, 52, 1, 211, 216, 145, 253, 163, 107, 207, 252, 181, 95, 231, 90, 62, 43, 35, 254, 18, 157, 67, 159, 249, 107, 253, 43, 138, 143, 227, 70, 159, 20, 138, 233, 225, 59, 96, 234, 114, 15, 154, 107, 208, 90, 127, 20, 106, 219, 111, 219, 192, 150, 114, 155, 128, 36, 221, 246, 142, 160, 142, 40, 3, 154, 205, 25, 174, 139, 236, 254, 39, 255, 0, 162, 127, 101, 255, 0, 129, 52, 125, 159, 196, 255, 0, 244, 79, 172, 191, 240, 38, 128, 57, 220, 209, 154, 232, 190, 207, 226, 127, 250, 39, 214, 95, 248, 19, 71, 217, 252, 79, 255, 0, 68, 250, 203, 255, 0, 2, 104, 3, 157, 205, 25, 174, 139, 236, 254, 39, 255, 0, 162, 125, 101, 255, 0, 129, 52, 125, 159, 196, 255, 0, 244, 79, 172, 191, 240, 38, 128, 57, 220, 209, 154, 232, 190, 207, 226, 127, 250, 39, 214, 95, 248, 19, 71, 217, 252, 79, 255, 0, 68, 250, 203, 255, 0, 2, 104, 3, 22, 192, 143, 237, 27, 94, 127, 229, 170, 255, 0, 58, 209, 241, 81, 255, 0, 138, 167, 80, 255, 0, 174, 181, 114, 56, 188, 81, 19, 171, 167, 128, 44, 195, 41, 200, 63, 104, 174, 19, 81, 248, 203, 108, 250, 133, 199, 219, 124, 39, 108, 110, 68, 133, 37, 62, 105, 234, 56, 52, 1, 173, 145, 235, 70, 71, 173, 96, 127, 194, 227, 211, 63, 232, 81, 182, 255, 0, 191, 166, 143, 248, 92, 154, 103, 253, 10, 54, 223, 247, 244, 208, 6, 254, 71, 173, 25, 30, 181, 129, 255, 0, 11, 147, 76, 255, 0, 161, 70, 219, 254, 254, 154, 63, 225, 114, 105, 159, 244, 40, 219, 127, 223, 211, 64, 27, 249, 30, 180, 100, 122, 214, 7, 252, 46, 77, 51, 254, 133, 27, 111, 251, 250, 104, 255, 0, 133, 201, 166, 127, 208, 163, 109, 255, 0, 127, 77, 0, 111, 228, 122, 209, 145, 235, 88, 31, 240, 185, 52, 207, 250, 20, 109, 191, 239, 233, 163, 254, 23, 38, 153, 255, 0, 66, 141, 183, 253, 253, 52, 1, 211, 216, 145, 253, 163, 109, 207, 252, 181, 95, 231, 90, 62, 42, 35, 254, 18, 157, 67, 159, 249, 107, 92, 84, 127, 25, 180, 216, 164, 87, 95, 9, 91, 7, 83, 144, 124, 211, 93, 251, 92, 120, 159, 85, 197, 251, 120, 18, 206, 83, 114, 4, 187, 141, 199, 92, 142, 40, 3, 156, 200, 245, 163, 35, 214, 186, 47, 179, 248, 159, 254, 137, 253, 159, 254, 4, 209, 246, 127, 19, 255, 0, 209, 63, 179, 255, 0, 192, 154, 0, 231, 114, 61, 104, 200, 245, 174, 139, 236, 254, 39, 255, 0, 162, 127, 103, 255, 0, 129, 52, 125, 159, 196, 255, 0, 244, 79, 236, 255, 0, 240, 38, 128, 57, 220, 143, 90, 50, 61, 107, 162, 251, 63, 137, 255, 0, 232, 159, 217, 255, 0, 224, 77, 31, 103, 241, 63, 253, 19, 251, 63, 252, 9, 160, 14, 119, 35, 214, 140, 143, 90, 232, 190, 207, 226, 127, 250, 39, 246, 127, 248, 19, 71, 217, 252, 79, 255, 0, 68, 254, 207, 255, 0, 2, 40, 3, 22, 192, 143, 237, 27, 94, 127, 229, 170, 255, 0, 49, 93, 215, 128, 63, 228, 111, 241, 231, 253, 133, 87, 255, 0, 69, 214, 20, 113, 120, 162, 39, 87, 79, 0, 89, 134, 83, 144, 126, 209, 94, 113, 167, 252, 102, 212, 252, 55, 175, 235, 243, 199, 163, 218, 187, 234, 23, 158, 108, 177, 201, 33, 249, 8, 27, 112, 49, 244, 160, 15, 168, 243, 70, 107, 231, 15, 248, 105, 45, 103, 254, 128, 22, 31, 247, 245, 168, 255, 0, 134, 146, 214, 127, 232, 1, 97, 255, 0, 127, 90, 128, 62, 143, 205, 21, 243, 135, 252, 52, 150, 179, 255, 0, 64, 11, 15, 251, 250, 213, 179, 225, 31, 142, 186, 175, 136, 252, 87, 166, 232, 243, 104, 246, 113, 71, 119, 48, 141, 157, 93, 178, 188, 118, 160, 14, 31, 227, 231, 252, 149, 11, 143, 250, 245, 135, 249, 87, 152, 215, 167, 124, 124, 255, 0, 146, 161, 113, 255, 0, 94, 176, 255, 0, 42, 243, 26, 0, 40, 162, 138, 0, 43, 238, 205, 11, 254, 69, 221, 51, 254, 189, 34, 255, 0, 208, 69, 124, 39, 95, 118, 104, 95, 242, 46, 233, 159, 245, 233, 23, 254, 130, 40, 3, 66, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 190, 19, 215, 127, 228, 97, 212, 255, 0, 235, 234, 95, 253, 8, 215, 221, 149, 240, 158, 187, 255, 0, 35, 14, 167, 255, 0, 95, 82, 255, 0, 232, 70, 128, 51, 232, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 43, 238, 221, 11, 254, 69, 237, 51, 254, 189, 98, 255, 0, 208, 69, 124, 37, 95, 118, 232, 95, 242, 47, 105, 159, 245, 235, 23, 254, 130, 40, 2, 253, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 124, 37, 174, 255, 0, 200, 193, 169, 255, 0, 215, 220, 191, 250, 25, 175, 187, 107, 225, 45, 119, 254, 70, 13, 79, 254, 190, 229, 255, 0, 208, 205, 0, 80, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 175, 187, 52, 47, 249, 23, 180, 207, 250, 245, 139, 255, 0, 65, 21, 240, 157, 125, 217, 161, 127, 200, 189, 166, 127, 215, 172, 95, 250, 8, 160, 13, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 248, 75, 93, 255, 0, 145, 131, 83, 255, 0, 175, 185, 127, 244, 51, 95, 118, 215, 194, 90, 239, 252, 140, 26, 159, 253, 125, 203, 255, 0, 161, 154, 0, 161, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 69, 20, 80, 1, 95, 118, 104, 95, 242, 47, 105, 159, 245, 235, 23, 254, 130, 43, 225, 58, 251, 179, 66, 255, 0, 145, 123, 76, 255, 0, 175, 88, 191, 244, 17, 64, 26, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 21, 240, 150, 187, 255, 0, 35, 14, 167, 255, 0, 95, 82, 255, 0, 232, 102, 190, 237, 175, 132, 181, 223, 249, 24, 117, 63, 250, 250, 151, 255, 0, 67, 52, 1, 66, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 190, 237, 208, 191, 228, 94, 211, 63, 235, 214, 47, 253, 4, 87, 194, 85, 247, 110, 133, 255, 0, 34, 246, 153, 255, 0, 94, 177, 127, 232, 34, 128, 47, 209, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 87, 194, 122, 239, 252, 140, 58, 159, 253, 125, 75, 255, 0, 161, 26, 251, 178, 190, 19, 215, 127, 228, 97, 212, 255, 0, 235, 234, 95, 253, 8, 208, 6, 125, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 125, 217, 161, 127, 200, 189, 166, 127, 215, 172, 95, 250, 8, 175, 132, 235, 238, 205, 11, 254, 69, 237, 51, 254, 189, 98, 255, 0, 208, 69, 0, 104, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 87, 194, 90, 239, 252, 140, 26, 159, 253, 125, 203, 255, 0, 161, 154, 251, 182, 190, 18, 215, 127, 228, 96, 212, 255, 0, 235, 238, 95, 253, 12, 208, 5, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 40, 162, 128, 10, 251, 179, 66, 255, 0, 145, 123, 76, 255, 0, 175, 88, 191, 244, 17, 95, 9, 215, 221, 154, 23, 252, 139, 218, 103, 253, 122, 197, 255, 0, 160, 138, 0, 208, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 162, 138, 40, 0, 175, 132, 181, 223, 249, 24, 117, 63, 250, 250, 151, 255, 0, 67, 53, 247, 109, 124, 37, 174, 255, 0, 200, 195, 169, 255, 0, 215, 212, 191, 250, 25, 160, 10, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 20, 81, 69, 0, 21, 247, 110, 133, 255, 0, 34, 246, 153, 255, 0, 94, 177, 127, 232, 34, 190, 18, 175, 187, 116, 47, 249, 23, 180, 207, 250, 245, 139, 255, 0, 65, 20, 1, 126, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 190, 19, 215, 127, 228, 97, 212, 255, 0, 235, 234, 95, 253, 8, 215, 221, 149, 240, 158, 187, 255, 0, 35, 14, 167, 255, 0, 95, 82, 255, 0, 232, 70, 128, 51, 232, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 40, 162, 138, 0, 43, 238, 205, 11, 254, 69, 237, 51, 254, 189, 98, 255, 0, 208, 69, 124, 39, 95, 118, 104, 95, 242, 47, 105, 159, 245, 235, 23, 254, 130, 40, 3, 66, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 138, 40, 160, 2, 190, 18, 215, 63, 228, 96, 212, 191, 235, 234, 95, 253, 8, 215, 221, 181, 240, 150, 185, 255, 0, 35, 6, 165, 255, 0, 95, 82, 255, 0, 232, 70, 128, 40, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 87, 221, 154, 23, 252, 139, 218, 103, 253, 122, 197, 255, 0, 160, 138, 248, 78, 190, 236, 208, 191, 228, 94, 211, 63, 235, 214, 47, 253, 4, 80, 6, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 124, 39, 174, 255, 0, 200, 195, 169, 255, 0, 215, 212, 191, 250, 17, 175, 187, 43, 225, 61, 119, 254, 70, 29, 79, 254, 190, 165, 255, 0, 208, 141, 0, 103, 209, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 87, 221, 154, 23, 252, 139, 218, 103, 253, 122, 197, 255, 0, 160, 138, 248, 78, 190, 236, 208, 191, 228, 94, 211, 63, 235, 214, 47, 253, 4, 80, 6, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 124, 39, 174, 255, 0, 200, 193, 169, 255, 0, 215, 220, 191, 250, 17, 175, 187, 43, 225, 61, 119, 254, 70, 13, 79, 254, 190, 229, 255, 0, 208, 141, 0, 103, 209, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 81, 69, 20, 0, 87, 221, 154, 23, 252, 139, 218, 103, 253, 122, 197, 255, 0, 160, 138, 248, 78, 190, 236, 208, 191, 228, 94, 211, 63, 235, 214, 47, 253, 4, 80, 6, 133, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 20, 81, 64, 5, 124, 37, 174, 255, 0, 200, 193, 169, 255, 0, 215, 220, 191, 250, 25, 175, 187, 107, 225, 45, 119, 254, 70, 13, 79, 254, 190, 229, 255, 0, 208, 205, 0, 80, 162, 138, 40, 0, 174, 187, 225, 103, 252, 148, 255, 0, 15, 255, 0, 215, 216, 254, 70, 185, 26, 235, 190, 22, 127, 201, 79, 240, 255, 0, 253, 125, 143, 228, 104, 3, 255, 217} result, err := CompressJpeg(testImg) diff --git a/xxdk/e2e.go b/xxdk/e2e.go index 8811994fd3e1b5032d6b5821c4d34e798cb41fdd..86c5f5f664338edd526ada45ce8cd3a8ab8fb29d 100644 --- a/xxdk/e2e.go +++ b/xxdk/e2e.go @@ -7,8 +7,9 @@ package xxdk import ( - "encoding/binary" "encoding/json" + "time" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/auth" @@ -19,16 +20,13 @@ import ( "gitlab.com/elixxir/client/storage/user" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/crypto/contact" - "gitlab.com/elixxir/crypto/cyclic" - "gitlab.com/elixxir/crypto/diffieHellman" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/crypto/xx" "gitlab.com/xx_network/primitives/id" - "time" ) -// E2e object bundles a ReceptionIdentity with a Cmix -// and can be used for high level operations such as connections +// E2e object bundles a ReceptionIdentity with a Cmix object and can be used for +// high-level operations, such as connections. type E2e struct { *Cmix auth auth.State @@ -37,155 +35,84 @@ type E2e struct { e2eIdentity ReceptionIdentity } -// AuthCallbacks is an adapter for the auth.Callbacks interface -// that allows for initializing an E2e object without an E2e-dependant auth.Callbacks +// AuthCallbacks is an adapter for the auth.Callbacks interface that allows for +// initializing an E2e object without an E2e-dependant auth.Callbacks. type AuthCallbacks interface { Request(partner contact.Contact, receptionID receptionID.EphemeralIdentity, - round rounds.Round, e2e *E2e) + round rounds.Round, messenger *E2e) Confirm(partner contact.Contact, receptionID receptionID.EphemeralIdentity, - round rounds.Round, e2e *E2e) + round rounds.Round, messenger *E2e) Reset(partner contact.Contact, receptionID receptionID.EphemeralIdentity, - round rounds.Round, e2e *E2e) + round rounds.Round, messenger *E2e) } -// Login creates a new E2e backed by the xxdk.Cmix persistent versioned.KV -// It bundles a Cmix object with a ReceptionIdentity object -// and initializes the auth.State and e2e.Handler objects -func Login(client *Cmix, callbacks AuthCallbacks, - identity ReceptionIdentity) (m *E2e, err error) { - return login(client, callbacks, identity, client.GetStorage().GetKV()) +// Login creates a new E2e backed by the xxdk.Cmix persistent versioned.KV. It +// bundles a Cmix object with a ReceptionIdentity object and initializes the +// auth.State and e2e.Handler objects. +func Login(net *Cmix, callbacks AuthCallbacks, + identity ReceptionIdentity, params E2EParams) (m *E2e, err error) { + + // If the given identity matches the stored ReceptionID, + // then we are using a legacy ReceptionIdentity + defaultReceptionId := net.GetStorage().PortableUserInfo().ReceptionID + if identity.ID.Cmp(defaultReceptionId) { + return loginLegacy(net, callbacks, identity, params) + } + + // Otherwise, we are using a modern ReceptionIdentity + return login(net, callbacks, identity, net.GetStorage().GetKV(), params) } -// LoginEphemeral creates a new E2e backed by a totally ephemeral versioned.KV -func LoginEphemeral(client *Cmix, callbacks AuthCallbacks, - identity ReceptionIdentity) (m *E2e, err error) { - return login(client, callbacks, identity, versioned.NewKV(ekv.MakeMemstore())) +// LoginEphemeral creates a new E2e backed by a totally ephemeral versioned.KV. +func LoginEphemeral(net *Cmix, callbacks AuthCallbacks, + identity ReceptionIdentity, params E2EParams) (m *E2e, err error) { + return login(net, callbacks, identity, + versioned.NewKV(ekv.MakeMemstore()), params) } -// LoginLegacy creates a new E2e backed by the xxdk.Cmix persistent versioned.KV -// Uses the pre-generated transmission ID used by xxdk.Cmix. +// loginLegacy creates a new E2e backed by the xxdk.Cmix persistent +// versioned.KV. It uses the pre-generated transmission ID used by xxdk.Cmix. // This function is designed to maintain backwards compatibility with previous // xx messenger designs and should not be used for other purposes. -func LoginLegacy(client *Cmix, callbacks AuthCallbacks) (m *E2e, err error) { +func loginLegacy(net *Cmix, callbacks AuthCallbacks, + identity ReceptionIdentity, params E2EParams) ( + m *E2e, err error) { m = &E2e{ - Cmix: client, + Cmix: net, backup: &Container{}, } - m.e2e, err = loadOrInitE2eLegacy(client) - if err != nil { - return nil, err - } - - userInfo := client.GetStorage().PortableUserInfo() - client.GetCmix().AddIdentity(userInfo.ReceptionID, time.Time{}, true) - - err = client.AddService(m.e2e.StartProcesses) - if err != nil { - return nil, errors.WithMessage(err, "Failed to add "+ - "the e2e processies") - } - - m.auth, err = auth.NewState(client.GetStorage().GetKV(), client.GetCmix(), - m.e2e, client.GetRng(), client.GetEventReporter(), - auth.GetDefaultParams(), MakeAuthCallbacksAdapter(callbacks, m), m.backup.TriggerBackup) - if err != nil { - return nil, err - } - - m.e2eIdentity, err = buildReceptionIdentity(userInfo, m.e2e.GetGroup(), m.e2e.GetHistoricalDHPrivkey()) - return m, err -} - -// LoginWithNewBaseNDF_UNSAFE initializes a client object from existing storage -// while replacing the base NDF. This is designed for some specific deployment -// procedures and is generally unsafe. -func LoginWithNewBaseNDF_UNSAFE(storageDir string, password []byte, - newBaseNdf string, params Params) (*E2e, error) { - jww.INFO.Printf("LoginWithNewBaseNDF_UNSAFE()") - - def, err := ParseNDF(newBaseNdf) - if err != nil { - return nil, err - } - - c, err := LoadCmix(storageDir, password, params) - if err != nil { - return nil, err - } - - //store the updated base NDF - c.storage.SetNDF(def) - - if def.Registration.Address != "" { - err = c.initPermissioning(def) - if err != nil { - return nil, err - } - } else { - jww.WARN.Printf("Registration with permissioning skipped due " + - "to blank permissionign address. Cmix will not be " + - "able to register or track network.") - } - - err = c.registerFollower() - if err != nil { - return nil, err - } - - return LoginLegacy(c, nil) -} - -// LoginWithProtoClient creates a client object with a protoclient -// JSON containing the cryptographic primitives. This is designed for -// some specific deployment procedures and is generally unsafe. -func LoginWithProtoClient(storageDir string, password []byte, - protoClientJSON []byte, newBaseNdf string, callbacks AuthCallbacks, - params Params) (*E2e, error) { - jww.INFO.Printf("LoginWithProtoClient()") - - def, err := ParseNDF(newBaseNdf) + m.e2e, err = loadOrInitE2eLegacy(identity, net) if err != nil { return nil, err } + net.GetCmix().AddIdentity(identity.ID, time.Time{}, true) - protoUser := &user.Proto{} - err = json.Unmarshal(protoClientJSON, protoUser) + err = net.AddService(m.e2e.StartProcesses) if err != nil { - return nil, err + return nil, errors.WithMessage(err, "Failed to add the e2e processes") } - err = NewProtoClient_Unsafe(newBaseNdf, storageDir, password, - protoUser) + m.auth, err = auth.NewState(net.GetStorage().GetKV(), net.GetCmix(), + m.e2e, net.GetRng(), net.GetEventReporter(), params.Auth, + params.Session, MakeAuthCallbacksAdapter(callbacks, m), + m.backup.TriggerBackup) if err != nil { return nil, err } - c, err := LoadCmix(storageDir, password, params) + rsaKey, err := identity.GetRSAPrivatePem() if err != nil { return nil, err } - - c.storage.SetNDF(def) - - err = c.initPermissioning(def) - if err != nil { - return nil, err - } - - err = c.registerFollower() - if err != nil { - return nil, err - } - - userInfo := c.GetStorage().PortableUserInfo() - receptionIdentity, err := buildReceptionIdentity(userInfo, c.GetStorage().GetE2EGroup(), protoUser.E2eDhPrivateKey) - return Login(c, callbacks, receptionIdentity) + m.e2eIdentity, err = buildReceptionIdentity(identity.ID, identity.Salt, + rsaKey, m.e2e.GetGroup(), m.e2e.GetHistoricalDHPrivkey()) + return m, err } -// login creates a new xxdk.E2e backed by the given versioned.KV -func login(client *Cmix, callbacks AuthCallbacks, - identity ReceptionIdentity, kv *versioned.KV) (m *E2e, err error) { +// login creates a new xxdk.E2e backed by the given versioned.KV. +func login(net *Cmix, callbacks AuthCallbacks, identity ReceptionIdentity, + kv *versioned.KV, params E2EParams) (m *E2e, err error) { // Verify the passed-in ReceptionIdentity matches its properties privatePem, err := identity.GetRSAPrivatePem() @@ -197,12 +124,13 @@ func login(client *Cmix, callbacks AuthCallbacks, return nil, err } if !generatedId.Cmp(identity.ID) { - return nil, errors.Errorf("Given identity %s is invalid, generated ID does not match", + return nil, errors.Errorf( + "Given identity %s is invalid, generated ID does not match", identity.ID.String()) } m = &E2e{ - Cmix: client, + Cmix: net, backup: &Container{}, e2eIdentity: identity, } @@ -211,129 +139,108 @@ func login(client *Cmix, callbacks AuthCallbacks, return nil, err } - // load or init the new e2e storage - e2eGrp := client.GetStorage().GetE2EGroup() - m.e2e, err = e2e.Load(kv, - client.GetCmix(), identity.ID, e2eGrp, client.GetRng(), - client.GetEventReporter()) + // Load or init the new e2e storage + e2eGrp := net.GetStorage().GetE2EGroup() + m.e2e, err = e2e.Load(kv, net.GetCmix(), identity.ID, e2eGrp, net.GetRng(), + net.GetEventReporter()) if err != nil { - //initialize the e2e storage - jww.INFO.Printf("Initializing new e2e.Handler for %s", identity.ID.String()) - err = e2e.Init(kv, identity.ID, dhPrivKey, e2eGrp, - rekey.GetDefaultParams()) + // Initialize the e2e storage + err = e2e.Init(kv, identity.ID, dhPrivKey, e2eGrp, params.Rekey) if err != nil { return nil, err } - //load the new e2e storage - m.e2e, err = e2e.Load(kv, - client.GetCmix(), identity.ID, e2eGrp, client.GetRng(), - client.GetEventReporter()) + // Load the new e2e storage + m.e2e, err = e2e.Load(kv, net.GetCmix(), identity.ID, e2eGrp, + net.GetRng(), net.GetEventReporter()) if err != nil { - return nil, errors.WithMessage(err, "Failed to load a "+ - "newly created e2e store") + return nil, errors.WithMessage( + err, "Failed to load a newly created e2e store") } } - err = client.AddService(m.e2e.StartProcesses) + err = net.AddService(m.e2e.StartProcesses) if err != nil { - return nil, errors.WithMessage(err, "Failed to add "+ - "the e2e processies") + return nil, errors.WithMessage(err, "Failed to add the e2e processes") } - m.auth, err = auth.NewState(kv, client.GetCmix(), - m.e2e, client.GetRng(), client.GetEventReporter(), - auth.GetDefaultTemporaryParams(), MakeAuthCallbacksAdapter(callbacks, m), m.backup.TriggerBackup) + m.auth, err = auth.NewState(kv, net.GetCmix(), m.e2e, net.GetRng(), + net.GetEventReporter(), params.Auth, params.Session, + MakeAuthCallbacksAdapter(callbacks, m), m.backup.TriggerBackup) if err != nil { return nil, err } - client.network.AddIdentity(identity.ID, time.Time{}, true) + net.network.AddIdentity(identity.ID, time.Time{}, true) + jww.INFO.Printf("Client logged in: \n\tReceptionID: %s", identity.ID) return m, err } -// loadOrInitE2eLegacy loads the e2e handler or makes a new one, generating a new -// e2e private key. It attempts to load via a legacy construction, then tries -// to load the modern one, creating a new modern ID if neither can be found -func loadOrInitE2eLegacy(client *Cmix) (e2e.Handler, error) { - usr := client.GetStorage().PortableUserInfo() - e2eGrp := client.GetStorage().GetE2EGroup() - kv := client.GetStorage().GetKV() +// loadOrInitE2eLegacy loads the e2e.Handler or makes a new one, generating a +// new E2E private key. It attempts to load via a legacy construction, then +// tries to load the modern one, creating a new modern ID if neither can be +// found. +func loadOrInitE2eLegacy(identity ReceptionIdentity, net *Cmix) (e2e.Handler, error) { + e2eGrp := net.GetStorage().GetE2EGroup() + kv := net.GetStorage().GetKV() - //try to load a legacy e2e handler + // Try to load a legacy e2e handler e2eHandler, err := e2e.LoadLegacy(kv, - client.GetCmix(), usr.ReceptionID, e2eGrp, client.GetRng(), - client.GetEventReporter(), rekey.GetDefaultParams()) + net.GetCmix(), identity.ID, e2eGrp, net.GetRng(), + net.GetEventReporter(), rekey.GetDefaultParams()) if err != nil { - //if no legacy e2e handler exists, try to load a new one + jww.DEBUG.Printf("e2e.LoadLegacy error: %v", err) + // If no legacy e2e handler exists, try to load a new one e2eHandler, err = e2e.Load(kv, - client.GetCmix(), usr.ReceptionID, e2eGrp, client.GetRng(), - client.GetEventReporter()) + net.GetCmix(), identity.ID, e2eGrp, net.GetRng(), + net.GetEventReporter()) if err != nil { jww.WARN.Printf("Failed to load e2e instance for %s, "+ - "creating a new one", usr.ReceptionID) - - //generate the key - var privkey *cyclic.Int - if client.GetStorage().IsPrecanned() { - jww.WARN.Printf("Using Precanned DH key") - precannedID := binary.BigEndian.Uint64( - client.GetStorage().GetReceptionID()[:]) - privkey = generatePrecanDHKeypair( - uint(precannedID), - client.GetStorage().GetE2EGroup()) - } else if usr.E2eDhPrivateKey != nil { - jww.INFO.Printf("Using pre-existing DH key") - privkey = usr.E2eDhPrivateKey - } else { - jww.INFO.Printf("Generating new DH key") - rngStream := client.GetRng().GetStream() - privkey = diffieHellman.GeneratePrivateKey( - len(e2eGrp.GetPBytes()), - e2eGrp, rngStream) - rngStream.Close() - } + "creating a new one: %v", identity.ID, err) - //initialize the e2e storage - err = e2e.Init(kv, usr.ReceptionID, privkey, e2eGrp, + // Initialize the e2e storage + privKey, err := identity.GetDHKeyPrivate() + if err != nil { + return nil, err + } + err = e2e.Init(kv, identity.ID, privKey, e2eGrp, rekey.GetDefaultParams()) if err != nil { return nil, err } - //load the new e2e storage + // Load the new e2e storage e2eHandler, err = e2e.Load(kv, - client.GetCmix(), usr.ReceptionID, e2eGrp, client.GetRng(), - client.GetEventReporter()) + net.GetCmix(), identity.ID, e2eGrp, net.GetRng(), + net.GetEventReporter()) if err != nil { - return nil, errors.WithMessage(err, "Failed to load a "+ - "newly created e2e store") + return nil, errors.WithMessage(err, + "Failed to load a newly created e2e store") } } else { - jww.INFO.Printf("Loaded a modern e2e instance for %s", - usr.ReceptionID) + jww.INFO.Printf("Loaded a modern e2e instance for %s", identity.ID) } } else { - jww.INFO.Printf("Loaded a legacy e2e instance for %s", - usr.ReceptionID) + jww.INFO.Printf("Loaded a legacy e2e instance for %s", identity.ID) } + return e2eHandler, nil } -// GetReceptionIdentity returns a safe copy of the E2e ReceptionIdentity +// GetReceptionIdentity returns a safe copy of the E2e ReceptionIdentity. func (m *E2e) GetReceptionIdentity() ReceptionIdentity { return m.e2eIdentity.DeepCopy() } -// ConstructProtoUserFile is a helper function which is used for proto -// client testing. This is used for development testing. +// ConstructProtoUserFile is a helper function that is used for proto client +// testing. This is used for development testing. func (m *E2e) ConstructProtoUserFile() ([]byte, error) { - //load the registration code + // load the registration code regCode, err := m.GetStorage().GetRegCode() if err != nil { - return nil, errors.WithMessage(err, "failed to register with "+ - "permissioning") + return nil, errors.WithMessage(err, + "failed to register with permissioning") } transIdentity := m.Cmix.GetTransmissionIdentity() @@ -363,26 +270,29 @@ func (m *E2e) ConstructProtoUserFile() ([]byte, error) { jsonBytes, err := json.Marshal(Usr) if err != nil { - return nil, errors.WithMessage(err, "failed to register with "+ - "permissioning") + return nil, errors.WithMessage(err, + "failed to register with permissioning") } return jsonBytes, nil } +// GetAuth returns the auth.State. func (m *E2e) GetAuth() auth.State { return m.auth } +// GetE2E returns the e2e.Handler. func (m *E2e) GetE2E() e2e.Handler { return m.e2e } +// GetBackupContainer returns the backup Container. func (m *E2e) GetBackupContainer() *Container { return m.backup } -// DeleteContact is a function which removes a partner from E2e's storage +// DeleteContact removes a partner from E2e's storage. func (m *E2e) DeleteContact(partnerId *id.ID) error { jww.DEBUG.Printf("Deleting contact with ID %s", partnerId) @@ -409,7 +319,7 @@ func (m *E2e) DeleteContact(partnerId *id.ID) error { return nil } -// MakeAuthCallbacksAdapter creates an authCallbacksAdapter +// MakeAuthCallbacksAdapter creates an authCallbacksAdapter. func MakeAuthCallbacksAdapter(ac AuthCallbacks, e2e *E2e) *authCallbacksAdapter { return &authCallbacksAdapter{ ac: ac, @@ -418,39 +328,50 @@ func MakeAuthCallbacksAdapter(ac AuthCallbacks, e2e *E2e) *authCallbacksAdapter } // authCallbacksAdapter is an adapter type to make the AuthCallbacks type -// compatible with the auth.Callbacks type +// compatible with the auth.Callbacks type. type authCallbacksAdapter struct { ac AuthCallbacks e2e *E2e } +// MakeAuthCB generates a new auth.Callbacks with the given AuthCallbacks. +func MakeAuthCB(e2e *E2e, cbs AuthCallbacks) auth.Callbacks { + return &authCallbacksAdapter{ + ac: cbs, + e2e: e2e, + } +} + +// Request will be called when an auth Request message is processed. func (aca *authCallbacksAdapter) Request(partner contact.Contact, receptionID receptionID.EphemeralIdentity, round rounds.Round) { aca.ac.Request(partner, receptionID, round, aca.e2e) } +// Confirm will be called when an auth Confirm message is processed. func (aca *authCallbacksAdapter) Confirm(partner contact.Contact, receptionID receptionID.EphemeralIdentity, round rounds.Round) { aca.ac.Confirm(partner, receptionID, round, aca.e2e) } +// Reset will be called when an auth Reset operation occurs. func (aca *authCallbacksAdapter) Reset(partner contact.Contact, receptionID receptionID.EphemeralIdentity, round rounds.Round) { aca.ac.Reset(partner, receptionID, round, aca.e2e) } -// DefaultAuthCallbacks is a simple structure for providing a default Callbacks implementation -// It should generally not be used. +// DefaultAuthCallbacks is a simple structure for providing a default +// AuthCallbacks implementation. It should generally not be used. type DefaultAuthCallbacks struct{} -// Confirm will be called when an auth Confirm message is processed. -func (a DefaultAuthCallbacks) Confirm(contact.Contact, +// Request will be called when an auth Request message is processed. +func (a DefaultAuthCallbacks) Request(contact.Contact, receptionID.EphemeralIdentity, rounds.Round, *E2e) { jww.ERROR.Printf("No valid auth callback assigned!") } -// Request will be called when an auth Request message is processed. -func (a DefaultAuthCallbacks) Request(contact.Contact, +// Confirm will be called when an auth Confirm message is processed. +func (a DefaultAuthCallbacks) Confirm(contact.Contact, receptionID.EphemeralIdentity, rounds.Round, *E2e) { jww.ERROR.Printf("No valid auth callback assigned!") } diff --git a/xxdk/event.go b/xxdk/event.go index cd1897454b70731c4371de68804d5de154aff40d..d65f88c3519aa5ec8b4c5c832e95192180a84bf9 100644 --- a/xxdk/event.go +++ b/xxdk/event.go @@ -5,21 +5,18 @@ import ( ) // ReportEvent reports an event from the client to api users, providing a -// priority, category, eventType, and details +// priority, category, eventType, and details. func (c *Cmix) ReportEvent(priority int, category, evtType, details string) { c.events.Report(priority, category, evtType, details) } -// RegisterEventCallback records the given function to receive -// ReportableEvent objects. It returns the internal index -// of the callback so that it can be deleted later. -func (c *Cmix) RegisterEventCallback(name string, - myFunc event.Callback) error { +// RegisterEventCallback records the given function to receive ReportableEvent +// objects. +func (c *Cmix) RegisterEventCallback(name string, myFunc event.Callback) error { return c.events.RegisterEventCallback(name, myFunc) } -// UnregisterEventCallback deletes the callback identified by the -// index. It returns an error if it fails. +// UnregisterEventCallback deletes the callback identified by the name. func (c *Cmix) UnregisterEventCallback(name string) { c.events.UnregisterEventCallback(name) } diff --git a/xxdk/identity.go b/xxdk/identity.go index 46caef778129618a8a07a2ebc5ba036fc5500718..9d646785fd71c713398036fd4dc8ae66ecbbc447 100644 --- a/xxdk/identity.go +++ b/xxdk/identity.go @@ -8,6 +8,8 @@ package xxdk import ( "encoding/json" + "gitlab.com/elixxir/primitives/fact" + "gitlab.com/elixxir/client/storage/user" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/crypto/contact" @@ -21,8 +23,8 @@ import ( const idVersion = 0 -// ReceptionIdentity is used by the E2e object for managing -// identities used for message pickup +// ReceptionIdentity is used by the E2e object for managing identities used for +// message pickup. type ReceptionIdentity struct { ID *id.ID RSAPrivatePem []byte @@ -31,25 +33,27 @@ type ReceptionIdentity struct { E2eGrp []byte } -// StoreReceptionIdentity stores the given identity in Cmix storage with the given key -// This is the ideal way to securely store identities, as the caller of this function -// is only required to store the given key separately rather than the keying material -func StoreReceptionIdentity(key string, identity ReceptionIdentity, client *Cmix) error { +// StoreReceptionIdentity stores the given identity in Cmix storage with the +// given key. This is the ideal way to securely store identities, as the caller +// of this function is only required to store the given key separately rather +// than the keying material. +func StoreReceptionIdentity(key string, identity ReceptionIdentity, net *Cmix) error { marshalledIdentity, err := identity.Marshal() if err != nil { return err } - return client.GetStorage().Set(key, &versioned.Object{ + return net.GetStorage().Set(key, &versioned.Object{ Version: idVersion, Timestamp: netTime.Now(), Data: marshalledIdentity, }) } -// LoadReceptionIdentity loads the given identity in Cmix storage with the given key -func LoadReceptionIdentity(key string, client *Cmix) (ReceptionIdentity, error) { - storageObj, err := client.GetStorage().Get(key) +// LoadReceptionIdentity loads the given identity in Cmix storage with the given +// key. +func LoadReceptionIdentity(key string, net *Cmix) (ReceptionIdentity, error) { + storageObj, err := net.GetStorage().Get(key) if err != nil { return ReceptionIdentity{}, err } @@ -57,56 +61,58 @@ func LoadReceptionIdentity(key string, client *Cmix) (ReceptionIdentity, error) return UnmarshalReceptionIdentity(storageObj.Data) } -// Marshal returns the JSON representation of a ReceptionIdentity +// Marshal returns the JSON representation of a ReceptionIdentity. func (r ReceptionIdentity) Marshal() ([]byte, error) { return json.Marshal(&r) } -// UnmarshalReceptionIdentity takes in a marshalled ReceptionIdentity -// and converts it to an object +// UnmarshalReceptionIdentity takes in a marshalled ReceptionIdentity and +// converts it to an object. func UnmarshalReceptionIdentity(marshaled []byte) (ReceptionIdentity, error) { newIdentity := ReceptionIdentity{} return newIdentity, json.Unmarshal(marshaled, &newIdentity) } -// GetDHKeyPrivate returns the DHKeyPrivate in go format +// GetDHKeyPrivate returns the DHKeyPrivate. func (r ReceptionIdentity) GetDHKeyPrivate() (*cyclic.Int, error) { dhKeyPriv := &cyclic.Int{} err := dhKeyPriv.UnmarshalJSON(r.DHKeyPrivate) return dhKeyPriv, err } -// GetRSAPrivatePem returns the RSAPrivatePem in go format +// GetRSAPrivatePem returns the RSAPrivatePem. func (r ReceptionIdentity) GetRSAPrivatePem() (*rsa.PrivateKey, error) { return rsa.LoadPrivateKeyFromPem(r.RSAPrivatePem) } -// MakeReceptionIdentity generates a new cryptographic identity -// for receiving messages. -func MakeReceptionIdentity(client *Cmix) (ReceptionIdentity, error) { - rng := client.GetRng().GetStream() +// GetGroup returns the cyclic.Group. +func (r ReceptionIdentity) GetGroup() (*cyclic.Group, error) { + grp := &cyclic.Group{} + return grp, grp.UnmarshalJSON(r.E2eGrp) +} + +// MakeReceptionIdentity generates a new cryptographic identity for receiving +// messages. +func MakeReceptionIdentity(net *Cmix) (ReceptionIdentity, error) { + rng := net.GetRng().GetStream() defer rng.Close() - grp := client.GetStorage().GetE2EGroup() + grp := net.GetStorage().GetE2EGroup() - //make RSA Key - rsaKey, err := rsa.GenerateKey(rng, - rsa.DefaultRSABitLen) + // Make RSA Key + rsaKey, err := rsa.GenerateKey(rng, rsa.DefaultRSABitLen) if err != nil { return ReceptionIdentity{}, err } - //make salt + // Make salt salt := make([]byte, 32) _, err = rng.Read(salt) - //make dh private key - privKey := diffieHellman.GeneratePrivateKey( - len(grp.GetPBytes()), - grp, rng) + // Make DH private key + privKey := diffieHellman.GeneratePrivateKey(len(grp.GetPBytes()), grp, rng) - //make the ID - newId, err := xx.NewID(rsaKey.GetPublic(), - salt, id.User) + // make the ID + newId, err := xx.NewID(rsaKey.GetPublic(), salt, id.User) if err != nil { return ReceptionIdentity{}, err } @@ -121,7 +127,7 @@ func MakeReceptionIdentity(client *Cmix) (ReceptionIdentity, error) { return ReceptionIdentity{}, err } - //create the identity object + // Create the identity object rsaPem := rsa.CreatePrivateKeyPem(rsaKey) I := ReceptionIdentity{ ID: newId, @@ -134,7 +140,15 @@ func MakeReceptionIdentity(client *Cmix) (ReceptionIdentity, error) { return I, nil } -// DeepCopy produces a safe copy of a ReceptionIdentity +// MakeLegacyReceptionIdentity generates the cryptographic identity for +// receiving messages based on the extant stored user.Info. +func MakeLegacyReceptionIdentity(net *Cmix) (ReceptionIdentity, error) { + userInfo := net.GetStorage().PortableUserInfo() + return buildReceptionIdentity(userInfo.ReceptionID, userInfo.ReceptionSalt, + userInfo.ReceptionRSA, net.GetStorage().GetE2EGroup(), userInfo.E2eDhPrivateKey) +} + +// DeepCopy produces a safe copy of the ReceptionIdentity. func (r ReceptionIdentity) DeepCopy() ReceptionIdentity { saltCopy := make([]byte, len(r.Salt)) copy(saltCopy, r.Salt) @@ -153,27 +167,27 @@ func (r ReceptionIdentity) DeepCopy() ReceptionIdentity { } } -// GetContact accepts a xxdk.ReceptionIdentity object and returns a contact.Contact object +// GetContact returns a contact.Contact object of the reception identity. func (r ReceptionIdentity) GetContact() contact.Contact { - grp := &cyclic.Group{} - _ = grp.UnmarshalJSON(r.E2eGrp) + grp, _ := r.GetGroup() dhKeyPriv, _ := r.GetDHKeyPrivate() - dhPub := grp.ExpG(dhKeyPriv, grp.NewInt(1)) ct := contact.Contact{ ID: r.ID, - DhPubKey: dhPub, + DhPubKey: diffieHellman.GeneratePublicKey(dhKeyPriv, grp), OwnershipProof: nil, - Facts: nil, + Facts: make([]fact.Fact, 0), } return ct } -// buildReceptionIdentity creates a new ReceptionIdentity -// from the given user.Info -func buildReceptionIdentity(userInfo user.Info, e2eGrp *cyclic.Group, dHPrivkey *cyclic.Int) (ReceptionIdentity, error) { - saltCopy := make([]byte, len(userInfo.TransmissionSalt)) - copy(saltCopy, userInfo.TransmissionSalt) +// buildReceptionIdentity creates a new ReceptionIdentity from the given +// user.Info. +func buildReceptionIdentity(receptionId *id.ID, receptionSalt []byte, + receptionRsa *rsa.PrivateKey, e2eGrp *cyclic.Group, dHPrivkey *cyclic.Int) ( + ReceptionIdentity, error) { + saltCopy := make([]byte, len(receptionSalt)) + copy(saltCopy, receptionSalt) grp, err := e2eGrp.MarshalJSON() if err != nil { @@ -185,25 +199,26 @@ func buildReceptionIdentity(userInfo user.Info, e2eGrp *cyclic.Group, dHPrivkey } return ReceptionIdentity{ - ID: userInfo.ReceptionID.DeepCopy(), - RSAPrivatePem: rsa.CreatePrivateKeyPem(userInfo.ReceptionRSA), + ID: receptionId.DeepCopy(), + RSAPrivatePem: rsa.CreatePrivateKeyPem(receptionRsa), Salt: saltCopy, DHKeyPrivate: privKey, E2eGrp: grp, }, nil } -// TransmissionIdentity represents the identity -// used to transmit over the network via a specific Cmix object +// TransmissionIdentity represents the identity used to transmit over the +// network via a specific Cmix object. type TransmissionIdentity struct { ID *id.ID RSAPrivatePem *rsa.PrivateKey Salt []byte - // Timestamp in which user has registered with the network + + // Timestamp of when the user has registered with the network RegistrationTimestamp int64 } -// DeepCopy produces a safe copy of a TransmissionIdentity +// DeepCopy produces a safe copy of a TransmissionIdentity. func (t TransmissionIdentity) DeepCopy() TransmissionIdentity { saltCopy := make([]byte, len(t.Salt)) copy(saltCopy, t.Salt) @@ -215,8 +230,8 @@ func (t TransmissionIdentity) DeepCopy() TransmissionIdentity { } } -// buildTransmissionIdentity creates a new TransmissionIdentity -// from the given user.Info +// buildTransmissionIdentity creates a new TransmissionIdentity from the given +// user.Info. func buildTransmissionIdentity(userInfo user.Info) TransmissionIdentity { saltCopy := make([]byte, len(userInfo.TransmissionSalt)) copy(saltCopy, userInfo.TransmissionSalt) diff --git a/xxdk/ndf.go b/xxdk/ndf.go index d67edc0d93ec8a0e1928e5cf07fb851d4f4942f7..c37f72f49a88278843388cffb9ecb49354e0fac1 100644 --- a/xxdk/ndf.go +++ b/xxdk/ndf.go @@ -10,6 +10,7 @@ package xxdk import ( "encoding/base64" "github.com/pkg/errors" + jww "github.com/spf13/jwalterweatherman" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/xx_network/comms/signature" "gitlab.com/xx_network/crypto/tls" @@ -19,33 +20,37 @@ import ( ) // DownloadAndVerifySignedNdfWithUrl retrieves the NDF from a specified URL. -// The NDF is processed into a protobuf containing a signature which -// is verified using the cert string passed in. The NDF is returned as marshaled -// byte data which may be used to start a client. +// The NDF is processed into a protobuf containing a signature that is verified +// using the cert string passed in. The NDF is returned as marshaled byte data +// that may be used to start a client. func DownloadAndVerifySignedNdfWithUrl(url, cert string) ([]byte, error) { // Build a request for the file resp, err := http.Get(url) if err != nil { - return nil, errors.WithMessagef(err, "Failed to retrieve "+ - "NDF from %s", url) + return nil, errors.WithMessagef( + err, "Failed to retrieve NDF from %s", url) } - defer resp.Body.Close() + defer func() { + if err = resp.Body.Close(); err != nil { + jww.ERROR.Printf("Failed to close http response body: %+v", err) + } + }() // Download contents of the file signedNdfEncoded, err := ioutil.ReadAll(resp.Body) if err != nil { - return nil, errors.WithMessage(err, "Failed to read signed "+ - "NDF response request") + return nil, errors.WithMessage( + err, "Failed to read signed NDF response request") } // Process the download NDF and return the marshaled NDF return processAndVerifySignedNdf(signedNdfEncoded, cert) } -// processAndVerifySignedNdf is a helper function which parses the downloaded NDF +// processAndVerifySignedNdf is a helper function that parses the downloaded NDF // into a protobuf containing a signature. The signature is verified using the -// passed in cert. Upon successful parsing and verification, the NDF is -// returned as byte data. +// passed in cert. Upon successful parsing and verification, the NDF is returned +// as byte data. func processAndVerifySignedNdf(signedNdfEncoded []byte, cert string) ([]byte, error) { // Base64 decode the signed NDF signedNdfMarshaled, err := base64.StdEncoding.DecodeString( @@ -58,26 +63,29 @@ func processAndVerifySignedNdf(signedNdfEncoded []byte, cert string) ([]byte, er signedNdfMsg := &pb.NDF{} err = proto.Unmarshal(signedNdfMarshaled, signedNdfMsg) if err != nil { - return nil, errors.WithMessage(err, "Failed to unmarshal "+ - "signed NDF into protobuf") + return nil, errors.WithMessage(err, + "Failed to unmarshal signed NDF into protobuf") } // Load the certificate from it's PEM contents schedulingCert, err := tls.LoadCertificate(cert) if err != nil { - return nil, errors.WithMessagef(err, "Failed to parse scheduling cert (%s)", cert) + return nil, errors.WithMessagef(err, + "Failed to parse scheduling cert (%s)", cert) } // Extract the public key from the cert schedulingPubKey, err := tls.ExtractPublicKey(schedulingCert) if err != nil { - return nil, errors.WithMessage(err, "Failed to extract public key from cert") + return nil, errors.WithMessage(err, + "Failed to extract public key from cert") } // Verify signed NDF message err = signature.VerifyRsa(signedNdfMsg, schedulingPubKey) if err != nil { - return nil, errors.WithMessage(err, "Failed to verify signed NDF message") + return nil, errors.WithMessage(err, + "Failed to verify signed NDF message") } return signedNdfMsg.Ndf, nil diff --git a/xxdk/notifications.go b/xxdk/notifications.go index 32fe156d9318985d964b95717126b701ece0865d..17cfb113826b6caa3e2741919abbd455cfde5eb7 100644 --- a/xxdk/notifications.go +++ b/xxdk/notifications.go @@ -16,18 +16,17 @@ import ( "gitlab.com/xx_network/primitives/id/ephemeral" ) -// RegisterForNotifications allows a client to register for push -// notifications. -// Note that clients are not required to register for push notifications -// especially as these rely on third parties (i.e., Firebase *cough* -// *cough* google's palantir *cough*) that may represent a security -// risk to the user. +// RegisterForNotifications allows a client to register for push notifications. +// Note that clients are not required to register for push notifications, +// especially as these rely on third parties (i.e., Firebase *cough* *cough* +// Google's palantir *cough*) that may represent a security risk to the user. func (m *E2e) RegisterForNotifications(token string) error { jww.INFO.Printf("RegisterForNotifications(%s)", token) // Pull the host from the manage notificationBotHost, ok := m.GetComms().GetHost(&id.NotificationBot) if !ok { - return errors.New("RegisterForNotifications: Failed to retrieve host for notification bot") + return errors.New("RegisterForNotifications: " + + "Failed to retrieve host for notification bot") } intermediaryReceptionID, sig, err := m.getIidAndSig() if err != nil { @@ -59,7 +58,7 @@ func (m *E2e) RegisterForNotifications(token string) error { return nil } -// UnregisterForNotifications turns of notifications for this client +// UnregisterForNotifications turns off notifications for this client. func (m *E2e) UnregisterForNotifications() error { jww.INFO.Printf("UnregisterForNotifications()") // Pull the host from the manage @@ -71,11 +70,12 @@ func (m *E2e) UnregisterForNotifications() error { if err != nil { return err } - // Send the unregister message - _, err = m.GetComms().UnregisterForNotifications(notificationBotHost, &mixmessages.NotificationUnregisterRequest{ - IntermediaryId: intermediaryReceptionID, - IIDTransmissionRsaSig: sig, - }) + // Sends the unregister message + _, err = m.GetComms().UnregisterForNotifications(notificationBotHost, + &mixmessages.NotificationUnregisterRequest{ + IntermediaryId: intermediaryReceptionID, + IIDTransmissionRsaSig: sig, + }) if err != nil { err := errors.Errorf( "RegisterForNotifications: Unable to register for notifications! %s", err) @@ -86,17 +86,21 @@ func (m *E2e) UnregisterForNotifications() error { } func (m *E2e) getIidAndSig() ([]byte, []byte, error) { - intermediaryReceptionID, err := ephemeral.GetIntermediaryId(m.GetStorage().GetReceptionID()) + intermediaryReceptionID, err := ephemeral.GetIntermediaryId( + m.GetStorage().GetReceptionID()) if err != nil { - return nil, nil, errors.WithMessage(err, "RegisterForNotifications: Failed to form intermediary ID") + return nil, nil, errors.WithMessage(err, + "RegisterForNotifications: Failed to form intermediary ID") } h, err := hash.NewCMixHash() if err != nil { - return nil, nil, errors.WithMessage(err, "RegisterForNotifications: Failed to create cmix hash") + return nil, nil, errors.WithMessage(err, + "RegisterForNotifications: Failed to create cMix hash") } _, err = h.Write(intermediaryReceptionID) if err != nil { - return nil, nil, errors.WithMessage(err, "RegisterForNotifications: Failed to write intermediary ID to hash") + return nil, nil, errors.WithMessage(err, + "RegisterForNotifications: Failed to write intermediary ID to hash") } stream := m.GetRng().GetStream() @@ -104,7 +108,8 @@ func (m *E2e) getIidAndSig() ([]byte, []byte, error) { m.GetStorage().GetTransmissionRSA(), hash.CMixHash, h.Sum(nil), nil) if err != nil { - return nil, nil, errors.WithMessage(err, "RegisterForNotifications: Failed to sign intermediary ID") + return nil, nil, errors.WithMessage(err, + "RegisterForNotifications: Failed to sign intermediary ID") } stream.Close() return intermediaryReceptionID, sig, nil diff --git a/xxdk/params.go b/xxdk/params.go index c5768a2a0512560367f9e0cb5ad3d7f9221ab3c9..3313b265d1e3263140cc0a7672e8c12b26672835 100644 --- a/xxdk/params.go +++ b/xxdk/params.go @@ -7,33 +7,87 @@ package xxdk +// params.go define the high level parameters structures (which embed E2E and +// CMIX params respectively) that are passed down into the core xxdk modules. + import ( "encoding/json" + + "gitlab.com/elixxir/client/auth" "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/e2e" "gitlab.com/elixxir/client/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/e2e/rekey" ) -type Params struct { - CMix cmix.Params - Session session.Params +// CMIXParams contains the parameters for Network tracking and for specific CMIX +// messaging settings. +// +// FIXME: this breakdown could be cleaner and is an unfortunate side effect of +// several refactors of the codebase. +type CMIXParams struct { + Network cmix.Params + CMIX cmix.CMIXParams +} + +// E2EParams holds all the settings for e2e and it's various submodules. +// +// Note that Base wraps cmix.CMIXParams to control message send params, so that +// xxdk library users should copy the desired settings to both. +// FIXME: this should not wrap a copy of cmix.CMIXParams. +type E2EParams struct { + Session session.Params + Base e2e.Params + Rekey rekey.Params + EphemeralRekey rekey.Params + Auth auth.Params } -func GetDefaultParams() Params { - return Params{ - CMix: cmix.GetDefaultParams(), - Session: session.GetDefaultParams(), +//////////////////////////////////////////////////////////////////////////////// +// CMix Params Helper Functions // +//////////////////////////////////////////////////////////////////////////////// + +// GetDefaultCMixParams returns a new CMIXParams with the default parameters. +func GetDefaultCMixParams() CMIXParams { + return CMIXParams{ + Network: cmix.GetDefaultParams(), + CMIX: cmix.GetDefaultCMIXParams(), } } -// GetParameters returns the default Params, or override with given -// parameters, if set. -func GetParameters(params string) (Params, error) { - p := GetDefaultParams() - if len(params) > 0 { - err := json.Unmarshal([]byte(params), &p) - if err != nil { - return Params{}, err - } +// Unmarshal fills an empty object with the deserialized contents of the JSON +// data. +func (p *CMIXParams) Unmarshal(jsonData []byte) error { + return json.Unmarshal(jsonData, p) +} + +// Marshal creates JSON data of the object. +func (p *CMIXParams) Marshal() ([]byte, error) { + return json.Marshal(p) +} + +//////////////////////////////////////////////////////////////////////////////// +// E2E Params Helper Functions // +//////////////////////////////////////////////////////////////////////////////// + +// GetDefaultE2EParams returns a new E2EParams with the default parameters. +func GetDefaultE2EParams() E2EParams { + return E2EParams{ + Session: session.GetDefaultParams(), + Base: e2e.GetDefaultParams(), + Rekey: rekey.GetDefaultParams(), + EphemeralRekey: rekey.GetDefaultEphemeralParams(), + Auth: auth.GetDefaultParams(), } - return p, nil +} + +// Unmarshal fills an empty object with the deserialized contents of the JSON +// data. +func (p *E2EParams) Unmarshal(jsonData []byte) error { + return json.Unmarshal(jsonData, p) +} + +// Marshal creates JSON data of the object. +func (p *E2EParams) Marshal() ([]byte, error) { + return json.Marshal(p) } diff --git a/xxdk/params_test.go b/xxdk/params_test.go index 13868e1fb03e192a9a94cc916960d4121a871b08..2386b2c99c9b3a93cac29e1a2bc1d10b9c820c8d 100644 --- a/xxdk/params_test.go +++ b/xxdk/params_test.go @@ -13,11 +13,11 @@ import ( "testing" ) -// Tests that no data is lost when marshaling and -// unmarshaling the Params object. +// Tests that no data is lost when marshaling and unmarshalling the CMIXParams +// object. func TestParams_MarshalUnmarshal(t *testing.T) { // Construct a set of params - p := GetDefaultParams() + p := GetDefaultCMixParams() // Marshal the params data, err := json.Marshal(&p) @@ -28,7 +28,7 @@ func TestParams_MarshalUnmarshal(t *testing.T) { t.Logf("%s", string(data)) // Unmarshal the params object - received := Params{} + received := CMIXParams{} err = json.Unmarshal(data, &received) if err != nil { t.Fatalf("Unmarshal error: %v", err) @@ -42,9 +42,8 @@ func TestParams_MarshalUnmarshal(t *testing.T) { t.Logf("%s", string(data2)) - // Check that they match (it is done this way to avoid - // false failures with the reflect.DeepEqual function and - // pointers) + // Check that they match (it is done this way to avoid false failures when + // using the reflect.DeepEqual function and pointers) if !bytes.Equal(data, data2) { t.Fatalf("Data was lost in marshal/unmarshal.") } diff --git a/xxdk/permissioning.go b/xxdk/permissioning.go index e3327d8a875c33885c3194013434e0b8d7037252..e5f4032e24ff5b226e855fb9f3a9bf0fba8d6140 100644 --- a/xxdk/permissioning.go +++ b/xxdk/permissioning.go @@ -14,36 +14,34 @@ import ( "gitlab.com/elixxir/client/storage/user" ) -// Returns an error if registration fails. +// registerWithPermissioning returns an error if registration fails. func (c *Cmix) registerWithPermissioning() error { - //get the users public key + // Get the users public key transmissionPubKey := c.storage.GetTransmissionRSA().GetPublic() receptionPubKey := c.storage.GetReceptionRSA().GetPublic() - //load the registration code + // Load the registration code regCode, err := c.storage.GetRegCode() if err != nil { - return errors.WithMessage(err, "failed to register with "+ - "permissioning") + return errors.WithMessage(err, "failed to register with permissioning") } - //register with registration + // Register with registration transmissionRegValidationSignature, receptionRegValidationSignature, registrationTimestamp, err := c.permissioning.Register( transmissionPubKey, receptionPubKey, regCode) if err != nil { - return errors.WithMessage(err, "failed to register with "+ - "permissioning") + return errors.WithMessage(err, "failed to register with permissioning") } - //store the signature + // store the signature c.storage.SetTransmissionRegistrationValidationSignature( transmissionRegValidationSignature) c.storage.SetReceptionRegistrationValidationSignature( receptionRegValidationSignature) c.storage.SetRegistrationTimestamp(registrationTimestamp) - //update the registration state + // Update the registration state err = c.storage.ForwardRegistrationStatus(storage.PermissioningComplete) if err != nil { return errors.WithMessage(err, "failed to update local state "+ @@ -52,15 +50,14 @@ func (c *Cmix) registerWithPermissioning() error { return nil } -// ConstructProtoUserFile is a helper function which is used for proto -// client testing. This is used for development testing. +// ConstructProtoUserFile is a helper function that is used for proto client +// testing. This is used for development testing. func (c *Cmix) ConstructProtoUserFile() ([]byte, error) { - //load the registration code + // Load the registration code regCode, err := c.storage.GetRegCode() if err != nil { - return nil, errors.WithMessage(err, "failed to register with "+ - "permissioning") + return nil, errors.WithMessage(err, "failed to get registration code") } userInfo := c.GetStorage().PortableUserInfo() @@ -82,8 +79,7 @@ func (c *Cmix) ConstructProtoUserFile() ([]byte, error) { jsonBytes, err := json.Marshal(Usr) if err != nil { - return nil, errors.WithMessage(err, "failed to register with "+ - "permissioning") + return nil, errors.WithMessage(err, "failed to JSON marshal user.Proto") } return jsonBytes, nil diff --git a/xxdk/precan.go b/xxdk/precan.go index 51ae566f33d7983bf2009c3b5e3107551653f1ab..98437456b51f63b18757311ab64d62fe37262ebe 100644 --- a/xxdk/precan.go +++ b/xxdk/precan.go @@ -9,60 +9,26 @@ package xxdk import ( "encoding/binary" + "math/rand" + "github.com/cloudflare/circl/dh/sidh" "gitlab.com/elixxir/client/e2e/ratchet/partner/session" util "gitlab.com/elixxir/client/storage/utility" "gitlab.com/elixxir/crypto/contact" - "gitlab.com/elixxir/crypto/cyclic" - "gitlab.com/elixxir/crypto/diffieHellman" - "gitlab.com/elixxir/primitives/fact" - "math/rand" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/storage/user" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/crypto/csprng" - "gitlab.com/xx_network/crypto/signature/rsa" - "gitlab.com/xx_network/primitives/id" ) -// CreatePrecannedUser creates a precanned user -func CreatePrecannedUser(precannedID uint, rng csprng.Source) user.Info { - - // Salt, UID, etc gen - salt := make([]byte, SaltSize) - - userID := id.ID{} - binary.BigEndian.PutUint64(userID[:], uint64(precannedID)) - userID.SetType(id.User) - - // NOTE: not used... RSA Keygen (4096 bit defaults) - rsaKey, err := rsa.GenerateKey(rng, rsa.DefaultRSABitLen) - if err != nil { - jww.FATAL.Panicf(err.Error()) - } - - return user.Info{ - TransmissionID: &userID, - TransmissionSalt: salt, - ReceptionID: &userID, - ReceptionSalt: salt, - Precanned: true, - E2eDhPrivateKey: nil, - E2eDhPublicKey: nil, - TransmissionRSA: rsaKey, - ReceptionRSA: rsaKey, - } -} - -// NewPrecannedClient creates an insecure user with predetermined keys -// with nodes It creates client storage, generates keys, connects, and -// registers with the network. Note that this does not register a -// username/identity, but merely creates a new cryptographic identity -// for adding such information at a later date. +// NewPrecannedClient creates an insecure user with predetermined keys with +// nodes. It creates client storage, generates keys, connects, and registers +// with the network. Note that this does not register a username/identity, but +// merely creates a new cryptographic identity for adding such information at a +// later date. func NewPrecannedClient(precannedID uint, defJSON, storageDir string, - password []byte) (ReceptionIdentity, error) { + password []byte) error { jww.INFO.Printf("NewPrecannedClient()") rngStreamGen := fastRNG.NewStreamGenerator(12, 1024, csprng.NewSystemRNG) @@ -70,50 +36,44 @@ func NewPrecannedClient(precannedID uint, defJSON, storageDir string, def, err := ParseNDF(defJSON) if err != nil { - return ReceptionIdentity{}, err + return err } cmixGrp, e2eGrp := DecodeGroups(def) - dhPrivKey := generatePrecanDHKeypair(precannedID, e2eGrp) - - protoUser := CreatePrecannedUser(precannedID, rngStream) - identity, err := buildReceptionIdentity(protoUser, e2eGrp, dhPrivKey) - if err != nil { - return ReceptionIdentity{}, err - } - + userInfo := createPrecannedUser(precannedID, rngStream, e2eGrp) store, err := CheckVersionAndSetupStorage(def, storageDir, password, - protoUser, cmixGrp, e2eGrp, "") + userInfo, cmixGrp, e2eGrp, "") if err != nil { - return ReceptionIdentity{}, err + return err } // Mark the precanned user as finished with permissioning and registered // with the network. err = store.ForwardRegistrationStatus(storage.PermissioningComplete) if err != nil { - return ReceptionIdentity{}, err + return err } - return identity, err -} - -func generatePrecanDHKeypair(precannedID uint, e2eGrp *cyclic.Group) *cyclic.Int { - // DH Keygen - prng := rand.New(rand.NewSource(int64(precannedID))) - prime := e2eGrp.GetPBytes() - keyLen := len(prime) - priv := diffieHellman.GeneratePrivateKey(keyLen, e2eGrp, prng) - return priv + return err } -// Create an insecure e2e relationship with a precanned user +// MakePrecannedAuthenticatedChannel creates an insecure E2E relationship with a +// precanned user. func (m *E2e) MakePrecannedAuthenticatedChannel(precannedID uint) ( contact.Contact, error) { - precan := m.MakePrecannedContact(precannedID) + rng := m.GetRng().GetStream() + precanUserInfo := createPrecannedUser(precannedID, rng, m.GetStorage().GetE2EGroup()) + rng.Close() + precanRecipient, err := buildReceptionIdentity(precanUserInfo.ReceptionID, + precanUserInfo.ReceptionSalt, precanUserInfo.ReceptionRSA, + m.GetStorage().GetE2EGroup(), precanUserInfo.E2eDhPrivateKey) + if err != nil { + return contact.Contact{}, err + } + precanContact := precanRecipient.GetContact() - myID := binary.BigEndian.Uint64(m.GetStorage().GetReceptionID()[:]) + myID := binary.BigEndian.Uint64(m.GetReceptionIdentity().ID[:]) // Pick a variant based on if their ID is bigger than mine. myVariant := sidh.KeyVariantSidhA theirVariant := sidh.KeyVariant(sidh.KeyVariantSidhB) @@ -124,49 +84,31 @@ func (m *E2e) MakePrecannedAuthenticatedChannel(precannedID uint) ( prng1 := rand.New(rand.NewSource(int64(precannedID))) theirSIDHPrivKey := util.NewSIDHPrivateKey(theirVariant) theirSIDHPubKey := util.NewSIDHPublicKey(theirVariant) - theirSIDHPrivKey.Generate(prng1) + err = theirSIDHPrivKey.Generate(prng1) + if err != nil { + return contact.Contact{}, err + } theirSIDHPrivKey.GeneratePublicKey(theirSIDHPubKey) prng2 := rand.New(rand.NewSource(int64(myID))) mySIDHPrivKey := util.NewSIDHPrivateKey(myVariant) mySIDHPubKey := util.NewSIDHPublicKey(myVariant) - mySIDHPrivKey.Generate(prng2) + err = mySIDHPrivKey.Generate(prng2) + if err != nil { + return contact.Contact{}, err + } mySIDHPrivKey.GeneratePublicKey(mySIDHPubKey) - // add the precanned user as a e2e contact + // Add the precanned user as a e2e contact // FIXME: these params need to be threaded through... sesParam := session.GetDefaultParams() - _, err := m.e2e.AddPartner(precan.ID, precan.DhPubKey, + _, err = m.e2e.AddPartner(precanContact.ID, precanContact.DhPubKey, m.e2e.GetHistoricalDHPrivkey(), theirSIDHPubKey, mySIDHPrivKey, sesParam, sesParam) - // check garbled messages in case any messages arrived before creating + // Check garbled messages in case any messages arrived before creating // the channel m.GetCmix().CheckInProgressMessages() - return precan, err -} - -// Create an insecure e2e contact object for a precanned user -func (m *E2e) MakePrecannedContact(precannedID uint) contact.Contact { - - e2eGrp := m.GetStorage().GetE2EGroup() - - rng := m.GetRng().GetStream() - precanned := CreatePrecannedUser(precannedID, rng) - rng.Close() - - precanned.E2eDhPrivateKey = generatePrecanDHKeypair(precannedID, - m.GetStorage().GetE2EGroup()) - - // compute their public e2e key - partnerPubKey := e2eGrp.ExpG(precanned.E2eDhPrivateKey, - e2eGrp.NewInt(1)) - - return contact.Contact{ - ID: precanned.ReceptionID, - DhPubKey: partnerPubKey, - OwnershipProof: nil, - Facts: make([]fact.Fact, 0), - } + return precanContact, err } diff --git a/xxdk/services.go b/xxdk/services.go index b44149ec16fdf8ff5b01bd4dbc5f3c5bb5cd78c2..104362102a3fd6e35483df7208924c83b0a37d2c 100644 --- a/xxdk/services.go +++ b/xxdk/services.go @@ -7,8 +7,8 @@ import ( "time" ) -// a service process starts itself in a new thread, returning from the -// originator a stopable to control it +// Service is a service process that starts itself in a new thread, returning +// from the originator a stoppable to control it. type Service func() (stoppable.Stoppable, error) type services struct { @@ -18,8 +18,8 @@ type services struct { mux sync.Mutex } -// newServiceProcessiesList creates a new services list which will add its -// services to the passed mux +// newServices creates a new services list that will add its services to the +// passed mux. func newServices() *services { return &services{ services: make([]Service, 0), @@ -28,16 +28,16 @@ func newServices() *services { } } -// Add adds the service process to the list and adds it to the multi-stopable. -// Start running it if services are running +// add appends the service process to the list and adds it to the multi- +// stoppable. Start running it if services are running. func (s *services) add(sp Service) error { s.mux.Lock() defer s.mux.Unlock() - //append the process to the list + // append the process to the list s.services = append(s.services, sp) - //if services are running, start the process + // if services are running, start the process if s.state == Running { stop, err := sp() if err != nil { @@ -48,14 +48,14 @@ func (s *services) add(sp Service) error { return nil } -// Runs all services. If they are in the process of stopping, -// it will wait for the stop to complete or the timeout to ellapse -// Will error if already running +// start runs all services. If they are in the process of stopping, it will wait +// for the stop to complete or the timeout to elapse. Will error if already +// running. func (s *services) start(timeout time.Duration) error { s.mux.Lock() defer s.mux.Unlock() - //handle various states + // handle various states switch s.state { case Stopped: break @@ -69,10 +69,10 @@ func (s *services) start(timeout time.Duration) error { } } - //create a new stopable + // Create a new stoppable s.stoppable = stoppable.NewMulti(followerStoppableName) - //start all services and register with the stoppable + // Start all services and register with the stoppable for _, sp := range s.services { stop, err := sp() if err != nil { @@ -86,8 +86,8 @@ func (s *services) start(timeout time.Duration) error { return nil } -// Stops all currently running services. Will return an -// error if the state is not "running" +// stop closes all currently running services. It returns an error if the stat +// is not Running. func (s *services) stop() error { s.mux.Lock() defer s.mux.Unlock() @@ -108,7 +108,7 @@ func (s *services) stop() error { return nil } -// returns the current state of services +// status returns the current state of services. func (s *services) status() Status { s.mux.Lock() defer s.mux.Unlock() diff --git a/xxdk/services_test.go b/xxdk/services_test.go index c87f3bcecb79775214992747eaad06cf826b159b..580df8f5ad21ab015c281d4a9e2b4d51d4e6af66 100644 --- a/xxdk/services_test.go +++ b/xxdk/services_test.go @@ -8,15 +8,15 @@ package xxdk import ( - "errors" + "github.com/pkg/errors" "gitlab.com/elixxir/client/stoppable" "reflect" "testing" "time" ) -// Unit test -func TestNewServices(t *testing.T) { +// Unit test of newServices. +func Test_newServices(t *testing.T) { expected := &services{ services: make([]Service, 0), stoppable: stoppable.NewMulti("services"), @@ -32,8 +32,8 @@ func TestNewServices(t *testing.T) { } } -// Unit test -func TestServices_Add(t *testing.T) { +// Unit test of services.add. +func Test_services_add(t *testing.T) { mockService := func() (stoppable.Stoppable, error) { return nil, nil } @@ -42,7 +42,7 @@ func TestServices_Add(t *testing.T) { err := mockServices.add(mockService) if err != nil { - t.Fatalf("Failed to add mock service to services: %v", err) + t.Fatalf("Failed to add mock service to the services list: %v", err) } err = mockServices.start(500 * time.Millisecond) @@ -62,7 +62,8 @@ func TestServices_Add(t *testing.T) { } } -func TestServices_Start(t *testing.T) { +// Unit test of services.start. +func Test_services_start(t *testing.T) { mockService := func() (stoppable.Stoppable, error) { return nil, nil } @@ -71,7 +72,7 @@ func TestServices_Start(t *testing.T) { err := mockServices.add(mockService) if err != nil { - t.Fatalf("Failed to add mock service to services: %v", err) + t.Fatalf("Failed to add mock service to the services list: %v", err) } err = mockServices.start(500) @@ -86,7 +87,8 @@ func TestServices_Start(t *testing.T) { } } -func TestServices_Stop(t *testing.T) { +// Unit test of services.stop. +func Test_services_stop(t *testing.T) { mockService := func() (stoppable.Stoppable, error) { return stoppable.NewSingle("test"), nil } @@ -95,7 +97,7 @@ func TestServices_Stop(t *testing.T) { err := mockServices.add(mockService) if err != nil { - t.Fatalf("Failed to add mock service to services: %v", err) + t.Fatalf("Failed to add mock service to the services list: %v", err) } err = mockServices.stop() diff --git a/xxdk/status.go b/xxdk/status.go index f613f87d454032d05f2114999d95728b4e2670a9..92e1475de1d6bd3f43676ab90554dfc5665b524b 100644 --- a/xxdk/status.go +++ b/xxdk/status.go @@ -11,14 +11,25 @@ import ( "fmt" ) +// Status holds the status of the network. type Status int const ( - Stopped Status = 0 - Running Status = 2000 + // Stopped signifies that the network follower is stopped; none of its + // processes are running. + Stopped Status = 0 + + // Running signifies that the network follower and its processes are active + // and running. + Running Status = 2000 + + // Stopping signifies that the network follower has been signalled to stop + // and is in the processes of stopping the processes. Stopping Status = 3000 ) +// String returns a human-readable string version of the status. This function +// adheres to the fmt.Stringer interface. func (s Status) String() string { switch s { case Stopped: @@ -28,6 +39,6 @@ func (s Status) String() string { case Stopping: return "Stopping" default: - return fmt.Sprintf("Unknown state %d", s) + return fmt.Sprintf("Unknown status %d", s) } } diff --git a/xxdk/user.go b/xxdk/user.go index 4eb421050ed68c242dff2b1f509d01b41c05cdc8..fbf9d339fe5b39b9cde45fa4231e37724222be49 100644 --- a/xxdk/user.go +++ b/xxdk/user.go @@ -8,6 +8,8 @@ package xxdk import ( + "encoding/binary" + "math/rand" "regexp" "runtime" "strings" @@ -26,18 +28,18 @@ import ( ) const ( - // SaltSize size of user salts + // SaltSize is the length of user salts, in bytes. SaltSize = 32 ) -// createNewUser generates an identity for cMix -func createNewUser(rng *fastRNG.StreamGenerator) user.Info { +// createNewUser generates an identity for cMix. +func createNewUser(rng *fastRNG.StreamGenerator, e2eGroup *cyclic.Group) user.Info { // CMIX Keygen var transmissionRsaKey, receptionRsaKey *rsa.PrivateKey var transmissionSalt, receptionSalt []byte - transmissionSalt, receptionSalt, - transmissionRsaKey, receptionRsaKey = createKeys(rng) + e2eKeyBytes, transmissionSalt, receptionSalt, + transmissionRsaKey, receptionRsaKey := createKeys(rng, e2eGroup) transmissionID, err := xx.NewID(transmissionRsaKey.GetPublic(), transmissionSalt, id.User) @@ -51,6 +53,7 @@ func createNewUser(rng *fastRNG.StreamGenerator) user.Info { jww.FATAL.Panicf(err.Error()) } + dhPrivKey := e2eGroup.NewIntFromBytes(e2eKeyBytes) return user.Info{ TransmissionID: transmissionID.DeepCopy(), TransmissionSalt: transmissionSalt, @@ -59,29 +62,43 @@ func createNewUser(rng *fastRNG.StreamGenerator) user.Info { ReceptionSalt: receptionSalt, ReceptionRSA: receptionRsaKey, Precanned: false, - E2eDhPrivateKey: nil, - E2eDhPublicKey: nil, + E2eDhPrivateKey: dhPrivKey, + E2eDhPublicKey: diffieHellman.GeneratePublicKey(dhPrivKey, e2eGroup), } } -func createKeys(rng *fastRNG.StreamGenerator) ( - transmissionSalt, receptionSalt []byte, +func createKeys(rng *fastRNG.StreamGenerator, e2e *cyclic.Group) ( + e2eKeyBytes, transmissionSalt, receptionSalt []byte, transmissionRsaKey, receptionRsaKey *rsa.PrivateKey) { wg := sync.WaitGroup{} - wg.Add(2) + wg.Add(3) + + go func() { + defer wg.Done() + var err error + // DH Keygen + // FIXME: Why 256 bits? -- this is spec but not explained, it has + // to do with optimizing operations on one side and still preserves + // decent security -- cite this. Why valid for BOTH e2e and cMix? + stream := rng.GetStream() + e2eKeyBytes, err = csprng.GenerateInGroup(e2e.GetPBytes(), 256, stream) + stream.Close() + if err != nil { + jww.FATAL.Panicf(err.Error()) + } + }() // RSA Keygen (4096 bit defaults) go func() { defer wg.Done() var err error stream := rng.GetStream() - transmissionRsaKey, err = rsa.GenerateKey(stream, - rsa.DefaultRSABitLen) + transmissionRsaKey, err = rsa.GenerateKey(stream, rsa.DefaultRSABitLen) if err != nil { jww.FATAL.Panicf(err.Error()) } - transmissionSalt = make([]byte, 32) + transmissionSalt = make([]byte, SaltSize) _, err = stream.Read(transmissionSalt) stream.Close() if err != nil { @@ -93,12 +110,11 @@ func createKeys(rng *fastRNG.StreamGenerator) ( defer wg.Done() var err error stream := rng.GetStream() - receptionRsaKey, err = rsa.GenerateKey(stream, - rsa.DefaultRSABitLen) + receptionRsaKey, err = rsa.GenerateKey(stream, rsa.DefaultRSABitLen) if err != nil { jww.FATAL.Panicf(err.Error()) } - receptionSalt = make([]byte, 32) + receptionSalt = make([]byte, SaltSize) _, err = stream.Read(receptionSalt) stream.Close() if err != nil { @@ -107,28 +123,13 @@ func createKeys(rng *fastRNG.StreamGenerator) ( }() wg.Wait() - isZero := func(data []byte) bool { - if len(data) == 0 { - return true - } - for i := len(data) - 1; i != 0; i-- { - if data[i] != 0 { - return false - } - } - return true - } - - if isZero(receptionSalt) || isZero(transmissionSalt) { - jww.FATAL.Panicf("empty salt generation detected") - } return } -// createNewVanityUser generates an identity for cMix -// The identity's ReceptionID is not random but starts with the supplied prefix -func createNewVanityUser(rng csprng.Source, cmix, +// createNewVanityUser generates an identity for cMix. The identity's +// ReceptionID is not random but starts with the supplied prefix. +func createNewVanityUser(rng csprng.Source, e2e *cyclic.Group, prefix string) user.Info { // DH Keygen prime := e2e.GetPBytes() @@ -162,8 +163,8 @@ func createNewVanityUser(rng csprng.Source, cmix, jww.FATAL.Panicf(err.Error()) } - // just in case more than one go routine tries to access - // receptionSalt and receptionID + // Just in case more than one go routine tries to access receptionSalt and + // receptionID var mu sync.Mutex done := make(chan struct{}) found := make(chan bool) @@ -175,11 +176,13 @@ func createNewVanityUser(rng csprng.Source, cmix, pref := prefix ignoreCase := false - // check if case-insensitivity is enabled + + // Check if case-insensitivity is enabled if strings.HasPrefix(prefix, "(?i)") { pref = strings.ToLower(pref[4:]) ignoreCase = true } + // Check if prefix contains valid Base64 characters match, _ := regexp.MatchString("^[A-Za-z0-9+/]+$", pref) if match == false { @@ -194,7 +197,7 @@ func createNewVanityUser(rng csprng.Source, cmix, for { select { case <-done: - defer wg.Done() + wg.Done() return default: n, err = csprng.NewSystemRNG().Read( @@ -214,28 +217,30 @@ func createNewVanityUser(rng csprng.Source, cmix, if err != nil { jww.FATAL.Panicf(err.Error()) } - id := rID.String() + rid := rID.String() if ignoreCase { - id = strings.ToLower(id) + rid = strings.ToLower(rid) } - if strings.HasPrefix(id, pref) { + if strings.HasPrefix(rid, pref) { mu.Lock() receptionID = rID receptionSalt = rSalt mu.Unlock() found <- true - defer wg.Done() + wg.Done() return } } } }() } - // wait for a solution then close the done channel to signal - // the workers to exit + + // Wait for a solution then close the done channel to signal the workers to + // exit <-found close(done) wg.Wait() + return user.Info{ TransmissionID: transmissionID.DeepCopy(), TransmissionSalt: transmissionSalt, @@ -248,3 +253,34 @@ func createNewVanityUser(rng csprng.Source, cmix, E2eDhPublicKey: diffieHellman.GeneratePublicKey(e2eKey, e2e), } } + +func createPrecannedUser(precannedID uint, rng csprng.Source, grp *cyclic.Group) user.Info { + // Salt, UID, etc gen + salt := make([]byte, SaltSize) + + userID := id.ID{} + binary.BigEndian.PutUint64(userID[:], uint64(precannedID)) + userID.SetType(id.User) + + // NOTE: not used... RSA Keygen (4096 bit defaults) + rsaKey, err := rsa.GenerateKey(rng, rsa.DefaultRSABitLen) + if err != nil { + jww.FATAL.Panicf(err.Error()) + } + + prime := grp.GetPBytes() + keyLen := len(prime) + prng := rand.New(rand.NewSource(int64(precannedID))) + dhPrivKey := diffieHellman.GeneratePrivateKey(keyLen, grp, prng) + return user.Info{ + TransmissionID: &userID, + TransmissionSalt: salt, + ReceptionID: &userID, + ReceptionSalt: salt, + Precanned: true, + E2eDhPrivateKey: dhPrivKey, + E2eDhPublicKey: diffieHellman.GeneratePublicKey(dhPrivKey, grp), + TransmissionRSA: rsaKey, + ReceptionRSA: rsaKey, + } +} diff --git a/xxdk/utils.go b/xxdk/utils.go index d4ade6ce9f6d87f423da4b95e91a3aa5cfeb1019..869d9529d111817805fe424c598c07fe5beb6d59 100644 --- a/xxdk/utils.go +++ b/xxdk/utils.go @@ -25,8 +25,8 @@ const ( desiredPreviewSize = 32 * 24 ) -// CompressJpeg takes a JPEG image in byte format -// and compresses it based on desired output size +// CompressJpeg takes a JPEG image in byte format and compresses it based on +// desired output size. func CompressJpeg(imgBytes []byte) ([]byte, error) { // Convert bytes to a reader imgBuf := bytes.NewReader(imgBytes) @@ -76,8 +76,8 @@ func CompressJpeg(imgBytes []byte) ([]byte, error) { return newImgBuf.Bytes(), nil } -// CompressJpeg takes a JPEG image in byte format -// and compresses it based on desired output size +// CompressJpegForPreview takes a JPEG image in byte format and compresses it +// based on desired output size. func CompressJpegForPreview(imgBytes []byte) ([]byte, error) { // Convert bytes to a reader imgBuf := bytes.NewReader(imgBytes) diff --git a/xxdk/utils_test.go b/xxdk/utils_test.go index e537fc3b9f7863f5ee051d03c61dc4dd0fc60937..f5ca8f965078da696a3aadbe0dd1578595339a98 100644 --- a/xxdk/utils_test.go +++ b/xxdk/utils_test.go @@ -45,7 +45,7 @@ func newTestingClient(face interface{}) (*Cmix, error) { "Could not construct a mock client: %v", err) } - c, err := OpenCmix(storageDir, password, GetDefaultParams()) + c, err := OpenCmix(storageDir, password) if err != nil { return nil, errors.Errorf("Could not open a mock client: %v", err) @@ -58,8 +58,11 @@ func newTestingClient(face interface{}) (*Cmix, error) { jww.FATAL.Panicf("Failed to create new test instance: %v", err) } - commsManager.AddHost(&id.Permissioning, "", cert, - connect.GetDefaultHostParams()) + _, err = commsManager.AddHost( + &id.Permissioning, "", cert, connect.GetDefaultHostParams()) + if err != nil { + return nil, err + } instanceComms := &connect.ProtoComms{ Manager: commsManager, } @@ -82,7 +85,7 @@ func newTestingClient(face interface{}) (*Cmix, error) { return c, nil } -// Helper function which generates an ndf for testing +// Helper function that generates an NDF for testing. func getNDF(face interface{}) *ndf.NetworkDefinition { switch face.(type) { case *testing.T, *testing.M, *testing.B, *testing.PB: @@ -152,8 +155,8 @@ func getNDF(face interface{}) *ndf.NetworkDefinition { } } -// Signs a passed round info with the key tied to the test nodes cert -// used throughout utils and other tests +// signRoundInfo signs a passed round info with the key tied to the test node's +// cert used throughout utils and other tests. func signRoundInfo(ri *pb.RoundInfo) error { privKeyFromFile := testkeys.LoadFromPath(testkeys.GetNodeKeyPath()) diff --git a/xxdk/version_vars.go b/xxdk/version_vars.go index c7e51f9da6c60b59f90315518d4b4d80e1b4e09d..761f1c01c5b0ff5acb0c8eb00d4a3c944af637f1 100644 --- a/xxdk/version_vars.go +++ b/xxdk/version_vars.go @@ -1,9 +1,10 @@ // Code generated by go generate; DO NOT EDIT. // This file was generated by robots at -// 2022-06-16 12:41:25.706495 -0500 CDT m=+0.027317522 +// 2022-07-12 15:40:24.099619 -0400 EDT m=+0.023592418 + package xxdk -const GITVERSION = `1e874329 fix Makefile` +const GITVERSION = `5b095fc0 general cleanup` const SEMVER = "4.2.0" const DEPENDENCIES = `module gitlab.com/elixxir/client @@ -23,9 +24,9 @@ require ( gitlab.com/elixxir/crypto v0.0.7-0.20220606201132-c370d5039cea gitlab.com/elixxir/ekv v0.1.7 gitlab.com/elixxir/primitives v0.0.3-0.20220606195757-40f7a589347f - gitlab.com/xx_network/comms v0.0.4-0.20220315161313-76acb14429ac + gitlab.com/xx_network/comms v0.0.4-0.20220630163702-f3d372ef6acd gitlab.com/xx_network/crypto v0.0.5-0.20220606200528-3f886fe49e81 - gitlab.com/xx_network/primitives v0.0.4-0.20220324193139-b292d1ae6e7e + gitlab.com/xx_network/primitives v0.0.4-0.20220712193914-aebd8544396e go.uber.org/ratelimit v0.2.0 golang.org/x/crypto v0.0.0-20220128200615-198e4374d7ed golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 diff --git a/xxmutils/restoreContacts.go b/xxmutils/restoreContacts.go index 0f8b6a565b0903fd8ea98b279610a0e307902383..0ec8e38c00b8b2a7693921f88651c633ad643525 100644 --- a/xxmutils/restoreContacts.go +++ b/xxmutils/restoreContacts.go @@ -37,7 +37,7 @@ import ( // xxDK users should not use this function. This function is used by // the mobile phone apps and are not intended to be part of the xxDK. It // should be treated as internal functions specific to the phone apps. -func RestoreContactsFromBackup(backupPartnerIDs []byte, client *xxdk.E2e, +func RestoreContactsFromBackup(backupPartnerIDs []byte, messenger *xxdk.E2e, udManager *ud.Manager, updatesCb interfaces.RestoreContactsUpdater) ([]*id.ID, []*id.ID, []error, error) { @@ -63,7 +63,7 @@ func RestoreContactsFromBackup(backupPartnerIDs []byte, client *xxdk.E2e, } store := stateStore{ - apiStore: client.GetStorage(), + apiStore: messenger.GetStorage(), } // Unmarshal IDs and then check restore state @@ -99,8 +99,8 @@ func RestoreContactsFromBackup(backupPartnerIDs []byte, client *xxdk.E2e, rsWg := &sync.WaitGroup{} rsWg.Add(numRoutines) for i := 0; i < numRoutines; i++ { - go LookupContacts(lookupCh, foundCh, failCh, client, udContact, lcWg) - go ResetSessions(resetContactCh, restoredCh, failCh, client, + go LookupContacts(lookupCh, foundCh, failCh, messenger, udContact, lcWg) + go ResetSessions(resetContactCh, restoredCh, failCh, messenger, rsWg) } @@ -178,13 +178,13 @@ func RestoreContactsFromBackup(backupPartnerIDs []byte, client *xxdk.E2e, // the mobile phone apps and are not intended to be part of the xxDK. It // should be treated as internal functions specific to the phone apps. func LookupContacts(in chan *id.ID, out chan *contact.Contact, - failCh chan failure, client *xxdk.E2e, udContact contact.Contact, + failCh chan failure, messenger *xxdk.E2e, udContact contact.Contact, wg *sync.WaitGroup) { defer wg.Done() // Start looking up contacts with user discovery and feed this // contacts channel. for lookupID := range in { - c, err := LookupContact(lookupID, client, udContact) + c, err := LookupContact(lookupID, messenger, udContact) if err == nil { out <- c continue @@ -205,10 +205,10 @@ func LookupContacts(in chan *id.ID, out chan *contact.Contact, // the mobile phone apps and are not intended to be part of the xxDK. It // should be treated as internal functions specific to the phone apps. func ResetSessions(in, out chan *contact.Contact, failCh chan failure, - client *xxdk.E2e, wg *sync.WaitGroup) { + messenger *xxdk.E2e, wg *sync.WaitGroup) { defer wg.Done() for c := range in { - _, err := client.GetAuth().Reset(*c) + _, err := messenger.GetAuth().Reset(*c) if err == nil { out <- c continue @@ -224,7 +224,7 @@ func ResetSessions(in, out chan *contact.Contact, failCh chan failure, // xxDK users should not use this function. This function is used by // the mobile phone apps and are not intended to be part of the xxDK. It // should be treated as internal functions specific to the phone apps. -func LookupContact(userID *id.ID, client *xxdk.E2e, udContact contact.Contact) ( +func LookupContact(userID *id.ID, messenger *xxdk.E2e, udContact contact.Contact) ( *contact.Contact, error) { // This is a little wonky, but wait until we get called then // set the result to the contact objects details if there is @@ -243,9 +243,9 @@ func LookupContact(userID *id.ID, client *xxdk.E2e, udContact contact.Contact) ( waiter.Lock() // in MS, so 90 seconds - stream := client.GetRng().GetStream() + stream := messenger.GetRng().GetStream() defer stream.Close() - _, _, err = ud.Lookup(client.GetCmix(), stream, client.GetE2E().GetGroup(), + _, _, err = ud.Lookup(messenger.GetCmix(), stream, messenger.GetE2E().GetGroup(), udContact, lookupCB, userID, single.GetDefaultRequestParams()) // Now force a wait for callback to exit