diff --git a/Makefile b/Makefile index 64cdc581e683cdbb63240888c31193b0fe10eb3d..8e59d3126d0c93a8958ffaeda27130e100b1fc5b 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ version: clean: rm -rf vendor/ - go mod vendor + go mod vendor -e update: -GOFLAGS="" go get all diff --git a/api/auth.go b/api/auth.go deleted file mode 100644 index dfd97b120139aa6c9719f950560e2f273e9a29b4..0000000000000000000000000000000000000000 --- a/api/auth.go +++ /dev/null @@ -1,117 +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 api - -import ( - "gitlab.com/elixxir/client/e2e/ratchet/partner" - - "github.com/pkg/errors" - jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/auth" - "gitlab.com/elixxir/crypto/contact" - "gitlab.com/xx_network/primitives/id" -) - -// RequestAuthenticatedChannel sends a request to another party to establish an -// authenticated channel -// It will not run if the network state is not healthy -// An error will be returned if a channel already exists or if a request was -// already received -// When a confirmation occurs, the channel will be created and the callback -// will be called -// Can be retried. -func (c *Client) RequestAuthenticatedChannel(recipient, me contact.Contact, - message string) (id.Round, error) { - jww.INFO.Printf("RequestAuthenticatedChannel(%s)", recipient.ID) - - if !c.network.IsHealthy() { - return 0, errors.New("Cannot request authenticated channel " + - "creation when the network is not healthy") - } - - return c.auth.Request(recipient, c.GetUser().GetContact().Facts) -} - -// ResetSession resets an authenticate channel that already exists -func (c *Client) ResetSession(recipient, me contact.Contact, - message string) (id.Round, error) { - jww.INFO.Printf("ResetSession(%s)", recipient.ID) - - if !c.network.IsHealthy() { - return 0, errors.New("Cannot request authenticated channel " + - "creation when the network is not healthy") - } - - return c.auth.Reset(recipient) -} - -// GetAuthRegistrar gets the object which allows the registration of auth -// callbacks -func (c *Client) GetAuthRegistrar() auth.State { - jww.INFO.Printf("GetAuthRegistrar(...)") - - return c.auth -} - -// GetAuthenticatedChannelRequest returns the contact received in a request if -// one exists for the given userID. Returns an error if no contact is found. -func (c *Client) GetAuthenticatedChannelRequest(partner *id.ID) (contact.Contact, error) { - jww.INFO.Printf("GetAuthenticatedChannelRequest(%s)", partner) - - return c.auth.GetReceivedRequest(partner) -} - -// ConfirmAuthenticatedChannel creates an authenticated channel out of a valid -// received request and sends a message to the requestor that the request has -// been confirmed -// It will not run if the network state is not healthy -// An error will be returned if a channel already exists, if a request doest -// exist, or if the passed in contact does not exactly match the received -// request -// Can be retried. -func (c *Client) ConfirmAuthenticatedChannel(recipient contact.Contact) (id.Round, error) { - jww.INFO.Printf("ConfirmAuthenticatedChannel(%s)", recipient.ID) - - if !c.network.IsHealthy() { - return 0, errors.New("Cannot request authenticated channel " + - "creation when the network is not healthy") - } - - return c.auth.Confirm(recipient) -} - -// VerifyOwnership checks if the ownership proof on a passed contact matches the -// identity in a verified contact -func (c *Client) VerifyOwnership(received, verified contact.Contact) bool { - jww.INFO.Printf("VerifyOwnership(%s)", received.ID) - - return c.auth.VerifyOwnership(received, verified, c.e2e) -} - -// HasAuthenticatedChannel returns true if an authenticated channel exists for -// the partner -func (c *Client) HasAuthenticatedChannel(partner *id.ID) bool { - m, err := c.e2e.GetPartner(partner) - return m != nil && err == nil -} - -// GetRelationshipFingerprint returns a unique 15 character fingerprint for an -// E2E relationship. An error is returned if no relationship with the partner -// is found. -func (c *Client) GetRelationshipFingerprint(p *id.ID) (string, error) { - m, err := c.e2e.GetPartner(p) - if err != nil { - return "", errors.Errorf("could not get partner %s: %+v", - partner.ConnectionFp{}, err) - } else if m == nil { - return "", errors.Errorf("manager for partner %s is nil.", - p) - } - - return m.ConnectionFingerprint().String(), nil -} diff --git a/api/client.go b/api/client.go index 7c23d024a5996778319aa06a78ee659909aa13ac..3c39f1194060b4d3b18c280d7cd21766715132a8 100644 --- a/api/client.go +++ b/api/client.go @@ -17,12 +17,7 @@ import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/auth" - "gitlab.com/elixxir/client/backup" - "gitlab.com/elixxir/client/catalog" "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/e2e" - "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/e2e/rekey" "gitlab.com/elixxir/client/event" "gitlab.com/elixxir/client/interfaces" "gitlab.com/elixxir/client/registration" @@ -30,7 +25,6 @@ import ( "gitlab.com/elixxir/client/storage" "gitlab.com/elixxir/client/storage/user" "gitlab.com/elixxir/comms/client" - cryptoBackup "gitlab.com/elixxir/crypto/backup" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/primitives/version" @@ -52,32 +46,21 @@ type Client struct { // appropriate storage storage.Session - // user state object - userState *user.User - - //object used for communications + //Low level comms object comms *client.Comms - // Network parameters, note e2e params wrap CMIXParams - parameters e2e.Params + //facilitates sane communications with cMix network cmix.Client + //object used to register and communicate with permissioning permissioning *registration.Registration - //object containing auth interactions - auth auth.State - - e2e e2e.Handler //services system to track running threads - followerServices *services - + followerServices *services clientErrorChannel chan interfaces.ClientError // Event reporting in event.go events *event.Manager - - // Handles the triggering and delivery of backups - backup *backup.Backup } // NewClient creates client storage, generates keys, connects, and registers @@ -90,20 +73,19 @@ func NewClient(ndfJSON, storageDir string, password []byte, rngStreamGen := fastRNG.NewStreamGenerator(12, 1024, csprng.NewSystemRNG) - def, err := parseNDF(ndfJSON) + def, err := ParseNDF(ndfJSON) if err != nil { return err } - cmixGrp, e2eGrp := decodeGroups(def) + cmixGrp, e2eGrp := DecodeGroups(def) start := netTime.Now() - protoUser := createNewUser(rngStreamGen, cmixGrp, e2eGrp) + protoUser := createNewUser(rngStreamGen) jww.DEBUG.Printf("PortableUserInfo generation took: %s", netTime.Now().Sub(start)) - _, err = checkVersionAndSetupStorage(def, storageDir, password, - protoUser, cmixGrp, e2eGrp, rngStreamGen, - registrationCode) + _, err = CheckVersionAndSetupStorage(def, storageDir, password, + protoUser, cmixGrp, e2eGrp, registrationCode) if err != nil { return err } @@ -124,18 +106,17 @@ func NewVanityClient(ndfJSON, storageDir string, password []byte, csprng.NewSystemRNG) rngStream := rngStreamGen.GetStream() - def, err := parseNDF(ndfJSON) + def, err := ParseNDF(ndfJSON) if err != nil { return err } - cmixGrp, e2eGrp := decodeGroups(def) + cmixGrp, e2eGrp := DecodeGroups(def) protoUser := createNewVanityUser(rngStream, cmixGrp, e2eGrp, userIdPrefix) - _, err = checkVersionAndSetupStorage(def, storageDir, password, - protoUser, cmixGrp, e2eGrp, rngStreamGen, - registrationCode) + _, err = CheckVersionAndSetupStorage(def, storageDir, password, + protoUser, cmixGrp, e2eGrp, registrationCode) if err != nil { return err } @@ -143,55 +124,6 @@ func NewVanityClient(ndfJSON, storageDir string, password []byte, return nil } -// NewClientFromBackup constructs a new Client from an encrypted -// backup. The backup is decrypted using the backupPassphrase. On -// success 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, - backupPassphrase []byte, backupFileContents []byte) ([]*id.ID, - string, error) { - - backUp := &cryptoBackup.Backup{} - err := backUp.Decrypt(string(backupPassphrase), backupFileContents) - if err != nil { - return nil, "", errors.WithMessage(err, - "Failed to unmarshal decrypted client contents.") - } - - usr := user.NewUserFromBackup(backUp) - - def, err := parseNDF(ndfJSON) - if err != nil { - return nil, "", err - } - - cmixGrp, e2eGrp := decodeGroups(def) - - rngStreamGen := fastRNG.NewStreamGenerator(12, 3, csprng.NewSystemRNG) - - // Note we do not need registration here - storageSess, err := checkVersionAndSetupStorage(def, storageDir, - []byte(sessionPassword), usr, cmixGrp, e2eGrp, rngStreamGen, - backUp.RegistrationCode) - - storageSess.SetReceptionRegistrationValidationSignature( - backUp.ReceptionIdentity.RegistrarSignature) - storageSess.SetTransmissionRegistrationValidationSignature( - backUp.TransmissionIdentity.RegistrarSignature) - storageSess.SetRegistrationTimestamp(backUp.RegistrationTimestamp) - - //move the registration state to indicate registered with - // registration on proto client - err = storageSess.ForwardRegistrationStatus( - storage.PermissioningComplete) - if err != nil { - return nil, "", err - } - - return backUp.Contacts.Identities, backUp.JSONParams, nil -} - // OpenClient session, but don't connect to the network or log in func OpenClient(storageDir string, password []byte, parameters Params) (*Client, error) { @@ -213,22 +145,14 @@ func OpenClient(storageDir string, password []byte, return nil, err } - userState, err := user.LoadUser(storageSess.GetKV()) - if err != nil { - return nil, err - } - c := &Client{ storage: storageSess, rng: rngStreamGen, comms: nil, network: nil, followerServices: newServices(), - parameters: parameters.E2E, clientErrorChannel: make(chan interfaces.ClientError, 1000), events: event.NewEventManager(), - backup: &backup.Backup{}, - userState: userState, } err = c.initComms() @@ -242,15 +166,6 @@ func OpenClient(storageDir string, password []byte, return nil, err } - user := c.userState.PortableUserInfo() - - c.e2e, err = e2e.Load(c.storage.GetKV(), c.network, - user.ReceptionID, c.storage.GetE2EGroup(), - c.rng, c.events) - if err != nil { - return nil, err - } - return c, nil } @@ -261,14 +176,12 @@ func NewProtoClient_Unsafe(ndfJSON, storageDir string, password, protoClientJSON []byte) error { jww.INFO.Printf("NewProtoClient_Unsafe") - rngStreamGen := fastRNG.NewStreamGenerator(12, 3, csprng.NewSystemRNG) - - def, err := parseNDF(ndfJSON) + def, err := ParseNDF(ndfJSON) if err != nil { return err } - cmixGrp, e2eGrp := decodeGroups(def) + cmixGrp, e2eGrp := DecodeGroups(def) protoUser := &user.Proto{} err = json.Unmarshal(protoClientJSON, protoUser) @@ -278,9 +191,8 @@ func NewProtoClient_Unsafe(ndfJSON, storageDir string, password, usr := user.NewUserFromProto(protoUser) - storageSess, err := checkVersionAndSetupStorage(def, storageDir, - password, usr, cmixGrp, e2eGrp, rngStreamGen, - protoUser.RegCode) + storageSess, err := CheckVersionAndSetupStorage(def, storageDir, + password, usr, cmixGrp, e2eGrp, protoUser.RegCode) if err != nil { return err } @@ -303,8 +215,7 @@ func NewProtoClient_Unsafe(ndfJSON, storageDir string, password, } // Login initializes a client object from existing storage. -func Login(storageDir string, password []byte, - authCallbacks auth.Callbacks, parameters Params) (*Client, error) { +func Login(storageDir string, password []byte, parameters Params) (*Client, error) { jww.INFO.Printf("Login()") c, err := OpenClient(storageDir, password, parameters) @@ -312,9 +223,8 @@ func Login(storageDir string, password []byte, return nil, err } - u := c.userState.PortableUserInfo() jww.INFO.Printf("Client Logged in: \n\tTransmissionID: %s "+ - "\n\tReceptionID: %s", u.TransmissionID, u.ReceptionID) + "\n\tReceptionID: %s", c.storage.GetTransmissionID(), c.storage.GetReceptionID()) def := c.storage.GetNDF() @@ -350,16 +260,6 @@ func Login(storageDir string, password []byte, return nil, err } - // FIXME: The callbacks need to be set, so I suppose we would need to - // either set them via a special type or add them - // to the login call? - authParams := auth.GetDefaultParams() - c.auth, err = auth.NewState(c.storage.GetKV(), c.network, c.e2e, c.rng, - c.events, authParams, authCallbacks, c.backup.TriggerBackup) - if err != nil { - return nil, err - } - err = c.registerFollower() if err != nil { return nil, err @@ -376,7 +276,7 @@ func LoginWithNewBaseNDF_UNSAFE(storageDir string, password []byte, params Params) (*Client, error) { jww.INFO.Printf("LoginWithNewBaseNDF_UNSAFE()") - def, err := parseNDF(newBaseNdf) + def, err := ParseNDF(newBaseNdf) if err != nil { return nil, err } @@ -405,15 +305,6 @@ func LoginWithNewBaseNDF_UNSAFE(storageDir string, password []byte, return nil, err } - // FIXME: The callbacks need to be set, so I suppose we would need to - // either set them via a special type or add them - // to the login call? - c.auth, err = auth.NewState(c.storage.GetKV(), c.network, c.e2e, c.rng, - c.events, params.Auth, authCallbacks, c.backup.TriggerBackup) - if err != nil { - return nil, err - } - err = c.registerFollower() if err != nil { return nil, err @@ -426,11 +317,11 @@ func LoginWithNewBaseNDF_UNSAFE(storageDir string, password []byte, // 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, authCallbacks auth.Callbacks, + protoClientJSON []byte, newBaseNdf string, params Params) (*Client, error) { jww.INFO.Printf("LoginWithProtoClient()") - def, err := parseNDF(newBaseNdf) + def, err := ParseNDF(newBaseNdf) if err != nil { return nil, err } @@ -461,8 +352,6 @@ func LoginWithProtoClient(storageDir string, password []byte, // FIXME: The callbacks need to be set, so I suppose we would need to // either set them via a special type or add them // to the login call? - c.auth, err = auth.NewState(c.storage.GetKV(), c.network, c.e2e, c.rng, - c.events, params.Auth, authCallbacks, c.backup.TriggerBackup) if err != nil { return nil, err } @@ -478,16 +367,13 @@ func (c *Client) initComms() error { var err error //get the user from session - u := c.userState - cryptoUser := u.CryptographicIdentity - - privKey := cryptoUser.GetTransmissionRSA() + privKey := c.storage.GetTransmissionRSA() pubPEM := rsa.CreatePublicKeyPem(privKey.GetPublic()) privPEM := rsa.CreatePrivateKeyPem(privKey) //start comms - c.comms, err = client.NewClientComms(cryptoUser.GetTransmissionID(), - pubPEM, privPEM, cryptoUser.GetTransmissionSalt()) + c.comms, err = client.NewClientComms(c.storage.GetTransmissionID(), + pubPEM, privPEM, c.storage.GetTransmissionSalt()) if err != nil { return errors.WithMessage(err, "failed to load client") } @@ -598,9 +484,8 @@ func (c *Client) GetErrorsChannel() <-chan interfaces.ClientError { // - Auth Callback (/auth/callback.go) // Handles both auth confirm and requests func (c *Client) StartNetworkFollower(timeout time.Duration) error { - u := c.GetUser() jww.INFO.Printf("StartNetworkFollower() \n\tTransmissionID: %s "+ - "\n\tReceptionID: %s", u.TransmissionID, u.ReceptionID) + "\n\tReceptionID: %s", c.storage.GetTransmissionID(), c.storage.GetReceptionID()) return c.followerServices.start(timeout) } @@ -640,39 +525,6 @@ func (c *Client) GetRoundEvents() interfaces.RoundEvents { return c.network.GetInstance().GetRoundEvents() } -// RegisterListener registers a callback struct for message receive -// events. -func (c *Client) RegisterListener(senderID *id.ID, - messageType catalog.MessageType, - newListener receive.Listener) receive.ListenerID { - jww.INFO.Printf("GetRoundEvents()") - jww.WARN.Printf("GetRoundEvents does not handle Client Errors " + - "edge case!") - return c.e2e.RegisterListener(senderID, messageType, newListener) -} - -// RegisterListenerFunc registers a callback func for message receive -// events. -func (c *Client) RegisterListenerFunc(name string, senderID *id.ID, - messageType catalog.MessageType, - newListener receive.ListenerFunc) receive.ListenerID { - jww.INFO.Printf("GetRoundEvents()") - jww.WARN.Printf("GetRoundEvents does not handle Client Errors " + - "edge case!") - return c.e2e.RegisterFunc(name, senderID, messageType, newListener) -} - -// RegisterListenerChannel registers a channel for message receive -// events. -func (c *Client) RegisterListenerChannel(name string, senderID *id.ID, - messageType catalog.MessageType, - newListener chan receive.Message) receive.ListenerID { - jww.INFO.Printf("GetRoundEvents()") - jww.WARN.Printf("GetRoundEvents does not handle Client Errors " + - "edge case!") - return c.e2e.RegisterChannel(name, senderID, messageType, newListener) -} - // AddService adds a service ot be controlled by the client thread control, // these will be started and stopped with the network follower func (c *Client) AddService(sp Service) error { @@ -683,11 +535,7 @@ func (c *Client) AddService(sp Service) error { // can be serialized into a byte stream for out-of-band sharing. func (c *Client) GetUser() user.Info { jww.INFO.Printf("GetUser()") - cMixUser := c.userState.PortableUserInfo() - // Add e2e dh keys - e2e := c.GetE2EHandler() - cMixUser.E2eDhPrivateKey = e2e.GetHistoricalDHPrivkey().DeepCopy() - cMixUser.E2eDhPublicKey = e2e.GetHistoricalDHPubkey().DeepCopy() + cMixUser := c.storage.PortableUserInfo() return cMixUser } @@ -706,41 +554,23 @@ func (c *Client) GetStorage() storage.Session { return c.storage } -// GetNetworkInterface returns the client Network Interface -func (c *Client) GetNetworkInterface() cmix.Client { +// GetCmix returns the client Network Interface +func (c *Client) GetCmix() cmix.Client { return c.network } -// GetE2EHandler returns the e2e handler -func (c *Client) GetE2EHandler() e2e.Handler { - return c.e2e -} - // GetEventReporter returns the event reporter func (c *Client) GetEventReporter() event.Reporter { return c.events } -// GetBackup returns a pointer to the backup container so that the backup can be -// set and triggered. -func (c *Client) GetBackup() *backup.Backup { - return c.backup -} - -func (c *Client) InitializeBackup(backupPass string, - updateBackupCb backup.UpdateBackupFn) (*backup.Backup, error) { - container := &backup.Container{} - return backup.InitializeBackup(backupPass, updateBackupCb, container, - c.e2e, c.storage, nil, c.storage.GetKV(), c.rng) -} - // 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 // healthy. func (c *Client) GetNodeRegistrationStatus() (int, int, error) { // Return an error if the network is not healthy - if !c.GetNetworkInterface().IsHealthy() { + if !c.GetCmix().IsHealthy() { return 0, 0, errors.New("Cannot get number of nodes " + "registrations when network is not healthy") } @@ -768,59 +598,6 @@ func (c *Client) GetNodeRegistrationStatus() (int, int, error) { return numRegistered, len(nodes) - numStale, nil } -// DeleteRequest will delete a request, agnostic of request type -// for the given partner ID. If no request exists for this -// partner ID an error will be returned. -func (c *Client) DeleteRequest(partnerId *id.ID) error { - jww.DEBUG.Printf("Deleting request for partner ID: %s", partnerId) - return c.auth.DeleteRequest(partnerId) -} - -// DeleteAllRequests clears all requests from client's auth storage. -func (c *Client) DeleteAllRequests() error { - jww.DEBUG.Printf("Deleting all requests") - return c.auth.DeleteAllRequests() -} - -// DeleteSentRequests clears sent requests from client's auth storage. -func (c *Client) DeleteSentRequests() error { - jww.DEBUG.Printf("Deleting all sent requests") - return c.auth.DeleteSentRequests() -} - -// DeleteReceiveRequests clears receive requests from client's auth storage. -func (c *Client) DeleteReceiveRequests() error { - jww.DEBUG.Printf("Deleting all received requests") - return c.auth.DeleteReceiveRequests() -} - -// DeleteContact is a function which removes a partner from Client's storage -func (c *Client) DeleteContact(partnerId *id.ID) error { - jww.DEBUG.Printf("Deleting contact with ID %s", partnerId) - - _, err := c.e2e.GetPartner(partnerId) - if err != nil { - return errors.WithMessagef(err, "Could not delete %s because "+ - "they could not be found", partnerId) - } - - if err = c.e2e.DeletePartner(partnerId); err != nil { - return err - } - - c.backup.TriggerBackup("contact deleted") - - // FIXME: Do we need this? - // c.e2e.Conversations().Delete(partnerId) - - // call delete requests to make sure nothing is lingering. - // this is for saftey to ensure the contact can be readded - // in the future - _ = c.auth.DeleteRequest(partnerId) - - return nil -} - // GetPreferredBins returns the geographic bin or bins that the provided two // character country code is a part of. func (c *Client) GetPreferredBins(countryCode string) ([]string, error) { @@ -863,9 +640,9 @@ func (c *Client) GetPreferredBins(countryCode string) ([]string, error) { } // ----- Utility Functions ----- -// parseNDF parses the initial ndf string for the client. do not check the +// ParseNDF parses the initial ndf string for the client. do not check the // signature, it is deprecated. -func parseNDF(ndfString string) (*ndf.NetworkDefinition, error) { +func ParseNDF(ndfString string) (*ndf.NetworkDefinition, error) { if ndfString == "" { return nil, errors.New("ndf file empty") } @@ -878,8 +655,8 @@ func parseNDF(ndfString string) (*ndf.NetworkDefinition, error) { return netDef, nil } -// decodeGroups returns the e2e and cmix groups from the ndf -func decodeGroups(ndf *ndf.NetworkDefinition) (cmixGrp, e2eGrp *cyclic.Group) { +// 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 @@ -894,14 +671,13 @@ func decodeGroups(ndf *ndf.NetworkDefinition) (cmixGrp, e2eGrp *cyclic.Group) { return cmixGrp, e2eGrp } -// checkVersionAndSetupStorage is common code shared by NewClient, +// CheckVersionAndSetupStorage is common code shared by NewClient, // 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, rngStreamGen *fastRNG.StreamGenerator, - registrationCode string) (storage.Session, error) { +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 currentVersion, err := version.ParseVersion(SEMVER) if err != nil { @@ -930,12 +706,5 @@ func checkVersionAndSetupStorage(def *ndf.NetworkDefinition, "change in session") } - // create new E2E - err = e2e.Init(storageSess.GetKV(), protoUser.ReceptionID, - protoUser.E2eDhPrivateKey, e2eGrp, rekey.GetDefaultParams()) - if err != nil { - return nil, err - } - return storageSess, nil } diff --git a/api/identity.go b/api/identity.go new file mode 100644 index 0000000000000000000000000000000000000000..f14b8020dd69a884200fe0144f1900ece9a79cba --- /dev/null +++ b/api/identity.go @@ -0,0 +1,53 @@ +package api + +import ( + "gitlab.com/elixxir/crypto/cyclic" + "gitlab.com/elixxir/crypto/diffieHellman" + "gitlab.com/xx_network/crypto/csprng" + "gitlab.com/xx_network/crypto/signature/rsa" + "gitlab.com/xx_network/crypto/xx" + "gitlab.com/xx_network/primitives/id" +) + +type Identity struct { + ID *id.ID + RSAPrivatePem *rsa.PrivateKey + Salt []byte + DHKeyPrivate *cyclic.Int +} + +// MakeIdentity generates a new cryptographic identity for receiving messages +func MakeIdentity(rng csprng.Source, grp *cyclic.Group) (Identity, error) { + //make RSA Key + rsaKey, err := rsa.GenerateKey(rng, + rsa.DefaultRSABitLen) + if err != nil { + return Identity{}, err + } + + //make salt + salt := make([]byte, 32) + _, err = rng.Read(salt) + + //make dh private key + privkey := diffieHellman.GeneratePrivateKey( + len(grp.GetPBytes()), + grp, rng) + + //make the ID + id, err := xx.NewID(rsaKey.GetPublic(), + salt, id.User) + if err != nil { + return Identity{}, err + } + + //create the identity object + I := Identity{ + ID: id, + RSAPrivatePem: rsaKey, + Salt: salt, + DHKeyPrivate: privkey, + } + + return I, nil +} diff --git a/backup/container.go b/api/messenger/backup.go similarity index 98% rename from backup/container.go rename to api/messenger/backup.go index fd456ea96c11337c4709991c97f6b84458adfe11..a5e73eaaf743030acacea195229e13e409f091e8 100644 --- a/backup/container.go +++ b/api/messenger/backup.go @@ -5,7 +5,7 @@ // LICENSE file // //////////////////////////////////////////////////////////////////////////////// -package backup +package messenger import "sync" diff --git a/api/messenger/backupRestore.go b/api/messenger/backupRestore.go new file mode 100644 index 0000000000000000000000000000000000000000..d3187f7fcc4b9f4535559351bc2d2ff68c7484ac --- /dev/null +++ b/api/messenger/backupRestore.go @@ -0,0 +1,90 @@ +// FIXME: This is placeholder, there's got to be a better place to put +// backup restoration than inside messenger. + +package messenger + +import ( + "github.com/pkg/errors" + "gitlab.com/elixxir/client/api" + "gitlab.com/elixxir/client/e2e" + "gitlab.com/elixxir/client/e2e/rekey" + "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/client/storage/user" + "gitlab.com/elixxir/client/ud" + cryptoBackup "gitlab.com/elixxir/crypto/backup" + "gitlab.com/elixxir/primitives/fact" + "gitlab.com/xx_network/primitives/id" +) + +// NewClientFromBackup constructs a new Client from an encrypted +// backup. The backup is decrypted using the backupPassphrase. On +// success 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, + backupPassphrase []byte, backupFileContents []byte) ([]*id.ID, + string, error) { + + backUp := &cryptoBackup.Backup{} + err := backUp.Decrypt(string(backupPassphrase), backupFileContents) + if err != nil { + return nil, "", errors.WithMessage(err, + "Failed to unmarshal decrypted client contents.") + } + + usr := user.NewUserFromBackup(backUp) + + def, err := api.ParseNDF(ndfJSON) + if err != nil { + return nil, "", err + } + + cmixGrp, e2eGrp := api.DecodeGroups(def) + + // Note we do not need registration here + storageSess, err := api.CheckVersionAndSetupStorage(def, storageDir, + []byte(sessionPassword), usr, cmixGrp, e2eGrp, + backUp.RegistrationCode) + if err != nil { + return nil, "", err + } + + storageSess.SetReceptionRegistrationValidationSignature( + backUp.ReceptionIdentity.RegistrarSignature) + storageSess.SetTransmissionRegistrationValidationSignature( + backUp.TransmissionIdentity.RegistrarSignature) + storageSess.SetRegistrationTimestamp(backUp.RegistrationTimestamp) + + //move the registration state to indicate registered with + // registration on proto client + err = storageSess.ForwardRegistrationStatus( + storage.PermissioningComplete) + if err != nil { + return nil, "", err + } + + privkey := usr.E2eDhPrivateKey + + //initialize the e2e storage + err = e2e.Init(storageSess.GetKV(), usr.ReceptionID, privkey, e2eGrp, + rekey.GetDefaultParams()) + if err != nil { + return nil, "", err + } + + udInfo := backUp.UserDiscoveryRegistration + var username, email, phone fact.Fact + for _, f := range udInfo.FactList { + switch f.T { + case fact.Email: + email = f + case fact.Username: + username = f + case fact.Phone: + phone = f + } + } + ud.InitStoreFromBackup(storageSess.GetKV(), username, email, phone) + + return backUp.Contacts.Identities, backUp.JSONParams, nil +} diff --git a/api/messenger/compress_test.go b/api/messenger/compress_test.go new file mode 100644 index 0000000000000000000000000000000000000000..19a4bcc414c112b9168b5da43b80f8e3d78721bf --- /dev/null +++ b/api/messenger/compress_test.go @@ -0,0 +1,37 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + +package messenger + +import ( + "bytes" + "testing" +) + +// Test compressing an image that is small enough to not need 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) + if err != nil { + t.Errorf("Unable to compress test image: %+v", err) + } + if !bytes.Equal(testImg, result) { + t.Errorf("Expected same image return!") + } +} + +// +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) + if err != nil { + t.Errorf("Unable to compress test image: %+v", err) + } + if bytes.Equal(testImg, result) { + t.Errorf("Expected different image return!") + } +} diff --git a/api/messenger/messenger.go b/api/messenger/messenger.go new file mode 100644 index 0000000000000000000000000000000000000000..2677e6fbaf23270e7eb6fc6009266da1638eaade --- /dev/null +++ b/api/messenger/messenger.go @@ -0,0 +1,198 @@ +package messenger + +import ( + "encoding/binary" + "encoding/json" + + "github.com/pkg/errors" + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/api" + "gitlab.com/elixxir/client/auth" + "gitlab.com/elixxir/client/e2e" + "gitlab.com/elixxir/client/e2e/rekey" + "gitlab.com/elixxir/client/storage/user" + "gitlab.com/elixxir/crypto/cyclic" + "gitlab.com/elixxir/crypto/diffieHellman" + "gitlab.com/xx_network/primitives/id" +) + +type Client struct { + *api.Client + auth auth.State + e2e e2e.Handler + backup *Container +} + +func Login(client *api.Client, callbacks auth.Callbacks) (m *Client, err error) { + m = &Client{ + Client: client, + backup: &Container{}, + } + + m.e2e, err = LoadOrInitE2e(client) + if err != nil { + return nil, err + } + + m.auth, err = auth.NewState(client.GetStorage().GetKV(), client.GetCmix(), + m.e2e, client.GetRng(), client.GetEventReporter(), + auth.GetDefaultParams(), callbacks, m.backup.TriggerBackup) + if err != nil { + return nil, err + } + + return m, err +} + +// LoadOrInitE2e 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 LoadOrInitE2e(client *api.Client) (e2e.Handler, error) { + usr := client.GetUser() + e2eGrp := client.GetStorage().GetE2EGroup() + kv := client.GetStorage().GetKV() + + //try to load a legacy e2e hander + e2eHandler, err := e2e.LoadLegacy(kv, + client.GetCmix(), usr.ReceptionID, e2eGrp, client.GetRng(), + client.GetEventReporter(), rekey.GetDefaultParams()) + if err != nil { + //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()) + //if no new e2e handler exists, initilize an e2e user + 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() + } + + //initialize the e2e storage + err = e2e.Init(kv, usr.ReceptionID, privkey, e2eGrp, + rekey.GetDefaultParams()) + if err != nil { + return nil, err + } + + //load the new e2e storage + e2eHandler, err = e2e.Load(kv, + client.GetCmix(), usr.ReceptionID, e2eGrp, client.GetRng(), + client.GetEventReporter()) + if err != nil { + 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) + } + } else { + jww.INFO.Printf("Loaded a legacy e2e instance for %s", + usr.ReceptionID) + } + return e2eHandler, nil +} + +// GetUser replaces api.Client's GetUser with one which includes the e2e dh +// private keys +func (m *Client) GetUser() user.Info { + u := m.Client.GetUser() + u.E2eDhPrivateKey = m.e2e.GetHistoricalDHPrivkey() + u.E2eDhPublicKey = m.e2e.GetHistoricalDHPubkey() + return u +} + +// ConstructProtoUserFile is a helper function which is used for proto +// client testing. This is used for development testing. +func (m *Client) ConstructProtoUserFile() ([]byte, error) { + + //load the registration code + regCode, err := m.GetStorage().GetRegCode() + if err != nil { + return nil, errors.WithMessage(err, "failed to register with "+ + "permissioning") + } + + Usr := user.Proto{ + TransmissionID: m.GetUser().TransmissionID, + TransmissionSalt: m.GetUser().TransmissionSalt, + TransmissionRSA: m.GetUser().TransmissionRSA, + ReceptionID: m.GetUser().ReceptionID, + ReceptionSalt: m.GetUser().ReceptionSalt, + ReceptionRSA: m.GetUser().ReceptionRSA, + Precanned: m.GetUser().Precanned, + RegistrationTimestamp: m.GetUser().RegistrationTimestamp, + RegCode: regCode, + TransmissionRegValidationSig: m.GetStorage().GetTransmissionRegistrationValidationSignature(), + ReceptionRegValidationSig: m.GetStorage().GetReceptionRegistrationValidationSignature(), + E2eDhPrivateKey: m.e2e.GetHistoricalDHPrivkey(), + E2eDhPublicKey: m.e2e.GetHistoricalDHPubkey(), + } + + jsonBytes, err := json.Marshal(Usr) + if err != nil { + return nil, errors.WithMessage(err, "failed to register with "+ + "permissioning") + } + + return jsonBytes, nil +} + +func (m *Client) GetAuth() auth.State { + return m.auth +} + +func (m *Client) GetE2E() e2e.Handler { + return m.e2e +} + +func (m *Client) GetBackupContainer() *Container { + return m.backup +} + +// DeleteContact is a function which removes a partner from Client's storage +func (m *Client) DeleteContact(partnerId *id.ID) error { + jww.DEBUG.Printf("Deleting contact with ID %s", partnerId) + + _, err := m.e2e.GetPartner(partnerId) + if err != nil { + return errors.WithMessagef(err, "Could not delete %s because "+ + "they could not be found", partnerId) + } + + if err = m.e2e.DeletePartner(partnerId); err != nil { + return err + } + + m.backup.TriggerBackup("contact deleted") + + // FIXME: Do we need this? + // c.e2e.Conversations().Delete(partnerId) + + // call delete requests to make sure nothing is lingering. + // this is for saftey to ensure the contact can be readded + // in the future + _ = m.auth.DeleteRequest(partnerId) + + return nil +} diff --git a/api/notifications.go b/api/messenger/notifications.go similarity index 73% rename from api/notifications.go rename to api/messenger/notifications.go index 60355a48034572902905c876591004e039b2b0b0..380029ebfaf68cdbe9b7310a731f6614b641d136 100644 --- a/api/notifications.go +++ b/api/messenger/notifications.go @@ -5,7 +5,7 @@ // LICENSE file // /////////////////////////////////////////////////////////////////////////////// -package api +package messenger import ( "github.com/pkg/errors" @@ -23,33 +23,33 @@ import ( // 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 (c *Client) RegisterForNotifications(token string) error { +func (m *Client) RegisterForNotifications(token string) error { jww.INFO.Printf("RegisterForNotifications(%s)", token) // Pull the host from the manage - notificationBotHost, ok := c.comms.GetHost(&id.NotificationBot) + notificationBotHost, ok := m.GetComms().GetHost(&id.NotificationBot) if !ok { return errors.New("RegisterForNotifications: Failed to retrieve host for notification bot") } - intermediaryReceptionID, sig, err := c.getIidAndSig() + intermediaryReceptionID, sig, err := m.getIidAndSig() if err != nil { return err } - privKey := c.userState.CryptographicIdentity.GetTransmissionRSA() + privKey := m.GetStorage().GetTransmissionRSA() pubPEM := rsa.CreatePublicKeyPem(privKey.GetPublic()) - regSig := c.userState.GetTransmissionRegistrationValidationSignature() - regTS := c.GetUser().RegistrationTimestamp + regSig := m.GetStorage().GetTransmissionRegistrationValidationSignature() + regTS := m.GetStorage().GetRegistrationTimestamp() // Send the register message - _, err = c.comms.RegisterForNotifications(notificationBotHost, + _, err = m.GetComms().RegisterForNotifications(notificationBotHost, &mixmessages.NotificationRegisterRequest{ Token: token, IntermediaryId: intermediaryReceptionID, TransmissionRsa: pubPEM, - TransmissionSalt: c.GetUser().TransmissionSalt, + TransmissionSalt: m.GetStorage().GetTransmissionSalt(), TransmissionRsaSig: regSig, IIDTransmissionRsaSig: sig, - RegistrationTimestamp: regTS, + RegistrationTimestamp: regTS.UnixNano(), }) if err != nil { err := errors.Errorf("RegisterForNotifications: Unable to "+ @@ -61,19 +61,19 @@ func (c *Client) RegisterForNotifications(token string) error { } // UnregisterForNotifications turns of notifications for this client -func (c *Client) UnregisterForNotifications() error { +func (m *Client) UnregisterForNotifications() error { jww.INFO.Printf("UnregisterForNotifications()") // Pull the host from the manage - notificationBotHost, ok := c.comms.GetHost(&id.NotificationBot) + notificationBotHost, ok := m.GetComms().GetHost(&id.NotificationBot) if !ok { return errors.New("Failed to retrieve host for notification bot") } - intermediaryReceptionID, sig, err := c.getIidAndSig() + intermediaryReceptionID, sig, err := m.getIidAndSig() if err != nil { return err } // Send the unregister message - _, err = c.comms.UnregisterForNotifications(notificationBotHost, &mixmessages.NotificationUnregisterRequest{ + _, err = m.GetComms().UnregisterForNotifications(notificationBotHost, &mixmessages.NotificationUnregisterRequest{ IntermediaryId: intermediaryReceptionID, IIDTransmissionRsaSig: sig, }) @@ -86,8 +86,8 @@ func (c *Client) UnregisterForNotifications() error { return nil } -func (c *Client) getIidAndSig() ([]byte, []byte, error) { - intermediaryReceptionID, err := ephemeral.GetIntermediaryId(c.GetUser().ReceptionID) +func (m *Client) getIidAndSig() ([]byte, []byte, error) { + intermediaryReceptionID, err := ephemeral.GetIntermediaryId(m.GetStorage().GetReceptionID()) if err != nil { return nil, nil, errors.WithMessage(err, "RegisterForNotifications: Failed to form intermediary ID") } @@ -100,10 +100,9 @@ func (c *Client) getIidAndSig() ([]byte, []byte, error) { return nil, nil, errors.WithMessage(err, "RegisterForNotifications: Failed to write intermediary ID to hash") } - stream := c.rng.GetStream() - c.GetUser() + stream := m.GetRng().GetStream() sig, err := rsa.Sign(stream, - c.userState.GetTransmissionRSA(), + m.GetStorage().GetTransmissionRSA(), hash.CMixHash, h.Sum(nil), nil) if err != nil { return nil, nil, errors.WithMessage(err, "RegisterForNotifications: Failed to sign intermediary ID") diff --git a/api/messenger/precan.go b/api/messenger/precan.go new file mode 100644 index 0000000000000000000000000000000000000000..16717bbfa04bb986e9069931da62126e700c5509 --- /dev/null +++ b/api/messenger/precan.go @@ -0,0 +1,87 @@ +package messenger + +import ( + "encoding/binary" + "github.com/cloudflare/circl/dh/sidh" + "gitlab.com/elixxir/client/api" + "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" +) + +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 +} + +// Create an insecure e2e relationship with a precanned user +func (m *Client) MakePrecannedAuthenticatedChannel(precannedID uint) ( + contact.Contact, error) { + + precan := m.MakePrecannedContact(precannedID) + + myID := binary.BigEndian.Uint64(m.GetStorage().GetReceptionID()[:]) + // Pick a variant based on if their ID is bigger than mine. + myVariant := sidh.KeyVariantSidhA + theirVariant := sidh.KeyVariant(sidh.KeyVariantSidhB) + if myID > uint64(precannedID) { + myVariant = sidh.KeyVariantSidhB + theirVariant = sidh.KeyVariantSidhA + } + prng1 := rand.New(rand.NewSource(int64(precannedID))) + theirSIDHPrivKey := util.NewSIDHPrivateKey(theirVariant) + theirSIDHPubKey := util.NewSIDHPublicKey(theirVariant) + theirSIDHPrivKey.Generate(prng1) + theirSIDHPrivKey.GeneratePublicKey(theirSIDHPubKey) + + prng2 := rand.New(rand.NewSource(int64(myID))) + mySIDHPrivKey := util.NewSIDHPrivateKey(myVariant) + mySIDHPubKey := util.NewSIDHPublicKey(myVariant) + mySIDHPrivKey.Generate(prng2) + mySIDHPrivKey.GeneratePublicKey(mySIDHPubKey) + + // 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, + m.e2e.GetHistoricalDHPrivkey(), theirSIDHPubKey, + mySIDHPrivKey, sesParam, sesParam) + + // 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 *Client) MakePrecannedContact(precannedID uint) contact.Contact { + + e2eGrp := m.GetStorage().GetE2EGroup() + + rng := m.GetRng().GetStream() + precanned := api.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), + } +} diff --git a/api/utils.go b/api/messenger/utils.go similarity index 99% rename from api/utils.go rename to api/messenger/utils.go index 799e3abf5a2410d15a1299c6d682ef801fdd439c..6e1ff51fd9be792124e30ee2a4e0487d3598efdc 100644 --- a/api/utils.go +++ b/api/messenger/utils.go @@ -6,7 +6,7 @@ // Provides various utility functions for access over the bindings -package api +package messenger import ( "bytes" diff --git a/api/params.go b/api/params.go index db9b3e498bfee4a77246c560d56a16d9b9c15be4..39f9d8db3768ac00c454bf89d2ba8b5326c9fb4e 100644 --- a/api/params.go +++ b/api/params.go @@ -8,29 +8,32 @@ package api import ( - "gitlab.com/elixxir/client/auth" + "encoding/json" "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 { - E2E e2e.Params CMix cmix.Params - Network cmix.CMIXParams Session session.Params - Auth auth.Param - Rekey rekey.Params } func GetDefaultParams() Params { return Params{ - E2E: e2e.GetDefaultParams(), CMix: cmix.GetDefaultParams(), - Network: cmix.GetDefaultCMIXParams(), Session: session.GetDefaultParams(), - Auth: auth.GetDefaultParams(), - Rekey: rekey.GetDefaultParams(), } } + +// 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 +} diff --git a/api/params_test.go b/api/params_test.go new file mode 100644 index 0000000000000000000000000000000000000000..35bf61d8f10e5b494a8459f64d239d1569df36b4 --- /dev/null +++ b/api/params_test.go @@ -0,0 +1,51 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + +package api + +import ( + "bytes" + "encoding/json" + "testing" +) + +// Tests that no data is lost when marshaling and +// unmarshaling the Params object. +func TestParams_MarshalUnmarshal(t *testing.T) { + // Construct a set of params + p := GetDefaultParams() + + // Marshal the params + data, err := json.Marshal(&p) + if err != nil { + t.Fatalf("Marshal error: %v", err) + } + + t.Logf("%s", string(data)) + + // Unmarshal the params object + received := Params{} + err = json.Unmarshal(data, &received) + if err != nil { + t.Fatalf("Unmarshal error: %v", err) + } + + // Re-marshal this params object + data2, err := json.Marshal(received) + if err != nil { + t.Fatalf("Marshal error: %v", err) + } + + 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) + if !bytes.Equal(data, data2) { + t.Fatalf("Data was lost in marshal/unmarshal.") + } +} diff --git a/api/permissioning.go b/api/permissioning.go index b4060d994c84622f3395193c145a1e257559c815..ee25a57e0ccf6adcf5820d432f49519a1493c4a5 100644 --- a/api/permissioning.go +++ b/api/permissioning.go @@ -9,7 +9,6 @@ package api import ( "encoding/json" - "github.com/pkg/errors" "gitlab.com/elixxir/client/storage" "gitlab.com/elixxir/client/storage/user" @@ -17,10 +16,9 @@ import ( // Returns an error if registration fails. func (c *Client) registerWithPermissioning() error { - userData := c.userState.CryptographicIdentity //get the users public key - transmissionPubKey := userData.GetTransmissionRSA().GetPublic() - receptionPubKey := userData.GetReceptionRSA().GetPublic() + transmissionPubKey := c.storage.GetTransmissionRSA().GetPublic() + receptionPubKey := c.storage.GetReceptionRSA().GetPublic() //load the registration code regCode, err := c.storage.GetRegCode() @@ -77,8 +75,8 @@ func (c *Client) ConstructProtoUserFile() ([]byte, error) { RegCode: regCode, TransmissionRegValidationSig: c.storage.GetTransmissionRegistrationValidationSignature(), ReceptionRegValidationSig: c.storage.GetReceptionRegistrationValidationSignature(), - E2eDhPrivateKey: c.e2e.GetHistoricalDHPrivkey(), - E2eDhPublicKey: c.e2e.GetHistoricalDHPubkey(), + E2eDhPrivateKey: nil, + E2eDhPublicKey: nil, } jsonBytes, err := json.Marshal(Usr) diff --git a/api/precan.go b/api/precan.go index a563faa230bf83a0bca8da52330cf9d1262f8b42..150d90fa9a806db81277fe9677a9a6ecc13e64dc 100644 --- a/api/precan.go +++ b/api/precan.go @@ -9,32 +9,18 @@ package api import ( "encoding/binary" - "gitlab.com/elixxir/crypto/diffieHellman" - "math/rand" - "github.com/cloudflare/circl/dh/sidh" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/e2e/ratchet/partner/session" "gitlab.com/elixxir/client/storage" "gitlab.com/elixxir/client/storage/user" - util "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/crypto/contact" - "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/crypto/fastRNG" - "gitlab.com/elixxir/primitives/fact" "gitlab.com/xx_network/crypto/csprng" "gitlab.com/xx_network/crypto/signature/rsa" "gitlab.com/xx_network/primitives/id" ) -// creates a precanned user -func createPrecannedUser(precannedID uint, rng csprng.Source, cmix, - e2e *cyclic.Group) user.Info { - // DH Keygen - prng := rand.New(rand.NewSource(int64(precannedID))) - prime := e2e.GetPBytes() - keyLen := len(prime) - e2eKey := diffieHellman.GeneratePrivateKey(keyLen, e2e, prng) +// CreatePrecannedUser creates a precanned user +func CreatePrecannedUser(precannedID uint, rng csprng.Source) user.Info { // Salt, UID, etc gen salt := make([]byte, SaltSize) @@ -55,8 +41,8 @@ func createPrecannedUser(precannedID uint, rng csprng.Source, cmix, ReceptionID: &userID, ReceptionSalt: salt, Precanned: true, - E2eDhPrivateKey: e2eKey, - E2eDhPublicKey: diffieHellman.GeneratePublicKey(e2eKey, e2e), + E2eDhPrivateKey: nil, + E2eDhPublicKey: nil, TransmissionRSA: rsaKey, ReceptionRSA: rsaKey, } @@ -74,17 +60,16 @@ func NewPrecannedClient(precannedID uint, defJSON, storageDir string, csprng.NewSystemRNG) rngStream := rngStreamGen.GetStream() - def, err := parseNDF(defJSON) + def, err := ParseNDF(defJSON) if err != nil { return err } - cmixGrp, e2eGrp := decodeGroups(def) + cmixGrp, e2eGrp := DecodeGroups(def) - protoUser := createPrecannedUser(precannedID, rngStream, - cmixGrp, e2eGrp) + protoUser := CreatePrecannedUser(precannedID, rngStream) - store, err := checkVersionAndSetupStorage(def, storageDir, password, - protoUser, cmixGrp, e2eGrp, rngStreamGen, "") + store, err := CheckVersionAndSetupStorage(def, storageDir, password, + protoUser, cmixGrp, e2eGrp, "") if err != nil { return err } @@ -98,63 +83,3 @@ func NewPrecannedClient(precannedID uint, defJSON, storageDir string, return nil } - -// Create an insecure e2e relationship with a precanned user -func (c *Client) MakePrecannedAuthenticatedChannel(precannedID uint) ( - contact.Contact, error) { - - precan := c.MakePrecannedContact(precannedID) - - myID := binary.BigEndian.Uint64(c.GetUser().GetContact().ID[:]) - // Pick a variant based on if their ID is bigger than mine. - myVariant := sidh.KeyVariantSidhA - theirVariant := sidh.KeyVariant(sidh.KeyVariantSidhB) - if myID > uint64(precannedID) { - myVariant = sidh.KeyVariantSidhB - theirVariant = sidh.KeyVariantSidhA - } - prng1 := rand.New(rand.NewSource(int64(precannedID))) - theirSIDHPrivKey := util.NewSIDHPrivateKey(theirVariant) - theirSIDHPubKey := util.NewSIDHPublicKey(theirVariant) - theirSIDHPrivKey.Generate(prng1) - theirSIDHPrivKey.GeneratePublicKey(theirSIDHPubKey) - - prng2 := rand.New(rand.NewSource(int64(myID))) - mySIDHPrivKey := util.NewSIDHPrivateKey(myVariant) - mySIDHPubKey := util.NewSIDHPublicKey(myVariant) - mySIDHPrivKey.Generate(prng2) - mySIDHPrivKey.GeneratePublicKey(mySIDHPubKey) - - // add the precanned user as a e2e contact - // FIXME: these params need to be threaded through... - sesParam := session.GetDefaultParams() - _, err := c.e2e.AddPartner(precan.ID, precan.DhPubKey, - c.e2e.GetHistoricalDHPrivkey(), theirSIDHPubKey, - mySIDHPrivKey, sesParam, sesParam) - - // check garbled messages in case any messages arrived before creating - // the channel - c.network.CheckInProgressMessages() - - return precan, err -} - -// Create an insecure e2e contact object for a precanned user -func (c *Client) MakePrecannedContact(precannedID uint) contact.Contact { - - e2eGrp := c.storage.GetE2EGroup() - - precanned := createPrecannedUser(precannedID, c.rng.GetStream(), - c.storage.GetCmixGroup(), e2eGrp) - - // 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), - } -} diff --git a/api/send.go b/api/send.go deleted file mode 100644 index 5959d81946ada40f94d56f40b06f0ead130ae3d5..0000000000000000000000000000000000000000 --- a/api/send.go +++ /dev/null @@ -1,82 +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 api - -import ( - "time" - - "github.com/pkg/errors" - jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/client/e2e" - e2eCrypto "gitlab.com/elixxir/crypto/e2e" - "gitlab.com/elixxir/primitives/format" - "gitlab.com/xx_network/primitives/id" - "gitlab.com/xx_network/primitives/id/ephemeral" -) - -//This holds all functions to send messages over the network - -// SendE2E sends an end-to-end payload to the provided recipient with -// the provided msgType. Returns the list of rounds in which parts of -// the message were sent or an error if it fails. -func (c *Client) SendE2E(mt catalog.MessageType, recipient *id.ID, - payload []byte, param e2e.Params) ([]id.Round, - e2eCrypto.MessageID, time.Time, error) { - jww.INFO.Printf("SendE2E(%s, %d. %v)", recipient, - mt, payload) - return c.e2e.SendE2E(mt, recipient, payload, param) -} - -// SendUnsafe sends an unencrypted payload to the provided recipient -// with the provided msgType. Returns the list of rounds in which parts -// of the message were sent or an error if it fails. -// NOTE: Do not use this function unless you know what you are doing. -// This function always produces an error message in client logging. -func (c *Client) SendUnsafe(mt catalog.MessageType, recipient *id.ID, - payload []byte, param e2e.Params) ([]id.Round, time.Time, - error) { - jww.INFO.Printf("SendUnsafe(%s, %d. %v)", recipient, - mt, payload) - return c.e2e.SendUnsafe(mt, recipient, payload, param) -} - -// SendCMIX sends a "raw" CMIX message payload to the provided -// recipient. Note that both SendE2E and SendUnsafe call SendCMIX. -// Returns the round ID of the round the payload was sent or an error -// if it fails. -func (c *Client) SendCMIX(msg format.Message, recipientID *id.ID, - param cmix.CMIXParams) (id.Round, ephemeral.Id, error) { - jww.INFO.Printf("Send(%s)", string(msg.GetContents())) - return c.network.Send(recipientID, msg.GetKeyFP(), - message.GetDefaultService(recipientID), - msg.GetContents(), msg.GetMac(), param) -} - -// SendManyCMIX sends many "raw" CMIX message payloads to each of the -// provided recipients. Used for group chat functionality. Returns the -// round ID of the round the payload was sent or an error if it fails. -func (c *Client) SendManyCMIX(messages []cmix.TargetedCmixMessage, - params cmix.CMIXParams) (id.Round, []ephemeral.Id, error) { - return c.network.SendMany(messages, params) -} - -// NewCMIXMessage Creates a new cMix message with the right properties -// for the current cMix network. -// FIXME: this is weird and shouldn't be necessary, but it is. -func (c *Client) NewCMIXMessage(contents []byte) (format.Message, error) { - primeSize := len(c.storage.GetCmixGroup().GetPBytes()) - msg := format.NewMessage(primeSize) - if len(contents) > msg.ContentsSize() { - return format.Message{}, errors.New("Contents to long for cmix") - } - msg.SetContents(contents) - return msg, nil -} diff --git a/api/user.go b/api/user.go index f0538a1a9a092512d6619c291f393679a81e32e9..cbe2b92a38041877a368291122016c9907ff9f12 100644 --- a/api/user.go +++ b/api/user.go @@ -8,12 +8,13 @@ package api import ( - "gitlab.com/elixxir/crypto/diffieHellman" "regexp" "runtime" "strings" "sync" + "gitlab.com/elixxir/crypto/diffieHellman" + jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/storage/user" "gitlab.com/elixxir/crypto/cyclic" @@ -30,41 +31,13 @@ const ( ) // createNewUser generates an identity for cMix -func createNewUser(rng *fastRNG.StreamGenerator, cmix, - e2e *cyclic.Group) user.Info { +func createNewUser(rng *fastRNG.StreamGenerator) user.Info { // CMIX Keygen var transmissionRsaKey, receptionRsaKey *rsa.PrivateKey - var e2eKey *cyclic.Int var transmissionSalt, receptionSalt []byte - transmissionSalt, receptionSalt, e2eKey, - transmissionRsaKey, receptionRsaKey = createKeys(rng, e2e) - - // Salt, UID, etc gen - stream := rng.GetStream() - transmissionSalt = make([]byte, SaltSize) - - n, err := stream.Read(transmissionSalt) - - if err != nil { - jww.FATAL.Panicf(err.Error()) - } - if n != SaltSize { - jww.FATAL.Panicf("transmissionSalt size too small: %d", n) - } - - receptionSalt = make([]byte, SaltSize) - - n, err = stream.Read(receptionSalt) - - if err != nil { - jww.FATAL.Panicf(err.Error()) - } - if n != SaltSize { - jww.FATAL.Panicf("transmissionSalt size too small: %d", n) - } - - stream.Close() + transmissionSalt, receptionSalt, + transmissionRsaKey, receptionRsaKey = createKeys(rng) transmissionID, err := xx.NewID(transmissionRsaKey.GetPublic(), transmissionSalt, id.User) @@ -86,30 +59,17 @@ func createNewUser(rng *fastRNG.StreamGenerator, cmix, ReceptionSalt: receptionSalt, ReceptionRSA: receptionRsaKey, Precanned: false, - E2eDhPrivateKey: e2eKey, - E2eDhPublicKey: diffieHellman.GeneratePublicKey(e2eKey, e2e), + E2eDhPrivateKey: nil, + E2eDhPublicKey: nil, } } -func createKeys(rng *fastRNG.StreamGenerator, - e2e *cyclic.Group) ( - transmissionSalt, receptionSalt []byte, e2eKey *cyclic.Int, +func createKeys(rng *fastRNG.StreamGenerator) ( + transmissionSalt, receptionSalt []byte, transmissionRsaKey, receptionRsaKey *rsa.PrivateKey) { wg := sync.WaitGroup{} - wg.Add(3) - - go func() { - defer wg.Done() - var err error - rngStream := rng.GetStream() - e2eKey = diffieHellman.GeneratePrivateKey(len(e2e.GetPBytes()), e2e, - rngStream) - rngStream.Close() - if err != nil { - jww.FATAL.Panicf(err.Error()) - } - }() + wg.Add(2) // RSA Keygen (4096 bit defaults) go func() { @@ -118,6 +78,11 @@ func createKeys(rng *fastRNG.StreamGenerator, stream := rng.GetStream() transmissionRsaKey, err = rsa.GenerateKey(stream, rsa.DefaultRSABitLen) + if err != nil { + jww.FATAL.Panicf(err.Error()) + } + transmissionSalt = make([]byte, 32) + _, err = stream.Read(transmissionSalt) stream.Close() if err != nil { jww.FATAL.Panicf(err.Error()) @@ -130,6 +95,11 @@ func createKeys(rng *fastRNG.StreamGenerator, stream := rng.GetStream() receptionRsaKey, err = rsa.GenerateKey(stream, rsa.DefaultRSABitLen) + if err != nil { + jww.FATAL.Panicf(err.Error()) + } + receptionSalt = make([]byte, 32) + _, err = stream.Read(receptionSalt) stream.Close() if err != nil { jww.FATAL.Panicf(err.Error()) @@ -137,6 +107,21 @@ 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 } diff --git a/api/utilsInterfaces_test.go b/api/utilsInterfaces_test.go index 617bce08b96810b920fb6ceb9aaf9ef3990f8757..72e141698805b029a799d19ccd4ca7e5f4a82e3e 100644 --- a/api/utilsInterfaces_test.go +++ b/api/utilsInterfaces_test.go @@ -7,6 +7,7 @@ package api import ( + "gitlab.com/xx_network/primitives/ndf" "time" "gitlab.com/elixxir/client/cmix" @@ -92,6 +93,9 @@ func (d *dummyEventMgr) EventService() (stoppable.Stoppable, error) { } /* Below methods built for interface adherence */ +func (t *testNetworkManagerGeneric) Connect(ndf *ndf.NetworkDefinition) error { + return nil +} func (t *testNetworkManagerGeneric) Follow(report cmix.ClientErrorReport) (stoppable.Stoppable, error) { return nil, nil } diff --git a/api/utils_test.go b/api/utils_test.go index 4496905d51eab7344b8d2fcde840a2cd3c862d11..b2f59f90739fa8bff71292d35d5bac9f09cdcbae 100644 --- a/api/utils_test.go +++ b/api/utils_test.go @@ -8,11 +8,9 @@ package api import ( - "bytes" "testing" "gitlab.com/elixxir/client/cmix/gateway" - "gitlab.com/elixxir/client/e2e" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" @@ -47,7 +45,7 @@ func newTestingClient(face interface{}) (*Client, error) { "Could not construct a mock client: %v", err) } - c, err := OpenClient(storageDir, password, e2e.GetDefaultParams()) + c, err := OpenClient(storageDir, password, GetDefaultParams()) if err != nil { return nil, errors.Errorf("Could not open a mock client: %v", err) @@ -74,7 +72,7 @@ func newTestingClient(face interface{}) (*Client, error) { p := gateway.DefaultPoolParams() p.MaxPoolSize = 1 - sender, err := gateway.NewSender(p, c.rng, def, commsManager, + sender, err := gateway.NewSender(p, c.GetRng(), def, commsManager, c.storage, nil) if err != nil { return nil, err @@ -169,27 +167,3 @@ func signRoundInfo(ri *pb.RoundInfo) error { return signature.SignRsa(ri, ourPrivateKey) } - -// Test compressing an image that is small enough to not need 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) - if err != nil { - t.Errorf("Unable to compress test image: %+v", err) - } - if !bytes.Equal(testImg, result) { - t.Errorf("Expected same image return!") - } -} - -// -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) - if err != nil { - t.Errorf("Unable to compress test image: %+v", err) - } - if bytes.Equal(testImg, result) { - t.Errorf("Expected different image return!") - } -} diff --git a/auth/confirm.go b/auth/confirm.go index 1a7ea2ebdc194d919dfd1ae4206aae728749989d..72928f04927ab8ccd8a50e06096eeab480a57775 100644 --- a/auth/confirm.go +++ b/auth/confirm.go @@ -121,7 +121,9 @@ func (s *state) confirm(partner contact.Contact, serviceTag string) ( s.event.Report(10, "Auth", "SendConfirmError", em) } - s.backupTrigger("confirmed authenticated channel") + if s.backupTrigger != nil { + s.backupTrigger("confirmed authenticated channel") + } jww.INFO.Printf("Confirming Auth from %s to %s, msgDigest: %s", partner.ID, s.e2e.GetReceptionID(), diff --git a/auth/params.go b/auth/params.go index 92cb6e57de8f1e39efafccfc8d8d93ce5f30b917..907fa4ad825c3c6ef068d9dc7e6cd8b92d70a773 100644 --- a/auth/params.go +++ b/auth/params.go @@ -1,18 +1,44 @@ package auth -import "gitlab.com/elixxir/client/catalog" +import ( + "encoding/json" + "gitlab.com/elixxir/client/catalog" +) -type Param struct { - ReplayRequests bool +// Params is are the parameters for the auth package. +type Params struct { + ReplayRequests bool + RequestTag string + ConfirmTag string + ResetRequestTag string + ResetConfirmTag string +} +// paramsDisk will be the marshal-able and umarshal-able object. +type paramsDisk struct { + ReplayRequests bool RequestTag string ConfirmTag string ResetRequestTag string ResetConfirmTag string } -func GetDefaultParams() Param { - return Param{ +// GetParameters Obtain 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 +} + +// GetDefaultParams returns a default set of Params. +func GetDefaultParams() Params { + return Params{ ReplayRequests: false, RequestTag: catalog.Request, ConfirmTag: catalog.Confirm, @@ -21,7 +47,7 @@ func GetDefaultParams() Param { } } -func GetDefaultTemporaryParams() Param { +func GetDefaultTemporaryParams() Params { p := GetDefaultParams() p.RequestTag = catalog.RequestEphemeral p.ConfirmTag = catalog.ConfirmEphemeral @@ -30,7 +56,38 @@ func GetDefaultTemporaryParams() Param { return p } -func (p Param) getConfirmTag(reset bool) string { +// MarshalJSON adheres to the json.Marshaler interface. +func (p Params) MarshalJSON() ([]byte, error) { + pDisk := paramsDisk{ + ReplayRequests: p.ReplayRequests, + RequestTag: p.ResetRequestTag, + ConfirmTag: p.ConfirmTag, + ResetRequestTag: p.RequestTag, + ResetConfirmTag: p.ResetConfirmTag, + } + return json.Marshal(&pDisk) +} + +// UnmarshalJSON adheres to the json.Unmarshaler interface. +func (p *Params) UnmarshalJSON(data []byte) error { + pDisk := paramsDisk{} + err := json.Unmarshal(data, &pDisk) + if err != nil { + return err + } + + *p = Params{ + ReplayRequests: pDisk.ReplayRequests, + RequestTag: pDisk.ResetRequestTag, + ConfirmTag: pDisk.ConfirmTag, + ResetRequestTag: pDisk.RequestTag, + ResetConfirmTag: pDisk.ResetConfirmTag, + } + + return nil +} + +func (p Params) getConfirmTag(reset bool) string { if reset { return p.ResetConfirmTag } else { diff --git a/auth/receivedConfirm.go b/auth/receivedConfirm.go index c4b5a7e81398c93fe7894e34fd44e13d7fdfdf1d..8ee24bd341ba6c03e2f00a7a5158d76558b6800e 100644 --- a/auth/receivedConfirm.go +++ b/auth/receivedConfirm.go @@ -98,7 +98,9 @@ func (rcs *receivedConfirmService) Process(msg format.Message, "%s : %+v", rcs.GetPartner(), receptionID.Source, err) } - rcs.s.backupTrigger("received confirmation from request") + if rcs.s.backupTrigger != nil { + rcs.s.backupTrigger("received confirmation from request") + } // remove the service used for notifications of the confirm state.net.DeleteService(receptionID.Source, rcs.notificationsService, nil) diff --git a/auth/receivedRequest.go b/auth/receivedRequest.go index d5be826d5cf6d6138d301e080d0948ce5d96cc0f..944c1880b3ac0a744331abbcbb44c4f8dba79949 100644 --- a/auth/receivedRequest.go +++ b/auth/receivedRequest.go @@ -53,11 +53,11 @@ func (rrs *receivedRequestService) Process(message format.Message, return } - jww.INFO.Printf("partnerPubKeyBytes: %v", partnerPubKey.Bytes()) + jww.INFO.Printf("partnerPubKey: %v", partnerPubKey.TextVerbose(16, 0)) - jww.TRACE.Printf("processing requests: \n\t MYPUBKEY: %s "+ + jww.TRACE.Printf("processing requests: \n\t MYHISTORICALPUBKEY: %s "+ "\n\t PARTNERPUBKEY: %s \n\t ECRPAYLOAD: %s \n\t MAC: %s", - state.e2e.GetHistoricalDHPubkey().Text(16), + state.e2e.GetHistoricalDHPubkey().TextVerbose(16, 0), partnerPubKey.TextVerbose(16, 0), base64.StdEncoding.EncodeToString(baseFmt.data), base64.StdEncoding.EncodeToString(message.GetMac())) @@ -80,6 +80,7 @@ func (rrs *receivedRequestService) Process(message format.Message, jww.WARN.Printf("Failed to decode the auth request: %+v", err) return } + jww.INFO.Printf("\t PARTNERSIDHPUBKEY: %v", partnerSIDHPubKey) //create the contact, note that no facts are sent in the payload c := contact.Contact{ diff --git a/auth/request.go b/auth/request.go index 9c0dc2e4db1a9f4562d2db4bbaaf80b0e3dc7658..3a80c3c989c4ac5c755d558de46d72c94e60ec80 100644 --- a/auth/request.go +++ b/auth/request.go @@ -65,12 +65,18 @@ func (s *state) request(partner contact.Contact, myfacts fact.FactList, me := s.e2e.GetReceptionID() - dhPriv, dhPub := genDHKeys(s.e2e.GetGroup(), rng) + dhGrp := s.e2e.GetGroup() + + dhPriv, dhPub := genDHKeys(dhGrp, rng) sidhPriv, sidhPub := util.GenerateSIDHKeyPair( sidh.KeyVariantSidhA, rng) - ownership := cAuth.MakeOwnershipProof(s.e2e.GetHistoricalDHPrivkey(), - partner.DhPubKey, s.e2e.GetGroup()) + historicalDHPriv := s.e2e.GetHistoricalDHPrivkey() + historicalDHPub := diffieHellman.GeneratePublicKey(historicalDHPriv, + dhGrp) + + ownership := cAuth.MakeOwnershipProof(historicalDHPriv, + partner.DhPubKey, dhGrp) confirmFp := cAuth.MakeOwnershipProofFP(ownership) // Add the sent request and use the return to build the @@ -110,8 +116,17 @@ func (s *state) request(partner contact.Contact, myfacts fact.FactList, } contents := request.Marshal() - jww.TRACE.Printf("Request ECRPAYLOAD: %v", request.GetEcrPayload()) - jww.TRACE.Printf("Request MAC: %v", mac) + jww.TRACE.Printf("AuthRequest MYPUBKEY: %v", dhPub.TextVerbose(16, 0)) + jww.TRACE.Printf("AuthRequest PARTNERPUBKEY: %v", + partner.DhPubKey.TextVerbose(16, 0)) + jww.TRACE.Printf("AuthRequest MYSIDHPUBKEY: %s", + util.StringSIDHPubKey(sidhPub)) + + jww.TRACE.Printf("AuthRequest HistoricalPUBKEY: %v", + historicalDHPub.TextVerbose(16, 0)) + + jww.TRACE.Printf("AuthRequest ECRPAYLOAD: %v", request.GetEcrPayload()) + jww.TRACE.Printf("AuthRequest MAC: %v", mac) jww.INFO.Printf("Requesting Auth with %s, msgDigest: %s, confirmFp: %s", partner.ID, format.DigestContents(contents), confirmFp) diff --git a/auth/state.go b/auth/state.go index e2da71073c08641463121f81ce58da11ecc984e3..751f60312a3eccbc9a30ffbf3c8820f7dff49c1b 100644 --- a/auth/state.go +++ b/auth/state.go @@ -33,7 +33,7 @@ type state struct { store *store.Store event event.Reporter - params Param + params Params backupTrigger func(reason string) } @@ -54,7 +54,7 @@ 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 Param, + rng *fastRNG.StreamGenerator, event event.Reporter, params Params, callbacks Callbacks, backupTrigger func(reason string)) (State, error) { kv = kv.Prefix(makeStorePrefix(e2e.GetReceptionID())) return NewStateLegacy( @@ -66,7 +66,7 @@ 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 Param, + rng *fastRNG.StreamGenerator, event event.Reporter, params Params, callbacks Callbacks, backupTrigger func(reason string)) (State, error) { s := &state{ diff --git a/auth/state_test.go b/auth/state_test.go index 31392c1326a034d8c2e4724dde1c8b500a6f71bb..10ebb2d3ed4d9d99c654da78dfacc260a877a771 100644 --- a/auth/state_test.go +++ b/auth/state_test.go @@ -8,6 +8,11 @@ package auth import ( + "io" + "math/rand" + "testing" + "time" + "github.com/cloudflare/circl/dh/sidh" "gitlab.com/elixxir/client/auth/store" "gitlab.com/elixxir/client/cmix" @@ -29,10 +34,6 @@ import ( "gitlab.com/xx_network/crypto/large" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" - "io" - "math/rand" - "testing" - "time" ) /////////////////////////////////////////////////////////////////////////////// @@ -145,7 +146,7 @@ func TestManager_ReplayRequests(t *testing.T) { rng: fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG), store: s, event: &mockEventManager{}, - params: Param{ + params: Params{ ReplayRequests: true, }, } diff --git a/auth/store/confirmation_test.go b/auth/store/confirmation_test.go index a00f5e26f04adcc83903ef5101a055f1d66dcd5b..2bc188cd4429cf1ff27f5166dbbfc1c4457a13d5 100644 --- a/auth/store/confirmation_test.go +++ b/auth/store/confirmation_test.go @@ -8,6 +8,10 @@ package store import ( + "math/rand" + "reflect" + "testing" + "github.com/cloudflare/circl/dh/sidh" "gitlab.com/elixxir/client/storage/utility" "gitlab.com/elixxir/client/storage/versioned" @@ -18,16 +22,13 @@ import ( "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/crypto/large" "gitlab.com/xx_network/primitives/id" - "math/rand" - "reflect" - "testing" ) // Tests that a confirmation for different partners and sentByFingerprints can be // saved and loaded from storage via Store.StoreConfirmation and // Store.LoadConfirmation. func TestStore_StoreConfirmation_LoadConfirmation(t *testing.T) { - s := &Store{kv: versioned.NewKV(make(ekv.Memstore))} + s := &Store{kv: versioned.NewKV(ekv.MakeMemstore())} prng := rand.New(rand.NewSource(42)) grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) @@ -98,7 +99,7 @@ func TestStore_StoreConfirmation_LoadConfirmation(t *testing.T) { // Tests that Store.DeleteConfirmation deletes the correct confirmation from // storage and that it cannot be loaded from storage. func TestStore_deleteConfirmation(t *testing.T) { - s := &Store{kv: versioned.NewKV(make(ekv.Memstore))} + s := &Store{kv: versioned.NewKV(ekv.MakeMemstore())} prng := rand.New(rand.NewSource(42)) grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) diff --git a/auth/store/previousNegotiations_test.go b/auth/store/previousNegotiations_test.go index 2a19dc48ac8e1ec546c550e962a388ccfbfcb6c1..2d8234a45adf372b5883eb7bade2714f6574619a 100644 --- a/auth/store/previousNegotiations_test.go +++ b/auth/store/previousNegotiations_test.go @@ -8,6 +8,10 @@ package store import ( + "math/rand" + "reflect" + "testing" + "github.com/cloudflare/circl/dh/sidh" "gitlab.com/elixxir/client/storage/utility" "gitlab.com/elixxir/client/storage/versioned" @@ -19,9 +23,6 @@ import ( "gitlab.com/xx_network/crypto/csprng" "gitlab.com/xx_network/crypto/large" "gitlab.com/xx_network/primitives/id" - "math/rand" - "reflect" - "testing" ) // Tests the four possible cases of Store.CheckIfNegotationIsNew: @@ -36,7 +37,7 @@ import ( // Return newFingerprint = false, latest = true. func TestStore_AddIfNew(t *testing.T) { s := &Store{ - kv: versioned.NewKV(make(ekv.Memstore)), + kv: versioned.NewKV(ekv.MakeMemstore()), previousNegotiations: make(map[id.ID]bool), } prng := rand.New(rand.NewSource(42)) @@ -161,7 +162,7 @@ func TestStore_AddIfNew(t *testing.T) { // previousNegotiations in storage and any confirmations in storage. func TestStore_deletePreviousNegotiationPartner(t *testing.T) { s := &Store{ - kv: versioned.NewKV(make(ekv.Memstore)), + kv: versioned.NewKV(ekv.MakeMemstore()), previousNegotiations: make(map[id.ID]bool), } prng := rand.New(rand.NewSource(42)) @@ -257,7 +258,7 @@ func TestStore_deletePreviousNegotiationPartner(t *testing.T) { // via Store.savePreviousNegotiations andStore.newOrLoadPreviousNegotiations. func TestStore_savePreviousNegotiations_newOrLoadPreviousNegotiations(t *testing.T) { s := &Store{ - kv: versioned.NewKV(make(ekv.Memstore)), + kv: versioned.NewKV(ekv.MakeMemstore()), previousNegotiations: make(map[id.ID]bool), } prng := rand.New(rand.NewSource(42)) @@ -291,7 +292,7 @@ func TestStore_savePreviousNegotiations_newOrLoadPreviousNegotiations(t *testing // they do not exist. func TestStore_newOrLoadPreviousNegotiations_noNegotiations(t *testing.T) { s := &Store{ - kv: versioned.NewKV(make(ekv.Memstore)), + kv: versioned.NewKV(ekv.MakeMemstore()), previousNegotiations: make(map[id.ID]bool), } expected := make(map[id.ID]bool) @@ -339,7 +340,7 @@ func Test_marshalPreviousNegotiations_unmarshalPreviousNegotiations(t *testing.T // loaded from storage via Store.saveNegotiationFingerprints and // Store.loadNegotiationFingerprints. func TestStore_saveNegotiationFingerprints_loadNegotiationFingerprints(t *testing.T) { - s := &Store{kv: versioned.NewKV(make(ekv.Memstore))} + s := &Store{kv: versioned.NewKV(ekv.MakeMemstore())} rng := csprng.NewSystemRNG() grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) diff --git a/auth/store/sentRequest.go b/auth/store/sentRequest.go index 9fd5bca2db8b2d7e3ce8924265a65bec13621c29..c6080a9e059946ff9d04de06ad936b5650ea0cdb 100644 --- a/auth/store/sentRequest.go +++ b/auth/store/sentRequest.go @@ -11,6 +11,8 @@ import ( "encoding/base64" "encoding/hex" "encoding/json" + "sync" + "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" @@ -20,7 +22,6 @@ import ( "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" - "sync" ) const currentSentRequestVersion = 0 @@ -128,8 +129,8 @@ func loadSentRequest(kv *versioned.KV, partner *id.ID, grp *cyclic.Group) (*Sent hex.EncodeToString(partner[:])) jww.INFO.Printf("loadSentRequest historicalPubKey: %s", hex.EncodeToString(historicalPubKey.Bytes())) - jww.INFO.Printf("loadSentRequest myPrivKey: %s", - hex.EncodeToString(myPrivKey.Bytes())) + // jww.INFO.Printf("loadSentRequest myPrivKey: %s", + // hex.EncodeToString(myPrivKey.Bytes())) jww.INFO.Printf("loadSentRequest myPubKey: %s", hex.EncodeToString(myPubKey.Bytes())) jww.INFO.Printf("loadSentRequest fingerprint: %s", @@ -168,8 +169,8 @@ func (sr *SentRequest) save() error { hex.EncodeToString(sr.partner[:])) jww.INFO.Printf("saveSentRequest historicalPubKey: %s", hex.EncodeToString(sr.partnerHistoricalPubKey.Bytes())) - jww.INFO.Printf("saveSentRequest myPrivKey: %s", - hex.EncodeToString(sr.myPrivKey.Bytes())) + // jww.INFO.Printf("saveSentRequest myPrivKey: %s", + // hex.EncodeToString(sr.myPrivKey.Bytes())) jww.INFO.Printf("saveSentRequest myPubKey: %s", hex.EncodeToString(sr.myPubKey.Bytes())) jww.INFO.Printf("saveSentRequest fingerprint: %s", diff --git a/auth/store/store_test.go b/auth/store/store_test.go index e6b14e7e08a40724668ce252054cc4d7591c4e85..4c88064c04acebb62281c108d69eeb66caac5182 100644 --- a/auth/store/store_test.go +++ b/auth/store/store_test.go @@ -9,6 +9,12 @@ package store import ( "bytes" + "io" + "math/rand" + "reflect" + "sort" + "testing" + "github.com/cloudflare/circl/dh/sidh" "gitlab.com/elixxir/client/cmix/rounds" sidhinterface "gitlab.com/elixxir/client/interfaces/sidh" @@ -26,12 +32,6 @@ import ( "gitlab.com/xx_network/crypto/large" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" - "io" - "math/rand" - "reflect" - "sort" - "testing" - "time" ) type mockSentRequestHandler struct{} @@ -41,7 +41,7 @@ func (msrh *mockSentRequestHandler) Delete(sr *SentRequest) {} // Happy path. func TestNewOrLoadStore(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(2)) _, err := NewOrLoadStore(kv, grp, &mockSentRequestHandler{}) @@ -142,30 +142,30 @@ func TestStore_AddSent(t *testing.T) { } } -// Error path: request with request already exists in map. -func TestStore_AddSent_PartnerAlreadyExistsError(t *testing.T) { - s, _ := makeTestStore(t) +// // Error path: request with request already exists in map. +// func TestStore_AddSent_PartnerAlreadyExistsError(t *testing.T) { +// s, _ := makeTestStore(t) - rng := csprng.NewSystemRNG() - sidhPrivKey, sidhPubKey := genSidhAKeys(rng) +// rng := csprng.NewSystemRNG() +// sidhPrivKey, sidhPubKey := genSidhAKeys(rng) - partner := id.NewIdFromUInt(rand.Uint64(), id.User, t) +// partner := id.NewIdFromUInt(rand.Uint64(), id.User, t) - _, err := s.AddSent(partner, s.grp.NewInt(5), s.grp.NewInt(6), - s.grp.NewInt(7), sidhPrivKey, sidhPubKey, - format.Fingerprint{42}, true) - if err != nil { - t.Errorf("AddSent() produced an error: %+v", err) - } +// _, err := s.AddSent(partner, s.grp.NewInt(5), s.grp.NewInt(6), +// s.grp.NewInt(7), sidhPrivKey, sidhPubKey, +// format.Fingerprint{42}, true) +// if err != nil { +// t.Errorf("AddSent() produced an error: %+v", err) +// } - _, err = s.AddSent(partner, s.grp.NewInt(5), s.grp.NewInt(6), - s.grp.NewInt(7), sidhPrivKey, sidhPubKey, - format.Fingerprint{42}, true) - if err == nil { - t.Errorf("AddSent() did not produce the expected error for " + - "a request that already exists.") - } -} +// _, err = s.AddSent(partner, s.grp.NewInt(5), s.grp.NewInt(6), +// s.grp.NewInt(7), sidhPrivKey, sidhPubKey, +// format.Fingerprint{42}, true) +// if err == nil { +// t.Errorf("AddSent() did not produce the expected error for " + +// "a request that already exists.") +// } +// } // Happy path. func TestStore_AddReceived(t *testing.T) { @@ -869,7 +869,7 @@ func TestStore_DeleteAllRequests(t *testing.T) { } func makeTestStore(t *testing.T) (*Store, *versioned.KV) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(0)) store, err := NewOrLoadStore(kv, grp, &mockSentRequestHandler{}) diff --git a/auth/utils_test.go b/auth/utils_test.go index a1b3291a197ac8a0b5a9d44522a6227ea9a14285..4d6b50ade9db9ff930e3824af62515a098578e77 100644 --- a/auth/utils_test.go +++ b/auth/utils_test.go @@ -32,6 +32,26 @@ type mockE2eHandler struct { privKey *cyclic.Int } +func (m mockE2eHandler) HasAuthenticatedChannel(partner *id.ID) bool { + panic("implement me") +} + +func (m mockE2eHandler) FirstPartitionSize() uint { + panic("implement me") +} + +func (m mockE2eHandler) SecondPartitionSize() uint { + panic("implement me") +} + +func (m mockE2eHandler) PartitionSize(payloadIndex uint) uint { + panic("implement me") +} + +func (m mockE2eHandler) PayloadSize() uint { + panic("implement me") +} + func (m mockE2eHandler) GetHistoricalDHPrivkey() *cyclic.Int { return m.privKey } diff --git a/backup/backup.go b/backup/backup.go index f4f1c19ee2191e2b00deb2e269f42bed04cb5bef..0e025f3fe28e116f77a19a81a873238db8c4b38a 100644 --- a/backup/backup.go +++ b/backup/backup.go @@ -11,6 +11,7 @@ import ( "sync" "time" + "gitlab.com/elixxir/client/api/messenger" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/primitives/fact" @@ -43,7 +44,7 @@ type Backup struct { // Callback that is called with the encrypted backup when triggered updateBackupCb UpdateBackupFn - container *Container + container *messenger.Container jsonParams string @@ -93,7 +94,7 @@ type UpdateBackupFn func(encryptedBackup []byte) // Call this to turn on backups for the first time or to replace the user's // password. func InitializeBackup(password string, updateBackupCb UpdateBackupFn, - container *Container, e2e E2e, session Session, ud UserDiscovery, + container *messenger.Container, e2e E2e, session Session, ud UserDiscovery, kv *versioned.KV, rng *fastRNG.StreamGenerator) (*Backup, error) { b := &Backup{ updateBackupCb: updateBackupCb, @@ -143,7 +144,7 @@ func InitializeBackup(password string, updateBackupCb UpdateBackupFn, // ResumeBackup resumes a backup by restoring the Backup object and registering // a new callback. Call this to resume backups that have already been // initialized. Returns an error if backups have not already been initialized. -func ResumeBackup(updateBackupCb UpdateBackupFn, container *Container, +func ResumeBackup(updateBackupCb UpdateBackupFn, container *messenger.Container, e2e E2e, session Session, ud UserDiscovery, kv *versioned.KV, rng *fastRNG.StreamGenerator) (*Backup, error) { _, err := loadPassword(kv) @@ -315,7 +316,11 @@ func (b *Backup) assembleBackup() backup.Backup { } // Get facts - bu.UserDiscoveryRegistration.FactList = b.ud.GetFacts() + if b.ud != nil { + bu.UserDiscoveryRegistration.FactList = b.ud.GetFacts() + } else { + bu.UserDiscoveryRegistration.FactList = fact.FactList{} + } // Get contacts bu.Contacts.Identities = b.e2e.GetAllPartnerIDs() diff --git a/backup/backup_test.go b/backup/backup_test.go index 94281bdaa31de0a366e9ba0d49cc8947af513cfb..eeda3711c16697038f98228e228ee04c441ea627 100644 --- a/backup/backup_test.go +++ b/backup/backup_test.go @@ -14,6 +14,7 @@ import ( "testing" "time" + "gitlab.com/elixxir/client/api/messenger" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/ekv" @@ -25,12 +26,13 @@ import ( // Tests that Backup.InitializeBackup returns a new Backup with a copy of the // key and the callback. func Test_InitializeBackup(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) rngGen := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG) cbChan := make(chan []byte, 2) cb := func(encryptedBackup []byte) { cbChan <- encryptedBackup } expectedPassword := "MySuperSecurePassword" - b, err := InitializeBackup(expectedPassword, cb, &Container{}, newMockE2e(t), + b, err := InitializeBackup(expectedPassword, cb, &messenger.Container{}, + newMockE2e(t), newMockSession(t), newMockUserDiscovery(), kv, rngGen) if err != nil { t.Errorf("InitializeBackup returned an error: %+v", err) @@ -86,12 +88,12 @@ func Test_InitializeBackup(t *testing.T) { // callback but keeps the password. func Test_ResumeBackup(t *testing.T) { // Start the first backup - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) rngGen := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG) cbChan1 := make(chan []byte) cb1 := func(encryptedBackup []byte) { cbChan1 <- encryptedBackup } expectedPassword := "MySuperSecurePassword" - b, err := InitializeBackup(expectedPassword, cb1, &Container{}, + b, err := InitializeBackup(expectedPassword, cb1, &messenger.Container{}, newMockE2e(t), newMockSession(t), newMockUserDiscovery(), kv, rngGen) if err != nil { t.Errorf("Failed to initialize new Backup: %+v", err) @@ -113,7 +115,7 @@ func Test_ResumeBackup(t *testing.T) { // Resume the backup with a new callback cbChan2 := make(chan []byte) cb2 := func(encryptedBackup []byte) { cbChan2 <- encryptedBackup } - b2, err := ResumeBackup(cb2, &Container{}, newMockE2e(t), newMockSession(t), + b2, err := ResumeBackup(cb2, &messenger.Container{}, newMockE2e(t), newMockSession(t), newMockUserDiscovery(), kv, rngGen) if err != nil { t.Errorf("ResumeBackup returned an error: %+v", err) @@ -164,9 +166,9 @@ func Test_ResumeBackup(t *testing.T) { // present in storage. func Test_ResumeBackup_NoKeyError(t *testing.T) { expectedErr := strings.Split(errLoadPassword, "%")[0] - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) rngGen := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG) - _, err := ResumeBackup(nil, &Container{}, newMockE2e(t), newMockSession(t), + _, err := ResumeBackup(nil, &messenger.Container{}, newMockE2e(t), newMockSession(t), newMockUserDiscovery(), kv, rngGen) if err == nil || !strings.Contains(err.Error(), expectedErr) { t.Errorf("ResumeBackup did not return the expected error when no "+ @@ -420,11 +422,11 @@ func newTestBackup(password string, cb UpdateBackupFn, t *testing.T) *Backup { b, err := InitializeBackup( password, cb, - &Container{}, + &messenger.Container{}, newMockE2e(t), newMockSession(t), newMockUserDiscovery(), - versioned.NewKV(make(ekv.Memstore)), + versioned.NewKV(ekv.MakeMemstore()), fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG), ) if err != nil { @@ -437,13 +439,14 @@ func newTestBackup(password string, cb UpdateBackupFn, t *testing.T) *Backup { // Tests that Backup.InitializeBackup returns a new Backup with a copy of the // key and the callback. func Benchmark_InitializeBackup(t *testing.B) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) rngGen := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG) cbChan := make(chan []byte, 2) cb := func(encryptedBackup []byte) { cbChan <- encryptedBackup } expectedPassword := "MySuperSecurePassword" for i := 0; i < t.N; i++ { - _, err := InitializeBackup(expectedPassword, cb, &Container{}, + _, err := InitializeBackup(expectedPassword, cb, + &messenger.Container{}, newMockE2e(t), newMockSession(t), newMockUserDiscovery(), kv, rngGen) if err != nil { diff --git a/backup/jsonStorage_test.go b/backup/jsonStorage_test.go index d0207d910d76ffd73b5dfa1ff623996bf14c916b..352f6d2d6e595fe8a6fe49da48deda570cee647c 100644 --- a/backup/jsonStorage_test.go +++ b/backup/jsonStorage_test.go @@ -1,13 +1,14 @@ package backup import ( + "testing" + "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/ekv" - "testing" ) func Test_storeJson_loadJson(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) json := "{'data': {'one': 1}}" err := storeJson(json, kv) diff --git a/backup/keyStorage_test.go b/backup/keyStorage_test.go index 939ca2c632fbf8d5ce41af81b158be0a3be7d4aa..95e7a08915f4255dfc742277cf47b72a5e97b470 100644 --- a/backup/keyStorage_test.go +++ b/backup/keyStorage_test.go @@ -8,16 +8,17 @@ package backup import ( + "testing" + "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/netTime" - "testing" ) // Tests that savePassword saves the password to storage by loading it and // comparing it to the original. func Test_savePassword(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) expectedPassword := "MySuperSecurePassword" // Save the password @@ -42,7 +43,7 @@ func Test_savePassword(t *testing.T) { // Tests that loadPassword restores the original password saved to stage and // compares it to the original. func Test_loadPassword(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) expectedPassword := "MySuperSecurePassword" // Save the password @@ -71,7 +72,7 @@ func Test_loadPassword(t *testing.T) { // Tests that deletePassword deletes the password from storage by trying to recover a // deleted password. func Test_deletePassword(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) expectedPassword := "MySuperSecurePassword" // Save the password diff --git a/bindings/README.md b/bindings/README.md deleted file mode 100644 index 6aebd389abc87365d4a9c003c8e4fbdfea0f3658..0000000000000000000000000000000000000000 --- a/bindings/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Client Bindings - -"bindings" is the client bindings which can be used to generate Android -and iOS client libraries for apps using gomobile. Gomobile is -limited to int, string, []byte, interfaces, and only a couple other types, so -it is necessary to define several interfaces to support passing more complex -data across the boundary (see `interfaces.go`). The rest of the logic -is located in `api.go` diff --git a/bindings/authenticatedChannels.go b/bindings/authenticatedChannels.go deleted file mode 100644 index af246b5408736224ec081ae7e45806b25b4a0a60..0000000000000000000000000000000000000000 --- a/bindings/authenticatedChannels.go +++ /dev/null @@ -1,170 +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 bindings - -import ( - "fmt" - - "gitlab.com/elixxir/crypto/contact" - "gitlab.com/xx_network/primitives/id" -) - -// Create an insecure e2e relationship with a precanned user -func (c *Client) MakePrecannedAuthenticatedChannel(precannedID int) (*Contact, error) { - precannedContact, err := c.api.MakePrecannedAuthenticatedChannel(uint(precannedID)) - if err != nil { - return nil, fmt.Errorf("Failed to "+ - "MakePrecannedAuthenticatedChannel: %+v", err) - } - return &Contact{c: &precannedContact}, nil -} - -// RequestAuthenticatedChannel sends a request to another party to establish an -// authenticated channel -// It will not run if the network status is not healthy -// An error will be returned if a channel already exists, if a request was -// already received. -// When a confirmation occurs, the channel will be created and the callback -// will be called -// This can be called many times and retried. -// -// This function takes the marshaled send report to ensure a memory leak does -// not occur as a result of both sides of the bindings holding a refrence to -// the same pointer. -func (c *Client) RequestAuthenticatedChannel(recipientMarshaled, - meMarshaled []byte, message string) (int, error) { - recipent, err := contact.Unmarshal(recipientMarshaled) - - if err != nil { - return 0, fmt.Errorf("Failed to "+ - "RequestAuthenticatedChannel: Failed to Unmarshal Recipent: "+ - "%+v", err) - } - - me, err := contact.Unmarshal(meMarshaled) - - if err != nil { - return 0, fmt.Errorf("Failed to "+ - "RequestAuthenticatedChannel: Failed to Unmarshal Me: %+v", err) - } - - rid, err := c.api.RequestAuthenticatedChannel(recipent, me, message) - - return int(rid), err -} - -// ResetSession resets an authenticated channel that already exists -func (c *Client) ResetSession(recipientMarshaled, - meMarshaled []byte, message string) (int, error) { - recipent, err := contact.Unmarshal(recipientMarshaled) - - if err != nil { - return 0, fmt.Errorf("failed to "+ - "ResetSession: failed to Unmarshal Recipent: "+ - "%+v", err) - } - - me, err := contact.Unmarshal(meMarshaled) - - if err != nil { - return 0, fmt.Errorf("failed to "+ - "ResetSession: Failed to Unmarshal Me: %+v", err) - } - - rid, err := c.api.ResetSession(recipent, me, message) - - return int(rid), err -} - -// RegisterAuthCallbacks registers all callbacks for authenticated channels. -// This can only be called once -func (c *Client) RegisterAuthCallbacks(request AuthRequestCallback, - confirm AuthConfirmCallback, reset AuthResetNotificationCallback) { - - requestFunc := func(requestor contact.Contact) { - requestorBind := &Contact{c: &requestor} - request.Callback(requestorBind) - } - - resetFunc := func(resetor contact.Contact) { - resetorBind := &Contact{c: &resetor} - reset.Callback(resetorBind) - } - - confirmFunc := func(partner contact.Contact) { - partnerBind := &Contact{c: &partner} - confirm.Callback(partnerBind) - } - - c.api.GetAuthRegistrar().AddGeneralConfirmCallback(confirmFunc) - c.api.GetAuthRegistrar().AddGeneralRequestCallback(requestFunc) - c.api.GetAuthRegistrar().AddResetNotificationCallback(resetFunc) -} - -// ConfirmAuthenticatedChannel creates an authenticated channel out of a valid -// received request and sends a message to the requestor that the request has -// been confirmed -// It will not run if the network status is not healthy -// An error will be returned if a request doest -// exist, or if the passed in contact does not exactly match the received -// request. -// This can be called many times and retried. -// -// This function takes the marshaled send report to ensure a memory leak does -// not occur as a result of both sides of the bindings holding a refrence to -// the same pointer. -func (c *Client) ConfirmAuthenticatedChannel(recipientMarshaled []byte) (int, error) { - recipent, err := contact.Unmarshal(recipientMarshaled) - - if err != nil { - return 0, fmt.Errorf("Failed to "+ - "ConfirmAuthenticatedChannel: Failed to Unmarshal Recipient: "+ - "%+v", err) - } - - rid, err := c.api.ConfirmAuthenticatedChannel(recipent) - - return int(rid), err -} - -// VerifyOwnership checks if the ownership proof on a passed contact matches the -// identity in a verified contact -func (c *Client) VerifyOwnership(receivedMarshaled, verifiedMarshaled []byte) (bool, error) { - received, err := contact.Unmarshal(receivedMarshaled) - - if err != nil { - return false, fmt.Errorf("Failed to "+ - "VerifyOwnership: Failed to Unmarshal Received: %+v", err) - } - - verified, err := contact.Unmarshal(verifiedMarshaled) - - if err != nil { - return false, fmt.Errorf("Failed to "+ - "VerifyOwnership: Failed to Unmarshal Verified: %+v", err) - } - - return c.api.VerifyOwnership(received, verified), nil -} - -// GetRelationshipFingerprint returns a unique 15 character fingerprint for an -// E2E relationship. An error is returned if no relationship with the partner -// is found. -func (c *Client) GetRelationshipFingerprint(partnerID []byte) (string, error) { - partner, err := id.Unmarshal(partnerID) - if err != nil { - return "", err - } - - return c.api.GetRelationshipFingerprint(partner) -} - -// ReplayRequests Resends all pending requests over the normal callbacks -func (c *Client) ReplayRequests() { - c.api.GetAuthRegistrar().ReplayRequests() -} diff --git a/bindings/authenticatedConnectionTracker.go b/bindings/authenticatedConnectionTracker.go new file mode 100644 index 0000000000000000000000000000000000000000..57e260dc7c037b5cd82d5aebbb404d9b8b4ca751 --- /dev/null +++ b/bindings/authenticatedConnectionTracker.go @@ -0,0 +1,56 @@ +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 new file mode 100644 index 0000000000000000000000000000000000000000..758b8c741972d61dd6616d9e5691db83837df3d9 --- /dev/null +++ b/bindings/autheticatedConnection.go @@ -0,0 +1,40 @@ +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 Identity and contact.Contact object +func (c *Client) ConnectWithAuthentication(recipientContact []byte, myIdentity []byte) (*AuthenticatedConnection, error) { + cont, err := contact.Unmarshal(recipientContact) + if err != nil { + return nil, err + } + myID, rsaPriv, salt, myDHPriv, err := c.unmarshalIdentity(myIdentity) + if err != nil { + return nil, err + } + + connection, err := connect.ConnectWithAuthentication(cont, myID, salt, rsaPriv, myDHPriv, c.api.GetRng(), + c.api.GetStorage().GetE2EGroup(), c.api.GetCmix(), connect.GetDefaultParams()) + return authenticatedConnectionTrackerSingleton.make(connection), nil +} diff --git a/bindings/backup.go b/bindings/backup.go deleted file mode 100644 index 955839e8cf326ecda83e36fd35f2ba68fdb657f9..0000000000000000000000000000000000000000 --- a/bindings/backup.go +++ /dev/null @@ -1,72 +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 bindings - -import ( - "gitlab.com/elixxir/client/backup" -) - -type Backup struct { - b *backup.Backup -} - -// UpdateBackupFunc contains a function callback that returns new backups. -type UpdateBackupFunc interface { - UpdateBackup(encryptedBackup []byte) -} - -// InitializeBackup starts the backup processes that returns backup updates when -// they occur. Any time an event occurs that changes the contents of the backup, -// such as adding or deleting a contact, the backup is triggered and an -// encrypted backup is generated and returned on the updateBackupCb callback. -// Call this function only when enabling backup if it has not already been -// initialized or when the user wants to change their password. -// To resume backup process on app recovery, use ResumeBackup. -func InitializeBackup( - password string, updateBackupCb UpdateBackupFunc, c *Client) (*Backup, error) { - b, err := backup.InitializeBackup( - password, updateBackupCb.UpdateBackup, &c.api) - if err != nil { - return nil, err - } - - return &Backup{b}, nil -} - -// ResumeBackup starts the backup processes back up with a new callback after it -// has been initialized. -// Call this function only when resuming a backup that has already been -// initialized or to replace the callback. -// To start the backup for the first time or to use a new password, use -// InitializeBackup. -func ResumeBackup(cb UpdateBackupFunc, c *Client) ( - *Backup, error) { - b, err := backup.ResumeBackup(cb.UpdateBackup, &c.api) - if err != nil { - return nil, err - } - - return &Backup{b}, nil -} - -// StopBackup stops the backup processes and deletes the user's password from -// storage. To enable backups again, call InitializeBackup. -func (b *Backup) StopBackup() error { - return b.b.StopBackup() -} - -// IsBackupRunning returns true if the backup has been initialized and is -// running. Returns false if it has been stopped. -func (b *Backup) IsBackupRunning() bool { - return b.b.IsBackupRunning() -} - -// AddJson stores a passed in json string in the backup structure -func (b *Backup) AddJson(json string) { - b.b.AddJson(json) -} diff --git a/bindings/callback.go b/bindings/callback.go deleted file mode 100644 index 4ad87c94ae91e1dc5d688900d75d0b404f9a1765..0000000000000000000000000000000000000000 --- a/bindings/callback.go +++ /dev/null @@ -1,124 +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 bindings - -import ( - "gitlab.com/elixxir/client/interfaces" - "gitlab.com/elixxir/client/switchboard" - "gitlab.com/elixxir/comms/network/dataStructures" - "gitlab.com/xx_network/primitives/id" -) - -// Listener provides a callback to hear a message -// An object implementing this interface can be called back when the client -// gets a message of the type that the registerer specified at registration -// time. -type Listener interface { - // Hear is called to receive a message in the UI - Hear(message *Message) - // Returns a name, used for debugging - Name() string -} - -// A callback when which is used to receive notification if network health -// changes -type NetworkHealthCallback interface { - Callback(bool) -} - -// RoundEventCallback handles waiting on the exact state of a round on -// the cMix network. -type RoundEventCallback interface { - EventCallback(rid, state int, timedOut bool) -} - -// RoundCompletionCallback is returned when the completion of a round is known. -type RoundCompletionCallback interface { - EventCallback(rid int, success, timedOut bool) -} - -// MessageDeliveryCallback gets called on the determination if all events -// related to a message send were successful. -type MessageDeliveryCallback interface { - EventCallback(msgID []byte, delivered, timedOut bool, roundResults []byte) -} - -// AuthRequestCallback notifies the register whenever they receive an auth -// request -type AuthRequestCallback interface { - Callback(requestor *Contact) -} - -// AuthConfirmCallback notifies the register whenever they receive an auth -// request confirmation -type AuthConfirmCallback interface { - Callback(partner *Contact) -} - -// AuthRequestCallback notifies the register whenever they receive an auth -// request -type AuthResetNotificationCallback interface { - Callback(requestor *Contact) -} - -// Generic Unregister - a generic return used for all callbacks which can be -// unregistered -// Interface which allows the un-registration of a listener -type Unregister struct { - f func() -} - -//Call unregisters a callback -func (u *Unregister) Unregister() { - u.f() -} - -//creates an unregister interface for listeners -func newListenerUnregister(lid switchboard.ListenerID, sw interfaces.Switchboard) *Unregister { - f := func() { - sw.Unregister(lid) - } - return &Unregister{f: f} -} - -//creates an unregister interface for round events -func newRoundUnregister(rid id.Round, ec *dataStructures.EventCallback, - re interfaces.RoundEvents) *Unregister { - f := func() { - re.Remove(rid, ec) - } - return &Unregister{f: f} -} - -//creates an unregister interface for round events -func newRoundListUnregister(rounds []id.Round, ec []*dataStructures.EventCallback, - re interfaces.RoundEvents) *Unregister { - f := func() { - for i, r := range rounds { - re.Remove(r, ec[i]) - } - } - return &Unregister{f: f} -} - -type ClientError interface { - Report(source, message, trace string) -} - -type LogWriter interface { - Log(string) -} - -type writerAdapter struct { - lw LogWriter -} - -func (wa *writerAdapter) Write(p []byte) (n int, err error) { - wa.lw.Log(string(p)) - return len(p), nil -} diff --git a/bindings/client.go b/bindings/client.go index a160886728f0d7f0975be56956cca85171825883..24f69dceef7ecd992c6ebdb3543aae8dad18f209 100644 --- a/bindings/client.go +++ b/bindings/client.go @@ -1,54 +1,30 @@ -/////////////////////////////////////////////////////////////////////////////// -// 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 ( - "bytes" - "encoding/csv" - "encoding/json" - "errors" "fmt" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/single/old" - "runtime/pprof" - "strings" - "sync" - "time" - + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/api" - "gitlab.com/elixxir/client/interfaces/message" - "gitlab.com/elixxir/client/interfaces/params" - "gitlab.com/elixxir/comms/mixmessages" - "gitlab.com/elixxir/crypto/contact" - "gitlab.com/elixxir/primitives/states" - "gitlab.com/xx_network/primitives/id" - "gitlab.com/xx_network/primitives/netTime" - "google.golang.org/grpc/grpclog" ) -var extantClient bool = false -var loginMux sync.Mutex - -var clientSingleton *Client - // sets the log level func init() { jww.SetLogThreshold(jww.LevelInfo) jww.SetStdoutThreshold(jww.LevelInfo) } -// BindingsClient wraps the api.Client, implementing additional functions +//client tracker singleton, used to track clients so they can be referenced by +//id back over the bindings +var clientTrackerSingleton = &clientTracker{ + clients: make(map[int]*Client), + count: 0, +} + +// Client BindingsClient wraps the api.Client, implementing additional functions // to support the gomobile Client interface type Client struct { - api api.Client - single *old.Manager - singleMux sync.Mutex + api *api.Client + id int } // NewClient creates client storage, generates keys, connects, and registers @@ -65,51 +41,6 @@ func NewClient(network, storageDir string, password []byte, regCode string) erro return nil } -// 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. -// -// Users of this function should delete the storage directory on error. -func NewPrecannedClient(precannedID int, network, storageDir string, password []byte) error { - if precannedID < 0 { - return errors.New("Cannot create precanned client with negative ID") - } - - if err := api.NewPrecannedClient(uint(precannedID), network, storageDir, password); err != nil { - return errors.New(fmt.Sprintf("Failed to create new precanned "+ - "client: %+v", err)) - } - return nil -} - -type BackupReport struct { - RestoredContacts []*id.ID - Params string -} - -// NewClientFromBackup constructs a new Client from an encrypted backup. The backup -// is decrypted using the backupPassphrase. On success 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 of the parameters stored in the backup -func NewClientFromBackup(ndfJSON, storageDir string, sessionPassword, - backupPassphrase, backupFileContents []byte) ([]byte, error) { - backupPartnerIds, jsonParams, err := api.NewClientFromBackup(ndfJSON, storageDir, - sessionPassword, backupPassphrase, backupFileContents) - if err != nil { - return nil, errors.New(fmt.Sprintf("Failed to create new "+ - "client from backup: %+v", err)) - } - - report := BackupReport{ - RestoredContacts: backupPartnerIds, - Params: jsonParams, - } - - return json.Marshal(report) -} - // Login 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. @@ -117,502 +48,20 @@ func NewClientFromBackup(ndfJSON, storageDir string, sessionPassword, // memory and stored as securely as possible using the memguard library. // Login does not block on network connection, and instead loads and // starts subprocesses to perform network operations. -func Login(storageDir string, password []byte, parameters string) (*Client, error) { - loginMux.Lock() - defer loginMux.Unlock() +// TODO: add in custom parameters instead of the default +func Login(storageDir string, password []byte) (*Client, error) { - if extantClient { - return nil, errors.New("cannot login when another session " + - "already exists") - } - // check if a client is already logged in, refuse to login if one is - p, err := params.GetNetworkParameters(parameters) + client, err := api.Login(storageDir, password, api.GetDefaultParams()) if err != nil { return nil, errors.New(fmt.Sprintf("Failed to login: %+v", err)) } - client, err := api.Login(storageDir, password, p) - if err != nil { - return nil, errors.New(fmt.Sprintf("Failed to login: %+v", err)) - } - extantClient = true - clientSingleton := &Client{api: *client} - - return clientSingleton, nil -} - -// returns a previously created client. IF be used if the garbage collector -// removes the client instance on the app side. Is NOT thread safe relative to -// login, newClient, or newPrecannedClient -func GetClientSingleton() *Client { - return clientSingleton -} - -// sets level of logging. All logs the set level and above will be displayed -// options are: -// TRACE - 0 -// DEBUG - 1 -// INFO - 2 -// WARN - 3 -// ERROR - 4 -// CRITICAL - 5 -// FATAL - 6 -// The default state without updates is: INFO -func LogLevel(level int) error { - if level < 0 || level > 6 { - return errors.New(fmt.Sprintf("log level is not valid: log level: %d", level)) - } - - threshold := jww.Threshold(level) - jww.SetLogThreshold(threshold) - jww.SetStdoutThreshold(threshold) - - switch threshold { - case jww.LevelTrace: - fallthrough - case jww.LevelDebug: - fallthrough - case jww.LevelInfo: - jww.INFO.Printf("Log level set to: %s", threshold) - case jww.LevelWarn: - jww.WARN.Printf("Log level set to: %s", threshold) - case jww.LevelError: - jww.ERROR.Printf("Log level set to: %s", threshold) - case jww.LevelCritical: - jww.CRITICAL.Printf("Log level set to: %s", threshold) - case jww.LevelFatal: - jww.FATAL.Printf("Log level set to: %s", threshold) - } - - return nil -} - -//RegisterLogWriter registers a callback on which logs are written. -func RegisterLogWriter(writer LogWriter) { - jww.SetLogOutput(&writerAdapter{lw: writer}) -} - -// EnableGrpcLogs sets GRPC trace logging -func EnableGrpcLogs(writer LogWriter) { - logger := &writerAdapter{lw: writer} - grpclog.SetLoggerV2(grpclog.NewLoggerV2WithVerbosity( - logger, logger, logger, 99)) -} - -//Unmarshals a marshaled contact object, returns an error if it fails -func UnmarshalContact(b []byte) (*Contact, error) { - c, err := contact.Unmarshal(b) - if err != nil { - return nil, errors.New(fmt.Sprintf("Failed to Unmarshal "+ - "Contact: %+v", err)) - } - return &Contact{c: &c}, nil -} - -//Unmarshals a marshaled send report object, returns an error if it fails -func UnmarshalSendReport(b []byte) (*SendReport, error) { - sr := &SendReport{} - return sr, sr.Unmarshal(b) -} - -// 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 -// Threads Started: -// - Network Follower (/network/follow.go) -// 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 -// - Message Retrieval Worker Group (/network/rounds/retrieve.go) -// 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 -// - 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 -// - Critical Messages (/network/message/critical.go) -// Ensures all protocol layer mandatory messages are sent -// Uses a message store on disk for persistence -// - KeyExchange Trigger (/keyExchange/trigger.go) -// Responds to sent rekeys and executes them -// - KeyExchange Confirm (/keyExchange/confirm.go) -// Responds to confirmations of successful rekey operations -func (c *Client) StartNetworkFollower(timeoutMS int) error { - timeout := time.Duration(timeoutMS) * time.Millisecond - return c.api.StartNetworkFollower(timeout) -} - -// RegisterClientErrorCallback registers the callback to handle errors from the -// long running threads controlled by StartNetworkFollower and StopNetworkFollower -func (c *Client) RegisterClientErrorCallback(clientError ClientError) { - errChan := c.api.GetErrorsChannel() - go func() { - for report := range errChan { - go clientError.Report(report.Source, report.Message, report.Trace) - } - }() -} - -// StopNetworkFollower stops the network follower if it is running. -// It returns errors if the Follower is in the wrong status 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 *Client) StopNetworkFollower() error { - if err := c.api.StopNetworkFollower(); err != nil { - return errors.New(fmt.Sprintf("Failed to stop the "+ - "network follower: %+v", err)) - } - return nil -} - -// WaitForNewtwork will block until either the network is healthy or the -// passed timeout. It will return true if the network is healthy -func (c *Client) WaitForNetwork(timeoutMS int) bool { - start := netTime.Now() - timeout := time.Duration(timeoutMS) * time.Millisecond - for netTime.Since(start) < timeout { - if c.api.GetHealth().IsHealthy() { - return true - } - time.Sleep(250 * time.Millisecond) - } - return false -} - -// Gets the state of the network follower. Returns: -// Stopped - 0 -// Starting - 1000 -// Running - 2000 -// Stopping - 3000 -func (c *Client) NetworkFollowerStatus() int { - return int(c.api.NetworkFollowerStatus()) -} - -// HasRunningProcessies checks if any background threads are running. -// returns true if none are running. This is meant to be -// used when NetworkFollowerStatus() returns Stopping. -// Due to the handling of comms on iOS, where the OS can -// block indefiently, it may not enter the stopped -// state apropreatly. This can be used instead. -func (c *Client) HasRunningProcessies() bool { - return c.api.HasRunningProcessies() + return clientTrackerSingleton.make(client), nil } -// returns true if the network is read to be in a healthy state where -// messages can be sent -func (c *Client) IsNetworkHealthy() bool { - return c.api.GetHealth().IsHealthy() +func (c *Client) GetID() int { + return c.id } -// RegisterNetworkHealthCB 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 *Client) RegisterNetworkHealthCB(nhc NetworkHealthCallback) int64 { - return int64(c.api.GetHealth().AddFunc(nhc.Callback)) -} - -func (c *Client) UnregisterNetworkHealthCB(funcID int64) { - c.api.GetHealth().RemoveFunc(uint64(funcID)) -} - -// RegisterListener records and installs a listener for messages -// matching specific uid, msgType, and/or username -// Returns a ListenerUnregister interface which can be -// -// to register for any userID, pass in an id with length 0 or an id with -// all zeroes -// -// to register for any message type, pass in a message type of 0 -// -// Message Types can be found in client/interfaces/message/type.go -// Make sure to not conflict with ANY default message types -func (c *Client) RegisterListener(uid []byte, msgType int, - listener Listener) (*Unregister, error) { - jww.INFO.Printf("RegisterListener(%v, %d)", uid, - msgType) - - name := listener.Name() - var u *id.ID - if len(uid) == 0 { - u = &id.ID{} - } else { - var err error - u, err = id.Unmarshal(uid) - if err != nil { - return nil, errors.New(fmt.Sprintf("Failed to "+ - "ResgisterListener: %+v", err)) - } - } - - mt := message.Type(msgType) - - f := func(item message.Receive) { - listener.Hear(&Message{r: item}) - } - - lid := c.api.GetSwitchboard().RegisterFunc(name, u, mt, f) - - return newListenerUnregister(lid, c.api.GetSwitchboard()), nil -} - -// RegisterRoundEventsHandler registers a callback interface for round -// events. -// The rid is the round the event attaches to -// The timeoutMS is the number of milliseconds until the event fails, and the -// validStates are a list of states (one per byte) on which the event gets -// triggered -// States: -// 0x00 - PENDING (Never seen by client) -// 0x01 - PRECOMPUTING -// 0x02 - STANDBY -// 0x03 - QUEUED -// 0x04 - REALTIME -// 0x05 - COMPLETED -// 0x06 - FAILED -// These states are defined in elixxir/primitives/states/state.go -func (c *Client) RegisterRoundEventsHandler(rid int, cb RoundEventCallback, - timeoutMS int, il *IntList) *Unregister { - - rcb := func(ri *mixmessages.RoundInfo, timedOut bool) { - cb.EventCallback(int(ri.ID), int(ri.State), timedOut) - } - timeout := time.Duration(timeoutMS) * time.Millisecond - - vStates := make([]states.Round, len(il.lst)) - for i, s := range il.lst { - vStates[i] = states.Round(s) - } - - roundID := id.Round(rid) - - ec := c.api.GetRoundEvents().AddRoundEvent(roundID, rcb, timeout) - - return newRoundUnregister(roundID, ec, c.api.GetRoundEvents()) -} - -// WaitForRoundCompletion allows the caller to get notified if a round -// has completed (or failed). Under the hood, this uses an API which uses the internal -// round data, network historical round lookup, and waiting on network events -// to determine what has (or will) occur. -// -// The callbacks will return at timeoutMS if no state update occurs -func (c *Client) WaitForRoundCompletion(roundID int, - rec RoundCompletionCallback, timeoutMS int) error { - - f := func(allRoundsSucceeded, timedOut bool, rounds map[id.Round]cmix.RoundLookupStatus) { - rec.EventCallback(roundID, allRoundsSucceeded, timedOut) - } - - timeout := time.Duration(timeoutMS) * time.Millisecond - - return c.api.GetRoundResults([]id.Round{id.Round(roundID)}, timeout, f) -} - -// WaitForMessageDelivery allows the caller to get notified if the rounds a -// message was sent in successfully completed. Under the hood, this uses an API -// which uses the internal round data, network historical round lookup, and -// waiting on network events to determine what has (or will) occur. -// -// The callbacks will return at timeoutMS if no state update occurs -// -// This function takes the marshaled send report to ensure a memory leak does -// not occur as a result of both sides of the bindings holding a reference to -// the same pointer. -func (c *Client) WaitForMessageDelivery(marshaledSendReport []byte, - mdc MessageDeliveryCallback, timeoutMS int) error { - jww.INFO.Printf("WaitForMessageDelivery(%v, _, %v)", - marshaledSendReport, timeoutMS) - sr, err := UnmarshalSendReport(marshaledSendReport) - if err != nil { - return errors.New(fmt.Sprintf("Failed to "+ - "WaitForMessageDelivery callback due to bad Send Report: %+v", err)) - } - - if sr == nil || sr.rl == nil || len(sr.rl.list) == 0 { - return errors.New(fmt.Sprintf("Failed to "+ - "WaitForMessageDelivery callback due to invalid Send Report "+ - "unmarshal: %s", string(marshaledSendReport))) - } - - f := func(allRoundsSucceeded, timedOut bool, rounds map[id.Round]cmix.RoundLookupStatus) { - results := make([]byte, len(sr.rl.list)) - jww.INFO.Printf("Processing WaitForMessageDelivery report "+ - "for %v, success: %v, timedout: %v", sr.mid, allRoundsSucceeded, - timedOut) - for i, r := range sr.rl.list { - if result, exists := rounds[r]; exists { - results[i] = byte(result) - } - } - - mdc.EventCallback(sr.mid.Marshal(), allRoundsSucceeded, timedOut, results) - } - - timeout := time.Duration(timeoutMS) * time.Millisecond - - err = c.api.GetRoundResults(sr.rl.list, timeout, f) - - return err -} - -// Returns a user object from which all information about the current user -// can be gleaned -func (c *Client) GetUser() *User { - u := c.api.GetUser() - return &User{u: &u} -} - -// GetNodeRegistrationStatus returns a struct with the number of nodes the -// client is registered with and the number total. -func (c *Client) GetNodeRegistrationStatus() (*NodeRegistrationsStatus, error) { - registered, total, err := c.api.GetNodeRegistrationStatus() - - return &NodeRegistrationsStatus{registered, total}, err -} - -// DeleteRequest will delete a request, agnostic of request type -// for the given partner ID. If no request exists for this -// partner ID an error will be returned. -func (c *Client) DeleteRequest(requesterUserId []byte) error { - requesterId, err := id.Unmarshal(requesterUserId) - if err != nil { - return err - } - - jww.DEBUG.Printf("Deleting request for partner ID: %s", requesterId) - return c.api.DeleteRequest(requesterId) -} - -// DeleteAllRequests clears all requests from Client's auth storage. -func (c *Client) DeleteAllRequests() error { - return c.api.DeleteAllRequests() -} - -// DeleteSentRequests clears sent requests from Client's auth storage. -func (c *Client) DeleteSentRequests() error { - return c.api.DeleteSentRequests() -} - -// DeleteReceiveRequests clears receive requests from Client's auth storage. -func (c *Client) DeleteReceiveRequests() error { - return c.api.DeleteReceiveRequests() -} - -// DeleteContact is a function which removes a contact from Client's storage -func (c *Client) DeleteContact(b []byte) error { - contactObj, err := UnmarshalContact(b) - if err != nil { - return err - } - return c.api.DeleteContact(contactObj.c.ID) -} - -// SetProxiedBins updates the host pool filter that filters out gateways that -// are not in one of the specified bins. The provided bins should be CSV. -func (c *Client) SetProxiedBins(binStringsCSV string) error { - // Convert CSV to slice of strings - all, err := csv.NewReader(strings.NewReader(binStringsCSV)).ReadAll() - if err != nil { - return err - } - - binStrings := make([]string, 0, len(all[0])) - for _, a := range all { - binStrings = append(binStrings, a...) - } - - return c.api.SetProxiedBins(binStrings) -} - -// GetPreferredBins returns the geographic bin or bins that the provided two -// character country code is a part of. The bins are returned as CSV. -func (c *Client) GetPreferredBins(countryCode string) (string, error) { - bins, err := c.api.GetPreferredBins(countryCode) - if err != nil { - return "", err - } - - // Convert the slice of bins to CSV - buff := bytes.NewBuffer(nil) - csvWriter := csv.NewWriter(buff) - err = csvWriter.Write(bins) - if err != nil { - return "", err - } - csvWriter.Flush() - - return buff.String(), nil -} - -// GetRateLimitParams retrieves the rate limiting parameters. -func (c *Client) GetRateLimitParams() (uint32, uint32, int64) { - return c.api.GetRateLimitParams() -} - -/* -// SearchWithHandler is a non-blocking search that also registers -// a callback interface for user disovery events. -func (c *Client) SearchWithHandler(data, separator string, - searchTypes []byte, hdlr UserDiscoveryHandler) { -} - - -// RegisterAuthEventsHandler registers a callback interface for channel -// authentication events. -func (b *BindingsClient) RegisterAuthEventsHandler(hdlr AuthEventHandler) { -} - -// Search accepts a "separator" separated list of search elements with -// an associated list of searchTypes. It returns a ContactList which -// allows you to iterate over the found contact objects. -func (b *BindingsClient) Search(data, separator string, - searchTypes []byte) ContactList { - return nil -}*/ - -// getSingle is a function which returns the single mananger if it -// exists or creates a new one, checking appropriate constraints -// (that the network follower is running) if it needs to make one -func (c *Client) getSingle() (*old.Manager, error) { - c.singleMux.Lock() - defer c.singleMux.Unlock() - if c.single == nil { - apiClient := &c.api - c.single = old.NewManager(apiClient) - err := apiClient.AddService(c.single.StartProcesses) - if err != nil { - return nil, err - } - } - - return c.single, nil -} - -// GetInternalClient returns a reference to the client api. This is for internal -// use only and should not be called by bindings clients. -func (c *Client) GetInternalClient() api.Client { - return c.api -} - -func WrapAPIClient(c *api.Client) *Client { - return &Client{api: *c} -} - -// DumpStack returns a string with the stack trace of every running thread. -func DumpStack() (string, error) { - buf := new(bytes.Buffer) - err := pprof.Lookup("goroutine").WriteTo(buf, 2) - if err != nil { - return "", err - } - return buf.String(), nil -} diff --git a/bindings/clientTracker.go b/bindings/clientTracker.go new file mode 100644 index 0000000000000000000000000000000000000000..a93bfc62a1e5b8fc35672ab2ff55701278012cc9 --- /dev/null +++ b/bindings/clientTracker.go @@ -0,0 +1,54 @@ +package bindings + +import ( + "github.com/pkg/errors" + "gitlab.com/elixxir/client/api" + "sync" +) + +// clientTracker is a singleton used to keep track of extant clients, allowing +// for race condition free passing over the bindings + +type clientTracker struct { + clients map[int]*Client + count int + mux sync.RWMutex +} + +// make makes a client from an API client, assigning it a unique ID +func (ct *clientTracker) make(c *api.Client) *Client { + ct.mux.Lock() + defer ct.mux.Unlock() + + id := ct.count + ct.count++ + + ct.clients[id] = &Client{ + api: c, + id: id, + } + + return ct.clients[id] +} + +//get returns a client given its ID +func (ct *clientTracker) get(id int) (*Client, 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 +} + +//deletes a client if it exists +func (ct *clientTracker) delete(id int) { + ct.mux.Lock() + defer ct.mux.Unlock() + + delete(ct.clients, id) +} diff --git a/bindings/connect.go b/bindings/connect.go new file mode 100644 index 0000000000000000000000000000000000000000..b7d1bcb181c94b96aee86c3a997a52499e95492d --- /dev/null +++ b/bindings/connect.go @@ -0,0 +1,102 @@ +package bindings + +import ( + "encoding/json" + "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/connect" + e2e2 "gitlab.com/elixxir/client/e2e" + "gitlab.com/elixxir/crypto/contact" +) + +// connectionTrackerSingleton is used to track connections so they can be +// referenced by id back over the bindings +var connectionTrackerSingleton = &connectionTracker{ + connections: make(map[int]*Connection), + count: 0, +} + +// Connection is the bindings representation of a connect.Connection object that can be tracked by id +type Connection struct { + connection connect.Connection + id int +} + +// GetId returns the Connection.id +func (c *Connection) GetId() int { + return c.id +} + +// 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. +// recipientContact - marshalled contact.Contact object +// myIdentity - marshalled Identity object +func (c *Client) Connect(recipientContact []byte, myIdentity []byte) ( + *Connection, error) { + cont, err := contact.Unmarshal(recipientContact) + if err != nil { + return nil, err + } + myID, _, _, myDHPriv, err := c.unmarshalIdentity(myIdentity) + if err != nil { + return nil, err + } + + connection, err := connect.Connect(cont, myID, myDHPriv, c.api.GetRng(), + c.api.GetStorage().GetE2EGroup(), c.api.GetCmix(), connect.GetDefaultParams()) + + if err != nil { + return nil, err + } + + return connectionTrackerSingleton.make(connection), nil +} + +// E2ESendReport is the bindings representation of the return values of SendE2E +// Example E2ESendReport: +// {"Rounds":[1,5,9], +// "MessageID":"51Yy47uZbP0o2Y9B/kkreDLTB6opUol3M3mYiY2dcdQ=", +// "Timestamp":1653582683183384000} +type E2ESendReport struct { + RoundsList + MessageID []byte + Timestamp int64 +} + +// 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()) + + if err != nil { + return nil, err + } + + sr := E2ESendReport{ + MessageID: mid.Marshal(), + Timestamp: ts.UnixNano(), + } + + sr.RoundsList = makeRoundsList(rounds) + + return json.Marshal(&sr) +} + +// Close deletes this Connection's partner.Manager and releases resources +func (c *Connection) Close() { + c.Close() +} + +// GetPartner returns the partner.Manager for this Connection +func (c *Connection) GetPartner() []byte { + return c.connection.GetPartner().PartnerId().Marshal() +} + +// RegisterListener is used for E2E reception +// and allows for reading data sent from the partner.Manager +// Returns marshalled ListenerID +func (c *Connection) RegisterListener(messageType int, newListener Listener) { + _ = c.connection.RegisterListener(catalog.MessageType(messageType), listener{l: newListener}) +} diff --git a/bindings/connect_test.go b/bindings/connect_test.go new file mode 100644 index 0000000000000000000000000000000000000000..9093dd3adff088bf82e7df4f9f28661a35b9a75d --- /dev/null +++ b/bindings/connect_test.go @@ -0,0 +1,37 @@ +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" +) + +func TestE2ESendReport_JSON(t *testing.T) { + rng := csprng.NewSystemRNG() + mid := e2e.MessageID{} + rng.Read(mid[:]) + origRL := []id.Round{1, 5, 9} + rl := makeRoundsList(origRL) + mrl, _ := json.Marshal(&rl) + sr := E2ESendReport{ + RoundsList: rl, + MessageID: mid[:], + Timestamp: time.Now().UnixNano(), + } + srm, _ := json.Marshal(&sr) + t.Log("Marshalled RoundsList") + t.Log(string(mrl)) + t.Log("Marshalled E2ESendReport") + t.Log(string(srm)) + unmarshalled, err := unmarshalRoundsList(srm) + if err != nil { + t.Errorf("Failed to unmarshal rounds list from e2esendreport: %+v", err) + } + if !reflect.DeepEqual(unmarshalled, origRL) { + t.Errorf("Did not receive expected rounds list\n\tExpected: %+v\n\tReceived: %+v\n", rl.Rounds, unmarshalled) + } +} diff --git a/bindings/connectionTracker.go b/bindings/connectionTracker.go new file mode 100644 index 0000000000000000000000000000000000000000..0352c3285acee4b64b0bc951898ba3f4991e6d04 --- /dev/null +++ b/bindings/connectionTracker.go @@ -0,0 +1,54 @@ +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/contact.go b/bindings/contact.go index c02aa2cbfd8b276aa399ee1f7059b0564b7929ba..cf5647bd1b5a93ec31390d1b9cce2b28719cc907 100644 --- a/bindings/contact.go +++ b/bindings/contact.go @@ -1,80 +1,174 @@ -/////////////////////////////////////////////////////////////////////////////// -// 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/api" "gitlab.com/elixxir/crypto/contact" + "gitlab.com/elixxir/crypto/cyclic" "gitlab.com/elixxir/primitives/fact" + "gitlab.com/xx_network/crypto/signature/rsa" + "gitlab.com/xx_network/primitives/id" ) -/* fact object*/ -//creates a new fact. The factType must be either: -// 0 - Username -// 1 - Email -// 2 - Phone Number -// The fact must be well formed for the type and must not include commas or -// semicolons. If it is not well formed, it will be rejected. Phone numbers -// must have the two letter country codes appended. For the complete set of -// validation, see /elixxir/primitives/fact/fact.go -func NewFact(factType int, factStr string) (*Fact, error) { - f, err := fact.NewFact(fact.FactType(factType), factStr) +// Identity struct +// Example marshalled Identity: +// {"ID":"emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD", // User ID (base64) +// // RSA Private key (PEM format) +// "RSAPrivatePem":"LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBNU15dTdhYjBJOS9UL1BFUUxtd2x3ejZHV3FjMUNYemVIVXhoVEc4bmg1WWRWSXMxCmJ2THpBVjNOMDJxdXN6K2s4TVFEWjBtejMzdkswUmhPczZIY0NUSFdzTEpXRkE5WWpzWWlCRi9qTDd1bmd1ckIKL2tvK1JJSnNrWGFWaEZaazRGdERoRXhTNWY4RnR0Qmk1NmNLZmdJQlVKT3ozZi9qQllTMkxzMlJ6cWV5YXM3SApjV2RaME9TclBTT3BiYlViU1FPbS9LWnlweGZHU21yZ2oxRUZuU1dZZ2xGZTdUOTRPbHF5MG14QTV5clVXbHorCk9sK3hHbXpCNUp4WUFSMU9oMFQrQTk4RWMrTUZHNm43L1MraDdzRDgybGRnVnJmbStFTzRCdmFKeTRESGZGMWgKNnp6QnVnY25NUVFGc0dLeDFYWC9COTVMdUpPVjdyeXlDbzZGbHdJREFRQUJBb0lCQVFDaUh6OGNlcDZvQk9RTAphUzBVRitHeU5VMnlVcVRNTWtTWThoUkh1c09CMmFheXoybHZVb3RLUHBPbjZRSWRWVTJrcE4vY2dtY0lSb2x5CkhBMDRUOHJBWVNaRlVqaVlRajkzKzRFREpJYXd2Z0YyVEs1bFoyb3oxVTdreStncU82V0RMR2Z0Q0wvODVQWEIKa210aXhnUXpRV3g1RWcvemtHdm03eURBalQxeDloNytsRjJwNFlBam5kT2xTS0dmQjFZeTR1RXBQd0kwc1lWdgpKQWc0MEFxbllZUmt4emJPbmQxWGNjdEJFN2Z1VDdrWXhoeSs3WXYrUTJwVy9BYmh6NGlHOEY1MW9GMGZwV0czCmlISDhsVXZFTkp2SUZEVHZ0UEpESlFZalBRN3lUbGlGZUdrMXZUQkcyQkpQNExzVzhpbDZOeUFuRktaY1hOQ24KeHVCendiSlJBb0dCQVBUK0dGTVJGRHRHZVl6NmwzZmg3UjJ0MlhrMysvUmpvR3BDUWREWDhYNERqR1pVd1RGVQpOS2tQTTNjS29ia2RBYlBDb3FpL0tOOVBibk9QVlZ3R3JkSE9vSnNibFVHYmJGamFTUzJQMFZnNUVhTC9rT2dUCmxMMUdoVFpIUWk1VUlMM0p4M1Z3T0ZRQ3RQOU1UQlQ0UEQvcEFLbDg3VTJXN3JTY1dGV1ZGbFNkQW9HQkFPOFUKVmhHWkRpVGFKTWVtSGZIdVYrNmtzaUlsam9aUVVzeGpmTGNMZ2NjV2RmTHBqS0ZWTzJNN3NqcEJEZ0w4NmFnegorVk14ZkQzZ1l0SmNWN01aMVcwNlZ6TlNVTHh3a1dRY1hXUWdDaXc5elpyYlhCUmZRNUVjMFBlblVoWWVwVzF5CkpkTC8rSlpQeDJxSzVrQytiWU5EdmxlNWdpcjlDSGVzTlR5enVyckRBb0dCQUl0cTJnN1RaazhCSVFUUVNrZ24Kb3BkRUtzRW4wZExXcXlBdENtVTlyaWpHL2l2eHlXczMveXZDQWNpWm5VVEp0QUZISHVlbXVTeXplQ2g5QmRkegoyWkRPNUdqQVBxVHlQS3NudFlNZkY4UDczZ1NES1VSWWVFbHFDejdET0c5QzRzcitPK3FoN1B3cCtqUmFoK1ZiCkNuWllNMDlBVDQ3YStJYUJmbWRkaXpLbEFvR0JBSmo1dkRDNmJIQnNISWlhNUNJL1RZaG5YWXUzMkVCYytQM0sKMHF3VThzOCtzZTNpUHBla2Y4RjVHd3RuUU4zc2tsMk1GQWFGYldmeVFZazBpUEVTb0p1cGJzNXA1enNNRkJ1bwpncUZrVnQ0RUZhRDJweTVwM2tQbDJsZjhlZXVwWkZScGE0WmRQdVIrMjZ4eWYrNEJhdlZJeld3NFNPL1V4Q3crCnhqbTNEczRkQW9HQWREL0VOa1BjU004c1BCM3JSWW9MQ2twcUV2U0MzbVZSbjNJd3c1WFAwcDRRVndhRmR1ckMKYUhtSE1EekNrNEUvb0haQVhFdGZ2S2tRaUI4MXVYM2c1aVo4amdYUVhXUHRteTVIcVVhcWJYUTlENkxWc3B0egpKL3R4SWJLMXp5c1o2bk9IY1VoUUwyVVF6SlBBRThZNDdjYzVzTThEN3kwZjJ0QURTQUZNMmN3PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQ==", +// // Salt for identity (base64) +// "Salt":"4kk02v0NIcGtlobZ/xkxqWz8uH/ams/gjvQm14QT0dI=", +// // DH Private key +// "DHKeyPrivate":"eyJWYWx1ZSI6NDU2MDgzOTEzMjA0OTIyODA5Njg2MDI3MzQ0MzM3OTA0MzAyODYwMjM2NDk2NDM5NDI4NTcxMTMwNDMzOTQwMzgyMTIyMjY4OTQzNTMyMjIyMzc1MTkzNTEzMjU4MjA4MDA0NTczMDY4MjEwNzg2NDI5NjA1MjA0OTA3MjI2ODI5OTc3NTczMDkxODY0NTY3NDExMDExNjQxNCwiRmluZ2VycHJpbnQiOjE2ODAxNTQxNTExMjMzMDk4MzYzfQ==" +// } +type Identity struct { + ID []byte + RSAPrivatePem []byte + Salt []byte + DHKeyPrivate []byte +} + +// MakeIdentity generates a new cryptographic identity for receiving messages +func (c *Client) MakeIdentity() ([]byte, error) { + s := c.api.GetRng().GetStream() + defer s.Close() + ident, err := api.MakeIdentity(s, c.api.GetStorage().GetE2EGroup()) + + dhPrivJson, err := ident.DHKeyPrivate.MarshalJSON() if err != nil { return nil, err } - return &Fact{f: &f}, nil -} + //create the identity object + I := Identity{ + ID: ident.ID.Marshal(), + RSAPrivatePem: rsa.CreatePrivateKeyPem(ident.RSAPrivatePem), + Salt: ident.Salt, + DHKeyPrivate: dhPrivJson, + } -type Fact struct { - f *fact.Fact + return json.Marshal(&I) } -func (f *Fact) Get() string { - return f.f.Fact -} +// GetContactFromIdentity accepts a marshalled Identity object and returns a marshalled contact.Contact object +func (c *Client) GetContactFromIdentity(identity []byte) ([]byte, error) { + uID, _, _, dhKey, err := c.unmarshalIdentity(identity) + if err != nil { + return nil, err + } -func (f *Fact) Type() int { - return int(f.f.T) -} + grp := c.api.GetStorage().GetE2EGroup() -func (f *Fact) Stringify() string { - return f.f.Stringify() -} + dhPub := grp.ExpG(dhKey, grp.NewInt(1)) + + ct := contact.Contact{ + ID: uID, + DhPubKey: dhPub, + OwnershipProof: nil, + Facts: nil, + } -/* contact object*/ -type Contact struct { - c *contact.Contact + return ct.Marshal(), nil } -// GetID returns the user ID for this user. -func (c *Contact) GetID() []byte { - return c.c.ID.Bytes() +func (c *Client) unmarshalIdentity(marshaled []byte) (*id.ID, *rsa.PrivateKey, []byte, + *cyclic.Int, error) { + I := Identity{} + err := json.Unmarshal(marshaled, &I) + if err != nil { + return nil, nil, nil, nil, err + } + + uID, err := id.Unmarshal(I.ID) + if err != nil { + return nil, nil, nil, nil, err + } + + dhkey := c.api.GetStorage().GetE2EGroup().NewInt(1) + err = dhkey.UnmarshalJSON([]byte(I.DHKeyPrivate)) + if err != nil { + return nil, nil, nil, nil, err + } + + rsaPriv, err := rsa.LoadPrivateKeyFromPem([]byte(I.RSAPrivatePem)) + if err != nil { + return nil, nil, nil, nil, err + } + + return uID, rsaPriv, I.Salt, dhkey, nil } -// GetDHPublicKey returns the public key associated with the Contact. -func (c *Contact) GetDHPublicKey() []byte { - return c.c.DhPubKey.Bytes() +// GetIDFromContact accepts a marshalled contact.Contact object & returns a marshalled id.ID object +func GetIDFromContact(marshaled []byte) ([]byte, error) { + cnt, err := contact.Unmarshal(marshaled) + if err != nil { + return nil, err + } + + return cnt.ID.Marshal(), nil } -// GetDHPublicKey returns hash of a DH proof of key ownership. -func (c *Contact) GetOwnershipProof() []byte { - return c.c.OwnershipProof +// GetPubkeyFromContact accepts a marshalled contact.Contact object & returns a json marshalled large.Int DhPubKey +func GetPubkeyFromContact(marshaled []byte) ([]byte, error) { + cnt, err := contact.Unmarshal(marshaled) + if err != nil { + return nil, err + } + + return json.Marshal(cnt.DhPubKey) } -// Returns a fact list for adding and getting facts to and from the contact -func (c *Contact) GetFactList() *FactList { - return &FactList{c: c.c} +// Fact is an internal fact type for use in the bindings layer +// example marshalled Fact: +// {"Fact":"Zezima","Type":0} +type Fact struct { + Fact string + Type int } -func (c *Contact) Marshal() ([]byte, error) { - return c.c.Marshal(), nil +// SetFactsOnContact replaces the facts on the contact with the passed in facts +// pass in empty facts in order to clear the facts +// Accepts a marshalled contact.Contact object & a marshalled list of Fact objects +func SetFactsOnContact(marshaled []byte, facts []byte) ([]byte, error) { + cnt, err := contact.Unmarshal(marshaled) + if err != nil { + return nil, err + } + + factsList := make([]Fact, 0) + err = json.Unmarshal(facts, &factsList) + if err != nil { + return nil, err + } + + realFactList := make(fact.FactList, 0, len(factsList)) + for i := range factsList { + realFactList = append(realFactList, fact.Fact{ + Fact: factsList[i].Fact, + T: fact.FactType(factsList[i].Type), + }) + } + + cnt.Facts = realFactList + return cnt.Marshal(), nil } -// GetAPIContact returns the api contact object. Not exported to bindings. -func (c *Contact) GetAPIContact() *contact.Contact { - return c.c +// GetFactsFromContact accepts a marshalled contact.Contact object, returning its marshalled list of Fact objects +func GetFactsFromContact(marshaled []byte) ([]byte, error) { + cnt, err := contact.Unmarshal(marshaled) + if err != nil { + return nil, err + } + + factsList := make([]Fact, len(cnt.Facts)) + for i := range cnt.Facts { + factsList = append(factsList, Fact{ + Fact: cnt.Facts[i].Fact, + Type: int(cnt.Facts[i].T), + }) + } + + factsListMarshaled, err := json.Marshal(&factsList) + if err != nil { + return nil, err + } + return factsListMarshaled, nil } diff --git a/bindings/contact_test.go b/bindings/contact_test.go new file mode 100644 index 0000000000000000000000000000000000000000..adbf4d9c2a5d3c48e899ee5ba7f4123f44890034 --- /dev/null +++ b/bindings/contact_test.go @@ -0,0 +1,68 @@ +package bindings + +import ( + "encoding/json" + "gitlab.com/elixxir/crypto/cmix" + "gitlab.com/elixxir/crypto/cyclic" + dh "gitlab.com/elixxir/crypto/diffieHellman" + "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" + "testing" +) + +func TestIdentity_JSON(t *testing.T) { + rng := csprng.NewSystemRNG() + uid := id.NewIdFromString("zezima", id.User, t) + salt := cmix.NewSalt(rng, 32) + pk, _ := rsa.GenerateKey(rng, 2048) + grp := getGroup() + dhpk := dh.GeneratePrivateKey(64, grp, rng) + dhpkJson, _ := dhpk.MarshalJSON() + op := make([]byte, 64) + _, _ = rng.Read(op) + identity := Identity{ + ID: uid.Marshal(), + RSAPrivatePem: rsa.CreatePrivateKeyPem(pk), + Salt: salt, + DHKeyPrivate: dhpkJson, + } + im, _ := json.Marshal(identity) + t.Log("Marshalled Identity object") + t.Log(string(im)) +} + +func TestFacts_JSON(t *testing.T) { + fl := []Fact{ + { + Fact: "Zezima", + Type: 0, + }, + { + Fact: "Zezima@osrs.org", + Type: 2, + }, + } + flm, _ := json.Marshal(fl) + t.Log("Marshalled []Fact") + t.Log(string(flm)) +} + +func getGroup() *cyclic.Group { + return cyclic.NewGroup( + large.NewIntFromString("E2EE983D031DC1DB6F1A7A67DF0E9A8E5561DB8E8D4941"+ + "3394C049B7A8ACCEDC298708F121951D9CF920EC5D146727AA4AE535B0922C688"+ + "B55B3DD2AEDF6C01C94764DAB937935AA83BE36E67760713AB44A6337C20E7861"+ + "575E745D31F8B9E9AD8412118C62A3E2E29DF46B0864D0C951C394A5CBBDC6ADC"+ + "718DD2A3E041023DBB5AB23EBB4742DE9C1687B5B34FA48C3521632C4A530E8FF"+ + "B1BC51DADDF453B0B2717C2BC6669ED76B4BDD5C9FF558E88F26E5785302BEDBC"+ + "A23EAC5ACE92096EE8A60642FB61E8F3D24990B8CB12EE448EEF78E184C7242DD"+ + "161C7738F32BF29A841698978825B4111B4BC3E1E198455095958333D776D8B2B"+ + "EEED3A1A1A221A6E37E664A64B83981C46FFDDC1A45E3D5211AAF8BFBC072768C"+ + "4F50D7D7803D2D4F278DE8014A47323631D7E064DE81C0C6BFA43EF0E6998860F"+ + "1390B5D3FEACAF1696015CB79C3F9C2D93D961120CD0E5F12CBB687EAB045241F"+ + "96789C38E89D796138E6319BE62E35D87B1048CA28BE389B575E994DCA7554715"+ + "84A09EC723742DC35873847AEF49F66E43873", 16), + large.NewIntFromString("2", 16)) +} diff --git a/bindings/delivery.go b/bindings/delivery.go new file mode 100644 index 0000000000000000000000000000000000000000..57fcbfa4d34ede1307cb628691ca5fde4210bd47 --- /dev/null +++ b/bindings/delivery.go @@ -0,0 +1,103 @@ +package bindings + +import ( + "encoding/json" + "fmt" + "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: +// [1001,1003,1006] +type RoundsList struct { + Rounds []int +} + +func (rl RoundsList) Marshal() ([]byte, error) { + return json.Marshal(&rl) +} + +// unmarshalRoundsList accepts a marshalled E2ESendReport object & unmarshalls it into a RoundsList object, returning a list of id.Round +func unmarshalRoundsList(marshaled []byte) ([]id.Round, error) { + sr := RoundsList{} + err := json.Unmarshal(marshaled, &sr) + if err != nil { + return nil, err + } + + realRl := make([]id.Round, len(sr.Rounds)) + + for i, rid := range sr.Rounds { + realRl[i] = id.Round(rid) + } + + return realRl, nil + +} + +func makeRoundsList(rounds []id.Round) RoundsList { + rl := RoundsList{} + for _, rid := range rounds { + rl.Rounds = append(rl.Rounds, int(rid)) + } + return rl +} + +// MessageDeliveryCallback gets called on the determination if all events +// related to a message send were successful. +// If delivered == true, timedOut == false && roundResults != nil +// If delivered == false, roundResults == nil +// If timedOut == true, delivered == false && roundResults == nil +type MessageDeliveryCallback interface { + EventCallback(delivered, timedOut bool, roundResults []byte) +} + +// WaitForMessageDelivery allows the caller to get notified if the rounds a +// message was sent in successfully completed. Under the hood, this uses an API +// which uses the internal round data, network historical round lookup, and +// waiting on network events to determine what has (or will) occur. +// +// The callbacks will return at timeoutMS if no state update occurs +// +// This function takes the marshaled send report to ensure a memory leak does +// not occur as a result of both sides of the bindings holding a reference to +// the same pointer. +func (c *Client) WaitForMessageDelivery(roundList []byte, + mdc MessageDeliveryCallback, timeoutMS int) error { + jww.INFO.Printf("WaitForMessageDelivery(%v, _, %v)", + roundList, timeoutMS) + rl, err := unmarshalRoundsList(roundList) + if err != nil { + return errors.New(fmt.Sprintf("Failed to "+ + "WaitForMessageDelivery callback due to bad Send Report: %+v", err)) + } + + if rl == nil || len(rl) == 0 { + return errors.New(fmt.Sprintf("Failed to "+ + "WaitForMessageDelivery callback due to invalid Send Report "+ + "unmarshal: %s", string(roundList))) + } + + f := func(allRoundsSucceeded, timedOut bool, rounds map[id.Round]cmix.RoundResult) { + results := make([]byte, len(rl)) + jww.INFO.Printf("Processing WaitForMessageDelivery report "+ + "success: %v, timedout: %v", allRoundsSucceeded, + timedOut) + for i, r := range rl { + if result, exists := rounds[r]; exists { + results[i] = byte(result.Status) + } + } + + mdc.EventCallback(allRoundsSucceeded, timedOut, results) + } + + timeout := time.Duration(timeoutMS) * time.Millisecond + + err = c.api.GetCmix().GetRoundResults(timeout, f, rl...) + + return err +} diff --git a/bindings/dummy.go b/bindings/dummy.go deleted file mode 100644 index d6facc68e00687b9a951ce7793b62102b155d3f6..0000000000000000000000000000000000000000 --- a/bindings/dummy.go +++ /dev/null @@ -1,60 +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 bindings - -import ( - "gitlab.com/elixxir/client/dummy" - "time" -) - -// DummyTraffic contains the file dummy traffic manager. The manager can be used -// to set and get the status of the send thread. -type DummyTraffic struct { - m *dummy.Manager -} - -// NewDummyTrafficManager creates a DummyTraffic manager and initialises the -// dummy traffic send thread. Note that the manager does not start sending dummy -// traffic until its status is set to true using DummyTraffic.SetStatus. -// The maxNumMessages is the upper bound of the random number of messages sent -// each send. avgSendDeltaMS is the average duration, in milliseconds, to wait -// between sends. Sends occur every avgSendDeltaMS +/- a random duration with an -// upper bound of randomRangeMS. -func NewDummyTrafficManager(client *Client, maxNumMessages, avgSendDeltaMS, - randomRangeMS int) (*DummyTraffic, error) { - - avgSendDelta := time.Duration(avgSendDeltaMS) * time.Millisecond - randomRange := time.Duration(randomRangeMS) * time.Millisecond - - m := dummy.NewManager( - maxNumMessages, avgSendDelta, randomRange, &client.api) - - return &DummyTraffic{m}, client.api.AddService(m.StartDummyTraffic) -} - -// SetStatus sets the state of the dummy traffic send thread, which determines -// if the thread is running or paused. The possible statuses are: -// true = send thread is sending dummy messages -// false = send thread is paused/stopped and not sending dummy messages -// Returns an error if the channel is full. -// Note that this function cannot change the status of the send thread if it has -// yet to be started or stopped. -func (dt *DummyTraffic) SetStatus(status bool) error { - return dt.m.SetStatus(status) -} - -// GetStatus returns the current state of the dummy traffic send thread. It has -// the following return values: -// true = send thread is sending dummy messages -// false = send thread is paused/stopped and not sending dummy messages -// Note that this function does not return the status set by SetStatus directly; -// it returns the current status of the send thread, which means any call to -// SetStatus will have a small delay before it is returned by GetStatus. -func (dt *DummyTraffic) GetStatus() bool { - return dt.m.GetStatus() -} diff --git a/bindings/errors.go b/bindings/errors.go deleted file mode 100644 index cfffaf0155a8993787120d0bce24f6c1071baeb2..0000000000000000000000000000000000000000 --- a/bindings/errors.go +++ /dev/null @@ -1,105 +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 bindings - -import ( - "context" - "encoding/json" - "fmt" - "github.com/pkg/errors" - "strings" - "sync" -) - -// errToUserErr maps backend patterns to user friendly error messages. -// Example format: -// (Back-end) "Building new HostPool because no HostList stored:": (Front-end) "Missing host list", -var errToUserErr = map[string]string{ - // Registration errors - //"cannot create username when network is not health" : - // "Cannot create username, unable to connect to network", - //"failed to add due to malformed fact stringified facts must at least have a type at the start" : - // "Invalid fact, is the field empty?", - //// UD failures - //"failed to create user discovery manager: cannot return single manager, network is not health" : - // "Could not connect to user discovery", - //"user discovery returned error on search: no results found" : - // "No results found", - //"failed to search.: waiting for response to single-use transmisson timed out after 10s" : - // "Search timed out", - //"the phone number supplied was empty" : "Invalid phone number", - //"failed to create user discovery manager: cannot start ud manager when network follower is not running." : - // "Could not get network status", -} - -var errorMux sync.RWMutex - -// Error codes -const UnrecognizedCode = "UR: " -const UnrecognizedMessage = UnrecognizedCode + "Unrecognized error from XX backend, please report" - -// ErrorStringToUserFriendlyMessage takes a passed in errStr which will be -// a backend generated error. These may be error specifically written by -// the backend team or lower level errors gotten from low level dependencies. -// This function will parse the error string for common errors provided from -// errToUserErr to provide a more user-friendly error message for the front end. -// If the error is not common, some simple parsing is done on the error message -// to make it more user-accessible, removing backend specific jargon. -func ErrorStringToUserFriendlyMessage(errStr string) string { - errorMux.RLock() - defer errorMux.RUnlock() - // Go through common errors - for backendErr, userFriendly := range errToUserErr { - // Determine if error contains a common error - if strings.Contains(errStr, backendErr) { - return userFriendly - } - } - - descStr := "desc = " - // If this contains an rpc error, determine how to handle it - if strings.Contains(errStr, context.DeadlineExceeded.Error()) { - // If there is a context deadline exceeded message, return the higher level - // as context deadline exceeded is not informative - rpcErr := "rpc " - rpcIdx := strings.Index(errStr, rpcErr) - return errStr[:rpcIdx] - } else if strings.Contains(errStr, descStr) { - // If containing an rpc error where context deadline exceeded - // is NOT involved, the error returned server-side is often - //more informative - descIdx := strings.Index(errStr, descStr) - // return everything after "desc = " - return errStr[descIdx+len(descStr):] - } - - // If a compound error message, return the highest level message - errParts := strings.Split(errStr, ":") - if len(errParts) > 1 { - // Return everything before the first : - return UnrecognizedCode + errParts[0] - } - - return fmt.Sprintf("%s: %v", UnrecognizedCode, errStr) -} - -// UpdateCommonErrors takes the passed in contents of a JSON file and updates the -// errToUserErr map with the contents of the json file. The JSON's expected format -// conform with the commented examples provides in errToUserErr above. -// NOTE that you should not pass in a file path, but a preloaded JSON file -func UpdateCommonErrors(jsonFile string) error { - errorMux.Lock() - defer errorMux.Unlock() - err := json.Unmarshal([]byte(jsonFile), &errToUserErr) - if err != nil { - return errors.WithMessage(err, "Failed to unmarshal json file, "+ - "did you pass in the contents or the path?") - } - - return nil -} diff --git a/bindings/errors_test.go b/bindings/errors_test.go deleted file mode 100644 index d93a9924fb336e68fbe6c31af30174709f049d8d..0000000000000000000000000000000000000000 --- a/bindings/errors_test.go +++ /dev/null @@ -1,107 +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 bindings - -import ( - "context" - "strings" - "testing" -) - -// Unit test -func TestErrorStringToUserFriendlyMessage(t *testing.T) { - // Setup: Populate map - backendErrs := []string{"Failed to Unmarshal Conversation", "failed to create group key preimage", - "Failed to unmarshal SentRequestMap"} - userErrs := []string{"Could not retrieve conversation", "Failed to initiate group chat", - "Failed to pull up friend requests"} - - for i, exampleErr := range backendErrs { - errToUserErr[exampleErr] = userErrs[i] - } - - // Check if a mapped common error returns the expected user friendly error - received := ErrorStringToUserFriendlyMessage(backendErrs[0]) - if strings.Compare(received, userErrs[0]) != 0 { - t.Errorf("Unexpected user friendly message returned from common error mapping."+ - "\n\tExpected: %s"+ - "\n\tReceived: %v", userErrs[0], received) - } - - // Test RPC error in which high level information should - // be passed along (ie context deadline exceeded error) - expected := "Could not poll network: " - rpcPrefix := "rpc error: desc = " - rpcErr := expected + rpcPrefix + context.DeadlineExceeded.Error() - received = ErrorStringToUserFriendlyMessage(rpcErr) - if strings.Compare(expected, received) != 0 { - t.Errorf("Rpc error parsed unxecpectedly with error "+ - "\n\"%s\" "+ - "\n\tExpected: %s"+ - "\n\tReceived: %v", rpcErr, UnrecognizedCode+expected, received) - } - - // Test RPC error where server side error information is provided - serverSideError := "Could not parse message! Please try again with a properly crafted message" - rpcErr = rpcPrefix + serverSideError - received = ErrorStringToUserFriendlyMessage(rpcErr) - if strings.Compare(serverSideError, received) != 0 { - t.Errorf("RPC error parsed unexpectedly with error "+ - "\n\"%s\" "+ - "\n\tExpected: %s"+ - "\n\tReceived: %v", rpcErr, UnrecognizedCode+serverSideError, received) - } - - // Test uncommon error, should return highest level message - expected = "failed to register with permissioning" - uncommonErr := expected + ": sendRegistrationMessage: Unable to contact Identity Server" - received = ErrorStringToUserFriendlyMessage(uncommonErr) - if strings.Compare(received, UnrecognizedCode+expected) != 0 { - t.Errorf("Uncommon error parsed unexpectedly with error "+ - "\n\"%s\" "+ - "\n\tExpected: %s"+ - "\n\tReceived: %s", uncommonErr, UnrecognizedCode+expected, received) - } - - // Test fully unrecognizable and un-parsable message, - // should hardcoded error message - uncommonErr = "failed to register with permissioning" - received = ErrorStringToUserFriendlyMessage(uncommonErr) - if strings.Compare(UnrecognizedCode+": "+uncommonErr, received) != 0 { - t.Errorf("Uncommon error parsed unexpectedly with error "+ - "\n\"%s\" "+ - "\n\tExpected: %s"+ - "\n\tReceived: %s", uncommonErr, UnrecognizedMessage, received) - } - -} - -// Unit test -func TestClient_UpdateCommonErrors(t *testing.T) { - - key, expectedVal := "failed to create group key preimage", "Failed to initiate group chat" - - jsonData := "{\"Failed to Unmarshal Conversation\":\"Could not retrieve conversation\",\"Failed to unmarshal SentRequestMap\":\"Failed to pull up friend requests\",\"failed to create group key preimage\":\"Failed to initiate group chat\"}\n" - - err := UpdateCommonErrors(jsonData) - if err != nil { - t.Fatalf("UpdateCommonErrors error: %v", err) - } - - val, ok := errToUserErr[key] - if !ok { - t.Fatalf("Expected entry was not populated") - } - - if strings.Compare(expectedVal, val) != 0 { - t.Fatalf("Entry in updated error map was not expected."+ - "\n\tExpected: %s"+ - "\n\tReceived: %s", expectedVal, val) - } - -} diff --git a/bindings/event.go b/bindings/event.go deleted file mode 100644 index 4f5aeacf907edfb09f23662e986607c9d820633c..0000000000000000000000000000000000000000 --- a/bindings/event.go +++ /dev/null @@ -1,28 +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 bindings - -// EventCallbackFunctionObject bindings interface which contains function -// that implements the EventCallbackFunction -type EventCallbackFunctionObject interface { - ReportEvent(priority int, category, evtType, details string) -} - -// 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 *Client) RegisterEventCallback(name string, - myObj EventCallbackFunctionObject) error { - return c.api.RegisterEventCallback(name, myObj.ReportEvent) -} - -// UnregisterEventCallback deletes the callback identified by the -// index. It returns an error if it fails. -func (c *Client) UnregisterEventCallback(name string) { - c.api.UnregisterEventCallback(name) -} diff --git a/bindings/fileTransfer.go b/bindings/fileTransfer.go deleted file mode 100644 index 9e2d76169cd393422039b06de483905bd3a0de76..0000000000000000000000000000000000000000 --- a/bindings/fileTransfer.go +++ /dev/null @@ -1,272 +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 bindings - -import ( - "encoding/json" - ft "gitlab.com/elixxir/client/fileTransfer" - ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" - "gitlab.com/xx_network/primitives/id" - "time" -) - -// FileTransfer contains the file transfer manager. -type FileTransfer struct { - m ft.FileTransfer -} - -// FileTransferSentProgressFunc contains a function callback that tracks the -// progress of sending a file. It is called when a file part arrives, the -// transfer completes, or on error. -type FileTransferSentProgressFunc interface { - SentProgressCallback( - completed bool, arrived, total int, t *FilePartTracker, err error) -} - -// FileTransferReceivedProgressFunc contains a function callback that tracks the -// progress of receiving a file. It is called when a file part is received, the -// transfer completes, or on error. -type FileTransferReceivedProgressFunc interface { - ReceivedProgressCallback( - completed bool, received, total int, t *FilePartTracker, err error) -} - -// FileTransferReceiveFunc contains a function callback that notifies the -// receiver of an incoming file transfer. It is called on the reception of the -// initial file transfer message. -type FileTransferReceiveFunc interface { - ReceiveCallback(tid []byte, fileName, fileType string, sender []byte, - size int, preview []byte) -} - -// NewFileTransferManager creates a new file transfer manager and starts the -// sending and receiving threads. The receiveFunc is called everytime a new file -// transfer is received. -// The parameters string contains file transfer network configuration options -// and is a JSON formatted string of the fileTransfer2.Params object. If it is -// left empty, then defaults are used. It is highly recommended that defaults -// are used. If it is set, it must match the following format: -// {"MaxThroughput":150000,"SendTimeout":500000000} -// MaxThroughput is in bytes/sec and SendTimeout is in nanoseconds. -func NewFileTransferManager(client *Client, receiveFunc FileTransferReceiveFunc, - parameters string) (*FileTransfer, error) { - - receiveCB := func(tid *ftCrypto.TransferID, fileName, fileType string, - sender *id.ID, size uint32, preview []byte) { - receiveFunc.ReceiveCallback( - tid.Bytes(), fileName, fileType, sender.Bytes(), int(size), preview) - } - - // JSON unmarshal parameters string - p := ft.DefaultParams() - if parameters != "" { - err := json.Unmarshal([]byte(parameters), &p) - if err != nil { - return nil, err - } - } - - // Create new file transfer manager - // TODO: Fix NewManager parameters - m, err := ft.NewManager(receiveCB, p, nil, nil, nil, nil, nil) - if err != nil { - return nil, err - } - - // Start sending and receiving threads - err = client.api.AddService(m.StartProcesses) - if err != nil { - return nil, err - } - - return &FileTransfer{m}, nil -} - -// Send sends a file to the recipient. The sender must have an E2E relationship -// with the recipient. -// The file name is the name of the file to show a user. It has a max length of -// 48 bytes. -// The file type identifies what type of file is being sent. It has a max length -// of 8 bytes. -// The file data cannot be larger than 256 kB -// The retry float is the total amount of data to send relative to the data -// size. Data will be resent on error and will resend up to [(1 + retry) * -// fileSize]. -// The preview stores a preview of the data (such as a thumbnail) and is -// capped at 4 kB in size. -// Returns a unique transfer ID used to identify the transfer. -// PeriodMS is the duration, in milliseconds, to wait between progress callback -// calls. Set this large enough to prevent spamming. -func (f *FileTransfer) Send(fileName, fileType string, fileData []byte, - recipientID []byte, retry float32, preview []byte, - progressFunc FileTransferSentProgressFunc, periodMS int) ([]byte, error) { - - // Create SentProgressCallback - progressCB := func(completed bool, arrived, total uint16, - t ft.FilePartTracker, err error) { - progressFunc.SentProgressCallback( - completed, int(arrived), int(total), &FilePartTracker{t}, err) - } - - // Convert recipient ID bytes to id.ID - recipient, err := id.Unmarshal(recipientID) - if err != nil { - return []byte{}, err - } - - // Convert period to time.Duration - period := time.Duration(periodMS) * time.Millisecond - - // Send file - tid, err := f.m.Send(fileName, fileType, fileData, recipient, retry, - preview, progressCB, period) - if err != nil { - return nil, err - } - - // Return transfer ID as bytes and error - return tid.Bytes(), nil -} - -// RegisterSendProgressCallback allows for the registration of a callback to -// track the progress of an individual sent file transfer. The callback will be -// called immediately when added to report the current status of the transfer. -// It will then call every time a file part is sent, a file part arrives, the -// transfer completes, or an error occurs. It is called at most once every -// period, which means if events occur faster than the period, then they will -// not be reported and instead, the progress will be reported once at the end of -// the period. -// The period is specified in milliseconds. -func (f *FileTransfer) RegisterSendProgressCallback(transferID []byte, - progressFunc FileTransferSentProgressFunc, periodMS int) error { - - // Unmarshal transfer ID - tid := ftCrypto.UnmarshalTransferID(transferID) - - // Create SentProgressCallback - progressCB := func(completed bool, arrived, total uint16, - t ft.FilePartTracker, err error) { - progressFunc.SentProgressCallback( - completed, int(arrived), int(total), &FilePartTracker{t}, err) - } - - // Convert period to time.Duration - period := time.Duration(periodMS) * time.Millisecond - - return f.m.RegisterSentProgressCallback(&tid, progressCB, period) -} - -// Resend resends a file if sending fails. This function should only be called -// if the interfaces.SentProgressCallback returns an error. -// Resend is not currently implemented. -/*func (f *FileTransfer) Resend(transferID []byte) error { - // Unmarshal transfer ID - tid := ftCrypto.UnmarshalTransferID(transferID) - - return f.m.Resend(tid) -}*/ - -// CloseSend deletes a sent file transfer from the sent transfer map and from -// storage once a transfer has completed or reached the retry limit. Returns an -// error if the transfer has not run out of retries. -func (f *FileTransfer) CloseSend(transferID []byte) error { - // Unmarshal transfer ID - tid := ftCrypto.UnmarshalTransferID(transferID) - - return f.m.CloseSend(&tid) -} - -// Receive returns the fully assembled file on the completion of the transfer. -// It deletes the transfer from the received transfer map and from storage. -// Returns an error if the transfer is not complete, the full file cannot be -// verified, or if the transfer cannot be found. -func (f *FileTransfer) Receive(transferID []byte) ([]byte, error) { - // Unmarshal transfer ID - tid := ftCrypto.UnmarshalTransferID(transferID) - - return f.m.Receive(&tid) -} - -// RegisterReceiveProgressCallback allows for the registration of a callback to -// track the progress of an individual received file transfer. The callback will -// be called immediately when added to report the current status of the -// transfer. It will then call every time a file part is received, the transfer -// completes, or an error occurs. It is called at most once ever period, which -// means if events occur faster than the period, then they will not be reported -// and instead, the progress will be reported once at the end of the period. -// Once the callback reports that the transfer has completed, the recipient -// can get the full file by calling Receive. -// The period is specified in milliseconds. -func (f *FileTransfer) RegisterReceiveProgressCallback(transferID []byte, - progressFunc FileTransferReceivedProgressFunc, periodMS int) error { - // Unmarshal transfer ID - tid := ftCrypto.UnmarshalTransferID(transferID) - - // Create ReceivedProgressCallback - progressCB := func(completed bool, received, total uint16, - t ft.FilePartTracker, err error) { - progressFunc.ReceivedProgressCallback( - completed, int(received), int(total), &FilePartTracker{t}, err) - } - - // Convert period to time.Duration - period := time.Duration(periodMS) * time.Millisecond - - return f.m.RegisterReceivedProgressCallback(&tid, progressCB, period) -} - -//////////////////////////////////////////////////////////////////////////////// -// Utility Functions // -//////////////////////////////////////////////////////////////////////////////// - -// GetMaxFilePreviewSize returns the maximum file preview size, in bytes. -func (f *FileTransfer) GetMaxFilePreviewSize() int { - return ft.PreviewMaxSize -} - -// GetMaxFileNameByteLength returns the maximum length, in bytes, allowed for a -// file name. -func (f *FileTransfer) GetMaxFileNameByteLength() int { - return ft.FileNameMaxLen -} - -// GetMaxFileTypeByteLength returns the maximum length, in bytes, allowed for a -// file type. -func (f *FileTransfer) GetMaxFileTypeByteLength() int { - return ft.FileTypeMaxLen -} - -// GetMaxFileSize returns the maximum file size, in bytes, allowed to be -// transferred. -func (f *FileTransfer) GetMaxFileSize() int { - return ft.FileMaxSize -} - -//////////////////////////////////////////////////////////////////////////////// -// File Part Tracker // -//////////////////////////////////////////////////////////////////////////////// - -// FilePartTracker contains the interfaces.FilePartTracker. -type FilePartTracker struct { - m ft.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()) -} diff --git a/bindings/follow.go b/bindings/follow.go new file mode 100644 index 0000000000000000000000000000000000000000..ae81595b23ed0bbb627f6e112b86c5af47903919 --- /dev/null +++ b/bindings/follow.go @@ -0,0 +1,125 @@ +package bindings + +import ( + "fmt" + "github.com/pkg/errors" + "gitlab.com/xx_network/primitives/netTime" + "time" +) + +// 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 +// Threads Started: +// - Network Follower (/network/follow.go) +// 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 +// - Message Retrieval Worker Group (/network/rounds/retrieve.go) +// 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 +// - 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 +// - Critical Messages (/network/message/critical.go) +// Ensures all protocol layer mandatory messages are sent +// Uses a message store on disk for persistence +// - KeyExchange Trigger (/keyExchange/trigger.go) +// Responds to sent rekeys and executes them +// - KeyExchange Confirm (/keyExchange/confirm.go) +// Responds to confirmations of successful rekey operations +func (c *Client) StartNetworkFollower(timeoutMS int) error { + timeout := time.Duration(timeoutMS) * time.Millisecond + return c.api.StartNetworkFollower(timeout) +} + +// StopNetworkFollower stops the network follower if it is running. +// It returns errors if the Follower is in the wrong status 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 *Client) StopNetworkFollower() error { + if err := c.api.StopNetworkFollower(); err != nil { + return errors.New(fmt.Sprintf("Failed to stop the "+ + "network follower: %+v", err)) + } + return nil +} + +// WaitForNewtwork will block until either the network is healthy or the +// passed timeout. It will return true if the network is healthy +func (c *Client) WaitForNetwork(timeoutMS int) bool { + start := netTime.Now() + timeout := time.Duration(timeoutMS) * time.Millisecond + for netTime.Since(start) < timeout { + if c.api.GetCmix().IsHealthy() { + return true + } + time.Sleep(250 * time.Millisecond) + } + return false +} + +// Gets the state of the network follower. Returns: +// Stopped - 0 +// Starting - 1000 +// Running - 2000 +// Stopping - 3000 +func (c *Client) NetworkFollowerStatus() int { + return int(c.api.NetworkFollowerStatus()) +} + +// HasRunningProcessies checks if any background threads are running. +// returns true if none are running. This is meant to be +// used when NetworkFollowerStatus() returns Stopping. +// Due to the handling of comms on iOS, where the OS can +// block indefiently, it may not enter the stopped +// state apropreatly. This can be used instead. +func (c *Client) HasRunningProcessies() bool { + return c.api.HasRunningProcessies() +} + +// IsNetworkHealthy returns true if the network is read to be in a healthy state where +// messages can be sent +func (c *Client) IsNetworkHealthy() bool { + return c.api.GetCmix().IsHealthy() +} + +// A callback when which is used to receive notification if network health +// changes +type NetworkHealthCallback interface { + Callback(bool) +} + +// RegisterNetworkHealthCB 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 *Client) RegisterNetworkHealthCB(nhc NetworkHealthCallback) int64 { + return int64(c.api.GetCmix().AddHealthCallback(nhc.Callback)) +} + +func (c *Client) UnregisterNetworkHealthCB(funcID int64) { + c.api.GetCmix().RemoveHealthCallback(uint64(funcID)) +} + +type ClientError interface { + Report(source, message, trace string) +} + +// RegisterClientErrorCallback registers the callback to handle errors from the +// long running threads controlled by StartNetworkFollower and StopNetworkFollower +func (c *Client) RegisterClientErrorCallback(clientError ClientError) { + errChan := c.api.GetErrorsChannel() + go func() { + for report := range errChan { + go clientError.Report(report.Source, report.Message, report.Trace) + } + }() +} diff --git a/bindings/group.go b/bindings/group.go deleted file mode 100644 index 3fce2e43b790c06dc64e0eb15490b5d795746060..0000000000000000000000000000000000000000 --- a/bindings/group.go +++ /dev/null @@ -1,433 +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 bindings - -import ( - "encoding/json" - "fmt" - "github.com/pkg/errors" - gc "gitlab.com/elixxir/client/groupChat" - gs "gitlab.com/elixxir/client/groupChat/groupStore" - "gitlab.com/elixxir/crypto/group" - "gitlab.com/xx_network/primitives/id" - "time" -) - -// GroupChat object contains the group chat manager. -type GroupChat struct { - m *gc.Manager -} - -// GroupRequestFunc contains a function callback that is called when a group -// request is received. -type GroupRequestFunc interface { - GroupRequestCallback(g *Group) -} - -// GroupReceiveFunc contains a function callback that is called when a group -// message is received. -type GroupReceiveFunc interface { - GroupReceiveCallback(msg *GroupMessageReceive) -} - -// NewGroupManager creates a new group chat manager. -func NewGroupManager(client *Client, requestFunc GroupRequestFunc, - receiveFunc GroupReceiveFunc) (*GroupChat, error) { - - requestCallback := func(g gs.Group) { - requestFunc.GroupRequestCallback(&Group{g}) - } - receiveCallback := func(msg gc.MessageReceive) { - receiveFunc.GroupReceiveCallback(&GroupMessageReceive{msg}) - } - - // Create a new group chat manager - // TODO: Need things from storage, services, etc? - m, err := gc.NewManager(&client.api, requestCallback, receiveCallback) - if err != nil { - return nil, err - } - - return &GroupChat{m}, nil -} - -// MakeGroup creates a new group and sends a group request to all members in the -// group. The ID of the new group, the rounds the requests were sent on, and the -// status of the sends are contained in NewGroupReport. -func (g *GroupChat) MakeGroup(membership *IdList, name, message []byte) *NewGroupReport { - grp, rounds, status, err := g.m.MakeGroup(membership.list, name, message) - errStr := "" - if err != nil { - errStr = err.Error() - } - return &NewGroupReport{&Group{grp}, rounds, status, errStr} -} - -// ResendRequest resends a group request to all members in the group. The rounds -// they were sent on and the status of the send are contained in NewGroupReport. -func (g *GroupChat) ResendRequest(groupIdBytes []byte) (*NewGroupReport, error) { - groupID, err := id.Unmarshal(groupIdBytes) - if err != nil { - return nil, - errors.Errorf("Failed to unmarshal group ID: %+v", err) - } - - grp, exists := g.m.GetGroup(groupID) - if !exists { - return nil, errors.Errorf("Failed to find group %s", groupID) - } - - rounds, status, err := g.m.ResendRequest(groupID) - - errStr := "" - if err != nil { - errStr = err.Error() - } - return &NewGroupReport{&Group{grp}, rounds, status, errStr}, nil -} - -// JoinGroup allows a user to join a group when they receive a request. The -// caller must pass in the serialized bytes of a Group. -func (g *GroupChat) JoinGroup(serializedGroupData []byte) error { - grp, err := gs.DeserializeGroup(serializedGroupData) - if err != nil { - return err - } - return g.m.JoinGroup(grp) -} - -// LeaveGroup deletes a group so a user no longer has access. -func (g *GroupChat) LeaveGroup(groupIdBytes []byte) error { - groupID, err := id.Unmarshal(groupIdBytes) - if err != nil { - return errors.Errorf("Failed to unmarshal group ID: %+v", err) - } - - return g.m.LeaveGroup(groupID) -} - -// Send sends the message to the specified group. Returns the round the messages -// were sent on. -func (g *GroupChat) Send(groupIdBytes, message []byte) (*GroupSendReport, error) { - groupID, err := id.Unmarshal(groupIdBytes) - if err != nil { - return nil, errors.Errorf("Failed to unmarshal group ID: %+v", err) - } - - round, timestamp, msgID, err := g.m.Send(groupID, message) - return &GroupSendReport{round, timestamp, msgID}, err -} - -// GetGroups returns an IdList containing a list of group IDs that the user is a -// part of. -func (g *GroupChat) GetGroups() *IdList { - return &IdList{g.m.GetGroups()} -} - -// GetGroup returns the group with the group ID. If no group exists, then the -// error "failed to find group" is returned. -func (g *GroupChat) GetGroup(groupIdBytes []byte) (*Group, error) { - groupID, err := id.Unmarshal(groupIdBytes) - if err != nil { - return nil, errors.Errorf("Failed to unmarshal group ID: %+v", err) - } - - grp, exists := g.m.GetGroup(groupID) - if !exists { - return nil, errors.New("failed to find group") - } - - return &Group{grp}, nil -} - -// NumGroups returns the number of groups the user is a part of. -func (g *GroupChat) NumGroups() int { - return g.m.NumGroups() -} - -//// -// NewGroupReport Structure -//// - -// NewGroupReport is returned when creating a new group and contains the ID of -// the group, a list of rounds that the group requests were sent on, and the -// status of the send. -type NewGroupReport struct { - group *Group - rounds []id.Round - status gc.RequestStatus - err string -} - -type GroupReportDisk struct { - List []id.Round - GrpId []byte - Status int -} - -// GetGroup returns the Group. -func (ngr *NewGroupReport) GetGroup() *Group { - return ngr.group -} - -// GetRoundList returns the RoundList containing a list of rounds requests were -// sent on. -func (ngr *NewGroupReport) GetRoundList() *RoundList { - return &RoundList{ngr.rounds} -} - -// GetStatus returns the status of the requests sent when creating a new group. -// status = 0 an error occurred before any requests could be sent -// 1 all requests failed to send (call Resend Group) -// 2 some request failed and some succeeded (call Resend Group) -// 3, all requests sent successfully (call Resend Group) -func (ngr *NewGroupReport) GetStatus() int { - return int(ngr.status) -} - -// GetError returns the string of an error. -// Will be an empty string if no error occured -func (ngr *NewGroupReport) GetError() string { - return ngr.err -} - -func (ngr *NewGroupReport) Marshal() ([]byte, error) { - grpReportDisk := GroupReportDisk{ - List: ngr.rounds, - GrpId: ngr.group.GetID()[:], - Status: ngr.GetStatus(), - } - return json.Marshal(&grpReportDisk) -} - -func (ngr *NewGroupReport) Unmarshal(b []byte) error { - grpReportDisk := GroupReportDisk{} - if err := json.Unmarshal(b, &grpReportDisk); err != nil { - return errors.New(fmt.Sprintf("Failed to unmarshal group "+ - "report: %s", err.Error())) - } - - grpId, err := id.Unmarshal(grpReportDisk.GrpId) - if err != nil { - return errors.New(fmt.Sprintf("Failed to unmarshal group "+ - "id: %s", err.Error())) - } - - ngr.group.g.ID = grpId - ngr.rounds = grpReportDisk.List - ngr.status = gc.RequestStatus(grpReportDisk.Status) - - return nil -} - -//// -// NewGroupReport Structure -//// - -// GroupSendReport is returned when sending a group message. It contains the -// round ID sent on and the timestamp of the send. -type GroupSendReport struct { - roundID id.Round - timestamp time.Time - messageID group.MessageID -} - -// GetRoundID returns the ID of the round that the send occurred on. -func (gsr *GroupSendReport) GetRoundID() int64 { - return int64(gsr.roundID) -} - -// GetTimestampNano returns the timestamp of the send in nanoseconds. -func (gsr *GroupSendReport) GetTimestampNano() int64 { - return gsr.timestamp.UnixNano() -} - -// GetTimestampMS returns the timestamp of the send in milliseconds. -func (gsr *GroupSendReport) GetTimestampMS() int64 { - ts := uint64(gsr.timestamp.UnixNano()) / uint64(time.Millisecond) - return int64(ts) -} - -// GetMessageID returns the ID of the round that the send occurred on. -func (gsr *GroupSendReport) GetMessageID() []byte { - return gsr.messageID[:] -} - -// GetRoundURL returns the URL of the round that the send occurred on. -func (gsr *GroupSendReport) GetRoundURL() string { - return getRoundURL(gsr.roundID) -} - -//// -// Group Structure -//// - -// Group structure contains the identifying and membership information of a -// group chat. -type Group struct { - g gs.Group -} - -// GetName returns the name set by the user for the group. -func (g *Group) GetName() []byte { - return g.g.Name -} - -// GetID return the 33-byte unique group ID. -func (g *Group) GetID() []byte { - return g.g.ID.Bytes() -} - -// GetInitMessage returns initial message sent with the group request. -func (g *Group) GetInitMessage() []byte { - return g.g.InitMessage -} - -// GetCreatedNano returns the time the group was created in nanoseconds. This is -// also the time the group requests were sent. -func (g *Group) GetCreatedNano() int64 { - return g.g.Created.UnixNano() -} - -// GetCreatedMS returns the time the group was created in milliseconds. This is -// also the time the group requests were sent. -func (g *Group) GetCreatedMS() int64 { - ts := uint64(g.g.Created.UnixNano()) / uint64(time.Millisecond) - return int64(ts) -} - -// GetMembership returns a list of contacts, one for each member in the group. -// The list is in order; the first contact is the leader/creator of the group. -// All subsequent members are ordered by their ID. -func (g *Group) GetMembership() *GroupMembership { - return &GroupMembership{g.g.Members} -} - -// Serialize serializes the Group. -func (g *Group) Serialize() []byte { - return g.g.Serialize() -} - -//// -// Membership Structure -//// - -// GroupMembership structure contains a list of members that are part of a -// group. The first member is the group leader. -type GroupMembership struct { - m group.Membership -} - -// Len returns the number of members in the group membership. -func (gm *GroupMembership) Len() int { - return len(gm.m) -} - -// Get returns the member at the index. The member at index 0 is always the -// group leader. An error is returned if the index is out of range. -func (gm *GroupMembership) Get(i int) (*GroupMember, error) { - if i < 0 || i >= gm.Len() { - return nil, errors.Errorf("ID list index must be between %d "+ - "and the last element %d.", 0, gm.Len()) - } - return &GroupMember{gm.m[i]}, nil -} - -//// -// Member Structure -//// - -// GroupMember represents a member in the group membership list. -type GroupMember struct { - group.Member -} - -// GetID returns the 33-byte user ID of the member. -func (gm GroupMember) GetID() []byte { - return gm.ID.Bytes() -} - -// GetDhKey returns the byte representation of the public Diffie–Hellman key of -// the member. -func (gm *GroupMember) GetDhKey() []byte { - return gm.DhKey.Bytes() -} - -//// -// Message Receive Structure -//// - -// GroupMessageReceive contains a group message, its ID, and its data that a -// user receives. -type GroupMessageReceive struct { - gc.MessageReceive -} - -// GetGroupID returns the 33-byte group ID. -func (gmr *GroupMessageReceive) GetGroupID() []byte { - return gmr.GroupID.Bytes() -} - -// GetMessageID returns the message ID. -func (gmr *GroupMessageReceive) GetMessageID() []byte { - return gmr.ID.Bytes() -} - -// GetPayload returns the message payload. -func (gmr *GroupMessageReceive) GetPayload() []byte { - return gmr.Payload -} - -// GetSenderID returns the 33-byte user ID of the sender. -func (gmr *GroupMessageReceive) GetSenderID() []byte { - return gmr.SenderID.Bytes() -} - -// GetRecipientID returns the 33-byte user ID of the recipient. -func (gmr *GroupMessageReceive) GetRecipientID() []byte { - return gmr.RecipientID.Bytes() -} - -// GetEphemeralID returns the address ID of the recipient. -func (gmr *GroupMessageReceive) GetEphemeralID() int64 { - return gmr.EphemeralID.Int64() -} - -// GetTimestampNano returns the message timestamp in nanoseconds. -func (gmr *GroupMessageReceive) GetTimestampNano() int64 { - return gmr.Timestamp.UnixNano() -} - -// GetTimestampMS returns the message timestamp in milliseconds. -func (gmr *GroupMessageReceive) GetTimestampMS() int64 { - ts := uint64(gmr.Timestamp.UnixNano()) / uint64(time.Millisecond) - return int64(ts) -} - -// GetRoundID returns the ID of the round the message was sent on. -func (gmr *GroupMessageReceive) GetRoundID() int64 { - return int64(gmr.RoundID) -} - -// GetRoundURL returns the ID of the round the message was sent on. -func (gmr *GroupMessageReceive) GetRoundURL() string { - return getRoundURL(gmr.RoundID) -} - -// GetRoundTimestampNano returns the timestamp, in nanoseconds, of the round the -// message was sent on. -func (gmr *GroupMessageReceive) GetRoundTimestampNano() int64 { - return gmr.RoundTimestamp.UnixNano() -} - -// GetRoundTimestampMS returns the timestamp, in milliseconds, of the round the -// message was sent on. -func (gmr *GroupMessageReceive) GetRoundTimestampMS() int64 { - ts := uint64(gmr.RoundTimestamp.UnixNano()) / uint64(time.Millisecond) - return int64(ts) -} diff --git a/bindings/jsons.go b/bindings/jsons.go deleted file mode 100644 index 53f15435c6e8750a5d08e18c18d23b81c4304f5d..0000000000000000000000000000000000000000 --- a/bindings/jsons.go +++ /dev/null @@ -1,55 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// Copyright © 2021 xx network SEZC // -// // -// Use of this source code is governed by a license that can be found in the // -// LICENSE file // -/////////////////////////////////////////////////////////////////////////////// - -package bindings - -import ( - "io/ioutil" - "net/http" -) - -// DownloadErrorDB returns a []byte containing the JSON data -// describing client errors. -// See https://git.xx.network/elixxir/client-error-database/ -func DownloadErrorDB() ([]byte, error) { - // Build a request for the file - resp, err := http.Get("https://elixxir-bins.s3-us-west-1.amazonaws.com/client/errors/clientErrors.json") - if err != nil { - return nil, err - } - defer resp.Body.Close() - - // Download the contents of the file - content, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, err - } - - // Return it to the user - return content, nil -} - -// DownloadDAppRegistrationDB returns a []byte containing -// the JSON data describing registered dApps. -// See https://git.xx.network/elixxir/registered-dapps -func DownloadDAppRegistrationDB() ([]byte, error) { - // Build a request for the file - resp, err := http.Get("https://elixxir-bins.s3-us-west-1.amazonaws.com/client/dapps/appdb.json") - if err != nil { - return nil, err - } - defer resp.Body.Close() - - // Download the contents of the file - content, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, err - } - - // Return it to the user - return content, nil -} diff --git a/bindings/jsons_test.go b/bindings/jsons_test.go deleted file mode 100644 index a4405fd47fcd0908c0b8acff7a234b7732778e0f..0000000000000000000000000000000000000000 --- a/bindings/jsons_test.go +++ /dev/null @@ -1,29 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// Copyright © 2021 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" - "testing" -) - -func TestDownloadErrorDB(t *testing.T) { - json, err := DownloadErrorDB() - if err != nil { - t.Errorf("DownloadErrorDB returned error: %s", err) - } - fmt.Printf("json: %s\n", string(json)) -} - -func TestDownloadDAppRegistrationDB(t *testing.T) { - json, err := DownloadDAppRegistrationDB() - if err != nil { - t.Errorf("DownloadDAppRegistrationDB returned error: %s", err) - } - fmt.Printf("json: %s\n", string(json)) -} diff --git a/bindings/list.go b/bindings/list.go deleted file mode 100644 index 1331c378e2b2f31c457ef2f3d082c51e186f2fbb..0000000000000000000000000000000000000000 --- a/bindings/list.go +++ /dev/null @@ -1,155 +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 bindings - -import ( - "github.com/pkg/errors" - "gitlab.com/elixxir/crypto/contact" - "gitlab.com/elixxir/primitives/fact" - "gitlab.com/xx_network/primitives/id" -) - -/*IntList*/ - -type IntList struct { - lst []int -} - -func MakeIntList() *IntList { - return &IntList{lst: make([]int, 0)} -} - -func (il *IntList) Add(i int) { - il.lst = append(il.lst, i) -} - -func (il *IntList) Len() int { - return len(il.lst) -} - -func (il *IntList) Get(i int) (int, error) { - if i < 0 || i >= len(il.lst) { - return 0, errors.New("invalid index") - } - return il.lst[i], nil -} - -/*RoundList*/ - -type RoundList struct { - list []id.Round -} - -// Gets the number of round IDs stored -func (rl *RoundList) Len() int { - return len(rl.list) -} - -// Gets a stored round ID at the given index -func (rl *RoundList) Get(i int) (int, error) { - if i < 0 || i > len(rl.list) { - return -1, errors.New("round ID cannot be under 0 or over" + - " list len") - } - - return int(rl.list[i]), nil -} - -/*ContactList*/ - -type ContactList struct { - list []contact.Contact -} - -// Gets the number of round IDs stored -func (cl *ContactList) Len() int { - return len(cl.list) -} - -// Gets a stored round ID at the given index -func (cl *ContactList) Get(i int) (*Contact, error) { - if i < 0 || i > len(cl.list) { - return nil, errors.New("contact cannot be under 0 or over" + - " list len") - } - - return &Contact{c: &cl.list[i]}, nil -} - -/*FactList*/ -func NewFactList() *FactList { - return &FactList{c: &contact.Contact{ - ID: nil, - DhPubKey: nil, - OwnershipProof: nil, - Facts: make([]fact.Fact, 0), - }} -} - -type FactList struct { - c *contact.Contact -} - -func (fl *FactList) Num() int { - return len(fl.c.Facts) -} - -func (fl *FactList) Get(i int) *Fact { - return &Fact{f: &(fl.c.Facts)[i]} -} - -func (fl *FactList) Add(factData string, factType int) error { - f, err := fact.NewFact(fact.FactType(factType), factData) - if err != nil { - return err - } - fl.c.Facts = append(fl.c.Facts, f) - return nil -} - -func (fl *FactList) Stringify() (string, error) { - return fl.c.Facts.Stringify(), nil -} - -/* ID list */ -// IdList contains a list of IDs. -type IdList struct { - list []*id.ID -} - -// MakeIdList creates a new empty IdList. -func MakeIdList() *IdList { - return &IdList{[]*id.ID{}} -} - -// Len returns the number of IDs in the list. -func (idl *IdList) Len() int { - return len(idl.list) -} - -// Add appends the ID bytes to the end of the list. -func (idl *IdList) Add(idBytes []byte) error { - newID, err := id.Unmarshal(idBytes) - if err != nil { - return err - } - - idl.list = append(idl.list, newID) - return nil -} - -// Get returns the ID at the index. An error is returned if the index is out of -// range. -func (idl *IdList) Get(i int) ([]byte, error) { - if i < 0 || i > len(idl.list) { - return nil, errors.Errorf("ID list index must be between %d and the "+ - "last element %d.", 0, len(idl.list)) - } - - return idl.list[i].Bytes(), nil -} diff --git a/bindings/listener.go b/bindings/listener.go new file mode 100644 index 0000000000000000000000000000000000000000..b284687beadd802985b6023528989a5401b7dbd0 --- /dev/null +++ b/bindings/listener.go @@ -0,0 +1,74 @@ +package bindings + +import ( + "encoding/json" + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/e2e/receive" +) + +// Listener provides a callback to hear a message +// An object implementing this interface can be called back when the client +// gets a message of the type that the registerer specified at registration +// time. +type Listener interface { + // Hear is called to receive a message in the UI + // Accepts a marshalled Message object + Hear(item []byte) + // Name returns a name, used for debugging + Name() string +} + +// listener is an object internal to bindings which matches the interface expected by RegisterListener +// it wraps the Listener type, which is usable by the bindings layer +type listener struct { + l Listener +} + +// Message is the bindings representation of a receive.Message +// Example Message format: +// {"MessageType":1, +// "ID":"EB/70R5HYEw5htZ4Hg9ondrn3+cAc/lH2G0mjQMja3w=", +// "Payload":"7TzZKgNphT5UooNM7mDSwtVcIs8AIu4vMKm4ld6GSR8YX5GrHirixUBAejmsgdroRJyo06TkIVef7UM9FN8YfQ==", +// "Sender":"emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD", +// "RecipientID":"amFrZXh4MzYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD", +// "EphemeralID":17,"Timestamp":1653580439357351000, +// "Encrypted":false, +// "RoundId":19} +type Message struct { + MessageType int + ID []byte + Payload []byte + + Sender []byte + RecipientID []byte + EphemeralID int64 + Timestamp int64 // Message timestamp of when the user sent + + Encrypted bool + RoundId int +} + +// Hear is called to receive a message in the UI +func (l listener) Hear(item receive.Message) { + m := Message{ + MessageType: int(item.MessageType), + ID: item.ID.Marshal(), + Payload: item.Payload, + Sender: item.Sender.Marshal(), + RecipientID: item.RecipientID.Marshal(), + EphemeralID: item.EphemeralID.Int64(), + Timestamp: item.Timestamp.UnixNano(), + Encrypted: item.Encrypted, + RoundId: int(item.Round.ID), + } + result, err := json.Marshal(&m) + if err != nil { + jww.ERROR.Printf("Unable to marshal Message: %+v", err.Error()) + } + l.l.Hear(result) +} + +// Name used for debugging +func (l listener) Name() string { + return l.l.Name() +} diff --git a/bindings/listener_test.go b/bindings/listener_test.go new file mode 100644 index 0000000000000000000000000000000000000000..c8fd03ec88cfea35ab5cb7a5431f05fb7157907d --- /dev/null +++ b/bindings/listener_test.go @@ -0,0 +1,34 @@ +package bindings + +import ( + "encoding/json" + "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) { + rng := csprng.NewSystemRNG() + messageID := e2e.MessageID{} + rng.Read(messageID[:]) + payload := make([]byte, 64) + rng.Read(payload) + sender := id.NewIdFromString("zezima", id.User, t) + receiver := id.NewIdFromString("jakexx360", id.User, t) + m := Message{ + MessageType: 1, + ID: messageID[:], + Payload: payload, + Sender: sender.Marshal(), + RecipientID: receiver.Marshal(), + EphemeralID: 17, + Timestamp: time.Now().UnixNano(), + Encrypted: false, + RoundId: 19, + } + mm, _ := json.Marshal(m) + t.Log("Marshalled Message") + t.Log(string(mm)) +} diff --git a/bindings/message.go b/bindings/message.go deleted file mode 100644 index 3eee3b343627338fb907ba81b93fe2e73f8f4731..0000000000000000000000000000000000000000 --- a/bindings/message.go +++ /dev/null @@ -1,72 +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 bindings - -import ( - "gitlab.com/elixxir/client/interfaces/message" -) - -// Message is a message received from the cMix network in the clear -// or that has been decrypted using established E2E keys. -type Message struct { - r message.Receive -} - -// GetID returns the id of the message -func (m *Message) GetID() []byte { - return m.r.ID[:] -} - -// GetSender returns the message's sender ID, if available -func (m *Message) GetSender() []byte { - return m.r.Sender.Bytes() -} - -// GetPayload returns the message's payload/contents -func (m *Message) GetPayload() []byte { - return m.r.Payload -} - -// GetMessageType returns the message's type -func (m *Message) GetMessageType() int { - return int(m.r.MessageType) -} - -// GetTimestampMS returns the message's timestamp in milliseconds -func (m *Message) GetTimestampMS() int64 { - ts := m.r.Timestamp.UnixNano() - ts = (ts + 500000) / 1000000 - return ts -} - -// GetTimestampNano returns the message's timestamp in nanoseconds -func (m *Message) GetTimestampNano() int64 { - return m.r.Timestamp.UnixNano() -} - -// GetRoundTimestampMS returns the message's round timestamp in milliseconds -func (m *Message) GetRoundTimestampMS() int64 { - ts := m.r.RoundTimestamp.UnixNano() - ts = (ts + 999999) / 1000000 - return ts -} - -// GetRoundTimestampNano returns the message's round timestamp in nanoseconds -func (m *Message) GetRoundTimestampNano() int64 { - return m.r.RoundTimestamp.UnixNano() -} - -// GetRoundId returns the message's round ID -func (m *Message) GetRoundId() int64 { - return int64(m.r.RoundId) -} - -// GetRoundURL returns the message's round URL -func (m *Message) GetRoundURL() string { - return getRoundURL(m.r.RoundId) -} diff --git a/bindings/mnemonic.go b/bindings/mnemonic.go deleted file mode 100644 index 7062341a1958bb3cd2c0e0e9a960b454f1a143cf..0000000000000000000000000000000000000000 --- a/bindings/mnemonic.go +++ /dev/null @@ -1,34 +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 bindings - -import "gitlab.com/elixxir/client/api" - -// StoreSecretWithMnemonic stores the secret tied with the mnemonic to storage. -// Unlike other storage operations, this does not use EKV, as that is -// intrinsically tied to client operations, which the user will not have while -// trying to recover their account. As such, we store the encrypted data -// directly, with a specified path. Path will be a valid filepath in which the -// recover file will be stored as ".recovery". -// -// As an example, given "home/user/xxmessenger/storagePath", -// the recovery file will be stored at -// "home/user/xxmessenger/storagePath/.recovery" -func StoreSecretWithMnemonic(secret []byte, path string) (string, error) { - return api.StoreSecretWithMnemonic(secret, path) -} - -// LoadSecretWithMnemonic loads the secret stored from the call to -// StoreSecretWithMnemonic. The path given should be the same filepath -// as the path given in StoreSecretWithMnemonic. There should be a file -// in this path called ".recovery". This operation is not tied -// to client operations, as the user will not have a client when trying to -// recover their account. -func LoadSecretWithMnemonic(mnemonic, path string) (secret []byte, err error) { - return api.LoadSecretWithMnemonic(mnemonic, path) -} diff --git a/bindings/ndf.go b/bindings/ndf.go index 2c35c681799b251796fd7f4592311572468208b3..05e7d40b364678a028b66001c5de907840d1f6a7 100644 --- a/bindings/ndf.go +++ b/bindings/ndf.go @@ -1,15 +1,6 @@ -/////////////////////////////////////////////////////////////////////////////// -// Copyright © 2021 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/api" -) +import "gitlab.com/elixxir/client/api" // DownloadAndVerifySignedNdfWithUrl retrieves the NDF from a specified URL. // The NDF is processed into a protobuf containing a signature which diff --git a/bindings/ndf_test.go b/bindings/ndf_test.go index 3f7c68f26079621e63fe864587da5072ad04b22b..beb0eac9604902938b5efcac0660bf4ea230c7d4 100644 --- a/bindings/ndf_test.go +++ b/bindings/ndf_test.go @@ -1,10 +1,3 @@ -/////////////////////////////////////////////////////////////////////////////// -// Copyright © 2021 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/notifications.go b/bindings/notifications.go deleted file mode 100644 index 62cf55faea8eb127dddf116303a2153c41c16906..0000000000000000000000000000000000000000 --- a/bindings/notifications.go +++ /dev/null @@ -1,110 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// Copyright © 2021 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" - "github.com/pkg/errors" - "gitlab.com/elixxir/client/storage/edge" - "gitlab.com/elixxir/crypto/fingerprint" - "gitlab.com/elixxir/primitives/notifications" -) - -type NotificationForMeReport struct { - forMe bool - tYpe string - source []byte -} - -func (nfmr *NotificationForMeReport) ForMe() bool { - return nfmr.forMe -} - -func (nfmr *NotificationForMeReport) Type() string { - return nfmr.tYpe -} - -func (nfmr *NotificationForMeReport) Source() []byte { - return nfmr.source -} - -type ManyNotificationForMeReport struct { - many []*NotificationForMeReport -} - -func (mnfmr *ManyNotificationForMeReport) Get(i int) (*NotificationForMeReport, error) { - if i >= len(mnfmr.many) { - return nil, errors.New("Cannot get, too long") - } - return mnfmr.many[i], nil -} - -func (mnfmr *ManyNotificationForMeReport) Len() int { - return len(mnfmr.many) -} - -// NotificationsForMe Check if a notification received is for me -// It returns a NotificationForMeReport which contains a ForMe bool stating if it is for the caller, -// a Tag, and a source. These are as follows: -// TYPE SOURCE DESCRIPTION -// "default" recipient user ID A message with no association -// "request" sender user ID A channel request has been received -// "confirm" sender user ID A channel request has been accepted -// "silent" sender user ID A message which should not be notified on -// "e2e" sender user ID reception of an E2E message -// "group" group ID reception of a group chat message -// "endFT" sender user ID Last message sent confirming end of file transfer -// "groupRQ" sender user ID Request from sender to join a group chat -func NotificationsForMe(notifCSV, preimages string) (*ManyNotificationForMeReport, error) { - //handle deserialization of preimages - var preimageList []edge.Preimage - if err := json.Unmarshal([]byte(preimages), &preimageList); err != nil { - return nil, errors.WithMessagef(err, "Failed to unmarshal the preimages list, "+ - "cannot check if notification is for me") - } - - list, err := notifications.DecodeNotificationsCSV(notifCSV) - - if err != nil { - return nil, err - } - - notifList := make([]*NotificationForMeReport, 0, len(list)) - - for _, notifData := range list { - n := &NotificationForMeReport{ - forMe: false, - tYpe: "", - source: nil, - } - //check if any preimages match with the passed in data - for _, preimage := range preimageList { - if fingerprint.CheckIdentityFpFromMessageHash(notifData.IdentityFP, notifData.MessageHash, preimage.Data) { - n = &NotificationForMeReport{ - forMe: true, - tYpe: preimage.Type, - source: preimage.Source, - } - break - } - } - notifList = append(notifList, n) - } - - return &ManyNotificationForMeReport{many: notifList}, nil -} - -// RegisterForNotifications accepts firebase messaging token -func (c *Client) RegisterForNotifications(token string) error { - return c.api.RegisterForNotifications(token) -} - -// UnregisterForNotifications unregister user for notifications -func (c *Client) UnregisterForNotifications() error { - return c.api.UnregisterForNotifications() -} diff --git a/bindings/notifications_test.go b/bindings/notifications_test.go deleted file mode 100644 index b180d09d78f5acedfdd1a1eacd0a2356ede18106..0000000000000000000000000000000000000000 --- a/bindings/notifications_test.go +++ /dev/null @@ -1,125 +0,0 @@ -package bindings - -import ( - "bytes" - "encoding/json" - "gitlab.com/elixxir/client/storage/edge" - "gitlab.com/elixxir/comms/mixmessages" - "gitlab.com/elixxir/crypto/fingerprint" - "math/rand" - "testing" -) - -func TestNotificationForMe(t *testing.T) { - - const numPreimages = 5 - - types := []string{"default", "request", "silent", "e2e", "group"} - sourceList := [][]byte{{0}, {1}, {2}, {3}, {4}} - - preimageList := make([]edge.Preimage, 0, numPreimages) - - rng := rand.New(rand.NewSource(42)) - - for i := 0; i < numPreimages; i++ { - piData := make([]byte, 32) - rng.Read(piData) - - pi := edge.Preimage{ - Data: piData, - Type: types[i], - Source: sourceList[i], - } - - preimageList = append(preimageList, pi) - } - - preimagesJson, _ := json.Marshal(&preimageList) - - dataSources := []int{0, 1, -1, 2, 3, 4, -1, 0, 1, 2, 3, 4, -1, 2, 2, 2} - - notifData := make([]*mixmessages.NotificationData, 0, len(dataSources)) - - for _, index := range dataSources { - var preimage []byte - if index == -1 { - preimage = make([]byte, 32) - rng.Read(preimage) - } else { - preimage = preimageList[index].Data - } - - msg := make([]byte, 32) - rng.Read(msg) - msgHash := fingerprint.GetMessageHash(msg) - - identityFP := fingerprint.IdentityFP(msg, preimage) - - n := &mixmessages.NotificationData{ - EphemeralID: 0, - IdentityFP: identityFP, - MessageHash: msgHash, - } - - notifData = append(notifData, n) - } - - notfsCSV := mixmessages.MakeNotificationsCSV(notifData) - - notifsForMe, err := NotificationsForMe(notfsCSV, string(preimagesJson)) - if err != nil { - t.Errorf("Got error from NotificationsForMe: %+v", err) - } - - for i := 0; i < notifsForMe.Len(); i++ { - nfm, err := notifsForMe.Get(i) - if err != nil { - t.Errorf("Got error in getting notif: %+v", err) - } - if dataSources[i] == -1 { - if nfm.ForMe() { - t.Errorf("Notification %d should not be for me", i) - } - if nfm.Type() != "" { - t.Errorf("Notification %d shoudl not have a type, "+ - "has: %s", i, nfm.Type()) - } - if nfm.Source() != nil { - t.Errorf("Notification %d shoudl not have a source, "+ - "has: %v", i, nfm.Source()) - } - } else { - if !nfm.ForMe() { - t.Errorf("Notification %d should be for me", i) - } else { - expectedType := types[dataSources[i]] - if nfm.Type() != expectedType { - t.Errorf("Notification %d has the wrong type, "+ - "Expected: %s, Received: %s", i, nfm.Type(), expectedType) - } - expectedSource := sourceList[dataSources[i]] - if !bytes.Equal(nfm.Source(), expectedSource) { - t.Errorf("Notification %d source does not match: "+ - "Expected: %v, Received: %v", i, expectedSource, - nfm.Source()) - } - } - } - } -} - -func TestManyNotificationForMeReport_Get(t *testing.T) { - ManyNotificationForMeReport := &ManyNotificationForMeReport{many: make([]*NotificationForMeReport, 10)} - - //not too long - _, err := ManyNotificationForMeReport.Get(2) - if err != nil { - t.Errorf("Got error when not too long: %+v", err) - } - - //too long - _, err = ManyNotificationForMeReport.Get(69) - if err == nil { - t.Errorf("Didnt get error when too long") - } -} diff --git a/bindings/params.go b/bindings/params.go deleted file mode 100644 index d4896a2e9e89c49c177689c85ff0a2cf410f9277..0000000000000000000000000000000000000000 --- a/bindings/params.go +++ /dev/null @@ -1,34 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// Copyright © 2021 xx network SEZC // -// // -// Use of this source code is governed by a license that can be found in the // -// LICENSE file // -/////////////////////////////////////////////////////////////////////////////// - -// Contains params-related bindings - -package bindings - -import ( - "gitlab.com/elixxir/client/interfaces/params" -) - -func GetCMIXParams() (string, error) { - p, err := params.GetDefaultCMIX().Marshal() - return string(p), err -} - -func GetE2EParams() (string, error) { - p, err := params.GetDefaultE2E().Marshal() - return string(p), err -} - -func GetNetworkParams() (string, error) { - p, err := params.GetDefaultNetwork().Marshal() - return string(p), err -} - -func GetUnsafeParams() (string, error) { - p, err := params.GetDefaultUnsafe().Marshal() - return string(p), err -} diff --git a/bindings/preimage.go b/bindings/preimage.go deleted file mode 100644 index c5b7f60ab1e93e594664b86f9e6a0aa116f17b18..0000000000000000000000000000000000000000 --- a/bindings/preimage.go +++ /dev/null @@ -1,46 +0,0 @@ -package bindings - -import ( - "encoding/json" - jww "github.com/spf13/jwalterweatherman" - "gitlab.com/xx_network/primitives/id" - "reflect" - "unsafe" -) - -type PreimageNotification interface { - Notify(identity []byte, deleted bool) -} - -func (c *Client) RegisterPreimageCallback(identity []byte, pin PreimageNotification) { - - iid := &id.ID{} - copy(iid[:], identity) - - cb := func(localIdentity *id.ID, deleted bool) { - pin.Notify(localIdentity[:], deleted) - } - - c.api.GetStorage().GetEdge().AddUpdateCallback(iid, cb) -} - -func (c *Client) GetPreimages(identity []byte) string { - iid := &id.ID{} - copy(iid[:], identity) - - list, exist := c.api.GetStorage().GetEdge().Get(iid) - if !exist { - jww.ERROR.Printf("Preimage for %s does not exist", iid.String()) - return "" - } - - marshaled, err := json.Marshal(&list) - if err != nil { - jww.ERROR.Printf("Error marshaling preimages: %s", err.Error()) - return "" - } - - jww.DEBUG.Printf("Preimages size: %v %v %d", - reflect.TypeOf(marshaled).Align(), unsafe.Sizeof(marshaled), len(marshaled)) - return string(marshaled) -} diff --git a/bindings/registrationStatus.go b/bindings/registrationStatus.go deleted file mode 100644 index eab2590984413d014695f1489989ae805653fff3..0000000000000000000000000000000000000000 --- a/bindings/registrationStatus.go +++ /dev/null @@ -1,25 +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 bindings - -// NodeRegistrationsStatus structure for returning nodes registration statuses -// for bindings. -type NodeRegistrationsStatus struct { - registered int - total int -} - -// GetRegistered returns the number of nodes registered with the client. -func (nrs *NodeRegistrationsStatus) GetRegistered() int { - return nrs.registered -} - -// GetTotal return the total of nodes currently in the network. -func (nrs *NodeRegistrationsStatus) GetTotal() int { - return nrs.total -} diff --git a/bindings/restlike.go b/bindings/restlike.go new file mode 100644 index 0000000000000000000000000000000000000000..7d7e649310d47d8fb4b28f7091569b195e131b83 --- /dev/null +++ b/bindings/restlike.go @@ -0,0 +1,118 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2022 Privategrity Corporation / +// / +// All rights reserved. / +//////////////////////////////////////////////////////////////////////////////// + +package bindings + +import ( + "encoding/json" + "gitlab.com/elixxir/client/e2e" + "gitlab.com/elixxir/client/restlike" + "gitlab.com/elixxir/client/restlike/connect" +) + +// RestlikeMessage is the bindings representation of a restlike.Message +// Example marshalled RestlikeMessage: +//{"Version":1, +// "Headers":"Y29udGVudHM6YXBwbGljYXRpb24vanNvbg==", +// "Content":"VGhpcyBpcyBhIHJlc3RsaWtlIG1lc3NhZ2U=", +// "Method":2, +// "URI":"xx://CmixRestlike/rest", +// "Error":""} +type RestlikeMessage struct { + Version uint32 + Headers []byte + Content []byte + Method int + URI string + Error string +} + +// RestlikeRequest performs a normal restlike request +// request - marshalled RestlikeMessage +// Returns marshalled result RestlikeMessage +func RestlikeRequest(clientID int, connectionID int, request []byte) ([]byte, error) { + cl, err := clientTrackerSingleton.get(clientID) + if err != nil { + return nil, err + } + conn, err := connectionTrackerSingleton.get(connectionID) + if err != nil { + return nil, err + } + + msg := &RestlikeMessage{} + err = json.Unmarshal(request, msg) + if err != nil { + return nil, err + } + + c := connect.Request{ + Net: conn.connection, + Rng: cl.api.GetRng().GetStream(), + E2eGrp: nil, + } + + result, err := c.Request(restlike.Method(msg.Method), restlike.URI(msg.URI), msg.Content, &restlike.Headers{ + Headers: msg.Headers, + Version: msg.Version, + }, e2e.GetDefaultParams()) + if err != nil { + return nil, err + } + + respMessage := &RestlikeMessage{ + Version: result.Headers.Version, + Headers: result.Headers.Headers, + Content: result.Content, + Method: int(result.Method), + URI: result.Uri, + Error: result.Error, + } + return json.Marshal(respMessage) +} + +// RestlikeRequestAuth performs an authenticated restlike request +// request - marshalled RestlikeMessage +// Returns marshalled result RestlikeMessage +func RestlikeRequestAuth(clientID int, authConnectionID int, request []byte) ([]byte, error) { + cl, err := clientTrackerSingleton.get(clientID) + if err != nil { + return nil, err + } + auth, err := authenticatedConnectionTrackerSingleton.get(authConnectionID) + if err != nil { + return nil, err + } + + msg := &RestlikeMessage{} + err = json.Unmarshal(request, msg) + if err != nil { + return nil, err + } + + c := connect.Request{ + Net: auth.connection, + Rng: cl.api.GetRng().GetStream(), + E2eGrp: nil, + } + + result, err := c.Request(restlike.Method(msg.Method), restlike.URI(msg.URI), msg.Content, &restlike.Headers{ + Headers: msg.Headers, + Version: msg.Version, + }, e2e.GetDefaultParams()) + if err != nil { + return nil, err + } + respMessage := &RestlikeMessage{ + Version: result.Headers.Version, + Headers: result.Headers.Headers, + Content: result.Content, + Method: int(result.Method), + URI: result.Uri, + Error: result.Error, + } + return json.Marshal(respMessage) +} diff --git a/bindings/restoreContacts.go b/bindings/restoreContacts.go deleted file mode 100644 index b970c77a2ed8cbf5664f76a6754904edb9b8d0f0..0000000000000000000000000000000000000000 --- a/bindings/restoreContacts.go +++ /dev/null @@ -1,90 +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 bindings - -import ( - "gitlab.com/elixxir/client/xxmutils" - "gitlab.com/xx_network/primitives/id" -) - -// RestoreContactsUpdater interface provides a callback function -// for receiving update information from RestoreContactsFromBackup. -type RestoreContactsUpdater interface { - // RestoreContactsCallback is called to report the current # of contacts - // that have been found and how many have been restored - // against the total number that need to be - // processed. If an error occurs it it set on the err variable as a - // plain string. - RestoreContactsCallback(numFound, numRestored, total int, err string) -} - -// RestoreContactsReport is a gomobile friendly report structure -// for determining which IDs restored, which failed, and why. -type RestoreContactsReport struct { - restored []*id.ID - failed []*id.ID - errs []error - restErr error -} - -// LenRestored returns the length of ID's restored. -func (r *RestoreContactsReport) LenRestored() int { - return len(r.restored) -} - -// LenFailed returns the length of the ID's failed. -func (r *RestoreContactsReport) LenFailed() int { - return len(r.failed) -} - -// GetRestoredAt returns the restored ID at index -func (r *RestoreContactsReport) GetRestoredAt(index int) []byte { - return r.restored[index].Bytes() -} - -// GetFailedAt returns the failed ID at index -func (r *RestoreContactsReport) GetFailedAt(index int) []byte { - return r.failed[index].Bytes() -} - -// GetErrorAt returns the error string at index -func (r *RestoreContactsReport) GetErrorAt(index int) string { - return r.errs[index].Error() -} - -// GetRestoreContactsError returns an error string. Empty if no error. -func (r *RestoreContactsReport) GetRestoreContactsError() string { - if r.restErr == nil { - return "" - } - return r.restErr.Error() -} - -// RestoreContactsFromBackup takes as input the jason output of the -// `NewClientFromBackup` function, unmarshals it into IDs, looks up -// each ID in user discovery, and initiates a session reset request. -// This function will not return until every id in the list has been sent a -// request. It should be called again and again until it completes. -// 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 *Client, - udManager *UserDiscovery, - updatesCb RestoreContactsUpdater) *RestoreContactsReport { - - restored, failed, errs, err := xxmutils.RestoreContactsFromBackup( - backupPartnerIDs, &client.api, udManager.ud, updatesCb) - - return &RestoreContactsReport{ - restored: restored, - failed: failed, - errs: errs, - restErr: err, - } - -} diff --git a/bindings/secrets.go b/bindings/secrets.go index 5bdeeed03c35cf6e0af99b8a64aaf54f213e8a23..f5f23eadd16beb8651a5d4a083801ac802b566ef 100644 --- a/bindings/secrets.go +++ b/bindings/secrets.go @@ -1,10 +1,3 @@ -/////////////////////////////////////////////////////////////////////////////// -// 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 20e1a7d51f1b182fc44df8902e85d462b615b64b..c2422a319986881ff9567d37d8090d3e0230188c 100644 --- a/bindings/secrets_test.go +++ b/bindings/secrets_test.go @@ -1,9 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////////////////// -// 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/send.go b/bindings/send.go deleted file mode 100644 index 3b85a34b0f05fe6f119a7d45ffe4f195604fb8e3..0000000000000000000000000000000000000000 --- a/bindings/send.go +++ /dev/null @@ -1,241 +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 bindings - -import ( - "encoding/json" - "errors" - "fmt" - "gitlab.com/elixxir/client/interfaces/message" - "gitlab.com/elixxir/client/interfaces/params" - "gitlab.com/elixxir/crypto/e2e" - "gitlab.com/xx_network/primitives/id" - "time" -) - -// SendCMIX sends a "raw" CMIX message payload to the provided -// recipient. Note that both SendE2E and SendUnsafe call SendCMIX. -// Returns the round ID of the round the payload was sent or an error -// if it fails. - -// This will return an error if: -// - the recipient ID is invalid -// - the contents are too long for the message structure -// - the message cannot be sent - -// This will return the round the message was sent on if it is successfully sent -// This can be used to register a round event to learn about message delivery. -// on failure a round id of -1 is returned -func (c *Client) SendCmix(recipient, contents []byte, parameters string) (int, error) { - p, err := params.GetCMIXParameters(parameters) - if err != nil { - return -1, errors.New(fmt.Sprintf("Failed to sendCmix: %+v", - err)) - } - - u, err := id.Unmarshal(recipient) - if err != nil { - return -1, errors.New(fmt.Sprintf("Failed to sendCmix: %+v", - err)) - } - - msg, err := c.api.NewCMIXMessage(contents) - if err != nil { - return -1, errors.New(fmt.Sprintf("Failed to sendCmix: %+v", - err)) - } - - rid, _, err := c.api.SendCMIX(msg, u, p) - if err != nil { - return -1, errors.New(fmt.Sprintf("Failed to sendCmix: %+v", - err)) - } - return int(rid), nil -} - -// SendManyCMIX sends many "raw" CMIX message payloads to each of the -// provided recipients. Used for group chat functionality. Returns the -// round ID of the round the payload was sent or an error if it fails. -// This will return an error if: -// - any recipient ID is invalid -// - any of the the message contents are too long for the message structure -// - the message cannot be sent - -// This will return the round the message was sent on if it is successfully sent -// This can be used to register a round event to learn about message delivery. -// on failure a round id of -1 is returned -// fixme: cannot use a slice of slices over bindings. Will need to modify this function once -// a proper input format has been specified -// func (c *Client) SendManyCMIX(recipients, contents [][]byte, parameters string) (int, error) { -// -// p, err := params.GetCMIXParameters(parameters) -// if err != nil { -// return -1, errors.New(fmt.Sprintf("Failed to sendCmix: %+v", -// err)) -// } -// -// // Build messages -// messages := make(map[id.ID]format.Message, len(contents)) -// for i := 0; i < len(contents); i++ { -// msg, err := c.api.NewCMIXMessage(contents[i]) -// if err != nil { -// return -1, errors.New(fmt.Sprintf("Failed to sendCmix: %+v", -// err)) -// } -// -// u, err := id.Unmarshal(recipients[i]) -// if err != nil { -// return -1, errors.New(fmt.Sprintf("Failed to sendCmix: %+v", -// err)) -// } -// -// messages[*u] = msg -// } -// -// rid, _, err := c.api.SendManyCMIX(messages, p) -// if err != nil { -// return -1, errors.New(fmt.Sprintf("Failed to sendCmix: %+v", -// err)) -// } -// return int(rid), nil -// } - -// SendUnsafe sends an unencrypted payload to the provided recipient -// with the provided msgType. Returns the list of rounds in which parts -// of the message were sent or an error if it fails. -// NOTE: Do not use this function unless you know what you are doing. -// This function always produces an error message in client logging. -// -// Message Types can be found in client/interfaces/message/type.go -// Make sure to not conflict with ANY default message types with custom types -func (c *Client) SendUnsafe(recipient, payload []byte, - messageType int, parameters string) (*RoundList, error) { - p, err := params.GetUnsafeParameters(parameters) - if err != nil { - return nil, errors.New(fmt.Sprintf("Failed to sendUnsafe: %+v", - err)) - } - u, err := id.Unmarshal(recipient) - if err != nil { - return nil, errors.New(fmt.Sprintf("Failed to sendUnsafe: %+v", - err)) - } - - m := message.Send{ - Recipient: u, - Payload: payload, - MessageType: message.Type(messageType), - } - - rids, err := c.api.SendUnsafe(m, p) - if err != nil { - return nil, errors.New(fmt.Sprintf("Failed to sendUnsafe: %+v", - err)) - } - - return &RoundList{list: rids}, nil -} - -// SendE2E sends an end-to-end payload to the provided recipient with -// the provided msgType. Returns the list of rounds in which parts of -// the message were sent or an error if it fails. -// -// Message Types can be found in client/interfaces/message/type.go -// Make sure to not conflict with ANY default message types -func (c *Client) SendE2E(recipient, payload []byte, messageType int, parameters string) (*SendReport, error) { - p, err := params.GetE2EParameters(parameters) - if err != nil { - return nil, errors.New(fmt.Sprintf("Failed SendE2E: %+v", err)) - } - - u, err := id.Unmarshal(recipient) - if err != nil { - return nil, errors.New(fmt.Sprintf("Failed SendE2E: %+v", err)) - } - - m := message.Send{ - Recipient: u, - Payload: payload, - MessageType: message.Type(messageType), - } - - rids, mid, ts, err := c.api.SendE2E(m, p) - if err != nil { - return nil, errors.New(fmt.Sprintf("Failed SendE2E: %+v", err)) - } - - sr := SendReport{ - rl: &RoundList{list: rids}, - mid: mid, - ts: ts, - } - - return &sr, nil -} - -// the send report is the mechanisim by which sendE2E returns a single -type SendReport struct { - rl *RoundList - mid e2e.MessageID - ts time.Time -} - -type SendReportDisk struct { - List []id.Round - Mid []byte - Ts int64 -} - -func (sr *SendReport) GetRoundList() *RoundList { - return sr.rl -} - -func (sr *SendReport) GetMessageID() []byte { - return sr.mid[:] -} - -func (sr *SendReport) GetRoundURL() string { - if sr.rl != nil && sr.rl.Len() > 0 { - return getRoundURL(sr.rl.list[0]) - } - return dashboardBaseURL -} - -// GetTimestampMS returns the message's timestamp in milliseconds -func (sr *SendReport) GetTimestampMS() int64 { - ts := sr.ts.UnixNano() - ts = (ts + 500000) / 1000000 - return ts -} - -// GetTimestampNano returns the message's timestamp in nanoseconds -func (sr *SendReport) GetTimestampNano() int64 { - return sr.ts.UnixNano() -} - -func (sr *SendReport) Marshal() ([]byte, error) { - srd := SendReportDisk{ - List: sr.rl.list, - Mid: sr.mid[:], - Ts: sr.ts.UnixNano(), - } - return json.Marshal(&srd) -} - -func (sr *SendReport) Unmarshal(b []byte) error { - srd := SendReportDisk{} - if err := json.Unmarshal(b, &srd); err != nil { - return errors.New(fmt.Sprintf("Failed to unmarshal send "+ - "report: %s", err.Error())) - } - - copy(sr.mid[:], srd.Mid) - sr.rl = &RoundList{list: srd.List} - sr.ts = time.Unix(0, srd.Ts) - return nil -} diff --git a/bindings/timeNow.go b/bindings/timeNow.go deleted file mode 100644 index fc457b459ae43452a1920c26a8b9e24c53725d74..0000000000000000000000000000000000000000 --- a/bindings/timeNow.go +++ /dev/null @@ -1,24 +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 bindings - -import ( - "gitlab.com/xx_network/primitives/netTime" - "time" -) - -type TimeSource interface { - NowMs() int64 -} - -// SetTimeSource sets the network time to a custom source. -func SetTimeSource(timeNow TimeSource) { - netTime.Now = func() time.Time { - return time.Unix(0, timeNow.NowMs()*int64(time.Millisecond)) - } -} diff --git a/bindings/ud.go b/bindings/ud.go deleted file mode 100644 index ea8f5390abb2b749d14c50b10ec21b9bf8e596d5..0000000000000000000000000000000000000000 --- a/bindings/ud.go +++ /dev/null @@ -1,505 +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 bindings - -import ( - "fmt" - jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/cmix" - "gitlab.com/elixxir/client/single" - "time" - - "github.com/pkg/errors" - udPackage "gitlab.com/elixxir/client/ud" - "gitlab.com/elixxir/crypto/contact" - "gitlab.com/elixxir/primitives/fact" - "gitlab.com/xx_network/primitives/id" -) - -// This package wraps the user discovery system - -type UserDiscovery struct { - ud *udPackage.Manager -} - -// NewUserDiscovery returns a new user discovery object. Only call this once. -// It must be called after StartNetworkFollower is called and will fail if the -// network has never been contacted. This will auto-register with the -// UD service. You should only call this on the first instantiation of the user -// discovery manager. -// This function technically has a memory leak because it causes both sides of -// the bindings to think the other is in charge of the client object. -// In general this is not an issue because the client object should exist -// for the life of the program. -// This must be called while start network follower is running. -func NewUserDiscovery(client *Client, username string) (*UserDiscovery, error) { - stream := client.api.GetRng().GetStream() - defer stream.Close() - m, err := udPackage.NewManager(client.api.GetNetworkInterface(), - client.api.GetE2EHandler(), client.api.NetworkFollowerStatus, - client.api.GetEventReporter(), - client.api.GetComms(), client.api.GetStorage(), - stream, - username, client.api.GetStorage().GetKV()) - - if err != nil { - return nil, errors.WithMessage(err, - "Failed to create User Discovery Manager") - } else { - return &UserDiscovery{ud: m}, nil - } -} - -// LoadUserDiscovery loads the state of the UserDiscovery manager -// from disk. This is meant to be called after any app restart after the first -// instantiation of the manager by NewUserDiscovery. -func LoadUserDiscovery(client *Client) (*UserDiscovery, error) { - m, err := udPackage.LoadManager(client.api.GetNetworkInterface(), - client.api.GetE2EHandler(), client.api.GetEventReporter(), - client.api.GetComms(), client.api.GetStorage(), - client.api.GetStorage().GetKV()) - - if err != nil { - return nil, errors.WithMessage(err, - "Failed to load User Discovery Manager") - } else { - return &UserDiscovery{ud: m}, nil - } -} - -// NewUserDiscoveryFromBackup returns a new user discovery object. It -// wil set up the manager with the backup data. Pass into it the backed up -// facts, one email and phone number each. This will add the registered facts -// to the backed Store. Any one of these fields may be empty, -// however both fields being empty will cause an error. Any other fact that is not -// an email or phone number will return an error. You may only add a fact for the -// accepted types once each. If you attempt to back up a fact type that has already -// been backed up, an error will be returned. Anytime an error is returned, it means -// the backup was not successful. -// NOTE: Do not use this as a direct store operation. This feature is intended to add facts -// to a backend store that have ALREADY BEEN REGISTERED on the account. -// THIS IS NOT FOR ADDING NEWLY REGISTERED FACTS. That is handled on the backend. -// Only call this once. It must be called after StartNetworkFollower -// is called and will fail if the network has never been contacted. -// This function technically has a memory leak because it causes both sides of -// the bindings to think the other is in charge of the client object. -// In general this is not an issue because the client object should exist -// for the life of the program. -// This must be called while start network follower is running. -func NewUserDiscoveryFromBackup(client *Client, - email, phone string) (*UserDiscovery, error) { - - var emailFact, phoneFact fact.Fact - var err error - // Parse email as a fact, if it exists - if len(email) > 2 { - emailFact, err = fact.UnstringifyFact(email) - if err != nil { - return nil, errors.WithMessagef(err, - "Failed to parse malformed email fact: %s", email) - } - } else { - jww.WARN.Printf("Loading manager without a registered email") - } - - // Parse phone number as a fact, if it exists - if len(phone) > 2 { - phoneFact, err = fact.UnstringifyFact(phone) - if err != nil { - return nil, errors.WithMessagef(err, "Failed to parse "+ - "stringified phone fact %q", phone) - } - } else { - jww.WARN.Printf("Loading manager without a " + - "registered phone number") - } - - m, err := udPackage.NewManagerFromBackup(client.api.GetNetworkInterface(), - client.api.GetE2EHandler(), client.api.NetworkFollowerStatus, - client.api.GetEventReporter(), client.api.GetComms(), - client.api.GetStorage(), emailFact, phoneFact, - client.api.GetStorage().GetKV()) - if err != nil { - return nil, errors.WithMessage(err, - "Failed to create User Discovery Manager") - } else { - return &UserDiscovery{ud: m}, nil - } -} - -// AddFact adds a fact for the user to user discovery. Will only succeed if the -// user is already registered and the system does not have the fact currently -// registered for any user. -// Will fail if the fact string is not well formed. -// This does not complete the fact registration process, it returns a -// confirmation id instead. Over the communications system the fact is -// associated with, a code will be sent. This confirmation ID needs to be -// called along with the code to finalize the fact. -func (ud *UserDiscovery) AddFact(fStr string) (string, error) { - f, err := fact.UnstringifyFact(fStr) - if err != nil { - return "", errors.WithMessage(err, "Failed to add due to "+ - "malformed fact") - } - - return ud.ud.SendRegisterFact(f) -} - -// ConfirmFact confirms a fact first registered via AddFact. -// The confirmation ID comes from AddFact while the code will come over the -// associated communications system -func (ud *UserDiscovery) ConfirmFact(confirmationID, code string) error { - return ud.ud.ConfirmFact(confirmationID, code) -} - -// RemoveFact removes a previously confirmed fact. Will fail if the -// passed fact string is not well-formed or if the fact is not associated -// with this client. Users cannot remove username facts and must instead -// remove the user. -func (ud *UserDiscovery) RemoveFact(fStr string) error { - f, err := fact.UnstringifyFact(fStr) - if err != nil { - return errors.WithMessage(err, "Failed to remove due to "+ - "malformed fact") - } - return ud.ud.RemoveFact(f) -} - -// PermanentDeleteAccount deletes a user. The fact sent must be the username. -// This function preserves the username forever and makes it -// unusable. -func (ud *UserDiscovery) PermanentDeleteAccount(fStr string) error { - f, err := fact.UnstringifyFact(fStr) - if err != nil { - return errors.WithMessage(err, "Failed to remove due to "+ - "malformed fact") - } - return ud.ud.PermanentDeleteAccount(f) -} - -// SearchCallback returns the result of a search -type SearchCallback interface { - Callback(contacts *ContactList, error string) -} - -const maxSearchMessages = 20 - -// Search for the passed Facts. The factList is the stringification of a -// fact list object, look at /bindings/list.go for more on that object. -// This will reject if that object is malformed. The SearchCallback will return -// a list of contacts, each having the facts it hit against. -// This is NOT intended to be used to search for multiple users at once, that -// can have a privacy reduction. Instead, it is intended to be used to search -// for a user where multiple pieces of information is known. -func (ud UserDiscovery) Search(client *Client, - fl string, callback SearchCallback, - timeoutMS int) ([]int, error) { - factList, _, err := fact.UnstringifyFactList(fl) - if err != nil { - return []int{}, errors.WithMessage(err, "Failed to search due to "+ - "malformed fact list") - } - timeout := time.Duration(timeoutMS) * time.Millisecond - cb := func(cl []contact.Contact, err error) { - var contactList *ContactList - var errStr string - if err == nil { - contactList = &ContactList{list: cl} - } else { - errStr = err.Error() - } - callback.Callback(contactList, errStr) - } - - udContact, err := ud.ud.GetContact() - if err != nil { - return []int{}, errors.WithMessage(err, "Failed to get user discovery "+ - "contact object") - } - - stream := client.api.GetRng().GetStream() - defer stream.Close() - - p := single.RequestParams{ - Timeout: timeout, - MaxResponseMessages: maxSearchMessages, - CmixParam: cmix.GetDefaultCMIXParams(), - } - - rids, _, err := udPackage.Search( - client.api.GetNetworkInterface(), client.api.GetEventReporter(), - stream, client.api.GetE2EHandler().GetGroup(), udContact, - cb, factList, p) - - if err != nil { - return []int{}, errors.WithMessagef(err, - "Failed to search for facts %q", factList.Stringify()) - } - - return convertRoundIdSliceToIntSlice(rids), nil -} - -// SingleSearchCallback returns the result of a single search -type SingleSearchCallback interface { - Callback(contact *Contact, error string) -} - -// SearchSingle searches for the passed Facts. The fact is the stringification of a -// fact object, look at /bindings/contact.go for more on that object. -// This will reject if that object is malformed. The SearchCallback will return -// a list of contacts, each having the facts it hit against. -// This only searches for a single fact at a time. It is intended to make some -// simple use cases of the API easier. -func (ud UserDiscovery) SearchSingle(client *Client, f string, callback SingleSearchCallback, - timeoutMS int) ([]int, error) { - fObj, err := fact.UnstringifyFact(f) - if err != nil { - return []int{}, errors.WithMessage(err, "Failed to single search due "+ - "to malformed fact") - } - timeout := time.Duration(timeoutMS) * time.Millisecond - cb := func(cl []contact.Contact, err error) { - var c *Contact - var errStr string - if err == nil { - c = &Contact{c: &cl[0]} - } else { - errStr = err.Error() - } - callback.Callback(c, errStr) - } - udContact, err := ud.ud.GetContact() - if err != nil { - return []int{}, errors.WithMessage(err, "Failed to get user discovery "+ - "contact object") - } - - stream := client.api.GetRng().GetStream() - defer stream.Close() - - p := single.RequestParams{ - Timeout: timeout, - MaxResponseMessages: maxSearchMessages, - CmixParam: cmix.GetDefaultCMIXParams(), - } - - rids, _, err := udPackage.Search(client.api.GetNetworkInterface(), - client.api.GetEventReporter(), - stream, client.api.GetE2EHandler().GetGroup(), udContact, - cb, []fact.Fact{fObj}, p) - - if err != nil { - return []int{}, errors.WithMessagef(err, - "Failed to Search (single) for fact %q", fObj.Stringify()) - } - - return convertRoundIdSliceToIntSlice(rids), nil -} - -// LookupCallback returns the result of a single lookup -type LookupCallback interface { - Callback(contact *Contact, error string) -} - -// convertRoundIdSliceToIntSlice is a helper function which -// converts a slice of id.Round to a slice of integers. -func convertRoundIdSliceToIntSlice(rids []id.Round) []int { - ridInts := make([]int, 0) - for _, rid := range rids { - ridInts = append(ridInts, int(rid)) - } - - return ridInts -} - -// maxLookupMessages is the maximum responses that may be received for a -// single Lookup request. -const maxLookupMessages = 20 - -// Lookup the contact object associated with the given userID. The -// id is the byte representation of an id. -// This will reject if that id is malformed. The LookupCallback will return -// the associated contact if it exists. -func (ud UserDiscovery) Lookup(client *Client, - idBytes []byte, callback LookupCallback, - timeoutMS int) ([]int, error) { - - uid, err := id.Unmarshal(idBytes) - if err != nil { - return []int{}, errors.WithMessage(err, "Failed to lookup due to "+ - "malformed id") - } - - timeout := time.Duration(timeoutMS) * time.Millisecond - cb := func(cl contact.Contact, err error) { - var c *Contact - var errStr string - if err == nil { - c = &Contact{c: &cl} - } else { - errStr = err.Error() - } - callback.Callback(c, errStr) - } - - // Retrieve user discovery contact object - udContact, err := ud.ud.GetContact() - if err != nil { - return []int{}, errors.WithMessage(err, - "Failed to get user discovery "+ - "contact object") - } - - stream := client.api.GetRng().GetStream() - defer stream.Close() - - p := single.RequestParams{ - Timeout: timeout, - MaxResponseMessages: maxLookupMessages, - CmixParam: cmix.GetDefaultCMIXParams(), - } - - rid, _, err := udPackage.Lookup(client.api.GetNetworkInterface(), - stream, client.api.GetE2EHandler().GetGroup(), - udContact, - cb, uid, p) - - if err != nil { - return []int{}, errors.WithMessagef(err, - "Failed to lookup ID %q", uid) - } - - return convertRoundIdSliceToIntSlice(rid), nil - -} - -// MultiLookupCallback returns the result of many parallel lookups -type MultiLookupCallback interface { - Callback(Succeeded *ContactList, failed *IdList, errors string) -} - -type lookupResponse struct { - C contact.Contact - err error - index int - id *id.ID -} - -// MultiLookup Looks for the contact object associated with all given userIDs. -// The ids are the byte representation of an id stored in an IDList object. -// This will reject if that id is malformed or if the indexing on the IDList -// object is wrong. The MultiLookupCallback will return with all contacts -// returned within the timeout. -func (ud UserDiscovery) MultiLookup(client *Client, - ids *IdList, callback MultiLookupCallback, - timeoutMS int) error { - - idList := make([]*id.ID, 0, ids.Len()) - - //extract all IDs from - for i := 0; i < ids.Len(); i++ { - idBytes, err := ids.Get(i) - if err != nil { - return errors.WithMessagef(err, "Failed to get ID at index %d", i) - } - uid, err := id.Unmarshal(idBytes) - if err != nil { - return errors.WithMessagef(err, "Failed to lookup due to "+ - "malformed id at index %d", i) - } - idList = append(idList, uid) - } - - //make the channels for the requests - results := make(chan lookupResponse, len(idList)) - - timeout := time.Duration(timeoutMS) * time.Millisecond - - p := single.RequestParams{ - Timeout: timeout, - MaxResponseMessages: maxLookupMessages, - CmixParam: cmix.GetDefaultCMIXParams(), - } - - // Retrieve user discovery contact object - udContact, err := ud.ud.GetContact() - if err != nil { - return errors.WithMessage(err, - "Failed to get user discovery "+ - "contact object") - } - - //loop through the IDs and send the lookup - for i := range idList { - locali := i - localID := idList[locali] - cb := func(c contact.Contact, err error) { - results <- lookupResponse{ - C: c, - err: err, - index: locali, - id: localID, - } - } - - go func() { - stream := client.api.GetRng().GetStream() - defer stream.Close() - _, _, err := udPackage.Lookup(client.api.GetNetworkInterface(), - stream, client.api.GetE2EHandler().GetGroup(), - udContact, cb, localID, p) - if err != nil { - results <- lookupResponse{ - C: contact.Contact{}, - err: errors.WithMessagef(err, "Failed to send lookup "+ - "for user %s[%d]", localID, locali), - index: locali, - id: localID, - } - } - }() - } - - //run the result gathering in its own thread - go func() { - returnedContactList := make([]contact.Contact, 0, len(idList)) - failedIDList := make([]*id.ID, 0, len(idList)) - var concatonatedErrs string - - //get the responses and return - for numReturned := 0; numReturned < len(idList); numReturned++ { - response := <-results - if response.err == nil { - returnedContactList = append(returnedContactList, response.C) - } else { - failedIDList = append(failedIDList, response.id) - concatonatedErrs = concatonatedErrs + fmt.Sprintf("Error returned from "+ - "send to %d [%d]:%+v\t", response.id, response.index, response.err) - } - } - - callback.Callback(&ContactList{list: returnedContactList}, &IdList{list: failedIDList}, concatonatedErrs) - }() - - return nil -} - -// SetAlternativeUserDiscovery sets the alternativeUd object within manager. -// Once set, any user discovery operation will go through the alternative -// user discovery service. -// To undo this operation, use UnsetAlternativeUserDiscovery. -// The contact file is the already read in bytes, not the file path for the contact file. -func (ud *UserDiscovery) SetAlternativeUserDiscovery(address, cert, contactFile []byte) error { - return ud.ud.SetAlternativeUserDiscovery(cert, address, contactFile) -} - -// UnsetAlternativeUserDiscovery clears out the information from -// the Manager object. -func (ud *UserDiscovery) UnsetAlternativeUserDiscovery() error { - return ud.ud.UnsetAlternativeUserDiscovery() -} diff --git a/bindings/url.go b/bindings/url.go deleted file mode 100644 index f561540f3ecf89fb1b67e139549208884fe46779..0000000000000000000000000000000000000000 --- a/bindings/url.go +++ /dev/null @@ -1,19 +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 bindings - -import ( - "fmt" - "gitlab.com/xx_network/primitives/id" -) - -const dashboardBaseURL = "https://dashboard.xx.network" - -func getRoundURL(round id.Round) string { - return fmt.Sprintf("%s/rounds/%d?xxmessenger=true", dashboardBaseURL, round) -} diff --git a/bindings/user.go b/bindings/user.go deleted file mode 100644 index c049eaeb141d9b19b2acb8772303edf2ba7c6ed9..0000000000000000000000000000000000000000 --- a/bindings/user.go +++ /dev/null @@ -1,66 +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 bindings - -import ( - "gitlab.com/elixxir/client/interfaces/user" - "gitlab.com/xx_network/crypto/signature/rsa" -) - -type User struct { - u *user.Info -} - -func (u *User) GetTransmissionID() []byte { - return u.u.TransmissionID.Marshal() -} - -func (u *User) GetReceptionID() []byte { - return u.u.ReceptionID.Marshal() -} - -func (u *User) GetTransmissionSalt() []byte { - return u.u.TransmissionSalt -} - -func (u *User) GetReceptionSalt() []byte { - return u.u.ReceptionSalt -} - -func (u *User) GetTransmissionRSAPrivateKeyPem() []byte { - return rsa.CreatePrivateKeyPem(u.u.TransmissionRSA) -} - -func (u *User) GetTransmissionRSAPublicKeyPem() []byte { - return rsa.CreatePublicKeyPem(u.u.TransmissionRSA.GetPublic()) -} - -func (u *User) GetReceptionRSAPrivateKeyPem() []byte { - return rsa.CreatePrivateKeyPem(u.u.ReceptionRSA) -} - -func (u *User) GetReceptionRSAPublicKeyPem() []byte { - return rsa.CreatePublicKeyPem(u.u.ReceptionRSA.GetPublic()) -} - -func (u *User) IsPrecanned() bool { - return u.u.Precanned -} - -func (u *User) GetE2EDhPrivateKey() []byte { - return u.u.E2eDhPrivateKey.Bytes() -} - -func (u *User) GetE2EDhPublicKey() []byte { - return u.u.E2eDhPublicKey.Bytes() -} - -func (u *User) GetContact() *Contact { - c := u.u.GetContact() - return &Contact{c: &c} -} diff --git a/bindings/utilities.go b/bindings/utilities.go new file mode 100644 index 0000000000000000000000000000000000000000..96c7b346e6a920109d5678fa9802fe5fdfa37435 --- /dev/null +++ b/bindings/utilities.go @@ -0,0 +1,72 @@ +package bindings + +import ( + "fmt" + "github.com/pkg/errors" + jww "github.com/spf13/jwalterweatherman" + "google.golang.org/grpc/grpclog" +) + +// sets level of logging. All logs the set level and above will be displayed +// options are: +// TRACE - 0 +// DEBUG - 1 +// INFO - 2 +// WARN - 3 +// ERROR - 4 +// CRITICAL - 5 +// FATAL - 6 +// The default state without updates is: INFO +func LogLevel(level int) error { + if level < 0 || level > 6 { + return errors.New(fmt.Sprintf("log level is not valid: log level: %d", level)) + } + + threshold := jww.Threshold(level) + jww.SetLogThreshold(threshold) + jww.SetStdoutThreshold(threshold) + + switch threshold { + case jww.LevelTrace: + fallthrough + case jww.LevelDebug: + fallthrough + case jww.LevelInfo: + jww.INFO.Printf("Log level set to: %s", threshold) + case jww.LevelWarn: + jww.WARN.Printf("Log level set to: %s", threshold) + case jww.LevelError: + jww.ERROR.Printf("Log level set to: %s", threshold) + case jww.LevelCritical: + jww.CRITICAL.Printf("Log level set to: %s", threshold) + case jww.LevelFatal: + jww.FATAL.Printf("Log level set to: %s", threshold) + } + + return nil +} + +type LogWriter interface { + Log(string) +} + +//RegisterLogWriter registers a callback on which logs are written. +func RegisterLogWriter(writer LogWriter) { + jww.SetLogOutput(&writerAdapter{lw: writer}) +} + +// EnableGrpcLogs sets GRPC trace logging +func EnableGrpcLogs(writer LogWriter) { + logger := &writerAdapter{lw: writer} + grpclog.SetLoggerV2(grpclog.NewLoggerV2WithVerbosity( + logger, logger, logger, 99)) +} + +type writerAdapter struct { + lw LogWriter +} + +func (wa *writerAdapter) Write(p []byte) (n int, err error) { + wa.lw.Log(string(p)) + return len(p), nil +} diff --git a/bindings/utils.go b/bindings/utils.go deleted file mode 100644 index 93afd4aab7bbf66970f9041551c3c32f6bdf19a7..0000000000000000000000000000000000000000 --- a/bindings/utils.go +++ /dev/null @@ -1,23 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Copyright © 2021 Privategrity Corporation / -// / -// All rights reserved. / -//////////////////////////////////////////////////////////////////////////////// - -// Provides various utility functions for access over the bindings - -package bindings - -import "gitlab.com/elixxir/client/api" - -// CompressJpeg takes a JPEG image in byte format -// and compresses it based on desired output size -func CompressJpeg(imgBytes []byte) ([]byte, error) { - return api.CompressJpeg(imgBytes) -} - -// CompressJpegForPreview takes a JPEG image in byte format -// and compresses it based on desired output size -func CompressJpegForPreview(imgBytes []byte) ([]byte, error) { - return api.CompressJpegForPreview(imgBytes) -} diff --git a/bindings/version.go b/bindings/version.go index ec517de07f5d262e8e761e85e39bcd68d83914b9..7e84bbd2ed1a0de0825e47a24e5e62ffa2f9f78a 100644 --- a/bindings/version.go +++ b/bindings/version.go @@ -1,3 +1,9 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2022 Privategrity Corporation / +// / +// All rights reserved. / +//////////////////////////////////////////////////////////////////////////////// + package bindings import "gitlab.com/elixxir/client/api" diff --git a/catalog/messageTypes.go b/catalog/messageTypes.go index 3d97e9eb5289179c460862f5ff27dce578bca886..1bd4d24cbea54ac7d164d9016dea0e7c35ac9835 100644 --- a/catalog/messageTypes.go +++ b/catalog/messageTypes.go @@ -1,5 +1,7 @@ package catalog +import "fmt" + type MessageType uint32 const MessageTypeLen = 32 / 8 @@ -72,6 +74,6 @@ func (mt MessageType) String() string { case ConnectionAuthenticationRequest: return "ConnectionAuthenticationRequest" default: - return "UNKNOWN TYPE" + return fmt.Sprintf("UNKNOWN TYPE (%d)", mt) } } diff --git a/cmd/broadcast.go b/cmd/broadcast.go index dde6480640ae9060008236c46e92017653851c8e..8b9ae2358d5e4b6b51d2dd15bc6b6e22e74e5c05 100644 --- a/cmd/broadcast.go +++ b/cmd/broadcast.go @@ -38,7 +38,7 @@ var broadcastCmd = &cobra.Command{ // Wait until connected or crash on timeout connected := make(chan bool, 10) - client.GetNetworkInterface().AddHealthCallback( + client.GetCmix().AddHealthCallback( func(isconnected bool) { connected <- isconnected }) @@ -147,7 +147,7 @@ var broadcastCmd = &cobra.Command{ receiveChan := make(chan []byte, 100) cb := func(payload []byte, receptionID receptionID.EphemeralIdentity, round rounds.Round) { - jww.INFO.Printf("Received symmetric message from %s over round %d", receptionID, round) + jww.INFO.Printf("Received symmetric message from %s over round %d", receptionID, round.ID) receiveChan <- payload } @@ -165,7 +165,7 @@ var broadcastCmd = &cobra.Command{ } // Connect to broadcast channel - bcl, err := broadcast.NewBroadcastChannel(*channel, cb, client.GetNetworkInterface(), client.GetRng(), broadcast.Param{Method: method}) + bcl, err := broadcast.NewBroadcastChannel(*channel, cb, client.GetCmix(), client.GetRng(), broadcast.Param{Method: method}) /* Create properly sized broadcast message */ message := viper.GetString("broadcast") diff --git a/cmd/callbacks.go b/cmd/callbacks.go index f6839fce01943fa98203b114c21a96a537647bdc..07a4c66acd68cd14601ea63d32d9a30ddce28b4f 100644 --- a/cmd/callbacks.go +++ b/cmd/callbacks.go @@ -10,9 +10,9 @@ package cmd import ( "fmt" + "gitlab.com/elixxir/client/api/messenger" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/api" "gitlab.com/elixxir/client/catalog" "gitlab.com/elixxir/client/cmix/identity/receptionID" "gitlab.com/elixxir/client/cmix/rounds" @@ -25,10 +25,10 @@ import ( type authCallbacks struct { autoConfirm bool confCh chan *id.ID - client *api.Client + client *messenger.Client } -func makeAuthCallbacks(client *api.Client, autoConfirm bool) *authCallbacks { +func makeAuthCallbacks(client *messenger.Client, autoConfirm bool) *authCallbacks { return &authCallbacks{ autoConfirm: autoConfirm, confCh: make(chan *id.ID, 10), @@ -46,7 +46,7 @@ func (a *authCallbacks) Request(requestor contact.Contact, if a.autoConfirm { jww.INFO.Printf("Channel Request: %s", requestor.ID) - _, err := a.client.ConfirmAuthenticatedChannel(requestor) + _, err := a.client.GetAuth().Confirm(requestor) if err != nil { jww.FATAL.Panicf("%+v", err) } @@ -71,9 +71,9 @@ func (a *authCallbacks) Reset(requestor contact.Contact, fmt.Printf(msg) } -func registerMessageListener(client *api.Client) chan receive.Message { +func registerMessageListener(client *messenger.Client) chan receive.Message { recvCh := make(chan receive.Message, 10000) - listenerID := client.RegisterListenerChannel("DefaultCLIReceiver", + listenerID := client.GetE2E().RegisterChannel("DefaultCLIReceiver", receive.AnyUser(), catalog.NoType, recvCh) jww.INFO.Printf("Message ListenerID: %v", listenerID) return recvCh diff --git a/cmd/fileTransfer.go b/cmd/fileTransfer.go index 78442b9afd575e44a111ea3976ecb8f8ddfef3ef..f09380f10c71289fc07fb05e0f7d7d77d27daa9b 100644 --- a/cmd/fileTransfer.go +++ b/cmd/fileTransfer.go @@ -9,14 +9,15 @@ package cmd import ( "fmt" + "gitlab.com/elixxir/client/api/messenger" "io/ioutil" "time" "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" - "gitlab.com/elixxir/client/api" - ft "gitlab.com/elixxir/client/fileTransfer" + ft "gitlab.com/elixxir/client/fileTransfer2" + ftE2e "gitlab.com/elixxir/client/fileTransfer2/e2e" "gitlab.com/elixxir/crypto/contact" ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" "gitlab.com/xx_network/primitives/id" @@ -54,9 +55,9 @@ var ftCmd = &cobra.Command{ // Wait until connected or crash on timeout connected := make(chan bool, 10) - client.GetNetworkInterface().AddHealthCallback( - func(isconnected bool) { - connected <- isconnected + client.GetCmix().AddHealthCallback( + func(isConnected bool) { + connected <- isConnected }) waitUntilConnected(connected) @@ -66,8 +67,8 @@ var ftCmd = &cobra.Command{ numReg, total, err = client.GetNodeRegistrationStatus() if err != nil { - jww.FATAL.Panicf("Failed to get node registration status: %+v", - err) + jww.FATAL.Panicf( + "Failed to get node registration status: %+v", err) } jww.INFO.Printf("Registering with nodes (%d/%d)...", numReg, total) @@ -131,8 +132,8 @@ 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 *api.Client, maxThroughput int) ( - ft.FileTransfer, chan receivedFtResults) { +func initFileTransferManager(client *messenger.Client, maxThroughput int) ( + *ftE2e.Wrapper, chan receivedFtResults) { // Create interfaces.ReceiveCallback that returns the results on a channel receiveChan := make(chan receivedFtResults, 100) @@ -150,8 +151,11 @@ func initFileTransferManager(client *api.Client, maxThroughput int) ( } // Create new manager - // TODO: Fix NewManager parameters - manager, err := ft.NewManager(receiveCB, p, nil, nil, nil, nil, nil) + manager, err := ft.NewManager(p, + client.GetUser().ReceptionID, + client.GetCmix(), + client.GetStorage().GetKV(), + client.GetRng()) if err != nil { jww.FATAL.Panicf( "[FT] Failed to create new file transfer manager: %+v", err) @@ -163,12 +167,20 @@ func initFileTransferManager(client *api.Client, maxThroughput int) ( jww.FATAL.Panicf("[FT] Failed to start file transfer threads: %+v", err) } - return manager, receiveChan + e2eParams := ftE2e.DefaultParams() + e2eFt, err := ftE2e.NewWrapper(receiveCB, e2eParams, manager, + client.GetUser().ReceptionID, client.GetE2E(), client.GetCmix()) + if err != nil { + jww.FATAL.Panicf( + "[FT] Failed to create new e2e file transfer wrapper: %+v", err) + } + + return e2eFt, receiveChan } // sendFile sends the file to the recipient and prints the progress. func sendFile(filePath, fileType, filePreviewPath, filePreviewString, - recipientContactPath string, retry float32, m ft.FileTransfer, + recipientContactPath string, retry float32, m *ftE2e.Wrapper, done chan struct{}) { // Get file from path @@ -205,7 +217,7 @@ func sendFile(filePath, fileType, filePreviewPath, filePreviewString, // Create sent progress callback that prints the results progressCB := func(completed bool, arrived, total uint16, - t ft.FilePartTracker, err error) { + st ft.SentTransfer, _ ft.FilePartTracker, err error) { jww.INFO.Printf("[FT] Sent progress callback for %q "+ "{completed: %t, arrived: %d, total: %d, err: %v}", fileName, completed, arrived, total, err) @@ -236,7 +248,7 @@ func sendFile(filePath, fileType, filePreviewPath, filePreviewString, sendStart = netTime.Now() // Send the file - tid, err := m.Send(fileName, fileType, fileData, recipient.ID, retry, + tid, err := m.Send(recipient.ID, fileName, fileType, fileData, retry, filePreviewData, progressCB, callbackPeriod) if err != nil { jww.FATAL.Panicf("[FT] Failed to send file %q to %s: %+v", @@ -251,7 +263,7 @@ func sendFile(filePath, fileType, filePreviewPath, filePreviewString, // receiveNewFileTransfers waits to receive new file transfers and prints its // information to the log. func receiveNewFileTransfers(receive chan receivedFtResults, done, - quit chan struct{}, m ft.FileTransfer) { + quit chan struct{}, m *ftE2e.Wrapper) { jww.INFO.Print("[FT] Starting thread waiting to receive NewFileTransfer " + "E2E message.") for { @@ -282,9 +294,9 @@ func receiveNewFileTransfers(receive chan receivedFtResults, done, // the results to the log. func newReceiveProgressCB(tid *ftCrypto.TransferID, fileName string, done chan struct{}, receiveStart time.Time, - m ft.FileTransfer) ft.ReceivedProgressCallback { + m *ftE2e.Wrapper) ft.ReceivedProgressCallback { return func(completed bool, received, total uint16, - t ft.FilePartTracker, err error) { + rt ft.ReceivedTransfer, t ft.FilePartTracker, err error) { jww.INFO.Printf("[FT] Receive progress callback for transfer %s "+ "{completed: %t, received: %d, total: %d, err: %v}", tid, completed, received, total, err) @@ -357,7 +369,7 @@ func init() { "File preview data. Set either this flag or filePreviewPath.") bindPFlagCheckErr("filePreviewString") - ftCmd.Flags().Int("maxThroughput", 0, + ftCmd.Flags().Int("maxThroughput", 1000, "Maximum data transfer speed to send file parts (in bytes per second)") bindPFlagCheckErr("maxThroughput") diff --git a/cmd/group.go b/cmd/group.go index df0c3902b838a644ab7403462bc47e149b240aa8..fce4f5989c733a0fe2b7fa3f72ab625d29797698 100644 --- a/cmd/group.go +++ b/cmd/group.go @@ -12,13 +12,16 @@ package cmd import ( "bufio" "fmt" + "gitlab.com/elixxir/client/api/messenger" + "gitlab.com/elixxir/client/cmix/identity/receptionID" + "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/primitives/format" "os" "time" "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" - "gitlab.com/elixxir/client/api" "gitlab.com/elixxir/client/groupChat" "gitlab.com/elixxir/client/groupChat/groupStore" "gitlab.com/xx_network/primitives/id" @@ -47,9 +50,9 @@ var groupCmd = &cobra.Command{ // Wait until connected or crash on timeout connected := make(chan bool, 10) - client.GetNetworkInterface().AddHealthCallback( - func(isconnected bool) { - connected <- isconnected + client.GetCmix().AddHealthCallback( + func(isConnected bool) { + connected <- isConnected }) waitUntilConnected(connected) @@ -65,7 +68,7 @@ var groupCmd = &cobra.Command{ jww.INFO.Printf("Registering with nodes (%d/%d)...", numReg, total) } - // get group message and name + // Get group message and name msgBody := []byte(viper.GetString("message")) name := []byte(viper.GetString("name")) timeout := viper.GetDuration("receiveTimeout") @@ -112,33 +115,43 @@ var groupCmd = &cobra.Command{ // initGroupManager creates a new group chat manager and starts the process // service. -func initGroupManager(client *api.Client) (*groupChat.Manager, +func initGroupManager(client *messenger.Client) (groupChat.GroupChat, chan groupChat.MessageReceive, chan groupStore.Group) { recChan := make(chan groupChat.MessageReceive, 10) - receiveCb := func(msg groupChat.MessageReceive) { - recChan <- msg - } reqChan := make(chan groupStore.Group, 10) requestCb := func(g groupStore.Group) { reqChan <- g } - jww.INFO.Print("Creating new group manager.") - manager, err := groupChat.NewManager(client.GetNetworkInterface(), - client.GetE2EHandler(), client.GetStorage().GetReceptionID(), + 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, receiveCb) + client.GetStorage().GetKV(), requestCb, &receiveProcessor{recChan}) if err != nil { - jww.FATAL.Panicf("Failed to initialize group chat manager: %+v", err) + jww.FATAL.Panicf("[GC] Failed to initialize group chat manager: %+v", err) } return manager, recChan, reqChan } +type receiveProcessor struct { + recChan chan groupChat.MessageReceive +} + +func (r *receiveProcessor) Process(decryptedMsg groupChat.MessageReceive, + _ format.Message, _ receptionID.EphemeralIdentity, _ rounds.Round) { + r.recChan <- decryptedMsg +} + +func (r *receiveProcessor) String() string { + return "groupChatReceiveProcessor" +} + // createGroup creates a new group with the provided name and sends out requests // to the list of user IDs found at the given file path. -func createGroup(name, msg []byte, filePath string, gm *groupChat.Manager) { +func createGroup(name, msg []byte, filePath string, gm groupChat.GroupChat) { userIdStrings := ReadLines(filePath) userIDs := make([]*id.ID, 0, len(userIdStrings)) for _, userIdStr := range userIdStrings { @@ -148,27 +161,27 @@ func createGroup(name, msg []byte, filePath string, gm *groupChat.Manager) { grp, rids, status, err := gm.MakeGroup(userIDs, name, msg) if err != nil { - jww.FATAL.Panicf("Failed to create new group: %+v", err) + jww.FATAL.Panicf("[GC] Failed to create new group: %+v", err) } // Integration grabs the group ID from this line - jww.INFO.Printf("NewGroupID: b64:%s", grp.ID) - jww.INFO.Printf("Created Group: Requests:%s on rounds %#v, %v", + jww.INFO.Printf("[GC] NewGroupID: b64:%s", grp.ID) + jww.INFO.Printf("[GC] Created Group: Requests:%s on rounds %#v, %v", status, rids, grp) fmt.Printf("Created new group with name %q and message %q\n", grp.Name, grp.InitMessage) } // resendRequests resends group requests for the group ID. -func resendRequests(groupIdString string, gm *groupChat.Manager) { +func resendRequests(groupIdString string, gm groupChat.GroupChat) { groupID, _ := parseRecipient(groupIdString) rids, status, err := gm.ResendRequest(groupID) if err != nil { - jww.FATAL.Panicf("Failed to resend requests to group %s: %+v", + jww.FATAL.Panicf("[GC] Failed to resend requests to group %s: %+v", groupID, err) } - jww.INFO.Printf("Resending requests to group %s: %v, %s", + jww.INFO.Printf("[GC] Resending requests to group %s: %v, %s", groupID, rids, status) fmt.Println("Resending group requests to group.") } @@ -176,8 +189,8 @@ func resendRequests(groupIdString string, gm *groupChat.Manager) { // joinGroup joins a group when a request is received on the group request // channel. func joinGroup(reqChan chan groupStore.Group, timeout time.Duration, - gm *groupChat.Manager) { - jww.INFO.Print("Waiting for group request to be received.") + gm groupChat.GroupChat) { + jww.INFO.Print("[GC] Waiting for group request to be received.") fmt.Println("Waiting for group request to be received.") select { @@ -187,42 +200,42 @@ func joinGroup(reqChan chan groupStore.Group, timeout time.Duration, jww.FATAL.Panicf("%+v", err) } - jww.INFO.Printf("Joined group: %s", grp.ID) + jww.INFO.Printf("[GC] Joined group %s (%+v)", grp.ID, grp) fmt.Printf("Joined group with name %q and message %q\n", grp.Name, grp.InitMessage) - case <-time.NewTimer(timeout).C: - jww.INFO.Printf("Timed out after %s waiting for group request.", timeout) + case <-time.After(timeout): + jww.INFO.Printf("[GC] Timed out after %s waiting for group request.", timeout) fmt.Println("Timed out waiting for group request.") return } } // leaveGroup leaves the group. -func leaveGroup(groupIdString string, gm *groupChat.Manager) { +func leaveGroup(groupIdString string, gm groupChat.GroupChat) { groupID, _ := parseRecipient(groupIdString) - jww.INFO.Printf("Leaving group %s.", groupID) + jww.INFO.Printf("[GC] Leaving group %s.", groupID) err := gm.LeaveGroup(groupID) if err != nil { - jww.FATAL.Panicf("Failed to leave group %s: %+v", groupID, err) + jww.FATAL.Panicf("[GC] Failed to leave group %s: %+v", groupID, err) } - jww.INFO.Printf("Left group: %s", groupID) + jww.INFO.Printf("[GC] Left group: %s", groupID) fmt.Println("Left group.") } // sendGroup send the message to the group. -func sendGroup(groupIdString string, msg []byte, gm *groupChat.Manager) { +func sendGroup(groupIdString string, msg []byte, gm groupChat.GroupChat) { groupID, _ := parseRecipient(groupIdString) - jww.INFO.Printf("Sending to group %s message %q", groupID, msg) + jww.INFO.Printf("[GC] Sending to group %s message %q", groupID, msg) - rid, timestamp, _, err := gm.Send(groupID, msg) + rid, timestamp, _, err := gm.Send(groupID, "", msg) if err != nil { - jww.FATAL.Panicf("Sending message to group %s: %+v", groupID, err) + jww.FATAL.Panicf("[GC] Sending message to group %s: %+v", groupID, err) } - jww.INFO.Printf("Sent to group %s on round %d at %s", + jww.INFO.Printf("[GC] Sent to group %s on round %d at %s", groupID, rid, timestamp) fmt.Printf("Sent message %q to group.\n", msg) } @@ -231,17 +244,17 @@ func sendGroup(groupIdString string, msg []byte, gm *groupChat.Manager) { // groupChat.MessageReceive channel. func messageWait(numMessages uint, timeout time.Duration, recChan chan groupChat.MessageReceive) { - jww.INFO.Printf("Waiting for %d group message(s) to be received.", numMessages) + jww.INFO.Printf("[GC] Waiting for %d group message(s) to be received.", numMessages) fmt.Printf("Waiting for %d group message(s) to be received.\n", numMessages) for i := uint(0); i < numMessages; { select { case msg := <-recChan: i++ - jww.INFO.Printf("Received group message %d/%d: %s", i, numMessages, msg) + jww.INFO.Printf("[GC] Received group message %d/%d: %s", i, numMessages, msg) fmt.Printf("Received group message: %q\n", msg.Payload) case <-time.NewTimer(timeout).C: - jww.INFO.Printf("Timed out after %s waiting for group message.", timeout) + jww.INFO.Printf("[GC] Timed out after %s waiting for group message.", timeout) fmt.Printf("Timed out waiting for %d group message(s).\n", numMessages) return } @@ -249,24 +262,24 @@ func messageWait(numMessages uint, timeout time.Duration, } // listGroups prints a list of all groups. -func listGroups(gm *groupChat.Manager) { +func listGroups(gm groupChat.GroupChat) { for i, gid := range gm.GetGroups() { - jww.INFO.Printf("Group %d: %s", i, gid) + jww.INFO.Printf("[GC] Group %d: %s", i, gid) } fmt.Printf("Printed list of %d groups.\n", gm.NumGroups()) } // showGroup prints all the information of the group. -func showGroup(groupIdString string, gm *groupChat.Manager) { +func showGroup(groupIdString string, gm groupChat.GroupChat) { groupID, _ := parseRecipient(groupIdString) grp, ok := gm.GetGroup(groupID) if !ok { - jww.FATAL.Printf("Could not find group: %s", groupID) + jww.FATAL.Printf("[GC] Could not find group: %s", groupID) } - jww.INFO.Printf("Show group %#v", grp) + jww.INFO.Printf("[GC] Show group %#v", grp) fmt.Printf("Got group with name %q and message %q\n", grp.Name, grp.InitMessage) } diff --git a/cmd/init.go b/cmd/init.go index 9a10595e53848a70a14836d83cb345a87165b96a..ad48ca4850e5046c89b6e7b73ea212cad77856d9 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -10,9 +10,11 @@ package cmd import ( "fmt" + "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" + "gitlab.com/elixxir/client/api/messenger" ) // initCmd creates a new user object with the given NDF @@ -22,7 +24,13 @@ var initCmd = &cobra.Command{ Args: cobra.NoArgs, Run: func(cmd *cobra.Command, args []string) { client := createClient() + e2e, err := messenger.LoadOrInitE2e(client) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } user := client.GetUser() + user.E2eDhPublicKey = e2e.GetHistoricalDHPubkey() + jww.INFO.Printf("User: %s", user.ReceptionID) writeContact(user.GetContact()) fmt.Printf("%s\n", user.ReceptionID) diff --git a/cmd/precan.go b/cmd/precan.go index 3691119baf0a22c78c5bda459e0c83158a00ed40..4a4050efe99237135d5dfb3c9aaf028f3d77974f 100644 --- a/cmd/precan.go +++ b/cmd/precan.go @@ -11,10 +11,10 @@ package cmd import ( "encoding/binary" + "gitlab.com/elixxir/client/api/messenger" "strconv" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/api" "gitlab.com/elixxir/crypto/contact" "gitlab.com/xx_network/primitives/id" ) @@ -67,7 +67,7 @@ func getPrecanID(recipientID *id.ID) uint { return uint(recipientID.Bytes()[7]) } -func addPrecanAuthenticatedChannel(client *api.Client, recipientID *id.ID, +func addPrecanAuthenticatedChannel(client *messenger.Client, recipientID *id.ID, recipient contact.Contact) { jww.WARN.Printf("Precanned user id detected: %s", recipientID) preUsr, err := client.MakePrecannedAuthenticatedChannel( diff --git a/cmd/root.go b/cmd/root.go index 5d9cd10007b81a8dd2c92bfee2c819c374be9d71..aeca80079417004ec2e4a568bd594d2522ba5ec8 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -25,6 +25,10 @@ import ( "sync" "time" + "gitlab.com/elixxir/client/api/messenger" + "gitlab.com/elixxir/client/backup" + "gitlab.com/elixxir/client/e2e" + "gitlab.com/elixxir/client/catalog" "gitlab.com/elixxir/client/cmix" "gitlab.com/elixxir/client/e2e/ratchet/partner/session" @@ -192,6 +196,8 @@ var rootCmd = &cobra.Command{ client := initClient() user := client.GetUser() + jww.INFO.Printf("USERPUBKEY: %s", + user.E2eDhPublicKey.TextVerbose(16, 0)) jww.INFO.Printf("User: %s", user.ReceptionID) writeContact(user.GetContact()) @@ -213,7 +219,7 @@ var rootCmd = &cobra.Command{ recipientContact = user.GetContact() } - client.GetE2EHandler().EnableUnsafeReception() + client.GetE2E().EnableUnsafeReception() recvCh := registerMessageListener(client) err := client.StartNetworkFollower(5 * time.Second) @@ -223,7 +229,7 @@ var rootCmd = &cobra.Command{ // Wait until connected or crash on timeout connected := make(chan bool, 10) - client.GetNetworkInterface().AddHealthCallback( + client.GetCmix().AddHealthCallback( func(isconnected bool) { connected <- isconnected }) @@ -248,7 +254,7 @@ var rootCmd = &cobra.Command{ numReg, total) } - client.GetBackup().TriggerBackup("Integration test.") + client.GetBackupContainer().TriggerBackup("Integration test.") // Send Messages msgBody := viper.GetString("message") @@ -264,7 +270,7 @@ var rootCmd = &cobra.Command{ authConfirmed = true } - if client.HasAuthenticatedChannel(recipientID) { + if client.GetE2E().HasAuthenticatedChannel(recipientID) { jww.INFO.Printf("Authenticated channel already in "+ "place for %s", recipientID) authConfirmed = true @@ -324,25 +330,46 @@ var rootCmd = &cobra.Command{ } if viper.GetBool("delete-receive-requests") { - client.DeleteReceiveRequests() + err = client.GetAuth().DeleteReceiveRequests() + if err != nil { + jww.FATAL.Panicf("Failed to delete received requests:"+ + " %+v", err) + } } if viper.GetBool("delete-sent-requests") { - client.DeleteSentRequests() + err = client.GetAuth().DeleteSentRequests() + if err != nil { + jww.FATAL.Panicf("Failed to delete sent requests:"+ + " %+v", err) + } } if viper.GetBool("delete-all-requests") { - client.DeleteAllRequests() + err = client.GetAuth().DeleteAllRequests() + if err != nil { + jww.FATAL.Panicf("Failed to delete all requests:"+ + " %+v", err) + } } if viper.GetBool("delete-request") { - client.DeleteRequest(recipientID) + err = client.GetAuth().DeleteRequest(recipientID) + if err != nil { + jww.FATAL.Panicf("Failed to delete request for %s:"+ + " %+v", recipientID, err) + } } mt := catalog.MessageType(catalog.XxMessage) payload := []byte(msgBody) recipient := recipientID - params := initParams() + + paramsE2E := e2e.GetDefaultParams() + if viper.GetBool("splitSends") { + paramsE2E.ExcludedRounds = excludedRounds.NewSet() + } + wg := &sync.WaitGroup{} sendCnt := int(viper.GetUint("sendCount")) wg.Add(sendCnt) @@ -355,18 +382,16 @@ var rootCmd = &cobra.Command{ for { // Send messages var roundIDs []id.Round - var roundTimeout time.Duration + roundTimeout := paramsE2E.CMIXParams.SendTimeout if unsafe { - params.E2E.CMIXParams.DebugTag = "cmd.Unsafe" - roundIDs, _, err = client.SendUnsafe( + paramsE2E.CMIXParams.DebugTag = "cmd.Unsafe" + roundIDs, _, err = client.GetE2E().SendUnsafe( mt, recipient, payload, - params.E2E) - roundTimeout = params.Network.Timeout + paramsE2E) } else { - params.E2E.CMIXParams.DebugTag = "cmd.E2E" - roundIDs, _, _, err = client.SendE2E(mt, - recipient, payload, params.E2E) - roundTimeout = params.E2E.CMIXParams.Timeout + paramsE2E.CMIXParams.DebugTag = "cmd.E2E" + roundIDs, _, _, err = client.GetE2E().SendE2E(mt, + recipient, payload, paramsE2E) } if err != nil { jww.FATAL.Panicf("%+v", err) @@ -388,7 +413,7 @@ var rootCmd = &cobra.Command{ } // Monitor rounds for results - err = client.GetNetworkInterface().GetRoundResults(roundTimeout, f, roundIDs...) + err = client.GetCmix().GetRoundResults(roundTimeout, f, roundIDs...) if err != nil { jww.DEBUG.Printf("Could not verify messages were sent successfully, resending messages...") continue @@ -467,7 +492,7 @@ var rootCmd = &cobra.Command{ jww.INFO.Printf("Received %d/%d Messages!", receiveCnt, expectedCnt) fmt.Printf("Received %d\n", receiveCnt) if roundsNotepad != nil { - roundsNotepad.INFO.Printf("\n%s", client.GetNetworkInterface().GetVerboseRounds()) + roundsNotepad.INFO.Printf("\n%s", client.GetCmix().GetVerboseRounds()) } wg.Wait() err = client.StopNetworkFollower() @@ -535,8 +560,11 @@ func createClient() *api.Client { } // Construct client from backup data - backupIdList, _, err := api.NewClientFromBackup(string(ndfJSON), storeDir, + backupIdList, _, err := messenger.NewClientFromBackup(string(ndfJSON), storeDir, pass, backupPass, backupFile) + if err != nil { + jww.FATAL.Panicf("%+v", err) + } backupIdListPath := viper.GetString("backupIdList") if backupIdListPath != "" { @@ -591,14 +619,10 @@ func initParams() api.Params { } p.CMix.VerboseRoundTracking = viper.GetBool( "verboseRoundTracking") - if viper.GetBool("splitSends") { - p.Network.ExcludedRounds = excludedRounds.NewSet() - } - return p } -func initClient() *api.Client { +func initClient() *messenger.Client { createClient() pass := parsePassword(viper.GetString("password")) @@ -608,14 +632,22 @@ func initClient() *api.Client { params := initParams() // load the client + baseclient, err := api.Login(storeDir, pass, params) + + if err != nil { + jww.FATAL.Panicf("%+v", err) + } + authCbs = makeAuthCallbacks(nil, viper.GetBool("unsafe-channel-creation")) - client, err := api.Login(storeDir, pass, authCbs, params) - authCbs.client = client + + client, err := messenger.Login(baseclient, authCbs) if err != nil { jww.FATAL.Panicf("%+v", err) } + authCbs.client = client + if protoUser := viper.GetString("protoUserOut"); protoUser != "" { jsonBytes, err := client.ConstructProtoUserFile() @@ -664,8 +696,9 @@ func initClient() *api.Client { } } } - - _, err = client.InitializeBackup(backupPass, updateBackupCb) + _, err = backup.InitializeBackup(backupPass, updateBackupCb, + client.GetBackupContainer(), client.GetE2E(), client.GetStorage(), + nil, client.GetStorage().GetKV(), client.GetRng()) if err != nil { jww.FATAL.Panicf("Failed to initialize backup with key %q: %+v", backupPass, err) @@ -675,27 +708,27 @@ func initClient() *api.Client { return client } -func acceptChannel(client *api.Client, recipientID *id.ID) { - recipientContact, err := client.GetAuthenticatedChannelRequest( +func acceptChannel(client *messenger.Client, recipientID *id.ID) { + recipientContact, err := client.GetAuth().GetReceivedRequest( recipientID) if err != nil { jww.FATAL.Panicf("%+v", err) } - _, err = client.ConfirmAuthenticatedChannel( + _, err = client.GetAuth().Confirm( recipientContact) if err != nil { jww.FATAL.Panicf("%+v", err) } } -func deleteChannel(client *api.Client, partnerId *id.ID) { +func deleteChannel(client *messenger.Client, partnerId *id.ID) { err := client.DeleteContact(partnerId) if err != nil { jww.FATAL.Panicf("%+v", err) } } -func addAuthenticatedChannel(client *api.Client, recipientID *id.ID, +func addAuthenticatedChannel(client *messenger.Client, recipientID *id.ID, recipient contact.Contact) { var allowed bool if viper.GetBool("unsafe-channel-creation") { @@ -721,8 +754,8 @@ func addAuthenticatedChannel(client *api.Client, recipientID *id.ID, me := client.GetUser().GetContact() jww.INFO.Printf("Requesting auth channel from: %s", recipientID) - _, err := client.RequestAuthenticatedChannel(recipientContact, - me, msg) + _, err := client.GetAuth().Request(recipientContact, + me.Facts) if err != nil { jww.FATAL.Panicf("%+v", err) } @@ -732,7 +765,7 @@ func addAuthenticatedChannel(client *api.Client, recipientID *id.ID, } } -func resetAuthenticatedChannel(client *api.Client, recipientID *id.ID, +func resetAuthenticatedChannel(client *messenger.Client, recipientID *id.ID, recipient contact.Contact) { var allowed bool if viper.GetBool("unsafe-channel-creation") { @@ -755,11 +788,9 @@ func resetAuthenticatedChannel(client *api.Client, recipientID *id.ID, recipientContact := recipient if recipientContact.ID != nil && recipientContact.DhPubKey != nil { - me := client.GetUser().GetContact() jww.INFO.Printf("Requesting auth channel from: %s", recipientID) - _, err := client.ResetSession(recipientContact, - me, msg) + _, err := client.GetAuth().Reset(recipientContact) if err != nil { jww.FATAL.Panicf("%+v", err) } diff --git a/cmd/single.go b/cmd/single.go index 00670077a2cf169ca36ca9352238ae0d36f0b714..558ad39ebe3700900732d7e10379138acd04a4ab 100644 --- a/cmd/single.go +++ b/cmd/single.go @@ -48,7 +48,7 @@ var singleCmd = &cobra.Command{ // Wait until connected or crash on timeout connected := make(chan bool, 10) - client.GetNetworkInterface().AddHealthCallback( + client.GetCmix().AddHealthCallback( func(isconnected bool) { connected <- isconnected }) @@ -69,7 +69,7 @@ var singleCmd = &cobra.Command{ myID := client.GetUser().ReceptionID listener := single.Listen(tag, myID, client.GetUser().E2eDhPrivateKey, - client.GetNetworkInterface(), + client.GetCmix(), client.GetStorage().GetE2EGroup(), receiver) @@ -92,7 +92,7 @@ var singleCmd = &cobra.Command{ partner := readSingleUseContact("contact") maxMessages := uint8(viper.GetUint("maxMessages")) - sendSingleUse(client, partner, payload, + sendSingleUse(client.Client, partner, payload, maxMessages, timeout, tag) } @@ -178,7 +178,7 @@ func sendSingleUse(m *api.Client, partner contact.Contact, payload []byte, e2eGrp := m.GetStorage().GetE2EGroup() rnd, ephID, err := single.TransmitRequest(partner, tag, payload, callback, params, - m.GetNetworkInterface(), rng, e2eGrp) + m.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 431f774f3f6d56f81fca53f2709b1f00903caf9a..4666cba3fec19f620b0903e191c3955b2b42439a 100644 --- a/cmd/ud.go +++ b/cmd/ud.go @@ -71,7 +71,7 @@ var udCmd = &cobra.Command{ // Wait until connected or crash on timeout connected := make(chan bool, 10) - client.GetNetworkInterface().AddHealthCallback( + client.GetCmix().AddHealthCallback( func(isconnected bool) { connected <- isconnected }) @@ -81,16 +81,16 @@ var udCmd = &cobra.Command{ stream := client.GetRng().GetStream() defer stream.Close() userToRegister := viper.GetString("register") - userDiscoveryMgr, err := ud.NewManager(client.GetNetworkInterface(), - client.GetE2EHandler(), client.NetworkFollowerStatus, + userDiscoveryMgr, err := ud.NewManager(client.GetCmix(), + client.GetE2E(), client.NetworkFollowerStatus, client.GetEventReporter(), client.GetComms(), client.GetStorage(), stream, userToRegister, client.GetStorage().GetKV()) if err != nil { if strings.Contains(err.Error(), ud.IsRegisteredErr) { - userDiscoveryMgr, err = ud.LoadManager(client.GetNetworkInterface(), - client.GetE2EHandler(), client.GetEventReporter(), + userDiscoveryMgr, err = ud.LoadManager(client.GetCmix(), + client.GetE2E(), client.GetEventReporter(), client.GetComms(), client.GetStorage(), client.GetStorage().GetKV()) if err != nil { @@ -163,8 +163,8 @@ var udCmd = &cobra.Command{ } printContact(newContact) } - _, _, err = ud.Lookup(client.GetNetworkInterface(), - stream, client.GetE2EHandler().GetGroup(), + _, _, err = ud.Lookup(client.GetCmix(), + stream, client.GetE2E().GetGroup(), udContact, cb, lookupID, single.GetDefaultRequestParams()) if err != nil { jww.WARN.Printf("Failed UD lookup: %+v", err) @@ -187,7 +187,7 @@ var udCmd = &cobra.Command{ } for i := 0; i < len(restored); i++ { uid := restored[i] - for !client.HasAuthenticatedChannel(uid) { + for !client.GetE2E().HasAuthenticatedChannel(uid) { time.Sleep(time.Second) } jww.INFO.Printf("Authenticated channel established for %s", uid) @@ -256,9 +256,9 @@ var udCmd = &cobra.Command{ } } - _, _, err = ud.Search(client.GetNetworkInterface(), + _, _, err = ud.Search(client.GetCmix(), client.GetEventReporter(), - stream, client.GetE2EHandler().GetGroup(), + stream, client.GetE2E().GetGroup(), udContact, cb, facts, single.GetDefaultRequestParams()) if err != nil { jww.FATAL.Panicf("%+v", err) diff --git a/cmd/utils.go b/cmd/utils.go index db747ab014d26429ab0e043fed3ccd31ed69704b..631b473295a70649bd894c89868ba96b1eb43ed2 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -103,6 +103,7 @@ func readContact() contact.Contact { if err != nil { jww.FATAL.Panicf("Failed to unmarshal contact: %+v", err) } - jww.INFO.Printf("PubKey READ: %s", c.DhPubKey.Text(10)) + jww.INFO.Printf("CONTACTPUBKEY READ: %s", + c.DhPubKey.TextVerbose(16, 0)) return c } diff --git a/cmix/address/addressSpace_test.go b/cmix/address/addressSpace_test.go index 1930a7121c1c2d21f5e5fc76318ffa325cea71ee..62b23793efe9dff74f5e6297d0d529d9da68bf29 100644 --- a/cmix/address/addressSpace_test.go +++ b/cmix/address/addressSpace_test.go @@ -44,6 +44,7 @@ func TestSpace_GetAddressSpace(t *testing.T) { // Update address size as.(*space).cond.L.Lock() as.(*space).size = expectedSize + as.(*space).set = true as.(*space).cond.L.Unlock() // Call get and error if it does block @@ -55,7 +56,7 @@ func TestSpace_GetAddressSpace(t *testing.T) { t.Errorf("get returned the wrong size.\nexpected: %d\nreceived: %d", expectedSize, size) } - case <-time.NewTimer(15 * time.Millisecond).C: + case <-time.NewTimer(150 * time.Millisecond).C: t.Error("get blocking when the size has been updated.") } } diff --git a/cmix/check_test.go b/cmix/check_test.go index 515b468cbb83b6127c2af09ac85f3f9fc9508181..5ab2aaf943aac5645d224e07d2e7bca3620caf21 100644 --- a/cmix/check_test.go +++ b/cmix/check_test.go @@ -1,13 +1,14 @@ package cmix import ( + "testing" + bloom "gitlab.com/elixxir/bloomfilter" "gitlab.com/elixxir/client/cmix/identity/receptionID/store" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" - "testing" ) // TestChecker tests the basic operation for Checker @@ -34,7 +35,7 @@ func TestChecker(t *testing.T) { } // Init a kv and a checked rounds structure - kv := versioned.NewKV(ekv.Memstore{}) + kv := versioned.NewKV(ekv.MakeMemstore()) cr, err := store.NewCheckedRounds(5, kv) if err != nil { t.Errorf("Failed to create checked rounds store: %+v", err) diff --git a/cmix/cmixMessageBuffer_test.go b/cmix/cmixMessageBuffer_test.go index 162a69baca54da69c84d4aba5cd170b597115cae..1a9189a689726d2a4eec07a1d629d622e66b4d10 100644 --- a/cmix/cmixMessageBuffer_test.go +++ b/cmix/cmixMessageBuffer_test.go @@ -9,22 +9,23 @@ package cmix import ( "bytes" + "math/rand" + "reflect" + "testing" + "gitlab.com/elixxir/client/storage/utility" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" - "math/rand" - "reflect" - "testing" ) // Test happy path of cmixMessageHandler.SaveMessage. func Test_cmixMessageHandler_SaveMessage(t *testing.T) { // Set up test values cmh := &cmixMessageHandler{} - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) testMsgs, ids, _ := makeTestCmixMessages(10) for i := range testMsgs { @@ -59,7 +60,7 @@ func Test_cmixMessageHandler_SaveMessage(t *testing.T) { func Test_cmixMessageHandler_LoadMessage(t *testing.T) { // Set up test values cmh := &cmixMessageHandler{} - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) testMsgs, ids, _ := makeTestCmixMessages(10) for i := range testMsgs { @@ -94,7 +95,7 @@ func Test_cmixMessageBuffer_Smoke(t *testing.T) { testMsgs, ids, _ := makeTestCmixMessages(2) // Create new buffer - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) cmb, err := NewOrLoadCmixMessageBuffer(kv, "testKey") if err != nil { t.Errorf("Failed to make new cmixMessageHandler: %+v", err) diff --git a/cmix/critical_test.go b/cmix/critical_test.go index 5f99738584f45a97a10094f4007d788055f64242..4126c57714955cbf446c4fab02c532eb0b159fd7 100644 --- a/cmix/critical_test.go +++ b/cmix/critical_test.go @@ -1,19 +1,20 @@ package cmix import ( + "testing" + "time" + "gitlab.com/elixxir/client/stoppable" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" - "testing" - "time" ) // TestCritical tests the basic functions of the critical messaging system func TestCritical(t *testing.T) { // Init mock structures & start thread - kv := versioned.NewKV(ekv.Memstore{}) + kv := versioned.NewKV(ekv.MakeMemstore()) mr := &mockRoundEventRegistrar{ statusReturn: true, } diff --git a/cmix/gateway/hostPool.go b/cmix/gateway/hostPool.go index 71fcbe1870091471132b2efbc2cb426d68d70735..224489af202afd203c1f917ce163b901deeade3d 100644 --- a/cmix/gateway/hostPool.go +++ b/cmix/gateway/hostPool.go @@ -14,6 +14,7 @@ package gateway import ( "encoding/binary" + "encoding/json" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/storage" @@ -108,7 +109,18 @@ type PoolParams struct { ForceConnection bool // HostParams is the parameters for the creation of new Host objects. - HostParams connect.HostParams + //fixme params: have this adhere to json.Marshaler. + // This will allow the PoolParams object to have full adherence. + HostParams connect.HostParams `json:"-"` +} + +// poolParamsDisk will be the marshal-able and umarshal-able object. +type poolParamsDisk struct { + MaxPoolSize uint32 + PoolSize uint32 + ProxyAttempts uint32 + MaxPings uint32 + ForceConnection bool } // DefaultPoolParams returns a default set of PoolParams. @@ -132,6 +144,54 @@ func DefaultPoolParams() PoolParams { return p } +// GetParameters returns the default PoolParams, or +// override with given parameters, if set. +func GetParameters(params string) (PoolParams, error) { + p := DefaultPoolParams() + if len(params) > 0 { + err := json.Unmarshal([]byte(params), &p) + if err != nil { + return PoolParams{}, err + } + } + return p, nil +} + +// MarshalJSON adheres to the json.Marshaler interface. +func (pp PoolParams) MarshalJSON() ([]byte, error) { + ppd := poolParamsDisk{ + MaxPoolSize: pp.MaxPoolSize, + PoolSize: pp.PoolSize, + ProxyAttempts: pp.ProxyAttempts, + MaxPings: pp.MaxPings, + ForceConnection: pp.ForceConnection, + } + + return json.Marshal(&ppd) +} + +// UnmarshalJSON adheres to the json.Unmarshaler interface. +func (pp *PoolParams) UnmarshalJSON(data []byte) error { + ppDisk := poolParamsDisk{} + err := json.Unmarshal(data, &ppDisk) + if err != nil { + return err + } + + *pp = PoolParams{ + MaxPoolSize: ppDisk.MaxPoolSize, + PoolSize: ppDisk.PoolSize, + ProxyAttempts: ppDisk.ProxyAttempts, + MaxPings: ppDisk.MaxPings, + ForceConnection: ppDisk.ForceConnection, + // Since this does not adhere to json.Marshaler yet, + // file it in manually assuming default values + HostParams: connect.GetDefaultHostParams(), + } + + return nil +} + // newHostPool builds and returns a new HostPool object. func newHostPool(poolParams PoolParams, rng *fastRNG.StreamGenerator, netDef *ndf.NetworkDefinition, getter HostManager, storage storage.Session, diff --git a/cmix/identity/receptionID/registration_test.go b/cmix/identity/receptionID/registration_test.go index 2c9d16d3aa89fe5a3417e40af5fd72b0dd32310b..cd8d608ac725c1750c99b723c3528f46719020fe 100644 --- a/cmix/identity/receptionID/registration_test.go +++ b/cmix/identity/receptionID/registration_test.go @@ -16,7 +16,7 @@ import ( // timestamp := time.Date(2009, 11, 17, 20, 34, 58, 651387237, time.UTC) // idu, _ := generateFakeIdentity(rng, 15, timestamp) // id := idu.Identity -// kv := versioned.NewKV(make(ekv.Memstore)) +// kv := versioned.NewKV(ekv.MakeMemstore()) // // id.End = time.Time{} // id.ExtraChecks = 0 diff --git a/cmix/identity/receptionID/store/unknownRounds.go b/cmix/identity/receptionID/store/unknownRounds.go index 022fd252dba2d7dbaaec14a072e5dbac6623ff25..b14c939abdd27e72a284bf37ba71e763b6bd0536 100644 --- a/cmix/identity/receptionID/store/unknownRounds.go +++ b/cmix/identity/receptionID/store/unknownRounds.go @@ -24,21 +24,6 @@ const ( defaultMaxCheck = 3 ) -// UnknownRounds tracks data for unknown rounds. Should adhere to UnknownRounds -// interface. -type UnknownRounds struct { - // Maps an unknown round to how many times the round has been checked - rounds map[id.Round]*uint64 - - // Configurations of UnknownRounds - params UnknownRoundsParams - - // Key Value store to save data to disk - kv *versioned.KV - - mux sync.Mutex -} - // UnknownRoundsParams allows configuration of UnknownRounds parameters. type UnknownRoundsParams struct { // MaxChecks is the maximum amount of checks of a round before that round @@ -49,6 +34,12 @@ type UnknownRoundsParams struct { Stored bool } +// unknownRoundsParamsDisk will be the marshal-able and umarshal-able object. +type unknownRoundsParamsDisk struct { + MaxChecks uint64 + Stored bool +} + // DefaultUnknownRoundsParams returns a default set of UnknownRoundsParams. func DefaultUnknownRoundsParams() UnknownRoundsParams { return UnknownRoundsParams{ @@ -57,6 +48,60 @@ func DefaultUnknownRoundsParams() UnknownRoundsParams { } } +// GetParameters returns the default UnknownRoundsParams, +// or override with given parameters, if set. +func GetParameters(params string) (UnknownRoundsParams, error) { + p := DefaultUnknownRoundsParams() + if len(params) > 0 { + err := json.Unmarshal([]byte(params), &p) + if err != nil { + return UnknownRoundsParams{}, err + } + } + return p, nil +} + +// MarshalJSON adheres to the json.Marshaler interface. +func (urp UnknownRoundsParams) MarshalJSON() ([]byte, error) { + urpDisk := unknownRoundsParamsDisk{ + MaxChecks: urp.MaxChecks, + Stored: urp.Stored, + } + + return json.Marshal(&urpDisk) +} + +// UnmarshalJSON adheres to the json.Unmarshaler interface. +func (urp *UnknownRoundsParams) UnmarshalJSON(data []byte) error { + urpDisk := unknownRoundsParamsDisk{} + err := json.Unmarshal(data, &urpDisk) + if err != nil { + return err + } + + *urp = UnknownRoundsParams{ + MaxChecks: urpDisk.MaxChecks, + Stored: urpDisk.Stored, + } + + return nil +} + +// UnknownRounds tracks data for unknown rounds. Should adhere to UnknownRounds +// interface. +type UnknownRounds struct { + // Maps an unknown round to how many times the round has been checked + rounds map[id.Round]*uint64 + + // Configurations of UnknownRounds + params UnknownRoundsParams + + // Key Value store to save data to disk + kv *versioned.KV + + mux sync.Mutex +} + // NewUnknownRounds builds and returns a new UnknownRounds object. func NewUnknownRounds(kv *versioned.KV, params UnknownRoundsParams) *UnknownRounds { diff --git a/cmix/identity/tracker.go b/cmix/identity/tracker.go index fc1fb2f2c78b2051c51543ffeace35f082e8a249..18e68d2f7bc34eab98affbf202e88c1a1efef296 100644 --- a/cmix/identity/tracker.go +++ b/cmix/identity/tracker.go @@ -130,7 +130,7 @@ func NewOrLoadTracker(session storage.Session, addrSpace address.Space) *manager // StartProcesses track runs a thread which checks for past and present address // ID. -func (t manager) StartProcesses() stoppable.Stoppable { +func (t *manager) StartProcesses() stoppable.Stoppable { stop := stoppable.NewSingle(ephemeralStoppable) go t.track(stop) diff --git a/cmix/identity/tracker_test.go b/cmix/identity/tracker_test.go index 5324331e76b14f779f7c742a92df32bfae0a1267..d16f64b5526f30e2d9719974ad1f82560b7f6b1f 100644 --- a/cmix/identity/tracker_test.go +++ b/cmix/identity/tracker_test.go @@ -7,57 +7,58 @@ package identity import ( + "sync" + "testing" + "time" + jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/cmix/address" "gitlab.com/elixxir/client/cmix/identity/receptionID" "gitlab.com/elixxir/client/storage" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" - "sync" - "testing" - "time" ) var initSize uint8 = 8 -func TestManager_processIdentities_expired(t *testing.T) { - // Initialization - addrSpace := address.NewAddressSpace(initSize) - addrSpace.UpdateAddressSpace(18) - session := storage.InitTestingSession(t) - m := &manager{ - tracked: make([]TrackedID, 0), - session: session, - newIdentity: make(chan TrackedID, trackedIDChanSize), - deleteIdentity: make(chan *id.ID, deleteIDChanSize), - addrSpace: addrSpace, - ephemeral: receptionID.NewOrLoadStore(session.GetKV()), - mux: &sync.Mutex{}, - } +// func TestManager_processIdentities_expired(t *testing.T) { +// // Initialization +// addrSpace := address.NewAddressSpace(initSize) +// addrSpace.UpdateAddressSpace(18) +// session := storage.InitTestingSession(t) +// m := &manager{ +// tracked: make([]TrackedID, 0), +// session: session, +// newIdentity: make(chan TrackedID, trackedIDChanSize), +// deleteIdentity: make(chan *id.ID, deleteIDChanSize), +// addrSpace: addrSpace, +// ephemeral: receptionID.NewOrLoadStore(session.GetKV()), +// mux: &sync.Mutex{}, +// } - // Add some expired test IDs - for i := uint64(0); i < 10; i++ { - testId := id.NewIdFromUInt(i, id.User, t) - validUntil := netTime.Now() - m.tracked = append(m.tracked, TrackedID{ - NextGeneration: netTime.Now().Add(-time.Second), - LastGeneration: time.Time{}, - Source: testId, - ValidUntil: validUntil, - Persistent: false, - Creation: netTime.Now(), - }) - } +// // Add some expired test IDs +// for i := uint64(0); i < 10; i++ { +// testId := id.NewIdFromUInt(i, id.User, t) +// validUntil := netTime.Now() +// m.tracked = append(m.tracked, TrackedID{ +// NextGeneration: netTime.Now().Add(-time.Second), +// LastGeneration: time.Time{}, +// Source: testId, +// ValidUntil: validUntil, +// Persistent: false, +// Creation: netTime.Now(), +// }) +// } - expected := m.tracked[0].ValidUntil - nextEvent := m.processIdentities(addrSpace.GetAddressSpace()) - if len(m.tracked) != 0 { - t.Errorf("Failed to remove expired identities, %d remain", len(m.tracked)) - } - if nextEvent != expected { - t.Errorf("Invalid nextEvent, expected %v got %v", expected, nextEvent) - } -} +// expected := m.tracked[0].ValidUntil +// nextEvent := m.processIdentities(addrSpace.GetAddressSpace()) +// if len(m.tracked) != 0 { +// t.Errorf("Failed to remove expired identities, %d remain", len(m.tracked)) +// } +// if nextEvent != expected { +// t.Errorf("Invalid nextEvent, expected %v got %v", expected, nextEvent) +// } +// } func TestManager_processIdentities(t *testing.T) { jww.SetStdoutThreshold(jww.LevelDebug) diff --git a/cmix/message/handler.go b/cmix/message/handler.go index d8cd687f8ccc49941b13bac2fb1aba0810758206..21dadc180da1c2b61a30e1fb2cd4c999cb15383d 100644 --- a/cmix/message/handler.go +++ b/cmix/message/handler.go @@ -8,14 +8,16 @@ package message import ( + "encoding/base64" "fmt" - "gitlab.com/elixxir/client/event" - "gitlab.com/elixxir/client/storage/versioned" - "gitlab.com/xx_network/primitives/id" "strconv" "sync" "time" + "gitlab.com/elixxir/client/event" + "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/xx_network/primitives/id" + jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/stoppable" "gitlab.com/elixxir/primitives/format" @@ -166,7 +168,9 @@ func (h *handler) handleMessageHelper(ecrMsg format.Message, bundle Bundle) bool identity := bundle.Identity round := bundle.RoundInfo - jww.INFO.Printf("handleMessage(%s)", ecrMsg.Digest()) + jww.INFO.Printf("handleMessage(msgDigest: %s, SIH: %s, KeyFP: %s)", + ecrMsg.Digest(), fingerprint, + base64.StdEncoding.EncodeToString(ecrMsg.GetSIH())) // If we have a fingerprint, process it if proc, exists := h.pop(identity.Source, fingerprint); exists { @@ -191,7 +195,7 @@ func (h *handler) handleMessageHelper(ecrMsg format.Message, bundle Bundle) bool return true } - im := fmt.Sprintf("Message cannot be identify: keyFP: %v, round: %d "+ + im := fmt.Sprintf("Message cannot be identified: keyFP: %v, round: %d "+ "msgDigest: %s, not determined to be for client", ecrMsg.GetKeyFP(), bundle.Round, ecrMsg.Digest()) jww.TRACE.Printf(im) diff --git a/cmix/message/meteredCmixMessageBuffer.go b/cmix/message/meteredCmixMessageBuffer.go index 3b43838105dda925bd135f192eeefc9dc34faff1..0bc82450812e8e993f43e63c61a658df48a27cc4 100644 --- a/cmix/message/meteredCmixMessageBuffer.go +++ b/cmix/message/meteredCmixMessageBuffer.go @@ -9,6 +9,8 @@ package message import ( "encoding/json" + "time" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/cmix/identity/receptionID" @@ -20,7 +22,6 @@ import ( "gitlab.com/xx_network/primitives/netTime" "golang.org/x/crypto/blake2b" "google.golang.org/protobuf/proto" - "time" ) const currentMeteredCmixMessageVersion = 0 @@ -145,6 +146,8 @@ func (mcmb *MeteredCmixMessageBuffer) Add(m format.Message, ri *pb.RoundInfo, jww.FATAL.Panic( "Cannot handle a metered cMix message with a length of 0.") } + jww.TRACE.Printf("Metered Messages Add(MsgDigest: %s)", + m.Digest()) msg := buildMsg(m, ri, identity) addedMsgFace := mcmb.mb.Add(msg) diff --git a/cmix/message/params.go b/cmix/message/params.go index 9a3a56cd599860416ebe2951048c2c5ac7767987..cd2e6675bff9ad8eb6303b40c32a01f80ba152ea 100644 --- a/cmix/message/params.go +++ b/cmix/message/params.go @@ -1,7 +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 message -import "time" +import ( + "encoding/json" + "time" +) +// Params contains the parameters for the message package. type Params struct { MessageReceptionBuffLen uint MessageReceptionWorkerPoolSize uint @@ -10,6 +21,17 @@ type Params struct { RealtimeOnly bool } +// paramsDisk will be the marshal-able and umarshal-able object. +type paramsDisk struct { + MessageReceptionBuffLen uint + MessageReceptionWorkerPoolSize uint + MaxChecksInProcessMessage uint + InProcessMessageWait time.Duration + RealtimeOnly bool +} + +// GetDefaultParams returns a Params object containing the +// default parameters. func GetDefaultParams() Params { return Params{ MessageReceptionBuffLen: 500, @@ -19,3 +41,49 @@ func GetDefaultParams() Params { RealtimeOnly: false, } } + +// 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 +} + +// MarshalJSON adheres to the json.Marshaler interface. +func (p Params) MarshalJSON() ([]byte, error) { + pDisk := paramsDisk{ + MessageReceptionBuffLen: p.MessageReceptionBuffLen, + MessageReceptionWorkerPoolSize: p.MessageReceptionWorkerPoolSize, + MaxChecksInProcessMessage: p.MaxChecksInProcessMessage, + InProcessMessageWait: p.InProcessMessageWait, + RealtimeOnly: p.RealtimeOnly, + } + + return json.Marshal(&pDisk) + +} + +// UnmarshalJSON adheres to the json.Unmarshaler interface. +func (p *Params) UnmarshalJSON(data []byte) error { + pDisk := paramsDisk{} + err := json.Unmarshal(data, &pDisk) + if err != nil { + return err + } + + *p = Params{ + MessageReceptionBuffLen: pDisk.MessageReceptionBuffLen, + MessageReceptionWorkerPoolSize: pDisk.MessageReceptionWorkerPoolSize, + MaxChecksInProcessMessage: pDisk.MaxChecksInProcessMessage, + InProcessMessageWait: pDisk.InProcessMessageWait, + RealtimeOnly: pDisk.RealtimeOnly, + } + + return nil +} diff --git a/cmix/message/services.go b/cmix/message/services.go index 412fc185029372dfc66d6cd980198af7db6ad816..9ede26311cff79aca197228ed51ce3c388b1f7ae 100644 --- a/cmix/message/services.go +++ b/cmix/message/services.go @@ -106,6 +106,8 @@ func (sm *ServicesManager) get(clientID *id.ID, receivedSIH, // queries return []Processor{}, false } + jww.TRACE.Printf("Evaluated service not for me (%s): %s", + clientID, s) } return nil, false @@ -154,6 +156,9 @@ func (sm *ServicesManager) AddService(clientID *id.ID, newService Service, respo "service already exists", newService.Tag) } + jww.DEBUG.Printf("Adding service %s, clientID: %s", newService, + clientID) + // Add the service to the internal map sm.tmap[*clientID][newService.preimage()] = newEntry sm.numServices++ diff --git a/cmix/params.go b/cmix/params.go index d823632e199e021606a3414bc2403babcc3d17b9..d8aa778b104dadbdfa0e28215e00f0a10f5b6761 100644 --- a/cmix/params.go +++ b/cmix/params.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 cmix import ( @@ -57,6 +64,26 @@ type Params struct { Historical rounds.Params } +// paramsDisk will be the marshal-able and umarshal-able object. +type paramsDisk struct { + TrackNetworkPeriod time.Duration + MaxCheckedRounds uint + RegNodesBufferLen uint + NetworkHealthTimeout time.Duration + ParallelNodeRegistrations uint + KnownRoundsThreshold uint + FastPolling bool + VerboseRoundTracking bool + RealtimeOnly bool + ReplayRequests bool + Rounds rounds.Params + Pickup pickup.Params + Message message.Params + Historical rounds.Params +} + +// GetDefaultParams returns a Params object containing the +// default parameters. func GetDefaultParams() Params { n := Params{ TrackNetworkPeriod: 100 * time.Millisecond, @@ -78,18 +105,7 @@ func GetDefaultParams() Params { return n } -func (n Params) Marshal() ([]byte, error) { - return json.Marshal(n) -} - -func (n Params) SetRealtimeOnlyAll() Params { - n.RealtimeOnly = true - n.Pickup.RealtimeOnly = true - n.Message.RealtimeOnly = true - return n -} - -// GetParameters returns the default network parameters, or override with given +// GetParameters returns the default Params, or override with given // parameters, if set. func GetParameters(params string) (Params, error) { p := GetDefaultParams() @@ -102,7 +118,62 @@ func GetParameters(params string) (Params, error) { return p, nil } -type NodeMap map[id.ID]bool +// MarshalJSON adheres to the json.Marshaler interface. +func (p Params) MarshalJSON() ([]byte, error) { + pDisk := paramsDisk{ + TrackNetworkPeriod: p.TrackNetworkPeriod, + MaxCheckedRounds: p.MaxCheckedRounds, + RegNodesBufferLen: p.RegNodesBufferLen, + NetworkHealthTimeout: p.NetworkHealthTimeout, + ParallelNodeRegistrations: p.ParallelNodeRegistrations, + KnownRoundsThreshold: p.KnownRoundsThreshold, + FastPolling: p.FastPolling, + VerboseRoundTracking: p.VerboseRoundTracking, + RealtimeOnly: p.RealtimeOnly, + ReplayRequests: p.ReplayRequests, + Rounds: p.Rounds, + Pickup: p.Pickup, + Message: p.Message, + Historical: p.Historical, + } + + return json.Marshal(&pDisk) +} + +// UnmarshalJSON adheres to the json.Unmarshaler interface. +func (p *Params) UnmarshalJSON(data []byte) error { + pDisk := paramsDisk{} + err := json.Unmarshal(data, &pDisk) + if err != nil { + return err + } + + *p = Params{ + TrackNetworkPeriod: pDisk.TrackNetworkPeriod, + MaxCheckedRounds: pDisk.MaxCheckedRounds, + RegNodesBufferLen: pDisk.RegNodesBufferLen, + NetworkHealthTimeout: pDisk.NetworkHealthTimeout, + ParallelNodeRegistrations: pDisk.ParallelNodeRegistrations, + KnownRoundsThreshold: pDisk.KnownRoundsThreshold, + FastPolling: pDisk.FastPolling, + VerboseRoundTracking: pDisk.VerboseRoundTracking, + RealtimeOnly: pDisk.RealtimeOnly, + ReplayRequests: pDisk.ReplayRequests, + Rounds: pDisk.Rounds, + Pickup: pDisk.Pickup, + Message: pDisk.Message, + Historical: pDisk.Historical, + } + + return nil +} + +func (p Params) SetRealtimeOnlyAll() Params { + p.RealtimeOnly = true + p.Pickup.RealtimeOnly = true + p.Message.RealtimeOnly = true + return p +} const DefaultDebugTag = "External" @@ -137,6 +208,17 @@ type CMIXParams struct { Critical bool } +// cMixParamsDisk will be the marshal-able and umarshal-able object. +type cMixParamsDisk struct { + RoundTries uint + Timeout time.Duration + RetryDelay time.Duration + SendTimeout time.Duration + DebugTag string + BlacklistedNodes NodeMap + Critical bool +} + func GetDefaultCMIXParams() CMIXParams { return CMIXParams{ RoundTries: 10, @@ -163,6 +245,47 @@ func GetCMIXParameters(params string) (CMIXParams, error) { return p, nil } +// MarshalJSON adheres to the json.Marshaler interface. +func (p CMIXParams) MarshalJSON() ([]byte, error) { + pDisk := cMixParamsDisk{ + RoundTries: p.RoundTries, + Timeout: p.Timeout, + RetryDelay: p.RetryDelay, + SendTimeout: p.SendTimeout, + DebugTag: p.DebugTag, + Critical: p.Critical, + BlacklistedNodes: p.BlacklistedNodes, + } + + return json.Marshal(&pDisk) + +} + +// UnmarshalJSON adheres to the json.Unmarshaler interface. +func (p *CMIXParams) UnmarshalJSON(data []byte) error { + pDisk := cMixParamsDisk{} + err := json.Unmarshal(data, &pDisk) + if err != nil { + return err + } + + *p = CMIXParams{ + RoundTries: pDisk.RoundTries, + Timeout: pDisk.Timeout, + RetryDelay: pDisk.RetryDelay, + SendTimeout: pDisk.SendTimeout, + DebugTag: pDisk.DebugTag, + Critical: pDisk.Critical, + BlacklistedNodes: pDisk.BlacklistedNodes, + } + + return nil +} + +// NodeMap represents a map of nodes and whether they have been +// blacklisted. This is designed for use with CMIXParams.BlacklistedNodes +type NodeMap map[id.ID]bool + // MarshalJSON adheres to the json.Marshaler interface. func (nm NodeMap) MarshalJSON() ([]byte, error) { stringMap := make(map[string]bool, len(nm)) diff --git a/cmix/params_test.go b/cmix/params_test.go index bb19499b3640c5234ece0b9a14d2cd7789649872..90ece9d5f6ff0dbf23a528832a0adc297425818e 100644 --- a/cmix/params_test.go +++ b/cmix/params_test.go @@ -8,6 +8,7 @@ package cmix import ( + "bytes" "encoding/json" "gitlab.com/xx_network/primitives/id" "reflect" @@ -15,6 +16,43 @@ import ( "time" ) +// Tests that no data is lost when marshaling and +// unmarshaling the Params object. +func TestParams_MarshalUnmarshal(t *testing.T) { + // Construct a set of params + p := GetDefaultParams() + + // Marshal the params + data, err := json.Marshal(&p) + if err != nil { + t.Fatalf("Marshal error: %v", err) + } + + t.Logf("%s", string(data)) + + // Unmarshal the params object + received := Params{} + err = json.Unmarshal(data, &received) + if err != nil { + t.Fatalf("Unmarshal error: %v", err) + } + + // Re-marshal this params object + data2, err := json.Marshal(received) + if err != nil { + t.Fatalf("Marshal error: %v", err) + } + + 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) + if !bytes.Equal(data, data2) { + t.Fatalf("Data was lost in marshal/unmarshal.") + } +} + func TestCMIXParams_JSON_Marshal_Unmarshal(t *testing.T) { p := CMIXParams{ RoundTries: 5, diff --git a/cmix/pickup/params.go b/cmix/pickup/params.go index 95200674d0e0e8a791a0236e1a5dc019b4b59225..99ec4cb835557f411d3d88cdf07acc23e40dba14 100644 --- a/cmix/pickup/params.go +++ b/cmix/pickup/params.go @@ -1,7 +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 pickup -import "time" +import ( + "encoding/json" + "time" +) +// Params contains the parameters for the pickup package. type Params struct { // Number of worker threads for retrieving messages from gateways NumMessageRetrievalWorkers uint @@ -31,6 +42,19 @@ type Params struct { ForceHistoricalRounds bool } +// paramsDisk will be the marshal-able and umarshal-able object. +type paramsDisk struct { + NumMessageRetrievalWorkers uint + LookupRoundsBufferLen uint + MaxHistoricalRoundsRetries uint + UncheckRoundPeriod time.Duration + ForceMessagePickupRetry bool + SendTimeout time.Duration + RealtimeOnly bool + ForceHistoricalRounds bool +} + +// GetDefaultParams returns a default set of Params. func GetDefaultParams() Params { return Params{ NumMessageRetrievalWorkers: 8, @@ -42,3 +66,55 @@ func GetDefaultParams() Params { RealtimeOnly: false, } } + +// 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 +} + +// MarshalJSON adheres to the json.Marshaler interface. +func (p Params) MarshalJSON() ([]byte, error) { + pDisk := paramsDisk{ + NumMessageRetrievalWorkers: p.NumMessageRetrievalWorkers, + LookupRoundsBufferLen: p.LookupRoundsBufferLen, + MaxHistoricalRoundsRetries: p.MaxHistoricalRoundsRetries, + UncheckRoundPeriod: p.UncheckRoundPeriod, + ForceMessagePickupRetry: p.ForceMessagePickupRetry, + SendTimeout: p.SendTimeout, + RealtimeOnly: p.RealtimeOnly, + ForceHistoricalRounds: p.ForceHistoricalRounds, + } + + return json.Marshal(&pDisk) + +} + +// UnmarshalJSON adheres to the json.Unmarshaler interface. +func (p *Params) UnmarshalJSON(data []byte) error { + pDisk := paramsDisk{} + err := json.Unmarshal(data, &pDisk) + if err != nil { + return err + } + + *p = Params{ + NumMessageRetrievalWorkers: pDisk.NumMessageRetrievalWorkers, + LookupRoundsBufferLen: pDisk.LookupRoundsBufferLen, + MaxHistoricalRoundsRetries: pDisk.MaxHistoricalRoundsRetries, + UncheckRoundPeriod: pDisk.UncheckRoundPeriod, + ForceMessagePickupRetry: pDisk.ForceMessagePickupRetry, + SendTimeout: pDisk.SendTimeout, + RealtimeOnly: pDisk.RealtimeOnly, + ForceHistoricalRounds: pDisk.ForceHistoricalRounds, + } + + return nil +} diff --git a/cmix/pickup/retrieve.go b/cmix/pickup/retrieve.go index c66b52092f4951eebe83824b9776678e7a6103b0..b189d8a22d9635160f000b816c822abbc0ba9da9 100644 --- a/cmix/pickup/retrieve.go +++ b/cmix/pickup/retrieve.go @@ -9,6 +9,8 @@ package pickup import ( "encoding/binary" + "time" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/cmix/gateway" @@ -22,7 +24,6 @@ import ( "gitlab.com/xx_network/comms/connect" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" - "time" ) type MessageRetrievalComms interface { @@ -194,7 +195,7 @@ func (m *pickup) getMessagesFromGateway(roundID id.Round, return msgResp, nil }, stop, m.params.SendTimeout) - jww.INFO.Printf("Received message for round %d, processing...", roundID) + jww.INFO.Printf("Received messages for round %d, processing...", roundID) // Fail the round if an error occurs so that it can be tried again later if err != nil { @@ -206,7 +207,7 @@ func (m *pickup) getMessagesFromGateway(roundID id.Round, // If there are no messages, print a warning. Due to the probabilistic // nature of the bloom filters, false positives will happen sometimes msgs := msgResp.GetMessages() - if msgs == nil || len(msgs) == 0 { + if len(msgs) == 0 { jww.WARN.Printf("no messages for client %s "+ " in round %d. This happening every once in a while is normal,"+ " but can be indicative of a problem if it is consistent", @@ -229,15 +230,16 @@ func (m *pickup) getMessagesFromGateway(roundID id.Round, bundle := message.Bundle{ Round: roundID, Messages: make([]format.Message, len(msgs)), - Finish: func() { - return - }, + Finish: func() {}, } + mSize := m.session.GetCmixGroup().GetP().ByteLen() for i, slot := range msgs { - msg := format.NewMessage(m.session.GetCmixGroup().GetP().ByteLen()) + msg := format.NewMessage(mSize) msg.SetPayloadA(slot.PayloadA) msg.SetPayloadB(slot.PayloadB) + jww.INFO.Printf("Received message of msgDigest: %s, round %d", + msg.Digest(), roundID) bundle.Messages[i] = msg } diff --git a/cmix/results_test.go b/cmix/results_test.go index 829ec0b116ee4a02b8238d0c5498aa384216fbe9..eaa2edb2b8de79d4caf49cada4c8e95123ca5c03 100644 --- a/cmix/results_test.go +++ b/cmix/results_test.go @@ -6,250 +6,241 @@ /////////////////////////////////////////////////////////////////////////////// package cmix -import ( - pb "gitlab.com/elixxir/comms/mixmessages" - ds "gitlab.com/elixxir/comms/network/dataStructures" - "gitlab.com/elixxir/primitives/states" - "gitlab.com/xx_network/primitives/id" - "testing" - "time" -) - const numRounds = 10 -// Happy path -func TestClient_GetRoundResults(t *testing.T) { - // Populate a round list to request - var roundList []id.Round - for i := 0; i < numRounds; i++ { - roundList = append(roundList, id.Round(i)) - } - - testTopology := [][]byte{id.NewIdFromUInt(1, id.Node, t).Bytes(), - id.NewIdFromUInt(2, id.Node, t).Bytes(), - id.NewIdFromUInt(3, id.Node, t).Bytes(), - id.NewIdFromUInt(4, id.Node, t).Bytes(), - } - - // Pre-populate the results channel with successful round - sendResults := make(chan ds.EventReturn, len(roundList)) - for i := 0; i < numRounds; i++ { - sendResults <- ds.EventReturn{ - RoundInfo: &pb.RoundInfo{ - ID: uint64(i), - State: uint32(states.COMPLETED), - Topology: testTopology, - }, - TimedOut: false, - } - } - - m, err := newTestClient(t) - if err != nil { - t.Fatalf("Failed in setup: %v", err) - } - - // Construct the round call back function signature - var successfulRounds, timeout bool - receivedRCB := func(allRoundsSucceeded, timedOut bool, rounds map[id.Round]RoundResult) { - successfulRounds = allRoundsSucceeded - timeout = timedOut - } - - // Call the round results - err = m.getRoundResults(roundList, time.Duration(10)*time.Millisecond, - receivedRCB, sendResults) - if err != nil { - t.Errorf("Error in happy path: %v", err) - } - - // Sleep to allow the report to come through the pipeline - time.Sleep(1 * time.Second) - - // If any rounds timed out or any round failed, the happy path has failed - if timeout || !successfulRounds { - t.Errorf("Unexpected round failures in happy path. "+ - "Expected all rounds to succeed with no timeouts."+ - "\n\tTimedOut: %v"+ - "\n\tallRoundsSucceeded: %v", timeout, successfulRounds) - } - -} - -// Checks that an two failed rounds (one timed out, one failure) -// affects the values in the report. -// Kept separately to ensure uncoupled failed rounds -// affect both report booleans -func TestClient_GetRoundResults_FailedRounds(t *testing.T) { - // Populate a round list to request - var roundList []id.Round - for i := 0; i < numRounds; i++ { - roundList = append(roundList, id.Round(i)) - } - - testTopology := [][]byte{id.NewIdFromUInt(1, id.Node, t).Bytes(), - id.NewIdFromUInt(2, id.Node, t).Bytes(), - id.NewIdFromUInt(3, id.Node, t).Bytes(), - id.NewIdFromUInt(4, id.Node, t).Bytes(), - } - - // Pre-populate the results channel with mostly successful rounds - sendResults := make(chan ds.EventReturn, len(roundList)) - for i := 0; i < numRounds; i++ { - // Last two rounds will have a failure and a timeout respectively - result := ds.EventReturn{ - RoundInfo: &pb.RoundInfo{ - ID: uint64(i), - State: uint32(states.COMPLETED), - Topology: testTopology, - }, - TimedOut: false, - } - if i == numRounds-2 { - result.RoundInfo.State = uint32(states.FAILED) - } - - sendResults <- result - - } - - // Create a new copy of the test client for this test - m, err := newTestClient(t) - if err != nil { - t.Fatalf("Failed in setup: %v", err) - } - - // Construct the round call back function signature - var successfulRounds, timeout bool - receivedRCB := func(allRoundsSucceeded, timedOut bool, rounds map[id.Round]RoundResult) { - successfulRounds = allRoundsSucceeded - timeout = timedOut - } - - // Call the round results - err = m.getRoundResults(roundList, time.Duration(10)*time.Millisecond, - receivedRCB, sendResults) - if err != nil { - t.Errorf("Error in happy path: %v", err) - } - - // Sleep to allow the report to come through the pipeline - time.Sleep(2 * time.Second) - - // If no rounds have failed, this test has failed - if successfulRounds { - t.Errorf("Expected some rounds to fail. "+ - "\n\tTimedOut: %v"+ - "\n\tallRoundsSucceeded: %v", timeout, successfulRounds) - } - -} - -// Use the historical rounds interface which actually sends back rounds -func TestClient_GetRoundResults_HistoricalRounds(t *testing.T) { - // Populate a round list to request - var roundList []id.Round - for i := 0; i < numRounds; i++ { - roundList = append(roundList, id.Round(i)) - } - - testTopology := [][]byte{id.NewIdFromUInt(1, id.Node, t).Bytes(), - id.NewIdFromUInt(2, id.Node, t).Bytes(), - id.NewIdFromUInt(3, id.Node, t).Bytes(), - id.NewIdFromUInt(4, id.Node, t).Bytes(), - } - - // Pre-populate the results channel with successful rounds - sendResults := make(chan ds.EventReturn, len(roundList)-2) - for i := 0; i < numRounds; i++ { - // Skip sending rounds intended for historical rounds comm - if i == failedHistoricalRoundID || - i == completedHistoricalRoundID { - continue - } - - sendResults <- ds.EventReturn{ - RoundInfo: &pb.RoundInfo{ - ID: uint64(i), - State: uint32(states.COMPLETED), - Topology: testTopology, - }, - TimedOut: false, - } - } - - // Create a new copy of the test client for this test - m, err := newTestClient(t) - if err != nil { - t.Fatalf("Failed in setup: %v", err) - } - - // Construct the round call back function signature - var successfulRounds, timeout bool - receivedRCB := func(allRoundsSucceeded, timedOut bool, rounds map[id.Round]RoundResult) { - successfulRounds = allRoundsSucceeded - timeout = timedOut - } - - // Call the round results - err = m.getRoundResults(roundList, time.Duration(10)*time.Millisecond, - receivedRCB, sendResults) - if err != nil { - t.Errorf("Error in happy path: %v", err) - } - - // Sleep to allow the report to come through the pipeline - time.Sleep(2 * time.Second) - - // If no round failed, this test has failed - if successfulRounds { - t.Errorf("Expected historical rounds to have round failures"+ - "\n\tTimedOut: %v"+ - "\n\tallRoundsSucceeded: %v", timeout, successfulRounds) - } -} - -// Force some timeouts by not populating the entire results channel -func TestClient_GetRoundResults_Timeout(t *testing.T) { - // Populate a round list to request - var roundList []id.Round - for i := 0; i < numRounds; i++ { - roundList = append(roundList, id.Round(i)) - } - - // Create a broken channel which will never send, - // forcing a timeout - var sendResults chan ds.EventReturn - sendResults = nil - - // Create a new copy of the test client for this test - m, err := newTestClient(t) - if err != nil { - t.Fatalf("Failed in setup: %v", err) - } - - // Construct the round call back function signature - var successfulRounds, timeout bool - receivedRCB := func(allRoundsSucceeded, timedOut bool, rounds map[id.Round]RoundResult) { - successfulRounds = allRoundsSucceeded - timeout = timedOut - } - - // Call the round results - err = m.getRoundResults(roundList, time.Duration(10)*time.Millisecond, - receivedRCB, sendResults) - if err != nil { - t.Errorf("Error in happy path: %v", err) - } - - // Sleep to allow the report to come through the pipeline - time.Sleep(2 * time.Second) - - // If no rounds have timed out , this test has failed - if !timeout { - t.Errorf("Expected all rounds to timeout with no valid round reporter."+ - "\n\tTimedOut: %v"+ - "\n\tallRoundsSucceeded: %v", timeout, successfulRounds) - } - -} +// // Happy path +// func TestClient_GetRoundResults(t *testing.T) { +// // Populate a round list to request +// var roundList []id.Round +// for i := 0; i < numRounds; i++ { +// roundList = append(roundList, id.Round(i)) +// } + +// testTopology := [][]byte{id.NewIdFromUInt(1, id.Node, t).Bytes(), +// id.NewIdFromUInt(2, id.Node, t).Bytes(), +// id.NewIdFromUInt(3, id.Node, t).Bytes(), +// id.NewIdFromUInt(4, id.Node, t).Bytes(), +// } + +// // Pre-populate the results channel with successful round +// sendResults := make(chan ds.EventReturn, len(roundList)) +// for i := 0; i < numRounds; i++ { +// sendResults <- ds.EventReturn{ +// RoundInfo: &pb.RoundInfo{ +// ID: uint64(i), +// State: uint32(states.COMPLETED), +// Topology: testTopology, +// }, +// TimedOut: false, +// } +// } + +// m, err := newTestClient(t) +// if err != nil { +// t.Fatalf("Failed in setup: %v", err) +// } + +// // Construct the round call back function signature +// var successfulRounds, timeout bool +// receivedRCB := func(allRoundsSucceeded, timedOut bool, rounds map[id.Round]RoundResult) { +// successfulRounds = allRoundsSucceeded +// timeout = timedOut +// } + +// // Call the round results +// err = m.getRoundResults(roundList, time.Duration(10)*time.Millisecond, +// receivedRCB, sendResults) +// if err != nil { +// t.Errorf("Error in happy path: %v", err) +// } + +// // Sleep to allow the report to come through the pipeline +// time.Sleep(1 * time.Second) + +// // If any rounds timed out or any round failed, the happy path has failed +// if timeout || !successfulRounds { +// t.Errorf("Unexpected round failures in happy path. "+ +// "Expected all rounds to succeed with no timeouts."+ +// "\n\tTimedOut: %v"+ +// "\n\tallRoundsSucceeded: %v", timeout, successfulRounds) +// } + +// } + +// // Checks that an two failed rounds (one timed out, one failure) +// // affects the values in the report. +// // Kept separately to ensure uncoupled failed rounds +// // affect both report booleans +// func TestClient_GetRoundResults_FailedRounds(t *testing.T) { +// // Populate a round list to request +// var roundList []id.Round +// for i := 0; i < numRounds; i++ { +// roundList = append(roundList, id.Round(i)) +// } + +// testTopology := [][]byte{id.NewIdFromUInt(1, id.Node, t).Bytes(), +// id.NewIdFromUInt(2, id.Node, t).Bytes(), +// id.NewIdFromUInt(3, id.Node, t).Bytes(), +// id.NewIdFromUInt(4, id.Node, t).Bytes(), +// } + +// // Pre-populate the results channel with mostly successful rounds +// sendResults := make(chan ds.EventReturn, len(roundList)) +// for i := 0; i < numRounds; i++ { +// // Last two rounds will have a failure and a timeout respectively +// result := ds.EventReturn{ +// RoundInfo: &pb.RoundInfo{ +// ID: uint64(i), +// State: uint32(states.COMPLETED), +// Topology: testTopology, +// }, +// TimedOut: false, +// } +// if i == numRounds-2 { +// result.RoundInfo.State = uint32(states.FAILED) +// } + +// sendResults <- result + +// } + +// // Create a new copy of the test client for this test +// m, err := newTestClient(t) +// if err != nil { +// t.Fatalf("Failed in setup: %v", err) +// } + +// // Construct the round call back function signature +// var successfulRounds, timeout bool +// receivedRCB := func(allRoundsSucceeded, timedOut bool, rounds map[id.Round]RoundResult) { +// successfulRounds = allRoundsSucceeded +// timeout = timedOut +// } + +// // Call the round results +// err = m.getRoundResults(roundList, time.Duration(10)*time.Millisecond, +// receivedRCB, sendResults) +// if err != nil { +// t.Errorf("Error in happy path: %v", err) +// } + +// // Sleep to allow the report to come through the pipeline +// time.Sleep(2 * time.Second) + +// // If no rounds have failed, this test has failed +// if successfulRounds { +// t.Errorf("Expected some rounds to fail. "+ +// "\n\tTimedOut: %v"+ +// "\n\tallRoundsSucceeded: %v", timeout, successfulRounds) +// } + +// } + +// // Use the historical rounds interface which actually sends back rounds +// func TestClient_GetRoundResults_HistoricalRounds(t *testing.T) { +// // Populate a round list to request +// var roundList []id.Round +// for i := 0; i < numRounds; i++ { +// roundList = append(roundList, id.Round(i)) +// } + +// testTopology := [][]byte{id.NewIdFromUInt(1, id.Node, t).Bytes(), +// id.NewIdFromUInt(2, id.Node, t).Bytes(), +// id.NewIdFromUInt(3, id.Node, t).Bytes(), +// id.NewIdFromUInt(4, id.Node, t).Bytes(), +// } + +// // Pre-populate the results channel with successful rounds +// sendResults := make(chan ds.EventReturn, len(roundList)-2) +// for i := 0; i < numRounds; i++ { +// // Skip sending rounds intended for historical rounds comm +// if i == failedHistoricalRoundID || +// i == completedHistoricalRoundID { +// continue +// } + +// sendResults <- ds.EventReturn{ +// RoundInfo: &pb.RoundInfo{ +// ID: uint64(i), +// State: uint32(states.COMPLETED), +// Topology: testTopology, +// }, +// TimedOut: false, +// } +// } + +// // Create a new copy of the test client for this test +// m, err := newTestClient(t) +// if err != nil { +// t.Fatalf("Failed in setup: %v", err) +// } + +// // Construct the round call back function signature +// var successfulRounds, timeout bool +// receivedRCB := func(allRoundsSucceeded, timedOut bool, rounds map[id.Round]RoundResult) { +// successfulRounds = allRoundsSucceeded +// timeout = timedOut +// } + +// // Call the round results +// err = m.getRoundResults(roundList, time.Duration(10)*time.Millisecond, +// receivedRCB, sendResults) +// if err != nil { +// t.Errorf("Error in happy path: %v", err) +// } + +// // Sleep to allow the report to come through the pipeline +// time.Sleep(2 * time.Second) + +// // If no round failed, this test has failed +// if successfulRounds { +// t.Errorf("Expected historical rounds to have round failures"+ +// "\n\tTimedOut: %v"+ +// "\n\tallRoundsSucceeded: %v", timeout, successfulRounds) +// } +// } + +// // Force some timeouts by not populating the entire results channel +// func TestClient_GetRoundResults_Timeout(t *testing.T) { +// // Populate a round list to request +// var roundList []id.Round +// for i := 0; i < numRounds; i++ { +// roundList = append(roundList, id.Round(i)) +// } + +// // Create a broken channel which will never send, +// // forcing a timeout +// var sendResults chan ds.EventReturn +// sendResults = nil + +// // Create a new copy of the test client for this test +// m, err := newTestClient(t) +// if err != nil { +// t.Fatalf("Failed in setup: %v", err) +// } + +// // Construct the round call back function signature +// var successfulRounds, timeout bool +// receivedRCB := func(allRoundsSucceeded, timedOut bool, rounds map[id.Round]RoundResult) { +// successfulRounds = allRoundsSucceeded +// timeout = timedOut +// } + +// // Call the round results +// err = m.getRoundResults(roundList, time.Duration(10)*time.Millisecond, +// receivedRCB, sendResults) +// if err != nil { +// t.Errorf("Error in happy path: %v", err) +// } + +// // Sleep to allow the report to come through the pipeline +// time.Sleep(2 * time.Second) + +// // If no rounds have timed out , this test has failed +// if !timeout { +// t.Errorf("Expected all rounds to timeout with no valid round reporter."+ +// "\n\tTimedOut: %v"+ +// "\n\tallRoundsSucceeded: %v", timeout, successfulRounds) +// } + +// } diff --git a/cmix/rounds/params.go b/cmix/rounds/params.go index 1023f6022acce31a971747c5f31bfebdec724c03..dd9596c2fcf6809010ceb9fbeda609f2ef3b6645 100644 --- a/cmix/rounds/params.go +++ b/cmix/rounds/params.go @@ -1,7 +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 rounds -import "time" +import ( + "encoding/json" + "time" +) +// Params contains the parameters for the rounds package. type Params struct { // MaxHistoricalRounds is the number of historical rounds required to // automatically send a historical rounds query. @@ -20,6 +31,15 @@ type Params struct { MaxHistoricalRoundsRetries uint } +// paramsDisk will be the marshal-able and umarshal-able object. +type paramsDisk struct { + MaxHistoricalRounds uint + HistoricalRoundsPeriod time.Duration + HistoricalRoundsBufferLen uint + MaxHistoricalRoundsRetries uint +} + +// GetDefaultParams returns a default set of Params. func GetDefaultParams() Params { return Params{ MaxHistoricalRounds: 100, @@ -28,3 +48,47 @@ func GetDefaultParams() Params { MaxHistoricalRoundsRetries: 3, } } + +// 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 +} + +// MarshalJSON adheres to the json.Marshaler interface. +func (r Params) MarshalJSON() ([]byte, error) { + pDisk := paramsDisk{ + MaxHistoricalRounds: r.MaxHistoricalRounds, + HistoricalRoundsPeriod: r.HistoricalRoundsPeriod, + HistoricalRoundsBufferLen: r.HistoricalRoundsBufferLen, + MaxHistoricalRoundsRetries: r.MaxHistoricalRoundsRetries, + } + + return json.Marshal(&pDisk) + +} + +// UnmarshalJSON adheres to the json.Unmarshaler interface. +func (r *Params) UnmarshalJSON(data []byte) error { + pDisk := paramsDisk{} + err := json.Unmarshal(data, &pDisk) + if err != nil { + return err + } + + *r = Params{ + MaxHistoricalRounds: pDisk.MaxHistoricalRounds, + HistoricalRoundsPeriod: pDisk.HistoricalRoundsPeriod, + HistoricalRoundsBufferLen: pDisk.HistoricalRoundsBufferLen, + MaxHistoricalRoundsRetries: pDisk.MaxHistoricalRoundsRetries, + } + + return nil +} diff --git a/cmix/sendCmix_test.go b/cmix/sendCmix_test.go index 137d273cb0e7533ed8f369a1c0c9578604ac9065..67ec64ef857f9220adb3d23998aef44442631ba3 100644 --- a/cmix/sendCmix_test.go +++ b/cmix/sendCmix_test.go @@ -1,34 +1,26 @@ package cmix -import ( - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/primitives/format" - "gitlab.com/xx_network/crypto/csprng" - "gitlab.com/xx_network/primitives/id" - "testing" -) +// func TestClient_SendCMIX(t *testing.T) { +// c, err := newTestClient(t) +// if err != nil { +// t.Fatalf("Failed to create test client: %+v", err) +// } -func TestClient_SendCMIX(t *testing.T) { - c, err := newTestClient(t) - if err != nil { - t.Fatalf("Failed to create test client: %+v", err) - } - - recipientID := id.NewIdFromString("zezima", id.User, t) - contents := []byte("message") - fp := format.NewFingerprint(contents) - service := message.GetDefaultService(recipientID) - mac := make([]byte, 32) - _, err = csprng.NewSystemRNG().Read(mac) - if err != nil { - t.Errorf("Failed to read random mac bytes: %+v", err) - } - mac[0] = 0 - params := GetDefaultCMIXParams() - rid, eid, err := c.Send(recipientID, fp, service, contents, mac, params) - if err != nil { - t.Errorf("Failed to sendcmix: %+v", err) - t.FailNow() - } - t.Logf("Test of Send returned:\n\trid: %v\teid: %+v", rid, eid) -} +// recipientID := id.NewIdFromString("zezima", id.User, t) +// contents := []byte("message") +// fp := format.NewFingerprint(contents) +// service := message.GetDefaultService(recipientID) +// mac := make([]byte, 32) +// _, err = csprng.NewSystemRNG().Read(mac) +// if err != nil { +// t.Errorf("Failed to read random mac bytes: %+v", err) +// } +// mac[0] = 0 +// params := GetDefaultCMIXParams() +// rid, eid, err := c.Send(recipientID, fp, service, contents, mac, params) +// if err != nil { +// t.Errorf("Failed to sendcmix: %+v", err) +// t.FailNow() +// } +// t.Logf("Test of Send returned:\n\trid: %v\teid: %+v", rid, eid) +// } diff --git a/cmix/sendManyCmix_test.go b/cmix/sendManyCmix_test.go index f0eb4b8d689c4a7b243cfb64101d77170ed53a2d..845dcd5981d49ca56112d1394041968cb8a3b0ee 100644 --- a/cmix/sendManyCmix_test.go +++ b/cmix/sendManyCmix_test.go @@ -1,50 +1,42 @@ package cmix -import ( - "gitlab.com/elixxir/client/cmix/message" - "gitlab.com/elixxir/primitives/format" - "gitlab.com/xx_network/crypto/csprng" - "gitlab.com/xx_network/primitives/id" - "testing" -) +// func TestClient_SendMany_SendManyCMIX(t *testing.T) { +// c, err := newTestClient(t) +// if err != nil { +// t.Fatalf("Failed to create test client: %+v", err) +// } -func TestClient_SendMany_SendManyCMIX(t *testing.T) { - c, err := newTestClient(t) - if err != nil { - t.Fatalf("Failed to create test client: %+v", err) - } +// recipientID := id.NewIdFromString("zezima", id.User, t) +// contents := []byte("message") +// fp := format.NewFingerprint(contents) +// service := message.GetDefaultService(recipientID) +// mac := make([]byte, 32) +// _, err = csprng.NewSystemRNG().Read(mac) +// if err != nil { +// t.Errorf("Failed to read random mac bytes: %+v", err) +// } +// mac[0] = 0 +// messages := []TargetedCmixMessage{ +// { +// Recipient: recipientID, +// Payload: contents, +// Fingerprint: fp, +// Service: service, +// Mac: mac, +// }, +// { +// Recipient: recipientID, +// Payload: contents, +// Fingerprint: fp, +// Service: service, +// Mac: mac, +// }, +// } - recipientID := id.NewIdFromString("zezima", id.User, t) - contents := []byte("message") - fp := format.NewFingerprint(contents) - service := message.GetDefaultService(recipientID) - mac := make([]byte, 32) - _, err = csprng.NewSystemRNG().Read(mac) - if err != nil { - t.Errorf("Failed to read random mac bytes: %+v", err) - } - mac[0] = 0 - messages := []TargetedCmixMessage{ - { - Recipient: recipientID, - Payload: contents, - Fingerprint: fp, - Service: service, - Mac: mac, - }, - { - Recipient: recipientID, - Payload: contents, - Fingerprint: fp, - Service: service, - Mac: mac, - }, - } +// rid, eid, err := c.SendMany(messages, GetDefaultCMIXParams()) +// if err != nil { +// t.Errorf("Failed to run SendMany: %+v", err) +// } +// t.Logf("Test of SendMany returned:\n\trid: %v\teid: %+v", rid, eid) - rid, eid, err := c.SendMany(messages, GetDefaultCMIXParams()) - if err != nil { - t.Errorf("Failed to run SendMany: %+v", err) - } - t.Logf("Test of SendMany returned:\n\trid: %v\teid: %+v", rid, eid) - -} +// } diff --git a/cmix/utils_test.go b/cmix/utils_test.go index 6fffb13db3f47dee64d71e89f6e254050d0318c0..9d7b20d3df65c8dd77b4e464ac1898e6c1eaae5d 100644 --- a/cmix/utils_test.go +++ b/cmix/utils_test.go @@ -7,31 +7,23 @@ package cmix import ( + "time" + "github.com/pkg/errors" "gitlab.com/elixxir/client/cmix/gateway" "gitlab.com/elixxir/client/cmix/nodes" "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/client/storage" - "gitlab.com/elixxir/client/storage/versioned" - commClient "gitlab.com/elixxir/comms/client" "gitlab.com/elixxir/comms/mixmessages" commsNetwork "gitlab.com/elixxir/comms/network" ds "gitlab.com/elixxir/comms/network/dataStructures" "gitlab.com/elixxir/crypto/cyclic" - "gitlab.com/elixxir/crypto/fastRNG" - "gitlab.com/elixxir/ekv" "gitlab.com/elixxir/primitives/format" "gitlab.com/elixxir/primitives/states" "gitlab.com/xx_network/comms/connect" - "gitlab.com/xx_network/comms/signature" - "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" "gitlab.com/xx_network/primitives/id/ephemeral" "gitlab.com/xx_network/primitives/ndf" - "testing" - "time" ) // mockManagerComms @@ -209,70 +201,70 @@ func mockFailCriticalSender(msg format.Message, recipient *id.ID, return id.Round(1), ephemeral.Id{}, errors.New("Test error") } -func newTestClient(t *testing.T) (*client, error) { - kv := versioned.NewKV(ekv.Memstore{}) - myID := id.NewIdFromString("zezima", id.User, t) - comms, err := commClient.NewClientComms(myID, nil, nil, nil) - if err != nil { - return nil, err - } - - inst, err := commsNetwork.NewInstanceTesting(comms.ProtoComms, getNDF(), getNDF(), getGroup(), getGroup(), t) - if err != nil { - return nil, err - } - pk, err := rsa.GenerateKey(csprng.NewSystemRNG(), 2048) - if err != nil { - return nil, err - } - pubKey := pk.GetPublic() - - now := netTime.Now() - timestamps := []uint64{ - uint64(now.Add(-30 * time.Second).UnixNano()), //PENDING - uint64(now.Add(-25 * time.Second).UnixNano()), //PRECOMPUTING - uint64(now.Add(-5 * time.Second).UnixNano()), //STANDBY - uint64(now.Add(5 * time.Second).UnixNano()), //QUEUED - 0} //REALTIME - - nid1 := id.NewIdFromString("nid1", id.Node, t) - nid2 := id.NewIdFromString("nid2", id.Node, t) - nid3 := id.NewIdFromString("nid3", id.Node, t) - ri := &mixmessages.RoundInfo{ - ID: 3, - UpdateID: 0, - State: uint32(states.QUEUED), - BatchSize: 0, - Topology: [][]byte{nid1.Marshal(), nid2.Marshal(), nid3.Marshal()}, - Timestamps: timestamps, - Errors: nil, - ClientErrors: nil, - ResourceQueueTimeoutMillis: 0, - Signature: nil, - AddressSpaceSize: 4, - } - - err = signature.SignRsa(ri, pk) - if err != nil { - return nil, err - } - rnd := ds.NewRound(ri, pubKey, nil) - inst.GetWaitingRounds().Insert([]*ds.Round{rnd}, nil) - - m := &client{ - session: storage.InitTestingSession(t), - rng: fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG), - instance: inst, - comms: &mockManagerComms{}, - param: GetDefaultParams(), - Sender: &mockGatewaySender{}, - Registrar: &mockNodesRegistrar{}, - Monitor: &mockMonitor{}, - crit: newCritical(kv, &mockMonitor{}, &mockRoundEventRegistrar{}, mockCriticalSender), - events: &mockEventManager{}, - } - return m, nil -} +// func newTestClient(t *testing.T) (*client, error) { +// kv := versioned.NewKV(ekv.MakeMemstore()) +// myID := id.NewIdFromString("zezima", id.User, t) +// comms, err := commClient.NewClientComms(myID, nil, nil, nil) +// if err != nil { +// return nil, err +// } + +// inst, err := commsNetwork.NewInstanceTesting(comms.ProtoComms, getNDF(), getNDF(), getGroup(), getGroup(), t) +// if err != nil { +// return nil, err +// } +// pk, err := rsa.GenerateKey(csprng.NewSystemRNG(), 2048) +// if err != nil { +// return nil, err +// } +// pubKey := pk.GetPublic() + +// now := netTime.Now() +// timestamps := []uint64{ +// uint64(now.Add(-30 * time.Second).UnixNano()), //PENDING +// uint64(now.Add(-25 * time.Second).UnixNano()), //PRECOMPUTING +// uint64(now.Add(-5 * time.Second).UnixNano()), //STANDBY +// uint64(now.Add(5 * time.Second).UnixNano()), //QUEUED +// 0} //REALTIME + +// nid1 := id.NewIdFromString("nid1", id.Node, t) +// nid2 := id.NewIdFromString("nid2", id.Node, t) +// nid3 := id.NewIdFromString("nid3", id.Node, t) +// ri := &mixmessages.RoundInfo{ +// ID: 3, +// UpdateID: 0, +// State: uint32(states.QUEUED), +// BatchSize: 0, +// Topology: [][]byte{nid1.Marshal(), nid2.Marshal(), nid3.Marshal()}, +// Timestamps: timestamps, +// Errors: nil, +// ClientErrors: nil, +// ResourceQueueTimeoutMillis: 0, +// Signature: nil, +// AddressSpaceSize: 4, +// } + +// err = signature.SignRsa(ri, pk) +// if err != nil { +// return nil, err +// } +// rnd := ds.NewRound(ri, pubKey, nil) +// inst.GetWaitingRounds().Insert([]*ds.Round{rnd}, nil) + +// m := &client{ +// session: storage.InitTestingSession(t), +// rng: fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG), +// instance: inst, +// comms: &mockManagerComms{}, +// param: GetDefaultParams(), +// Sender: &mockGatewaySender{}, +// Registrar: &mockNodesRegistrar{}, +// Monitor: &mockMonitor{}, +// crit: newCritical(kv, &mockMonitor{}, &mockRoundEventRegistrar{}, mockCriticalSender), +// events: &mockEventManager{}, +// } +// return m, nil +// } // Constructs a mock ndf func getNDF() *ndf.NetworkDefinition { diff --git a/connect/connect.go b/connect/connect.go index 1f0a6db7449f9c3fac9db297114997bce803fdd1..ebb98f52aa6835120e3c12b39312c3a8c5185392 100644 --- a/connect/connect.go +++ b/connect/connect.go @@ -7,6 +7,10 @@ package connect import ( + "encoding/json" + "io" + "time" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/auth" @@ -26,8 +30,6 @@ import ( "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" - "io" - "time" ) const ( @@ -59,6 +61,22 @@ type Connection interface { newListener receive.Listener) receive.ListenerID // Unregister listener for E2E reception Unregister(listenerID receive.ListenerID) + + // FirstPartitionSize returns the max partition payload size for the + // first payload + FirstPartitionSize() uint + + // SecondPartitionSize returns the max partition payload size for all + // payloads after the first payload + SecondPartitionSize() uint + + // PartitionSize returns the partition payload size for the given + // payload index. The first payload is index 0. + PartitionSize(payloadIndex uint) uint + + // PayloadSize Returns the max payload size for a partitionable E2E + // message + PayloadSize() uint } // Callback is the callback format required to retrieve @@ -67,9 +85,9 @@ type Callback func(connection Connection) // Params for managing Connection objects. type Params struct { - Auth auth.Param + Auth auth.Params Rekey rekey.Params - Event event.Reporter + Event event.Reporter `json:"-"` Timeout time.Duration } @@ -83,6 +101,19 @@ func GetDefaultParams() Params { } } +// 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 @@ -91,6 +122,9 @@ func Connect(recipient contact.Contact, myId *id.ID, privKey *cyclic.Int, rng *fastRNG.StreamGenerator, grp *cyclic.Group, net cmix.Client, p Params) (Connection, error) { + //add the identity + net.AddIdentity(myId, time.Time{}, false) + // Build an ephemeral KV kv := versioned.NewKV(ekv.MakeMemstore()) @@ -109,7 +143,7 @@ func Connect(recipient contact.Contact, myId *id.ID, privKey *cyclic.Int, cb := func(connection Connection) { signalChannel <- connection } - callback := getAuthCallback(cb, e2eHandler, p) + callback := getAuthCallback(cb, nil, e2eHandler, p) // Build auth object for E2E negotiation authState, err := auth.NewState(kv, net, e2eHandler, @@ -166,7 +200,7 @@ func StartServer(cb Callback, myId *id.ID, privKey *cyclic.Int, } // Build callback for E2E negotiation - callback := getAuthCallback(cb, e2eHandler, p) + callback := getAuthCallback(nil, cb, e2eHandler, p) // Build auth object for E2E negotiation authState, err := auth.NewState(kv, net, e2eHandler, @@ -231,7 +265,8 @@ func (h *handler) Unregister(listenerID receive.ListenerID) { // building new Connection objects when an auth Request is received. type authCallback struct { // Used for signaling confirmation of E2E partnership - connectionCallback Callback + confrimCallback Callback + requestCallback Callback // Used for building new Connection objects connectionE2e clientE2e.Handler @@ -241,12 +276,14 @@ type authCallback struct { // getAuthCallback returns a callback interface to be passed into the creation // of an auth.State object. -func getAuthCallback(cb Callback, e2e clientE2e.Handler, +// it will accept requests only if a request callback is passed in +func getAuthCallback(confirm, request Callback, e2e clientE2e.Handler, params Params) *authCallback { return &authCallback{ - connectionCallback: cb, - connectionE2e: e2e, - connectionParams: params, + confrimCallback: confirm, + requestCallback: request, + connectionE2e: e2e, + connectionParams: params, } } @@ -262,28 +299,76 @@ func (a authCallback) Confirm(requestor contact.Contact, jww.ERROR.Printf("Unable to build connection with "+ "partner %s: %+v", requestor.ID, err) // Send a nil connection to avoid hold-ups down the line - a.connectionCallback(nil) + if a.confrimCallback != nil { + a.confrimCallback(nil) + } + return } // Return the new Connection object - a.connectionCallback(BuildConnection(newPartner, a.connectionE2e, - a.connectionParams)) + if a.confrimCallback != nil { + a.confrimCallback(BuildConnection(newPartner, a.connectionE2e, + a.connectionParams)) + } + } // Request will be called when an auth Request message is processed. func (a authCallback) Request(requestor contact.Contact, receptionID receptionID.EphemeralIdentity, round rounds.Round) { + if a.requestCallback == nil { + jww.ERROR.Printf("Recieved a request when requests are" + + "not enable, will not accept") + } _, err := a.authState.Confirm(requestor) if err != nil { jww.ERROR.Printf("Unable to build connection with "+ "partner %s: %+v", requestor.ID, err) // Send a nil connection to avoid hold-ups down the line - a.connectionCallback(nil) + a.requestCallback(nil) } + // After confirmation, get the new partner + newPartner, err := a.connectionE2e.GetPartner(requestor.ID) + if err != nil { + jww.ERROR.Printf("Unable to build connection with "+ + "partner %s: %+v", requestor.ID, err) + // Send a nil connection to avoid hold-ups down the line + a.requestCallback(nil) + + return + } + + // Return the new Connection object + a.requestCallback(BuildConnection(newPartner, a.connectionE2e, + a.connectionParams)) } // Reset will be called when an auth Reset operation occurs. func (a authCallback) Reset(requestor contact.Contact, receptionID receptionID.EphemeralIdentity, round rounds.Round) { } + +// FirstPartitionSize returns the max partition payload size for the +// first payload +func (h *handler) FirstPartitionSize() uint { + return h.e2e.FirstPartitionSize() +} + +// SecondPartitionSize returns the max partition payload size for all +// payloads after the first payload +func (h *handler) SecondPartitionSize() uint { + return h.e2e.SecondPartitionSize() +} + +// PartitionSize returns the partition payload size for the given +// payload index. The first payload is index 0. +func (h *handler) PartitionSize(payloadIndex uint) uint { + return h.e2e.PartitionSize(payloadIndex) +} + +// PayloadSize Returns the max payload size for a partitionable E2E +// message +func (h *handler) PayloadSize() uint { + return h.e2e.PayloadSize() +} diff --git a/connect/params_test.go b/connect/params_test.go new file mode 100644 index 0000000000000000000000000000000000000000..5501ad55153af983a72df2b0ab4d1e8b64358628 --- /dev/null +++ b/connect/params_test.go @@ -0,0 +1,49 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package connect + +import ( + "bytes" + "encoding/json" + "testing" +) + +func TestParams_MarshalUnmarshal(t *testing.T) { + // Construct a set of params + p := GetDefaultParams() + + // Marshal the params + data, err := json.Marshal(&p) + if err != nil { + t.Fatalf("Marshal error: %v", err) + } + + t.Logf("%s", string(data)) + + // Unmarshal the params object + received := Params{} + err = json.Unmarshal(data, &received) + if err != nil { + t.Fatalf("Unmarshal error: %v", err) + } + + // Re-marshal this params object + data2, err := json.Marshal(received) + if err != nil { + t.Fatalf("Marshal error: %v", err) + } + + 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) + if !bytes.Equal(data, data2) { + t.Fatalf("Data was lost in marshal/unmarshal.") + } +} diff --git a/connect/utils_test.go b/connect/utils_test.go index 39f518b15a92bc9c588558eb4ee3fb4f52997f3f..2d5bb68cfacf229904ce521590c175c035b0f538 100644 --- a/connect/utils_test.go +++ b/connect/utils_test.go @@ -83,11 +83,11 @@ func (m mockPartner) Contact() contact.Contact { } } -func (m mockPartner) PopSendCypher() (*session.Cypher, error) { +func (m mockPartner) PopSendCypher() (session.Cypher, error) { return nil, nil } -func (m mockPartner) PopRekeyCypher() (*session.Cypher, error) { +func (m mockPartner) PopRekeyCypher() (session.Cypher, error) { return nil, nil } @@ -143,6 +143,22 @@ func newMockConnection(partnerId, myId *id.ID, } } +func (m mockConnection) FirstPartitionSize() uint { + return 0 +} + +func (m mockConnection) SecondPartitionSize() uint { + return 0 +} + +func (m mockConnection) PartitionSize(payloadIndex uint) uint { + return 0 +} + +func (m mockConnection) PayloadSize() uint { + return 0 +} + func (m mockConnection) Close() error { return nil } diff --git a/dummy/manager.go b/dummy/manager.go index 6a3b71ccb4e3fc7d34040b6751ef92651f66ff29..b7c94096101b293e5ee5f7b9ca42a4e9f89b4276 100644 --- a/dummy/manager.go +++ b/dummy/manager.go @@ -66,9 +66,10 @@ type Manager struct { // 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 *api.Client) *Manager { + client *api.Client, manager interfaces.NetworkManager) *Manager { + clientStorage := client.GetStorage() return newManager(maxNumMessages, avgSendDelta, randomRange, client, - client.GetStorage(), client.GetNetworkInterface(), client.GetRng()) + &clientStorage, manager, client.GetRng()) } // newManager builds a new dummy Manager from fields explicitly passed in. This diff --git a/dummy/send.go b/dummy/send.go index 4b4722251055773072551a025c1ca65575ff7c40..f6f532c81557a3c440a1296a8c60f2f114146f73 100644 --- a/dummy/send.go +++ b/dummy/send.go @@ -8,16 +8,17 @@ package dummy import ( + "sync" + "sync/atomic" + "time" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/interfaces/params" + "gitlab.com/elixxir/client/cmix" "gitlab.com/elixxir/client/stoppable" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/crypto/csprng" "gitlab.com/xx_network/primitives/id" - "sync" - "sync/atomic" - "time" ) // Error messages. @@ -94,15 +95,17 @@ func (m *Manager) sendMessages(msgs map[id.ID]format.Message) error { defer wg.Done() // Fill the preimage with random data to ensure it is not repeatable - p := params.GetDefaultCMIX() - p.IdentityPreimage = make([]byte, 32) - rng := m.rng.GetStream() - if _, err := rng.Read(p.IdentityPreimage); err != nil { - jww.FATAL.Panicf("Failed to generate data for random identity "+ - "preimage in e2e send: %+v", err) - } - rng.Close() - p.DebugTag = "dummy" + p := cmix.GetDefaultParams() + // FIXME: these fields no longer available + // through these params objects + // p.IdentityPreimage = make([]byte, 32) + // rng := m.rng.GetStream() + // if _, err := rng.Read(p.IdentityPreimage); err != nil { + // jww.FATAL.Panicf("Failed to generate data for random identity "+ + // "preimage in e2e send: %+v", err) + // } + // rng.Close() + // p.DebugTag = "dummy" _, _, err := m.net.SendCMIX(msg, &recipient, p) if err != nil { jww.WARN.Printf("Failed to send dummy message %d/%d via "+ @@ -153,7 +156,8 @@ func (m *Manager) newRandomMessages(rng csprng.Source) ( // generated payload, fingerprint, and MAC. func (m *Manager) newRandomCmixMessage(rng csprng.Source) (format.Message, error) { // Create new empty cMix message - cMixMsg := format.NewMessage(m.store.Cmix().GetGroup().GetP().ByteLen()) + clientStorage := *m.store + cMixMsg := format.NewMessage(clientStorage.GetCmixGroup().GetP().ByteLen()) // Generate random message randomMsg, err := newRandomPayload(cMixMsg.ContentsSize(), rng) diff --git a/dummy/utils_test.go b/dummy/utils_test.go index 73d3c5d0cc28b047ecea26d55e66f44c907069cb..cbc441c22d732469ecc77f145c8de9796c6adee7 100644 --- a/dummy/utils_test.go +++ b/dummy/utils_test.go @@ -8,20 +8,15 @@ package dummy import ( - "io" - "math/rand" - "sync" - "testing" - "time" - "github.com/pkg/errors" + "gitlab.com/elixxir/client/cmix" "gitlab.com/elixxir/client/cmix/gateway" + "gitlab.com/elixxir/client/cmix/message" "gitlab.com/elixxir/client/event" "gitlab.com/elixxir/client/interfaces" - "gitlab.com/elixxir/client/interfaces/message" - "gitlab.com/elixxir/client/interfaces/params" "gitlab.com/elixxir/client/stoppable" "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/comms/network" "gitlab.com/elixxir/crypto/e2e" "gitlab.com/elixxir/crypto/fastRNG" @@ -31,11 +26,16 @@ import ( "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" "gitlab.com/xx_network/primitives/ndf" + "io" + "math/rand" + "sync" + "testing" + "time" ) -//////////////////////////////////////////////////////////////////////////////// -// PRNG // -//////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////// +// // PRNG // +// //////////////////////////////////////////////////////////////////////////////// // Prng is a PRNG that satisfies the csprng.Source interface. type Prng struct{ prng io.Reader } @@ -44,20 +44,21 @@ func NewPrng(seed int64) csprng.Source { return &Prng{rand.New(rand.NewSourc func (s *Prng) Read(b []byte) (int, error) { return s.prng.Read(b) } func (s *Prng) SetSeed([]byte) error { return nil } -//////////////////////////////////////////////////////////////////////////////// -// Test Managers // -//////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////// +// // Test Managers // +// //////////////////////////////////////////////////////////////////////////////// // newTestManager creates a new Manager that has groups stored for testing. One // of the groups in the list is also returned. func newTestManager(maxNumMessages int, avgSendDelta, randomRange time.Duration, sendErr bool, t *testing.T) *Manager { + store := storage.InitTestingSession(t) m := &Manager{ maxNumMessages: maxNumMessages, avgSendDelta: avgSendDelta, randomRange: randomRange, statusChan: make(chan bool, statusChanLen), - store: storage.InitTestingSession(t), + store: &store, net: newTestNetworkManager(sendErr, t), rng: fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG), } @@ -65,11 +66,11 @@ func newTestManager(maxNumMessages int, avgSendDelta, randomRange time.Duration, return m } -//////////////////////////////////////////////////////////////////////////////// -// Test Network State // -//////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////// +// // Test Network State // +// //////////////////////////////////////////////////////////////////////////////// -// testNetworkManager is a test implementation of NetworkManager interface. +// // testNetworkManager is a test implementation of NetworkManager interface. type testNetworkManager struct { instance *network.Instance messages map[id.ID]format.Message @@ -113,17 +114,19 @@ func (tnm *testNetworkManager) GetMsg(recipient id.ID) format.Message { return tnm.messages[recipient] } -func (tnm *testNetworkManager) SendE2E(message.Send, params.E2E, *stoppable.Single) ( +// TEST +func (tnm *testNetworkManager) SendE2E() ( []id.Round, e2e.MessageID, time.Time, error) { return nil, e2e.MessageID{}, time.Time{}, nil } -func (tnm *testNetworkManager) SendUnsafe(message.Send, params.Unsafe) ([]id.Round, error) { +// TEST +func (tnm *testNetworkManager) SendUnsafe() ([]id.Round, error) { return []id.Round{}, nil } func (tnm *testNetworkManager) SendCMIX(message format.Message, - recipient *id.ID, _ params.CMIX) (id.Round, ephemeral.Id, error) { + recipient *id.ID, _ cmix.Params) (id.Round, ephemeral.Id, error) { tnm.Lock() defer tnm.Unlock() @@ -136,7 +139,7 @@ func (tnm *testNetworkManager) SendCMIX(message format.Message, return 0, ephemeral.Id{}, nil } -func (tnm *testNetworkManager) SendManyCMIX([]message.TargetedCmixMessage, params.CMIX) ( +func (tnm *testNetworkManager) SendManyCMIX([]cmix.TargetedCmixMessage, cmix.Params) ( id.Round, []ephemeral.Id, error) { return 0, nil, nil } @@ -149,11 +152,14 @@ func (tnm *testNetworkManager) GetEventManager() event.Reporter { } func (tnm *testNetworkManager) GetInstance() *network.Instance { return tnm.instance } +func (tnm *testNetworkManager) GetAddressSpace() uint8 { return 0 } +func (tnm *testNetworkManager) GetHostParams() connect.HostParams { return connect.HostParams{} } func (tnm *testNetworkManager) GetHealthTracker() interfaces.HealthTracker { return nil } func (tnm *testNetworkManager) Follow(interfaces.ClientErrorReport) (stoppable.Stoppable, error) { return nil, nil } func (tnm *testNetworkManager) CheckGarbledMessages() {} +func (tnm *testNetworkManager) CheckInProgressMessages() {} func (tnm *testNetworkManager) InProgressRegistrations() int { return 0 } func (tnm *testNetworkManager) GetSender() *gateway.Sender { return nil } func (tnm *testNetworkManager) GetAddressSize() uint8 { return 0 } @@ -163,10 +169,44 @@ func (tnm *testNetworkManager) RegisterAddressSizeNotification(string) (chan uin func (tnm *testNetworkManager) UnregisterAddressSizeNotification(string) {} func (tnm *testNetworkManager) SetPoolFilter(gateway.Filter) {} func (tnm *testNetworkManager) GetVerboseRounds() string { return "" } +func (tnm *testNetworkManager) HasNode(*id.ID) bool { return false } +func (tnm *testNetworkManager) LookupHistoricalRound(id.Round, func(*mixmessages.RoundInfo, bool)) error { + return nil +} +func (tnm *testNetworkManager) NumRegisteredNodes() int { return 0 } +func (tnm *testNetworkManager) RegisterAddressSpaceNotification(string) (chan uint8, error) { + return nil, nil +} +func (tnm *testNetworkManager) SendToAny(func(*connect.Host) (interface{}, error), *stoppable.Single) (interface{}, error) { + return nil, nil +} +func (tnm *testNetworkManager) SendToPreferred([]*id.ID, func(*connect.Host, *id.ID, time.Duration) (interface{}, error), *stoppable.Single, time.Duration) (interface{}, error) { + return nil, nil +} +func (tnm *testNetworkManager) SetGatewayFilter(func(map[id.ID]int, *ndf.NetworkDefinition) map[id.ID]int) { +} +func (tnm *testNetworkManager) TrackServices(message.ServicesTracker) {} +func (tnm *testNetworkManager) TriggerNodeRegistration(*id.ID) {} +func (tnm *testNetworkManager) UnregisterAddressSpaceNotification(string) {} -//////////////////////////////////////////////////////////////////////////////// -// NDF Primes // -//////////////////////////////////////////////////////////////////////////////// +func (tnm *testNetworkManager) AddFingerprint(*id.ID, format.Fingerprint, message.Processor) error { + return nil +} +func (tnm *testNetworkManager) DeleteFingerprint(*id.ID, format.Fingerprint) {} +func (tnm *testNetworkManager) DeleteClientFingerprints(*id.ID) {} + +func (tnm *testNetworkManager) AddIdentity(*id.ID, time.Time, bool) error { return nil } +func (tnm *testNetworkManager) RemoveIdentity(*id.ID) {} + +func (tnm *testNetworkManager) AddTrigger(*id.ID, message.Service, message.Processor) {} +func (tnm *testNetworkManager) DeleteTrigger(*id.ID, interfaces.Preimage, message.Processor) error { + return nil +} +func (tnm *testNetworkManager) DeleteClientTriggers(*id.ID) {} + +// //////////////////////////////////////////////////////////////////////////////// +// // NDF Primes // +// //////////////////////////////////////////////////////////////////////////////// func getNDF() *ndf.NetworkDefinition { return &ndf.NetworkDefinition{ diff --git a/e2e/interface.go b/e2e/interface.go index a24f285ce3b2046b8d838aa2826775b167f47bf9..328220f419e33dfadb7fcf9455390eabb18a50e6 100644 --- a/e2e/interface.go +++ b/e2e/interface.go @@ -125,6 +125,10 @@ type Handler interface { // an E2E relationship with. GetAllPartnerIDs() []*id.ID + // HasAuthenticatedChannel returns true if an authenticated channel with the + // partner exists, otherwise returns false + HasAuthenticatedChannel(partner *id.ID) bool + /* === Services ===================================================== */ // AddService adds a service for all partners of the given @@ -173,4 +177,20 @@ type Handler interface { // GetReceptionID returns the default IDs GetReceptionID() *id.ID + + // FirstPartitionSize returns the max partition payload size for the + // first payload + FirstPartitionSize() uint + + // SecondPartitionSize returns the max partition payload size for all + // payloads after the first payload + SecondPartitionSize() uint + + // PartitionSize returns the partition payload size for the given + // payload index. The first payload is index 0. + PartitionSize(payloadIndex uint) uint + + // PayloadSize Returns the max payload size for a partitionable E2E + // message + PayloadSize() uint } diff --git a/e2e/manager.go b/e2e/manager.go index 2bdb8c21f1afcfd20cf41a2ba06fdc06d08bd13e..cbfcddd6ec0d4b4126983d800e96dce03b25a375 100644 --- a/e2e/manager.go +++ b/e2e/manager.go @@ -196,6 +196,13 @@ func (m *manager) EnableUnsafeReception() { }) } +// HasAuthenticatedChannel returns true if an authenticated channel with the +// partner exists, otherwise returns false +func (m *manager) HasAuthenticatedChannel(partner *id.ID) bool { + p, err := m.GetPartner(partner) + return p != nil && err == nil +} + func makeE2ePrefix(myid *id.ID) string { return "e2eStore:" + myid.String() } diff --git a/e2e/manager_test.go b/e2e/manager_test.go index 5f89bc5ecd2c9434557606001a40ed21803171fc..55fe430796c406a95b7f6a89268a29caa51bf6ff 100644 --- a/e2e/manager_test.go +++ b/e2e/manager_test.go @@ -1,22 +1,9 @@ package e2e import ( - "bytes" "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/e2e/ratchet" - "gitlab.com/elixxir/client/e2e/rekey" - util "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" - "gitlab.com/elixxir/crypto/diffieHellman" - "gitlab.com/elixxir/crypto/e2e" - "gitlab.com/elixxir/crypto/fastRNG" - "gitlab.com/elixxir/ekv" - "gitlab.com/xx_network/crypto/csprng" - "gitlab.com/xx_network/crypto/large" "gitlab.com/xx_network/primitives/id" - "math/rand" - "testing" ) // todo: come up with better name and add docstring @@ -35,105 +22,105 @@ type legacyPartnerData struct { // current design appropriately. For this test, there are some // hardcoded base64 encoded data in this file that represents // data marshalled according to the previous design. -func TestLoadLegacy(t *testing.T) { - grp := cyclic.NewGroup(large.NewInt(107), large.NewInt(2)) - myPrivKey := grp.NewInt(57) - myPubKey := diffieHellman.GeneratePublicKey(myPrivKey, grp) - myId := id.NewIdFromString("me", id.User, t) - - prng := rand.New(rand.NewSource(42)) - numTest := 5 - legacyData := make([]legacyPartnerData, 0, numTest) - // Expected data generation. This mocks up how partner information was - // generated using the old design (refer to legacyGen_test.go) - for i := 0; i < numTest; i++ { - partnerID := id.NewIdFromUInt(uint64(i), id.User, t) - partnerPubKey := diffieHellman.GeneratePublicKey(grp.NewInt(int64(i+1)), grp) - - // Note this sidh key generation code comes from a testing helper - // function genSidhKeys which at the time of writing exists in both - // the pre-April 2022 refactor and the post-refactor. It has been - // hardcoded here to preserve the original implementation. It is - // possible a refactor occurs on the existing helper functions - // which breaks what is attempted to be preserved in this test. - - // Generate public key (we do not care about the private key, as that - // will not be in storage as it represents the partner's private key, - // which we would not know) - variant := sidh.KeyVariantSidhA - partnerPrivKey := util.NewSIDHPrivateKey(variant) - partnerSidHPubKey := util.NewSIDHPublicKey(variant) - - if err := partnerPrivKey.Generate(prng); err != nil { - t.Fatalf("failure to generate SidH A private key") - } - partnerPrivKey.GeneratePublicKey(partnerSidHPubKey) - - // Generate a separate private key. This represents out private key, - // which we do know. - variant = sidh.KeyVariantSidhB - - mySidHPrivKey := util.NewSIDHPrivateKey(variant) - if err := partnerPrivKey.Generate(prng); err != nil { - t.Fatalf("failure to generate SidH B private key") - } - - d := legacyPartnerData{ - partnerId: partnerID, - myDhPubKey: myPubKey, - mySidhPrivKey: mySidHPrivKey, - partnerSidhPubKey: partnerSidHPubKey, - // Fixme: if the underlying crypto implementation ever changes, this will break - // the legacy loading tests - sendFP: e2e.MakeRelationshipFingerprint(myPubKey, partnerPubKey, - myId, partnerID), - receiveFp: e2e.MakeRelationshipFingerprint(myPubKey, partnerPubKey, - partnerID, myId), - } - - legacyData = append(legacyData, d) - - } - - // Construct kv with legacy data - // fs, err := ekv.NewFilestore("/home/josh/src/client/e2e/legacyEkv", "hello") - // if err != nil { - // t.Fatalf( - // "Failed to create storage session: %+v", err) - // } - kv := versioned.NewKV(ekv.MakeMemstore()) - - err := ratchet.New(kv, myId, myPrivKey, grp) - if err != nil { - t.Errorf("Failed to init ratchet: %+v", err) - } - - rng := fastRNG.NewStreamGenerator(12, 3, csprng.NewSystemRNG) - - // Load legacy data - h, err := LoadLegacy(kv, newMockCmix(nil, nil, t), myId, - grp, rng, mockEventsManager{}, rekey.GetDefaultParams()) - if err != nil { - t.Fatalf("LoadLegacy error: %v", err) - } - - // Parse handler for expected partners - for _, legacyPartner := range legacyData { - partnerManager, err := h.GetPartner(legacyPartner.partnerId) - if err != nil { - t.Errorf("Partner %s does not exist in handler.", legacyPartner.partnerId) - } else { - if !bytes.Equal(partnerManager.SendRelationshipFingerprint(), legacyPartner.sendFP) { - t.Fatalf("Send relationship fingerprint pulled from legacy does not match expected data."+ - "\nExpected: %v"+ - "\nReceived: %v", legacyPartner.sendFP, partnerManager.SendRelationshipFingerprint()) - } - - if !bytes.Equal(partnerManager.ReceiveRelationshipFingerprint(), legacyPartner.receiveFp) { - t.Fatalf("Receive relationship fingerprint pulled from legacy does not match expected data."+ - "\nExpected: %v"+ - "\nReceived: %v", legacyPartner.sendFP, partnerManager.SendRelationshipFingerprint()) - } - } - } -} +// func TestLoadLegacy(t *testing.T) { +// grp := cyclic.NewGroup(large.NewInt(107), large.NewInt(2)) +// myPrivKey := grp.NewInt(57) +// myPubKey := diffieHellman.GeneratePublicKey(myPrivKey, grp) +// myId := id.NewIdFromString("me", id.User, t) + +// prng := rand.New(rand.NewSource(42)) +// numTest := 5 +// legacyData := make([]legacyPartnerData, 0, numTest) +// // Expected data generation. This mocks up how partner information was +// // generated using the old design (refer to legacyGen_test.go) +// for i := 0; i < numTest; i++ { +// partnerID := id.NewIdFromUInt(uint64(i), id.User, t) +// partnerPubKey := diffieHellman.GeneratePublicKey(grp.NewInt(int64(i+1)), grp) + +// // Note this sidh key generation code comes from a testing helper +// // function genSidhKeys which at the time of writing exists in both +// // the pre-April 2022 refactor and the post-refactor. It has been +// // hardcoded here to preserve the original implementation. It is +// // possible a refactor occurs on the existing helper functions +// // which breaks what is attempted to be preserved in this test. + +// // Generate public key (we do not care about the private key, as that +// // will not be in storage as it represents the partner's private key, +// // which we would not know) +// variant := sidh.KeyVariantSidhA +// partnerPrivKey := util.NewSIDHPrivateKey(variant) +// partnerSidHPubKey := util.NewSIDHPublicKey(variant) + +// if err := partnerPrivKey.Generate(prng); err != nil { +// t.Fatalf("failure to generate SidH A private key") +// } +// partnerPrivKey.GeneratePublicKey(partnerSidHPubKey) + +// // Generate a separate private key. This represents out private key, +// // which we do know. +// variant = sidh.KeyVariantSidhB + +// mySidHPrivKey := util.NewSIDHPrivateKey(variant) +// if err := partnerPrivKey.Generate(prng); err != nil { +// t.Fatalf("failure to generate SidH B private key") +// } + +// d := legacyPartnerData{ +// partnerId: partnerID, +// myDhPubKey: myPubKey, +// mySidhPrivKey: mySidHPrivKey, +// partnerSidhPubKey: partnerSidHPubKey, +// // Fixme: if the underlying crypto implementation ever changes, this will break +// // the legacy loading tests +// sendFP: e2e.MakeRelationshipFingerprint(myPubKey, partnerPubKey, +// myId, partnerID), +// receiveFp: e2e.MakeRelationshipFingerprint(myPubKey, partnerPubKey, +// partnerID, myId), +// } + +// legacyData = append(legacyData, d) + +// } + +// // Construct kv with legacy data +// // fs, err := ekv.NewFilestore("/home/josh/src/client/e2e/legacyEkv", "hello") +// // if err != nil { +// // t.Fatalf( +// // "Failed to create storage session: %+v", err) +// // } +// kv := versioned.NewKV(ekv.MakeMemstore()) + +// err := ratchet.New(kv, myId, myPrivKey, grp) +// if err != nil { +// t.Errorf("Failed to init ratchet: %+v", err) +// } + +// rng := fastRNG.NewStreamGenerator(12, 3, csprng.NewSystemRNG) + +// // Load legacy data +// h, err := LoadLegacy(kv, newMockCmix(nil, nil, t), myId, +// grp, rng, mockEventsManager{}, rekey.GetDefaultParams()) +// if err != nil { +// t.Fatalf("LoadLegacy error: %v", err) +// } + +// // Parse handler for expected partners +// for _, legacyPartner := range legacyData { +// partnerManager, err := h.GetPartner(legacyPartner.partnerId) +// if err != nil { +// t.Errorf("Partner %s does not exist in handler.", legacyPartner.partnerId) +// } else { +// if !bytes.Equal(partnerManager.SendRelationshipFingerprint(), legacyPartner.sendFP) { +// t.Fatalf("Send relationship fingerprint pulled from legacy does not match expected data."+ +// "\nExpected: %v"+ +// "\nReceived: %v", legacyPartner.sendFP, partnerManager.SendRelationshipFingerprint()) +// } + +// if !bytes.Equal(partnerManager.ReceiveRelationshipFingerprint(), legacyPartner.receiveFp) { +// t.Fatalf("Receive relationship fingerprint pulled from legacy does not match expected data."+ +// "\nExpected: %v"+ +// "\nReceived: %v", legacyPartner.sendFP, partnerManager.SendRelationshipFingerprint()) +// } +// } +// } +// } diff --git a/e2e/params.go b/e2e/params.go index 23052727ffcc103f62e14c5d41fad2fbcabfe244..2702d490656342e975883177b115f63dbf2df961 100644 --- a/e2e/params.go +++ b/e2e/params.go @@ -29,6 +29,17 @@ type Params struct { cmix.CMIXParams } +// paramsDisk will be the marshal-able and umarshal-able object. +type paramsDisk struct { + ServiceTag string + LastServiceTag string + KeyGetRetryCount uint + KeyGeRetryDelay time.Duration + Rekey bool + cmix.CMIXParams +} + +// GetDefaultParams returns a default set of Params. func GetDefaultParams() Params { return Params{ ServiceTag: catalog.Silent, @@ -41,12 +52,9 @@ func GetDefaultParams() Params { CMIXParams: cmix.GetDefaultCMIXParams(), } } -func (e Params) Marshal() ([]byte, error) { - return json.Marshal(e) -} -// GetParameters Obtain default E2E parameters, or override with -// given parameters if set +// GetParameters Obtain default Params, or override with +// given parameters if set. func GetParameters(params string) (Params, error) { p := GetDefaultParams() if len(params) > 0 { @@ -57,3 +65,38 @@ func GetParameters(params string) (Params, error) { } return p, nil } + +// MarshalJSON adheres to the json.Marshaler interface. +func (p Params) MarshalJSON() ([]byte, error) { + pDisk := paramsDisk{ + ServiceTag: p.ServiceTag, + LastServiceTag: p.LastServiceTag, + KeyGetRetryCount: p.KeyGetRetryCount, + KeyGeRetryDelay: p.KeyGeRetryDelay, + Rekey: p.Rekey, + CMIXParams: p.CMIXParams, + } + + return json.Marshal(&pDisk) + +} + +// UnmarshalJSON adheres to the json.Unmarshaler interface. +func (p *Params) UnmarshalJSON(data []byte) error { + pDisk := paramsDisk{} + err := json.Unmarshal(data, &pDisk) + if err != nil { + return err + } + + *p = Params{ + ServiceTag: pDisk.ServiceTag, + LastServiceTag: pDisk.LastServiceTag, + KeyGetRetryCount: pDisk.KeyGetRetryCount, + KeyGeRetryDelay: pDisk.KeyGeRetryDelay, + Rekey: pDisk.Rekey, + CMIXParams: pDisk.CMIXParams, + } + + return nil +} diff --git a/e2e/parse/firstMessagePart_test.go b/e2e/parse/firstMessagePart_test.go index 5c4ef051440672031304602f192b38430c6fafe4..cfe419be245d7f73e730ba142a827daf3ebac942 100644 --- a/e2e/parse/firstMessagePart_test.go +++ b/e2e/parse/firstMessagePart_test.go @@ -9,10 +9,11 @@ package parse import ( "bytes" - "gitlab.com/elixxir/client/catalog" "reflect" "testing" "time" + + "gitlab.com/elixxir/client/catalog" ) // Expected firstMessagePart for checking against, generated by fmp in diff --git a/e2e/parse/partition.go b/e2e/parse/partition.go index e23649d3a18d0d455803b9484a051a1ec225d1c3..c0f5c0b95338bd6044063fbe7cecbac114fbbd3f 100644 --- a/e2e/parse/partition.go +++ b/e2e/parse/partition.go @@ -104,6 +104,24 @@ func (p Partitioner) HandlePartition(sender *id.ID, } } +// FirstPartitionSize returns the max partition payload size for the +// first payload +func (p Partitioner) FirstPartitionSize() uint { + return uint(p.firstContentsSize) +} + +// SecondPartitionSize returns the max partition payload size for all +// payloads after the first payload +func (p Partitioner) SecondPartitionSize() uint { + return uint(p.partContentsSize) +} + +// PayloadSize Returns the max payload size for a partitionable E2E +// message +func (p Partitioner) PayloadSize() uint { + return uint(p.maxSize) +} + func splitPayload(payload []byte, length int) ([]byte, []byte) { if len(payload) < length { return payload, payload diff --git a/e2e/parse/partition_test.go b/e2e/parse/partition_test.go index 71b5338a16b9aa5b261b3368d5384dc51e02c970..22c1f238eda4b2f2f0be5575e68143c28970a749 100644 --- a/e2e/parse/partition_test.go +++ b/e2e/parse/partition_test.go @@ -8,12 +8,13 @@ package parse import ( + "testing" + "gitlab.com/elixxir/client/catalog" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" - "testing" ) var ipsumTestStr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras sit amet euismod est. Donec dolor " + @@ -80,7 +81,7 @@ func TestPartitioner_HandlePartition(t *testing.T) { // Test that HandlePartition can handle a first message part func TestPartitioner_HandleFirstPartition(t *testing.T) { - p := NewPartitioner(versioned.NewKV(ekv.MakeMemstore()), len(ipsumTestStr)) + p := NewPartitioner(versioned.NewKV(ekv.MakeMemstore()), 256) m := newFirstMessagePart( catalog.XxMessage, 1107, 1, netTime.Now(), []byte(ipsumTestStr), len([]byte(ipsumTestStr))+firstHeaderLen) diff --git a/e2e/ratchet/partner/session/params.go b/e2e/ratchet/partner/session/params.go index 8ccd454947ff281471cd77d79fa15ea826efec9d..2782578e9e605d117d2bb872f40822816c0fde2f 100644 --- a/e2e/ratchet/partner/session/params.go +++ b/e2e/ratchet/partner/session/params.go @@ -1,6 +1,20 @@ package session -import "fmt" +import ( + "encoding/json" + "fmt" +) + +// DEFAULT KEY GENERATION PARAMETERS +// Hardcoded limits for keys +// sets the number of keys very high, but with a low rekey threshold. In this case, if the other party is online, you will read +const ( + minKeys uint16 = 1000 + maxKeys uint16 = 2000 + rekeyThrshold float64 = 0.05 + numReKeys uint16 = 16 + rekeyRatio float64 = 1 / 10 +) type Params struct { // using the DH as a seed, both sides finalizeKeyNegotation a number @@ -20,17 +34,16 @@ type Params struct { UnconfirmedRetryRatio float64 } -// DEFAULT KEY GENERATION PARAMETERS -// Hardcoded limits for keys -// sets the number of keys very high, but with a low rekey threshold. In this case, if the other party is online, you will read -const ( - minKeys uint16 = 1000 - maxKeys uint16 = 2000 - rekeyThrshold float64 = 0.05 - numReKeys uint16 = 16 - rekeyRatio float64 = 1 / 10 -) +// paramsDisk will be the marshal-able and umarshal-able object. +type paramsDisk struct { + MinKeys uint16 + MaxKeys uint16 + RekeyThreshold float64 + NumRekeys uint16 + UnconfirmedRetryRatio float64 +} +// GetDefaultParams returns a default set of Params. func GetDefaultParams() Params { return Params{ MinKeys: minKeys, @@ -41,6 +54,50 @@ func GetDefaultParams() Params { } } +// 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 +} + +// MarshalJSON adheres to the json.Marshaler interface. +func (p Params) MarshalJSON() ([]byte, error) { + pDisk := paramsDisk{ + MinKeys: p.MinKeys, + MaxKeys: p.MaxKeys, + RekeyThreshold: p.RekeyThreshold, + NumRekeys: p.NumRekeys, + UnconfirmedRetryRatio: p.UnconfirmedRetryRatio, + } + return json.Marshal(&pDisk) + +} + +// UnmarshalJSON adheres to the json.Unmarshaler interface. +func (p *Params) UnmarshalJSON(data []byte) error { + pDisk := paramsDisk{} + err := json.Unmarshal(data, &pDisk) + if err != nil { + return err + } + + *p = Params{ + MinKeys: pDisk.MinKeys, + MaxKeys: pDisk.MaxKeys, + RekeyThreshold: pDisk.RekeyThreshold, + NumRekeys: pDisk.NumRekeys, + UnconfirmedRetryRatio: pDisk.UnconfirmedRetryRatio, + } + return nil +} + func (p Params) String() string { return fmt.Sprintf("SessionParams{ MinKeys: %d, MaxKeys: %d, NumRekeys: %d }", p.MinKeys, p.MaxKeys, p.NumRekeys) diff --git a/e2e/rekey/params.go b/e2e/rekey/params.go index 0611e67e84b4875bae35f29855fbddc0e007fe83..274770c112329cb552a85df55c6abc6d273cf67c 100644 --- a/e2e/rekey/params.go +++ b/e2e/rekey/params.go @@ -1,6 +1,7 @@ package rekey import ( + "encoding/json" "gitlab.com/elixxir/client/catalog" "time" ) @@ -22,6 +23,17 @@ type Params struct { StoppableName string } +// paramsDisk will be the marshal-able and umarshal-able object. +type paramsDisk struct { + RoundTimeout time.Duration + TriggerName string + Trigger catalog.MessageType + ConfirmName string + Confirm catalog.MessageType + StoppableName string +} + +// GetDefaultParams returns a default set of Params. func GetDefaultParams() Params { return Params{ RoundTimeout: time.Minute, @@ -33,6 +45,8 @@ func GetDefaultParams() Params { } } +// GetDefaultEphemeralParams returns a default set of Params for +// ephemeral re-keying. func GetDefaultEphemeralParams() Params { p := GetDefaultParams() p.TriggerName = keyExchangeTriggerEphemeralName @@ -42,3 +56,50 @@ func GetDefaultEphemeralParams() Params { p.StoppableName = keyExchangeEphemeralMulti return p } + +// GetParameters returns the default network parameters, 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 +} + +// MarshalJSON adheres to the json.Marshaler interface. +func (p Params) MarshalJSON() ([]byte, error) { + pDisk := paramsDisk{ + RoundTimeout: p.RoundTimeout, + TriggerName: p.TriggerName, + Trigger: p.Trigger, + ConfirmName: p.ConfirmName, + Confirm: p.Confirm, + StoppableName: p.StoppableName, + } + return json.Marshal(&pDisk) + +} + +// UnmarshalJSON adheres to the json.Unmarshaler interface. +func (p *Params) UnmarshalJSON(data []byte) error { + pDisk := paramsDisk{} + err := json.Unmarshal(data, &pDisk) + if err != nil { + return err + } + + *p = Params{ + RoundTimeout: pDisk.RoundTimeout, + TriggerName: pDisk.TriggerName, + Trigger: pDisk.Trigger, + ConfirmName: pDisk.ConfirmName, + Confirm: pDisk.Confirm, + StoppableName: pDisk.StoppableName, + } + + return nil +} diff --git a/e2e/sendE2E.go b/e2e/sendE2E.go index 2a50201de5e20d75eb41602f194d58e99a0d6af1..65cf98cdf63105298daebbc8eede2b21dc6e3d17 100644 --- a/e2e/sendE2E.go +++ b/e2e/sendE2E.go @@ -9,6 +9,7 @@ import ( "gitlab.com/elixxir/client/catalog" "gitlab.com/elixxir/client/cmix" "gitlab.com/elixxir/client/cmix/message" + "gitlab.com/elixxir/client/e2e/parse" "gitlab.com/elixxir/client/e2e/ratchet/partner/session" "gitlab.com/elixxir/client/e2e/rekey" "gitlab.com/elixxir/client/stoppable" @@ -199,3 +200,33 @@ func getSendErrors(c chan error) (numFail int, errRtn string) { } } } + +// FirstPartitionSize returns the max partition payload size for the +// first payload +func (m *manager) FirstPartitionSize() uint { + return m.partitioner.FirstPartitionSize() +} + +// SecondPartitionSize returns the max partition payload size for all +// payloads after the first payload +func (m *manager) SecondPartitionSize() uint { + return m.partitioner.SecondPartitionSize() +} + +// PartitionSize returns the partition payload size for the given +// payload index. The first payload is index 0. +func (m *manager) PartitionSize(payloadIndex uint) uint { + if payloadIndex == 0 { + return m.FirstPartitionSize() + } + if payloadIndex > parse.MaxMessageParts { + return 0 + } + return m.SecondPartitionSize() +} + +// PayloadSize Returns the max payload size for a partitionable E2E +// message +func (m *manager) PayloadSize() uint { + return m.partitioner.PayloadSize() +} diff --git a/fileTransfer/manager_test.go b/fileTransfer/manager_test.go index c92e79481516b1966344ff9c3a29b3a7316cd145..7245028f3b15f5ceff44bcfa2e527ec3c10088a9 100644 --- a/fileTransfer/manager_test.go +++ b/fileTransfer/manager_test.go @@ -100,7 +100,7 @@ func Test_FileTransfer_Smoke(t *testing.T) { tid, fileName, fileType, sender, size, preview} } myID1 := id.NewIdFromString("myID1", id.User, t) - kv1 := versioned.NewKV(make(ekv.Memstore)) + kv1 := versioned.NewKV(ekv.MakeMemstore()) endE2eChan1 := make(chan receive.Message, 3) e2e1 := newMockE2e(myID1, e2eHandler) e2e1.RegisterListener( @@ -125,7 +125,7 @@ func Test_FileTransfer_Smoke(t *testing.T) { tid, fileName, fileType, sender, size, preview} } myID2 := id.NewIdFromString("myID2", id.User, t) - kv2 := versioned.NewKV(make(ekv.Memstore)) + kv2 := versioned.NewKV(ekv.MakeMemstore()) endE2eChan2 := make(chan receive.Message, 3) e2e2 := newMockE2e(myID1, e2eHandler) e2e2.RegisterListener( diff --git a/fileTransfer/params.go b/fileTransfer/params.go index 754bb88db3d45c75f3e47454f45bf4cf6170e830..8e54d5d02c9430224f526008d9138cb35e08e1ce 100644 --- a/fileTransfer/params.go +++ b/fileTransfer/params.go @@ -7,7 +7,10 @@ package fileTransfer -import "time" +import ( + "encoding/json" + "time" +) const ( defaultMaxThroughput = 150_000 // 150 kB per second @@ -26,6 +29,12 @@ type Params struct { SendTimeout time.Duration } +// paramsDisk will be the marshal-able and umarshal-able object. +type paramsDisk struct { + MaxThroughput int + SendTimeout time.Duration +} + // DefaultParams returns a Params object filled with the default values. func DefaultParams() Params { return Params{ @@ -33,3 +42,42 @@ func DefaultParams() Params { SendTimeout: defaultSendTimeout, } } + +// GetParameters returns the default network parameters, or override with given +// parameters, if set. +func GetParameters(params string) (Params, error) { + p := DefaultParams() + if len(params) > 0 { + err := json.Unmarshal([]byte(params), &p) + if err != nil { + return Params{}, err + } + } + return p, nil +} + +// MarshalJSON adheres to the json.Marshaler interface. +func (p Params) MarshalJSON() ([]byte, error) { + pDisk := paramsDisk{ + MaxThroughput: p.MaxThroughput, + SendTimeout: p.SendTimeout, + } + + return json.Marshal(&pDisk) +} + +// UnmarshalJSON adheres to the json.Unmarshaler interface. +func (p *Params) UnmarshalJSON(data []byte) error { + pDisk := paramsDisk{} + err := json.Unmarshal(data, &pDisk) + if err != nil { + return err + } + + *p = Params{ + MaxThroughput: pDisk.MaxThroughput, + SendTimeout: pDisk.SendTimeout, + } + + return nil +} diff --git a/fileTransfer/store/cypher/manager_test.go b/fileTransfer/store/cypher/manager_test.go index ea86d1baba7eece93b3ed26116efa252e54b1e78..c1857b7ae4920b0c26decdfb98752b0fc59acf74 100644 --- a/fileTransfer/store/cypher/manager_test.go +++ b/fileTransfer/store/cypher/manager_test.go @@ -21,7 +21,7 @@ import ( // Tests that NewManager returns a new Manager that matches the expected // manager. func TestNewManager(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) numFps := uint16(64) fpv, _ := utility.NewStateVector(kv.Prefix(cypherManagerPrefix), cypherManagerFpVectorKey, uint32(numFps)) @@ -134,7 +134,7 @@ func TestManager_Delete(t *testing.T) { // Tests that a transfer key saved via saveKey can be loaded via loadKey. func Test_saveKey_loadKey(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) key := &ftCrypto.TransferKey{42} err := saveKey(key, kv) @@ -160,7 +160,7 @@ func newTestManager(numFps uint16, t *testing.T) (*Manager, *versioned.KV) { t.Errorf("Failed to generate transfer key: %+v", err) } - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) m, err := NewManager(&key, numFps, kv) if err != nil { t.Errorf("Failed to make new Manager: %+v", err) diff --git a/fileTransfer/store/receivedTransfer_test.go b/fileTransfer/store/receivedTransfer_test.go index 0f2c16cca43a883a2515e6c77363daded6c1bc3c..81c3f4ced87d415c4bd61262854e9eb6bdfa453c 100644 --- a/fileTransfer/store/receivedTransfer_test.go +++ b/fileTransfer/store/receivedTransfer_test.go @@ -23,7 +23,7 @@ import ( // Tests that newReceivedTransfer returns a new ReceivedTransfer with the // expected values. func Test_newReceivedTransfer(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) tid, _ := ftCrypto.NewTransferID(csprng.NewSystemRNG()) numFps := uint16(24) @@ -320,7 +320,7 @@ func TestReceivedTransfer_save(t *testing.T) { // newTestReceivedTransfer creates a new ReceivedTransfer for testing. func newTestReceivedTransfer(numParts uint16, t *testing.T) ( *ReceivedTransfer, *ftCrypto.TransferKey, uint16, *versioned.KV) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) tid, _ := ftCrypto.NewTransferID(csprng.NewSystemRNG()) transferMAC := []byte("I am a transfer MAC") @@ -382,7 +382,7 @@ func TestReceivedTransfer_marshal_unmarshalReceivedTransfer(t *testing.T) { // Tests that the part saved to storage via savePart can be loaded. func Test_savePart_loadPart(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) part := []byte("I am a part.") partNum := 18 diff --git a/fileTransfer/store/received_test.go b/fileTransfer/store/received_test.go index 83134227235484bee889d6c4a1a1a433450caa3a..83aa45f90e6fb2250ca26d1cbc5c7f28c34d73a3 100644 --- a/fileTransfer/store/received_test.go +++ b/fileTransfer/store/received_test.go @@ -23,7 +23,7 @@ import ( // Tests that NewOrLoadReceived returns a new Received when none exist in // storage and that the list of incomplete transfers is nil. func TestNewOrLoadReceived_New(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) expected := &Received{ transfers: make(map[ftCrypto.TransferID]*ReceivedTransfer), kv: kv.Prefix(receivedTransfersStorePrefix), @@ -48,7 +48,7 @@ func TestNewOrLoadReceived_New(t *testing.T) { // Tests that NewOrLoadReceived returns a loaded Received when one exist in // storage and that the list of incomplete transfers is correct. func TestNewOrLoadReceived_Load(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) r, _, err := NewOrLoadReceived(kv) if err != nil { t.Errorf("Failed to make new Received: %+v", err) @@ -101,7 +101,7 @@ func TestNewOrLoadReceived_Load(t *testing.T) { // Tests that Received.AddTransfer makes a new transfer and adds it to the list. func TestReceived_AddTransfer(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) r, _, _ := NewOrLoadReceived(kv) key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) @@ -137,7 +137,7 @@ func TestReceived_AddTransfer_TransferAlreadyExists(t *testing.T) { // Tests that Received.GetTransfer returns the expected transfer. func TestReceived_GetTransfer(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) r, _, _ := NewOrLoadReceived(kv) key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) @@ -163,7 +163,7 @@ func TestReceived_GetTransfer(t *testing.T) { // Tests that Sent.RemoveTransfer removes the transfer from the list. func TestReceived_RemoveTransfer(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) r, _, _ := NewOrLoadReceived(kv) key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) @@ -201,7 +201,7 @@ func TestReceived_RemoveTransfer(t *testing.T) { // Tests that Received.save saves the transfer ID list to storage by trying to // load it after a save. func TestReceived_save(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) r, _, _ := NewOrLoadReceived(kv) r.transfers = map[ftCrypto.TransferID]*ReceivedTransfer{ ftCrypto.TransferID{0}: nil, ftCrypto.TransferID{1}: nil, diff --git a/fileTransfer/store/sentTransfer_test.go b/fileTransfer/store/sentTransfer_test.go index e2999646b85cc334642da0a7289ed699c5a7eb5b..7d44dd65b883844f4778693362108bc58994e76c 100644 --- a/fileTransfer/store/sentTransfer_test.go +++ b/fileTransfer/store/sentTransfer_test.go @@ -27,7 +27,7 @@ import ( // Tests that newSentTransfer returns a new SentTransfer with the expected // values. func Test_newSentTransfer(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) tid, _ := ftCrypto.NewTransferID(csprng.NewSystemRNG()) numFps := uint16(24) @@ -439,7 +439,7 @@ const numPrimeBytes = 512 // newTestSentTransfer creates a new SentTransfer for testing. func newTestSentTransfer(numParts uint16, t *testing.T) ( *SentTransfer, [][]byte, *ftCrypto.TransferKey, uint16, *versioned.KV) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) recipient := id.NewIdFromString("recipient", id.User, t) key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) tid, _ := ftCrypto.NewTransferID(csprng.NewSystemRNG()) diff --git a/fileTransfer/store/sent_test.go b/fileTransfer/store/sent_test.go index 9a25c329c3398fa5c13b885bd8f9856e0883c0d2..b6debe981429ccc40ff1898dfdb4cef47c185441 100644 --- a/fileTransfer/store/sent_test.go +++ b/fileTransfer/store/sent_test.go @@ -24,7 +24,7 @@ import ( // Tests that NewOrLoadSent returns a new Sent when none exist in storage and // that the list of unsent parts is nil. func TestNewOrLoadSent_New(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) expected := &Sent{ transfers: make(map[ftCrypto.TransferID]*SentTransfer), kv: kv.Prefix(sentTransfersStorePrefix), @@ -49,7 +49,7 @@ func TestNewOrLoadSent_New(t *testing.T) { // Tests that NewOrLoadSent returns a loaded Sent when one exist in storage and // that the list of unsent parts is correct. func TestNewOrLoadSent_Load(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) s, _, err := NewOrLoadSent(kv) if err != nil { t.Errorf("Failed to make new Sent: %+v", err) @@ -118,7 +118,7 @@ func TestNewOrLoadSent_Load(t *testing.T) { // Tests that Sent.AddTransfer makes a new transfer and adds it to the list. func TestSent_AddTransfer(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) s, _, _ := NewOrLoadSent(kv) key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) @@ -154,7 +154,7 @@ func TestSent_AddTransfer_TransferAlreadyExists(t *testing.T) { // Tests that Sent.GetTransfer returns the expected transfer. func TestSent_GetTransfer(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) s, _, _ := NewOrLoadSent(kv) key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) @@ -180,7 +180,7 @@ func TestSent_GetTransfer(t *testing.T) { // Tests that Sent.RemoveTransfer removes the transfer from the list. func TestSent_RemoveTransfer(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) s, _, _ := NewOrLoadSent(kv) key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) @@ -218,7 +218,7 @@ func TestSent_RemoveTransfer(t *testing.T) { // Tests that Sent.save saves the transfer ID list to storage by trying to load // it after a save. func TestSent_save(t *testing.T) { - kv := versioned.NewKV(make(ekv.Memstore)) + kv := versioned.NewKV(ekv.MakeMemstore()) s, _, _ := NewOrLoadSent(kv) s.transfers = map[ftCrypto.TransferID]*SentTransfer{ ftCrypto.TransferID{0}: nil, ftCrypto.TransferID{1}: nil, diff --git a/fileTransfer2/batchBuilder.go b/fileTransfer2/batchBuilder.go new file mode 100644 index 0000000000000000000000000000000000000000..84784d7abf911cffdf5b51b6032c3bc83d57fd14 --- /dev/null +++ b/fileTransfer2/batchBuilder.go @@ -0,0 +1,96 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package fileTransfer2 + +import ( + "encoding/binary" + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/fileTransfer2/store" + "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/crypto/fastRNG" + "gitlab.com/xx_network/crypto/csprng" + "go.uber.org/ratelimit" + "time" +) + +const ( + // Duration to wait before adding a partially filled part packet to the send + // channel. + unfilledPacketTimeout = 100 * time.Millisecond +) + +// batchBuilderThread creates batches of file parts as they become available and +// buffer them to send. Also rate limits adding to the buffer. +func (m *manager) batchBuilderThread(stop *stoppable.Single) { + // Calculate the average amount of data sent via SendManyCMIX + avgNumMessages := (minPartsSendPerRound + maxPartsSendPerRound) / 2 + avgSendSize := avgNumMessages * 8192 + + // Calculate the rate (sends per second) to achieve the desired bandwidth + rate := 1 + if m.params.MaxThroughput > avgSendSize { + rate = m.params.MaxThroughput / avgSendSize + } + + // Calculate rate and make rate limiter if max throughput is set + rl := ratelimit.NewUnlimited() + if m.params.MaxThroughput > 0 { + jww.INFO.Printf("[FT] Max throughput is %d. "+ + "File transfer will be rate limited to %d parts per second.", + m.params.MaxThroughput, rate) + rl = ratelimit.New(rate, ratelimit.WithoutSlack) + } else { + jww.WARN.Printf("[FT] Max throughput is %d. "+ + "File transfer will not be rate limited.", m.params.MaxThroughput) + } + + for { + numParts := generateRandomPacketSize(m.rng) + packet := make([]store.Part, 0, numParts) + delayedTimer := NewDelayedTimer(unfilledPacketTimeout) + loop: + for cap(packet) > len(packet) { + select { + case <-stop.Quit(): + delayedTimer.Stop() + jww.DEBUG.Printf("[FT] Stopping file part packing thread " + + "while packing: stoppable triggered.") + stop.ToStopped() + return + case <-*delayedTimer.C: + break loop + case p := <-m.batchQueue: + packet = append(packet, p) + delayedTimer.Start() + } + } + + // Rate limiter + rl.Take() + m.sendQueue <- packet + } +} + +// generateRandomPacketSize returns a random number between minPartsSendPerRound +// and maxPartsSendPerRound, inclusive. +func generateRandomPacketSize(rngGen *fastRNG.StreamGenerator) int { + rng := rngGen.GetStream() + defer rng.Close() + + // Generate random bytes + b, err := csprng.Generate(8, rng) + if err != nil { + jww.FATAL.Panicf(getRandomNumPartsRandPanic, err) + } + + // Convert bytes to integer + num := binary.LittleEndian.Uint64(b) + + // Return random number that is minPartsSendPerRound <= num <= max + return int((num % (maxPartsSendPerRound)) + minPartsSendPerRound) +} diff --git a/fileTransfer2/callbackTracker/callbackTracker.go b/fileTransfer2/callbackTracker/callbackTracker.go new file mode 100644 index 0000000000000000000000000000000000000000..6cf7a641c10b2fccf96b46097a5c18dbabea3655 --- /dev/null +++ b/fileTransfer2/callbackTracker/callbackTracker.go @@ -0,0 +1,99 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package callbackTracker + +import ( + "gitlab.com/elixxir/client/stoppable" + "gitlab.com/xx_network/primitives/netTime" + "sync" + "time" +) + +type callback func(err error) + +// callbackTracker tracks the fileTransfer.SentProgressCallback and +// information on when to call it. The callback will be called on each send, +// unless the time since the lastCall is smaller than the period. In that case, +// a callback is marked as scheduled and waits to be called at the end of the +// period. A callback is called once every period, regardless of the number of +// sends that occur. +type callbackTracker struct { + period time.Duration // How often to call the callback + lastCall time.Time // Timestamp of the last call + scheduled bool // Denotes if callback call is scheduled + complete bool // Denotes if the callback should not be called + stop *stoppable.Single // Stops the scheduled callback from triggering + cb callback + mux sync.RWMutex +} + +// newCallbackTracker creates a new and unused sentCallbackTracker. +func newCallbackTracker( + cb callback, period time.Duration, stop *stoppable.Single) *callbackTracker { + return &callbackTracker{ + period: period, + lastCall: time.Time{}, + scheduled: false, + complete: false, + stop: stop, + cb: cb, + } +} + +// call triggers the progress callback with the most recent progress from the +// sentProgressTracker. If a callback has been called within the last period, +// then a new call is scheduled to occur at the beginning of the next period. If +// a call is already scheduled, then nothing happens; when the callback is +// finally called, it will do so with the most recent changes. +func (ct *callbackTracker) call(err error) { + ct.mux.RLock() + // Exit if a callback is already scheduled + if (ct.scheduled || ct.complete) && err == nil { + ct.mux.RUnlock() + return + } + + ct.mux.RUnlock() + ct.mux.Lock() + defer ct.mux.Unlock() + + if (ct.scheduled || ct.complete) && err == nil { + return + } + + // Mark callback complete if an error is passed + ct.complete = err != nil + + // Check if a callback has occurred within the last period + timeSinceLastCall := netTime.Since(ct.lastCall) + if timeSinceLastCall > ct.period { + + // If no callback occurred, then trigger the callback now + go ct.cb(err) + ct.lastCall = netTime.Now() + } else { + // If a callback did occur, then schedule a new callback to occur at the + // start of the next period + ct.scheduled = true + go func() { + timer := time.NewTimer(ct.period - timeSinceLastCall) + select { + case <-ct.stop.Quit(): + timer.Stop() + ct.stop.ToStopped() + return + case <-timer.C: + ct.mux.Lock() + go ct.cb(err) + ct.lastCall = netTime.Now() + ct.scheduled = false + ct.mux.Unlock() + } + }() + } +} diff --git a/fileTransfer2/callbackTracker/callbackTracker_test.go b/fileTransfer2/callbackTracker/callbackTracker_test.go new file mode 100644 index 0000000000000000000000000000000000000000..7ffbe6636f3bc8abd56db36befbc699bfba22181 --- /dev/null +++ b/fileTransfer2/callbackTracker/callbackTracker_test.go @@ -0,0 +1,148 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package callbackTracker + +import ( + "github.com/pkg/errors" + "gitlab.com/elixxir/client/stoppable" + "reflect" + "testing" + "time" +) + +// Tests that newCallbackTracker returns a new callbackTracker with all the +// expected values. +func Test_newCallbackTracker(t *testing.T) { + expected := &callbackTracker{ + period: time.Millisecond, + lastCall: time.Time{}, + scheduled: false, + complete: false, + stop: stoppable.NewSingle("Test_newCallbackTracker"), + } + + newCT := newCallbackTracker(nil, expected.period, expected.stop) + newCT.cb = nil + + if !reflect.DeepEqual(expected, newCT) { + t.Errorf("New callbackTracker does not match expected."+ + "\nexpected: %+v\nreceived: %+v", expected, newCT) + } +} + +// Tests four test cases of callbackTracker.call: +// 1. An initial call is not scheduled. +// 2. A second call within the periods is only called after the period. +// 3. An error sets the callback to complete. +// 4. No more callbacks will be called after set to complete. +func Test_callbackTracker_call(t *testing.T) { + cbChan := make(chan error, 10) + cb := func(err error) { cbChan <- err } + stop := stoppable.NewSingle("Test_callbackTracker_call") + ct := newCallbackTracker(cb, 250*time.Millisecond, stop) + + // Test that the initial call is unscheduled and is called before the period + go ct.call(nil) + + select { + case r := <-cbChan: + if r != nil { + t.Errorf("Received error: %+v", r) + } + case <-time.After(35 * time.Millisecond): + t.Error("Timed out waiting for callback.") + } + + // Test that another call within the period is called only after the period + // is reached + go ct.call(nil) + + select { + case <-cbChan: + t.Error("Callback called too soon.") + + case <-time.After(35 * time.Millisecond): + ct.mux.RLock() + if !ct.scheduled { + t.Error("Callback is not scheduled when it should be.") + } + ct.mux.RUnlock() + select { + case r := <-cbChan: + if r != nil { + t.Errorf("Received error: %+v", r) + } + case <-time.After(ct.period): + t.Errorf("Callback not called after period %s.", ct.period) + + if ct.scheduled { + t.Error("Callback is scheduled when it should not be.") + } + } + } + + // Test that calling with an error sets the callback to complete + expectedErr := errors.New("test error") + go ct.call(expectedErr) + + select { + case r := <-cbChan: + if r != expectedErr { + t.Errorf("Received incorrect error.\nexpected: %v\nreceived: %v", + expectedErr, r) + } + if !ct.complete { + t.Error("Callback is not marked complete when it should be.") + } + case <-time.After(ct.period + 25*time.Millisecond): + t.Errorf("Callback not called after period %s.", + ct.period+15*time.Millisecond) + } + + // Tests that all callback calls after an error are blocked + go ct.call(nil) + + select { + case r := <-cbChan: + t.Errorf("Received callback when it should have been completed: %+v", r) + case <-time.After(ct.period): + } +} + +// Tests that callbackTracker.call does not call on the callback when the +// stoppable is triggered. +func Test_callbackTracker_call_stop(t *testing.T) { + cbChan := make(chan error, 10) + cb := func(err error) { cbChan <- err } + stop := stoppable.NewSingle("Test_callbackTracker_call") + ct := newCallbackTracker(cb, 250*time.Millisecond, stop) + + go ct.call(nil) + + select { + case r := <-cbChan: + if r != nil { + t.Errorf("Received error: %+v", r) + } + case <-time.After(25 * time.Millisecond): + t.Error("Timed out waiting for callback.") + } + + go ct.call(nil) + + err := stop.Close() + if err != nil { + t.Errorf("Failed closing stoppable: %+v", err) + } + + select { + case <-cbChan: + t.Error("Callback called.") + case <-time.After(ct.period * 2): + } +} diff --git a/fileTransfer2/callbackTracker/manager.go b/fileTransfer2/callbackTracker/manager.go new file mode 100644 index 0000000000000000000000000000000000000000..e6c4cf437ad0d625454667950d2a136baa8f20d2 --- /dev/null +++ b/fileTransfer2/callbackTracker/manager.go @@ -0,0 +1,99 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package callbackTracker + +import ( + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/stoppable" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "strconv" + "sync" + "time" +) + +// Manager tracks the callbacks for each transfer. +type Manager struct { + // Map of transfers and their list of callbacks + callbacks map[ftCrypto.TransferID][]*callbackTracker + + // List of multi stoppables used to stop callback trackers; each multi + // stoppable contains a single stoppable for each callback. + stops map[ftCrypto.TransferID]*stoppable.Multi + + mux sync.RWMutex +} + +// NewManager initializes a new callback tracker Manager. +func NewManager() *Manager { + m := &Manager{ + callbacks: make(map[ftCrypto.TransferID][]*callbackTracker), + stops: make(map[ftCrypto.TransferID]*stoppable.Multi), + } + + return m +} + +// AddCallback adds a callback to the list of callbacks for the given transfer +// ID and calls it regardless of the callback tracker status. +func (m *Manager) AddCallback( + tid *ftCrypto.TransferID, cb callback, period time.Duration) { + m.mux.Lock() + defer m.mux.Unlock() + + // Create new entries for this transfer ID if none exist + if _, exists := m.callbacks[*tid]; !exists { + m.callbacks[*tid] = []*callbackTracker{} + m.stops[*tid] = stoppable.NewMulti("FileTransfer/" + tid.String()) + } + + // Generate the stoppable and add it to the transfer's multi stoppable + stop := stoppable.NewSingle(makeStoppableName(tid, len(m.callbacks[*tid]))) + m.stops[*tid].Add(stop) + + // Create new callback tracker and add to the map + ct := newCallbackTracker(cb, period, stop) + m.callbacks[*tid] = append(m.callbacks[*tid], ct) + + // Call the callback + go cb(nil) +} + +// Call triggers each callback for the given transfer ID and passes along the +// given error. +func (m *Manager) Call(tid *ftCrypto.TransferID, err error) { + m.mux.Lock() + defer m.mux.Unlock() + + for _, cb := range m.callbacks[*tid] { + go cb.call(err) + } +} + +// Delete stops all scheduled stoppables for the given transfer and deletes the +// callbacks from the map. +func (m *Manager) Delete(tid *ftCrypto.TransferID) { + m.mux.Lock() + defer m.mux.Unlock() + + // Stop the stoppable if the stoppable still exists + stop, exists := m.stops[*tid] + if exists { + if err := stop.Close(); err != nil { + jww.ERROR.Printf("[FT] Failed to stop progress callbacks: %+v", err) + } + } + + // Delete callbacks and stoppables + delete(m.callbacks, *tid) + delete(m.stops, *tid) +} + +// makeStoppableName generates a unique name for the callback stoppable. +func makeStoppableName(tid *ftCrypto.TransferID, callbackNum int) string { + return tid.String() + "/" + strconv.Itoa(callbackNum) +} diff --git a/fileTransfer2/callbackTracker/manager_test.go b/fileTransfer2/callbackTracker/manager_test.go new file mode 100644 index 0000000000000000000000000000000000000000..4226807f18a728345fc4907758bd27ae21b6dcc1 --- /dev/null +++ b/fileTransfer2/callbackTracker/manager_test.go @@ -0,0 +1,176 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package callbackTracker + +import ( + "errors" + "gitlab.com/elixxir/client/stoppable" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/xx_network/crypto/csprng" + "io" + "math/rand" + "reflect" + "sync" + "testing" + "time" +) + +// Tests that NewManager returns the expected Manager. +func TestNewManager(t *testing.T) { + expected := &Manager{ + callbacks: make(map[ftCrypto.TransferID][]*callbackTracker), + stops: make(map[ftCrypto.TransferID]*stoppable.Multi), + } + + newManager := NewManager() + + if !reflect.DeepEqual(expected, newManager) { + t.Errorf("New Manager does not match expected."+ + "\nexpected: %+v\nreceived: %+v", expected, newManager) + } +} + +// Tests that Manager.AddCallback adds the callback to the list, creates and +// adds a stoppable to the list, and that the callback is called. +func TestManager_AddCallback(t *testing.T) { + m := NewManager() + + cbChan := make(chan error, 10) + cb := func(err error) { cbChan <- err } + tid := &ftCrypto.TransferID{5} + m.AddCallback(tid, cb, 0) + + // Check that the callback was called + select { + case <-cbChan: + case <-time.After(25 * time.Millisecond): + t.Error("Timed out waiting for callback to be called.") + } + + // Check that the callback was added + if _, exists := m.callbacks[*tid]; !exists { + t.Errorf("No callback list found for transfer ID %s.", tid) + } else if len(m.callbacks[*tid]) != 1 { + t.Errorf("Incorrect number of callbacks.\nexpected: %d\nreceived: %d", + 1, len(m.callbacks[*tid])) + } + + // Check that the stoppable was added + if _, exists := m.stops[*tid]; !exists { + t.Errorf("No stoppable list found for transfer ID %s.", tid) + } +} + +// Tests that Manager.Call calls al the callbacks associated with the transfer +// ID. +func TestManager_Call(t *testing.T) { + m := NewManager() + tid := &ftCrypto.TransferID{5} + n := 10 + cbChans := make([]chan error, n) + cbs := make([]func(err error), n) + for i := range cbChans { + cbChan := make(chan error, 10) + cbs[i] = func(err error) { cbChan <- err } + cbChans[i] = cbChan + } + + // Add callbacks + for i := range cbs { + m.AddCallback(tid, cbs[i], 0) + + // Receive channel from first call + select { + case <-cbChans[i]: + case <-time.After(25 * time.Millisecond): + t.Errorf("Callback #%d never called.", i) + } + } + + // Call callbacks + m.Call(tid, errors.New("test")) + + // Check to make sure callbacks were called + var wg sync.WaitGroup + for i := range cbs { + wg.Add(1) + go func(i int) { + select { + case r := <-cbChans[i]: + if r == nil { + t.Errorf("Callback #%d did not receive an error.", i) + } + case <-time.After(25 * time.Millisecond): + t.Errorf("Callback #%d never called.", i) + } + + wg.Done() + }(i) + } + + wg.Wait() +} + +// Tests that Manager.Delete removes all callbacks and stoppables from the list. +func TestManager_Delete(t *testing.T) { + m := NewManager() + + cbChan := make(chan error, 10) + cb := func(err error) { cbChan <- err } + tid := &ftCrypto.TransferID{5} + m.AddCallback(tid, cb, 0) + + m.Delete(tid) + + // Check that the callback was deleted + if _, exists := m.callbacks[*tid]; exists { + t.Errorf("Callback list found for transfer ID %s.", tid) + } + + // Check that the stoppable was deleted + if _, exists := m.stops[*tid]; exists { + t.Errorf("Stoppable list found for transfer ID %s.", tid) + } +} + +// Consistency test of makeStoppableName. +func Test_makeStoppableName_Consistency(t *testing.T) { + rng := NewPrng(42) + expectedValues := []string{ + "U4x/lrFkvxuXu59LtHLon1sUhPJSCcnZND6SugndnVI=/0", + "39ebTXZCm2F6DJ+fDTulWwzA1hRMiIU1hBrL4HCbB1g=/1", + "CD9h03W8ArQd9PkZKeGP2p5vguVOdI6B555LvW/jTNw=/2", + "uoQ+6NY+jE/+HOvqVG2PrBPdGqwEzi6ih3xVec+ix44=/3", + "GwuvrogbgqdREIpC7TyQPKpDRlp4YgYWl4rtDOPGxPM=/4", + "rnvD4ElbVxL+/b4MECiH4QDazS2IX2kstgfaAKEcHHA=/5", + "ceeWotwtwlpbdLLhKXBeJz8FySMmgo4rBW44F2WOEGE=/6", + "SYlH/fNEQQ7UwRYCP6jjV2tv7Sf/iXS6wMr9mtBWkrE=/7", + "NhnnOJZN/ceejVNDc2Yc/WbXT+weG4lJGrcjbkt1IWI=/8", + "kM8r60LDyicyhWDxqsBnzqbov0bUqytGgEAsX7KCDog=/9", + } + + for i, expected := range expectedValues { + tid, err := ftCrypto.NewTransferID(rng) + if err != nil { + t.Errorf("Failed to generated transfer ID #%d: %+v", i, err) + } + + name := makeStoppableName(&tid, i) + if expected != name { + t.Errorf("Stoppable name does not match expected."+ + "\nexpected: %q\nreceived: %q", expected, name) + } + } +} + +// Prng is a PRNG that satisfies the csprng.Source interface. +type Prng struct{ prng io.Reader } + +func NewPrng(seed int64) csprng.Source { return &Prng{rand.New(rand.NewSource(seed))} } +func (s *Prng) Read(b []byte) (int, error) { return s.prng.Read(b) } +func (s *Prng) SetSeed([]byte) error { return nil } diff --git a/fileTransfer2/connect/listener.go b/fileTransfer2/connect/listener.go new file mode 100644 index 0000000000000000000000000000000000000000..6eadbe4bc2222476d945e5aa23d4124a51b0f4db --- /dev/null +++ b/fileTransfer2/connect/listener.go @@ -0,0 +1,49 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package connect + +import ( + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/e2e/receive" +) + +// Error messages. +const ( + // listener.Hear + errNewReceivedTransfer = "[FT] Failed to add new received transfer: %+v" +) + +// Name of listener (used for debugging) +const listenerName = "NewFileTransferListener-Connection" + +// listener waits for a message indicating a new file transfer is starting. +// Adheres to the receive.Listener interface. +type listener struct { + m *Wrapper +} + +// Hear is called when a new file transfer is received. It creates a new +// internal received file transfer and starts waiting to receive file part +// messages. +func (l *listener) Hear(msg receive.Message) { + // Add new transfer to start receiving parts + tid, info, err := l.m.ft.HandleIncomingTransfer(msg.Payload, nil, 0) + if err != nil { + jww.ERROR.Printf(errNewReceivedTransfer, err) + return + } + + // Call the reception callback + go l.m.receiveCB( + tid, info.FileName, info.FileType, msg.Sender, info.Size, info.Preview) +} + +// Name returns a name used for debugging. +func (l *listener) Name() string { + return listenerName +} diff --git a/fileTransfer2/connect/params.go b/fileTransfer2/connect/params.go new file mode 100644 index 0000000000000000000000000000000000000000..93a3a44a1f6a6d001724875bd85ba5fd13374a54 --- /dev/null +++ b/fileTransfer2/connect/params.go @@ -0,0 +1,68 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package connect + +import ( + "encoding/json" +) + +const ( + defaultNotifyUponCompletion = true +) + +// Params contains parameters used for Connection file transfer. +type Params struct { + // NotifyUponCompletion indicates if a final notification message is sent + // to the recipient on completion of file transfer. If true, the ping is + NotifyUponCompletion bool +} + +// paramsDisk will be the marshal-able and umarshal-able object. +type paramsDisk struct { + NotifyUponCompletion bool +} + +// DefaultParams returns a Params object filled with the default values. +func DefaultParams() Params { + return Params{ + NotifyUponCompletion: defaultNotifyUponCompletion, + } +} + +// GetParameters returns the default Params, or override with given +// parameters, if set. +func GetParameters(params string) (Params, error) { + p := DefaultParams() + if len(params) > 0 { + err := json.Unmarshal([]byte(params), &p) + if err != nil { + return Params{}, err + } + } + return p, nil +} + +// MarshalJSON adheres to the json.Marshaler interface. +func (p Params) MarshalJSON() ([]byte, error) { + pDisk := paramsDisk{NotifyUponCompletion: p.NotifyUponCompletion} + return json.Marshal(&pDisk) + +} + +// UnmarshalJSON adheres to the json.Unmarshaler interface. +func (p *Params) UnmarshalJSON(data []byte) error { + pDisk := paramsDisk{} + err := json.Unmarshal(data, &pDisk) + if err != nil { + return err + } + + *p = Params{NotifyUponCompletion: pDisk.NotifyUponCompletion} + + return nil +} diff --git a/fileTransfer2/connect/send.go b/fileTransfer2/connect/send.go new file mode 100644 index 0000000000000000000000000000000000000000..12618c512be783f19962b4f897638684226cadf9 --- /dev/null +++ b/fileTransfer2/connect/send.go @@ -0,0 +1,79 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package connect + +import ( + "github.com/pkg/errors" + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/e2e" + ft "gitlab.com/elixxir/client/fileTransfer2" +) + +// Error messages. +const ( + // sendNewFileTransferMessage + errNewFtSendE2e = "failed to send initial file transfer message via connection E2E: %+v" + + // sendEndFileTransferMessage + errEndFtSendE2e = "[FT] Failed to send ending file transfer message via connection E2E: %+v" +) + +const ( + // Tag that is used for log printing in SendE2E when sending the initial + // message + initialMessageDebugTag = "FT.New" + + // Tag that is used for log printing in SendE2E when sending the ending + // message + lastMessageDebugTag = "FT.End" +) + +// sendNewFileTransferMessage sends an E2E message to the recipient informing +// them of the incoming file transfer. +func sendNewFileTransferMessage( + transferInfo []byte, connectionHandler Connection) error { + + // Get E2E parameters + params := e2e.GetDefaultParams() + params.ServiceTag = catalog.Silent + params.LastServiceTag = catalog.Silent + params.DebugTag = initialMessageDebugTag + + _, _, _, err := connectionHandler.SendE2E( + catalog.NewFileTransfer, transferInfo, params) + if err != nil { + return errors.Errorf(errNewFtSendE2e, err) + } + + return nil +} + +// sendEndFileTransferMessage sends an E2E message to the recipient informing +// them that all file parts have arrived once the network is healthy. +func sendEndFileTransferMessage(cmix ft.Cmix, connectionHandler Connection) { + callbackID := make(chan uint64, 1) + callbackID <- cmix.AddHealthCallback( + func(healthy bool) { + if healthy { + params := e2e.GetDefaultParams() + params.LastServiceTag = catalog.EndFT + params.DebugTag = lastMessageDebugTag + + _, _, _, err := connectionHandler.SendE2E( + catalog.EndFileTransfer, nil, params) + if err != nil { + jww.ERROR.Printf(errEndFtSendE2e, err) + } + + cbID := <-callbackID + cmix.RemoveHealthCallback(cbID) + } + }, + ) +} diff --git a/fileTransfer2/connect/utils_test.go b/fileTransfer2/connect/utils_test.go new file mode 100644 index 0000000000000000000000000000000000000000..fc33ef813802b84eb8c779fb2a57a88e571c2692 --- /dev/null +++ b/fileTransfer2/connect/utils_test.go @@ -0,0 +1,194 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package connect + +import ( + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/catalog" + "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/e2e" + "gitlab.com/elixxir/client/e2e/receive" + e2eCrypto "gitlab.com/elixxir/crypto/e2e" + "gitlab.com/elixxir/primitives/format" + "gitlab.com/xx_network/primitives/id" + "gitlab.com/xx_network/primitives/id/ephemeral" + "gitlab.com/xx_network/primitives/netTime" + "sync" + "time" +) + +//////////////////////////////////////////////////////////////////////////////// +// Mock cMix Client // +//////////////////////////////////////////////////////////////////////////////// + +type mockCmixHandler struct { + sync.Mutex + processorMap map[format.Fingerprint]message.Processor +} + +func newMockCmixHandler() *mockCmixHandler { + return &mockCmixHandler{ + processorMap: make(map[format.Fingerprint]message.Processor), + } +} + +type mockCmix struct { + myID *id.ID + numPrimeBytes int + health bool + handler *mockCmixHandler + healthCBs map[uint64]func(b bool) + healthIndex uint64 + sync.Mutex +} + +func newMockCmix(myID *id.ID, handler *mockCmixHandler) *mockCmix { + return &mockCmix{ + myID: myID, + numPrimeBytes: 97, + // numPrimeBytes: 4096, + health: true, + handler: handler, + healthCBs: make(map[uint64]func(b bool)), + healthIndex: 0, + } +} + +func (m *mockCmix) GetMaxMessageLength() int { + msg := format.NewMessage(m.numPrimeBytes) + return msg.ContentsSize() +} + +func (m *mockCmix) SendMany(messages []cmix.TargetedCmixMessage, + _ cmix.CMIXParams) (id.Round, []ephemeral.Id, error) { + m.handler.Lock() + for _, targetedMsg := range messages { + msg := format.NewMessage(m.numPrimeBytes) + msg.SetContents(targetedMsg.Payload) + msg.SetMac(targetedMsg.Mac) + msg.SetKeyFP(targetedMsg.Fingerprint) + m.handler.processorMap[targetedMsg.Fingerprint].Process(msg, + receptionID.EphemeralIdentity{Source: targetedMsg.Recipient}, + rounds.Round{ID: 42}) + } + m.handler.Unlock() + return 42, []ephemeral.Id{}, nil +} + +func (m *mockCmix) AddFingerprint(_ *id.ID, fp format.Fingerprint, mp message.Processor) error { + m.Lock() + defer m.Unlock() + m.handler.processorMap[fp] = mp + return nil +} + +func (m *mockCmix) DeleteFingerprint(_ *id.ID, fp format.Fingerprint) { + m.handler.Lock() + delete(m.handler.processorMap, fp) + m.handler.Unlock() +} + +func (m *mockCmix) IsHealthy() bool { + return m.health +} + +func (m *mockCmix) WasHealthy() bool { return true } + +func (m *mockCmix) AddHealthCallback(f func(bool)) uint64 { + m.Lock() + defer m.Unlock() + m.healthIndex++ + m.healthCBs[m.healthIndex] = f + go f(true) + return m.healthIndex +} + +func (m *mockCmix) RemoveHealthCallback(healthID uint64) { + m.Lock() + defer m.Unlock() + if _, exists := m.healthCBs[healthID]; !exists { + jww.FATAL.Panicf("No health callback with ID %d exists.", healthID) + } + delete(m.healthCBs, healthID) +} + +func (m *mockCmix) GetRoundResults(_ time.Duration, + roundCallback cmix.RoundEventCallback, _ ...id.Round) error { + go roundCallback(true, false, map[id.Round]cmix.RoundResult{42: {}}) + return nil +} + +//////////////////////////////////////////////////////////////////////////////// +// Mock Connection Handler // +//////////////////////////////////////////////////////////////////////////////// +func newMockListener(hearChan chan receive.Message) *mockListener { + return &mockListener{hearChan: hearChan} +} + +func (l *mockListener) Hear(item receive.Message) { + l.hearChan <- item +} + +func (l *mockListener) Name() string { + return "mockListener" +} + +type mockConnectionHandler struct { + msgMap map[catalog.MessageType][][]byte + listeners map[catalog.MessageType]receive.Listener + sync.Mutex +} + +func newMockConnectionHandler() *mockConnectionHandler { + return &mockConnectionHandler{ + msgMap: make(map[catalog.MessageType][][]byte), + listeners: make(map[catalog.MessageType]receive.Listener), + } +} + +type mockConnection struct { + myID *id.ID + handler *mockConnectionHandler +} + +type mockListener struct { + hearChan chan receive.Message +} + +func newMockConnection(myID *id.ID, handler *mockConnectionHandler) *mockConnection { + return &mockConnection{ + myID: myID, + handler: handler, + } +} + +// SendE2E adds the message to the e2e handler map. +func (m *mockConnection) SendE2E(mt catalog.MessageType, payload []byte, + _ e2e.Params) ([]id.Round, e2eCrypto.MessageID, time.Time, error) { + m.handler.Lock() + defer m.handler.Unlock() + + m.handler.listeners[mt].Hear(receive.Message{ + MessageType: mt, + Payload: payload, + Sender: m.myID, + }) + + return []id.Round{42}, e2eCrypto.MessageID{}, netTime.Now(), nil +} + +func (m *mockConnection) RegisterListener( + mt catalog.MessageType, listener receive.Listener) receive.ListenerID { + m.handler.Lock() + defer m.handler.Unlock() + m.handler.listeners[mt] = listener + return receive.ListenerID{} +} diff --git a/fileTransfer2/connect/wrapper.go b/fileTransfer2/connect/wrapper.go new file mode 100644 index 0000000000000000000000000000000000000000..19baf1fb59ebece52c7a128c7b742c6fbe4f588d --- /dev/null +++ b/fileTransfer2/connect/wrapper.go @@ -0,0 +1,158 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package connect + +import ( + "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/e2e" + "gitlab.com/elixxir/client/e2e/receive" + ft "gitlab.com/elixxir/client/fileTransfer2" + e2eCrypto "gitlab.com/elixxir/crypto/e2e" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/xx_network/primitives/id" + "time" +) + +// Wrapper handles the sending and receiving of file transfers using the +// Connection interface messages to inform the recipient of incoming file +// transfers. +type Wrapper struct { + // Callback that is called every time a new file transfer is received + receiveCB ft.ReceiveCallback + + // File transfer Manager + ft ft.FileTransfer + + // Params for wrapper + p Params + + cmix ft.Cmix + conn Connection +} + +// Connection interface matches a subset of the connect.Connection methods used +// by the Wrapper for easier testing. +type Connection interface { + SendE2E(mt catalog.MessageType, payload []byte, params e2e.Params) ( + []id.Round, e2eCrypto.MessageID, time.Time, error) + RegisterListener(messageType catalog.MessageType, + newListener receive.Listener) receive.ListenerID +} + +// NewWrapper generates a new file transfer manager using Connection E2E. +func NewWrapper(receiveCB ft.ReceiveCallback, p Params, ft ft.FileTransfer, + conn Connection, cmix ft.Cmix) (*Wrapper, error) { + w := &Wrapper{ + receiveCB: receiveCB, + ft: ft, + p: p, + cmix: cmix, + conn: conn, + } + + // Register listener to receive new file transfers + w.conn.RegisterListener(catalog.NewFileTransfer, &listener{w}) + + return w, nil +} + +// MaxFileNameLen returns the max number of bytes allowed for a file name. +func (w *Wrapper) MaxFileNameLen() int { + return w.ft.MaxFileNameLen() +} + +// MaxFileTypeLen returns the max number of bytes allowed for a file type. +func (w *Wrapper) MaxFileTypeLen() int { + return w.ft.MaxFileTypeLen() +} + +// MaxFileSize returns the max number of bytes allowed for a file. +func (w *Wrapper) MaxFileSize() int { + return w.ft.MaxFileSize() +} + +// MaxPreviewSize returns the max number of bytes allowed for a file preview. +func (w *Wrapper) MaxPreviewSize() int { + return w.ft.MaxPreviewSize() +} + +// Send initiates the sending of a file to a recipient and returns a transfer ID +// that uniquely identifies this file transfer. The initial and final messages +// are sent via Connection E2E. +func (w *Wrapper) Send(recipient *id.ID, fileName, fileType string, + fileData []byte, retry float32, preview []byte, + progressCB ft.SentProgressCallback, period time.Duration) ( + *ftCrypto.TransferID, error) { + + sendNew := func(transferInfo []byte) error { + return sendNewFileTransferMessage(transferInfo, w.conn) + } + + modifiedProgressCB := w.addEndMessageToCallback(progressCB) + + return w.ft.Send(recipient, fileName, fileType, fileData, retry, preview, + modifiedProgressCB, period, sendNew) +} + +// RegisterSentProgressCallback allows for the registration of a callback to +// track the progress of an individual sent file transfer. +func (w *Wrapper) RegisterSentProgressCallback(tid *ftCrypto.TransferID, + progressCB ft.SentProgressCallback, period time.Duration) error { + + modifiedProgressCB := w.addEndMessageToCallback(progressCB) + + return w.ft.RegisterSentProgressCallback(tid, modifiedProgressCB, period) +} + +// addEndMessageToCallback adds the sending of an Connection E2E message when +// the transfer completed to the callback. If NotifyUponCompletion is not set, +// then the message is not sent. +func (w *Wrapper) addEndMessageToCallback(progressCB ft.SentProgressCallback) ft.SentProgressCallback { + if !w.p.NotifyUponCompletion { + return progressCB + } + return func(completed bool, arrived, total uint16, + st ft.SentTransfer, t ft.FilePartTracker, err error) { + + // If the transfer is completed, send last message informing recipient + if completed { + sendEndFileTransferMessage(w.cmix, w.conn) + } + + progressCB(completed, arrived, total, st, t, err) + } +} + +// 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 (w *Wrapper) CloseSend(tid *ftCrypto.TransferID) error { + return w.ft.CloseSend(tid) +} + +// RegisterReceivedProgressCallback allows for the registration of a callback to +// track the progress of an individual received file transfer. This must be done +// when a new transfer is received on the ReceiveCallback. +func (w *Wrapper) RegisterReceivedProgressCallback(tid *ftCrypto.TransferID, + progressCB ft.ReceivedProgressCallback, period time.Duration) error { + return w.ft.RegisterReceivedProgressCallback(tid, progressCB, period) +} + +// 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 (w *Wrapper) Receive(tid *ftCrypto.TransferID) ([]byte, error) { + return w.ft.Receive(tid) +} diff --git a/fileTransfer2/connect/wrapper_test.go b/fileTransfer2/connect/wrapper_test.go new file mode 100644 index 0000000000000000000000000000000000000000..dbcea8d10cf96406196da1bc676472d1cc025a31 --- /dev/null +++ b/fileTransfer2/connect/wrapper_test.go @@ -0,0 +1,214 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package connect + +import ( + "bytes" + "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/connect" + "gitlab.com/elixxir/client/e2e/receive" + ft "gitlab.com/elixxir/client/fileTransfer2" + "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/crypto/fastRNG" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/elixxir/ekv" + "gitlab.com/xx_network/crypto/csprng" + "gitlab.com/xx_network/primitives/id" + "gitlab.com/xx_network/primitives/netTime" + "math" + "sync" + "testing" + "time" +) + +// Tests that Connection adheres to the connect.Connection interface. +var _ Connection = (connect.Connection)(nil) + +// Smoke test of the entire file transfer system. +func Test_FileTransfer_Smoke(t *testing.T) { + // jww.SetStdoutThreshold(jww.LevelDebug) + // Set up cMix and E2E message handlers + cMixHandler := newMockCmixHandler() + e2eHandler := newMockConnectionHandler() + rngGen := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG) + ftParams := ft.DefaultParams() + ftParams.MaxThroughput = math.MaxInt + params := DefaultParams() + + type receiveCbValues struct { + tid *ftCrypto.TransferID + fileName string + fileType string + sender *id.ID + size uint32 + preview []byte + } + + // Set up the first client + receiveCbChan1 := make(chan receiveCbValues, 10) + receiveCB1 := func(tid *ftCrypto.TransferID, fileName, fileType string, + sender *id.ID, size uint32, preview []byte) { + receiveCbChan1 <- receiveCbValues{ + tid, fileName, fileType, sender, size, preview} + } + myID1 := id.NewIdFromString("myID1", id.User, t) + kv1 := versioned.NewKV(ekv.MakeMemstore()) + endE2eChan1 := make(chan receive.Message, 3) + conn1 := newMockConnection(myID1, e2eHandler) + conn1.RegisterListener(catalog.EndFileTransfer, newMockListener(endE2eChan1)) + cmix1 := newMockCmix(myID1, cMixHandler) + ftManager1, err := ft.NewManager(ftParams, myID1, cmix1, kv1, rngGen) + if err != nil { + t.Errorf("Failed to make new file transfer manager: %+v", err) + } + stop1, err := ftManager1.StartProcesses() + if err != nil { + t.Errorf("Failed to start processes for manager 1: %+v", err) + } + m1, err := NewWrapper(receiveCB1, params, ftManager1, conn1, cmix1) + if err != nil { + t.Errorf("Failed to create new file transfer manager 1: %+v", err) + } + + // Set up the second client + receiveCbChan2 := make(chan receiveCbValues, 10) + receiveCB2 := func(tid *ftCrypto.TransferID, fileName, fileType string, + sender *id.ID, size uint32, preview []byte) { + receiveCbChan2 <- receiveCbValues{ + tid, fileName, fileType, sender, size, preview} + } + myID2 := id.NewIdFromString("myID2", id.User, t) + kv2 := versioned.NewKV(ekv.MakeMemstore()) + endE2eChan2 := make(chan receive.Message, 3) + conn2 := newMockConnection(myID2, e2eHandler) + conn2.RegisterListener(catalog.EndFileTransfer, newMockListener(endE2eChan2)) + cmix2 := newMockCmix(myID1, cMixHandler) + ftManager2, err := ft.NewManager(ftParams, myID2, cmix2, kv2, rngGen) + if err != nil { + t.Errorf("Failed to make new file transfer manager: %+v", err) + } + stop2, err := ftManager2.StartProcesses() + if err != nil { + t.Errorf("Failed to start processes for manager 2: %+v", err) + } + m2, err := NewWrapper(receiveCB2, params, ftManager2, conn2, cmix2) + if err != nil { + t.Errorf("Failed to create new file transfer manager 2: %+v", err) + } + + // Wait group prevents the test from quiting before the file has completed + // sending and receiving + var wg sync.WaitGroup + + // Define details of file to send + fileName, fileType := "myFile", "txt" + fileData := []byte(loremIpsum) + preview := []byte("Lorem ipsum dolor sit amet") + retry := float32(2.0) + + // Create go func that waits for file transfer to be received to register + // a progress callback that then checks that the file received is correct + // when done + wg.Add(1) + var called bool + timeReceived := make(chan time.Time) + go func() { + select { + case r := <-receiveCbChan2: + receiveProgressCB := func(completed bool, received, total uint16, + rt ft.ReceivedTransfer, fpt ft.FilePartTracker, err error) { + if completed && !called { + timeReceived <- netTime.Now() + receivedFile, err2 := m2.Receive(r.tid) + if err2 != nil { + t.Errorf("Failed to receive file: %+v", err2) + } + + if !bytes.Equal(fileData, receivedFile) { + t.Errorf("Received file does not match sent."+ + "\nsent: %q\nreceived: %q", + fileData, receivedFile) + } + wg.Done() + } + } + err3 := m2.RegisterReceivedProgressCallback( + r.tid, receiveProgressCB, 0) + if err3 != nil { + t.Errorf( + "Failed to Rregister received progress callback: %+v", err3) + } + case <-time.After(2100 * time.Millisecond): + t.Errorf("Timed out waiting to receive new file transfer.") + wg.Done() + } + }() + + // Define sent progress callback + wg.Add(1) + sentProgressCb1 := func(completed bool, arrived, total uint16, + st ft.SentTransfer, fpt ft.FilePartTracker, err error) { + if completed { + wg.Done() + } + } + + // Send file + sendStart := netTime.Now() + tid1, err := m1.Send( + myID2, fileName, fileType, fileData, retry, preview, sentProgressCb1, 0) + if err != nil { + t.Errorf("Failed to send file: %+v", err) + } + + go func() { + select { + case tr := <-timeReceived: + fileSize := len(fileData) + sendTime := tr.Sub(sendStart) + fileSizeKb := float32(fileSize) * .001 + speed := fileSizeKb * float32(time.Second) / (float32(sendTime)) + t.Logf("Completed receiving file %q in %s (%.2f kb @ %.2f kb/s).", + fileName, sendTime, fileSizeKb, speed) + } + }() + + // Wait for file to be sent and received + wg.Wait() + + select { + case <-endE2eChan2: + case <-time.After(15 * time.Millisecond): + t.Errorf("Timed out waiting for end file transfer message.") + } + + err = m1.CloseSend(tid1) + if err != nil { + t.Errorf("Failed to close transfer: %+v", err) + } + + err = stop1.Close() + if err != nil { + t.Errorf("Failed to close processes for manager 1: %+v", err) + } + + err = stop2.Close() + if err != nil { + t.Errorf("Failed to close processes for manager 2: %+v", err) + } +} + +const loremIpsum = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sit amet urna venenatis, rutrum magna maximus, tempor orci. Cras sit amet nulla id dolor blandit commodo. Suspendisse potenti. Praesent gravida porttitor metus vel aliquam. Maecenas rutrum velit at lobortis auctor. Mauris porta blandit tempor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi volutpat posuere maximus. Nunc in augue molestie ante mattis tempor. + +Phasellus placerat elit eu fringilla pharetra. Vestibulum consectetur pulvinar nunc, vestibulum tincidunt felis rhoncus sit amet. Duis non dolor eleifend nibh luctus eleifend. Nunc urna odio, euismod sit amet feugiat ut, dapibus vel elit. Nulla est mauris, posuere eget enim cursus, vehicula viverra est. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque mattis, nisi quis consectetur semper, neque enim rhoncus dolor, ut aliquam leo orci sed dolor. Integer ullamcorper pulvinar turpis, a sollicitudin nunc posuere et. Nullam orci nibh, facilisis ac massa eu, bibendum bibendum sapien. Sed tincidunt nunc mauris, nec ullamcorper enim lacinia nec. Nulla dapibus sapien ut odio bibendum, tempus ornare sapien lacinia. + +Duis ac hendrerit augue. Nullam porttitor feugiat finibus. Nam enim urna, maximus et ligula eu, aliquet convallis turpis. Vestibulum luctus quam in dictum efficitur. Vestibulum ac pulvinar ipsum. Vivamus consectetur augue nec tellus mollis, at iaculis magna efficitur. Nunc dictum convallis sem, at vehicula nulla accumsan non. Nullam blandit orci vel turpis convallis, mollis porttitor felis accumsan. Sed non posuere leo. Proin ultricies varius nulla at ultricies. Phasellus et pharetra justo. Quisque eu orci odio. Pellentesque pharetra tempor tempor. Aliquam ac nulla lorem. Sed dignissim ligula sit amet nibh fermentum facilisis. + +Donec facilisis rhoncus ante. Duis nec nisi et dolor congue semper vel id ligula. Mauris non eleifend libero, et sodales urna. Nullam pharetra gravida velit non mollis. Integer vel ultrices libero, at ultrices magna. Duis semper risus a leo vulputate consectetur. Cras sit amet convallis sapien. Sed blandit, felis et porttitor fringilla, urna tellus commodo metus, at pharetra nibh urna sed sem. Nam ex dui, posuere id mi et, egestas tincidunt est. Nullam elementum pulvinar diam in maximus. Maecenas vel augue vitae nunc consectetur vestibulum in aliquet lacus. Nullam nec lectus dapibus, dictum nisi nec, congue quam. Suspendisse mollis vel diam nec dapibus. Mauris neque justo, scelerisque et suscipit non, imperdiet eget leo. Vestibulum leo turpis, dapibus ac lorem a, mollis pulvinar quam. + +Sed sed mauris a neque dignissim aliquet. Aliquam congue gravida velit in efficitur. Integer elementum feugiat est, ac lacinia libero bibendum sed. Sed vestibulum suscipit dignissim. Nunc scelerisque, turpis quis varius tristique, enim lacus vehicula lacus, id vestibulum velit erat eu odio. Donec tincidunt nunc sit amet sapien varius ornare. Phasellus semper venenatis ligula eget euismod. Mauris sodales massa tempor, cursus velit a, feugiat neque. Sed odio justo, rhoncus eu fermentum non, tristique a quam. In vehicula in tortor nec iaculis. Cras ligula sem, sollicitudin at nulla eget, placerat lacinia massa. Mauris tempus quam sit amet leo efficitur egestas. Proin iaculis, velit in blandit egestas, felis odio sollicitudin ipsum, eget interdum leo odio tempor nisi. Curabitur sed mauris id turpis tempor finibus ut mollis lectus. Curabitur neque libero, aliquam facilisis lobortis eget, posuere in augue. In sodales urna sit amet elit euismod rhoncus.` diff --git a/fileTransfer2/delayedTimer.go b/fileTransfer2/delayedTimer.go new file mode 100644 index 0000000000000000000000000000000000000000..5f62cbc5c799623b9705a2395950eb5d954f2232 --- /dev/null +++ b/fileTransfer2/delayedTimer.go @@ -0,0 +1,56 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package fileTransfer2 + +import "time" + +// The DelayedTimer type represents a single event manually started. +// When the DelayedTimer expires, the current time will be sent on C. +// A DelayedTimer must be created with NewDelayedTimer. +type DelayedTimer struct { + d time.Duration + t *time.Timer + C *<-chan time.Time +} + +// NewDelayedTimer creates a new DelayedTimer that will send the current time on +// its channel after at least duration d once it is started. +func NewDelayedTimer(d time.Duration) *DelayedTimer { + c := make(<-chan time.Time) + return &DelayedTimer{ + d: d, + C: &c, + } +} + +// Start starts the timer that will send the current time on its channel after +// at least duration d. If it is already running or stopped, it does nothing. +func (dt *DelayedTimer) Start() { + if dt.t == nil { + dt.t = time.NewTimer(dt.d) + dt.C = &dt.t.C + } +} + +// Stop prevents the Timer from firing. +// It returns true if the call stops the timer, false if the timer has already +// expired, been stopped, or was never started. +func (dt *DelayedTimer) Stop() bool { + if dt.t == nil { + return false + } + + return dt.t.Stop() +} diff --git a/fileTransfer2/e2e/listener.go b/fileTransfer2/e2e/listener.go new file mode 100644 index 0000000000000000000000000000000000000000..4a07ed9d0682bc9e3af37d67e9e4dcc8902971dc --- /dev/null +++ b/fileTransfer2/e2e/listener.go @@ -0,0 +1,49 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package e2e + +import ( + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/e2e/receive" +) + +// Error messages. +const ( + // listener.Hear + errNewReceivedTransfer = "[FT] Failed to add new received transfer: %+v" +) + +// Name of listener (used for debugging) +const listenerName = "NewFileTransferListener-E2E" + +// listener waits for a message indicating a new file transfer is starting. +// Adheres to the receive.Listener interface. +type listener struct { + m *Wrapper +} + +// Hear is called when a new file transfer is received. It creates a new +// internal received file transfer and starts waiting to receive file part +// messages. +func (l *listener) Hear(msg receive.Message) { + // Add new transfer to start receiving parts + tid, info, err := l.m.ft.HandleIncomingTransfer(msg.Payload, nil, 0) + if err != nil { + jww.ERROR.Printf(errNewReceivedTransfer, err) + return + } + + // Call the reception callback + go l.m.receiveCB( + tid, info.FileName, info.FileType, msg.Sender, info.Size, info.Preview) +} + +// Name returns a name used for debugging. +func (l *listener) Name() string { + return listenerName +} diff --git a/fileTransfer2/e2e/params.go b/fileTransfer2/e2e/params.go new file mode 100644 index 0000000000000000000000000000000000000000..819e963f5fd9efc3d058b5a953e87c7aa8874f1f --- /dev/null +++ b/fileTransfer2/e2e/params.go @@ -0,0 +1,66 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package e2e + +import "encoding/json" + +const ( + defaultNotifyUponCompletion = true +) + +// Params contains parameters used for E2E file transfer. +type Params struct { + // NotifyUponCompletion indicates if a final notification message is sent + // to the recipient on completion of file transfer. If true, the ping is + NotifyUponCompletion bool +} + +// paramsDisk will be the marshal-able and umarshal-able object. +type paramsDisk struct { + NotifyUponCompletion bool +} + +// DefaultParams returns a Params object filled with the default values. +func DefaultParams() Params { + return Params{ + NotifyUponCompletion: defaultNotifyUponCompletion, + } +} + +// GetParameters returns the default Params, or override with given +// parameters, if set. +func GetParameters(params string) (Params, error) { + p := DefaultParams() + if len(params) > 0 { + err := json.Unmarshal([]byte(params), &p) + if err != nil { + return Params{}, err + } + } + return p, nil +} + +// MarshalJSON adheres to the json.Marshaler interface. +func (p Params) MarshalJSON() ([]byte, error) { + pDisk := paramsDisk{NotifyUponCompletion: p.NotifyUponCompletion} + return json.Marshal(&pDisk) + +} + +// UnmarshalJSON adheres to the json.Unmarshaler interface. +func (p *Params) UnmarshalJSON(data []byte) error { + pDisk := paramsDisk{} + err := json.Unmarshal(data, &pDisk) + if err != nil { + return err + } + + *p = Params{NotifyUponCompletion: pDisk.NotifyUponCompletion} + + return nil +} diff --git a/fileTransfer2/e2e/send.go b/fileTransfer2/e2e/send.go new file mode 100644 index 0000000000000000000000000000000000000000..54deb4e7e13990d48c9ac775f47cc27986556c23 --- /dev/null +++ b/fileTransfer2/e2e/send.go @@ -0,0 +1,80 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package e2e + +import ( + "github.com/pkg/errors" + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/e2e" + ft "gitlab.com/elixxir/client/fileTransfer2" + "gitlab.com/xx_network/primitives/id" +) + +// Error messages. +const ( + // sendNewFileTransferMessage + errNewFtSendE2e = "failed to send initial file transfer message via E2E: %+v" + + // sendEndFileTransferMessage + errEndFtSendE2e = "[FT] Failed to send ending file transfer message via E2E: %+v" +) + +const ( + // Tag that is used for log printing in SendE2E when sending the initial + // message + initialMessageDebugTag = "FT.New" + + // Tag that is used for log printing in SendE2E when sending the ending + // message + lastMessageDebugTag = "FT.End" +) + +// sendNewFileTransferMessage sends an E2E message to the recipient informing +// them of the incoming file transfer. +func sendNewFileTransferMessage( + recipient *id.ID, transferInfo []byte, e2eHandler E2e) error { + + // Get E2E parameters + params := e2e.GetDefaultParams() + params.ServiceTag = catalog.Silent + params.LastServiceTag = catalog.Silent + params.DebugTag = initialMessageDebugTag + + _, _, _, err := e2eHandler.SendE2E( + catalog.NewFileTransfer, recipient, transferInfo, params) + if err != nil { + return errors.Errorf(errNewFtSendE2e, err) + } + + return nil +} + +// sendEndFileTransferMessage sends an E2E message to the recipient informing +// them that all file parts have arrived once the network is healthy. +func sendEndFileTransferMessage(recipient *id.ID, cmix ft.Cmix, e2eHandler E2e) { + callbackID := make(chan uint64, 1) + callbackID <- cmix.AddHealthCallback( + func(healthy bool) { + if healthy { + params := e2e.GetDefaultParams() + params.LastServiceTag = catalog.EndFT + params.DebugTag = lastMessageDebugTag + + _, _, _, err := e2eHandler.SendE2E( + catalog.EndFileTransfer, recipient, nil, params) + if err != nil { + jww.ERROR.Printf(errEndFtSendE2e, err) + } + + cbID := <-callbackID + cmix.RemoveHealthCallback(cbID) + } + }, + ) +} diff --git a/fileTransfer2/e2e/utils_test.go b/fileTransfer2/e2e/utils_test.go new file mode 100644 index 0000000000000000000000000000000000000000..ab49a4bc9acb43be14872786ec5841a14e5cfe72 --- /dev/null +++ b/fileTransfer2/e2e/utils_test.go @@ -0,0 +1,195 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package e2e + +import ( + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/catalog" + "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/e2e" + "gitlab.com/elixxir/client/e2e/receive" + e2eCrypto "gitlab.com/elixxir/crypto/e2e" + "gitlab.com/elixxir/primitives/format" + "gitlab.com/xx_network/primitives/id" + "gitlab.com/xx_network/primitives/id/ephemeral" + "gitlab.com/xx_network/primitives/netTime" + "sync" + "time" +) + +//////////////////////////////////////////////////////////////////////////////// +// Mock cMix Client // +//////////////////////////////////////////////////////////////////////////////// + +type mockCmixHandler struct { + sync.Mutex + processorMap map[format.Fingerprint]message.Processor +} + +func newMockCmixHandler() *mockCmixHandler { + return &mockCmixHandler{ + processorMap: make(map[format.Fingerprint]message.Processor), + } +} + +type mockCmix struct { + myID *id.ID + numPrimeBytes int + health bool + handler *mockCmixHandler + healthCBs map[uint64]func(b bool) + healthIndex uint64 + sync.Mutex +} + +func newMockCmix(myID *id.ID, handler *mockCmixHandler) *mockCmix { + return &mockCmix{ + myID: myID, + numPrimeBytes: 97, + // numPrimeBytes: 4096, + health: true, + handler: handler, + healthCBs: make(map[uint64]func(b bool)), + healthIndex: 0, + } +} + +func (m *mockCmix) GetMaxMessageLength() int { + msg := format.NewMessage(m.numPrimeBytes) + return msg.ContentsSize() +} + +func (m *mockCmix) SendMany(messages []cmix.TargetedCmixMessage, + _ cmix.CMIXParams) (id.Round, []ephemeral.Id, error) { + m.handler.Lock() + for _, targetedMsg := range messages { + msg := format.NewMessage(m.numPrimeBytes) + msg.SetContents(targetedMsg.Payload) + msg.SetMac(targetedMsg.Mac) + msg.SetKeyFP(targetedMsg.Fingerprint) + m.handler.processorMap[targetedMsg.Fingerprint].Process(msg, + receptionID.EphemeralIdentity{Source: targetedMsg.Recipient}, + rounds.Round{ID: 42}) + } + m.handler.Unlock() + return 42, []ephemeral.Id{}, nil +} + +func (m *mockCmix) AddFingerprint(_ *id.ID, fp format.Fingerprint, mp message.Processor) error { + m.Lock() + defer m.Unlock() + m.handler.processorMap[fp] = mp + return nil +} + +func (m *mockCmix) DeleteFingerprint(_ *id.ID, fp format.Fingerprint) { + m.handler.Lock() + delete(m.handler.processorMap, fp) + m.handler.Unlock() +} + +func (m *mockCmix) IsHealthy() bool { + return m.health +} + +func (m *mockCmix) WasHealthy() bool { return true } + +func (m *mockCmix) AddHealthCallback(f func(bool)) uint64 { + m.Lock() + defer m.Unlock() + m.healthIndex++ + m.healthCBs[m.healthIndex] = f + go f(true) + return m.healthIndex +} + +func (m *mockCmix) RemoveHealthCallback(healthID uint64) { + m.Lock() + defer m.Unlock() + if _, exists := m.healthCBs[healthID]; !exists { + jww.FATAL.Panicf("No health callback with ID %d exists.", healthID) + } + delete(m.healthCBs, healthID) +} + +func (m *mockCmix) GetRoundResults(_ time.Duration, + roundCallback cmix.RoundEventCallback, _ ...id.Round) error { + go roundCallback(true, false, map[id.Round]cmix.RoundResult{42: {}}) + return nil +} + +//////////////////////////////////////////////////////////////////////////////// +// Mock E2E Handler // +//////////////////////////////////////////////////////////////////////////////// +func newMockListener(hearChan chan receive.Message) *mockListener { + return &mockListener{hearChan: hearChan} +} + +func (l *mockListener) Hear(item receive.Message) { + l.hearChan <- item +} + +func (l *mockListener) Name() string { + return "mockListener" +} + +type mockE2eHandler struct { + msgMap map[id.ID]map[catalog.MessageType][][]byte + listeners map[id.ID]map[catalog.MessageType]receive.Listener +} + +func newMockE2eHandler() *mockE2eHandler { + return &mockE2eHandler{ + msgMap: make(map[id.ID]map[catalog.MessageType][][]byte), + listeners: make(map[id.ID]map[catalog.MessageType]receive.Listener), + } +} + +type mockE2e struct { + myID *id.ID + handler *mockE2eHandler +} + +type mockListener struct { + hearChan chan receive.Message +} + +func newMockE2e(myID *id.ID, handler *mockE2eHandler) *mockE2e { + return &mockE2e{ + myID: myID, + handler: handler, + } +} + +// SendE2E adds the message to the e2e handler map. +func (m *mockE2e) SendE2E(mt catalog.MessageType, recipient *id.ID, payload []byte, + _ e2e.Params) ([]id.Round, e2eCrypto.MessageID, time.Time, error) { + + m.handler.listeners[*recipient][mt].Hear(receive.Message{ + MessageType: mt, + Payload: payload, + Sender: m.myID, + RecipientID: recipient, + }) + + return []id.Round{42}, e2eCrypto.MessageID{}, netTime.Now(), nil +} + +func (m *mockE2e) RegisterListener(senderID *id.ID, mt catalog.MessageType, + listener receive.Listener) receive.ListenerID { + if _, exists := m.handler.listeners[*senderID]; !exists { + m.handler.listeners[*senderID] = + map[catalog.MessageType]receive.Listener{mt: listener} + } else if _, exists = m.handler.listeners[*senderID][mt]; !exists { + m.handler.listeners[*senderID][mt] = listener + } + return receive.ListenerID{} +} diff --git a/fileTransfer2/e2e/wrapper.go b/fileTransfer2/e2e/wrapper.go new file mode 100644 index 0000000000000000000000000000000000000000..c03debdac07b9518a38445dab2fb2e1228889738 --- /dev/null +++ b/fileTransfer2/e2e/wrapper.go @@ -0,0 +1,159 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package e2e + +import ( + "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/e2e" + "gitlab.com/elixxir/client/e2e/receive" + ft "gitlab.com/elixxir/client/fileTransfer2" + e2eCrypto "gitlab.com/elixxir/crypto/e2e" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/xx_network/primitives/id" + "time" +) + +// Wrapper handles the sending and receiving of file transfers using E2E +// messages to inform the recipient of incoming file transfers. +type Wrapper struct { + // Callback that is called every time a new file transfer is received + receiveCB ft.ReceiveCallback + + // File transfer Manager + ft ft.FileTransfer + + // Params for wrapper + p Params + + myID *id.ID + cmix ft.Cmix + e2e E2e +} + +// E2e interface matches a subset of the e2e.Handler methods used by the Wrapper +// for easier testing. +type E2e interface { + SendE2E(mt catalog.MessageType, recipient *id.ID, payload []byte, + params e2e.Params) ([]id.Round, e2eCrypto.MessageID, time.Time, error) + RegisterListener(senderID *id.ID, messageType catalog.MessageType, + newListener receive.Listener) receive.ListenerID +} + +// NewWrapper generates a new file transfer manager using E2E. +func NewWrapper(receiveCB ft.ReceiveCallback, p Params, ft ft.FileTransfer, + myID *id.ID, e2e E2e, cmix ft.Cmix) (*Wrapper, error) { + w := &Wrapper{ + receiveCB: receiveCB, + ft: ft, + p: p, + myID: myID, + cmix: cmix, + e2e: e2e, + } + + // Register listener to receive new file transfers + w.e2e.RegisterListener(w.myID, catalog.NewFileTransfer, &listener{w}) + + return w, nil +} + +// MaxFileNameLen returns the max number of bytes allowed for a file name. +func (w *Wrapper) MaxFileNameLen() int { + return w.ft.MaxFileNameLen() +} + +// MaxFileTypeLen returns the max number of bytes allowed for a file type. +func (w *Wrapper) MaxFileTypeLen() int { + return w.ft.MaxFileTypeLen() +} + +// MaxFileSize returns the max number of bytes allowed for a file. +func (w *Wrapper) MaxFileSize() int { + return w.ft.MaxFileSize() +} + +// MaxPreviewSize returns the max number of bytes allowed for a file preview. +func (w *Wrapper) MaxPreviewSize() int { + return w.ft.MaxPreviewSize() +} + +// Send initiates the sending of a file to a recipient and returns a transfer ID +// that uniquely identifies this file transfer. The initial and final messages +// are sent via E2E. +func (w *Wrapper) Send(recipient *id.ID, fileName, fileType string, + fileData []byte, retry float32, preview []byte, + progressCB ft.SentProgressCallback, period time.Duration) ( + *ftCrypto.TransferID, error) { + + sendNew := func(transferInfo []byte) error { + return sendNewFileTransferMessage(recipient, transferInfo, w.e2e) + } + + modifiedProgressCB := w.addEndMessageToCallback(progressCB) + + return w.ft.Send(recipient, fileName, fileType, fileData, retry, preview, + modifiedProgressCB, period, sendNew) +} + +// RegisterSentProgressCallback allows for the registration of a callback to +// track the progress of an individual sent file transfer. +func (w *Wrapper) RegisterSentProgressCallback(tid *ftCrypto.TransferID, + progressCB ft.SentProgressCallback, period time.Duration) error { + + modifiedProgressCB := w.addEndMessageToCallback(progressCB) + + return w.ft.RegisterSentProgressCallback(tid, modifiedProgressCB, period) +} + +// addEndMessageToCallback adds the sending of an E2E message when the transfer +// completed to the callback. If NotifyUponCompletion is not set, then the +// message is not sent. +func (w *Wrapper) addEndMessageToCallback(progressCB ft.SentProgressCallback) ft.SentProgressCallback { + if !w.p.NotifyUponCompletion { + return progressCB + } + return func(completed bool, arrived, total uint16, + st ft.SentTransfer, t ft.FilePartTracker, err error) { + + // If the transfer is completed, send last message informing recipient + if completed { + sendEndFileTransferMessage(st.Recipient(), w.cmix, w.e2e) + } + + progressCB(completed, arrived, total, st, t, err) + } +} + +// 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 (w *Wrapper) CloseSend(tid *ftCrypto.TransferID) error { + return w.ft.CloseSend(tid) +} + +// RegisterReceivedProgressCallback allows for the registration of a callback to +// track the progress of an individual received file transfer. This must be done +// when a new transfer is received on the ReceiveCallback. +func (w *Wrapper) RegisterReceivedProgressCallback(tid *ftCrypto.TransferID, + progressCB ft.ReceivedProgressCallback, period time.Duration) error { + return w.ft.RegisterReceivedProgressCallback(tid, progressCB, period) +} + +// 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 (w *Wrapper) Receive(tid *ftCrypto.TransferID) ([]byte, error) { + return w.ft.Receive(tid) +} diff --git a/fileTransfer2/e2e/wrapper_test.go b/fileTransfer2/e2e/wrapper_test.go new file mode 100644 index 0000000000000000000000000000000000000000..ffe08e2fb65eba179a022123eadaeb6c311bfd24 --- /dev/null +++ b/fileTransfer2/e2e/wrapper_test.go @@ -0,0 +1,216 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package e2e + +import ( + "bytes" + "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/e2e" + "gitlab.com/elixxir/client/e2e/receive" + ft "gitlab.com/elixxir/client/fileTransfer2" + "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/crypto/fastRNG" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/elixxir/ekv" + "gitlab.com/xx_network/crypto/csprng" + "gitlab.com/xx_network/primitives/id" + "gitlab.com/xx_network/primitives/netTime" + "math" + "sync" + "testing" + "time" +) + +// Tests that E2e adheres to the e2e.Handler interface. +var _ E2e = (e2e.Handler)(nil) + +// Smoke test of the entire file transfer system. +func Test_FileTransfer_Smoke(t *testing.T) { + // jww.SetStdoutThreshold(jww.LevelDebug) + // Set up cMix and E2E message handlers + cMixHandler := newMockCmixHandler() + e2eHandler := newMockE2eHandler() + rngGen := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG) + ftParams := ft.DefaultParams() + ftParams.MaxThroughput = math.MaxInt + params := DefaultParams() + + type receiveCbValues struct { + tid *ftCrypto.TransferID + fileName string + fileType string + sender *id.ID + size uint32 + preview []byte + } + + // Set up the first client + receiveCbChan1 := make(chan receiveCbValues, 10) + receiveCB1 := func(tid *ftCrypto.TransferID, fileName, fileType string, + sender *id.ID, size uint32, preview []byte) { + receiveCbChan1 <- receiveCbValues{ + tid, fileName, fileType, sender, size, preview} + } + myID1 := id.NewIdFromString("myID1", id.User, t) + kv1 := versioned.NewKV(ekv.MakeMemstore()) + endE2eChan1 := make(chan receive.Message, 3) + e2e1 := newMockE2e(myID1, e2eHandler) + e2e1.RegisterListener( + myID1, catalog.EndFileTransfer, newMockListener(endE2eChan1)) + cmix1 := newMockCmix(myID1, cMixHandler) + ftManager1, err := ft.NewManager(ftParams, myID1, cmix1, kv1, rngGen) + if err != nil { + t.Errorf("Failed to make new file transfer manager: %+v", err) + } + stop1, err := ftManager1.StartProcesses() + if err != nil { + t.Errorf("Failed to start processes for manager 1: %+v", err) + } + m1, err := NewWrapper(receiveCB1, params, ftManager1, myID1, e2e1, cmix1) + if err != nil { + t.Errorf("Failed to create new file transfer manager 1: %+v", err) + } + + // Set up the second client + receiveCbChan2 := make(chan receiveCbValues, 10) + receiveCB2 := func(tid *ftCrypto.TransferID, fileName, fileType string, + sender *id.ID, size uint32, preview []byte) { + receiveCbChan2 <- receiveCbValues{ + tid, fileName, fileType, sender, size, preview} + } + myID2 := id.NewIdFromString("myID2", id.User, t) + kv2 := versioned.NewKV(ekv.MakeMemstore()) + endE2eChan2 := make(chan receive.Message, 3) + e2e2 := newMockE2e(myID2, e2eHandler) + e2e2.RegisterListener( + myID2, catalog.EndFileTransfer, newMockListener(endE2eChan2)) + cmix2 := newMockCmix(myID1, cMixHandler) + ftManager2, err := ft.NewManager(ftParams, myID2, cmix2, kv2, rngGen) + if err != nil { + t.Errorf("Failed to make new file transfer manager: %+v", err) + } + stop2, err := ftManager2.StartProcesses() + if err != nil { + t.Errorf("Failed to start processes for manager 2: %+v", err) + } + m2, err := NewWrapper(receiveCB2, params, ftManager2, myID2, e2e2, cmix2) + if err != nil { + t.Errorf("Failed to create new file transfer manager 2: %+v", err) + } + + // Wait group prevents the test from quiting before the file has completed + // sending and receiving + var wg sync.WaitGroup + + // Define details of file to send + fileName, fileType := "myFile", "txt" + fileData := []byte(loremIpsum) + preview := []byte("Lorem ipsum dolor sit amet") + retry := float32(2.0) + + // Create go func that waits for file transfer to be received to register + // a progress callback that then checks that the file received is correct + // when done + wg.Add(1) + var called bool + timeReceived := make(chan time.Time) + go func() { + select { + case r := <-receiveCbChan2: + receiveProgressCB := func(completed bool, received, total uint16, + rt ft.ReceivedTransfer, fpt ft.FilePartTracker, err error) { + if completed && !called { + timeReceived <- netTime.Now() + receivedFile, err2 := m2.Receive(r.tid) + if err2 != nil { + t.Errorf("Failed to receive file: %+v", err2) + } + + if !bytes.Equal(fileData, receivedFile) { + t.Errorf("Received file does not match sent."+ + "\nsent: %q\nreceived: %q", + fileData, receivedFile) + } + wg.Done() + } + } + err3 := m2.RegisterReceivedProgressCallback( + r.tid, receiveProgressCB, 0) + if err3 != nil { + t.Errorf( + "Failed to Rregister received progress callback: %+v", err3) + } + case <-time.After(2100 * time.Millisecond): + t.Errorf("Timed out waiting to receive new file transfer.") + wg.Done() + } + }() + + // Define sent progress callback + wg.Add(1) + sentProgressCb1 := func(completed bool, arrived, total uint16, + st ft.SentTransfer, fpt ft.FilePartTracker, err error) { + if completed { + wg.Done() + } + } + + // Send file + sendStart := netTime.Now() + tid1, err := m1.Send( + myID2, fileName, fileType, fileData, retry, preview, sentProgressCb1, 0) + if err != nil { + t.Errorf("Failed to send file: %+v", err) + } + + go func() { + select { + case tr := <-timeReceived: + fileSize := len(fileData) + sendTime := tr.Sub(sendStart) + fileSizeKb := float32(fileSize) * .001 + speed := fileSizeKb * float32(time.Second) / (float32(sendTime)) + t.Logf("Completed receiving file %q in %s (%.2f kb @ %.2f kb/s).", + fileName, sendTime, fileSizeKb, speed) + } + }() + + // Wait for file to be sent and received + wg.Wait() + + select { + case <-endE2eChan2: + case <-time.After(15 * time.Millisecond): + t.Errorf("Timed out waiting for end file transfer message.") + } + + err = m1.CloseSend(tid1) + if err != nil { + t.Errorf("Failed to close transfer: %+v", err) + } + + err = stop1.Close() + if err != nil { + t.Errorf("Failed to close processes for manager 1: %+v", err) + } + + err = stop2.Close() + if err != nil { + t.Errorf("Failed to close processes for manager 2: %+v", err) + } +} + +const loremIpsum = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sit amet urna venenatis, rutrum magna maximus, tempor orci. Cras sit amet nulla id dolor blandit commodo. Suspendisse potenti. Praesent gravida porttitor metus vel aliquam. Maecenas rutrum velit at lobortis auctor. Mauris porta blandit tempor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi volutpat posuere maximus. Nunc in augue molestie ante mattis tempor. + +Phasellus placerat elit eu fringilla pharetra. Vestibulum consectetur pulvinar nunc, vestibulum tincidunt felis rhoncus sit amet. Duis non dolor eleifend nibh luctus eleifend. Nunc urna odio, euismod sit amet feugiat ut, dapibus vel elit. Nulla est mauris, posuere eget enim cursus, vehicula viverra est. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque mattis, nisi quis consectetur semper, neque enim rhoncus dolor, ut aliquam leo orci sed dolor. Integer ullamcorper pulvinar turpis, a sollicitudin nunc posuere et. Nullam orci nibh, facilisis ac massa eu, bibendum bibendum sapien. Sed tincidunt nunc mauris, nec ullamcorper enim lacinia nec. Nulla dapibus sapien ut odio bibendum, tempus ornare sapien lacinia. + +Duis ac hendrerit augue. Nullam porttitor feugiat finibus. Nam enim urna, maximus et ligula eu, aliquet convallis turpis. Vestibulum luctus quam in dictum efficitur. Vestibulum ac pulvinar ipsum. Vivamus consectetur augue nec tellus mollis, at iaculis magna efficitur. Nunc dictum convallis sem, at vehicula nulla accumsan non. Nullam blandit orci vel turpis convallis, mollis porttitor felis accumsan. Sed non posuere leo. Proin ultricies varius nulla at ultricies. Phasellus et pharetra justo. Quisque eu orci odio. Pellentesque pharetra tempor tempor. Aliquam ac nulla lorem. Sed dignissim ligula sit amet nibh fermentum facilisis. + +Donec facilisis rhoncus ante. Duis nec nisi et dolor congue semper vel id ligula. Mauris non eleifend libero, et sodales urna. Nullam pharetra gravida velit non mollis. Integer vel ultrices libero, at ultrices magna. Duis semper risus a leo vulputate consectetur. Cras sit amet convallis sapien. Sed blandit, felis et porttitor fringilla, urna tellus commodo metus, at pharetra nibh urna sed sem. Nam ex dui, posuere id mi et, egestas tincidunt est. Nullam elementum pulvinar diam in maximus. Maecenas vel augue vitae nunc consectetur vestibulum in aliquet lacus. Nullam nec lectus dapibus, dictum nisi nec, congue quam. Suspendisse mollis vel diam nec dapibus. Mauris neque justo, scelerisque et suscipit non, imperdiet eget leo. Vestibulum leo turpis, dapibus ac lorem a, mollis pulvinar quam. + +Sed sed mauris a neque dignissim aliquet. Aliquam congue gravida velit in efficitur. Integer elementum feugiat est, ac lacinia libero bibendum sed. Sed vestibulum suscipit dignissim. Nunc scelerisque, turpis quis varius tristique, enim lacus vehicula lacus, id vestibulum velit erat eu odio. Donec tincidunt nunc sit amet sapien varius ornare. Phasellus semper venenatis ligula eget euismod. Mauris sodales massa tempor, cursus velit a, feugiat neque. Sed odio justo, rhoncus eu fermentum non, tristique a quam. In vehicula in tortor nec iaculis. Cras ligula sem, sollicitudin at nulla eget, placerat lacinia massa. Mauris tempus quam sit amet leo efficitur egestas. Proin iaculis, velit in blandit egestas, felis odio sollicitudin ipsum, eget interdum leo odio tempor nisi. Curabitur sed mauris id turpis tempor finibus ut mollis lectus. Curabitur neque libero, aliquam facilisis lobortis eget, posuere in augue. In sodales urna sit amet elit euismod rhoncus.` diff --git a/fileTransfer2/ftMessages.pb.go b/fileTransfer2/ftMessages.pb.go new file mode 100644 index 0000000000000000000000000000000000000000..d4e4737335fd228bcae990ef2914248f9a6e31b3 --- /dev/null +++ b/fileTransfer2/ftMessages.pb.go @@ -0,0 +1,142 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: fileTransfer2/ftMessages.proto + +package fileTransfer2 + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +// NewFileTransfer is transmitted first on the initialization of a file transfer +// to inform the receiver about the incoming file. +type NewFileTransfer struct { + FileName string `protobuf:"bytes,1,opt,name=fileName,proto3" json:"fileName,omitempty"` + FileType string `protobuf:"bytes,2,opt,name=fileType,proto3" json:"fileType,omitempty"` + TransferKey []byte `protobuf:"bytes,3,opt,name=transferKey,proto3" json:"transferKey,omitempty"` + TransferMac []byte `protobuf:"bytes,4,opt,name=transferMac,proto3" json:"transferMac,omitempty"` + NumParts uint32 `protobuf:"varint,5,opt,name=numParts,proto3" json:"numParts,omitempty"` + Size uint32 `protobuf:"varint,6,opt,name=size,proto3" json:"size,omitempty"` + Retry float32 `protobuf:"fixed32,7,opt,name=retry,proto3" json:"retry,omitempty"` + Preview []byte `protobuf:"bytes,8,opt,name=preview,proto3" json:"preview,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NewFileTransfer) Reset() { *m = NewFileTransfer{} } +func (m *NewFileTransfer) String() string { return proto.CompactTextString(m) } +func (*NewFileTransfer) ProtoMessage() {} +func (*NewFileTransfer) Descriptor() ([]byte, []int) { + return fileDescriptor_7ae154b96911f608, []int{0} +} + +func (m *NewFileTransfer) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NewFileTransfer.Unmarshal(m, b) +} +func (m *NewFileTransfer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NewFileTransfer.Marshal(b, m, deterministic) +} +func (m *NewFileTransfer) XXX_Merge(src proto.Message) { + xxx_messageInfo_NewFileTransfer.Merge(m, src) +} +func (m *NewFileTransfer) XXX_Size() int { + return xxx_messageInfo_NewFileTransfer.Size(m) +} +func (m *NewFileTransfer) XXX_DiscardUnknown() { + xxx_messageInfo_NewFileTransfer.DiscardUnknown(m) +} + +var xxx_messageInfo_NewFileTransfer proto.InternalMessageInfo + +func (m *NewFileTransfer) GetFileName() string { + if m != nil { + return m.FileName + } + return "" +} + +func (m *NewFileTransfer) GetFileType() string { + if m != nil { + return m.FileType + } + return "" +} + +func (m *NewFileTransfer) GetTransferKey() []byte { + if m != nil { + return m.TransferKey + } + return nil +} + +func (m *NewFileTransfer) GetTransferMac() []byte { + if m != nil { + return m.TransferMac + } + return nil +} + +func (m *NewFileTransfer) GetNumParts() uint32 { + if m != nil { + return m.NumParts + } + return 0 +} + +func (m *NewFileTransfer) GetSize() uint32 { + if m != nil { + return m.Size + } + return 0 +} + +func (m *NewFileTransfer) GetRetry() float32 { + if m != nil { + return m.Retry + } + return 0 +} + +func (m *NewFileTransfer) GetPreview() []byte { + if m != nil { + return m.Preview + } + return nil +} + +func init() { + proto.RegisterType((*NewFileTransfer)(nil), "parse.NewFileTransfer") +} + +func init() { proto.RegisterFile("fileTransfer2/ftMessages.proto", fileDescriptor_7ae154b96911f608) } + +var fileDescriptor_7ae154b96911f608 = []byte{ + // 215 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x54, 0x90, 0xbf, 0x4a, 0xc6, 0x30, + 0x14, 0xc5, 0xc9, 0xe7, 0xd7, 0x3f, 0x46, 0x4b, 0x21, 0x38, 0x5c, 0x1c, 0x24, 0x38, 0x65, 0x52, + 0xd0, 0x37, 0x70, 0x70, 0x91, 0x16, 0x09, 0x9d, 0xdc, 0x62, 0xb9, 0x95, 0x82, 0x6d, 0xc3, 0x4d, + 0xb4, 0xd4, 0x77, 0xf6, 0x1d, 0xa4, 0xd1, 0xd6, 0x76, 0xcb, 0xef, 0x9c, 0x93, 0x73, 0xe1, 0xf0, + 0xab, 0xa6, 0x7d, 0xc7, 0x8a, 0x4c, 0xef, 0x1a, 0xa4, 0xbb, 0xdb, 0xc6, 0x17, 0xe8, 0x9c, 0x79, + 0x43, 0x77, 0x63, 0x69, 0xf0, 0x83, 0x88, 0xac, 0x21, 0x87, 0xd7, 0xdf, 0x8c, 0xe7, 0x25, 0x8e, + 0x8f, 0x9b, 0xb0, 0xb8, 0xe4, 0xe9, 0xfc, 0xb9, 0x34, 0x1d, 0x02, 0x93, 0x4c, 0x9d, 0xea, 0x95, + 0x17, 0xaf, 0x9a, 0x2c, 0xc2, 0xe1, 0xdf, 0x9b, 0x59, 0x48, 0x7e, 0xe6, 0xff, 0x3a, 0x9e, 0x70, + 0x82, 0x13, 0xc9, 0xd4, 0xb9, 0xde, 0x4a, 0xdb, 0x44, 0x61, 0x6a, 0x38, 0xee, 0x13, 0x85, 0xa9, + 0xe7, 0xfe, 0xfe, 0xa3, 0x7b, 0x36, 0xe4, 0x1d, 0x44, 0x92, 0xa9, 0x4c, 0xaf, 0x2c, 0x04, 0x3f, + 0xba, 0xf6, 0x0b, 0x21, 0x0e, 0x7a, 0x78, 0x8b, 0x0b, 0x1e, 0x11, 0x7a, 0x9a, 0x20, 0x91, 0x4c, + 0x1d, 0xf4, 0x2f, 0x08, 0xe0, 0x89, 0x25, 0xfc, 0x6c, 0x71, 0x84, 0x34, 0xdc, 0x58, 0xf0, 0x21, + 0x7f, 0xc9, 0x76, 0xc3, 0xbc, 0xc6, 0x61, 0x8e, 0xfb, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x99, + 0x46, 0x73, 0x93, 0x30, 0x01, 0x00, 0x00, +} diff --git a/fileTransfer2/ftMessages.proto b/fileTransfer2/ftMessages.proto new file mode 100644 index 0000000000000000000000000000000000000000..83b9f82c703b3c74ce0b07da4a4bb93cbd29e4f2 --- /dev/null +++ b/fileTransfer2/ftMessages.proto @@ -0,0 +1,24 @@ +/////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +/////////////////////////////////////////////////////////////////////////////// + +syntax = "proto3"; + +package parse; +option go_package = "fileTransfer2"; + +// NewFileTransfer is transmitted first on the initialization of a file transfer +// to inform the receiver about the incoming file. +message NewFileTransfer { + string fileName = 1; // Name of the file + string fileType = 2; // String that indicates type of file + bytes transferKey = 3; // 256-bit encryption key + bytes transferMac = 4; // 256-bit MAC of the entire file + uint32 numParts = 5; // Number of file parts + uint32 size = 6; // The size of the file, in bytes + float retry = 7; // Determines how many times to retry sending + bytes preview = 8; // A preview of the file +} \ No newline at end of file diff --git a/fileTransfer2/generateProto.sh b/fileTransfer2/generateProto.sh new file mode 100644 index 0000000000000000000000000000000000000000..7f435f2df24ca2a878459bd0e99bb8b5b8a37e65 --- /dev/null +++ b/fileTransfer2/generateProto.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +#/////////////////////////////////////////////////////////////////////////////// +#/ Copyright © 2020 xx network SEZC // +#/ // +#/ Use of this source code is governed by a license that can be found in the // +#/ LICENSE file // +#/////////////////////////////////////////////////////////////////////////////// + +protoc --go_out=paths=source_relative:. fileTransfer2/ftMessages.proto diff --git a/fileTransfer2/groupChat/processor.go b/fileTransfer2/groupChat/processor.go new file mode 100644 index 0000000000000000000000000000000000000000..bccc2a6d3f1ff684be8b23fda776e65c71a2e41c --- /dev/null +++ b/fileTransfer2/groupChat/processor.go @@ -0,0 +1,52 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package groupChat + +import ( + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/cmix/identity/receptionID" + "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/groupChat" + "gitlab.com/elixxir/primitives/format" +) + +// Error messages. +const ( + // processor.Process + errNewReceivedTransfer = "[FT] Failed to add new received transfer: %+v" +) + +// processor processes the incoming E2E new file transfer messages to start +// receiving a new file transfer. Adheres to the Processor interface. +type processor struct { + *Wrapper +} + +// Process receives new file transfer messages and registers it with the file +// transfer manager. Then the caller is notified of the file transfer via the +// reception callback. It is the responsibility of the caller to register a +// progress callback. +func (p *processor) Process(decryptedMsg groupChat.MessageReceive, + _ format.Message, _ receptionID.EphemeralIdentity, _ rounds.Round) { + // Add new transfer to start receiving parts + tid, info, err := p.ft.HandleIncomingTransfer(decryptedMsg.Payload, nil, 0) + if err != nil { + jww.ERROR.Printf(errNewReceivedTransfer, err) + return + } + + // Call the reception callback + go p.receiveCB(tid, info.FileName, info.FileType, decryptedMsg.SenderID, + info.Size, info.Preview) +} + +// String returns a human-readable identifier for this processor. Adheres to +// the fmt.Stringer interface. +func (p *processor) String() string { + return "GroupFileTransfer" +} diff --git a/fileTransfer2/groupChat/send.go b/fileTransfer2/groupChat/send.go new file mode 100644 index 0000000000000000000000000000000000000000..e85190cba9f2e8352e8a040cc5f29c67787e8007 --- /dev/null +++ b/fileTransfer2/groupChat/send.go @@ -0,0 +1,33 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package groupChat + +import ( + "github.com/pkg/errors" + "gitlab.com/xx_network/primitives/id" +) + +// Error messages. +const ( + // sendNewFileTransferMessage + errNewFtSendGroupChat = "failed to send initial file transfer message via group chat: %+v" +) + +// sendNewFileTransferMessage sends a group chat message to the group ID +// informing them of the incoming file transfer. +func sendNewFileTransferMessage( + groupID *id.ID, transferInfo []byte, gc GroupChat) error { + + // Send the message via group chat + _, _, _, err := gc.Send(groupID, newFileTransferTag, transferInfo) + if err != nil { + return errors.Errorf(errNewFtSendGroupChat, err) + } + + return nil +} diff --git a/fileTransfer2/groupChat/utils_test.go b/fileTransfer2/groupChat/utils_test.go new file mode 100644 index 0000000000000000000000000000000000000000..c5f1799afea975f6848d5bfe0da885f62a81ef25 --- /dev/null +++ b/fileTransfer2/groupChat/utils_test.go @@ -0,0 +1,166 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package groupChat + +import ( + jww "github.com/spf13/jwalterweatherman" + "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/groupChat" + "gitlab.com/elixxir/crypto/group" + "gitlab.com/elixxir/primitives/format" + "gitlab.com/xx_network/primitives/id" + "gitlab.com/xx_network/primitives/id/ephemeral" + "sync" + "time" +) + +//////////////////////////////////////////////////////////////////////////////// +// Mock cMix Client // +//////////////////////////////////////////////////////////////////////////////// + +type mockCmixHandler struct { + sync.Mutex + processorMap map[format.Fingerprint]message.Processor +} + +func newMockCmixHandler() *mockCmixHandler { + return &mockCmixHandler{ + processorMap: make(map[format.Fingerprint]message.Processor), + } +} + +type mockCmix struct { + myID *id.ID + numPrimeBytes int + health bool + handler *mockCmixHandler + healthCBs map[uint64]func(b bool) + healthIndex uint64 + sync.Mutex +} + +func newMockCmix(myID *id.ID, handler *mockCmixHandler) *mockCmix { + return &mockCmix{ + myID: myID, + numPrimeBytes: 97, + // numPrimeBytes: 4096, + health: true, + handler: handler, + healthCBs: make(map[uint64]func(b bool)), + healthIndex: 0, + } +} + +func (m *mockCmix) GetMaxMessageLength() int { + msg := format.NewMessage(m.numPrimeBytes) + return msg.ContentsSize() +} + +func (m *mockCmix) SendMany(messages []cmix.TargetedCmixMessage, + _ cmix.CMIXParams) (id.Round, []ephemeral.Id, error) { + m.handler.Lock() + for _, targetedMsg := range messages { + msg := format.NewMessage(m.numPrimeBytes) + msg.SetContents(targetedMsg.Payload) + msg.SetMac(targetedMsg.Mac) + msg.SetKeyFP(targetedMsg.Fingerprint) + m.handler.processorMap[targetedMsg.Fingerprint].Process(msg, + receptionID.EphemeralIdentity{Source: targetedMsg.Recipient}, + rounds.Round{ID: 42}) + } + m.handler.Unlock() + return 42, []ephemeral.Id{}, nil +} + +func (m *mockCmix) AddFingerprint(_ *id.ID, fp format.Fingerprint, mp message.Processor) error { + m.Lock() + defer m.Unlock() + m.handler.processorMap[fp] = mp + return nil +} + +func (m *mockCmix) DeleteFingerprint(_ *id.ID, fp format.Fingerprint) { + m.handler.Lock() + delete(m.handler.processorMap, fp) + m.handler.Unlock() +} + +func (m *mockCmix) IsHealthy() bool { + return m.health +} + +func (m *mockCmix) WasHealthy() bool { return true } + +func (m *mockCmix) AddHealthCallback(f func(bool)) uint64 { + m.Lock() + defer m.Unlock() + m.healthIndex++ + m.healthCBs[m.healthIndex] = f + go f(true) + return m.healthIndex +} + +func (m *mockCmix) RemoveHealthCallback(healthID uint64) { + m.Lock() + defer m.Unlock() + if _, exists := m.healthCBs[healthID]; !exists { + jww.FATAL.Panicf("No health callback with ID %d exists.", healthID) + } + delete(m.healthCBs, healthID) +} + +func (m *mockCmix) GetRoundResults(_ time.Duration, + roundCallback cmix.RoundEventCallback, _ ...id.Round) error { + go roundCallback(true, false, map[id.Round]cmix.RoundResult{42: {}}) + return nil +} + +//////////////////////////////////////////////////////////////////////////////// +// Mock Group Chat Manager // +//////////////////////////////////////////////////////////////////////////////// +type mockGcHandler struct { + services map[string]groupChat.Processor + sync.Mutex +} + +func newMockGcHandler() *mockGcHandler { + return &mockGcHandler{ + services: make(map[string]groupChat.Processor), + } +} + +type mockGC struct { + handler *mockGcHandler +} + +func newMockGC(handler *mockGcHandler) *mockGC { + return &mockGC{ + handler: handler, + } +} + +func (m *mockGC) Send(groupID *id.ID, tag string, message []byte) ( + id.Round, time.Time, group.MessageID, error) { + m.handler.Lock() + defer m.handler.Unlock() + m.handler.services[tag].Process(groupChat.MessageReceive{ + GroupID: groupID, + Payload: message, + }, format.Message{}, receptionID.EphemeralIdentity{}, rounds.Round{}) + return 0, time.Time{}, group.MessageID{}, nil +} + +func (m *mockGC) AddService(tag string, p groupChat.Processor) error { + m.handler.Lock() + defer m.handler.Unlock() + m.handler.services[tag] = p + return nil +} diff --git a/fileTransfer2/groupChat/wrapper.go b/fileTransfer2/groupChat/wrapper.go new file mode 100644 index 0000000000000000000000000000000000000000..176e247bd900d0eb60b03e936c525e77f9ecc69d --- /dev/null +++ b/fileTransfer2/groupChat/wrapper.go @@ -0,0 +1,136 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package groupChat + +import ( + "github.com/pkg/errors" + ft "gitlab.com/elixxir/client/fileTransfer2" + "gitlab.com/elixxir/client/groupChat" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/elixxir/crypto/group" + "gitlab.com/xx_network/primitives/id" + "time" +) + +// Error messages. +const ( + // Wrapper.StartProcesses + errAddNewService = "failed to add service to receive new group file transfers: %+v" +) + +const ( + // Tag used when sending/receiving new group chat file transfers message + newFileTransferTag = "NewGroupFileTransfer" +) + +// Wrapper handles the sending and receiving of file transfers for group chats. +type Wrapper struct { + // Callback that is called every time a new file transfer is received + receiveCB ft.ReceiveCallback + + // File transfer Manager + ft ft.FileTransfer + + // Group chat Manager + gc GroupChat +} + +// GroupChat interface matches a subset of the groupChat.GroupChat methods used +// by the Wrapper for easier testing. +type GroupChat interface { + Send(groupID *id.ID, tag string, message []byte) ( + id.Round, time.Time, group.MessageID, error) + AddService(tag string, p groupChat.Processor) error +} + +// NewWrapper generates a new file transfer Wrapper for group chat. +func NewWrapper(receiveCB ft.ReceiveCallback, ft ft.FileTransfer, gc GroupChat) ( + *Wrapper, error) { + w := &Wrapper{ + receiveCB: receiveCB, + ft: ft, + gc: gc, + } + + err := w.gc.AddService(newFileTransferTag, &processor{w}) + if err != nil { + return nil, errors.Errorf(errAddNewService, err) + } + + return w, nil +} + +// MaxFileNameLen returns the max number of bytes allowed for a file name. +func (w *Wrapper) MaxFileNameLen() int { + return w.ft.MaxFileNameLen() +} + +// MaxFileTypeLen returns the max number of bytes allowed for a file type. +func (w *Wrapper) MaxFileTypeLen() int { + return w.ft.MaxFileTypeLen() +} + +// MaxFileSize returns the max number of bytes allowed for a file. +func (w *Wrapper) MaxFileSize() int { + return w.ft.MaxFileSize() +} + +// MaxPreviewSize returns the max number of bytes allowed for a file preview. +func (w *Wrapper) MaxPreviewSize() int { + return w.ft.MaxPreviewSize() +} + +// Send initiates the sending of a file to a group and returns a transfer ID +// that uniquely identifies this file transfer. +func (w *Wrapper) Send(groupID *id.ID, fileName, fileType string, + fileData []byte, retry float32, preview []byte, + progressCB ft.SentProgressCallback, period time.Duration) ( + *ftCrypto.TransferID, error) { + sendNew := func(transferInfo []byte) error { + return sendNewFileTransferMessage(groupID, transferInfo, w.gc) + } + + return w.ft.Send(groupID, fileName, fileType, fileData, retry, preview, + progressCB, period, sendNew) +} + +// RegisterSentProgressCallback allows for the registration of a callback to +// track the progress of an individual sent file transfer. +func (w *Wrapper) RegisterSentProgressCallback(tid *ftCrypto.TransferID, + progressCB ft.SentProgressCallback, period time.Duration) error { + return w.ft.RegisterSentProgressCallback(tid, progressCB, period) +} + +// 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 (w *Wrapper) CloseSend(tid *ftCrypto.TransferID) error { + return w.ft.CloseSend(tid) +} + +// RegisterReceivedProgressCallback allows for the registration of a callback to +// track the progress of an individual received file transfer. This must be done +// when a new transfer is received on the ReceiveCallback. +func (w *Wrapper) RegisterReceivedProgressCallback(tid *ftCrypto.TransferID, + progressCB ft.ReceivedProgressCallback, period time.Duration) error { + return w.ft.RegisterReceivedProgressCallback(tid, progressCB, period) +} + +// 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 (w *Wrapper) Receive(tid *ftCrypto.TransferID) ([]byte, error) { + return w.ft.Receive(tid) +} diff --git a/fileTransfer2/groupChat/wrapper_test.go b/fileTransfer2/groupChat/wrapper_test.go new file mode 100644 index 0000000000000000000000000000000000000000..d9de19fbcdaec2968bbc4ef818f97f36152192d9 --- /dev/null +++ b/fileTransfer2/groupChat/wrapper_test.go @@ -0,0 +1,195 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package groupChat + +import ( + "bytes" + ft "gitlab.com/elixxir/client/fileTransfer2" + "gitlab.com/elixxir/client/groupChat" + "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/crypto/fastRNG" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/elixxir/ekv" + "gitlab.com/xx_network/crypto/csprng" + "gitlab.com/xx_network/primitives/id" + "gitlab.com/xx_network/primitives/netTime" + "math" + "sync" + "testing" + "time" +) + +// Tests that GroupChat adheres to the groupChat.GroupChat interface. +var _ GroupChat = (groupChat.GroupChat)(nil) + +// Smoke test of the entire file transfer system. +func Test_FileTransfer_Smoke(t *testing.T) { + // jww.SetStdoutThreshold(jww.LevelDebug) + // Set up cMix and E2E message handlers + cMixHandler := newMockCmixHandler() + gcHandler := newMockGcHandler() + rngGen := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG) + params := ft.DefaultParams() + params.MaxThroughput = math.MaxInt + + type receiveCbValues struct { + tid *ftCrypto.TransferID + fileName string + fileType string + sender *id.ID + size uint32 + preview []byte + } + + // Set up the first client + myID1 := id.NewIdFromString("myID1", id.User, t) + kv1 := versioned.NewKV(ekv.MakeMemstore()) + gc1 := newMockGC(gcHandler) + ftManager1, err := ft.NewManager( + params, myID1, newMockCmix(myID1, cMixHandler), kv1, rngGen) + if err != nil { + t.Errorf("Failed to create file transfer manager 2: %+v", err) + } + stop1, err := ftManager1.StartProcesses() + if err != nil { + t.Errorf("Failed to start file transfer processes for manager 1: %+v", err) + } + m1, err := NewWrapper(nil, ftManager1, gc1) + if err != nil { + t.Errorf("Failed to create new file transfer manager 1: %+v", err) + } + + // Set up the second client + receiveCbChan2 := make(chan receiveCbValues, 10) + receiveCB2 := func(tid *ftCrypto.TransferID, fileName, fileType string, + sender *id.ID, size uint32, preview []byte) { + receiveCbChan2 <- receiveCbValues{ + tid, fileName, fileType, sender, size, preview} + } + myID2 := id.NewIdFromString("myID2", id.User, t) + kv2 := versioned.NewKV(ekv.MakeMemstore()) + gc2 := newMockGC(gcHandler) + ftManager2, err := ft.NewManager( + params, myID2, newMockCmix(myID2, cMixHandler), kv2, rngGen) + if err != nil { + t.Errorf("Failed to create file transfer manager 2: %+v", err) + } + stop2, err := ftManager2.StartProcesses() + if err != nil { + t.Errorf("Failed to start file transfer processes for manager 2: %+v", err) + } + m2, err := NewWrapper(receiveCB2, ftManager2, gc2) + if err != nil { + t.Errorf("Failed to create new file transfer manager 2: %+v", err) + } + + // Wait group prevents the test from quiting before the file has completed + // sending and receiving + var wg sync.WaitGroup + + // Define details of file to send + fileName, fileType := "myFile", "txt" + fileData := []byte(loremIpsum) + preview := []byte("Lorem ipsum dolor sit amet") + retry := float32(2.0) + + // Create go func that waits for file transfer to be received to register + // a progress callback that then checks that the file received is correct + // when done + wg.Add(1) + var called bool + timeReceived := make(chan time.Time) + go func() { + select { + case r := <-receiveCbChan2: + receiveProgressCB := func(completed bool, received, total uint16, + rt ft.ReceivedTransfer, fpt ft.FilePartTracker, err error) { + if completed && !called { + timeReceived <- netTime.Now() + receivedFile, err2 := m2.Receive(r.tid) + if err2 != nil { + t.Errorf("Failed to receive file: %+v", err2) + } + + if !bytes.Equal(fileData, receivedFile) { + t.Errorf("Received file does not match sent."+ + "\nsent: %q\nreceived: %q", + fileData, receivedFile) + } + wg.Done() + } + } + err3 := m2.RegisterReceivedProgressCallback( + r.tid, receiveProgressCB, 0) + if err3 != nil { + t.Errorf( + "Failed to Rregister received progress callback: %+v", err3) + } + case <-time.After(2100 * time.Millisecond): + t.Errorf("Timed out waiting to receive new file transfer.") + wg.Done() + } + }() + + // Define sent progress callback + wg.Add(1) + sentProgressCb1 := func(completed bool, arrived, total uint16, + st ft.SentTransfer, fpt ft.FilePartTracker, err error) { + if completed { + wg.Done() + } + } + + // Send file + sendStart := netTime.Now() + tid1, err := m1.Send( + myID2, fileName, fileType, fileData, retry, preview, sentProgressCb1, 0) + if err != nil { + t.Errorf("Failed to send file: %+v", err) + } + + go func() { + select { + case tr := <-timeReceived: + fileSize := len(fileData) + sendTime := tr.Sub(sendStart) + fileSizeKb := float32(fileSize) * .001 + speed := fileSizeKb * float32(time.Second) / (float32(sendTime)) + t.Logf("Completed receiving file %q in %s (%.2f kb @ %.2f kb/s).", + fileName, sendTime, fileSizeKb, speed) + } + }() + + // Wait for file to be sent and received + wg.Wait() + + err = m1.CloseSend(tid1) + if err != nil { + t.Errorf("Failed to close transfer: %+v", err) + } + + err = stop1.Close() + if err != nil { + t.Errorf("Failed to close processes for manager 1: %+v", err) + } + + err = stop2.Close() + if err != nil { + t.Errorf("Failed to close processes for manager 2: %+v", err) + } +} + +const loremIpsum = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sit amet urna venenatis, rutrum magna maximus, tempor orci. Cras sit amet nulla id dolor blandit commodo. Suspendisse potenti. Praesent gravida porttitor metus vel aliquam. Maecenas rutrum velit at lobortis auctor. Mauris porta blandit tempor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi volutpat posuere maximus. Nunc in augue molestie ante mattis tempor. + +Phasellus placerat elit eu fringilla pharetra. Vestibulum consectetur pulvinar nunc, vestibulum tincidunt felis rhoncus sit amet. Duis non dolor eleifend nibh luctus eleifend. Nunc urna odio, euismod sit amet feugiat ut, dapibus vel elit. Nulla est mauris, posuere eget enim cursus, vehicula viverra est. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque mattis, nisi quis consectetur semper, neque enim rhoncus dolor, ut aliquam leo orci sed dolor. Integer ullamcorper pulvinar turpis, a sollicitudin nunc posuere et. Nullam orci nibh, facilisis ac massa eu, bibendum bibendum sapien. Sed tincidunt nunc mauris, nec ullamcorper enim lacinia nec. Nulla dapibus sapien ut odio bibendum, tempus ornare sapien lacinia. + +Duis ac hendrerit augue. Nullam porttitor feugiat finibus. Nam enim urna, maximus et ligula eu, aliquet convallis turpis. Vestibulum luctus quam in dictum efficitur. Vestibulum ac pulvinar ipsum. Vivamus consectetur augue nec tellus mollis, at iaculis magna efficitur. Nunc dictum convallis sem, at vehicula nulla accumsan non. Nullam blandit orci vel turpis convallis, mollis porttitor felis accumsan. Sed non posuere leo. Proin ultricies varius nulla at ultricies. Phasellus et pharetra justo. Quisque eu orci odio. Pellentesque pharetra tempor tempor. Aliquam ac nulla lorem. Sed dignissim ligula sit amet nibh fermentum facilisis. + +Donec facilisis rhoncus ante. Duis nec nisi et dolor congue semper vel id ligula. Mauris non eleifend libero, et sodales urna. Nullam pharetra gravida velit non mollis. Integer vel ultrices libero, at ultrices magna. Duis semper risus a leo vulputate consectetur. Cras sit amet convallis sapien. Sed blandit, felis et porttitor fringilla, urna tellus commodo metus, at pharetra nibh urna sed sem. Nam ex dui, posuere id mi et, egestas tincidunt est. Nullam elementum pulvinar diam in maximus. Maecenas vel augue vitae nunc consectetur vestibulum in aliquet lacus. Nullam nec lectus dapibus, dictum nisi nec, congue quam. Suspendisse mollis vel diam nec dapibus. Mauris neque justo, scelerisque et suscipit non, imperdiet eget leo. Vestibulum leo turpis, dapibus ac lorem a, mollis pulvinar quam. + +Sed sed mauris a neque dignissim aliquet. Aliquam congue gravida velit in efficitur. Integer elementum feugiat est, ac lacinia libero bibendum sed. Sed vestibulum suscipit dignissim. Nunc scelerisque, turpis quis varius tristique, enim lacus vehicula lacus, id vestibulum velit erat eu odio. Donec tincidunt nunc sit amet sapien varius ornare. Phasellus semper venenatis ligula eget euismod. Mauris sodales massa tempor, cursus velit a, feugiat neque. Sed odio justo, rhoncus eu fermentum non, tristique a quam. In vehicula in tortor nec iaculis. Cras ligula sem, sollicitudin at nulla eget, placerat lacinia massa. Mauris tempus quam sit amet leo efficitur egestas. Proin iaculis, velit in blandit egestas, felis odio sollicitudin ipsum, eget interdum leo odio tempor nisi. Curabitur sed mauris id turpis tempor finibus ut mollis lectus. Curabitur neque libero, aliquam facilisis lobortis eget, posuere in augue. In sodales urna sit amet elit euismod rhoncus.` diff --git a/fileTransfer2/info.go b/fileTransfer2/info.go new file mode 100644 index 0000000000000000000000000000000000000000..35068b5349fbcdd21e6413aba5afd8832b570999 --- /dev/null +++ b/fileTransfer2/info.go @@ -0,0 +1,66 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package fileTransfer2 + +import ( + "github.com/golang/protobuf/proto" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" +) + +// TransferInfo contains all the information for a new transfer. This is the +// information sent in the initial file transfer so the recipient can prepare +// for the incoming file transfer parts. +type TransferInfo struct { + FileName string // Name of the file + FileType string // String that indicates type of file + Key ftCrypto.TransferKey // 256-bit encryption key + Mac []byte // 256-bit MAC of the entire file + NumParts uint16 // Number of file parts + Size uint32 // The size of the file, in bytes + Retry float32 // Determines how many times to retry sending + Preview []byte // A preview of the file +} + +// Marshal serialises the TransferInfo for sending over the network. +func (ti *TransferInfo) Marshal() ([]byte, error) { + // Construct NewFileTransfer message + protoMsg := &NewFileTransfer{ + FileName: ti.FileName, + FileType: ti.FileType, + TransferKey: ti.Key.Bytes(), + TransferMac: ti.Mac, + NumParts: uint32(ti.NumParts), + Size: ti.Size, + Retry: ti.Retry, + Preview: ti.Preview, + } + + return proto.Marshal(protoMsg) +} + +// UnmarshalTransferInfo deserializes the TransferInfo. +func UnmarshalTransferInfo(data []byte) (*TransferInfo, error) { + // Unmarshal the request message + var newFT NewFileTransfer + err := proto.Unmarshal(data, &newFT) + if err != nil { + return nil, err + } + transferKey := ftCrypto.UnmarshalTransferKey(newFT.GetTransferKey()) + + return &TransferInfo{ + FileName: newFT.FileName, + FileType: newFT.FileType, + Key: transferKey, + Mac: newFT.TransferMac, + NumParts: uint16(newFT.NumParts), + Size: newFT.Size, + Retry: newFT.Retry, + Preview: newFT.Preview, + }, nil +} diff --git a/fileTransfer2/info_test.go b/fileTransfer2/info_test.go new file mode 100644 index 0000000000000000000000000000000000000000..5713698639d9e122370e8f86e9533fba6da9ea18 --- /dev/null +++ b/fileTransfer2/info_test.go @@ -0,0 +1,44 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package fileTransfer2 + +import ( + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "reflect" + "testing" +) + +// Tests that a TransferInfo marshalled via TransferInfo.Marshal and +// unmarshalled via UnmarshalTransferInfo matches the original. +func TestTransferInfo_Marshal_UnmarshalTransferInfo(t *testing.T) { + ti := &TransferInfo{ + FileName: "FileName", + FileType: "FileType", + Key: ftCrypto.TransferKey{1, 2, 3}, + Mac: []byte("I am a MAC"), + NumParts: 6, + Size: 250, + Retry: 2.6, + Preview: []byte("I am a preview"), + } + + data, err := ti.Marshal() + if err != nil { + t.Errorf("Failed to marshal TransferInfo: %+v", err) + } + + newTi, err := UnmarshalTransferInfo(data) + if err != nil { + t.Errorf("Failed to unmarshal TransferInfo: %+v", err) + } + + if !reflect.DeepEqual(ti, newTi) { + t.Errorf("Unmarshalled TransferInfo does not match original."+ + "\nexpected: %+v\nreceived: %+v", ti, newTi) + } +} diff --git a/fileTransfer2/interface.go b/fileTransfer2/interface.go new file mode 100644 index 0000000000000000000000000000000000000000..b8e2f8ba08f66692b6bb45ae3f9afafcd5bca88f --- /dev/null +++ b/fileTransfer2/interface.go @@ -0,0 +1,275 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package fileTransfer2 + +import ( + "gitlab.com/elixxir/client/stoppable" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/xx_network/primitives/id" + "strconv" + "time" +) + +// SentProgressCallback is a callback function that tracks the progress of +// sending a file. +type SentProgressCallback func(completed bool, arrived, total uint16, + st SentTransfer, t FilePartTracker, err error) + +// ReceivedProgressCallback is a callback function that tracks the progress of +// receiving a file. +type ReceivedProgressCallback func(completed bool, received, total uint16, + rt ReceivedTransfer, t FilePartTracker, err error) + +// ReceiveCallback is a callback function that notifies the receiver of an +// incoming file transfer. +type ReceiveCallback func(tid *ftCrypto.TransferID, fileName, fileType string, + sender *id.ID, size uint32, preview []byte) + +// SendNew handles the sending of the initial message informing the recipient +// of the incoming file transfer parts. SendNew should block until the send +// completes and return an error only on failed sends. +type SendNew func(transferInfo []byte) error + +// FileTransfer facilities the sending and receiving of large file transfers. +// It allows for progress tracking of both inbound and outbound transfers. +// FileTransfer handles the sending of the file data; however, the caller is +// responsible for communicating to the recipient of the incoming file transfer. +type FileTransfer interface { + + // StartProcesses starts the sending threads that wait for file transfers to + // send. Adheres to the api.Service type. + StartProcesses() (stoppable.Stoppable, error) + + // MaxFileNameLen returns the max number of bytes allowed for a file name. + MaxFileNameLen() int + + // MaxFileTypeLen returns the max number of bytes allowed for a file type. + MaxFileTypeLen() int + + // MaxFileSize returns the max number of bytes allowed for a file. + MaxFileSize() int + + // MaxPreviewSize returns the max number of bytes allowed for a file + // preview. + MaxPreviewSize() int + + /* === Sending ========================================================== */ + /* The processes of sending a file involves four main steps: + 1. Set up a method to send initial file transfer details using SendNew. + 2. Sending the file using Send and register a progress callback. + 3. Receiving transfer progress on the progress callback. + 4. Closing a finished send using CloseSend. + + Once the file is sent, it is broken into individual, equal-length parts + and sent to the recipient. Every time one of these parts arrives, it is + reported on all registered SentProgressCallbacks for that transfer. + + A SentProgressCallback is registered on the initial send. However, if the + client is closed and reopened, the callback must be registered again + using RegisterSentProgressCallback, otherwise the continued progress of + the transfer will not be reported. + + Once the SentProgressCallback returns that the file has completed + sending, the file can be closed using CloseSend. If the callback reports + an error, then the file should also be closed using CloseSend. + */ + + // Send initiates the sending of a file to the recipient and returns a + // transfer ID that uniquely identifies this file transfer. + // + // In-progress transfers are restored when closing and reopening; however, a + // SentProgressCallback must be registered again. + // + // recipient - ID of the receiver of the file transfer. The sender must + // have an E2E relationship with the recipient. + // fileName - Human-readable file name. Max length defined by + // MaxFileNameLen. + // fileType - Shorthand that identifies the type of file. Max length + // defined by MaxFileTypeLen. + // fileData - File contents. Max size defined by MaxFileSize. + // retry - The number of sending retries allowed on send failure (e.g. + // a retry of 2.0 with 6 parts means 12 total possible sends). + // preview - A preview of the file data (e.g. a thumbnail). Max size + // defined by MaxPreviewSize. + // progressCB - A callback that reports the progress of the file transfer. + // The callback is called once on initialization, on every progress + // update (or less if restricted by the period), or on fatal error. + // period - A progress callback will be limited from triggering only once + // per period. + // sendNew - Function that sends the file transfer information to the + // recipient. + Send(recipient *id.ID, fileName, fileType string, fileData []byte, + retry float32, preview []byte, progressCB SentProgressCallback, + period time.Duration, sendNew SendNew) (*ftCrypto.TransferID, error) + + // 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. + // + // The callback will be called immediately when added to report the current + // progress of the transfer. It will then call every time a file part + // arrives, the transfer completes, or a fatal error occurs. It is called at + // most once every period regardless of the number of progress updates. + // + // In the event that the client is closed and resumed, this function must be + // used to re-register any callbacks previously registered with this + // function or Send. + RegisterSentProgressCallback(tid *ftCrypto.TransferID, + progressCB SentProgressCallback, period time.Duration) error + + // 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). + CloseSend(tid *ftCrypto.TransferID) error + + /* === Receiving ======================================================== */ + /* The processes of receiving a file involves four main steps: + 1. Receiving a new file transfer through a channel set up by the + caller. + 2. Registering the file transfer and a progress callback with + HandleIncomingTransfer. + 3. Receiving transfer progress on the progress callback. + 4. Receiving the complete file using Receive once the callback says + the transfer is complete. + + Once the file transfer manager has started, it will call the + ReceiveCallback for every new file transfer that is received. Once that + happens, a ReceivedProgressCallback must be registered using + RegisterReceivedProgressCallback to get progress updates on the transfer. + + When the progress callback reports that the transfer is complete, the + full file can be retrieved using Receive. + */ + + // HandleIncomingTransfer starts tracking the received file parts for the + // given payload that contains the file transfer information and returns a + // transfer ID that uniquely identifies this file transfer along with the + // transfer information + // + // This function should be called once for every new file received on the + // registered SendNew callback. + // + // In-progress transfers are restored when closing and reopening; however, a + // ReceivedProgressCallback must be registered again. + // + // payload - A marshalled payload container the file transfer information. + // progressCB - A callback that reports the progress of the file transfer. + // The callback is called once on initialization, on every progress + // update (or less if restricted by the period), or on fatal error. + // period - A progress callback will be limited from triggering only once + // per period. + HandleIncomingTransfer(transferInfo []byte, + progressCB ReceivedProgressCallback, period time.Duration) ( + *ftCrypto.TransferID, *TransferInfo, error) + + // 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. + // + // The callback will be called immediately when added to report the current + // progress of the transfer. It will then call every time a file part is + // received, the transfer completes, or a fatal error occurs. It is called + // at most once every period regardless of the number of progress updates. + // + // In the event that the client is closed and resumed, this function must be + // used to re-register any callbacks previously registered. + // + // Once the callback reports that the transfer has completed, the recipient + // can get the full file by calling Receive. + RegisterReceivedProgressCallback(tid *ftCrypto.TransferID, + progressCB ReceivedProgressCallback, period time.Duration) error + + // 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. + Receive(tid *ftCrypto.TransferID) ([]byte, error) +} + +// SentTransfer tracks the information and individual parts of a sent file +// transfer. +type SentTransfer interface { + Recipient() *id.ID + Transfer +} + +// ReceivedTransfer tracks the information and individual parts of a received +// file transfer. +type ReceivedTransfer interface { + Transfer +} + +// Transfer is the generic structure for a file transfer. +type Transfer interface { + TransferID() *ftCrypto.TransferID + FileName() string + FileSize() uint32 + NumParts() uint16 +} + +// FilePartTracker tracks the status of each file part in a sent or received +// file transfer. +type FilePartTracker interface { + // GetPartStatus returns the status of the file part with the given part + // number. The possible values for the status are: + // 0 < Part does not exist + // 0 = unsent + // 1 = arrived (sender has sent a part, and it has arrived) + // 2 = received (receiver has received a part) + GetPartStatus(partNum uint16) FpStatus + + // GetNumParts returns the total number of file parts in the transfer. + GetNumParts() uint16 +} + +// FpStatus is the file part status and indicates the status of individual file +// parts in a file transfer. +type FpStatus int + +// Possible values for FpStatus. +const ( + // FpUnsent indicates that the file part has not been sent + FpUnsent FpStatus = iota + + // FpSent indicates that the file part has been sent (sender has sent a + // part, but it has not arrived) + FpSent + + // FpArrived indicates that the file part has arrived (sender has sent a + // part, and it has arrived) + FpArrived + + // FpReceived indicates that the file part has been received (receiver has + // received a part) + FpReceived +) + +// String returns the string representing of the FpStatus. This functions +// satisfies the fmt.Stringer interface. +func (fps FpStatus) String() string { + switch fps { + case FpUnsent: + return "unsent" + case FpSent: + return "sent" + case FpArrived: + return "arrived" + case FpReceived: + return "received" + default: + return "INVALID FpStatus: " + strconv.Itoa(int(fps)) + } +} diff --git a/fileTransfer2/manager.go b/fileTransfer2/manager.go new file mode 100644 index 0000000000000000000000000000000000000000..9e3ab112ba5ffb1f2ed26606decd58851011f68b --- /dev/null +++ b/fileTransfer2/manager.go @@ -0,0 +1,560 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package fileTransfer2 + +import ( + "bytes" + "github.com/pkg/errors" + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/cmix/message" + "gitlab.com/elixxir/client/fileTransfer2/callbackTracker" + "gitlab.com/elixxir/client/fileTransfer2/store" + "gitlab.com/elixxir/client/fileTransfer2/store/fileMessage" + "gitlab.com/elixxir/client/stoppable" + "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/crypto/fastRNG" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/elixxir/primitives/format" + "gitlab.com/xx_network/primitives/id" + "gitlab.com/xx_network/primitives/id/ephemeral" + "time" +) + +const ( + // FileNameMaxLen is the maximum size, in bytes, for a file name. Currently, + // it is set to 48 bytes. + FileNameMaxLen = 48 + + // FileTypeMaxLen is the maximum size, in bytes, for a file type. Currently, + // it is set to 8 bytes. + FileTypeMaxLen = 8 + + // FileMaxSize is the maximum file size that can be transferred. Currently, + // it is set to 250 kB. + FileMaxSize = 250_000 + + // PreviewMaxSize is the maximum size, in bytes, for a file preview. + // Currently, it is set to 4 kB. + PreviewMaxSize = 4_000 + + // minPartsSendPerRound is the minimum number of file parts sent each round. + minPartsSendPerRound = 1 + + // maxPartsSendPerRound is the maximum number of file parts sent each round. + maxPartsSendPerRound = 11 + + // Size of the buffered channel that queues file parts to package + batchQueueBuffLen = 10_000 + + // Size of the buffered channel that queues file packets to send + sendQueueBuffLen = 10_000 +) + +// Stoppable and listener values. +const ( + fileTransferStoppable = "FileTransfer" + workerPoolStoppable = "FilePartSendingWorkerPool" + batchBuilderThreadStoppable = "BatchBuilderThread" +) + +// Error messages. +const ( + errNoSentTransfer = "could not find sent transfer with ID %s" + errNoReceivedTransfer = "could not find received transfer with ID %s" + + // NewManager + errNewOrLoadSent = "failed to load or create new list of sent file transfers: %+v" + errNewOrLoadReceived = "failed to load or create new list of received file transfers: %+v" + + // manager.Send + errFileNameSize = "length of filename (%d) greater than max allowed length (%d)" + errFileTypeSize = "length of file type (%d) greater than max allowed length (%d)" + errFileSize = "size of file (%d bytes) greater than max allowed size (%d bytes)" + errPreviewSize = "size of preview (%d bytes) greater than max allowed size (%d bytes)" + errSendNetworkHealth = "cannot initiate file transfer of %q when network is not healthy." + errNewKey = "could not generate new transfer key: %+v" + errNewID = "could not generate new transfer ID: %+v" + errMarshalInfo = "could not marshal transfer info: %+v" + errSendNewMsg = "failed to send initial file transfer message: %+v" + errAddSentTransfer = "failed to add transfer: %+v" + + // manager.CloseSend + errDeleteIncompleteTransfer = "cannot delete transfer %s that has not completed or failed" + errDeleteSentTransfer = "could not delete sent transfer %s: %+v" + errRemoveSentTransfer = "could not remove transfer %s from list: %+v" + + // manager.HandleIncomingTransfer + errNewRtTransferID = "failed to generate transfer ID for new received file transfer %q: %+v" + errAddNewRt = "failed to add new file transfer %s (%q): %+v" + + // manager.Receive + errIncompleteFile = "cannot get incomplete file: missing %d of %d parts" + errDeleteReceivedTransfer = "could not delete received transfer %s: %+v" + errRemoveReceivedTransfer = "could not remove transfer %s from list: %+v" +) + +// manager handles the sending and receiving of file, their storage, and their +// callbacks. +type manager struct { + // Storage-backed structure for tracking sent file transfers + sent *store.Sent + + // Storage-backed structure for tracking received file transfers + received *store.Received + + // Progress callback tracker + callbacks *callbackTracker.Manager + + // Queue of parts to batch and send + batchQueue chan store.Part + + // Queue of batches of parts to send + sendQueue chan []store.Part + + // File transfer parameters + params Params + + myID *id.ID + cmix Cmix + kv *versioned.KV + rng *fastRNG.StreamGenerator +} + +// Cmix interface matches a subset of the cmix.Client methods used by the +// manager for easier testing. +type Cmix interface { + GetMaxMessageLength() int + SendMany(messages []cmix.TargetedCmixMessage, p cmix.CMIXParams) (id.Round, + []ephemeral.Id, error) + AddFingerprint(identity *id.ID, fingerprint format.Fingerprint, + mp message.Processor) error + DeleteFingerprint(identity *id.ID, fingerprint format.Fingerprint) + IsHealthy() bool + AddHealthCallback(f func(bool)) uint64 + RemoveHealthCallback(uint64) + GetRoundResults(timeout time.Duration, + roundCallback cmix.RoundEventCallback, roundList ...id.Round) error +} + +// NewManager creates a new file transfer manager object. If sent or received +// transfers already existed, they are loaded from storage and queued to resume +// once manager.startProcesses is called. +func NewManager(params Params, + myID *id.ID, cmix Cmix, kv *versioned.KV, + rng *fastRNG.StreamGenerator) (FileTransfer, error) { + + // Create a new list of sent file transfers or load one if it exists + sent, unsentParts, err := store.NewOrLoadSent(kv) + if err != nil { + return nil, errors.Errorf(errNewOrLoadSent, err) + } + + // Create a new list of received file transfers or load one if it exists + received, incompleteTransfers, err := store.NewOrLoadReceived(kv) + if err != nil { + return nil, errors.Errorf(errNewOrLoadReceived, err) + } + + // Construct manager + m := &manager{ + sent: sent, + received: received, + callbacks: callbackTracker.NewManager(), + batchQueue: make(chan store.Part, batchQueueBuffLen), + sendQueue: make(chan []store.Part, sendQueueBuffLen), + params: params, + myID: myID, + cmix: cmix, + kv: kv, + rng: rng, + } + + // Add all unsent file parts to queue + for _, p := range unsentParts { + m.batchQueue <- p + } + + // Add all fingerprints for unreceived parts + for _, rt := range incompleteTransfers { + m.addFingerprints(rt) + } + + return m, nil +} + +// StartProcesses starts the sending threads. Adheres to the api.Service type. +func (m *manager) StartProcesses() (stoppable.Stoppable, error) { + // Construct stoppables + multiStop := stoppable.NewMulti(workerPoolStoppable) + batchBuilderStop := stoppable.NewSingle(batchBuilderThreadStoppable) + + // Start sending threads + go m.startSendingWorkerPool(multiStop) + go m.batchBuilderThread(batchBuilderStop) + + // Create a multi stoppable + multiStoppable := stoppable.NewMulti(fileTransferStoppable) + multiStoppable.Add(multiStop) + multiStoppable.Add(batchBuilderStop) + + return multiStoppable, nil +} + +// MaxFileNameLen returns the max number of bytes allowed for a file name. +func (m *manager) MaxFileNameLen() int { + return FileNameMaxLen +} + +// MaxFileTypeLen returns the max number of bytes allowed for a file type. +func (m *manager) MaxFileTypeLen() int { + return FileTypeMaxLen +} + +// MaxFileSize returns the max number of bytes allowed for a file. +func (m *manager) MaxFileSize() int { + return FileMaxSize +} + +// MaxPreviewSize returns the max number of bytes allowed for a file preview. +func (m *manager) MaxPreviewSize() int { + return PreviewMaxSize +} + +/* === Sending ============================================================== */ + +// Send partitions the given file into cMix message sized chunks and sends them +// via cmix.SendMany. +func (m *manager) Send(recipient *id.ID, fileName, fileType string, + fileData []byte, retry float32, preview []byte, + progressCB SentProgressCallback, period time.Duration, sendNew SendNew) ( + *ftCrypto.TransferID, error) { + + // Return an error if the file name is too long + if len(fileName) > FileNameMaxLen { + return nil, errors.Errorf(errFileNameSize, len(fileName), FileNameMaxLen) + } + + // Return an error if the file type is too long + if len(fileType) > FileTypeMaxLen { + return nil, errors.Errorf(errFileTypeSize, len(fileType), FileTypeMaxLen) + } + + // Return an error if the file is too large + if len(fileData) > FileMaxSize { + return nil, errors.Errorf(errFileSize, len(fileData), FileMaxSize) + } + + // Return an error if the preview is too large + if len(preview) > PreviewMaxSize { + return nil, errors.Errorf(errPreviewSize, len(preview), PreviewMaxSize) + } + + // Return an error if the network is not healthy + if !m.cmix.IsHealthy() { + return nil, errors.Errorf(errSendNetworkHealth, fileName) + } + + // Generate new transfer key and transfer ID + rng := m.rng.GetStream() + key, err := ftCrypto.NewTransferKey(rng) + if err != nil { + rng.Close() + return nil, errors.Errorf(errNewKey, err) + } + tid, err := ftCrypto.NewTransferID(rng) + if err != nil { + rng.Close() + return nil, errors.Errorf(errNewID, err) + } + rng.Close() + + // Generate transfer MAC + mac := ftCrypto.CreateTransferMAC(fileData, key) + + // Get size of each part and partition file into equal length parts + partMessage := fileMessage.NewPartMessage(m.cmix.GetMaxMessageLength()) + parts := partitionFile(fileData, partMessage.GetPartSize()) + numParts := uint16(len(parts)) + fileSize := uint32(len(fileData)) + + // Send the initial file transfer message over E2E + info := &TransferInfo{ + fileName, fileType, key, mac, numParts, fileSize, retry, preview} + transferInfo, err := info.Marshal() + if err != nil { + return nil, errors.Errorf(errMarshalInfo, err) + } + err = sendNew(transferInfo) + if err != nil { + return nil, errors.Errorf(errSendNewMsg, err) + } + + // Calculate the number of fingerprints to generate + numFps := calcNumberOfFingerprints(len(parts), retry) + + // Create new sent transfer + st, err := m.sent.AddTransfer( + recipient, &key, &tid, fileName, fileSize, parts, numFps) + if err != nil { + return nil, errors.Errorf(errAddSentTransfer, err) + } + + // Add all parts to the send queue + for _, p := range st.GetUnsentParts() { + m.batchQueue <- p + } + + // Register the progress callback + m.registerSentProgressCallback(st, progressCB, period) + + return &tid, nil +} + +// RegisterSentProgressCallback adds the given callback to the callback manager +// for the given transfer ID. Returns an error if the transfer cannot be found. +func (m *manager) RegisterSentProgressCallback(tid *ftCrypto.TransferID, + progressCB SentProgressCallback, period time.Duration) error { + st, exists := m.sent.GetTransfer(tid) + if !exists { + return errors.Errorf(errNoSentTransfer, tid) + } + + m.registerSentProgressCallback(st, progressCB, period) + + return nil +} + +// registerSentProgressCallback creates a callback for the sent transfer that +// will get the most recent progress and send it on the progress callback. +func (m *manager) registerSentProgressCallback(st *store.SentTransfer, + progressCB SentProgressCallback, period time.Duration) { + if progressCB == nil { + return + } + + // Build callback + cb := func(err error) { + // Get transfer progress + arrived, total := st.NumArrived(), st.NumParts() + completed := arrived == total + + // Build part tracker from copy of part statuses vector + tracker := &sentFilePartTracker{st.CopyPartStatusVector()} + + // Call the progress callback + progressCB(completed, arrived, total, st, tracker, err) + } + + // Add the callback to the callback tracker + m.callbacks.AddCallback(st.TransferID(), cb, period) +} + +// CloseSend deletes the sent transfer from storage and the sent transfer list. +// Also stops any scheduled progress callbacks and deletes them from the manager +// to prevent any further calls. Deletion only occurs if the transfer has either +// completed or failed. +func (m *manager) CloseSend(tid *ftCrypto.TransferID) error { + st, exists := m.sent.GetTransfer(tid) + if !exists { + return errors.Errorf(errNoSentTransfer, tid) + } + + // Check that the transfer is either completed or failed + if st.Status() != store.Completed && st.Status() != store.Failed { + return errors.Errorf(errDeleteIncompleteTransfer, tid) + } + + // Delete from storage + err := st.Delete() + if err != nil { + return errors.Errorf(errDeleteSentTransfer, tid, err) + } + + // Delete from transfers list + err = m.sent.RemoveTransfer(tid) + if err != nil { + return errors.Errorf(errRemoveSentTransfer, tid, err) + } + + // Stop and delete all progress callbacks + m.callbacks.Delete(tid) + + return nil +} + +/* === Receiving ============================================================ */ + +const errUnmarshalInfo = "failed to unmarshal incoming transfer info: %+v" + +// HandleIncomingTransfer starts tracking the received file parts for the given +// file information and returns a transfer ID that uniquely identifies this file +// transfer. +func (m *manager) HandleIncomingTransfer(transferInfo []byte, + progressCB ReceivedProgressCallback, period time.Duration) ( + *ftCrypto.TransferID, *TransferInfo, error) { + + // Unmarshal the payload + t, err := UnmarshalTransferInfo(transferInfo) + if err != nil { + return nil, nil, errors.Errorf(errUnmarshalInfo, err) + } + + // Generate new transfer ID + rng := m.rng.GetStream() + tid, err := ftCrypto.NewTransferID(rng) + if err != nil { + rng.Close() + return nil, nil, errors.Errorf(errNewRtTransferID, t.FileName, err) + } + rng.Close() + + // Calculate the number of fingerprints based on the retry rate + numFps := calcNumberOfFingerprints(int(t.NumParts), t.Retry) + + // Store the transfer + rt, err := m.received.AddTransfer( + &t.Key, &tid, t.FileName, t.Mac, t.Size, t.NumParts, numFps) + if err != nil { + return nil, nil, errors.Errorf(errAddNewRt, tid, t.FileName, err) + } + + // Start tracking fingerprints for each file part + m.addFingerprints(rt) + + // Register the progress callback + m.registerReceivedProgressCallback(rt, progressCB, period) + + return &tid, t, nil +} + +// Receive concatenates the received file and returns it. Only returns the file +// if all file parts have been received and returns an error otherwise. Also +// deletes the transfer from storage. Once Receive has been called on a file, it +// cannot be received again. +func (m *manager) Receive(tid *ftCrypto.TransferID) ([]byte, error) { + rt, exists := m.received.GetTransfer(tid) + if !exists { + return nil, errors.Errorf(errNoReceivedTransfer, tid) + } + + // Return an error if the transfer is not complete + if rt.NumReceived() != rt.NumParts() { + return nil, errors.Errorf( + errIncompleteFile, rt.NumParts()-rt.NumReceived(), rt.NumParts()) + } + + // Get the file + file := rt.GetFile() + + // Delete all unused fingerprints + for _, c := range rt.GetUnusedCyphers() { + m.cmix.DeleteFingerprint(m.myID, c.GetFingerprint()) + } + + // Delete from storage + err := rt.Delete() + if err != nil { + return nil, errors.Errorf(errDeleteReceivedTransfer, tid, err) + } + + // Delete from transfers list + err = m.received.RemoveTransfer(tid) + if err != nil { + return nil, errors.Errorf(errRemoveReceivedTransfer, tid, err) + } + + // Stop and delete all progress callbacks + m.callbacks.Delete(tid) + + return file, nil +} + +// RegisterReceivedProgressCallback adds the given callback to the callback +// manager for the given transfer ID. Returns an error if the transfer cannot be +// found. +func (m *manager) RegisterReceivedProgressCallback(tid *ftCrypto.TransferID, + progressCB ReceivedProgressCallback, period time.Duration) error { + rt, exists := m.received.GetTransfer(tid) + if !exists { + return errors.Errorf(errNoReceivedTransfer, tid) + } + + m.registerReceivedProgressCallback(rt, progressCB, period) + + return nil +} + +// registerReceivedProgressCallback creates a callback for the received transfer +// that will get the most recent progress and send it on the progress callback. +func (m *manager) registerReceivedProgressCallback(rt *store.ReceivedTransfer, + progressCB ReceivedProgressCallback, period time.Duration) { + if progressCB == nil { + return + } + + // Build callback + cb := func(err error) { + // Get transfer progress + received, total := rt.NumReceived(), rt.NumParts() + completed := received == total + + // Build part tracker from copy of part statuses vector + tracker := &receivedFilePartTracker{rt.CopyPartStatusVector()} + + // Call the progress callback + progressCB(completed, received, total, rt, tracker, err) + } + + // Add the callback to the callback tracker + m.callbacks.AddCallback(rt.TransferID(), cb, period) +} + +/* === Utility ============================================================== */ + +// partitionFile splits the file into parts of the specified part size. +func partitionFile(file []byte, partSize int) [][]byte { + // Initialize part list to the correct size + numParts := (len(file) + partSize - 1) / partSize + parts := make([][]byte, 0, numParts) + buff := bytes.NewBuffer(file) + + for n := buff.Next(partSize); len(n) > 0; n = buff.Next(partSize) { + newPart := make([]byte, partSize) + copy(newPart, n) + parts = append(parts, newPart) + } + + return parts +} + +// calcNumberOfFingerprints is the formula used to calculate the number of +// fingerprints to generate, which is based off the number of file parts and the +// retry float. +func calcNumberOfFingerprints(numParts int, retry float32) uint16 { + return uint16(float32(numParts) * (1 + retry)) +} + +// addFingerprints adds all fingerprints for unreceived parts in the received +// transfer. +func (m *manager) addFingerprints(rt *store.ReceivedTransfer) { + // Build processor for each file part and add its fingerprint to receive on + for _, c := range rt.GetUnusedCyphers() { + p := &processor{ + Cypher: c, + ReceivedTransfer: rt, + manager: m, + } + + err := m.cmix.AddFingerprint(m.myID, c.GetFingerprint(), p) + if err != nil { + jww.ERROR.Printf("[FT] Failed to add fingerprint for transfer "+ + "%s: %+v", rt.TransferID(), err) + } + } +} diff --git a/fileTransfer2/manager_test.go b/fileTransfer2/manager_test.go new file mode 100644 index 0000000000000000000000000000000000000000..73d20143c4f47ebb0856c7cbf92df08dc9dd9e35 --- /dev/null +++ b/fileTransfer2/manager_test.go @@ -0,0 +1,231 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package fileTransfer2 + +import ( + "bytes" + "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/crypto/fastRNG" + "gitlab.com/elixxir/ekv" + "gitlab.com/xx_network/crypto/csprng" + "gitlab.com/xx_network/primitives/id" + "gitlab.com/xx_network/primitives/netTime" + "math" + "math/rand" + "reflect" + "sync" + "testing" + "time" +) + +// Tests that manager adheres to the FileTransfer interface. +var _ FileTransfer = (*manager)(nil) + +// Tests that Cmix adheres to the cmix.Client interface. +var _ Cmix = (cmix.Client)(nil) + +// Tests that partitionFile partitions the given file into the expected parts. +func Test_partitionFile(t *testing.T) { + prng := rand.New(rand.NewSource(42)) + partSize := 96 + fileData, expectedParts := newFile(24, partSize, prng, t) + + receivedParts := partitionFile(fileData, partSize) + + if !reflect.DeepEqual(expectedParts, receivedParts) { + t.Errorf("File parts do not match expected."+ + "\nexpected: %q\nreceived: %q", expectedParts, receivedParts) + } + + fullFile := bytes.Join(receivedParts, nil) + if !bytes.Equal(fileData, fullFile) { + t.Errorf("Full file does not match expected."+ + "\nexpected: %q\nreceived: %q", fileData, fullFile) + } +} + +// Tests that calcNumberOfFingerprints matches some manually calculated results. +func Test_calcNumberOfFingerprints(t *testing.T) { + testValues := []struct { + numParts int + retry float32 + result uint16 + }{ + {12, 0.5, 18}, + {13, 0.6667, 21}, + {1, 0.89, 1}, + {2, 0.75, 3}, + {119, 0.45, 172}, + } + + for i, val := range testValues { + result := calcNumberOfFingerprints(val.numParts, val.retry) + + if val.result != result { + t.Errorf("calcNumberOfFingerprints(%3d, %3.2f) result is "+ + "incorrect (%d).\nexpected: %d\nreceived: %d", + val.numParts, val.retry, i, val.result, result) + } + } +} + +// Smoke test of the entire file transfer system. +func Test_FileTransfer_Smoke(t *testing.T) { + // jww.SetStdoutThreshold(jww.LevelDebug) + // Set up cMix and E2E message handlers + cMixHandler := newMockCmixHandler() + rngGen := fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG) + params := DefaultParams() + params.MaxThroughput = math.MaxInt + + // Set up the first client + myID1 := id.NewIdFromString("myID1", id.User, t) + kv1 := versioned.NewKV(ekv.MakeMemstore()) + ftm1, err := NewManager( + params, myID1, newMockCmix(myID1, cMixHandler), kv1, rngGen) + if err != nil { + t.Errorf("Failed to create new file transfer manager 1: %+v", err) + } + m1 := ftm1.(*manager) + + stop1, err := m1.StartProcesses() + if err != nil { + t.Errorf("Failed to start processes for manager 1: %+v", err) + } + + // Set up the second client + myID2 := id.NewIdFromString("myID2", id.User, t) + kv2 := versioned.NewKV(ekv.MakeMemstore()) + ftm2, err := NewManager( + params, myID2, newMockCmix(myID2, cMixHandler), kv2, rngGen) + if err != nil { + t.Errorf("Failed to create new file transfer manager 2: %+v", err) + } + m2 := ftm2.(*manager) + + stop2, err := m2.StartProcesses() + if err != nil { + t.Errorf("Failed to start processes for manager 2: %+v", err) + } + + sendNewCbChan1 := make(chan []byte) + sendNewCb1 := func(transferInfo []byte) error { + sendNewCbChan1 <- transferInfo + return nil + } + + // Wait group prevents the test from quiting before the file has completed + // sending and receiving + var wg sync.WaitGroup + + // Define details of file to send + fileName, fileType := "myFile", "txt" + fileData := []byte(loremIpsum) + preview := []byte("Lorem ipsum dolor sit amet") + retry := float32(2.0) + + // Create go func that waits for file transfer to be received to register + // a progress callback that then checks that the file received is correct + // when done + wg.Add(1) + var called bool + timeReceived := make(chan time.Time) + go func() { + select { + case r := <-sendNewCbChan1: + tid, _, err := m2.HandleIncomingTransfer(r, nil, 0) + if err != nil { + t.Errorf("Failed to add transfer: %+v", err) + } + receiveProgressCB := func(completed bool, received, total uint16, + rt ReceivedTransfer, fpt FilePartTracker, err error) { + if completed && !called { + timeReceived <- netTime.Now() + receivedFile, err2 := m2.Receive(tid) + if err2 != nil { + t.Errorf("Failed to receive file: %+v", err2) + } + + if !bytes.Equal(fileData, receivedFile) { + t.Errorf("Received file does not match sent."+ + "\nsent: %q\nreceived: %q", + fileData, receivedFile) + } + wg.Done() + } + } + err3 := m2.RegisterReceivedProgressCallback( + tid, receiveProgressCB, 0) + if err3 != nil { + t.Errorf( + "Failed to Rregister received progress callback: %+v", err3) + } + case <-time.After(2100 * time.Millisecond): + t.Errorf("Timed out waiting to receive new file transfer.") + wg.Done() + } + }() + + // Define sent progress callback + wg.Add(1) + sentProgressCb1 := func(completed bool, arrived, total uint16, + st SentTransfer, fpt FilePartTracker, err error) { + if completed { + wg.Done() + } + } + + // Send file. + sendStart := netTime.Now() + tid1, err := m1.Send(myID2, fileName, fileType, fileData, retry, preview, + sentProgressCb1, 0, sendNewCb1) + if err != nil { + t.Errorf("Failed to send file: %+v", err) + } + + go func() { + select { + case tr := <-timeReceived: + fileSize := len(fileData) + sendTime := tr.Sub(sendStart) + fileSizeKb := float32(fileSize) * .001 + speed := fileSizeKb * float32(time.Second) / (float32(sendTime)) + t.Logf("Completed receiving file %q in %s (%.2f kb @ %.2f kb/s).", + fileName, sendTime, fileSizeKb, speed) + } + }() + + // Wait for file to be sent and received + wg.Wait() + + err = m1.CloseSend(tid1) + if err != nil { + t.Errorf("Failed to close transfer: %+v", err) + } + + err = stop1.Close() + if err != nil { + t.Errorf("Failed to close processes for manager 1: %+v", err) + } + + err = stop2.Close() + if err != nil { + t.Errorf("Failed to close processes for manager 2: %+v", err) + } +} + +const loremIpsum = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sit amet urna venenatis, rutrum magna maximus, tempor orci. Cras sit amet nulla id dolor blandit commodo. Suspendisse potenti. Praesent gravida porttitor metus vel aliquam. Maecenas rutrum velit at lobortis auctor. Mauris porta blandit tempor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi volutpat posuere maximus. Nunc in augue molestie ante mattis tempor. + +Phasellus placerat elit eu fringilla pharetra. Vestibulum consectetur pulvinar nunc, vestibulum tincidunt felis rhoncus sit amet. Duis non dolor eleifend nibh luctus eleifend. Nunc urna odio, euismod sit amet feugiat ut, dapibus vel elit. Nulla est mauris, posuere eget enim cursus, vehicula viverra est. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque mattis, nisi quis consectetur semper, neque enim rhoncus dolor, ut aliquam leo orci sed dolor. Integer ullamcorper pulvinar turpis, a sollicitudin nunc posuere et. Nullam orci nibh, facilisis ac massa eu, bibendum bibendum sapien. Sed tincidunt nunc mauris, nec ullamcorper enim lacinia nec. Nulla dapibus sapien ut odio bibendum, tempus ornare sapien lacinia. + +Duis ac hendrerit augue. Nullam porttitor feugiat finibus. Nam enim urna, maximus et ligula eu, aliquet convallis turpis. Vestibulum luctus quam in dictum efficitur. Vestibulum ac pulvinar ipsum. Vivamus consectetur augue nec tellus mollis, at iaculis magna efficitur. Nunc dictum convallis sem, at vehicula nulla accumsan non. Nullam blandit orci vel turpis convallis, mollis porttitor felis accumsan. Sed non posuere leo. Proin ultricies varius nulla at ultricies. Phasellus et pharetra justo. Quisque eu orci odio. Pellentesque pharetra tempor tempor. Aliquam ac nulla lorem. Sed dignissim ligula sit amet nibh fermentum facilisis. + +Donec facilisis rhoncus ante. Duis nec nisi et dolor congue semper vel id ligula. Mauris non eleifend libero, et sodales urna. Nullam pharetra gravida velit non mollis. Integer vel ultrices libero, at ultrices magna. Duis semper risus a leo vulputate consectetur. Cras sit amet convallis sapien. Sed blandit, felis et porttitor fringilla, urna tellus commodo metus, at pharetra nibh urna sed sem. Nam ex dui, posuere id mi et, egestas tincidunt est. Nullam elementum pulvinar diam in maximus. Maecenas vel augue vitae nunc consectetur vestibulum in aliquet lacus. Nullam nec lectus dapibus, dictum nisi nec, congue quam. Suspendisse mollis vel diam nec dapibus. Mauris neque justo, scelerisque et suscipit non, imperdiet eget leo. Vestibulum leo turpis, dapibus ac lorem a, mollis pulvinar quam. + +Sed sed mauris a neque dignissim aliquet. Aliquam congue gravida velit in efficitur. Integer elementum feugiat est, ac lacinia libero bibendum sed. Sed vestibulum suscipit dignissim. Nunc scelerisque, turpis quis varius tristique, enim lacus vehicula lacus, id vestibulum velit erat eu odio. Donec tincidunt nunc sit amet sapien varius ornare. Phasellus semper venenatis ligula eget euismod. Mauris sodales massa tempor, cursus velit a, feugiat neque. Sed odio justo, rhoncus eu fermentum non, tristique a quam. In vehicula in tortor nec iaculis. Cras ligula sem, sollicitudin at nulla eget, placerat lacinia massa. Mauris tempus quam sit amet leo efficitur egestas. Proin iaculis, velit in blandit egestas, felis odio sollicitudin ipsum, eget interdum leo odio tempor nisi. Curabitur sed mauris id turpis tempor finibus ut mollis lectus. Curabitur neque libero, aliquam facilisis lobortis eget, posuere in augue. In sodales urna sit amet elit euismod rhoncus.` diff --git a/fileTransfer2/params.go b/fileTransfer2/params.go new file mode 100644 index 0000000000000000000000000000000000000000..4a70046560b0e2793620f8bf29d5c1c62078b6f1 --- /dev/null +++ b/fileTransfer2/params.go @@ -0,0 +1,92 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package fileTransfer2 + +import ( + "encoding/json" + "gitlab.com/elixxir/client/cmix" + "time" +) + +const ( + defaultMaxThroughput = 150_000 // 150 kB per second + defaultSendTimeout = 500 * time.Millisecond +) + +// Params contains parameters used for file transfer. +type Params struct { + // MaxThroughput is the maximum data transfer speed to send file parts (in + // bytes per second). If set to 0, rate limiting will be disabled. + MaxThroughput int + + // SendTimeout is the duration, in nanoseconds, before sending on a round + // times out. It is recommended that SendTimeout is not changed from its + // default. + SendTimeout time.Duration + + // Cmix are the parameters used when sending a cMix message. + Cmix cmix.CMIXParams +} + +// paramsDisk will be the marshal-able and umarshal-able object. +type paramsDisk struct { + MaxThroughput int + SendTimeout time.Duration + Cmix cmix.CMIXParams +} + +// DefaultParams returns a Params object filled with the default values. +func DefaultParams() Params { + return Params{ + MaxThroughput: defaultMaxThroughput, + SendTimeout: defaultSendTimeout, + Cmix: cmix.GetDefaultCMIXParams(), + } +} + +// GetParameters returns the default network parameters, or override with given +// parameters, if set. +func GetParameters(params string) (Params, error) { + p := DefaultParams() + if len(params) > 0 { + err := json.Unmarshal([]byte(params), &p) + if err != nil { + return Params{}, err + } + } + return p, nil +} + +// MarshalJSON adheres to the json.Marshaler interface. +func (p Params) MarshalJSON() ([]byte, error) { + pDisk := paramsDisk{ + MaxThroughput: p.MaxThroughput, + SendTimeout: p.SendTimeout, + Cmix: p.Cmix, + } + + return json.Marshal(&pDisk) + +} + +// UnmarshalJSON adheres to the json.Unmarshaler interface. +func (p *Params) UnmarshalJSON(data []byte) error { + pDisk := paramsDisk{} + err := json.Unmarshal(data, &pDisk) + if err != nil { + return err + } + + *p = Params{ + MaxThroughput: pDisk.MaxThroughput, + SendTimeout: pDisk.SendTimeout, + Cmix: pDisk.Cmix, + } + + return nil +} diff --git a/fileTransfer2/params_test.go b/fileTransfer2/params_test.go new file mode 100644 index 0000000000000000000000000000000000000000..8bbeb942b4f1c5f1d70e418ebf1c5f796dd84d4a --- /dev/null +++ b/fileTransfer2/params_test.go @@ -0,0 +1,70 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package fileTransfer2 + +import ( + "bytes" + "encoding/json" + "gitlab.com/elixxir/client/cmix" + "reflect" + "testing" +) + +// Tests that no data is lost when marshaling and +// unmarshaling the Params object. +func TestParams_MarshalUnmarshal(t *testing.T) { + // Construct a set of params + p := DefaultParams() + + // Marshal the params + data, err := json.Marshal(&p) + if err != nil { + t.Fatalf("Marshal error: %v", err) + } + + t.Logf("%s", string(data)) + + // Unmarshal the params object + received := Params{} + err = json.Unmarshal(data, &received) + if err != nil { + t.Fatalf("Unmarshal error: %v", err) + } + + // Re-marshal this params object + data2, err := json.Marshal(received) + if err != nil { + t.Fatalf("Marshal error: %v", err) + } + + 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) + if !bytes.Equal(data, data2) { + t.Fatalf("Data was lost in marshal/unmarshal.") + } + +} + +// Tests that DefaultParams returns a Params object with the expected defaults. +func TestDefaultParams(t *testing.T) { + expected := Params{ + MaxThroughput: defaultMaxThroughput, + SendTimeout: defaultSendTimeout, + Cmix: cmix.GetDefaultCMIXParams(), + } + received := DefaultParams() + received.Cmix.Stop = expected.Cmix.Stop + + if !reflect.DeepEqual(expected, received) { + t.Errorf("Received Params does not match expected."+ + "\nexpected: %+v\nreceived: %+v", expected, received) + } +} diff --git a/fileTransfer2/partTracker.go b/fileTransfer2/partTracker.go new file mode 100644 index 0000000000000000000000000000000000000000..56fc926428040e12b0bedcd8589b0dfb5c7cbb25 --- /dev/null +++ b/fileTransfer2/partTracker.go @@ -0,0 +1,68 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package fileTransfer2 + +import ( + "gitlab.com/elixxir/client/storage/utility" +) + +// sentFilePartTracker contains utility.StateVector that tracks which parts have +// arrived. It adheres to the FilePartTracker interface. +type sentFilePartTracker struct { + *utility.StateVector +} + +// GetPartStatus returns the status of the sent file part with the given part +// number. +func (s *sentFilePartTracker) GetPartStatus(partNum uint16) FpStatus { + if uint32(partNum) >= s.GetNumKeys() { + return -1 + } + + switch s.Used(uint32(partNum)) { + case true: + return FpArrived + case false: + return FpUnsent + default: + return -1 + } +} + +// GetNumParts returns the total number of file parts in the transfer. +func (s *sentFilePartTracker) GetNumParts() uint16 { + return uint16(s.GetNumKeys()) +} + +// receivedFilePartTracker contains utility.StateVector that tracks which parts +// have been received. It adheres to the FilePartTracker interface. +type receivedFilePartTracker struct { + *utility.StateVector +} + +// GetPartStatus returns the status of the received file part with the given +// part number. +func (r *receivedFilePartTracker) GetPartStatus(partNum uint16) FpStatus { + if uint32(partNum) >= r.GetNumKeys() { + return -1 + } + + switch r.Used(uint32(partNum)) { + case true: + return FpReceived + case false: + return FpUnsent + default: + return -1 + } +} + +// GetNumParts returns the total number of file parts in the transfer. +func (r *receivedFilePartTracker) GetNumParts() uint16 { + return uint16(r.GetNumKeys()) +} diff --git a/fileTransfer2/processor.go b/fileTransfer2/processor.go new file mode 100644 index 0000000000000000000000000000000000000000..55f2021115ac7a45f4b5b08286dffc7a1ebaeabe --- /dev/null +++ b/fileTransfer2/processor.go @@ -0,0 +1,70 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package fileTransfer2 + +import ( + "fmt" + + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/cmix/identity/receptionID" + "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/fileTransfer2/store" + "gitlab.com/elixxir/client/fileTransfer2/store/cypher" + "gitlab.com/elixxir/client/fileTransfer2/store/fileMessage" + "gitlab.com/elixxir/primitives/format" +) + +// Error messages. +const ( + // processor.Process + errDecryptPart = "[FT] Failed to decrypt file part for transfer %s (%q) on round %d: %+v" + errUnmarshalPart = "[FT] Failed to unmarshal decrypted file part for transfer %s (%q) on round %d: %+v" + errAddPart = "[FT] Failed to add part #%d to transfer transfer %s (%q): %+v" +) + +// processor manages the reception of file transfer messages. Adheres to the +// message.Processor interface. +type processor struct { + cypher.Cypher + *store.ReceivedTransfer + *manager +} + +// Process decrypts and hands off the file part message and adds it to the +// correct file transfer. +func (p *processor) Process(msg format.Message, + _ receptionID.EphemeralIdentity, round rounds.Round) { + + decryptedPart, err := p.Decrypt(msg) + if err != nil { + jww.ERROR.Printf( + errDecryptPart, p.TransferID(), p.FileName(), round.ID, err) + return + } + + partMsg, err := fileMessage.UnmarshalPartMessage(decryptedPart) + if err != nil { + jww.ERROR.Printf( + errUnmarshalPart, p.TransferID(), p.FileName(), round.ID, err) + return + } + + err = p.AddPart(partMsg.GetPart(), int(partMsg.GetPartNum())) + if err != nil { + jww.WARN.Printf( + errAddPart, partMsg.GetPartNum(), p.TransferID(), p.FileName(), err) + return + } + + // Call callback with updates + p.callbacks.Call(p.TransferID(), nil) +} + +func (p *processor) String() string { + return fmt.Sprintf("FileTransfer(%s)", p.myID) +} diff --git a/fileTransfer2/send.go b/fileTransfer2/send.go new file mode 100644 index 0000000000000000000000000000000000000000..5c0d2074a66e56a6f64a63f5db4704ee2c5ea9d0 --- /dev/null +++ b/fileTransfer2/send.go @@ -0,0 +1,187 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package fileTransfer2 + +import ( + "github.com/pkg/errors" + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/cmix/message" + "gitlab.com/elixxir/client/fileTransfer2/sentRoundTracker" + "gitlab.com/elixxir/client/fileTransfer2/store" + "gitlab.com/elixxir/client/stoppable" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/xx_network/primitives/id" + "strconv" + "time" +) + +// Error messages. +const ( + // generateRandomPacketSize + getRandomNumPartsRandPanic = "[FT] Failed to generate random number of file parts to send: %+v" + + // manager.sendCmix + errNoMoreRetries = "file transfer failed: ran our of retries." +) + +const ( + // Duration to wait for round to finish before timing out. + roundResultsTimeout = 15 * time.Second + + // Age when rounds that files were sent from are deleted from the tracker. + clearSentRoundsAge = 10 * time.Second + + // Number of concurrent sending threads + workerPoolThreads = 4 + + // Tag that prints with cMix sending logs. + cMixDebugTag = "FT.Part" + + // Prefix used for the name of a stoppable used for a sending thread + sendThreadStoppableName = "FilePartSendingThread#" +) + +// startSendingWorkerPool initialises a worker pool of file part sending +// threads. +func (m *manager) startSendingWorkerPool(multiStop *stoppable.Multi) { + // Set up cMix sending parameters + m.params.Cmix.SendTimeout = m.params.SendTimeout + m.params.Cmix.ExcludedRounds = + sentRoundTracker.NewManager(clearSentRoundsAge) + + if m.params.Cmix.DebugTag == cmix.DefaultDebugTag || + m.params.Cmix.DebugTag == "" { + m.params.Cmix.DebugTag = cMixDebugTag + } + + for i := 0; i < workerPoolThreads; i++ { + stop := stoppable.NewSingle(sendThreadStoppableName + strconv.Itoa(i)) + multiStop.Add(stop) + go m.sendingThread(stop) + } +} + +// sendingThread sends part packets that become available oin the send queue. +func (m *manager) sendingThread(stop *stoppable.Single) { + healthChan := make(chan bool, 10) + healthChanID := m.cmix.AddHealthCallback(func(b bool) { healthChan <- b }) + for { + select { + case <-stop.Quit(): + jww.DEBUG.Printf("[FT] Stopping file part sending thread: " + + "stoppable triggered.") + m.cmix.RemoveHealthCallback(healthChanID) + stop.ToStopped() + return + case healthy := <-healthChan: + for !healthy { + healthy = <-healthChan + } + case packet := <-m.sendQueue: + m.sendCmix(packet) + } + } +} + +// sendCmix sends the parts in the packet via Client.SendMany. +func (m *manager) sendCmix(packet []store.Part) { + // validParts will contain all parts in the original packet excluding those + // that return an error from GetEncryptedPart + validParts := make([]store.Part, 0, len(packet)) + + // Encrypt each part and to a TargetedCmixMessage + messages := make([]cmix.TargetedCmixMessage, 0, len(packet)) + for _, p := range packet { + encryptedPart, mac, fp, err := + p.GetEncryptedPart(m.cmix.GetMaxMessageLength()) + if err != nil { + jww.ERROR.Printf("[FT] File transfer %s (%q) failed: %+v", + p.TransferID(), p.FileName(), err) + m.callbacks.Call(p.TransferID(), errors.New(errNoMoreRetries)) + continue + } + + validParts = append(validParts, p) + + messages = append(messages, cmix.TargetedCmixMessage{ + Recipient: p.Recipient(), + Payload: encryptedPart, + Fingerprint: fp, + Service: message.Service{}, + Mac: mac, + }) + } + + // Clear all old rounds from the sent rounds list + m.params.Cmix.ExcludedRounds.(*sentRoundTracker.Manager).RemoveOldRounds() + + jww.DEBUG.Printf("[FT] Sending %d file parts via SendManyCMIX", + len(messages)) + + rid, _, err := m.cmix.SendMany(messages, m.params.Cmix) + if err != nil { + jww.WARN.Printf("[FT] Failed to send %d file parts via "+ + "SendManyCMIX: %+v", len(messages), err) + + for _, p := range validParts { + m.batchQueue <- p + } + } + + err = m.cmix.GetRoundResults( + roundResultsTimeout, m.roundResultsCallback(validParts), rid) +} + +// roundResultsCallback generates a network.RoundEventCallback that handles +// all parts in the packet once the round succeeds or fails. +func (m *manager) roundResultsCallback(packet []store.Part) cmix.RoundEventCallback { + // Group file parts by transfer + grouped := map[ftCrypto.TransferID][]store.Part{} + for _, p := range packet { + if _, exists := grouped[*p.TransferID()]; exists { + grouped[*p.TransferID()] = append(grouped[*p.TransferID()], p) + } else { + grouped[*p.TransferID()] = []store.Part{p} + } + } + + return func( + allRoundsSucceeded, _ bool, rounds map[id.Round]cmix.RoundResult) { + // Get round ID + var rid id.Round + for rid = range rounds { + break + } + + if allRoundsSucceeded { + jww.DEBUG.Printf("[FT] %d file parts delivered on round %d (%v)", + len(packet), rid, grouped) + + // If the round succeeded, then mark all parts as arrived and report + // each transfer's progress on its progress callback + for tid, parts := range grouped { + for _, p := range parts { + p.MarkArrived() + } + + // Call the progress callback after all parts have been marked + // so that the progress reported included all parts in the batch + m.callbacks.Call(&tid, nil) + } + } else { + jww.DEBUG.Printf("[FT] %d file parts failed on round %d (%v)", + len(packet), rid, grouped) + + // If the round failed, then add each part into the send queue + for _, p := range packet { + m.batchQueue <- p + } + } + } +} diff --git a/fileTransfer2/sentRoundTracker/sentRoundTracker.go b/fileTransfer2/sentRoundTracker/sentRoundTracker.go new file mode 100644 index 0000000000000000000000000000000000000000..29416fa62753623c88949cc11a667d23f5f2f709 --- /dev/null +++ b/fileTransfer2/sentRoundTracker/sentRoundTracker.go @@ -0,0 +1,92 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package sentRoundTracker + +import ( + "gitlab.com/xx_network/primitives/id" + "gitlab.com/xx_network/primitives/netTime" + "sync" + "time" +) + +// Manager keeps track of rounds that file parts were sent on and when +// those rounds occurred. Rounds past the given age can be deleted manually. +// Adheres to excludedRounds.ExcludedRounds. +type Manager struct { + rounds map[id.Round]time.Time + age time.Duration + mux sync.RWMutex +} + +// NewManager creates a new sent round tracker Manager. +func NewManager(interval time.Duration) *Manager { + return &Manager{ + rounds: make(map[id.Round]time.Time), + age: interval, + } +} + +// RemoveOldRounds removes any rounds that are older than the max round age. +func (srt *Manager) RemoveOldRounds() { + srt.mux.Lock() + defer srt.mux.Unlock() + deleteBefore := netTime.Now().Add(-srt.age) + + for rid, timeStamp := range srt.rounds { + if timeStamp.Before(deleteBefore) { + delete(srt.rounds, rid) + } + } +} + +// Has indicates if the round ID is in the tracker. +func (srt *Manager) Has(rid id.Round) bool { + srt.mux.RLock() + defer srt.mux.RUnlock() + + _, exists := srt.rounds[rid] + return exists +} + +// Insert adds the round to the tracker with the current time. Returns true if +// the round was added. +func (srt *Manager) Insert(rid id.Round) bool { + timeNow := netTime.Now() + srt.mux.Lock() + defer srt.mux.Unlock() + + _, exists := srt.rounds[rid] + if exists { + return false + } + + srt.rounds[rid] = timeNow + return true +} + +// Remove deletes a round ID from the tracker. +func (srt *Manager) Remove(rid id.Round) { + srt.mux.Lock() + defer srt.mux.Unlock() + delete(srt.rounds, rid) +} + +// Len returns the number of round IDs in the tracker. +func (srt *Manager) Len() int { + srt.mux.RLock() + defer srt.mux.RUnlock() + + return len(srt.rounds) +} diff --git a/fileTransfer2/sentRoundTracker/sentRoundTracker_test.go b/fileTransfer2/sentRoundTracker/sentRoundTracker_test.go new file mode 100644 index 0000000000000000000000000000000000000000..f7a2fa4d74a670754e65cfbb3dca510177dc5fe6 --- /dev/null +++ b/fileTransfer2/sentRoundTracker/sentRoundTracker_test.go @@ -0,0 +1,192 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package sentRoundTracker + +import ( + "gitlab.com/xx_network/primitives/id" + "reflect" + "testing" + "time" +) + +// Tests that NewManager returns the expected new Manager. +func Test_NewSentRoundTracker(t *testing.T) { + interval := 10 * time.Millisecond + expected := &Manager{ + rounds: make(map[id.Round]time.Time), + age: interval, + } + + srt := NewManager(interval) + + if !reflect.DeepEqual(expected, srt) { + t.Errorf("New Manager does not match expected."+ + "\nexpected: %+v\nreceived: %+v", expected, srt) + } +} + +// Tests that Manager.RemoveOldRounds removes only old rounds and not +// newer rounds. +func TestManager_RemoveOldRounds(t *testing.T) { + srt := NewManager(50 * time.Millisecond) + + // Add odd round to tracker + for rid := id.Round(0); rid < 100; rid++ { + if rid%2 != 0 { + srt.Insert(rid) + } + } + + time.Sleep(50 * time.Millisecond) + + // Add even round to tracker + for rid := id.Round(0); rid < 100; rid++ { + if rid%2 == 0 { + srt.Insert(rid) + } + } + + // Remove all old rounds (should be all odd rounds) + srt.RemoveOldRounds() + + // Check that only even rounds exist + for rid := id.Round(0); rid < 100; rid++ { + if srt.Has(rid) { + if rid%2 != 0 { + t.Errorf("Round %d exists.", rid) + } + } else if rid%2 == 0 { + t.Errorf("Round %d does not exist.", rid) + } + } +} + +// Tests that Manager.Has returns true for all the even rounds and +// false for all odd rounds. +func TestManager_Has(t *testing.T) { + srt := NewManager(0) + + // Insert even rounds into the tracker + for rid := id.Round(0); rid < 100; rid++ { + if rid%2 == 0 { + srt.Insert(rid) + } + } + + // Check that only even rounds exist + for rid := id.Round(0); rid < 100; rid++ { + if srt.Has(rid) { + if rid%2 != 0 { + t.Errorf("Round %d exists.", rid) + } + } else if rid%2 == 0 { + t.Errorf("Round %d does not exist.", rid) + } + } +} + +// Tests that Manager.Insert adds all the expected rounds to the map and that it +// returns true when the round does not already exist and false otherwise. +func TestManager_Insert(t *testing.T) { + srt := NewManager(0) + + // Insert even rounds into the tracker + for rid := id.Round(0); rid < 100; rid++ { + if rid%2 == 0 { + if !srt.Insert(rid) { + t.Errorf("Did not insert round %d.", rid) + } + } + } + + // Check that only even rounds were added + for rid := id.Round(0); rid < 100; rid++ { + _, exists := srt.rounds[rid] + if exists { + if rid%2 != 0 { + t.Errorf("Round %d exists.", rid) + } + } else if rid%2 == 0 { + t.Errorf("Round %d does not exist.", rid) + } + } + + // Check that adding a round that already exists returns false + if srt.Insert(0) { + t.Errorf("Inserted round %d.", 0) + } +} + +// Tests that Manager.Remove removes all even rounds. +func TestManager_Remove(t *testing.T) { + srt := NewManager(0) + + // Add all round to tracker + for rid := id.Round(0); rid < 100; rid++ { + srt.Insert(rid) + } + + // Remove even rounds from the tracker + for rid := id.Round(0); rid < 100; rid++ { + if rid%2 == 0 { + srt.Remove(rid) + } + } + + // Check that only even rounds were removed + for rid := id.Round(0); rid < 100; rid++ { + _, exists := srt.rounds[rid] + if exists { + if rid%2 == 0 { + t.Errorf("Round %d does not exist.", rid) + } + } else if rid%2 != 0 { + t.Errorf("Round %d exists.", rid) + } + } +} + +// Tests that Manager.Len returns the expected length when the tracker +// is empty, filled, and then modified. +func TestManager_Len(t *testing.T) { + srt := NewManager(0) + + if srt.Len() != 0 { + t.Errorf("Length of tracker incorrect.\nexpected: %d\nreceived: %d", + 0, srt.Len()) + } + + // Add all round to tracker + for rid := id.Round(0); rid < 100; rid++ { + srt.Insert(rid) + } + + if srt.Len() != 100 { + t.Errorf("Length of tracker incorrect.\nexpected: %d\nreceived: %d", + 100, srt.Len()) + } + + // Remove even rounds from the tracker + for rid := id.Round(0); rid < 100; rid++ { + if rid%2 == 0 { + srt.Remove(rid) + } + } + + if srt.Len() != 50 { + t.Errorf("Length of tracker incorrect.\nexpected: %d\nreceived: %d", + 50, srt.Len()) + } +} diff --git a/fileTransfer2/store/cypher/cypher.go b/fileTransfer2/store/cypher/cypher.go new file mode 100644 index 0000000000000000000000000000000000000000..0c05751cac11717518a4751868fba321822946b5 --- /dev/null +++ b/fileTransfer2/store/cypher/cypher.go @@ -0,0 +1,59 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package cypher + +import ( + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/elixxir/primitives/format" +) + +// Cypher contains the cryptographic and identifying information needed to +// decrypt a file part and associate it with the correct file. +type Cypher struct { + *Manager + fpNum uint16 +} + +// Encrypt encrypts the file part contents and returns them along with a MAC and +// fingerprint. +func (c Cypher) Encrypt(contents []byte) ( + cipherText, mac []byte, fp format.Fingerprint) { + + // Generate fingerprint + fp = ftCrypto.GenerateFingerprint(*c.key, c.fpNum) + + // Encrypt part and get MAC + cipherText, mac = ftCrypto.EncryptPart(*c.key, contents, c.fpNum, fp) + + return cipherText, mac, fp +} + +// Decrypt decrypts the content of the message. +func (c Cypher) Decrypt(msg format.Message) ([]byte, error) { + filePart, err := ftCrypto.DecryptPart( + *c.key, msg.GetContents(), msg.GetMac(), c.fpNum, msg.GetKeyFP()) + if err != nil { + return nil, err + } + + c.fpVector.Use(uint32(c.fpNum)) + + return filePart, nil +} + +// GetFingerprint generates and returns the fingerprints. +func (c Cypher) GetFingerprint() format.Fingerprint { + return ftCrypto.GenerateFingerprint(*c.key, c.fpNum) +} diff --git a/fileTransfer2/store/cypher/cypher_test.go b/fileTransfer2/store/cypher/cypher_test.go new file mode 100644 index 0000000000000000000000000000000000000000..7fea485da2f35952ccdfea586aaa3aa7e5ab6d82 --- /dev/null +++ b/fileTransfer2/store/cypher/cypher_test.go @@ -0,0 +1,104 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package cypher + +import ( + "bytes" + "gitlab.com/elixxir/primitives/format" + "testing" +) + +// Tests that contents that are encrypted with Cypher.Encrypt match the +// decrypted contents of Cypher.Decrypt. +func TestCypher_Encrypt_Decrypt(t *testing.T) { + m, _ := newTestManager(16, t) + numPrimeBytes := 512 + + // Create contents of the right size + contents := make([]byte, format.NewMessage(numPrimeBytes).ContentsSize()) + copy(contents, "This is some message contents.") + + c, err := m.PopCypher() + if err != nil { + t.Errorf("Failed to pop cypher: %+v", err) + } + + // Encrypt contents + cipherText, mac, fp := c.Encrypt(contents) + + // Create message to decrypt + msg := format.NewMessage(numPrimeBytes) + msg.SetContents(cipherText) + msg.SetMac(mac) + msg.SetKeyFP(fp) + + // Decrypt message + decryptedContents, err := c.Decrypt(msg) + if err != nil { + t.Errorf("Decrypt returned an error: %+v", err) + } + + // Tests that the decrypted contents match the original + if !bytes.Equal(contents, decryptedContents) { + t.Errorf("Decrypted contents do not match original."+ + "\nexpected: %q\nreceived: %q", contents, decryptedContents) + } +} + +// Tests that Cypher.Decrypt returns an error when the contents are the wrong +// size. +func TestCypher_Decrypt_MacError(t *testing.T) { + m, _ := newTestManager(16, t) + + // Create contents of the wrong size + contents := []byte("This is some message contents.") + + c, err := m.PopCypher() + if err != nil { + t.Errorf("Failed to pop cypher: %+v", err) + } + + // Encrypt contents + cipherText, mac, fp := c.Encrypt(contents) + + // Create message to decrypt + msg := format.NewMessage(512) + msg.SetContents(cipherText) + msg.SetMac(mac) + msg.SetKeyFP(fp) + + // Decrypt message + _, err = c.Decrypt(msg) + if err == nil { + t.Error("Failed to receive an error when the contents are the wrong " + + "length.") + } +} + +// Tests that Cypher.GetFingerprint returns unique fingerprints. +func TestCypher_GetFingerprint(t *testing.T) { + m, _ := newTestManager(16, t) + fpMap := make(map[format.Fingerprint]bool, m.fpVector.GetNumKeys()) + + for c, err := m.PopCypher(); err == nil; c, err = m.PopCypher() { + fp := c.GetFingerprint() + + if fpMap[fp] { + t.Errorf("Fingerprint %s already exists.", fp) + } else { + fpMap[fp] = true + } + } +} diff --git a/fileTransfer2/store/cypher/manager.go b/fileTransfer2/store/cypher/manager.go new file mode 100644 index 0000000000000000000000000000000000000000..f66100d4c27a608133f81424a32351fc1ba8bb58 --- /dev/null +++ b/fileTransfer2/store/cypher/manager.go @@ -0,0 +1,186 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package cypher + +import ( + "github.com/pkg/errors" + "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/storage/versioned" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/xx_network/primitives/netTime" +) + +// Storage keys and versions. +const ( + cypherManagerPrefix = "CypherManagerStore" + cypherManagerFpVectorKey = "CypherManagerFingerprintVector" + cypherManagerKeyStoreKey = "CypherManagerKey" + cypherManagerKeyStoreVersion = 0 +) + +// Error messages. +const ( + // NewManager + errNewFpVector = "failed to create new state vector for fingerprints: %+v" + errSaveKey = "failed to save transfer key: %+v" + + // LoadManager + errLoadKey = "failed to load transfer key: %+v" + errLoadFpVector = "failed to load state vector: %+v" + + // Manager.PopCypher + errGetNextFp = "used all %d fingerprints" + + // Manager.Delete + errDeleteKey = "failed to delete transfer key: %+v" + errDeleteFpVector = "failed to delete fingerprint state vector: %+v" +) + +// Manager the creation +type Manager struct { + // The transfer key is a randomly generated key created by the sender and + // used to generate MACs and fingerprints + key *ftCrypto.TransferKey + + // Stores the state of a fingerprint (used/unused) in a bitstream format + // (has its own storage backend) + fpVector *utility.StateVector + + kv *versioned.KV +} + +// NewManager returns a new cypher Manager initialised with the given number of +// fingerprints. +func NewManager(key *ftCrypto.TransferKey, numFps uint16, kv *versioned.KV) ( + *Manager, error) { + + kv = kv.Prefix(cypherManagerPrefix) + + fpVector, err := utility.NewStateVector( + kv, cypherManagerFpVectorKey, uint32(numFps)) + if err != nil { + return nil, errors.Errorf(errNewFpVector, err) + } + + err = saveKey(key, kv) + if err != nil { + return nil, errors.Errorf(errSaveKey, err) + } + + tfp := &Manager{ + key: key, + fpVector: fpVector, + kv: kv, + } + + return tfp, nil +} + +// PopCypher returns a new Cypher with next available fingerprint number. This +// marks the fingerprint as used. Returns false if no more fingerprints are +// available. +func (m *Manager) PopCypher() (Cypher, error) { + fpNum, err := m.fpVector.Next() + if err != nil { + return Cypher{}, errors.Errorf(errGetNextFp, m.fpVector.GetNumKeys()) + } + + c := Cypher{ + Manager: m, + fpNum: uint16(fpNum), + } + + return c, nil +} + +// GetUnusedCyphers returns a list of cyphers with unused fingerprints numbers. +func (m *Manager) GetUnusedCyphers() []Cypher { + fpNums := m.fpVector.GetUnusedKeyNums() + cypherList := make([]Cypher, len(fpNums)) + + for i, fpNum := range fpNums { + cypherList[i] = Cypher{ + Manager: m, + fpNum: uint16(fpNum), + } + } + + return cypherList +} + +//////////////////////////////////////////////////////////////////////////////// +// Storage Functions // +//////////////////////////////////////////////////////////////////////////////// + +// LoadManager loads the Manager from storage. +func LoadManager(kv *versioned.KV) (*Manager, error) { + kv = kv.Prefix(cypherManagerPrefix) + key, err := loadKey(kv) + if err != nil { + return nil, errors.Errorf(errLoadKey, err) + } + + fpVector, err := utility.LoadStateVector(kv, cypherManagerFpVectorKey) + if err != nil { + return nil, errors.Errorf(errLoadFpVector, err) + } + + tfp := &Manager{ + key: key, + fpVector: fpVector, + kv: kv, + } + + return tfp, nil +} + +// Delete removes all saved entries from storage. +func (m *Manager) Delete() error { + // Delete transfer key + err := m.kv.Delete(cypherManagerKeyStoreKey, cypherManagerKeyStoreVersion) + if err != nil { + return errors.Errorf(errDeleteKey, err) + } + + // Delete StateVector + err = m.fpVector.Delete() + if err != nil { + return errors.Errorf(errDeleteFpVector, err) + } + + return nil +} + +// saveKey saves the transfer key to storage. +func saveKey(key *ftCrypto.TransferKey, kv *versioned.KV) error { + obj := &versioned.Object{ + Version: cypherManagerKeyStoreVersion, + Timestamp: netTime.Now(), + Data: key.Bytes(), + } + + return kv.Set(cypherManagerKeyStoreKey, cypherManagerKeyStoreVersion, obj) +} + +// loadKey loads the transfer key from storage. +func loadKey(kv *versioned.KV) (*ftCrypto.TransferKey, error) { + obj, err := kv.Get(cypherManagerKeyStoreKey, cypherManagerKeyStoreVersion) + if err != nil { + return nil, err + } + + key := ftCrypto.UnmarshalTransferKey(obj.Data) + return &key, nil +} diff --git a/fileTransfer2/store/cypher/manager_test.go b/fileTransfer2/store/cypher/manager_test.go new file mode 100644 index 0000000000000000000000000000000000000000..d354adcd6aed068e8c182102d7a7161060415ec9 --- /dev/null +++ b/fileTransfer2/store/cypher/manager_test.go @@ -0,0 +1,177 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package cypher + +import ( + "fmt" + "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/storage/versioned" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/elixxir/ekv" + "gitlab.com/xx_network/crypto/csprng" + "reflect" + "testing" +) + +// Tests that NewManager returns a new Manager that matches the expected +// manager. +func TestNewManager(t *testing.T) { + kv := versioned.NewKV(ekv.MakeMemstore()) + numFps := uint16(64) + fpv, _ := utility.NewStateVector(kv.Prefix(cypherManagerPrefix), + cypherManagerFpVectorKey, uint32(numFps)) + expected := &Manager{ + key: &ftCrypto.TransferKey{1, 2, 3}, + fpVector: fpv, + kv: kv.Prefix(cypherManagerPrefix), + } + + manager, err := NewManager(expected.key, numFps, kv) + if err != nil { + t.Errorf("NewManager returned an error: %+v", err) + } + + if !reflect.DeepEqual(expected, manager) { + t.Errorf("New manager does not match expected."+ + "\nexpected: %+v\nreceived: %+v", expected, manager) + } +} + +// Tests that Manager.PopCypher returns cyphers with correct fingerprint numbers +// and that trying to pop after the last pop results in an error. +func TestManager_PopCypher(t *testing.T) { + m, _ := newTestManager(64, t) + + for i := uint16(0); i < uint16(m.fpVector.GetNumKeys()); i++ { + c, err := m.PopCypher() + if err != nil { + t.Errorf("Failed to pop cypher #%d: %+v", i, err) + } + + if c.fpNum != i { + t.Errorf("Fingerprint number does not match expected."+ + "\nexpected: %d\nreceived: %d", i, c.fpNum) + } + + if c.Manager != m { + t.Errorf("Cypher has wrong manager.\nexpected: %v\nreceived: %v", + m, c.Manager) + } + } + + // Test that an error is returned when popping a cypher after all + // fingerprints have been used + expectedErr := fmt.Sprintf(errGetNextFp, m.fpVector.GetNumKeys()) + _, err := m.PopCypher() + if err == nil || (err.Error() != expectedErr) { + t.Errorf("PopCypher did not return the expected error when all "+ + "fingerprints should be used.\nexpected: %s\nreceived: %+v", + expectedErr, err) + } +} + +// Tests Manager.GetUnusedCyphers +func TestManager_GetUnusedCyphers(t *testing.T) { + m, _ := newTestManager(64, t) + + // Use every other key + for i := uint32(0); i < m.fpVector.GetNumKeys(); i += 2 { + m.fpVector.Use(i) + } + + // Check that every other key is in the list + for i, c := range m.GetUnusedCyphers() { + if c.fpNum != uint16(2*i)+1 { + t.Errorf("Fingerprint number #%d incorrect."+ + "\nexpected: %d\nreceived: %d", i, 2*i+1, c.fpNum) + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Storage Functions // +//////////////////////////////////////////////////////////////////////////////// + +// Tests that a Manager loaded via LoadManager matches the original. +func TestLoadManager(t *testing.T) { + m, kv := newTestManager(64, t) + + // Use every other key + for i := uint32(0); i < m.fpVector.GetNumKeys(); i += 2 { + m.fpVector.Use(i) + } + + newManager, err := LoadManager(kv) + if err != nil { + t.Errorf("Failed to load manager: %+v", err) + } + + if !reflect.DeepEqual(m, newManager) { + t.Errorf("Loaded manager does not match original."+ + "\nexpected: %+v\nreceived: %+v", m, newManager) + } +} + +// Tests that Manager.Delete deletes the storage by trying to load the manager. +func TestManager_Delete(t *testing.T) { + m, _ := newTestManager(64, t) + + err := m.Delete() + if err != nil { + t.Errorf("Failed to delete manager: %+v", err) + } + + _, err = LoadManager(m.kv) + if err == nil { + t.Error("Failed to receive error when loading manager that was deleted.") + } +} + +// Tests that a transfer key saved via saveKey can be loaded via loadKey. +func Test_saveKey_loadKey(t *testing.T) { + kv := versioned.NewKV(ekv.MakeMemstore()) + key := &ftCrypto.TransferKey{42} + + err := saveKey(key, kv) + if err != nil { + t.Errorf("Error when saving key: %+v", err) + } + + loadedKey, err := loadKey(kv) + if err != nil { + t.Errorf("Error when loading key: %+v", err) + } + + if *key != *loadedKey { + t.Errorf("Loaded key does not match original."+ + "\nexpected: %s\nreceived: %s", key, loadedKey) + } +} + +// newTestManager creates a new Manager for testing. +func newTestManager(numFps uint16, t *testing.T) (*Manager, *versioned.KV) { + key, err := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) + if err != nil { + t.Errorf("Failed to generate transfer key: %+v", err) + } + + kv := versioned.NewKV(ekv.MakeMemstore()) + m, err := NewManager(&key, numFps, kv) + if err != nil { + t.Errorf("Failed to make new Manager: %+v", err) + } + + return m, kv +} diff --git a/fileTransfer2/store/fileMessage/fileMessage.go b/fileTransfer2/store/fileMessage/fileMessage.go new file mode 100644 index 0000000000000000000000000000000000000000..58f3b1273de9812be5960c95eac06f649d23b0e8 --- /dev/null +++ b/fileTransfer2/store/fileMessage/fileMessage.go @@ -0,0 +1,124 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package fileMessage + +import ( + "encoding/binary" + "github.com/pkg/errors" + jww "github.com/spf13/jwalterweatherman" +) + +// Size constants. +const ( + partNumLen = 2 // The length of the part number in bytes + fmMinSize = partNumLen // Minimum size for the PartMessage +) + +// Error messages. +const ( + errNewFmSize = "[FT] Could not create file part message: size of payload (%d) must be greater than %d" + unmarshalFmSizeErr = "size of passed in bytes (%d) must be greater than %d" + errSetFileFm = "[FT] Could not set file part message payload: length of part bytes (%d) must be smaller than maximum payload size %d" +) + +/* ++-------------------------------+ +| CMIX Message Contents | ++-------------+-----------------+ +| Part Number | File Data | +| 2 bytes | remaining space | ++-------------+-----------------+ +*/ + +// PartMessage contains part of the data being transferred and 256-bit nonce +// that is used as a nonce. +type PartMessage struct { + data []byte // Serial of all contents + partNum []byte // The part number of the file + part []byte // File part data +} + +// NewPartMessage generates a new part message that fits into the specified +// external payload size. An error is returned if the external payload size is +// too small to fit the part message. +func NewPartMessage(externalPayloadSize int) PartMessage { + if externalPayloadSize < fmMinSize { + jww.FATAL.Panicf(errNewFmSize, externalPayloadSize, fmMinSize) + } + + return mapPartMessage(make([]byte, externalPayloadSize)) +} + +// mapPartMessage maps the data to the components of a PartMessage. It is mapped +// by reference; a copy is not made. +func mapPartMessage(data []byte) PartMessage { + return PartMessage{ + data: data, + partNum: data[:partNumLen], + part: data[partNumLen:], + } +} + +// UnmarshalPartMessage converts the bytes into a PartMessage. An error is +// returned if the size of the data is too small for a PartMessage. +func UnmarshalPartMessage(b []byte) (PartMessage, error) { + if len(b) < fmMinSize { + return PartMessage{}, + errors.Errorf(unmarshalFmSizeErr, len(b), fmMinSize) + } + + return mapPartMessage(b), nil +} + +// Marshal returns the byte representation of the PartMessage. +func (m PartMessage) Marshal() []byte { + b := make([]byte, len(m.data)) + copy(b, m.data) + return b +} + +// GetPartNum returns the file part number. +func (m PartMessage) GetPartNum() uint16 { + return binary.LittleEndian.Uint16(m.partNum) +} + +// SetPartNum sets the file part number. +func (m PartMessage) SetPartNum(num uint16) { + b := make([]byte, partNumLen) + binary.LittleEndian.PutUint16(b, num) + copy(m.partNum, b) +} + +// GetPart returns the file part data from the message. +func (m PartMessage) GetPart() []byte { + b := make([]byte, len(m.part)) + copy(b, m.part) + return b +} + +// SetPart sets the PartMessage part to the given bytes. An error is returned if +// the size of the provided part data is too large to store. +func (m PartMessage) SetPart(b []byte) { + if len(b) > len(m.part) { + jww.FATAL.Panicf(errSetFileFm, len(b), len(m.part)) + } + + copy(m.part, b) +} + +// GetPartSize returns the number of bytes available to store part data. +func (m PartMessage) GetPartSize() int { + return len(m.part) +} diff --git a/fileTransfer2/store/fileMessage/fileMessage_test.go b/fileTransfer2/store/fileMessage/fileMessage_test.go new file mode 100644 index 0000000000000000000000000000000000000000..f7e169456e1d9dee3121e7a653b9b109417036a9 --- /dev/null +++ b/fileTransfer2/store/fileMessage/fileMessage_test.go @@ -0,0 +1,236 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package fileMessage + +import ( + "bytes" + "encoding/binary" + "fmt" + "math/rand" + "testing" +) + +// Tests that NewPartMessage returns a PartMessage of the expected size. +func Test_newPartMessage(t *testing.T) { + externalPayloadSize := 256 + + fm := NewPartMessage(externalPayloadSize) + + if len(fm.data) != externalPayloadSize { + t.Errorf("Size of PartMessage data does not match payload size."+ + "\nexpected: %d\nreceived: %d", externalPayloadSize, len(fm.data)) + } +} + +// Error path: tests that NewPartMessage returns the expected error when the +// external payload size is too small. +func Test_newPartMessage_SmallPayloadSizeError(t *testing.T) { + externalPayloadSize := fmMinSize - 1 + expectedErr := fmt.Sprintf(errNewFmSize, externalPayloadSize, fmMinSize) + + defer func() { + if r := recover(); r == nil || r != expectedErr { + t.Errorf("NewPartMessage did not return the expected error when "+ + "the given external payload size is too small."+ + "\nexpected: %s\nreceived: %+v", expectedErr, r) + } + }() + + NewPartMessage(externalPayloadSize) +} + +// Tests that mapPartMessage maps the data to the correct parts of the +// PartMessage. +func Test_mapPartMessage(t *testing.T) { + // Generate expected values + _, expectedData, expectedPartNum, expectedFile := + newRandomFileMessage() + + fm := mapPartMessage(expectedData) + + if !bytes.Equal(expectedData, fm.data) { + t.Errorf("Incorrect data.\nexpected: %q\nreceived: %q", + expectedData, fm.data) + } + + if !bytes.Equal(expectedPartNum, fm.partNum) { + t.Errorf("Incorrect part number.\nexpected: %q\nreceived: %q", + expectedPartNum, fm.partNum) + } + + if !bytes.Equal(expectedFile, fm.part) { + t.Errorf("Incorrect part data.\nexpected: %q\nreceived: %q", + expectedFile, fm.part) + } + +} + +// Tests that UnmarshalPartMessage returns a PartMessage with the expected +// values. +func Test_unmarshalPartMessage(t *testing.T) { + // Generate expected values + _, expectedData, expectedPartNumb, expectedFile := + newRandomFileMessage() + + fm, err := UnmarshalPartMessage(expectedData) + if err != nil { + t.Errorf("UnmarshalPartMessage return an error: %+v", err) + } + + if !bytes.Equal(expectedData, fm.data) { + t.Errorf("Incorrect data.\nexpected: %q\nreceived: %q", + expectedData, fm.data) + } + + if !bytes.Equal(expectedPartNumb, fm.partNum) { + t.Errorf("Incorrect part number.\nexpected: %q\nreceived: %q", + expectedPartNumb, fm.partNum) + } + + if !bytes.Equal(expectedFile, fm.part) { + t.Errorf("Incorrect part data.\nexpected: %q\nreceived: %q", + expectedFile, fm.part) + } +} + +// Error path: tests that UnmarshalPartMessage returns the expected error when +// the provided data is too small to be unmarshalled into a PartMessage. +func Test_unmarshalPartMessage_SizeError(t *testing.T) { + data := make([]byte, fmMinSize-1) + expectedErr := fmt.Sprintf(unmarshalFmSizeErr, len(data), fmMinSize) + + _, err := UnmarshalPartMessage(data) + if err == nil || err.Error() != expectedErr { + t.Errorf("UnmarshalPartMessage did not return the expected error when "+ + "the given bytes are too small to be a PartMessage."+ + "\nexpected: %s\nreceived: %+v", expectedErr, err) + } +} + +// Tests that PartMessage.Marshal returns the correct data. +func Test_fileMessage_marshal(t *testing.T) { + fm, expectedData, _, _ := newRandomFileMessage() + + data := fm.Marshal() + + if !bytes.Equal(expectedData, data) { + t.Errorf("Marshalled data does not match expected."+ + "\nexpected: %q\nreceived: %q", expectedData, data) + } +} + +// Tests that PartMessage.GetPartNum returns the correct part number. +func Test_fileMessage_getPartNum(t *testing.T) { + fm, _, expectedPartNum, _ := newRandomFileMessage() + + partNum := fm.GetPartNum() + expected := binary.LittleEndian.Uint16(expectedPartNum) + + if expected != partNum { + t.Errorf("Part number does not match expected."+ + "\nexpected: %d\nreceived: %d", expected, partNum) + } +} + +// Tests that PartMessage.SetPartNum sets the correct part number. +func Test_fileMessage_setPartNum(t *testing.T) { + fm := NewPartMessage(256) + + expectedPartNum := make([]byte, partNumLen) + rand.New(rand.NewSource(42)).Read(expectedPartNum) + expected := binary.LittleEndian.Uint16(expectedPartNum) + + fm.SetPartNum(expected) + + if expected != fm.GetPartNum() { + t.Errorf("Failed to set correct part number.\nexpected: %d\nreceived: %d", + expected, fm.GetPartNum()) + } +} + +// Tests that PartMessage.GetPart returns the correct part data. +func Test_fileMessage_getFile(t *testing.T) { + fm, _, _, expectedFile := newRandomFileMessage() + + file := fm.GetPart() + + if !bytes.Equal(expectedFile, file) { + t.Errorf("File data does not match expected."+ + "\nexpected: %q\nreceived: %q", expectedFile, file) + } +} + +// Tests that PartMessage.SetPart sets the correct part data. +func Test_fileMessage_setFile(t *testing.T) { + fm := NewPartMessage(256) + + fileData := make([]byte, 64) + rand.New(rand.NewSource(42)).Read(fileData) + expectedFile := make([]byte, fm.GetPartSize()) + copy(expectedFile, fileData) + + fm.SetPart(expectedFile) + + if !bytes.Equal(expectedFile, fm.GetPart()) { + t.Errorf("Failed to set correct part data.\nexpected: %q\nreceived: %q", + expectedFile, fm.GetPart()) + } +} + +// Error path: tests that PartMessage.SetPart returns the expected error when +// the provided part data is too large for the message. +func Test_fileMessage_setFile_FileTooLargeError(t *testing.T) { + fm := NewPartMessage(fmMinSize + 1) + + expectedErr := fmt.Sprintf(errSetFileFm, fm.GetPartSize()+1, fm.GetPartSize()) + + defer func() { + if r := recover(); r == nil || r != expectedErr { + t.Errorf("SetPart did not return the expected error when the "+ + "given part data is too large to fit in the PartMessage."+ + "\nexpected: %s\nreceived: %+v", expectedErr, r) + } + }() + + fm.SetPart(make([]byte, fm.GetPartSize()+1)) +} + +// Tests that PartMessage.GetPartSize returns the expected available space for +// the part data. +func Test_fileMessage_getFileSize(t *testing.T) { + expectedSize := 256 + + fm := NewPartMessage(fmMinSize + expectedSize) + + if expectedSize != fm.GetPartSize() { + t.Errorf("File size incorrect.\nexpected: %d\nreceived: %d", + expectedSize, fm.GetPartSize()) + } +} + +// newRandomFileMessage generates a new PartMessage filled with random data and +// return the PartMessage and its individual parts. +func newRandomFileMessage() (PartMessage, []byte, []byte, []byte) { + prng := rand.New(rand.NewSource(42)) + partNum := make([]byte, partNumLen) + prng.Read(partNum) + part := make([]byte, 64) + prng.Read(part) + data := append(partNum, part...) + + fm := mapPartMessage(data) + + return fm, data, partNum, part +} diff --git a/fileTransfer2/store/part.go b/fileTransfer2/store/part.go new file mode 100644 index 0000000000000000000000000000000000000000..9229cfb008a8da189a7fd00d401cae8a31ed3c5a --- /dev/null +++ b/fileTransfer2/store/part.go @@ -0,0 +1,70 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package store + +import ( + "gitlab.com/elixxir/client/fileTransfer2/store/cypher" + "gitlab.com/elixxir/client/fileTransfer2/store/fileMessage" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/elixxir/primitives/format" + "gitlab.com/xx_network/primitives/id" +) + +// Part contains information about a single file part and its parent transfer. +// Also contains cryptographic information needed to encrypt the part data. +type Part struct { + transfer *SentTransfer + cypherManager *cypher.Manager + partNum uint16 +} + +// GetEncryptedPart gets the specified part, encrypts it, and returns the +// encrypted part along with its MAC and fingerprint. An error is returned if no +// fingerprints are available. +func (p *Part) GetEncryptedPart(contentsSize int) ( + encryptedPart, mac []byte, fp format.Fingerprint, err error) { + // Create new empty file part message of the size provided + partMsg := fileMessage.NewPartMessage(contentsSize) + + // Add part number and part data to part message + partMsg.SetPartNum(p.partNum) + partMsg.SetPart(p.transfer.getPartData(p.partNum)) + + // Get next cypher + c, err := p.cypherManager.PopCypher() + if err != nil { + p.transfer.markTransferFailed() + return nil, nil, format.Fingerprint{}, err + } + + // Encrypt part and get MAC and fingerprint + encryptedPart, mac, fp = c.Encrypt(partMsg.Marshal()) + + return encryptedPart, mac, fp, nil +} + +// MarkArrived marks the part as arrived. This should be called after the round +// the part is sent on succeeds. +func (p *Part) MarkArrived() { + p.transfer.markArrived(p.partNum) +} + +// Recipient returns the recipient of the file transfer. +func (p *Part) Recipient() *id.ID { + return p.transfer.recipient +} + +// TransferID returns the ID of the file transfer. +func (p *Part) TransferID() *ftCrypto.TransferID { + return p.transfer.tid +} + +// FileName returns the name of the file. +func (p *Part) FileName() string { + return p.transfer.FileName() +} diff --git a/fileTransfer2/store/part_test.go b/fileTransfer2/store/part_test.go new file mode 100644 index 0000000000000000000000000000000000000000..67748160971e47c378c7c5fb31fb188014244fb7 --- /dev/null +++ b/fileTransfer2/store/part_test.go @@ -0,0 +1,126 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package store + +import ( + "bytes" + "gitlab.com/elixxir/client/fileTransfer2/store/fileMessage" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/elixxir/primitives/format" + "testing" +) + +// Tests that the encrypted part returned by Part.GetEncryptedPart can be +// decrypted, unmarshalled, and that it matches the original. +func TestPart_GetEncryptedPart(t *testing.T) { + st, parts, key, _, _ := newTestSentTransfer(25, t) + partNum := 0 + part := st.GetUnsentParts()[partNum] + + encryptedPart, mac, fp, err := part.GetEncryptedPart( + format.NewMessage(numPrimeBytes).ContentsSize()) + if err != nil { + t.Errorf("GetEncryptedPart returned an error: %+v", err) + } + + decryptedPart, err := ftCrypto.DecryptPart( + *key, encryptedPart, mac, uint16(partNum), fp) + if err != nil { + t.Errorf("Failed to decrypt part: %+v", err) + } + + partMsg, err := fileMessage.UnmarshalPartMessage(decryptedPart) + if err != nil { + t.Errorf("Failed to unmarshal part message: %+v", err) + } + + if !bytes.Equal(parts[partNum], partMsg.GetPart()) { + t.Errorf("Decrypted part does not match original."+ + "\nexpected: %q\nreceived: %q", parts[partNum], partMsg.GetPart()) + } + + if int(partMsg.GetPartNum()) != partNum { + t.Errorf("Decrypted part does not have correct part number."+ + "\nexpected: %d\nreceived: %d", partNum, partMsg.GetPartNum()) + } +} + +// Tests that Part.GetEncryptedPart returns an error when the underlying cypher +// manager runs out of fingerprints. +func TestPart_GetEncryptedPart_OutOfFingerprints(t *testing.T) { + numParts := uint16(25) + st, _, _, numFps, _ := newTestSentTransfer(numParts, t) + part := st.GetUnsentParts()[0] + for i := uint16(0); i < numFps; i++ { + _, _, _, err := part.GetEncryptedPart( + format.NewMessage(numPrimeBytes).ContentsSize()) + if err != nil { + t.Errorf("Getting encrtypted part %d failed: %+v", i, err) + } + } + + _, _, _, err := part.GetEncryptedPart( + format.NewMessage(numPrimeBytes).ContentsSize()) + if err == nil { + t.Errorf("Failed to get an error when run out of fingerprints.") + } +} + +// Tests that Part.MarkArrived correctly marks the part's status in the +// SentTransfer's partStatus vector. +func TestPart_MarkArrived(t *testing.T) { + st, _, _, _, _ := newTestSentTransfer(25, t) + partNum := 0 + part := st.GetUnsentParts()[partNum] + + part.MarkArrived() + + if !st.partStatus.Used(uint32(partNum)) { + t.Errorf("Part #%d not marked as arrived.", partNum) + } +} + +// Tests that Part.Recipient returns the correct recipient ID. +func TestPart_Recipient(t *testing.T) { + st, _, _, _, _ := newTestSentTransfer(25, t) + part := st.GetUnsentParts()[0] + + if !part.Recipient().Cmp(st.Recipient()) { + t.Errorf("Recipient ID does not match expected."+ + "\nexpected: %s\nreceived: %s", st.Recipient(), part.Recipient()) + } +} + +// Tests that Part.TransferID returns the correct transfer ID. +func TestPart_TransferID(t *testing.T) { + st, _, _, _, _ := newTestSentTransfer(25, t) + part := st.GetUnsentParts()[0] + + if part.TransferID() != st.TransferID() { + t.Errorf("Transfer ID does not match expected."+ + "\nexpected: %s\nreceived: %s", st.TransferID(), part.TransferID()) + } +} + +// Tests that Part.FileName returns the correct file name. +func TestPart_FileName(t *testing.T) { + st, _, _, _, _ := newTestSentTransfer(25, t) + part := st.GetUnsentParts()[0] + + if part.FileName() != st.FileName() { + t.Errorf("File name does not match expected."+ + "\nexpected: %q\nreceived: %q", st.FileName(), part.FileName()) + } +} diff --git a/fileTransfer2/store/received.go b/fileTransfer2/store/received.go new file mode 100644 index 0000000000000000000000000000000000000000..921ced2f624959cdbab4d345e92719f0d76c9ad5 --- /dev/null +++ b/fileTransfer2/store/received.go @@ -0,0 +1,181 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package store + +import ( + "encoding/json" + "github.com/pkg/errors" + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/storage/versioned" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/elixxir/ekv" + "gitlab.com/xx_network/primitives/netTime" + "sync" +) + +// Storage keys and versions. +const ( + receivedTransfersStorePrefix = "ReceivedFileTransfersPrefix" + receivedTransfersStoreKey = "ReceivedFileTransfers" + receivedTransfersStoreVersion = 0 +) + +// Error messages. +const ( + // NewOrLoadReceived + errLoadReceived = "error loading received transfer list from storage: %+v" + errUnmarshalReceived = "could not unmarshal received transfer list: %+v" + warnLoadReceivedTransfer = "[FT] failed to load received transfer %d of %d with ID %s: %+v" + errLoadAllReceivedTransfer = "failed to load all %d transfers" + + // Received.AddTransfer + errAddExistingReceivedTransfer = "received transfer with ID %s already exists in map." +) + +// Received contains a list of all received transfers. +type Received struct { + transfers map[ftCrypto.TransferID]*ReceivedTransfer + + mux sync.RWMutex + kv *versioned.KV +} + +// NewOrLoadReceived attempts to load a Received from storage. Or if none exist, +// then a new Received is returned. Also returns a list of all transfers that +// have unreceived file parts so their fingerprints can be re-added. +func NewOrLoadReceived(kv *versioned.KV) (*Received, []*ReceivedTransfer, error) { + s := &Received{ + transfers: make(map[ftCrypto.TransferID]*ReceivedTransfer), + kv: kv.Prefix(receivedTransfersStorePrefix), + } + + obj, err := s.kv.Get(receivedTransfersStoreKey, receivedTransfersStoreVersion) + if err != nil { + if ekv.Exists(err) { + return nil, nil, errors.Errorf(errLoadReceived, err) + } else { + return s, nil, nil + } + } + + tidList, err := unmarshalTransferIdList(obj.Data) + if err != nil { + return nil, nil, errors.Errorf(errUnmarshalReceived, err) + } + + var errCount int + unfinishedTransfer := make([]*ReceivedTransfer, 0, len(tidList)) + for i := range tidList { + tid := tidList[i] + s.transfers[tid], err = loadReceivedTransfer(&tid, s.kv) + if err != nil { + jww.WARN.Print(warnLoadReceivedTransfer, i, len(tidList), tid, err) + errCount++ + } + + if s.transfers[tid].NumReceived() != s.transfers[tid].NumParts() { + unfinishedTransfer = append(unfinishedTransfer, s.transfers[tid]) + } + } + + // Return an error if all transfers failed to load + if errCount == len(tidList) { + return nil, nil, errors.Errorf(errLoadAllReceivedTransfer, len(tidList)) + } + + return s, unfinishedTransfer, nil +} + +// AddTransfer adds the ReceivedTransfer to the map keyed on its transfer ID. +func (r *Received) AddTransfer(key *ftCrypto.TransferKey, + tid *ftCrypto.TransferID, fileName string, transferMAC []byte, + fileSize uint32, numParts, numFps uint16) (*ReceivedTransfer, error) { + + r.mux.Lock() + defer r.mux.Unlock() + + _, exists := r.transfers[*tid] + if exists { + return nil, errors.Errorf(errAddExistingReceivedTransfer, tid) + } + + rt, err := newReceivedTransfer( + key, tid, fileName, transferMAC, fileSize, numParts, numFps, r.kv) + if err != nil { + return nil, err + } + + r.transfers[*tid] = rt + + return rt, r.save() +} + +// GetTransfer returns the ReceivedTransfer with the desiccated transfer ID or +// false if none exists. +func (r *Received) GetTransfer(tid *ftCrypto.TransferID) (*ReceivedTransfer, bool) { + r.mux.RLock() + defer r.mux.RUnlock() + + rt, exists := r.transfers[*tid] + return rt, exists +} + +// RemoveTransfer removes the transfer from the map. If no transfer exists, +// returns nil. Only errors due to saving to storage are returned. +func (r *Received) RemoveTransfer(tid *ftCrypto.TransferID) error { + r.mux.Lock() + defer r.mux.Unlock() + + _, exists := r.transfers[*tid] + if !exists { + return nil + } + + delete(r.transfers, *tid) + return r.save() +} + +//////////////////////////////////////////////////////////////////////////////// +// Storage Functions // +//////////////////////////////////////////////////////////////////////////////// + +// save stores a list of transfer IDs in the map to storage. +func (r *Received) save() error { + data, err := marshalReceivedTransfersMap(r.transfers) + if err != nil { + return err + } + + obj := &versioned.Object{ + Version: receivedTransfersStoreVersion, + Timestamp: netTime.Now(), + Data: data, + } + + return r.kv.Set(receivedTransfersStoreKey, receivedTransfersStoreVersion, obj) +} + +// marshalReceivedTransfersMap serialises the list of transfer IDs from a +// ReceivedTransfer map. +func marshalReceivedTransfersMap( + transfers map[ftCrypto.TransferID]*ReceivedTransfer) ([]byte, error) { + tidList := make([]ftCrypto.TransferID, 0, len(transfers)) + + for tid := range transfers { + tidList = append(tidList, tid) + } + + return json.Marshal(tidList) +} diff --git a/fileTransfer2/store/receivedTransfer.go b/fileTransfer2/store/receivedTransfer.go new file mode 100644 index 0000000000000000000000000000000000000000..d067b86635c3c0d77bda84e08afd19904b0ccb00 --- /dev/null +++ b/fileTransfer2/store/receivedTransfer.go @@ -0,0 +1,382 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package store + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "github.com/pkg/errors" + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/fileTransfer2/store/cypher" + "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/storage/versioned" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/xx_network/primitives/netTime" + "strconv" + "sync" +) + +// Storage keys and versions. +const ( + receivedTransferStorePrefix = "ReceivedFileTransferStore/" + receivedTransferStoreKey = "ReceivedTransfer" + receivedTransferStoreVersion = 0 + receivedTransferStatusKey = "ReceivedPartStatusVector" + receivedPartStoreKey = "receivedPart#" + receivedPartStoreVersion = 0 +) + +// Error messages. +const ( + // newReceivedTransfer + errRtNewCypherManager = "failed to create new cypher manager: %+v" + errRtNewPartStatusVectorErr = "failed to create new state vector for part statuses: %+v" + + // ReceivedTransfer.AddPart + errPartOutOfRange = "part number %d out of range of max %d" + errReceivedPartSave = "failed to save part #%d to storage: %+v" + + // loadReceivedTransfer + errRtLoadCypherManager = "failed to load cypher manager from storage: %+v" + errRtLoadFields = "failed to load transfer MAC, number of parts, and file size: %+v" + errRtUnmarshalFields = "failed to unmarshal transfer MAC, number of parts, and file size: %+v" + errRtLoadPartStatusVector = "failed to load state vector for part statuses: %+v" + errRtLoadPart = "[FT] Failed to load part #%d from storage: %+v" + + // ReceivedTransfer.Delete + errRtDeleteCypherManager = "failed to delete cypher manager: %+v" + errRtDeleteSentTransfer = "failed to delete transfer MAC, number of parts, and file size: %+v" + errRtDeletePartStatus = "failed to delete part status state vector: %+v" + + // ReceivedTransfer.save + errMarshalReceivedTransfer = "failed to marshal: %+v" +) + +// ReceivedTransfer contains information and progress data for a receiving or +// received file transfer. +type ReceivedTransfer struct { + // Tracks file part cyphers + cypherManager *cypher.Manager + + // The ID of the transfer + tid *ftCrypto.TransferID + + // User given name to file + fileName string + + // The MAC for the entire file; used to verify the integrity of all parts + transferMAC []byte + + // Size of the entire file in bytes + fileSize uint32 + + // The number of file parts in the file + numParts uint16 + + // Saves each part in order (has its own storage backend) + parts [][]byte + + // Stores the received status for each file part in a bitstream format + partStatus *utility.StateVector + + mux sync.RWMutex + kv *versioned.KV +} + +// newReceivedTransfer generates a ReceivedTransfer with the specified transfer +// key, transfer ID, and a number of parts. +func newReceivedTransfer(key *ftCrypto.TransferKey, tid *ftCrypto.TransferID, + fileName string, transferMAC []byte, fileSize uint32, numParts, + numFps uint16, kv *versioned.KV) (*ReceivedTransfer, error) { + kv = kv.Prefix(makeReceivedTransferPrefix(tid)) + + // Create new cypher manager + cypherManager, err := cypher.NewManager(key, numFps, kv) + if err != nil { + return nil, errors.Errorf(errRtNewCypherManager, err) + } + + // Create new state vector for storing statuses of received parts + partStatus, err := utility.NewStateVector( + kv, receivedTransferStatusKey, uint32(numParts)) + if err != nil { + return nil, errors.Errorf(errRtNewPartStatusVectorErr, err) + } + + rt := &ReceivedTransfer{ + cypherManager: cypherManager, + tid: tid, + fileName: fileName, + transferMAC: transferMAC, + fileSize: fileSize, + numParts: numParts, + parts: make([][]byte, numParts), + partStatus: partStatus, + kv: kv, + } + + return rt, rt.save() +} + +// AddPart adds the file part to the list of file parts at the index of partNum. +func (rt *ReceivedTransfer) AddPart(part []byte, partNum int) error { + rt.mux.Lock() + defer rt.mux.Unlock() + + if partNum > len(rt.parts)-1 { + return errors.Errorf(errPartOutOfRange, partNum, len(rt.parts)-1) + } + + // Save part + rt.parts[partNum] = part + err := savePart(part, partNum, rt.kv) + if err != nil { + return errors.Errorf(errReceivedPartSave, partNum, err) + } + + // Mark part as received + rt.partStatus.Use(uint32(partNum)) + + return nil +} + +// GetFile concatenates all file parts and returns it as a single complete file. +// Note that this function does not care for the completeness of the file and +// returns all parts it has. +func (rt *ReceivedTransfer) GetFile() []byte { + rt.mux.RLock() + defer rt.mux.RUnlock() + + file := bytes.Join(rt.parts, nil) + + // Strip off trailing padding from last part + if len(file) > int(rt.fileSize) { + file = file[:rt.fileSize] + } + + return file +} + +// GetUnusedCyphers returns a list of cyphers with unused fingerprint numbers. +func (rt *ReceivedTransfer) GetUnusedCyphers() []cypher.Cypher { + return rt.cypherManager.GetUnusedCyphers() +} + +// TransferID returns the transfer's ID. +func (rt *ReceivedTransfer) TransferID() *ftCrypto.TransferID { + return rt.tid +} + +// FileName returns the transfer's file name. +func (rt *ReceivedTransfer) FileName() string { + return rt.fileName +} + +// FileSize returns the size of the entire file transfer. +func (rt *ReceivedTransfer) FileSize() uint32 { + return rt.fileSize +} + +// NumParts returns the total number of file parts in the transfer. +func (rt *ReceivedTransfer) NumParts() uint16 { + return rt.numParts +} + +// NumReceived returns the number of parts that have been received. +func (rt *ReceivedTransfer) NumReceived() uint16 { + rt.mux.RLock() + defer rt.mux.RUnlock() + return uint16(rt.partStatus.GetNumUsed()) +} + +// CopyPartStatusVector returns a copy of the part status vector that can be +// used to look up the current status of parts. Note that the statuses are from +// when this function is called and not realtime. +func (rt *ReceivedTransfer) CopyPartStatusVector() *utility.StateVector { + return rt.partStatus.DeepCopy() +} + +//////////////////////////////////////////////////////////////////////////////// +// Storage Functions // +//////////////////////////////////////////////////////////////////////////////// + +// loadReceivedTransfer loads the ReceivedTransfer with the given transfer ID +// from storage. +func loadReceivedTransfer(tid *ftCrypto.TransferID, kv *versioned.KV) ( + *ReceivedTransfer, error) { + kv = kv.Prefix(makeReceivedTransferPrefix(tid)) + + // Load cypher manager + cypherManager, err := cypher.LoadManager(kv) + if err != nil { + return nil, errors.Errorf(errRtLoadCypherManager, err) + } + + // Load transfer MAC, number of parts, and file size + obj, err := kv.Get(receivedTransferStoreKey, receivedTransferStoreVersion) + if err != nil { + return nil, errors.Errorf(errRtLoadFields, err) + } + + fileName, transferMAC, numParts, fileSize, err := + unmarshalReceivedTransfer(obj.Data) + if err != nil { + return nil, errors.Errorf(errRtUnmarshalFields, err) + } + + // Load StateVector for storing statuses of received parts + partStatus, err := utility.LoadStateVector(kv, receivedTransferStatusKey) + if err != nil { + return nil, errors.Errorf(errRtLoadPartStatusVector, err) + } + + // Load parts from storage + parts := make([][]byte, numParts) + for i := range parts { + if partStatus.Used(uint32(i)) { + parts[i], err = loadPart(i, kv) + if err != nil { + jww.ERROR.Printf(errRtLoadPart, i, err) + } + } + } + + rt := &ReceivedTransfer{ + cypherManager: cypherManager, + tid: tid, + fileName: fileName, + transferMAC: transferMAC, + fileSize: fileSize, + numParts: numParts, + parts: parts, + partStatus: partStatus, + kv: kv, + } + + return rt, nil +} + +// Delete deletes all data in the ReceivedTransfer from storage. +func (rt *ReceivedTransfer) Delete() error { + rt.mux.Lock() + defer rt.mux.Unlock() + + // Delete cypher manager + err := rt.cypherManager.Delete() + if err != nil { + return errors.Errorf(errRtDeleteCypherManager, err) + } + + // Delete transfer MAC, number of parts, and file size + err = rt.kv.Delete(receivedTransferStoreKey, receivedTransferStoreVersion) + if err != nil { + return errors.Errorf(errRtDeleteSentTransfer, err) + } + + // Delete part status state vector + err = rt.partStatus.Delete() + if err != nil { + return errors.Errorf(errRtDeletePartStatus, err) + } + + return nil +} + +// save stores all fields in ReceivedTransfer that do not have their own storage +// (transfer MAC, file size, and number of file parts) to storage. +func (rt *ReceivedTransfer) save() error { + data, err := rt.marshal() + if err != nil { + return errors.Errorf(errMarshalReceivedTransfer, err) + } + + // Create new versioned object for the ReceivedTransfer + vo := &versioned.Object{ + Version: receivedTransferStoreVersion, + Timestamp: netTime.Now(), + Data: data, + } + + // Save versioned object + return rt.kv.Set(receivedTransferStoreKey, receivedTransferStoreVersion, vo) +} + +// receivedTransferDisk structure is used to marshal and unmarshal +// ReceivedTransfer fields to/from storage. +type receivedTransferDisk struct { + FileName string + TransferMAC []byte + NumParts uint16 + FileSize uint32 +} + +// marshal serialises the ReceivedTransfer's fileName, transferMAC, numParts, +// and fileSize. +func (rt *ReceivedTransfer) marshal() ([]byte, error) { + disk := receivedTransferDisk{ + FileName: rt.fileName, + TransferMAC: rt.transferMAC, + NumParts: rt.numParts, + FileSize: rt.fileSize, + } + + return json.Marshal(disk) +} + +// unmarshalReceivedTransfer deserializes the data into the fileName, +// transferMAC, numParts, and fileSize. +func unmarshalReceivedTransfer(data []byte) (fileName string, + transferMAC []byte, numParts uint16, fileSize uint32, err error) { + var disk receivedTransferDisk + err = json.Unmarshal(data, &disk) + if err != nil { + return "", nil, 0, 0, err + } + + return disk.FileName, disk.TransferMAC, disk.NumParts, disk.FileSize, nil +} + +// savePart saves the given part to storage keying on its part number. +func savePart(part []byte, partNum int, kv *versioned.KV) error { + obj := &versioned.Object{ + Version: receivedPartStoreVersion, + Timestamp: netTime.Now(), + Data: part, + } + + return kv.Set(makeReceivedPartKey(partNum), receivedPartStoreVersion, obj) +} + +// loadPart loads the part with the given part number from storage. +func loadPart(partNum int, kv *versioned.KV) ([]byte, error) { + obj, err := kv.Get(makeReceivedPartKey(partNum), receivedPartStoreVersion) + if err != nil { + return nil, err + } + return obj.Data, nil +} + +// makeReceivedTransferPrefix generates the unique prefix used on the key value +// store to store received transfers for the given transfer ID. +func makeReceivedTransferPrefix(tid *ftCrypto.TransferID) string { + return receivedTransferStorePrefix + + base64.StdEncoding.EncodeToString(tid.Bytes()) +} + +// makeReceivedPartKey generates a storage key for the given part number. +func makeReceivedPartKey(partNum int) string { + return receivedPartStoreKey + strconv.Itoa(partNum) +} diff --git a/fileTransfer2/store/receivedTransfer_test.go b/fileTransfer2/store/receivedTransfer_test.go new file mode 100644 index 0000000000000000000000000000000000000000..09da21e307c60f7dd277e675afa51e1894a404b2 --- /dev/null +++ b/fileTransfer2/store/receivedTransfer_test.go @@ -0,0 +1,466 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package store + +import ( + "bytes" + "fmt" + "gitlab.com/elixxir/client/fileTransfer2/store/cypher" + "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/storage/versioned" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/elixxir/ekv" + "gitlab.com/xx_network/crypto/csprng" + "reflect" + "testing" +) + +// Tests that newReceivedTransfer returns a new ReceivedTransfer with the +// expected values. +func Test_newReceivedTransfer(t *testing.T) { + kv := versioned.NewKV(ekv.MakeMemstore()) + key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) + tid, _ := ftCrypto.NewTransferID(csprng.NewSystemRNG()) + numFps := uint16(24) + parts, _ := generateTestParts(16) + fileSize := uint32(len(parts) * len(parts[0])) + numParts := uint16(len(parts)) + rtKv := kv.Prefix(makeReceivedTransferPrefix(&tid)) + + cypherManager, err := cypher.NewManager(&key, numFps, rtKv) + if err != nil { + t.Errorf("Failed to make new cypher manager: %+v", err) + } + partStatus, err := utility.NewStateVector( + rtKv, receivedTransferStatusKey, uint32(numParts)) + if err != nil { + t.Errorf("Failed to make new state vector: %+v", err) + } + + expected := &ReceivedTransfer{ + cypherManager: cypherManager, + tid: &tid, + fileName: "fileName", + transferMAC: []byte("transferMAC"), + fileSize: fileSize, + numParts: numParts, + parts: make([][]byte, numParts), + partStatus: partStatus, + kv: rtKv, + } + + rt, err := newReceivedTransfer(&key, &tid, expected.fileName, + expected.transferMAC, fileSize, numParts, numFps, kv) + if err != nil { + t.Errorf("newReceivedTransfer returned an error: %+v", err) + } + + if !reflect.DeepEqual(expected, rt) { + t.Errorf("New ReceivedTransfer does not match expected."+ + "\nexpected: %+v\nreceived: %+v", expected, rt) + } +} + +// Tests that ReceivedTransfer.AddPart adds the part to the part list and marks +// it as received +func TestReceivedTransfer_AddPart(t *testing.T) { + rt, _, _, _, _ := newTestReceivedTransfer(16, t) + + part := []byte("Part") + partNum := 6 + + err := rt.AddPart(part, partNum) + if err != nil { + t.Errorf("Failed to add part: %+v", err) + } + + if !bytes.Equal(rt.parts[partNum], part) { + t.Errorf("Found incorrect part in list.\nexpected: %q\nreceived: %q", + part, rt.parts[partNum]) + } + + if !rt.partStatus.Used(uint32(partNum)) { + t.Errorf("Part #%d not marked as received.", partNum) + } +} + +// Tests that ReceivedTransfer.AddPart returns an error if the part number is +// not within the range of part numbers +func TestReceivedTransfer_AddPart_PartOutOfRangeError(t *testing.T) { + rt, _, _, _, _ := newTestReceivedTransfer(16, t) + + expectedErr := fmt.Sprintf(errPartOutOfRange, rt.partStatus.GetNumKeys(), + rt.partStatus.GetNumKeys()-1) + + err := rt.AddPart([]byte("Part"), int(rt.partStatus.GetNumKeys())) + if err == nil || err.Error() != expectedErr { + t.Errorf("Failed to get expected error when part number is out of range."+ + "\nexpected: %s\nreceived: %+v", expectedErr, err) + } +} + +// Tests that ReceivedTransfer.GetFile returns the expected file after all the +// parts are added to the transfer. +func TestReceivedTransfer_GetFile(t *testing.T) { + // Generate parts and make last file part smaller than the rest + parts, _ := generateTestParts(16) + lastPartLen := 6 + rt, _, _, _, _ := newTestReceivedTransfer(uint16(len(parts)), t) + rt.fileSize = uint32((len(parts)-1)*len(parts[0]) + lastPartLen) + + for i, p := range parts { + err := rt.AddPart(p, i) + if err != nil { + t.Errorf("Failed to add part #%d: %+v", i, err) + } + } + + parts[len(parts)-1] = parts[len(parts)-1][:lastPartLen] + combinedParts := bytes.Join(parts, nil) + + file := rt.GetFile() + + if !bytes.Equal(file, combinedParts) { + t.Errorf("Received file does not match expected."+ + "\nexpected: %q\nreceived: %q", combinedParts, file) + } + +} + +// Tests that ReceivedTransfer.GetUnusedCyphers returns the correct number of +// unused cyphers. +func TestReceivedTransfer_GetUnusedCyphers(t *testing.T) { + numParts := uint16(10) + rt, _, _, numFps, _ := newTestReceivedTransfer(numParts, t) + + // Check that all cyphers are returned after initialisation + unsentCyphers := rt.GetUnusedCyphers() + if len(unsentCyphers) != int(numFps) { + t.Errorf("Number of unused cyphers does not match original number of "+ + "fingerprints when none have been used.\nexpected: %d\nreceived: %d", + numFps, len(unsentCyphers)) + } + + // Use every other part + for i := range unsentCyphers { + if i%2 == 0 { + _, _ = unsentCyphers[i].PopCypher() + } + } + + // Check that only have the number of parts is returned + unsentCyphers = rt.GetUnusedCyphers() + if len(unsentCyphers) != int(numFps)/2 { + t.Errorf("Number of unused cyphers is not half original number after "+ + "half have been marked as received.\nexpected: %d\nreceived: %d", + numFps/2, len(unsentCyphers)) + } + + // Use the rest of the parts + for i := range unsentCyphers { + _, _ = unsentCyphers[i].PopCypher() + } + + // Check that no sent parts are returned + unsentCyphers = rt.GetUnusedCyphers() + if len(unsentCyphers) != 0 { + t.Errorf("Number of unused cyphers is not zero after all have been "+ + "marked as received.\nexpected: %d\nreceived: %d", + 0, len(unsentCyphers)) + } +} + +// Tests that ReceivedTransfer.TransferID returns the correct transfer ID. +func TestReceivedTransfer_TransferID(t *testing.T) { + rt, _, _, _, _ := newTestReceivedTransfer(16, t) + + if rt.TransferID() != rt.tid { + t.Errorf("Incorrect transfer ID.\nexpected: %s\nreceived: %s", + rt.tid, rt.TransferID()) + } +} + +// Tests that ReceivedTransfer.FileName returns the correct file name. +func TestReceivedTransfer_FileName(t *testing.T) { + rt, _, _, _, _ := newTestReceivedTransfer(16, t) + + if rt.FileName() != rt.fileName { + t.Errorf("Incorrect transfer ID.\nexpected: %s\nreceived: %s", + rt.fileName, rt.FileName()) + } +} + +// Tests that ReceivedTransfer.FileSize returns the correct file size. +func TestReceivedTransfer_FileSize(t *testing.T) { + rt, file, _, _, _ := newTestReceivedTransfer(16, t) + fileSize := uint32(len(file)) + + if rt.FileSize() != fileSize { + t.Errorf("Incorrect file size.\nexpected: %d\nreceived: %d", + fileSize, rt.FileSize()) + } +} + +// Tests that ReceivedTransfer.NumParts returns the correct number of parts. +func TestReceivedTransfer_NumParts(t *testing.T) { + numParts := uint16(16) + rt, _, _, _, _ := newTestReceivedTransfer(numParts, t) + + if rt.NumParts() != numParts { + t.Errorf("Incorrect number of parts.\nexpected: %d\nreceived: %d", + numParts, rt.NumParts()) + } +} + +// Tests that ReceivedTransfer.NumReceived returns the correct number of +// received parts. +func TestReceivedTransfer_NumReceived(t *testing.T) { + rt, _, _, _, _ := newTestReceivedTransfer(16, t) + + if rt.NumReceived() != 0 { + t.Errorf("Incorrect number of received parts."+ + "\nexpected: %d\nreceived: %d", 0, rt.NumReceived()) + } + + // Add all parts as received + for i := 0; i < int(rt.numParts); i++ { + _ = rt.AddPart(nil, i) + } + + if uint32(rt.NumReceived()) != rt.partStatus.GetNumKeys() { + t.Errorf("Incorrect number of received parts."+ + "\nexpected: %d\nreceived: %d", + uint32(rt.NumReceived()), rt.partStatus.GetNumKeys()) + } +} + +// Tests that the state vector returned by ReceivedTransfer.CopyPartStatusVector +// has the same values as the original but is a copy. +func TestReceivedTransfer_CopyPartStatusVector(t *testing.T) { + rt, _, _, _, _ := newTestReceivedTransfer(64, t) + + // Check that the vectors have the same unused parts + partStatus := rt.CopyPartStatusVector() + if !reflect.DeepEqual( + partStatus.GetUnusedKeyNums(), rt.partStatus.GetUnusedKeyNums()) { + t.Errorf("Copied part status does not match original."+ + "\nexpected: %v\nreceived: %v", + rt.partStatus.GetUnusedKeyNums(), partStatus.GetUnusedKeyNums()) + } + + // Modify the state + _ = rt.AddPart([]byte("hello"), 5) + + // Check that the copied state is different + if reflect.DeepEqual( + partStatus.GetUnusedKeyNums(), rt.partStatus.GetUnusedKeyNums()) { + t.Errorf("Old copied part status matches new status."+ + "\nexpected: %v\nreceived: %v", + rt.partStatus.GetUnusedKeyNums(), partStatus.GetUnusedKeyNums()) + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Storage Functions // +//////////////////////////////////////////////////////////////////////////////// + +// Tests that a ReceivedTransfer loaded via loadReceivedTransfer matches the +// original. +func Test_loadReceivedTransfer(t *testing.T) { + parts, _ := generateTestParts(16) + rt, _, _, _, kv := newTestReceivedTransfer(uint16(len(parts)), t) + + for i, p := range parts { + if i%2 == 0 { + + err := rt.AddPart(p, i) + if err != nil { + t.Errorf("Failed to add part #%d: %+v", i, err) + } + } + } + + loadedRt, err := loadReceivedTransfer(rt.tid, kv) + if err != nil { + t.Errorf("Failed to load ReceivedTransfer: %+v", err) + } + + if !reflect.DeepEqual(rt, loadedRt) { + t.Errorf("Loaded ReceivedTransfer does not match original."+ + "\nexpected: %+v\nreceived: %+v", rt, loadedRt) + } +} + +// Tests that ReceivedTransfer.Delete deletes the storage backend of the +// ReceivedTransfer and that it cannot be loaded again. +func TestReceivedTransfer_Delete(t *testing.T) { + rt, _, _, _, kv := newTestReceivedTransfer(64, t) + + err := rt.Delete() + if err != nil { + t.Errorf("Delete returned an error: %+v", err) + } + + _, err = loadSentTransfer(rt.tid, kv) + if err == nil { + t.Errorf("Loaded received transfer that was deleted.") + } +} + +// Tests that the fields saved by ReceivedTransfer.save can be loaded from +// storage. +func TestReceivedTransfer_save(t *testing.T) { + rt, _, _, _, _ := newTestReceivedTransfer(64, t) + + err := rt.save() + if err != nil { + t.Errorf("save returned an error: %+v", err) + } + + _, err = rt.kv.Get(receivedTransferStoreKey, receivedTransferStoreVersion) + if err != nil { + t.Errorf("Failed to load saved ReceivedTransfer: %+v", err) + } +} + +// newTestReceivedTransfer creates a new ReceivedTransfer for testing. +func newTestReceivedTransfer(numParts uint16, t *testing.T) ( + rt *ReceivedTransfer, file []byte, key *ftCrypto.TransferKey, + numFps uint16, kv *versioned.KV) { + kv = versioned.NewKV(ekv.MakeMemstore()) + keyTmp, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) + tid, _ := ftCrypto.NewTransferID(csprng.NewSystemRNG()) + transferMAC := []byte("I am a transfer MAC") + numFps = 2 * numParts + fileName := "helloFile" + _, file = generateTestParts(numParts) + fileSize := uint32(len(file)) + + st, err := newReceivedTransfer( + &keyTmp, &tid, fileName, transferMAC, fileSize, numParts, numFps, kv) + if err != nil { + t.Errorf("Failed to make new SentTransfer: %+v", err) + } + + return st, file, &keyTmp, numFps, kv +} + +// Tests that a ReceivedTransfer marshalled via ReceivedTransfer.marshal and +// unmarshalled via unmarshalReceivedTransfer matches the original. +func TestReceivedTransfer_marshal_unmarshalReceivedTransfer(t *testing.T) { + rt := &ReceivedTransfer{ + fileName: "transferName", + transferMAC: []byte("I am a transfer MAC"), + fileSize: 735, + numParts: 153, + } + + data, err := rt.marshal() + if err != nil { + t.Errorf("marshal returned an error: %+v", err) + } + + fileName, transferMac, numParts, fileSize, err := + unmarshalReceivedTransfer(data) + if err != nil { + t.Errorf("Failed to unmarshal SentTransfer: %+v", err) + } + + if rt.fileName != fileName { + t.Errorf("Incorrect file name.\nexpected: %q\nreceived: %q", + rt.fileName, fileName) + } + + if !bytes.Equal(rt.transferMAC, transferMac) { + t.Errorf("Incorrect transfer MAC.\nexpected: %s\nreceived: %s", + rt.transferMAC, transferMac) + } + + if rt.numParts != numParts { + t.Errorf("Incorrect number of parts.\nexpected: %d\nreceived: %d", + rt.numParts, numParts) + } + + if rt.fileSize != fileSize { + t.Errorf("Incorrect file size.\nexpected: %d\nreceived: %d", + rt.fileSize, fileSize) + } +} + +// Tests that the part saved to storage via savePart can be loaded. +func Test_savePart_loadPart(t *testing.T) { + kv := versioned.NewKV(ekv.MakeMemstore()) + part := []byte("I am a part.") + partNum := 18 + + err := savePart(part, partNum, kv) + if err != nil { + t.Errorf("Failed to save part: %+v", err) + } + + loadedPart, err := loadPart(partNum, kv) + if err != nil { + t.Errorf("Failed to load part: %+v", err) + } + + if !bytes.Equal(part, loadedPart) { + t.Errorf("Loaded part does not match original."+ + "\nexpected: %q\nreceived: %q", part, loadedPart) + } +} + +// Consistency test of makeReceivedTransferPrefix. +func Test_makeReceivedTransferPrefix_Consistency(t *testing.T) { + expectedPrefixes := []string{ + "ReceivedFileTransferStore/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "ReceivedFileTransferStore/AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "ReceivedFileTransferStore/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "ReceivedFileTransferStore/AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "ReceivedFileTransferStore/BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "ReceivedFileTransferStore/BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "ReceivedFileTransferStore/BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "ReceivedFileTransferStore/BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "ReceivedFileTransferStore/CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "ReceivedFileTransferStore/CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + } + + for i, expected := range expectedPrefixes { + tid := ftCrypto.TransferID{byte(i)} + prefix := makeReceivedTransferPrefix(&tid) + + if expected != prefix { + t.Errorf("Prefix #%d does not match expected."+ + "\nexpected: %q\nreceived: %q", i, expected, prefix) + } + } +} + +// Consistency test of makeReceivedPartKey. +func Test_makeReceivedPartKey_Consistency(t *testing.T) { + expectedKeys := []string{ + "receivedPart#0", "receivedPart#1", "receivedPart#2", "receivedPart#3", + "receivedPart#4", "receivedPart#5", "receivedPart#6", "receivedPart#7", + "receivedPart#8", "receivedPart#9", + } + + for i, expected := range expectedKeys { + key := makeReceivedPartKey(i) + + if expected != key { + t.Errorf("Key #%d does not match expected."+ + "\nexpected: %q\nreceived: %q", i, expected, key) + } + } +} diff --git a/fileTransfer2/store/received_test.go b/fileTransfer2/store/received_test.go new file mode 100644 index 0000000000000000000000000000000000000000..be7652ec9abb9784a667d6b6e7ba715d76fc1135 --- /dev/null +++ b/fileTransfer2/store/received_test.go @@ -0,0 +1,262 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package store + +import ( + "bytes" + "fmt" + "gitlab.com/elixxir/client/storage/versioned" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/elixxir/ekv" + "gitlab.com/xx_network/crypto/csprng" + "reflect" + "sort" + "strconv" + "testing" +) + +// Tests that NewOrLoadReceived returns a new Received when none exist in +// storage and that the list of incomplete transfers is nil. +func TestNewOrLoadReceived_New(t *testing.T) { + kv := versioned.NewKV(ekv.MakeMemstore()) + expected := &Received{ + transfers: make(map[ftCrypto.TransferID]*ReceivedTransfer), + kv: kv.Prefix(receivedTransfersStorePrefix), + } + + r, incompleteTransfers, err := NewOrLoadReceived(kv) + if err != nil { + t.Errorf("NewOrLoadReceived returned an error: %+v", err) + } + + if !reflect.DeepEqual(expected, r) { + t.Errorf("New Received does not match expected."+ + "\nexpected: %+v\nreceived: %+v", expected, r) + } + + if incompleteTransfers != nil { + t.Errorf("List of incomplete transfers should be nil when not "+ + "loading: %+v", incompleteTransfers) + } +} + +// Tests that NewOrLoadReceived returns a loaded Received when one exist in +// storage and that the list of incomplete transfers is correct. +func TestNewOrLoadReceived_Load(t *testing.T) { + kv := versioned.NewKV(ekv.MakeMemstore()) + r, _, err := NewOrLoadReceived(kv) + if err != nil { + t.Errorf("Failed to make new Received: %+v", err) + } + var expectedIncompleteTransfers []*ReceivedTransfer + + // Create and add transfers to map and save + for i := 0; i < 2; i++ { + key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) + tid, _ := ftCrypto.NewTransferID(csprng.NewSystemRNG()) + rt, err2 := r.AddTransfer(&key, &tid, "file"+strconv.Itoa(i), + []byte("transferMAC"+strconv.Itoa(i)), 128, 10, 20) + if err2 != nil { + t.Errorf("Failed to add transfer #%d: %+v", i, err2) + } + expectedIncompleteTransfers = append(expectedIncompleteTransfers, rt) + } + if err = r.save(); err != nil { + t.Errorf("Failed to make save filled Receivced: %+v", err) + } + + // Load Received + loadedReceived, incompleteTransfers, err := NewOrLoadReceived(kv) + if err != nil { + t.Errorf("Failed to load Received: %+v", err) + } + + // Check that the loaded Received matches original + if !reflect.DeepEqual(r, loadedReceived) { + t.Errorf("Loaded Received does not match original."+ + "\nexpected: %#v\nreceived: %#v", r, loadedReceived) + } + + sort.Slice(incompleteTransfers, func(i, j int) bool { + return bytes.Compare(incompleteTransfers[i].TransferID()[:], + incompleteTransfers[j].TransferID()[:]) == -1 + }) + + sort.Slice(expectedIncompleteTransfers, func(i, j int) bool { + return bytes.Compare(expectedIncompleteTransfers[i].TransferID()[:], + expectedIncompleteTransfers[j].TransferID()[:]) == -1 + }) + + // Check that the incomplete transfers matches expected + if !reflect.DeepEqual(expectedIncompleteTransfers, incompleteTransfers) { + t.Errorf("Incorrect incomplete transfers.\nexpected: %v\nreceived: %v", + expectedIncompleteTransfers, incompleteTransfers) + } +} + +// Tests that Received.AddTransfer makes a new transfer and adds it to the list. +func TestReceived_AddTransfer(t *testing.T) { + kv := versioned.NewKV(ekv.MakeMemstore()) + r, _, _ := NewOrLoadReceived(kv) + + key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) + tid, _ := ftCrypto.NewTransferID(csprng.NewSystemRNG()) + + rt, err := r.AddTransfer( + &key, &tid, "file", []byte("transferMAC"), 128, 10, 20) + if err != nil { + t.Errorf("Failed to add new transfer: %+v", err) + } + + // Check that the transfer was added + if _, exists := r.transfers[*rt.tid]; !exists { + t.Errorf("No transfer with ID %s exists.", rt.tid) + } +} + +// Tests that Received.AddTransfer returns an error when adding a transfer ID +// that already exists. +func TestReceived_AddTransfer_TransferAlreadyExists(t *testing.T) { + tid := ftCrypto.TransferID{0} + r := &Received{ + transfers: map[ftCrypto.TransferID]*ReceivedTransfer{tid: nil}, + } + + expectedErr := fmt.Sprintf(errAddExistingReceivedTransfer, tid) + _, err := r.AddTransfer(nil, &tid, "", nil, 0, 0, 0) + if err == nil || err.Error() != expectedErr { + t.Errorf("Received unexpected error when adding transfer that already "+ + "exists.\nexpected: %s\nreceived: %+v", expectedErr, err) + } +} + +// Tests that Received.GetTransfer returns the expected transfer. +func TestReceived_GetTransfer(t *testing.T) { + kv := versioned.NewKV(ekv.MakeMemstore()) + r, _, _ := NewOrLoadReceived(kv) + + key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) + tid, _ := ftCrypto.NewTransferID(csprng.NewSystemRNG()) + + rt, err := r.AddTransfer( + &key, &tid, "file", []byte("transferMAC"), 128, 10, 20) + if err != nil { + t.Errorf("Failed to add new transfer: %+v", err) + } + + // Check that the transfer was added + receivedRt, exists := r.GetTransfer(rt.tid) + if !exists { + t.Errorf("No transfer with ID %s exists.", rt.tid) + } + + if !reflect.DeepEqual(rt, receivedRt) { + t.Errorf("Received ReceivedTransfer does not match expected."+ + "\nexpected: %+v\nreceived: %+v", rt, receivedRt) + } +} + +// Tests that Sent.RemoveTransfer removes the transfer from the list. +func TestReceived_RemoveTransfer(t *testing.T) { + kv := versioned.NewKV(ekv.MakeMemstore()) + r, _, _ := NewOrLoadReceived(kv) + + key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) + tid, _ := ftCrypto.NewTransferID(csprng.NewSystemRNG()) + + rt, err := r.AddTransfer( + &key, &tid, "file", []byte("transferMAC"), 128, 10, 20) + if err != nil { + t.Errorf("Failed to add new transfer: %+v", err) + } + + // Delete the transfer + err = r.RemoveTransfer(rt.tid) + if err != nil { + t.Errorf("RemoveTransfer returned an error: %+v", err) + } + + // Check that the transfer was deleted + _, exists := r.GetTransfer(rt.tid) + if exists { + t.Errorf("Transfer %s exists.", rt.tid) + } + + // Remove transfer that was already removed + err = r.RemoveTransfer(rt.tid) + if err != nil { + t.Errorf("RemoveTransfer returned an error: %+v", err) + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Storage Functions // +//////////////////////////////////////////////////////////////////////////////// + +// Tests that Received.save saves the transfer ID list to storage by trying to +// load it after a save. +func TestReceived_save(t *testing.T) { + kv := versioned.NewKV(ekv.MakeMemstore()) + r, _, _ := NewOrLoadReceived(kv) + r.transfers = map[ftCrypto.TransferID]*ReceivedTransfer{ + ftCrypto.TransferID{0}: nil, ftCrypto.TransferID{1}: nil, + ftCrypto.TransferID{2}: nil, ftCrypto.TransferID{3}: nil, + } + + err := r.save() + if err != nil { + t.Errorf("Failed to save transfer ID list: %+v", err) + } + + _, err = r.kv.Get(receivedTransfersStoreKey, receivedTransfersStoreVersion) + if err != nil { + t.Errorf("Failed to load transfer ID list: %+v", err) + } +} + +// Tests that the transfer IDs keys in the map marshalled by +// marshalReceivedTransfersMap and unmarshalled by unmarshalTransferIdList match +// the original. +func Test_marshalReceivedTransfersMap_unmarshalTransferIdList(t *testing.T) { + // Build map of transfer IDs + transfers := make(map[ftCrypto.TransferID]*ReceivedTransfer, 10) + for i := 0; i < 10; i++ { + tid, _ := ftCrypto.NewTransferID(csprng.NewSystemRNG()) + transfers[tid] = nil + } + + data, err := marshalReceivedTransfersMap(transfers) + if err != nil { + t.Errorf("marshalReceivedTransfersMap returned an error: %+v", err) + } + + tidList, err := unmarshalTransferIdList(data) + if err != nil { + t.Errorf("unmarshalSentTransfer returned an error: %+v", err) + } + + for _, tid := range tidList { + if _, exists := transfers[tid]; exists { + delete(transfers, tid) + } else { + t.Errorf("Transfer %s does not exist in list.", tid) + } + } + + if len(transfers) != 0 { + t.Errorf("%d transfers not in unmarshalled list: %v", + len(transfers), transfers) + } +} diff --git a/fileTransfer2/store/sent.go b/fileTransfer2/store/sent.go new file mode 100644 index 0000000000000000000000000000000000000000..7873d5b469bafc8666b0951d55d7852aff0c1ae6 --- /dev/null +++ b/fileTransfer2/store/sent.go @@ -0,0 +1,193 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package store + +import ( + "encoding/json" + "github.com/pkg/errors" + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/storage/versioned" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/elixxir/ekv" + "gitlab.com/xx_network/primitives/id" + "gitlab.com/xx_network/primitives/netTime" + "sync" +) + +// Storage keys and versions. +const ( + sentTransfersStorePrefix = "SentFileTransfersPrefix" + sentTransfersStoreKey = "SentFileTransfers" + sentTransfersStoreVersion = 0 +) + +// Error messages. +const ( + // NewOrLoadSent + errLoadSent = "error loading sent transfer list from storage: %+v" + errUnmarshalSent = "could not unmarshal sent transfer list: %+v" + warnLoadSentTransfer = "[FT] Failed to load sent transfer %d of %d with ID %s: %+v" + errLoadAllSentTransfer = "failed to load all %d transfers" + + // Sent.AddTransfer + errAddExistingSentTransfer = "sent transfer with ID %s already exists in map." + errNewSentTransfer = "failed to make new sent transfer: %+v" +) + +// Sent contains a list of all sent transfers. +type Sent struct { + transfers map[ftCrypto.TransferID]*SentTransfer + + mux sync.RWMutex + kv *versioned.KV +} + +// NewOrLoadSent attempts to load Sent from storage. Or if none exist, then a +// new Sent is returned. If running transfers were loaded from storage, a list +// of unsent parts is returned. +func NewOrLoadSent(kv *versioned.KV) (*Sent, []Part, error) { + s := &Sent{ + transfers: make(map[ftCrypto.TransferID]*SentTransfer), + kv: kv.Prefix(sentTransfersStorePrefix), + } + + obj, err := s.kv.Get(sentTransfersStoreKey, sentTransfersStoreVersion) + if err != nil { + if !ekv.Exists(err) { + // Return the new Sent if none exists in storage + return s, nil, nil + } else { + // Return other errors + return nil, nil, errors.Errorf(errLoadSent, err) + } + } + + // Load list of saved sent transfers from storage + tidList, err := unmarshalTransferIdList(obj.Data) + if err != nil { + return nil, nil, errors.Errorf(errUnmarshalSent, err) + } + + // Load sent transfers from storage + var errCount int + var unsentParts []Part + for i := range tidList { + tid := tidList[i] + s.transfers[tid], err = loadSentTransfer(&tid, s.kv) + if err != nil { + jww.WARN.Printf(warnLoadSentTransfer, i, len(tidList), tid, err) + errCount++ + continue + } + + if s.transfers[tid].Status() == Running { + unsentParts = + append(unsentParts, s.transfers[tid].GetUnsentParts()...) + } + } + + // Return an error if all transfers failed to load + if errCount == len(tidList) { + return nil, nil, errors.Errorf(errLoadAllSentTransfer, len(tidList)) + } + + return s, unsentParts, nil +} + +// AddTransfer creates a SentTransfer and adds it to the map keyed on its +// transfer ID. +func (s *Sent) AddTransfer(recipient *id.ID, key *ftCrypto.TransferKey, + tid *ftCrypto.TransferID, fileName string, fileSize uint32, parts [][]byte, + numFps uint16) (*SentTransfer, error) { + s.mux.Lock() + defer s.mux.Unlock() + + _, exists := s.transfers[*tid] + if exists { + return nil, errors.Errorf(errAddExistingSentTransfer, tid) + } + + st, err := newSentTransfer( + recipient, key, tid, fileName, fileSize, parts, numFps, s.kv) + if err != nil { + return nil, errors.Errorf(errNewSentTransfer, tid) + } + + s.transfers[*tid] = st + + return st, s.save() +} + +// GetTransfer returns the SentTransfer with the desiccated transfer ID or false +// if none exists. +func (s *Sent) GetTransfer(tid *ftCrypto.TransferID) (*SentTransfer, bool) { + s.mux.RLock() + defer s.mux.RUnlock() + + st, exists := s.transfers[*tid] + return st, exists +} + +// RemoveTransfer removes the transfer from the map. If no transfer exists, +// returns nil. Only errors due to saving to storage are returned. +func (s *Sent) RemoveTransfer(tid *ftCrypto.TransferID) error { + s.mux.Lock() + defer s.mux.Unlock() + + _, exists := s.transfers[*tid] + if !exists { + return nil + } + + delete(s.transfers, *tid) + return s.save() +} + +//////////////////////////////////////////////////////////////////////////////// +// Storage Functions // +//////////////////////////////////////////////////////////////////////////////// + +// save stores a list of transfer IDs in the map to storage. +func (s *Sent) save() error { + data, err := marshalSentTransfersMap(s.transfers) + if err != nil { + return err + } + + obj := &versioned.Object{ + Version: sentTransfersStoreVersion, + Timestamp: netTime.Now(), + Data: data, + } + + return s.kv.Set(sentTransfersStoreKey, sentTransfersStoreVersion, obj) +} + +// marshalSentTransfersMap serialises the list of transfer IDs from a +// SentTransfer map. +func marshalSentTransfersMap(transfers map[ftCrypto.TransferID]*SentTransfer) ( + []byte, error) { + tidList := make([]ftCrypto.TransferID, 0, len(transfers)) + + for tid := range transfers { + tidList = append(tidList, tid) + } + + return json.Marshal(tidList) +} + +// unmarshalTransferIdList deserializes the data into a list of transfer IDs. +func unmarshalTransferIdList(data []byte) ([]ftCrypto.TransferID, error) { + var tidList []ftCrypto.TransferID + err := json.Unmarshal(data, &tidList) + if err != nil { + return nil, err + } + + return tidList, nil +} diff --git a/fileTransfer2/store/sentTransfer.go b/fileTransfer2/store/sentTransfer.go new file mode 100644 index 0000000000000000000000000000000000000000..9891087a1d07193eabb6da92749de0c448d8a68f --- /dev/null +++ b/fileTransfer2/store/sentTransfer.go @@ -0,0 +1,364 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package store + +import ( + "encoding/base64" + "encoding/json" + "github.com/pkg/errors" + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/fileTransfer2/store/cypher" + "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/storage/versioned" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/xx_network/primitives/id" + "gitlab.com/xx_network/primitives/netTime" + "sync" +) + +// Storage keys and versions. +const ( + sentTransferStorePrefix = "SentFileTransferStore/" + sentTransferStoreKey = "SentTransfer" + sentTransferStoreVersion = 0 + sentTransferStatusKey = "SentPartStatusVector" +) + +// Error messages. +const ( + // newSentTransfer + errStNewCypherManager = "failed to create new cypher manager: %+v" + errStNewPartStatusVector = "failed to create new state vector for part statuses: %+v" + + // SentTransfer.getPartData + errNoPartNum = "no part with part number %d exists in transfer %s (%q)" + + // loadSentTransfer + errStLoadCypherManager = "failed to load cypher manager from storage: %+v" + errStLoadFields = "failed to load recipient, status, and parts list: %+v" + errStUnmarshalFields = "failed to unmarshal recipient, status, and parts list: %+v" + errStLoadPartStatusVector = "failed to load state vector for part statuses: %+v" + + // SentTransfer.Delete + errStDeleteCypherManager = "failed to delete cypherManager: %+v" + errStDeleteSentTransfer = "failed to delete recipient ID, status, and file parts: %+v" + errStDeletePartStatus = "failed to delete part status multi state vector: %+v" + + // SentTransfer.save + errMarshalSentTransfer = "failed to marshal: %+v" +) + +// SentTransfer contains information and progress data for sending or sent file +// transfer. +type SentTransfer struct { + // Tracks cyphers for each part + cypherManager *cypher.Manager + + // The ID of the transfer + tid *ftCrypto.TransferID + + // User given name to file + fileName string + + // ID of the recipient of the file transfer + recipient *id.ID + + // The size of the entire file + fileSize uint32 + + // The number of file parts in the file + numParts uint16 + + // Indicates the status of the transfer + status TransferStatus + + // List of all file parts in order to send + parts [][]byte + + // Stores the status of each part in a bitstream format + partStatus *utility.StateVector + + mux sync.RWMutex + kv *versioned.KV +} + +// newSentTransfer generates a new SentTransfer with the specified transfer key, +// transfer ID, and parts. +func newSentTransfer(recipient *id.ID, key *ftCrypto.TransferKey, + tid *ftCrypto.TransferID, fileName string, fileSize uint32, parts [][]byte, + numFps uint16, kv *versioned.KV) (*SentTransfer, error) { + kv = kv.Prefix(makeSentTransferPrefix(tid)) + + // Create new cypher manager + cypherManager, err := cypher.NewManager(key, numFps, kv) + if err != nil { + return nil, errors.Errorf(errStNewCypherManager, err) + } + + // Create new state vector for storing statuses of arrived parts + partStatus, err := utility.NewStateVector( + kv, sentTransferStatusKey, uint32(len(parts))) + if err != nil { + return nil, errors.Errorf(errStNewPartStatusVector, err) + } + + st := &SentTransfer{ + cypherManager: cypherManager, + tid: tid, + fileName: fileName, + recipient: recipient, + fileSize: fileSize, + numParts: uint16(len(parts)), + status: Running, + parts: parts, + partStatus: partStatus, + kv: kv, + } + + return st, st.save() +} + +// GetUnsentParts builds a list of all unsent parts, each in a Part object. +func (st *SentTransfer) GetUnsentParts() []Part { + unusedPartNumbers := st.partStatus.GetUnusedKeyNums() + partList := make([]Part, len(unusedPartNumbers)) + + for i, partNum := range unusedPartNumbers { + partList[i] = Part{ + transfer: st, + cypherManager: st.cypherManager, + partNum: uint16(partNum), + } + } + + return partList +} + +// getPartData returns the part data from the given part number. +func (st *SentTransfer) getPartData(partNum uint16) []byte { + if int(partNum) > len(st.parts)-1 { + jww.FATAL.Panicf(errNoPartNum, partNum, st.tid, st.fileName) + } + + return st.parts[partNum] +} + +// markArrived marks the status of the given part numbers as arrived. When the +// last part is marked arrived, the transfer is marked as completed. +func (st *SentTransfer) markArrived(partNum uint16) { + st.mux.Lock() + defer st.mux.Unlock() + + st.partStatus.Use(uint32(partNum)) + + // Mark transfer completed if all parts arrived + if st.partStatus.GetNumUsed() == uint32(st.numParts) { + st.status = Completed + } +} + +// markTransferFailed sets the transfer as failed. Only call this if no more +// retries are available. +func (st *SentTransfer) markTransferFailed() { + st.mux.Lock() + defer st.mux.Unlock() + st.status = Failed +} + +// Status returns the status of the transfer. +func (st *SentTransfer) Status() TransferStatus { + st.mux.RLock() + defer st.mux.RUnlock() + return st.status +} + +// TransferID returns the transfer's ID. +func (st *SentTransfer) TransferID() *ftCrypto.TransferID { + return st.tid +} + +// FileName returns the transfer's file name. +func (st *SentTransfer) FileName() string { + return st.fileName +} + +// Recipient returns the transfer's recipient ID. +func (st *SentTransfer) Recipient() *id.ID { + return st.recipient +} + +// FileSize returns the size of the entire file transfer. +func (st *SentTransfer) FileSize() uint32 { + return st.fileSize +} + +// NumParts returns the total number of file parts in the transfer. +func (st *SentTransfer) NumParts() uint16 { + return st.numParts +} + +// NumArrived returns the number of parts that have arrived. +func (st *SentTransfer) NumArrived() uint16 { + return uint16(st.partStatus.GetNumUsed()) +} + +// CopyPartStatusVector returns a copy of the part status vector that can be +// used to look up the current status of parts. Note that the statuses are from +// when this function is called and not realtime. +func (st *SentTransfer) CopyPartStatusVector() *utility.StateVector { + return st.partStatus.DeepCopy() +} + +//////////////////////////////////////////////////////////////////////////////// +// Storage Functions // +//////////////////////////////////////////////////////////////////////////////// + +// loadSentTransfer loads the SentTransfer with the given transfer ID from +// storage. +func loadSentTransfer(tid *ftCrypto.TransferID, kv *versioned.KV) ( + *SentTransfer, error) { + kv = kv.Prefix(makeSentTransferPrefix(tid)) + + // Load cypher manager + cypherManager, err := cypher.LoadManager(kv) + if err != nil { + return nil, errors.Errorf(errStLoadCypherManager, err) + } + + // Load fileName, recipient ID, status, and file parts + obj, err := kv.Get(sentTransferStoreKey, sentTransferStoreVersion) + if err != nil { + return nil, errors.Errorf(errStLoadFields, err) + } + + fileName, recipient, status, parts, err := unmarshalSentTransfer(obj.Data) + if err != nil { + return nil, errors.Errorf(errStUnmarshalFields, err) + } + + // Load state vector for storing statuses of arrived parts + partStatus, err := utility.LoadStateVector(kv, sentTransferStatusKey) + if err != nil { + return nil, errors.Errorf(errStLoadPartStatusVector, err) + } + + st := &SentTransfer{ + cypherManager: cypherManager, + tid: tid, + fileName: fileName, + recipient: recipient, + fileSize: calcFileSize(parts), + numParts: uint16(len(parts)), + status: status, + parts: parts, + partStatus: partStatus, + kv: kv, + } + + return st, nil +} + +// calcFileSize calculates the size of the entire file from a list of parts. All +// parts, except the last, are assumed to have the same length. +func calcFileSize(parts [][]byte) uint32 { + lastPartSize := len(parts[len(parts)-1]) + otherPartsSize := len(parts[0]) * (len(parts) - 1) + return uint32(lastPartSize + otherPartsSize) +} + +// Delete deletes all data in the SentTransfer from storage. +func (st *SentTransfer) Delete() error { + st.mux.Lock() + defer st.mux.Unlock() + + // Delete cypher manager + err := st.cypherManager.Delete() + if err != nil { + return errors.Errorf(errStDeleteCypherManager, err) + } + + // Delete recipient ID, status, and file parts + err = st.kv.Delete(sentTransferStoreKey, sentTransferStoreVersion) + if err != nil { + return errors.Errorf(errStDeleteSentTransfer, err) + } + + // Delete part status multi state vector + err = st.partStatus.Delete() + if err != nil { + return errors.Errorf(errStDeletePartStatus, err) + } + + return nil +} + +// save stores all fields in SentTransfer that do not have their own storage +// (recipient ID, status, and file parts) to storage. +func (st *SentTransfer) save() error { + data, err := st.marshal() + if err != nil { + return errors.Errorf(errMarshalSentTransfer, err) + } + + obj := &versioned.Object{ + Version: sentTransferStoreVersion, + Timestamp: netTime.Now(), + Data: data, + } + + return st.kv.Set(sentTransferStoreKey, sentTransferStoreVersion, obj) +} + +// sentTransferDisk structure is used to marshal and unmarshal SentTransfer +// fields to/from storage. +type sentTransferDisk struct { + FileName string + Recipient *id.ID + Status TransferStatus + Parts [][]byte +} + +// marshal serialises the SentTransfer's fileName, recipient, status, and parts +// list. +func (st *SentTransfer) marshal() ([]byte, error) { + disk := sentTransferDisk{ + FileName: st.fileName, + Recipient: st.recipient, + Status: st.status, + Parts: st.parts, + } + + return json.Marshal(disk) +} + +// unmarshalSentTransfer deserializes the data into a fileName, recipient, +// status, and parts list. +func unmarshalSentTransfer(data []byte) (fileName string, recipient *id.ID, + status TransferStatus, parts [][]byte, err error) { + var disk sentTransferDisk + err = json.Unmarshal(data, &disk) + if err != nil { + return "", nil, 0, nil, err + } + + return disk.FileName, disk.Recipient, disk.Status, disk.Parts, nil +} + +// makeSentTransferPrefix generates the unique prefix used on the key value +// store to store sent transfers for the given transfer ID. +func makeSentTransferPrefix(tid *ftCrypto.TransferID) string { + return sentTransferStorePrefix + + base64.StdEncoding.EncodeToString(tid.Bytes()) +} diff --git a/fileTransfer2/store/sentTransfer_test.go b/fileTransfer2/store/sentTransfer_test.go new file mode 100644 index 0000000000000000000000000000000000000000..96d881c1f1f6ca15545be5f36c21779f1d730970 --- /dev/null +++ b/fileTransfer2/store/sentTransfer_test.go @@ -0,0 +1,496 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package store + +import ( + "bytes" + "fmt" + "gitlab.com/elixxir/client/fileTransfer2/store/cypher" + "gitlab.com/elixxir/client/fileTransfer2/store/fileMessage" + "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/client/storage/versioned" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/elixxir/ekv" + "gitlab.com/elixxir/primitives/format" + "gitlab.com/xx_network/crypto/csprng" + "gitlab.com/xx_network/primitives/id" + "reflect" + "strconv" + "testing" +) + +// Tests that newSentTransfer returns a new SentTransfer with the expected +// values. +func Test_newSentTransfer(t *testing.T) { + kv := versioned.NewKV(ekv.MakeMemstore()) + key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) + tid, _ := ftCrypto.NewTransferID(csprng.NewSystemRNG()) + numFps := uint16(24) + parts := [][]byte{[]byte("hello"), []byte("hello"), []byte("hello")} + stKv := kv.Prefix(makeSentTransferPrefix(&tid)) + + cypherManager, err := cypher.NewManager(&key, numFps, stKv) + if err != nil { + t.Errorf("Failed to make new cypher manager: %+v", err) + } + partStatus, err := utility.NewStateVector( + stKv, sentTransferStatusKey, uint32(len(parts))) + if err != nil { + t.Errorf("Failed to make new state vector: %+v", err) + } + + expected := &SentTransfer{ + cypherManager: cypherManager, + tid: &tid, + fileName: "file", + recipient: id.NewIdFromString("user", id.User, t), + fileSize: calcFileSize(parts), + numParts: uint16(len(parts)), + status: Running, + parts: parts, + partStatus: partStatus, + kv: stKv, + } + + st, err := newSentTransfer(expected.recipient, &key, &tid, + expected.fileName, expected.fileSize, parts, numFps, kv) + if err != nil { + t.Errorf("newSentTransfer returned an error: %+v", err) + } + + if !reflect.DeepEqual(expected, st) { + t.Errorf("New SentTransfer does not match expected."+ + "\nexpected: %+v\nreceived: %+v", expected, st) + } +} + +// Tests that SentTransfer.GetUnsentParts returns the correct number of unsent +// parts +func TestSentTransfer_GetUnsentParts(t *testing.T) { + numParts := uint16(10) + st, _, _, _, _ := newTestSentTransfer(numParts, t) + + // Check that all parts are returned after initialisation + unsentParts := st.GetUnsentParts() + if len(unsentParts) != int(numParts) { + t.Errorf("Number of unsent parts does not match original number of "+ + "parts when none have been sent.\nexpected: %d\nreceived: %d", + numParts, len(unsentParts)) + } + + // Ensure all parts have the proper part number + for i, p := range unsentParts { + if int(p.partNum) != i { + t.Errorf("Part has incorrect part number."+ + "\nexpected: %d\nreceived: %d", i, p.partNum) + } + } + + // Use every other part + for i := range unsentParts { + if i%2 == 0 { + unsentParts[i].MarkArrived() + } + } + + // Check that only have the number of parts is returned + unsentParts = st.GetUnsentParts() + if len(unsentParts) != int(numParts)/2 { + t.Errorf("Number of unsent parts is not half original number after "+ + "half have been marked as arrived.\nexpected: %d\nreceived: %d", + numParts/2, len(unsentParts)) + } + + // Ensure all parts have the proper part number + for i, p := range unsentParts { + if int(p.partNum) != i*2+1 { + t.Errorf("Part has incorrect part number."+ + "\nexpected: %d\nreceived: %d", i*2+1, p.partNum) + } + } + + // Use the rest of the parts + for i := range unsentParts { + unsentParts[i].MarkArrived() + } + + // Check that no sent parts are returned + unsentParts = st.GetUnsentParts() + if len(unsentParts) != 0 { + t.Errorf("Number of unsent parts is not zero after all have been "+ + "marked as arrived.\nexpected: %d\nreceived: %d", + 0, len(unsentParts)) + } +} + +// Tests that SentTransfer.getPartData returns all the correct parts at their +// expected indexes. +func TestSentTransfer_getPartData(t *testing.T) { + st, parts, _, _, _ := newTestSentTransfer(16, t) + + for i, part := range parts { + partData := st.getPartData(uint16(i)) + + if !bytes.Equal(part, partData) { + t.Errorf("Incorrect part #%d.\nexpected: %q\nreceived: %q", + i, part, partData) + } + } +} + +// Tests that SentTransfer.getPartData panics when the part number is not within +// the range of part numbers. +func TestSentTransfer_getPartData_OutOfRangePanic(t *testing.T) { + st, parts, _, _, _ := newTestSentTransfer(16, t) + + invalidPartNum := uint16(len(parts) + 1) + expectedErr := fmt.Sprintf(errNoPartNum, invalidPartNum, st.tid, st.fileName) + + defer func() { + r := recover() + if r == nil || r != expectedErr { + t.Errorf("getPartData did not return the expected error when the "+ + "part number %d is out of range.\nexpected: %s\nreceived: %+v", + invalidPartNum, expectedErr, r) + } + }() + + _ = st.getPartData(invalidPartNum) +} + +// Tests that after setting all parts as arrived via SentTransfer.markArrived, +// there are no unsent parts left and the transfer is marked as Completed. +func TestSentTransfer_markArrived(t *testing.T) { + st, parts, _, _, _ := newTestSentTransfer(16, t) + + // Mark all parts as arrived + for i := range parts { + st.markArrived(uint16(i)) + } + + // Check that all parts are marked as arrived + unsentParts := st.GetUnsentParts() + if len(unsentParts) != 0 { + t.Errorf("There are %d unsent parts.", len(unsentParts)) + } + + if st.status != Completed { + t.Errorf("Status not correctly marked.\nexpected: %s\nreceived: %s", + Completed, st.status) + } +} + +// Tests that SentTransfer.markTransferFailed changes the status of the transfer +// to Failed. +func TestSentTransfer_markTransferFailed(t *testing.T) { + st, _, _, _, _ := newTestSentTransfer(16, t) + + st.markTransferFailed() + + if st.status != Failed { + t.Errorf("Status not correctly marked.\nexpected: %s\nreceived: %s", + Failed, st.status) + } +} + +// Tests that SentTransfer.Status returns the correct status of the transfer. +func TestSentTransfer_Status(t *testing.T) { + st, parts, _, _, _ := newTestSentTransfer(16, t) + + // Check that it is Running + if st.Status() != Running { + t.Errorf("Status returned incorrect status.\nexpected: %s\nreceived: %s", + Running, st.Status()) + } + + // Mark all parts as arrived + for i := range parts { + st.markArrived(uint16(i)) + } + + // Check that it is Completed + if st.Status() != Completed { + t.Errorf("Status returned incorrect status.\nexpected: %s\nreceived: %s", + Completed, st.Status()) + } + + // Mark transfer failed + st.markTransferFailed() + + // Check that it is Failed + if st.Status() != Failed { + t.Errorf("Status returned incorrect status.\nexpected: %s\nreceived: %s", + Failed, st.Status()) + } +} + +// Tests that SentTransfer.TransferID returns the correct transfer ID. +func TestSentTransfer_TransferID(t *testing.T) { + st, _, _, _, _ := newTestSentTransfer(16, t) + + if st.TransferID() != st.tid { + t.Errorf("Incorrect transfer ID.\nexpected: %s\nreceived: %s", + st.tid, st.TransferID()) + } +} + +// Tests that SentTransfer.FileName returns the correct file name. +func TestSentTransfer_FileName(t *testing.T) { + st, _, _, _, _ := newTestSentTransfer(16, t) + + if st.FileName() != st.fileName { + t.Errorf("Incorrect transfer ID.\nexpected: %s\nreceived: %s", + st.fileName, st.FileName()) + } +} + +// Tests that SentTransfer.Recipient returns the correct recipient ID. +func TestSentTransfer_Recipient(t *testing.T) { + st, _, _, _, _ := newTestSentTransfer(16, t) + + if !st.Recipient().Cmp(st.recipient) { + t.Errorf("Incorrect recipient ID.\nexpected: %s\nreceived: %s", + st.recipient, st.Recipient()) + } +} + +// Tests that SentTransfer.FileSize returns the correct file size. +func TestSentTransfer_FileSize(t *testing.T) { + st, parts, _, _, _ := newTestSentTransfer(16, t) + fileSize := calcFileSize(parts) + + if st.FileSize() != fileSize { + t.Errorf("Incorrect file size.\nexpected: %d\nreceived: %d", + fileSize, st.FileSize()) + } +} + +// Tests that SentTransfer.NumParts returns the correct number of parts. +func TestSentTransfer_NumParts(t *testing.T) { + numParts := uint16(16) + st, _, _, _, _ := newTestSentTransfer(numParts, t) + + if st.NumParts() != numParts { + t.Errorf("Incorrect number of parts.\nexpected: %d\nreceived: %d", + numParts, st.NumParts()) + } +} + +// Tests that SentTransfer.NumArrived returns the correct number of arrived +// parts. +func TestSentTransfer_NumArrived(t *testing.T) { + st, parts, _, _, _ := newTestSentTransfer(16, t) + + if st.NumArrived() != 0 { + t.Errorf("Incorrect number of arrived parts."+ + "\nexpected: %d\nreceived: %d", 0, st.NumArrived()) + } + + // Mark all parts as arrived + for i := range parts { + st.markArrived(uint16(i)) + } + + if uint32(st.NumArrived()) != st.partStatus.GetNumKeys() { + t.Errorf("Incorrect number of arrived parts."+ + "\nexpected: %d\nreceived: %d", + uint32(st.NumArrived()), st.partStatus.GetNumKeys()) + } +} + +// Tests that the state vector returned by SentTransfer.CopyPartStatusVector +// has the same values as the original but is a copy. +func TestSentTransfer_CopyPartStatusVector(t *testing.T) { + st, _, _, _, _ := newTestSentTransfer(16, t) + + // Check that the vectors have the same unused parts + partStatus := st.CopyPartStatusVector() + if !reflect.DeepEqual( + partStatus.GetUnusedKeyNums(), st.partStatus.GetUnusedKeyNums()) { + t.Errorf("Copied part status does not match original."+ + "\nexpected: %v\nreceived: %v", + st.partStatus.GetUnusedKeyNums(), partStatus.GetUnusedKeyNums()) + } + + // Modify the state + st.markArrived(5) + + // Check that the copied state is different + if reflect.DeepEqual( + partStatus.GetUnusedKeyNums(), st.partStatus.GetUnusedKeyNums()) { + t.Errorf("Old copied part status matches new status."+ + "\nexpected: %v\nreceived: %v", + st.partStatus.GetUnusedKeyNums(), partStatus.GetUnusedKeyNums()) + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Storage Functions // +//////////////////////////////////////////////////////////////////////////////// + +// Tests that a SentTransfer loaded via loadSentTransfer matches the original. +func Test_loadSentTransfer(t *testing.T) { + st, _, _, _, kv := newTestSentTransfer(64, t) + + loadedSt, err := loadSentTransfer(st.tid, kv) + if err != nil { + t.Errorf("Failed to load SentTransfer: %+v", err) + } + + if !reflect.DeepEqual(st, loadedSt) { + t.Errorf("Loaded SentTransfer does not match original."+ + "\nexpected: %+v\nreceived: %+v", st, loadedSt) + } +} + +// Tests that SentTransfer.Delete deletes the storage backend of the +// SentTransfer and that it cannot be loaded again. +func TestSentTransfer_Delete(t *testing.T) { + st, _, _, _, kv := newTestSentTransfer(64, t) + + err := st.Delete() + if err != nil { + t.Errorf("Delete returned an error: %+v", err) + } + + _, err = loadSentTransfer(st.tid, kv) + if err == nil { + t.Errorf("Loaded sent transfer that was deleted.") + } +} + +// Tests that the fields saved by SentTransfer.save can be loaded from storage. +func TestSentTransfer_save(t *testing.T) { + st, _, _, _, _ := newTestSentTransfer(64, t) + + err := st.save() + if err != nil { + t.Errorf("save returned an error: %+v", err) + } + + _, err = st.kv.Get(sentTransferStoreKey, sentTransferStoreVersion) + if err != nil { + t.Errorf("Failed to load saved SentTransfer: %+v", err) + } +} + +// Tests that a SentTransfer marshalled via SentTransfer.marshal and +// unmarshalled via unmarshalSentTransfer matches the original. +func TestSentTransfer_marshal_unmarshalSentTransfer(t *testing.T) { + st := &SentTransfer{ + fileName: "transferName", + recipient: id.NewIdFromString("user", id.User, t), + status: Failed, + parts: [][]byte{[]byte("Message"), []byte("Part")}, + } + + data, err := st.marshal() + if err != nil { + t.Errorf("marshal returned an error: %+v", err) + } + + fileName, recipient, status, parts, err := unmarshalSentTransfer(data) + if err != nil { + t.Errorf("Failed to unmarshal SentTransfer: %+v", err) + } + + if st.fileName != fileName { + t.Errorf("Incorrect file name.\nexpected: %q\nreceived: %q", + st.fileName, fileName) + } + + if !st.recipient.Cmp(recipient) { + t.Errorf("Incorrect recipient.\nexpected: %s\nreceived: %s", + st.recipient, recipient) + } + + if status != status { + t.Errorf("Incorrect status.\nexpected: %s\nreceived: %s", + status, status) + } + + if !reflect.DeepEqual(st.parts, parts) { + t.Errorf("Incorrect parts.\nexpected: %q\nreceived: %q", + st.parts, parts) + } +} + +// Consistency test of makeSentTransferPrefix. +func Test_makeSentTransferPrefix_Consistency(t *testing.T) { + expectedPrefixes := []string{ + "SentFileTransferStore/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "SentFileTransferStore/AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "SentFileTransferStore/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "SentFileTransferStore/AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "SentFileTransferStore/BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "SentFileTransferStore/BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "SentFileTransferStore/BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "SentFileTransferStore/BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "SentFileTransferStore/CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "SentFileTransferStore/CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + } + + for i, expected := range expectedPrefixes { + tid := ftCrypto.TransferID{byte(i)} + prefix := makeSentTransferPrefix(&tid) + + if expected != prefix { + t.Errorf("Prefix #%d does not match expected."+ + "\nexpected: %q\nreceived: %q", i, expected, prefix) + } + } +} + +const numPrimeBytes = 512 + +// newTestSentTransfer creates a new SentTransfer for testing. +func newTestSentTransfer(numParts uint16, t *testing.T) (st *SentTransfer, + parts [][]byte, key *ftCrypto.TransferKey, numFps uint16, kv *versioned.KV) { + kv = versioned.NewKV(ekv.MakeMemstore()) + recipient := id.NewIdFromString("recipient", id.User, t) + keyTmp, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) + tid, _ := ftCrypto.NewTransferID(csprng.NewSystemRNG()) + numFps = 2 * numParts + fileName := "helloFile" + parts, file := generateTestParts(numParts) + + st, err := newSentTransfer( + recipient, &keyTmp, &tid, fileName, uint32(len(file)), parts, numFps, kv) + if err != nil { + t.Errorf("Failed to make new SentTransfer: %+v", err) + } + + return st, parts, &keyTmp, numFps, kv +} + +// generateTestParts generates a list of file parts of the correct size to be +// encrypted/decrypted. +func generateTestParts(numParts uint16) (parts [][]byte, file []byte) { + // Calculate part size + partSize := fileMessage.NewPartMessage( + format.NewMessage(numPrimeBytes).ContentsSize()).GetPartSize() + + // Create list of parts and fill + parts = make([][]byte, numParts) + var buff bytes.Buffer + buff.Grow(int(numParts) * partSize) + for i := range parts { + parts[i] = make([]byte, partSize) + copy(parts[i], "Hello "+strconv.Itoa(i)) + buff.Write(parts[i]) + } + + return parts, buff.Bytes() +} diff --git a/fileTransfer2/store/sent_test.go b/fileTransfer2/store/sent_test.go new file mode 100644 index 0000000000000000000000000000000000000000..e1b7556b6c62d59f17df86c6a8b74632094b7636 --- /dev/null +++ b/fileTransfer2/store/sent_test.go @@ -0,0 +1,283 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package store + +import ( + "bytes" + "fmt" + "gitlab.com/elixxir/client/storage/versioned" + ftCrypto "gitlab.com/elixxir/crypto/fileTransfer" + "gitlab.com/elixxir/ekv" + "gitlab.com/xx_network/crypto/csprng" + "gitlab.com/xx_network/primitives/id" + "reflect" + "sort" + "strconv" + "testing" +) + +// Tests that NewOrLoadSent returns a new Sent when none exist in storage and +// that the list of unsent parts is nil. +func TestNewOrLoadSent_New(t *testing.T) { + kv := versioned.NewKV(ekv.MakeMemstore()) + expected := &Sent{ + transfers: make(map[ftCrypto.TransferID]*SentTransfer), + kv: kv.Prefix(sentTransfersStorePrefix), + } + + s, unsentParts, err := NewOrLoadSent(kv) + if err != nil { + t.Errorf("NewOrLoadSent returned an error: %+v", err) + } + + if !reflect.DeepEqual(expected, s) { + t.Errorf("New Sent does not match expected."+ + "\nexpected: %+v\nreceived: %+v", expected, s) + } + + if unsentParts != nil { + t.Errorf("List of parts should be nil when not loading: %+v", + unsentParts) + } +} + +// Tests that NewOrLoadSent returns a loaded Sent when one exist in storage and +// that the list of unsent parts is correct. +func TestNewOrLoadSent_Load(t *testing.T) { + kv := versioned.NewKV(ekv.MakeMemstore()) + s, _, err := NewOrLoadSent(kv) + if err != nil { + t.Errorf("Failed to make new Sent: %+v", err) + } + var expectedUnsentParts []Part + + // Create and add transfers to map and save + for i := 0; i < 10; i++ { + key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) + tid, _ := ftCrypto.NewTransferID(csprng.NewSystemRNG()) + parts, file := generateTestParts(uint16(10 + i)) + st, err2 := s.AddTransfer( + id.NewIdFromString("recipient"+strconv.Itoa(i), id.User, t), + &key, &tid, "file"+strconv.Itoa(i), uint32(len(file)), parts, + uint16(2*(10+i))) + if err2 != nil { + t.Errorf("Failed to add transfer #%d: %+v", i, err2) + } + expectedUnsentParts = append(expectedUnsentParts, st.GetUnsentParts()...) + } + if err = s.save(); err != nil { + t.Errorf("Failed to make save filled Sent: %+v", err) + } + + // Load Sent + loadedSent, unsentParts, err := NewOrLoadSent(kv) + if err != nil { + t.Errorf("Failed to load Sent: %+v", err) + } + + // Check that the loaded Sent matches original + if !reflect.DeepEqual(s, loadedSent) { + t.Errorf("Loaded Sent does not match original."+ + "\nexpected: %v\nreceived: %v", s, loadedSent) + } + + sort.Slice(unsentParts, func(i, j int) bool { + switch bytes.Compare(unsentParts[i].TransferID()[:], + unsentParts[j].TransferID()[:]) { + case -1: + return true + case 1: + return false + default: + return unsentParts[i].partNum < unsentParts[j].partNum + } + }) + + sort.Slice(expectedUnsentParts, func(i, j int) bool { + switch bytes.Compare(expectedUnsentParts[i].TransferID()[:], + expectedUnsentParts[j].TransferID()[:]) { + case -1: + return true + case 1: + return false + default: + return expectedUnsentParts[i].partNum < expectedUnsentParts[j].partNum + } + }) + + // Check that the unsent parts matches expected + if !reflect.DeepEqual(expectedUnsentParts, unsentParts) { + t.Errorf("Incorrect unsent parts.\nexpected: %v\nreceived: %v", + expectedUnsentParts, unsentParts) + } +} + +// Tests that Sent.AddTransfer makes a new transfer and adds it to the list. +func TestSent_AddTransfer(t *testing.T) { + kv := versioned.NewKV(ekv.MakeMemstore()) + s, _, _ := NewOrLoadSent(kv) + + key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) + tid, _ := ftCrypto.NewTransferID(csprng.NewSystemRNG()) + parts, file := generateTestParts(10) + + st, err := s.AddTransfer(id.NewIdFromString("recipient", id.User, t), + &key, &tid, "file", uint32(len(file)), parts, 20) + if err != nil { + t.Errorf("Failed to add new transfer: %+v", err) + } + + // Check that the transfer was added + if _, exists := s.transfers[*st.tid]; !exists { + t.Errorf("No transfer with ID %s exists.", st.tid) + } +} + +// Tests that Sent.AddTransfer returns an error when adding a transfer ID that +// already exists. +func TestSent_AddTransfer_TransferAlreadyExists(t *testing.T) { + tid := ftCrypto.TransferID{0} + s := &Sent{ + transfers: map[ftCrypto.TransferID]*SentTransfer{tid: nil}, + } + + expectedErr := fmt.Sprintf(errAddExistingSentTransfer, tid) + _, err := s.AddTransfer(nil, nil, &tid, "", 0, nil, 0) + if err == nil || err.Error() != expectedErr { + t.Errorf("Received unexpected error when adding transfer that already "+ + "exists.\nexpected: %s\nreceived: %+v", expectedErr, err) + } +} + +// Tests that Sent.GetTransfer returns the expected transfer. +func TestSent_GetTransfer(t *testing.T) { + kv := versioned.NewKV(ekv.MakeMemstore()) + s, _, _ := NewOrLoadSent(kv) + + key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) + tid, _ := ftCrypto.NewTransferID(csprng.NewSystemRNG()) + parts, file := generateTestParts(10) + + st, err := s.AddTransfer(id.NewIdFromString("recipient", id.User, t), + &key, &tid, "file", uint32(len(file)), parts, 20) + if err != nil { + t.Errorf("Failed to add new transfer: %+v", err) + } + + // Check that the transfer was added + receivedSt, exists := s.GetTransfer(st.tid) + if !exists { + t.Errorf("No transfer with ID %s exists.", st.tid) + } + + if !reflect.DeepEqual(st, receivedSt) { + t.Errorf("Received SentTransfer does not match expected."+ + "\nexpected: %+v\nreceived: %+v", st, receivedSt) + } +} + +// Tests that Sent.RemoveTransfer removes the transfer from the list. +func TestSent_RemoveTransfer(t *testing.T) { + kv := versioned.NewKV(ekv.MakeMemstore()) + s, _, _ := NewOrLoadSent(kv) + + key, _ := ftCrypto.NewTransferKey(csprng.NewSystemRNG()) + tid, _ := ftCrypto.NewTransferID(csprng.NewSystemRNG()) + parts, file := generateTestParts(10) + + st, err := s.AddTransfer(id.NewIdFromString("recipient", id.User, t), + &key, &tid, "file", uint32(len(file)), parts, 20) + if err != nil { + t.Errorf("Failed to add new transfer: %+v", err) + } + + // Delete the transfer + err = s.RemoveTransfer(st.tid) + if err != nil { + t.Errorf("RemoveTransfer returned an error: %+v", err) + } + + // Check that the transfer was deleted + _, exists := s.GetTransfer(st.tid) + if exists { + t.Errorf("Transfer %s exists.", st.tid) + } + + // Remove transfer that was already removed + err = s.RemoveTransfer(st.tid) + if err != nil { + t.Errorf("RemoveTransfer returned an error: %+v", err) + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Storage Functions // +//////////////////////////////////////////////////////////////////////////////// + +// Tests that Sent.save saves the transfer ID list to storage by trying to load +// it after a save. +func TestSent_save(t *testing.T) { + kv := versioned.NewKV(ekv.MakeMemstore()) + s, _, _ := NewOrLoadSent(kv) + s.transfers = map[ftCrypto.TransferID]*SentTransfer{ + ftCrypto.TransferID{0}: nil, ftCrypto.TransferID{1}: nil, + ftCrypto.TransferID{2}: nil, ftCrypto.TransferID{3}: nil, + } + + err := s.save() + if err != nil { + t.Errorf("Failed to save transfer ID list: %+v", err) + } + + _, err = s.kv.Get(sentTransfersStoreKey, sentTransfersStoreVersion) + if err != nil { + t.Errorf("Failed to load transfer ID list: %+v", err) + } +} + +// Tests that the transfer IDs keys in the map marshalled by +// marshalSentTransfersMap and unmarshalled by unmarshalTransferIdList match the +// original. +func Test_marshalSentTransfersMap_unmarshalTransferIdList(t *testing.T) { + // Build map of transfer IDs + transfers := make(map[ftCrypto.TransferID]*SentTransfer, 10) + for i := 0; i < 10; i++ { + tid, _ := ftCrypto.NewTransferID(csprng.NewSystemRNG()) + transfers[tid] = nil + } + + data, err := marshalSentTransfersMap(transfers) + if err != nil { + t.Errorf("marshalSentTransfersMap returned an error: %+v", err) + } + + tidList, err := unmarshalTransferIdList(data) + if err != nil { + t.Errorf("unmarshalSentTransfer returned an error: %+v", err) + } + + for _, tid := range tidList { + if _, exists := transfers[tid]; exists { + delete(transfers, tid) + } else { + t.Errorf("Transfer %s does not exist in list.", tid) + } + } + + if len(transfers) != 0 { + t.Errorf("%d transfers not in unmarshalled list: %v", + len(transfers), transfers) + } +} diff --git a/fileTransfer2/store/transferStatus.go b/fileTransfer2/store/transferStatus.go new file mode 100644 index 0000000000000000000000000000000000000000..e8674b711f36a62f064548f1f9928598cf44aa8d --- /dev/null +++ b/fileTransfer2/store/transferStatus.go @@ -0,0 +1,64 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package store + +import ( + "encoding/binary" + "strconv" +) + +// TransferStatus indicates the state of the transfer. +type TransferStatus int + +const ( + // Running indicates that the transfer is in the processes of sending + Running TransferStatus = iota + + // Completed indicates that all file parts have been sent and arrived + Completed + + // Failed indicates that the transfer has run out of sending retries + Failed +) + +const invalidTransferStatusStringErr = "INVALID TransferStatus: " + +// String prints the string representation of the TransferStatus. This function +// satisfies the fmt.Stringer interface. +func (ts TransferStatus) String() string { + switch ts { + case Running: + return "running" + case Completed: + return "completed" + case Failed: + return "failed" + default: + return invalidTransferStatusStringErr + strconv.Itoa(int(ts)) + } +} + +// Marshal returns the byte representation of the TransferStatus. +func (ts TransferStatus) Marshal() []byte { + b := make([]byte, 8) + binary.LittleEndian.PutUint64(b, uint64(ts)) + return b +} + +// UnmarshalTransferStatus unmarshalls the 8-byte byte slice into a +// TransferStatus. +func UnmarshalTransferStatus(b []byte) TransferStatus { + return TransferStatus(binary.LittleEndian.Uint64(b)) +} diff --git a/fileTransfer2/store/transferStatus_test.go b/fileTransfer2/store/transferStatus_test.go new file mode 100644 index 0000000000000000000000000000000000000000..f87c666c5b5dbec24db6149314b7f339e88ce13c --- /dev/null +++ b/fileTransfer2/store/transferStatus_test.go @@ -0,0 +1,54 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package store + +import ( + "strconv" + "testing" +) + +// Tests that TransferStatus.String returns the expected string for each value +// of TransferStatus. +func Test_TransferStatus_String(t *testing.T) { + testValues := map[TransferStatus]string{ + Running: "running", + Completed: "completed", + Failed: "failed", + 100: invalidTransferStatusStringErr + strconv.Itoa(100), + } + + for status, expected := range testValues { + if expected != status.String() { + t.Errorf("TransferStatus string incorrect."+ + "\nexpected: %s\nreceived: %s", expected, status.String()) + } + } +} + +// Tests that a marshalled and unmarshalled TransferStatus matches the original. +func Test_TransferStatus_Marshal_UnmarshalTransferStatus(t *testing.T) { + testValues := []TransferStatus{Running, Completed, Failed} + + for _, status := range testValues { + marshalledStatus := status.Marshal() + + newStatus := UnmarshalTransferStatus(marshalledStatus) + + if status != newStatus { + t.Errorf("Marshalled and unmarshalled TransferStatus does not "+ + "match original.\nexpected: %s\nreceived: %s", status, newStatus) + } + } +} diff --git a/fileTransfer2/utils_test.go b/fileTransfer2/utils_test.go new file mode 100644 index 0000000000000000000000000000000000000000..cead9800a1ca549807ebf0e45fe92a60f277e921 --- /dev/null +++ b/fileTransfer2/utils_test.go @@ -0,0 +1,176 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package fileTransfer2 + +import ( + "bytes" + "encoding/binary" + jww "github.com/spf13/jwalterweatherman" + "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/primitives/format" + "gitlab.com/xx_network/primitives/id" + "gitlab.com/xx_network/primitives/id/ephemeral" + "io" + "math/rand" + "sync" + "testing" + "time" +) + +// newFile generates a file with random data of size numParts * partSize. +// Returns the full file and the file parts. If the partSize allows, each part +// starts with a "|<[PART_001]" and ends with a ">|". +func newFile(numParts uint16, partSize int, prng io.Reader, t *testing.T) ( + []byte, [][]byte) { + const ( + prefix = "|<[PART_%3d]" + suffix = ">|" + ) + // Create file buffer of the expected size + fileBuff := bytes.NewBuffer(make([]byte, 0, int(numParts)*partSize)) + partList := make([][]byte, numParts) + + // Create new rand.Rand with the seed generated from the io.Reader + b := make([]byte, 8) + _, err := prng.Read(b) + if err != nil { + t.Errorf("Failed to generate random seed: %+v", err) + } + seed := binary.LittleEndian.Uint64(b) + randPrng := rand.New(rand.NewSource(int64(seed))) + + for partNum := range partList { + s := RandStringBytes(partSize, randPrng) + if len(s) >= (len(prefix) + len(suffix)) { + partList[partNum] = []byte( + prefix + s[:len(s)-(len(prefix)+len(suffix))] + suffix) + } else { + partList[partNum] = []byte(s) + } + + fileBuff.Write(partList[partNum]) + } + + return fileBuff.Bytes(), partList +} + +const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + +// RandStringBytes generates a random string of length n consisting of the +// characters in letterBytes. +func RandStringBytes(n int, prng *rand.Rand) string { + b := make([]byte, n) + for i := range b { + b[i] = letterBytes[prng.Intn(len(letterBytes))] + } + return string(b) +} + +//////////////////////////////////////////////////////////////////////////////// +// Mock cMix Client // +//////////////////////////////////////////////////////////////////////////////// + +type mockCmixHandler struct { + sync.Mutex + processorMap map[format.Fingerprint]message.Processor +} + +func newMockCmixHandler() *mockCmixHandler { + return &mockCmixHandler{ + processorMap: make(map[format.Fingerprint]message.Processor), + } +} + +type mockCmix struct { + myID *id.ID + numPrimeBytes int + health bool + handler *mockCmixHandler + healthCBs map[uint64]func(b bool) + healthIndex uint64 + sync.Mutex +} + +func newMockCmix(myID *id.ID, handler *mockCmixHandler) *mockCmix { + return &mockCmix{ + myID: myID, + numPrimeBytes: 97, + // numPrimeBytes: 4096, + health: true, + handler: handler, + healthCBs: make(map[uint64]func(b bool)), + healthIndex: 0, + } +} + +func (m *mockCmix) GetMaxMessageLength() int { + msg := format.NewMessage(m.numPrimeBytes) + return msg.ContentsSize() +} + +func (m *mockCmix) SendMany(messages []cmix.TargetedCmixMessage, + _ cmix.CMIXParams) (id.Round, []ephemeral.Id, error) { + m.handler.Lock() + defer m.handler.Unlock() + for _, targetedMsg := range messages { + msg := format.NewMessage(m.numPrimeBytes) + msg.SetContents(targetedMsg.Payload) + msg.SetMac(targetedMsg.Mac) + msg.SetKeyFP(targetedMsg.Fingerprint) + m.handler.processorMap[targetedMsg.Fingerprint].Process(msg, + receptionID.EphemeralIdentity{Source: targetedMsg.Recipient}, + rounds.Round{ID: 42}) + } + return 42, []ephemeral.Id{}, nil +} + +func (m *mockCmix) AddFingerprint(_ *id.ID, fp format.Fingerprint, mp message.Processor) error { + m.handler.Lock() + defer m.handler.Unlock() + m.handler.processorMap[fp] = mp + return nil +} + +func (m *mockCmix) DeleteFingerprint(_ *id.ID, fp format.Fingerprint) { + m.handler.Lock() + defer m.handler.Unlock() + delete(m.handler.processorMap, fp) +} + +func (m *mockCmix) IsHealthy() bool { + return m.health +} + +func (m *mockCmix) WasHealthy() bool { return true } + +func (m *mockCmix) AddHealthCallback(f func(bool)) uint64 { + m.Lock() + defer m.Unlock() + m.healthIndex++ + m.healthCBs[m.healthIndex] = f + go f(true) + return m.healthIndex +} + +func (m *mockCmix) RemoveHealthCallback(healthID uint64) { + m.Lock() + defer m.Unlock() + if _, exists := m.healthCBs[healthID]; !exists { + jww.FATAL.Panicf("No health callback with ID %d exists.", healthID) + } + delete(m.healthCBs, healthID) +} + +func (m *mockCmix) GetRoundResults(_ time.Duration, + roundCallback cmix.RoundEventCallback, _ ...id.Round) error { + go roundCallback(true, false, map[id.Round]cmix.RoundResult{42: {}}) + return nil +} diff --git a/go.sum b/go.sum index 4a738e6d8a959874976a8053d6ffe015b5e1216d..c3aa45ee09d936b71b808d039ce87d0ea1bd0b5d 100644 --- a/go.sum +++ b/go.sum @@ -4,54 +4,89 @@ cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSR cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go/bigquery v1.0.1 h1:hL+ycaJpVE9M7nLoiXb/Pn10ENE2u+oddxbD8uu0ZVU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0 h1:Kt+gOPPp2LEPWp8CSfxhsM8ik9CcyE/gYu+0r+RnZvM= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/firestore v1.1.0 h1:9x7Bx0A9R5/M9jibeJeZWqjeVEIxYW9fZYqB9a70/bY= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1 h1:W9tAK3E57P75u0XLLR82LZyw8VpAnhmyTOxW9qzmyj8= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0 h1:VV2nUM3wwLLGh9lSABFgZMjInyUbJeaRSE64WuAIQ+4= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 h1:MzBOUgng9orim59UnfUTLRjMpd09C5uEVQ6RPGeCaVI= github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg= +github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310 h1:BUAU3CGlLvorLI26FmByPp2eC2qla6E1Tw+scpcg/to= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/badoux/checkmail v1.2.1 h1:TzwYx5pnsV6anJweMx2auXdekBwGr/yt1GgalIx9nBQ= github.com/badoux/checkmail v1.2.1/go.mod h1:XroCOBU5zzZJcLvgwU15I+2xXyCdTWXyR9MGfRhBYy0= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c h1:+0HFd5KSZ/mm3JmhmrDukiId5iR6w4+BdFtfSy4yWIc= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bwesterb/go-ristretto v1.2.0 h1:xxWOVbN5m8NNKiSDZXE1jtZvZnC6JSJ9cYFADiZcWtw= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/circl v1.1.0 h1:bZgT/A+cikZnKIwn7xL2OBj012Bmvho/o6RpRvv3GKY= github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4 h1:hzAQntlaYRkVSFEfj9OTWlVV1H155FMD8BTKktLv0QI= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1 h1:zH8ljVhhq7yC0MIeUL/IviMtY8hx2mK8cN9wEYb8ggw= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.13+incompatible h1:8F3hqu9fGYLBifCmRCJsicFqDx/D68Rt3q1JMazcgBQ= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.9 h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954 h1:RMLoZVzv4GliuWafOuPuQDKSm1SJph7uCRnnS61JAn4= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/elliotchance/orderedmap v1.4.0 h1:wZtfeEONCbx6in1CZyE6bELEt/vFayMvsxqI5SgsR+A= github.com/elliotchance/orderedmap v1.4.0/go.mod h1:wsDwEaX5jEoyhbs7x93zk2H/qv0zwuhg4inXhDkYqys= @@ -60,26 +95,38 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021 h1:fP+fF0up6oPY49OrjPrhIJ8yQfdIM85NXMLkMg1EXVs= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 h1:zN2lZNZRflqFyxVaTIU61KNKQ9C0055u9CAfpmqUvo4= github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3/go.mod h1:nPpo7qLxd6XL3hWJG/O60sR8ZKfMCiIoNap5GvD12KU= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -97,6 +144,7 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -105,58 +153,94 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f h1:Jnx61latede7zDD3DiiP4gmNz33uK0U5HDUaF0a/HVQ= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 h1:Iju5GlWwrvL6UBg4zJJt3btmonfrMlCDdsejg4CZE7c= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/consul/api v1.1.0 h1:BNQPM9ytxj6jbjjdRPioQ94T6YXriSopn0i8COv6SRA= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1 h1:LnuDWGNsoajlhGyHJvuWW6FVqRl8JOTPqS6CPTsYjhY= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0 h1:Rqb66Oo1X/eSV1x66xbDccZjhJigjg0+e82kpwzSwCI= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0 h1:WhIgCr5a7AaVH6jPUwjtRuuE7/RDufnUvzIr48smyxs= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3 h1:EmmoJme1matNzb+hMpDuR/0sbJSUisxyqBGG676r31M= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2 h1:YZ7UKsJv+hKjqGVUUbtE3HNj79Eln2oQ75tniF6iPt0= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024 h1:rBMNdlhTLzJjJSDIjNEXX1Pz3Hmwmz91v+zycvx9PJc= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0 h1:TDTW5Yz1mjftljbcKqRcrYhd4XeOoI98t+9HbQbYf7g= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0 h1:ZqfnKyx9KGpRcW04j5nnPDgRgoXUeLh2YFBeFzphcA0= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -166,28 +250,42 @@ github.com/liyue201/goqr v0.0.0-20200803022322-df443203d4ea/go.mod h1:w4pGU9PkiX github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY= github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0 h1:iGBIsUe3+HZ/AD/Vd7DErOt5sU9fa8Uj7A2s1aggv1Y= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0 h1:lfGJxY7ToLJQjHHwi0EX6uYBdK78egf954SQl13PQJc= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.0 h1:7ks8ZkOP5/ujthUsT07rNv+nkLXCQWKNHuwzOAesEks= github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223 h1:F9x/1yl3T2AeKLr2AMdilSD8+f9bvMnNN8VS5iDtovc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM= @@ -196,27 +294,41 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1 h1:VasscCm72135zRysgrJDKsntdmPN+OuU3+nnHYA9wyc= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1 h1:ccV59UEOTzVDnDUEFdT95ZzHVZ+5+158q8+SJb2QV5w= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzrgykg80hfFph1mryUeLRsUfoocVVmRY= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f h1:UFr9zpz4xgTnIE5yIMtWAMngCdZ9p/+q6lTbgelo80M= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= @@ -225,7 +337,9 @@ github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHei github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.5.1 h1:VHu76Lk0LSP1x254maIu2bplkWpfBWI+B+6fdoZprcg= @@ -245,6 +359,7 @@ github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5q github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -255,6 +370,7 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2 h1:5u+EJUQiosu3JFX0XS0qTf5FznsMOzTjGqavBGuCbo0= github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2/go.mod h1:4kyMkleCiLkgY6z8gK5BkI01ChBtxR0ro3I1ZDcGM3w= @@ -262,6 +378,7 @@ github.com/ttacon/libphonenumber v1.2.1 h1:fzOfY5zUADkCkbIafAed11gL1sW+bJ26p6zWL github.com/ttacon/libphonenumber v1.2.1/go.mod h1:E0TpmdVMq5dyVlQ7oenAkhsLu86OkUl+yR4OAxyEg/M= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/zeebo/assert v0.0.0-20181109011804-10f827ce2ed6/go.mod h1:yssERNPivllc1yU3BvpjYI5BUW+zglcz6QWqeVRL5t0= github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= @@ -362,19 +479,26 @@ gitlab.com/xx_network/primitives v0.0.0-20200804183002-f99f7a7284da/go.mod h1:OK gitlab.com/xx_network/primitives v0.0.2/go.mod h1:cs0QlFpdMDI6lAo61lDRH2JZz+3aVkHy+QogOB6F/qc= gitlab.com/xx_network/primitives v0.0.4-0.20220222211843-901fa4a2d72b h1:shZZ3xZNNKYVpEp4Mqu/G9+ZR+J8QA8mmPk/4Cit8+Y= 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 h1:F651DdbU9n5qOLN8rdyAIluXWtm5Wl4jwH5D6ED3bSI= gitlab.com/xx_network/primitives v0.0.4-0.20220324193139-b292d1ae6e7e/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 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/ratelimit v0.2.0 h1:UQE2Bgi7p2B85uP5dC2bbRtig0C+OeNRnNEafLjsLPA= go.uber.org/ratelimit v0.2.0/go.mod h1:YYBV4e4naJvhpitQrWJu1vCpgB7CboMe0qhltKt6mUg= +go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -395,8 +519,10 @@ golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136 h1:A1gGSx58LAGVHUUsOf7IiR0u8Xb6W51gRwfDBhkdcaw= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -404,10 +530,13 @@ golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTk golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0 h1:sfUMP1Gu8qASkorDVjnMuvgJzwFbTZSeXFiGBYAVdl4= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -432,11 +561,13 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -465,6 +596,7 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac h1:oN6lz7iLW/YC7un8pq+9bOLyXrprv2+DKfkJY+2LJJw= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -493,6 +625,7 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -502,10 +635,12 @@ google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEt google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0 h1:Q3Ui3V3/CVinFWFiW39Iw0kMuVrRzYX0wN6OPFp0lTA= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -548,16 +683,19 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -575,5 +713,7 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/groupChat/groupStore/store.go b/groupChat/groupStore/store.go index f180249e7917b38704b0027b012f3a118262d9f6..f2372be86f92e454dcd06320658d4beb11d69e4e 100644 --- a/groupChat/groupStore/store.go +++ b/groupChat/groupStore/store.go @@ -250,6 +250,19 @@ func (s *Store) GroupIDs() []*id.ID { return idList } +// Groups returns a list of all groups. +func (s *Store) Groups() []Group { + s.mux.RLock() + defer s.mux.RUnlock() + + groupList := make([]Group, 0, len(s.list)) + for _, g := range s.list { + groupList = append(groupList, g) + } + + return groupList +} + // Get returns the Group for the given group ID. Returns false if no Group is // found. func (s *Store) Get(groupID *id.ID) (Group, bool) { diff --git a/groupChat/groupStore/store_test.go b/groupChat/groupStore/store_test.go index 2f52d9a3106b9b032f48bee5815ca422241cac3a..a41439b730f46285f39f9a960e6fe6bd94bbce77 100644 --- a/groupChat/groupStore/store_test.go +++ b/groupChat/groupStore/store_test.go @@ -420,6 +420,32 @@ func TestStore_GroupIDs(t *testing.T) { } } +// Tests that Store.Groups returns a list with all the groups. +func TestStore_Groups(t *testing.T) { + prng := rand.New(rand.NewSource(42)) + store := Store{list: make(map[id.ID]Group, 10)} + expected := make([]Group, len(store.list)) + for i := range expected { + grp := createTestGroup(prng, t) + expected[i] = grp + store.list[*grp.ID] = grp + } + + groups := store.Groups() + + sort.Slice(expected, func(i, j int) bool { + return bytes.Compare(expected[i].ID[:], expected[j].ID[:]) == -1 + }) + sort.Slice(groups, func(i, j int) bool { + return bytes.Compare(groups[i].ID[:], groups[j].ID[:]) == -1 + }) + + if !reflect.DeepEqual(expected, groups) { + t.Errorf("List of Groups does not match expected."+ + "\nexpected: %+v\nreceived: %+v", expected, groups) + } +} + // Unit test of Store.Get. func TestStore_Get(t *testing.T) { prng := rand.New(rand.NewSource(42)) diff --git a/groupChat/group.go b/groupChat/interface.go similarity index 87% rename from groupChat/group.go rename to groupChat/interface.go index 8878a62cdf750823bd4c886fbfbfdca1ac81c13d..e9c71c51b0727167f97a63f05b8ab2a9f3d35d2a 100644 --- a/groupChat/group.go +++ b/groupChat/interface.go @@ -21,6 +21,7 @@ package groupChat import ( gs "gitlab.com/elixxir/client/groupChat/groupStore" + "gitlab.com/elixxir/crypto/group" "gitlab.com/xx_network/primitives/id" "time" ) @@ -52,7 +53,8 @@ type GroupChat interface { // Send sends a message to all GroupChat members using Client.SendManyCMIX. // The send fails if the message is too long. Returns the ID of the round // sent on and the timestamp of the message send. - Send(groupID *id.ID, message []byte) (id.Round, time.Time, error) + Send(groupID *id.ID, tag string, message []byte) ( + id.Round, time.Time, group.MessageID, error) // GetGroups returns a list of all registered GroupChat IDs. GetGroups() []*id.ID @@ -63,6 +65,15 @@ type GroupChat interface { // NumGroups returns the number of groups the user is a part of. NumGroups() int + + /* ===== Services ======================================================= */ + + // AddService adds a service for all group chat partners of the given tag, + // which will call back on the given processor. + AddService(tag string, p Processor) error + + // RemoveService removes all services for the given tag. + RemoveService(tag string) error } // RequestCallback is called when a GroupChat request is received. diff --git a/groupChat/makeGroup.go b/groupChat/makeGroup.go index dbf78d21d2b2286f2fa290c370d6693506d6393e..900221e423db1fca1249ac61d6f6e30ed313c8b1 100644 --- a/groupChat/makeGroup.go +++ b/groupChat/makeGroup.go @@ -8,6 +8,8 @@ package groupChat import ( + "strconv" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" gs "gitlab.com/elixxir/client/groupChat/groupStore" @@ -16,7 +18,6 @@ import ( "gitlab.com/elixxir/crypto/group" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" - "strconv" ) // Error messages. @@ -50,7 +51,7 @@ const ( // each member of the groupChat to add them to the groupChat. It blocks until // all the groupChat requests are sent. Returns an error if at least one request // to a member fails to send. -func (m Manager) MakeGroup(membership []*id.ID, name, msg []byte) (gs.Group, +func (m *manager) MakeGroup(membership []*id.ID, name, msg []byte) (gs.Group, []id.Round, RequestStatus, error) { // Return an error if the message is too long if len(msg) > MaxInitMessageSize { @@ -78,8 +79,8 @@ func (m Manager) MakeGroup(membership []*id.ID, name, msg []byte) (gs.Group, created := netTime.Now().Round(0) // Create new group and add to manager - g := gs.NewGroup( - name, groupID, groupKey, idPreimage, keyPreimage, msg, created, mem, dkl) + g := gs.NewGroup(name, groupID, groupKey, idPreimage, + keyPreimage, msg, created, mem, dkl) jww.DEBUG.Printf("[GC] Created new group %q with ID %s and %d members %s", g.Name, g.ID, len(g.Members), g.Members) @@ -96,7 +97,7 @@ func (m Manager) MakeGroup(membership []*id.ID, name, msg []byte) (gs.Group, // buildMembership retrieves the contact object for each member ID and creates a // new membership from them. The caller is set as the leader. For a member to be // added, the group leader must have an authenticated channel with the member. -func (m Manager) buildMembership(members []*id.ID) (group.Membership, +func (m *manager) buildMembership(members []*id.ID) (group.Membership, gs.DhKeyList, error) { // Return an error if the membership list has too few or too many members if len(members) < group.MinParticipants { diff --git a/groupChat/makeGroup_test.go b/groupChat/makeGroup_test.go index a9541b84471d9d35db12787731916d761f5294e7..b08b9766a3f8397bb37e3c8f896f05c236849bc0 100644 --- a/groupChat/makeGroup_test.go +++ b/groupChat/makeGroup_test.go @@ -25,10 +25,10 @@ import ( "testing" ) -// Tests that Manager.MakeGroup adds a group and returns the expected status. -func TestManager_MakeGroup(t *testing.T) { +// Tests that manager.MakeGroup adds a group and returns the expected status. +func Test_manager_MakeGroup(t *testing.T) { prng := rand.New(rand.NewSource(42)) - m, _ := newTestManagerWithStore(prng, 10, 0, nil, nil, t) + m, _ := newTestManagerWithStore(prng, 10, 0, nil, t) memberIDs, members, dkl := addPartners(m, t) name := []byte("groupName") message := []byte("Invite message.") @@ -76,9 +76,9 @@ func TestManager_MakeGroup(t *testing.T) { // Error path: make sure an error and the correct status is returned when the // message is too large. -func TestManager_MakeGroup_MaxMessageSizeError(t *testing.T) { +func Test_manager_MakeGroup_MaxMessageSizeError(t *testing.T) { prng := rand.New(rand.NewSource(42)) - m, _ := newTestManagerWithStore(prng, 10, 0, nil, nil, t) + m, _ := newTestManagerWithStore(prng, 10, 0, nil, t) expectedErr := fmt.Sprintf( maxInitMsgSizeErr, MaxInitMessageSize+1, MaxInitMessageSize) @@ -96,9 +96,9 @@ func TestManager_MakeGroup_MaxMessageSizeError(t *testing.T) { // Error path: make sure an error and the correct status is returned when the // membership list is too small. -func TestManager_MakeGroup_MembershipSizeError(t *testing.T) { +func Test_manager_MakeGroup_MembershipSizeError(t *testing.T) { prng := rand.New(rand.NewSource(42)) - m, _ := newTestManagerWithStore(prng, 10, 0, nil, nil, t) + m, _ := newTestManagerWithStore(prng, 10, 0, nil, t) expectedErr := fmt.Sprintf( maxMembersErr, group.MaxParticipants+1, group.MaxParticipants) @@ -117,9 +117,9 @@ func TestManager_MakeGroup_MembershipSizeError(t *testing.T) { // Error path: make sure an error and the correct status is returned when adding // a group failed because the user is a part of too many groups already. -func TestManager_MakeGroup_AddGroupError(t *testing.T) { +func Test_manager_MakeGroup_AddGroupError(t *testing.T) { prng := rand.New(rand.NewSource(42)) - m, _ := newTestManagerWithStore(prng, gs.MaxGroupChats, 0, nil, nil, t) + m, _ := newTestManagerWithStore(prng, gs.MaxGroupChats, 0, nil, t) memberIDs, _, _ := addPartners(m, t) expectedErr := strings.SplitN(joinGroupErr, "%", 2)[0] @@ -130,8 +130,8 @@ func TestManager_MakeGroup_AddGroupError(t *testing.T) { } } -// Unit test of Manager.buildMembership. -func TestManager_buildMembership(t *testing.T) { +// Unit test of manager.buildMembership. +func Test_manager_buildMembership(t *testing.T) { prng := rand.New(rand.NewSource(42)) m, _ := newTestManager(prng, t) memberIDs, expected, expectedDKL := addPartners(m, t) @@ -154,7 +154,7 @@ func TestManager_buildMembership(t *testing.T) { // Error path: an error is returned when the number of members in the membership // list is too few. -func TestManager_buildMembership_MinParticipantsError(t *testing.T) { +func Test_manager_buildMembership_MinParticipantsError(t *testing.T) { m, _ := newTestManager(rand.New(rand.NewSource(42)), t) memberIDs := make([]*id.ID, group.MinParticipants-1) expectedErr := fmt.Sprintf( @@ -169,7 +169,7 @@ func TestManager_buildMembership_MinParticipantsError(t *testing.T) { // Error path: an error is returned when the number of members in the membership // list is too many. -func TestManager_buildMembership_MaxParticipantsError(t *testing.T) { +func Test_manager_buildMembership_MaxParticipantsError(t *testing.T) { m, _ := newTestManager(rand.New(rand.NewSource(42)), t) memberIDs := make([]*id.ID, group.MaxParticipants+1) expectedErr := fmt.Sprintf( @@ -183,7 +183,7 @@ func TestManager_buildMembership_MaxParticipantsError(t *testing.T) { } // Error path: error returned when a partner cannot be found -func TestManager_buildMembership_GetPartnerContactError(t *testing.T) { +func Test_manager_buildMembership_GetPartnerContactError(t *testing.T) { prng := rand.New(rand.NewSource(42)) m, _ := newTestManager(prng, t) memberIDs, _, _ := addPartners(m, t) @@ -200,7 +200,7 @@ func TestManager_buildMembership_GetPartnerContactError(t *testing.T) { } // Error path: error returned when a member ID appears twice on the list. -func TestManager_buildMembership_DuplicateContactError(t *testing.T) { +func Test_manager_buildMembership_DuplicateContactError(t *testing.T) { prng := rand.New(rand.NewSource(42)) m, _ := newTestManager(prng, t) memberIDs, _, _ := addPartners(m, t) @@ -281,7 +281,7 @@ func TestRequestStatus_Message(t *testing.T) { // addPartners returns a list of user IDs and their matching membership and adds // them as partners. -func addPartners(m *Manager, t *testing.T) ([]*id.ID, group.Membership, +func addPartners(m *manager, t *testing.T) ([]*id.ID, group.Membership, gs.DhKeyList) { memberIDs := make([]*id.ID, 10) members := group.Membership{m.gs.GetUser()} @@ -296,13 +296,13 @@ func addPartners(m *Manager, t *testing.T) ([]*id.ID, group.Membership, prng := rand.New(rand.NewSource(int64(i + 42))) mySIDHPrivKey := util.NewSIDHPrivateKey(myVariant) mySIDHPubKey := util.NewSIDHPublicKey(myVariant) - mySIDHPrivKey.Generate(prng) + _ = mySIDHPrivKey.Generate(prng) mySIDHPrivKey.GeneratePublicKey(mySIDHPubKey) theirVariant := sidh.KeyVariant(sidh.KeyVariantSidhB) theirSIDHPrivKey := util.NewSIDHPrivateKey(theirVariant) theirSIDHPubKey := util.NewSIDHPublicKey(theirVariant) - theirSIDHPrivKey.Generate(prng) + _ = theirSIDHPrivKey.Generate(prng) theirSIDHPrivKey.GeneratePublicKey(theirSIDHPubKey) // Add to lists diff --git a/groupChat/manager.go b/groupChat/manager.go index a2572b0f9e9362a1a7e1698d783b1b71ba9972de..f040e6498a6c8bcfc40634e7e0f7cb023cf29ba3 100644 --- a/groupChat/manager.go +++ b/groupChat/manager.go @@ -8,6 +8,9 @@ package groupChat import ( + "sync" + "time" + "github.com/cloudflare/circl/dh/sidh" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" @@ -26,63 +29,74 @@ import ( "gitlab.com/elixxir/crypto/group" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/id/ephemeral" - "time" ) // Error messages. const ( - newGroupStoreErr = "failed to create new group store: %+v" - joinGroupErr = "failed to join new group %s: %+v" - leaveGroupErr = "failed to leave group %s: %+v" + // NewManager + newGroupStoreErr = "failed to create new group store: %+v" + errAddDefaultService = "could not add default service: %+v" + + // manager.JoinGroup + joinGroupErr = "failed to join new group %s: %+v" + + // manager.LeaveGroup + leaveGroupErr = "failed to leave group %s: %+v" ) -// GroupCmix is a subset of the cmix.Client interface containing only the methods needed by GroupChat +const defaultServiceTag = "default" + +// GroupCmix is a subset of the cmix.Client interface containing only the +// methods needed by GroupChat type GroupCmix interface { SendMany(messages []cmix.TargetedCmixMessage, p cmix.CMIXParams) ( id.Round, []ephemeral.Id, error) - AddService(clientID *id.ID, newService message.Service, - response message.Processor) - DeleteService(clientID *id.ID, toDelete message.Service, - processor message.Processor) + AddService( + clientID *id.ID, newService message.Service, response message.Processor) + DeleteService( + clientID *id.ID, toDelete message.Service, processor message.Processor) GetMaxMessageLength() int } -// GroupE2e is a subset of the e2e.Handler interface containing only the methods needed by GroupChat +// GroupE2e is a subset of the e2e.Handler interface containing only the methods +// needed by GroupChat type GroupE2e interface { SendE2E(mt catalog.MessageType, recipient *id.ID, payload []byte, params e2e.Params) ([]id.Round, crypto.MessageID, time.Time, error) - RegisterListener(senderID *id.ID, - messageType catalog.MessageType, + RegisterListener(senderID *id.ID, messageType catalog.MessageType, newListener receive.Listener) receive.ListenerID AddService(tag string, processor message.Processor) error - AddPartner(partnerID *id.ID, - partnerPubKey, myPrivKey *cyclic.Int, - partnerSIDHPubKey *sidh.PublicKey, - mySIDHPrivKey *sidh.PrivateKey, sendParams, - receiveParams session.Params) (partner.Manager, error) + AddPartner(partnerID *id.ID, partnerPubKey, myPrivKey *cyclic.Int, + partnerSIDHPubKey *sidh.PublicKey, mySIDHPrivKey *sidh.PrivateKey, + sendParams, receiveParams session.Params) (partner.Manager, error) GetPartner(partnerID *id.ID) (partner.Manager, error) GetHistoricalDHPubkey() *cyclic.Int GetHistoricalDHPrivkey() *cyclic.Int } -// Manager handles the list of groups a user is a part of. -type Manager struct { - e2e GroupE2e +// manager handles the list of groups a user is a part of. +type manager struct { + // Group storage + gs *gs.Store - receptionId *id.ID - rng *fastRNG.StreamGenerator - grp *cyclic.Group - gs *gs.Store - services GroupCmix + // List of registered processors + services map[string]Processor + servicesMux sync.Mutex + // Callback that is called when a new group request is received requestFunc RequestCallback - receiveFunc ReceiveCallback + + receptionId *id.ID + net GroupCmix + e2e GroupE2e + grp *cyclic.Group + rng *fastRNG.StreamGenerator } // NewManager creates a new group chat manager func NewManager(services GroupCmix, e2e GroupE2e, receptionId *id.ID, rng *fastRNG.StreamGenerator, grp *cyclic.Group, kv *versioned.KV, - requestFunc RequestCallback, receiveFunc ReceiveCallback) (*Manager, error) { + requestFunc RequestCallback, receiveFunc Processor) (GroupChat, error) { // Load the group chat storage or create one if one does not exist gStore, err := gs.NewOrLoadStore( @@ -92,15 +106,15 @@ func NewManager(services GroupCmix, e2e GroupE2e, receptionId *id.ID, } // Define the manager object - m := &Manager{ - e2e: e2e, - rng: rng, - receptionId: receptionId, - grp: grp, + m := &manager{ gs: gStore, - services: services, + services: make(map[string]Processor), requestFunc: requestFunc, - receiveFunc: receiveFunc, + receptionId: receptionId, + net: services, + e2e: e2e, + grp: grp, + rng: rng, } // Register listener for incoming e2e group chat requests @@ -113,15 +127,9 @@ func NewManager(services GroupCmix, e2e GroupE2e, receptionId *id.ID, return nil, err } - // Register all groups - for _, gId := range m.GetGroups() { - g, exists := m.GetGroup(gId) - if !exists { - jww.WARN.Printf("[GC] Unexpected failure to locate GroupID %s", gId) - continue - } - - m.joinGroup(g) + err = m.AddService(defaultServiceTag, receiveFunc) + if err != nil { + return nil, errors.Errorf(errAddDefaultService, err) } return m, nil @@ -130,56 +138,44 @@ func NewManager(services GroupCmix, e2e GroupE2e, receptionId *id.ID, // JoinGroup adds the group to storage, and enables requisite services. // An error is returned if the user is already part of the group or if the // maximum number of groups have already been joined. -func (m Manager) JoinGroup(g gs.Group) error { +func (m *manager) JoinGroup(g gs.Group) error { if err := m.gs.Add(g); err != nil { return errors.Errorf(joinGroupErr, g.ID, err) } - m.joinGroup(g) + // Add all services for this group + m.addAllServices(g) + jww.INFO.Printf("[GC] Joined group %q with ID %s.", g.Name, g.ID) return nil } -// joinGroup adds the group services -func (m Manager) joinGroup(g gs.Group) { - newService := message.Service{ - Identifier: g.ID[:], - Tag: catalog.Group, - Metadata: g.ID[:], - } - m.services.AddService(m.receptionId, newService, &receptionProcessor{&m, g}) -} - // LeaveGroup removes a group from a list of groups the user is a part of. -func (m Manager) LeaveGroup(groupID *id.ID) error { +func (m *manager) LeaveGroup(groupID *id.ID) error { if err := m.gs.Remove(groupID); err != nil { return errors.Errorf(leaveGroupErr, groupID, err) } - delService := message.Service{ - Identifier: groupID.Bytes(), - Tag: catalog.Group, - } - m.services.DeleteService(m.receptionId, delService, nil) + m.deleteAllServices(groupID) jww.INFO.Printf("[GC] Left group with ID %s.", groupID) return nil } // GetGroups returns a list of all registered groupChat IDs. -func (m Manager) GetGroups() []*id.ID { +func (m *manager) GetGroups() []*id.ID { jww.DEBUG.Print("[GC] Getting list of all groups.") return m.gs.GroupIDs() } // GetGroup returns the group with the matching ID or returns false if none // exist. -func (m Manager) GetGroup(groupID *id.ID) (gs.Group, bool) { +func (m *manager) GetGroup(groupID *id.ID) (gs.Group, bool) { jww.DEBUG.Printf("[GC] Getting group with ID %s.", groupID) return m.gs.Get(groupID) } // NumGroups returns the number of groups the user is a part of. -func (m Manager) NumGroups() int { +func (m *manager) NumGroups() int { return m.gs.Len() } diff --git a/groupChat/manager_test.go b/groupChat/manager_test.go index 95eb620337bc040dd53543c809b2d005211b4490..374062ea83700854b222aaea55d70483304c8d30 100644 --- a/groupChat/manager_test.go +++ b/groupChat/manager_test.go @@ -8,10 +8,15 @@ package groupChat import ( + "gitlab.com/elixxir/client/cmix" + "gitlab.com/elixxir/client/cmix/identity/receptionID" + "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/client/e2e" gs "gitlab.com/elixxir/client/groupChat/groupStore" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/crypto/group" "gitlab.com/elixxir/ekv" + "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" "math/rand" "reflect" @@ -20,8 +25,25 @@ import ( "time" ) -// Unit test of Manager.newManager. -func Test_newManager(t *testing.T) { +// Tests that manager adheres to the GroupChat interface. +var _ GroupChat = (*manager)(nil) + +// Tests that GroupCmix adheres to the cmix.Client interface. +var _ GroupCmix = (cmix.Client)(nil) + +// Tests that GroupE2e adheres to the e2e.Handler interface. +var _ GroupE2e = (e2e.Handler)(nil) + +type mockProcessor struct{ receiveChan chan MessageReceive } + +func (m mockProcessor) Process(msg MessageReceive, _ format.Message, + _ receptionID.EphemeralIdentity, _ rounds.Round) { + m.receiveChan <- msg +} +func (m mockProcessor) String() string { return "mockProcessor" } + +// Unit test of NewManager. +func TestNewManager(t *testing.T) { kv := versioned.NewKV(ekv.MakeMemstore()) user := group.Member{ ID: id.NewIdFromString("userID", id.User, t), @@ -30,19 +52,21 @@ func Test_newManager(t *testing.T) { requestChan := make(chan gs.Group) requestFunc := func(g gs.Group) { requestChan <- g } receiveChan := make(chan MessageReceive) - receiveFunc := func(msg MessageReceive) { receiveChan <- msg } - m, err := NewManager(nil, newTestE2eManager(user.DhKey), user.ID, nil, nil, kv, requestFunc, receiveFunc) + gcInt, err := NewManager(nil, newTestE2eManager(user.DhKey), user.ID, nil, + nil, kv, requestFunc, mockProcessor{receiveChan}) if err != nil { - t.Errorf("newManager() returned an error: %+v", err) + t.Errorf("NewManager returned an error: %+v", err) } + m := gcInt.(*manager) + if !m.gs.GetUser().Equal(user) { - t.Errorf("newManager() failed to create a store with the correct user."+ + t.Errorf("NewManager failed to create a store with the correct user."+ "\nexpected: %s\nreceived: %s", user, m.gs.GetUser()) } if m.gs.Len() != 0 { - t.Errorf("newManager() failed to create an empty store."+ + t.Errorf("NewManager failed to create an empty store."+ "\nexpected: %d\nreceived: %d", 0, m.gs.Len()) } @@ -53,18 +77,10 @@ func Test_newManager(t *testing.T) { case <-time.NewTimer(5 * time.Millisecond).C: t.Errorf("Timed out waiting for requestFunc to be called.") } - - // Check if receiveFunc works - go m.receiveFunc(MessageReceive{}) - select { - case <-receiveChan: - case <-time.NewTimer(5 * time.Millisecond).C: - t.Errorf("Timed out waiting for receiveFunc to be called.") - } } -// Tests that Manager.newManager loads a group storage when it exists. -func Test_newManager_LoadStorage(t *testing.T) { +// Tests that NewManager loads a group storage when it exists. +func TestNewManager_LoadStorage(t *testing.T) { prng := rand.New(rand.NewSource(42)) kv := versioned.NewKV(ekv.MakeMemstore()) user := group.Member{ @@ -78,25 +94,29 @@ func Test_newManager_LoadStorage(t *testing.T) { } for i := 0; i < 10; i++ { - err := gStore.Add(newTestGroup(getGroup(), getGroup().NewInt(42), prng, t)) + err := gStore.Add( + newTestGroup(getGroup(), getGroup().NewInt(42), prng, t)) if err != nil { t.Errorf("Failed to add group %d: %+v", i, err) } } - m, err := NewManager(newTestNetworkManager(0, t), newTestE2eManager(user.DhKey), user.ID, nil, nil, kv, nil, nil) + gcInt, err := NewManager(newTestNetworkManager(0, t), + newTestE2eManager(user.DhKey), user.ID, nil, nil, kv, nil, nil) if err != nil { - t.Errorf("newManager() returned an error: %+v", err) + t.Errorf("NewManager returned an error: %+v", err) } + m := gcInt.(*manager) + if !reflect.DeepEqual(gStore, m.gs) { - t.Errorf("newManager() failed to load the expected storage."+ + t.Errorf("NewManager failed to load the expected storage."+ "\nexpected: %+v\nreceived: %+v", gStore, m.gs) } } // Error path: an error is returned when a group cannot be loaded from storage. -func Test_newManager_LoadError(t *testing.T) { +func TestNewManager_LoadError(t *testing.T) { prng := rand.New(rand.NewSource(42)) kv := versioned.NewKV(ekv.MakeMemstore()) user := group.Member{ @@ -120,7 +140,7 @@ func Test_newManager_LoadError(t *testing.T) { _, err = NewManager(nil, newTestE2eManager(user.DhKey), user.ID, nil, nil, kv, nil, nil) if err == nil || !strings.Contains(err.Error(), expectedErr) { - t.Errorf("newManager() did not return the expected error."+ + t.Errorf("NewManager did not return the expected error."+ "\nexpected: %s\nreceived: %+v", expectedErr, err) } } @@ -129,7 +149,7 @@ func Test_newManager_LoadError(t *testing.T) { // user. To fix this test, they need to use different users, which requires // modifying // storage.InitTestingSession. -// func TestManager_StartProcesses(t *testing.T) { +// func Test_manager_StartProcesses(t *testing.T) { // jww.SetLogThreshold(jww.LevelTrace) // jww.SetStdoutThreshold(jww.LevelTrace) // prng := rand.New(rand.NewSource(42)) @@ -270,67 +290,67 @@ func Test_newManager_LoadError(t *testing.T) { // } // } -// Unit test of Manager.JoinGroup. -func TestManager_JoinGroup(t *testing.T) { +// Unit test of manager.JoinGroup. +func Test_manager_JoinGroup(t *testing.T) { prng := rand.New(rand.NewSource(42)) - m, _ := newTestManagerWithStore(prng, 10, 0, nil, nil, t) + m, _ := newTestManagerWithStore(prng, 10, 0, nil, t) g := newTestGroup(m.grp, m.e2e.GetHistoricalDHPubkey(), prng, t) err := m.JoinGroup(g) if err != nil { - t.Errorf("JoinGroup() returned an error: %+v", err) + t.Errorf("JoinGroup returned an error: %+v", err) } if _, exists := m.gs.Get(g.ID); !exists { - t.Errorf("JoinGroup() failed to add the group %s.", g.ID) + t.Errorf("JoinGroup failed to add the group %s.", g.ID) } } // Error path: an error is returned when a group is joined twice. -func TestManager_JoinGroup_AddErr(t *testing.T) { +func Test_manager_JoinGroup_AddError(t *testing.T) { prng := rand.New(rand.NewSource(42)) - m, g := newTestManagerWithStore(prng, 10, 0, nil, nil, t) + m, g := newTestManagerWithStore(prng, 10, 0, nil, t) expectedErr := strings.SplitN(joinGroupErr, "%", 2)[0] err := m.JoinGroup(g) if err == nil || !strings.Contains(err.Error(), expectedErr) { - t.Errorf("JoinGroup() failed to return the expected error."+ + t.Errorf("JoinGroup failed to return the expected error."+ "\nexpected: %s\nreceived: %+v", expectedErr, err) } } -// Unit test of Manager.LeaveGroup. -func TestManager_LeaveGroup(t *testing.T) { +// Unit test of manager.LeaveGroup. +func Test_manager_LeaveGroup(t *testing.T) { prng := rand.New(rand.NewSource(42)) - m, g := newTestManagerWithStore(prng, 10, 0, nil, nil, t) + m, g := newTestManagerWithStore(prng, 10, 0, nil, t) err := m.LeaveGroup(g.ID) if err != nil { - t.Errorf("LeaveGroup() returned an error: %+v", err) + t.Errorf("LeaveGroup returned an error: %+v", err) } if _, exists := m.GetGroup(g.ID); exists { - t.Error("LeaveGroup() failed to delete the group.") + t.Error("LeaveGroup failed to delete the group.") } } -// Error path: an error is returned when no group with the ID exists -func TestManager_LeaveGroup_NoGroupError(t *testing.T) { +// Error path: an error is returned when no group with the ID exists. +func Test_manager_LeaveGroup_NoGroupError(t *testing.T) { prng := rand.New(rand.NewSource(42)) - m, _ := newTestManagerWithStore(prng, 10, 0, nil, nil, t) + m, _ := newTestManagerWithStore(prng, 10, 0, nil, t) expectedErr := strings.SplitN(leaveGroupErr, "%", 2)[0] err := m.LeaveGroup(id.NewIdFromString("invalidID", id.Group, t)) if err == nil || !strings.Contains(err.Error(), expectedErr) { - t.Errorf("LeaveGroup() failed to return the expected error."+ + t.Errorf("LeaveGroup failed to return the expected error."+ "\nexpected: %s\nreceived: %+v", expectedErr, err) } } -// Unit test of Manager.GetGroups. -func TestManager_GetGroups(t *testing.T) { +// Unit test of manager.GetGroups. +func Test_manager_GetGroups(t *testing.T) { prng := rand.New(rand.NewSource(42)) - m, _ := newTestManagerWithStore(prng, 10, 0, nil, nil, t) + m, _ := newTestManagerWithStore(prng, 10, 0, nil, t) list := m.GetGroups() for i, gid := range list { @@ -340,39 +360,38 @@ func TestManager_GetGroups(t *testing.T) { } if m.gs.Len() != 0 { - t.Errorf("GetGroups() returned %d IDs, which is %d less than is in "+ + t.Errorf("GetGroups returned %d IDs, which is %d less than is in "+ "memory.", len(list), m.gs.Len()) } } -// Unit test of Manager.GetGroup. -func TestManager_GetGroup(t *testing.T) { +// Unit test of manager.GetGroup. +func Test_manager_GetGroup(t *testing.T) { prng := rand.New(rand.NewSource(42)) - m, g := newTestManagerWithStore(prng, 10, 0, nil, nil, t) + m, g := newTestManagerWithStore(prng, 10, 0, nil, t) testGrp, exists := m.GetGroup(g.ID) if !exists { - t.Error("GetGroup() failed to find a group that should exist.") + t.Error("GetGroup failed to find a group that should exist.") } if !reflect.DeepEqual(g, testGrp) { - t.Errorf("GetGroup() failed to return the expected group."+ + t.Errorf("GetGroup failed to return the expected group."+ "\nexpected: %#v\nreceived: %#v", g, testGrp) } testGrp, exists = m.GetGroup(id.NewIdFromString("invalidID", id.Group, t)) if exists { - t.Errorf("GetGroup() returned a group that should not exist: %#v", testGrp) + t.Errorf("GetGroup returned a group that should not exist: %#v", testGrp) } } -// Unit test of Manager.NumGroups. First a manager is created with 10 groups +// Unit test of manager.NumGroups. First a manager is created with 10 groups // and the initial number is checked. Then the number of groups is checked after // leaving each until the number left is 0. -func TestManager_NumGroups(t *testing.T) { +func Test_manager_NumGroups(t *testing.T) { expectedNum := 10 - m, _ := newTestManagerWithStore(rand.New(rand.NewSource(42)), expectedNum, - 0, nil, nil, t) + m, _ := newTestManagerWithStore(rand.New(rand.NewSource(42)), expectedNum, 0, nil, t) groups := append([]*id.ID{{}}, m.GetGroups()...) @@ -380,10 +399,9 @@ func TestManager_NumGroups(t *testing.T) { _ = m.LeaveGroup(gid) if m.NumGroups() != expectedNum-i { - t.Errorf("NumGroups() failed to return the expected number of "+ + t.Errorf("NumGroups failed to return the expected number of "+ "groups (%d).\nexpected: %d\nreceived: %d", i, expectedNum-i, m.NumGroups()) } } - } diff --git a/groupChat/messageReceive.go b/groupChat/messageReceive.go index fa883e73e052ea5c54d9ce0d9af5082073debe95..c605d7860b096d82411ef5d1ba2b3c9e1604968e 100644 --- a/groupChat/messageReceive.go +++ b/groupChat/messageReceive.go @@ -11,8 +11,6 @@ import ( "fmt" "gitlab.com/elixxir/crypto/group" "gitlab.com/xx_network/primitives/id" - "gitlab.com/xx_network/primitives/id/ephemeral" - "strconv" "strings" "time" ) @@ -20,15 +18,11 @@ import ( // MessageReceive contains the GroupChat message and associated data that a user // receives when getting a group message. type MessageReceive struct { - GroupID *id.ID - ID group.MessageID - Payload []byte - SenderID *id.ID - RecipientID *id.ID - EphemeralID ephemeral.Id - Timestamp time.Time - RoundID id.Round - RoundTimestamp time.Time + GroupID *id.ID + ID group.MessageID + Payload []byte + SenderID *id.ID + Timestamp time.Time } // String returns the MessageReceive as readable text. This functions adheres to @@ -49,21 +43,12 @@ func (mr MessageReceive) String() string { senderID = mr.SenderID.String() } - recipientID := "<nil>" - if mr.RecipientID != nil { - recipientID = mr.RecipientID.String() - } - str := []string{ "GroupID:" + groupID, "ID:" + mr.ID.String(), "Payload:" + payload, "SenderID:" + senderID, - "RecipientID:" + recipientID, - "EphemeralID:" + strconv.FormatInt(mr.EphemeralID.Int64(), 10), "Timestamp:" + mr.Timestamp.String(), - "RoundID:" + strconv.FormatUint(uint64(mr.RoundID), 10), - "RoundTimestamp:" + mr.RoundTimestamp.String(), } return "{" + strings.Join(str, " ") + "}" diff --git a/groupChat/messageReceive_test.go b/groupChat/messageReceive_test.go index 343f53774a08e59caed53a37d31a1a35f7047cd7..701890bcedd5476d529f3dd1d2e42a31e0e979ce 100644 --- a/groupChat/messageReceive_test.go +++ b/groupChat/messageReceive_test.go @@ -9,7 +9,6 @@ package groupChat import ( "gitlab.com/elixxir/crypto/group" "gitlab.com/xx_network/primitives/id" - "gitlab.com/xx_network/primitives/id/ephemeral" "testing" "time" ) @@ -17,15 +16,11 @@ import ( // Unit test of MessageReceive.String. func TestMessageReceive_String(t *testing.T) { msg := MessageReceive{ - GroupID: id.NewIdFromString("GroupID", id.Group, t), - ID: group.MessageID{0, 1, 2, 3}, - Payload: []byte("Group message."), - SenderID: id.NewIdFromString("SenderID", id.User, t), - RecipientID: id.NewIdFromString("RecipientID", id.User, t), - EphemeralID: ephemeral.Id{0, 1, 2, 3}, - Timestamp: time.Date(1955, 11, 5, 12, 0, 0, 0, time.UTC), - RoundID: 42, - RoundTimestamp: time.Date(1955, 11, 5, 12, 1, 0, 0, time.UTC), + GroupID: id.NewIdFromString("GroupID", id.Group, t), + ID: group.MessageID{0, 1, 2, 3}, + Payload: []byte("Group message."), + SenderID: id.NewIdFromString("SenderID", id.User, t), + Timestamp: time.Date(1955, 11, 5, 12, 0, 0, 0, time.UTC), } expected := "{" + @@ -33,11 +28,7 @@ func TestMessageReceive_String(t *testing.T) { "ID:AAECAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= " + "Payload:\"Group message.\" " + "SenderID:U2VuZGVySUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD " + - "RecipientID:UmVjaXBpZW50SUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD " + - "EphemeralID:141843442434048 " + - "Timestamp:" + msg.Timestamp.String() + " " + - "RoundID:42 " + - "RoundTimestamp:" + msg.RoundTimestamp.String() + + "Timestamp:" + msg.Timestamp.String() + "}" if msg.String() != expected { @@ -56,11 +47,7 @@ func TestMessageReceive_String_NilMessageReceive(t *testing.T) { "ID:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= " + "Payload:<nil> " + "SenderID:<nil> " + - "RecipientID:<nil> " + - "EphemeralID:0 " + - "Timestamp:0001-01-01 00:00:00 +0000 UTC " + - "RoundID:0 " + - "RoundTimestamp:0001-01-01 00:00:00 +0000 UTC" + + "Timestamp:0001-01-01 00:00:00 +0000 UTC" + "}" if msg.String() != expected { diff --git a/groupChat/processor.go b/groupChat/processor.go new file mode 100644 index 0000000000000000000000000000000000000000..fa115755751a6e5d6a989c9456895220ec5336ef --- /dev/null +++ b/groupChat/processor.go @@ -0,0 +1,26 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package groupChat + +import ( + "fmt" + "gitlab.com/elixxir/client/cmix/identity/receptionID" + "gitlab.com/elixxir/client/cmix/rounds" + "gitlab.com/elixxir/primitives/format" +) + +// Processor manages the handling of received group chat messages. +type Processor interface { + // Process decrypts and hands off the message to its internal down stream + // message processing system. + Process(decryptedMsg MessageReceive, msg format.Message, + receptionID receptionID.EphemeralIdentity, round rounds.Round) + + // Stringer interface for debugging. + fmt.Stringer +} diff --git a/groupChat/receive.go b/groupChat/receive.go index e9682b119b72b9f25c67358323a051cafe1d7835..56f8d56fd76cb2461b0612ee3492812596463e89 100644 --- a/groupChat/receive.go +++ b/groupChat/receive.go @@ -26,62 +26,66 @@ const ( newDecryptKeyErr = "failed to generate key for decrypting group payload: %+v" unmarshalInternalMsgErr = "failed to unmarshal group internal message: %+v" unmarshalSenderIdErr = "failed to unmarshal sender ID: %+v" - unmarshalPublicMsgErr = "[GC] Failed to unmarshal group cMix message contents: %+v" + unmarshalPublicMsgErr = "[GC] Failed to unmarshal group cMix message contents from %d (%s) on round %d: %+v" + getDecryptionKeyErr = "[GC] Unable to get decryption key: %+v" + decryptMsgErr = "[GC] Failed to decrypt group message: %+v" genCryptKeyMacErr = "failed to generate encryption key for group " + "cMix message because MAC verification failed (epoch %d could be off)" ) -// Adheres to cmix.Manager interface for reception processing +// Adheres to message.Processor interface for reception processing. type receptionProcessor struct { - m *Manager + m *manager g gs.Group + p Processor } -// Process incoming group chat messages +// Process incoming group chat messages. func (p *receptionProcessor) Process(message format.Message, receptionID receptionID.EphemeralIdentity, round rounds.Round) { - jww.TRACE.Print("[GC] Group message reception received cMix message.") - // Attempt to read the message - roundTimestamp := round.Timestamps[states.QUEUED] + jww.TRACE.Printf("[GC] Received group message from %d (%s) on round %d.", + receptionID.EphId.Int64(), receptionID.Source, round.ID) // Unmarshal cMix message contents to get public message format pubMsg, err := unmarshalPublicMsg(message.GetContents()) if err != nil { - jww.WARN.Printf(unmarshalPublicMsgErr, err) + jww.ERROR.Printf(unmarshalPublicMsgErr, receptionID.EphId.Int64(), + receptionID.Source, round.ID, err) + return } - // Obtain the cryptKey for the public message + // Obtain the decryption key for the public message key, err := getCryptKey(p.g.Key, pubMsg.GetSalt(), message.GetMac(), - pubMsg.GetPayload(), p.g.DhKeys, roundTimestamp) + pubMsg.GetPayload(), p.g.DhKeys, round.Timestamps[states.QUEUED]) if err != nil { - jww.WARN.Printf("[GC] Unable to getCryptKey: %+v", err) + jww.ERROR.Printf(getDecryptionKeyErr, err) return } // Decrypt the message payload using the cryptKey - result, err := decryptMessage(p.g, message.GetKeyFP(), key, pubMsg.GetPayload()) + result, err := decryptMessage( + p.g, message.GetKeyFP(), key, pubMsg.GetPayload()) if err != nil { - jww.WARN.Printf("[GC] Group message reception failed to read "+ - "cMix message: %+v", err) + jww.ERROR.Printf(decryptMsgErr, err) return } + // Populate remaining fields from the top level result.GroupID = p.g.ID - result.RecipientID = receptionID.Source - result.EphemeralID = receptionID.EphId - result.RoundID = round.ID - result.RoundTimestamp = roundTimestamp jww.DEBUG.Printf("[GC] Received group message with ID %s from sender "+ - "%s in group %s with ID %s at %s.", result.ID, result.SenderID, + "%s in group %q with ID %s at %s.", result.ID, result.SenderID, p.g.Name, p.g.ID, result.Timestamp) - // If the message was read correctly, send it to the callback - p.m.receiveFunc(result) + // Send the decrypted message and original message to the processor + p.p.Process(result, message, receptionID, round) } func (p *receptionProcessor) String() string { - return fmt.Sprintf("GroupChatReception(%s)", p.m.receptionId) + if p.p == nil { + return fmt.Sprintf("GroupChatReception(%s)", p.m.receptionId) + } + return fmt.Sprintf("GroupChatReception(%s)-%s", p.m.receptionId, p.p) } // decryptMessage decrypts the group message payload and returns its message ID, diff --git a/groupChat/receiveRequest.go b/groupChat/receiveRequest.go index a2e648d8befc6ecb242743828cd374c99b67fd20..d76744315edf613ca05cb5efbdfba889e7cfadd9 100644 --- a/groupChat/receiveRequest.go +++ b/groupChat/receiveRequest.go @@ -27,7 +27,7 @@ const ( // Adheres to receive.Listener interface type requestListener struct { - m *Manager + m *manager } // Hear waits for new group requests to arrive @@ -42,8 +42,7 @@ func (l *requestListener) Hear(item receive.Message) { return } - // Call request callback with the new group if it does not already - // exist + // Call request callback with the new group if it does not already exist if _, exists := l.m.GetGroup(g.ID); !exists { jww.INFO.Printf( "[GC] Received group request for group %s with ID %s.", g.Name, g.ID) @@ -59,7 +58,7 @@ func (l *requestListener) Name() string { // readRequest returns the group described in the group request message. An // error is returned if the request is of the wrong type or cannot be read. -func (m *Manager) readRequest(msg receive.Message) (gs.Group, error) { +func (m *manager) readRequest(msg receive.Message) (gs.Group, error) { // Return an error if the message is not of the right type if msg.MessageType != catalog.GroupCreationRequest { return gs.Group{}, errors.New(sendMessageTypeErr) diff --git a/groupChat/receiveRequest_test.go b/groupChat/receiveRequest_test.go index 398de2f495a348b2f34323cadee1d060074834e0..04ba441bf308d2e68ab20985630b36c2a65a4b00 100644 --- a/groupChat/receiveRequest_test.go +++ b/groupChat/receiveRequest_test.go @@ -27,7 +27,7 @@ func TestRequestListener_Hear(t *testing.T) { prng := rand.New(rand.NewSource(42)) requestChan := make(chan gs.Group) requestFunc := func(g gs.Group) { requestChan <- g } - m, _ := newTestManagerWithStore(prng, 10, 0, requestFunc, nil, t) + m, _ := newTestManagerWithStore(prng, 10, 0, requestFunc, t) g := newTestGroupWithUser(m.grp, m.receptionId, m.e2e.GetHistoricalDHPubkey(), m.e2e.GetHistoricalDHPrivkey(), prng, t) @@ -54,13 +54,13 @@ func TestRequestListener_Hear(t *testing.T) { myVariant := sidh.KeyVariantSidhA mySIDHPrivKey := util.NewSIDHPrivateKey(myVariant) mySIDHPubKey := util.NewSIDHPublicKey(myVariant) - mySIDHPrivKey.Generate(prng) + _ = mySIDHPrivKey.Generate(prng) mySIDHPrivKey.GeneratePublicKey(mySIDHPubKey) theirVariant := sidh.KeyVariant(sidh.KeyVariantSidhB) theirSIDHPrivKey := util.NewSIDHPrivateKey(theirVariant) theirSIDHPubKey := util.NewSIDHPublicKey(theirVariant) - theirSIDHPrivKey.Generate(prng) + _ = theirSIDHPrivKey.Generate(prng) theirSIDHPrivKey.GeneratePublicKey(theirSIDHPubKey) _, _ = m.e2e.AddPartner( @@ -91,7 +91,7 @@ func TestRequestListener_Hear_GroupExists(t *testing.T) { prng := rand.New(rand.NewSource(42)) requestChan := make(chan gs.Group) requestFunc := func(g gs.Group) { requestChan <- g } - m, g := newTestManagerWithStore(prng, 10, 0, requestFunc, nil, t) + m, g := newTestManagerWithStore(prng, 10, 0, requestFunc, t) requestMarshaled, err := proto.Marshal(&Request{ Name: g.Name, @@ -127,7 +127,7 @@ func TestRequestListener_Hear_BadMessageType(t *testing.T) { prng := rand.New(rand.NewSource(42)) requestChan := make(chan gs.Group) requestFunc := func(g gs.Group) { requestChan <- g } - m, _ := newTestManagerWithStore(prng, 10, 0, requestFunc, nil, t) + m, _ := newTestManagerWithStore(prng, 10, 0, requestFunc, t) msg := receive.Message{ MessageType: catalog.NoType, @@ -146,20 +146,20 @@ func TestRequestListener_Hear_BadMessageType(t *testing.T) { } // Unit test of readRequest. -func TestManager_readRequest(t *testing.T) { +func Test_manager_readRequest(t *testing.T) { prng := rand.New(rand.NewSource(42)) m, g := newTestManager(prng, t) myVariant := sidh.KeyVariantSidhA mySIDHPrivKey := util.NewSIDHPrivateKey(myVariant) mySIDHPubKey := util.NewSIDHPublicKey(myVariant) - mySIDHPrivKey.Generate(prng) + _ = mySIDHPrivKey.Generate(prng) mySIDHPrivKey.GeneratePublicKey(mySIDHPubKey) theirVariant := sidh.KeyVariant(sidh.KeyVariantSidhB) theirSIDHPrivKey := util.NewSIDHPrivateKey(theirVariant) theirSIDHPubKey := util.NewSIDHPublicKey(theirVariant) - theirSIDHPrivKey.Generate(prng) + _ = theirSIDHPrivKey.Generate(prng) theirSIDHPrivKey.GeneratePublicKey(theirSIDHPubKey) _, _ = m.e2e.AddPartner( @@ -200,7 +200,7 @@ func TestManager_readRequest(t *testing.T) { } // Error path: an error is returned if the message type is incorrect. -func TestManager_readRequest_MessageTypeError(t *testing.T) { +func Test_manager_readRequest_MessageTypeError(t *testing.T) { m, _ := newTestManager(rand.New(rand.NewSource(42)), t) expectedErr := sendMessageTypeErr msg := receive.Message{ @@ -215,7 +215,7 @@ func TestManager_readRequest_MessageTypeError(t *testing.T) { } // Error path: an error is returned if the proto message cannot be unmarshalled. -func TestManager_readRequest_ProtoUnmarshalError(t *testing.T) { +func Test_manager_readRequest_ProtoUnmarshalError(t *testing.T) { expectedErr := strings.SplitN(deserializeMembershipErr, "%", 2)[0] m, _ := newTestManager(rand.New(rand.NewSource(42)), t) @@ -239,7 +239,7 @@ func TestManager_readRequest_ProtoUnmarshalError(t *testing.T) { } // Error path: an error is returned if the membership cannot be deserialized. -func TestManager_readRequest_DeserializeMembershipError(t *testing.T) { +func Test_manager_readRequest_DeserializeMembershipError(t *testing.T) { m, _ := newTestManager(rand.New(rand.NewSource(42)), t) expectedErr := strings.SplitN(protoUnmarshalErr, "%", 2)[0] msg := receive.Message{ diff --git a/groupChat/send.go b/groupChat/send.go index 95dc2bb2b9f9c690c004c6f5780ecfedd685d2f2..9bed53b763ba45278ca9bd3abc37877fb155acd1 100644 --- a/groupChat/send.go +++ b/groupChat/send.go @@ -10,7 +10,6 @@ package groupChat import ( "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/catalog" "gitlab.com/elixxir/client/cmix" "gitlab.com/elixxir/client/cmix/message" gs "gitlab.com/elixxir/client/groupChat/groupStore" @@ -25,22 +24,34 @@ import ( // Error messages. const ( - newCmixMsgErr = "failed to generate cMix messages for group chat: %+v" - sendManyCmixErr = "failed to send group chat message from member %s to group %s: %+v" - messageLenErr = "message length %d is greater than maximum message space %d" - newNoGroupErr = "failed to create message for group %s that cannot be found" - newKeyErr = "failed to generate key for encrypting group payload" + + // manager.Send + newNoGroupErr = "no group found with ID %s" + newCmixMsgErr = "failed to generate cMix messages for group chat %q (%s): %+v" + sendManyCmixErr = "failed to send group chat message from member %s to group %q (%s): %+v" + + // newCmixMsg + messageLenErr = "message length %d is greater than maximum payload size %d" + newKeyErr = "failed to generate key for encrypting group payload" + + // newMessageParts newPublicMsgErr = "failed to create new public group message for cMix message: %+v" newInternalMsgErr = "failed to create new internal group message for cMix message: %+v" + + // newSalt saltReadErr = "failed to generate salt for group message: %+v" saltReadLengthErr = "length of generated salt %d != %d required" ) // Send sends a message to all group members using Client.SendMany. // The send fails if the message is too long. -func (m *Manager) Send(groupID *id.ID, message []byte) ( +func (m *manager) Send(groupID *id.ID, tag string, message []byte) ( id.Round, time.Time, group.MessageID, error) { + if tag == "" { + tag = defaultServiceTag + } + // Get the relevant group g, exists := m.GetGroup(groupID) if !exists { @@ -52,10 +63,10 @@ func (m *Manager) Send(groupID *id.ID, message []byte) ( timeNow := netTime.Now().Round(0) // Create a cMix message for each group member - groupMessages, err := m.newMessages(g, message, timeNow) + groupMessages, err := m.newMessages(g, tag, message, timeNow) if err != nil { return 0, time.Time{}, group.MessageID{}, - errors.Errorf(newCmixMsgErr, err) + errors.Errorf(newCmixMsgErr, g.Name, g.ID, err) } // Obtain message ID @@ -68,10 +79,10 @@ func (m *Manager) Send(groupID *id.ID, message []byte) ( // Send all the groupMessages param := cmix.GetDefaultCMIXParams() param.DebugTag = "group.Message" - rid, _, err := m.services.SendMany(groupMessages, param) + rid, _, err := m.net.SendMany(groupMessages, param) if err != nil { return 0, time.Time{}, group.MessageID{}, - errors.Errorf(sendManyCmixErr, m.receptionId, groupID, err) + errors.Errorf(sendManyCmixErr, m.receptionId, g.Name, g.ID, err) } jww.DEBUG.Printf("[GC] Sent message to %d members in group %s at %s.", @@ -79,10 +90,9 @@ func (m *Manager) Send(groupID *id.ID, message []byte) ( return rid, timeNow, msgId, nil } -// newMessages quickly builds messages for all group chat members in multiple -// threads. -func (m *Manager) newMessages(g gs.Group, msg []byte, timestamp time.Time) ( - []cmix.TargetedCmixMessage, error) { +// newMessages builds a list of messages, one for each group chat member. +func (m *manager) newMessages(g gs.Group, tag string, msg []byte, + timestamp time.Time) ([]cmix.TargetedCmixMessage, error) { // Create list of cMix messages messages := make([]cmix.TargetedCmixMessage, 0, len(g.Members)) @@ -97,8 +107,8 @@ func (m *Manager) newMessages(g gs.Group, msg []byte, timestamp time.Time) ( } // Add cMix message to list - cMixMsg, err := newCmixMsg(g, msg, timestamp, member, rng, - m.receptionId, m.services.GetMaxMessageLength()) + cMixMsg, err := newCmixMsg(g, tag, msg, timestamp, member, rng, + m.receptionId, m.net.GetMaxMessageLength()) if err != nil { return nil, err } @@ -108,9 +118,10 @@ func (m *Manager) newMessages(g gs.Group, msg []byte, timestamp time.Time) ( return messages, nil } -// newCmixMsg generates a new cMix message to be sent to a group member. -func newCmixMsg(g gs.Group, msg []byte, timestamp time.Time, mem group.Member, - rng io.Reader, senderId *id.ID, maxCmixMessageSize int) ( +// newCmixMsg generates a new cmix.TargetedCmixMessage for the given group +// member +func newCmixMsg(g gs.Group, tag string, msg []byte, timestamp time.Time, + mem group.Member, rng io.Reader, senderId *id.ID, maxCmixMessageSize int) ( cmix.TargetedCmixMessage, error) { // Initialize targeted message @@ -118,7 +129,7 @@ func newCmixMsg(g gs.Group, msg []byte, timestamp time.Time, mem group.Member, Recipient: mem.ID, Service: message.Service{ Identifier: g.ID[:], - Tag: catalog.Group, + Tag: makeServiceTag(tag), Metadata: g.ID[:], }, } @@ -165,7 +176,7 @@ func newCmixMsg(g gs.Group, msg []byte, timestamp time.Time, mem group.Member, return cmixMsg, nil } -// Build the group message ID +// getGroupMessageId builds the group message ID. func getGroupMessageId(grp *cyclic.Group, groupId, senderId *id.ID, timestamp time.Time, msg []byte) (group.MessageID, error) { cmixMsg := format.NewMessage(grp.GetP().ByteLen()) diff --git a/groupChat/sendRequests.go b/groupChat/sendRequests.go index 1d31cf837ff179f24bad6a7c31e3db3b9300e76b..dca54c2c951523d6b8af49064f78352d5116ab8b 100644 --- a/groupChat/sendRequests.go +++ b/groupChat/sendRequests.go @@ -30,7 +30,7 @@ const ( ) // ResendRequest allows a groupChat request to be sent again. -func (m Manager) ResendRequest(groupID *id.ID) ([]id.Round, RequestStatus, error) { +func (m *manager) ResendRequest(groupID *id.ID) ([]id.Round, RequestStatus, error) { g, exists := m.GetGroup(groupID) if !exists { return nil, NotSent, errors.Errorf(resendGroupIdErr, groupID) @@ -43,7 +43,7 @@ func (m Manager) ResendRequest(groupID *id.ID) ([]id.Round, RequestStatus, error // sendRequests sends group requests to each member in the group except for the // leader/sender -func (m Manager) sendRequests(g gs.Group) ([]id.Round, RequestStatus, error) { +func (m *manager) sendRequests(g gs.Group) ([]id.Round, RequestStatus, error) { // Build request message requestMarshaled, err := proto.Marshal(&Request{ Name: g.Name, @@ -115,7 +115,7 @@ func (m Manager) sendRequests(g gs.Group) ([]id.Round, RequestStatus, error) { } // sendRequest sends the group request to the user via E2E. -func (m Manager) sendRequest(memberID *id.ID, request []byte) ([]id.Round, error) { +func (m *manager) sendRequest(memberID *id.ID, request []byte) ([]id.Round, error) { p := e2e.GetDefaultParams() p.LastServiceTag = catalog.GroupRq p.DebugTag = "group.Request" diff --git a/groupChat/sendRequests_test.go b/groupChat/sendRequests_test.go index 6951f49b12ee258a59a120bdfadd507300bd109b..b87e70adbe46899862a6f7ebd304df42076e50b2 100644 --- a/groupChat/sendRequests_test.go +++ b/groupChat/sendRequests_test.go @@ -23,10 +23,10 @@ import ( "testing" ) -// Tests that Manager.ResendRequest sends all expected requests successfully. -func TestManager_ResendRequest(t *testing.T) { +// Tests that manager.ResendRequest sends all expected requests successfully. +func Test_manager_ResendRequest(t *testing.T) { prng := rand.New(rand.NewSource(42)) - m, g := newTestManagerWithStore(prng, 10, 0, nil, nil, t) + m, g := newTestManagerWithStore(prng, 10, 0, nil, t) expected := &Request{ Name: g.Name, @@ -102,9 +102,9 @@ func TestManager_ResendRequest(t *testing.T) { // Error path: an error is returned when no group with the corresponding group // ID exists. -func TestManager_ResendRequest_GetGroupError(t *testing.T) { +func Test_manager_ResendRequest_GetGroupError(t *testing.T) { prng := rand.New(rand.NewSource(42)) - m, _ := newTestManagerWithStore(prng, 10, 0, nil, nil, t) + m, _ := newTestManagerWithStore(prng, 10, 0, nil, t) expectedErr := strings.SplitN(resendGroupIdErr, "%", 2)[0] _, status, err := m.ResendRequest(id.NewIdFromString("invalidID", id.Group, t)) @@ -119,10 +119,10 @@ func TestManager_ResendRequest_GetGroupError(t *testing.T) { } } -// Tests that Manager.sendRequests sends all expected requests successfully. -func TestManager_sendRequests(t *testing.T) { +// Tests that manager.sendRequests sends all expected requests successfully. +func Test_manager_sendRequests(t *testing.T) { prng := rand.New(rand.NewSource(42)) - m, g := newTestManagerWithStore(prng, 10, 0, nil, nil, t) + m, g := newTestManagerWithStore(prng, 10, 0, nil, t) expected := &Request{ Name: g.Name, @@ -196,11 +196,11 @@ func TestManager_sendRequests(t *testing.T) { } } -// Tests that Manager.sendRequests returns the correct status when all sends +// Tests that manager.sendRequests returns the correct status when all sends // fail. -func TestManager_sendRequests_SendAllFail(t *testing.T) { +func Test_manager_sendRequests_SendAllFail(t *testing.T) { prng := rand.New(rand.NewSource(42)) - m, g := newTestManagerWithStore(prng, 10, 1, nil, nil, t) + m, g := newTestManagerWithStore(prng, 10, 1, nil, t) expectedErr := fmt.Sprintf(sendRequestAllErr, len(g.Members)-1, "") rounds, status, err := m.sendRequests(g) @@ -225,11 +225,11 @@ func TestManager_sendRequests_SendAllFail(t *testing.T) { } } -// Tests that Manager.sendRequests returns the correct status when some sends +// Tests that manager.sendRequests returns the correct status when some sends // fail. -func TestManager_sendRequests_SendPartialSent(t *testing.T) { +func Test_manager_sendRequests_SendPartialSent(t *testing.T) { prng := rand.New(rand.NewSource(42)) - m, g := newTestManagerWithStore(prng, 10, 2, nil, nil, t) + m, g := newTestManagerWithStore(prng, 10, 2, nil, t) expectedErr := fmt.Sprintf(sendRequestPartialErr, (len(g.Members)-1)/2, len(g.Members)-1, "") @@ -267,10 +267,10 @@ func TestManager_sendRequests_SendPartialSent(t *testing.T) { } } -// Unit test of Manager.sendRequest. -func TestManager_sendRequest(t *testing.T) { +// Unit test of manager.sendRequest. +func Test_manager_sendRequest(t *testing.T) { prng := rand.New(rand.NewSource(42)) - m, g := newTestManagerWithStore(prng, 10, 0, nil, nil, t) + m, g := newTestManagerWithStore(prng, 10, 0, nil, t) for i := range g.Members { grp := m.grp @@ -307,9 +307,9 @@ func TestManager_sendRequest(t *testing.T) { } // Error path: an error is returned when SendE2E fails -func TestManager_sendRequest_SendE2eError(t *testing.T) { +func Test_manager_sendRequest_SendE2eError(t *testing.T) { prng := rand.New(rand.NewSource(42)) - m, _ := newTestManagerWithStore(prng, 10, 1, nil, nil, t) + m, _ := newTestManagerWithStore(prng, 10, 1, nil, t) expectedErr := strings.SplitN(sendE2eErr, "%", 2)[0] recipientID := id.NewIdFromString("memberID", id.User, t) diff --git a/groupChat/send_test.go b/groupChat/send_test.go index 72d98232909c7d10f401e7805b0be4ef52393765..bad4858985f742c681d090d92d5137b4e5bfd66f 100644 --- a/groupChat/send_test.go +++ b/groupChat/send_test.go @@ -17,6 +17,7 @@ import ( "gitlab.com/elixxir/primitives/format" "gitlab.com/elixxir/primitives/states" "gitlab.com/xx_network/primitives/id" + "gitlab.com/xx_network/primitives/id/ephemeral" "gitlab.com/xx_network/primitives/netTime" "math/rand" "strings" @@ -24,29 +25,27 @@ import ( "time" ) -func TestManager_Send(t *testing.T) { - receiveChan := make(chan MessageReceive, 100) - receiveFunc := func(msg MessageReceive) { - receiveChan <- msg - } +func Test_manager_Send(t *testing.T) { + msgChan := make(chan MessageReceive, 10) prng := rand.New(rand.NewSource(42)) - m, g := newTestManagerWithStore(prng, 1, 0, nil, receiveFunc, t) + m, g := newTestManagerWithStore(prng, 1, 0, nil, t) messageBytes := []byte("Group chat message.") reception := &receptionProcessor{ m: m, g: g, + p: &testProcessor{msgChan}, } - roundId, _, msgId, err := m.Send(g.ID, messageBytes) + roundId, _, msgId, err := m.Send(g.ID, "", messageBytes) if err != nil { - t.Errorf("Send() returned an error: %+v", err) + t.Errorf("Send returned an error: %+v", err) } - // get messages sent with or return an error if no messages were sent + // Get messages sent with or return an error if no messages were sent var messages []format.Message - if len(m.services.(*testNetworkManager).receptionMessages) > 0 { - messages = m.services.(*testNetworkManager).receptionMessages[0] + if len(m.net.(*testNetworkManager).receptionMessages) > 0 { + messages = m.net.(*testNetworkManager).receptionMessages[0] } else { t.Error("No group cMix messages received.") } @@ -54,9 +53,12 @@ func TestManager_Send(t *testing.T) { timestamps := make(map[states.Round]time.Time) timestamps[states.QUEUED] = netTime.Now().Round(0) for _, msg := range messages { - reception.Process(msg, receptionID.EphemeralIdentity{}, rounds.Round{ID: roundId, Timestamps: timestamps}) + reception.Process(msg, receptionID.EphemeralIdentity{ + EphId: ephemeral.Id{1, 2, 3}, Source: &id.ID{4, 5, 6}, + }, + rounds.Round{ID: roundId, Timestamps: timestamps}) select { - case result := <-receiveChan: + case result := <-msgChan: if !result.SenderID.Cmp(m.receptionId) { t.Errorf("Sender mismatch") } @@ -66,9 +68,6 @@ func TestManager_Send(t *testing.T) { if !bytes.Equal(result.Payload, messageBytes) { t.Errorf("Payload mismatch") } - if result.RoundID != roundId { - t.Errorf("Round mismatch") - } } } } @@ -78,10 +77,12 @@ func TestGroup_newCmixMsg_SaltReaderError(t *testing.T) { expectedErr := strings.SplitN(saltReadErr, "%", 2)[0] m, _ := newTestManager(rand.New(rand.NewSource(42)), t) - _, err := newCmixMsg(gs.Group{ID: id.NewIdFromString("test", id.User, t)}, - []byte{}, time.Time{}, group.Member{}, strings.NewReader(""), m.receptionId, m.services.GetMaxMessageLength()) + _, err := newCmixMsg( + gs.Group{ID: id.NewIdFromString("test", id.User, t)}, "", + []byte{}, time.Time{}, group.Member{}, strings.NewReader(""), + m.receptionId, m.net.GetMaxMessageLength()) if err == nil || !strings.Contains(err.Error(), expectedErr) { - t.Errorf("newCmixMsg() failed to return the expected error"+ + t.Errorf("newCmixMsg failed to return the expected error"+ "\nexpected: %s\nreceived: %+v", expectedErr, err) } } @@ -90,9 +91,9 @@ func TestGroup_newCmixMsg_SaltReaderError(t *testing.T) { func TestGroup_newCmixMsg_InternalMsgSizeError(t *testing.T) { expectedErr := strings.SplitN(messageLenErr, "%", 2)[0] - // Create new test Manager and Group + // Create new test manager and Group prng := rand.New(rand.NewSource(42)) - m, g := newTestManagerWithStore(prng, 10, 0, nil, nil, t) + m, g := newTestManagerWithStore(prng, 10, 0, nil, t) // Create test parameters testMsg := make([]byte, 1500) @@ -100,9 +101,10 @@ func TestGroup_newCmixMsg_InternalMsgSizeError(t *testing.T) { // Create cMix message prng = rand.New(rand.NewSource(42)) - _, err := newCmixMsg(g, testMsg, netTime.Now(), mem, prng, m.receptionId, m.services.GetMaxMessageLength()) + _, err := newCmixMsg(g, "", testMsg, netTime.Now(), mem, prng, + m.receptionId, m.net.GetMaxMessageLength()) if err == nil || !strings.Contains(err.Error(), expectedErr) { - t.Errorf("newCmixMsg() failed to return the expected error"+ + t.Errorf("newCmixMsg failed to return the expected error"+ "\nexpected: %s\nreceived: %+v", expectedErr, err) } } @@ -113,7 +115,7 @@ func Test_newMessageParts_PublicMsgSizeErr(t *testing.T) { _, _, err := newMessageParts(publicMinLen - 1) if err == nil || !strings.Contains(err.Error(), expectedErr) { - t.Errorf("newMessageParts() did not return the expected error."+ + t.Errorf("newMessageParts did not return the expected error."+ "\nexpected: %s\nreceived: %+v", expectedErr, err) } } @@ -124,7 +126,7 @@ func Test_newMessageParts_InternalMsgSizeErr(t *testing.T) { _, _, err := newMessageParts(publicMinLen) if err == nil || !strings.Contains(err.Error(), expectedErr) { - t.Errorf("newMessageParts() did not return the expected error."+ + t.Errorf("newMessageParts did not return the expected error."+ "\nexpected: %s\nreceived: %+v", expectedErr, err) } } @@ -147,13 +149,13 @@ func Test_newSalt_Consistency(t *testing.T) { for i, expected := range expectedSalts { salt, err := newSalt(prng) if err != nil { - t.Errorf("newSalt() returned an error (%d): %+v", i, err) + t.Errorf("newSalt returned an error (%d): %+v", i, err) } saltString := base64.StdEncoding.EncodeToString(salt[:]) if expected != saltString { - t.Errorf("newSalt() did not return the expected salt (%d)."+ + t.Errorf("newSalt did not return the expected salt (%d)."+ "\nexpected: %s\nreceived: %s", i, expected, saltString) } @@ -167,7 +169,7 @@ func Test_newSalt_ReadError(t *testing.T) { _, err := newSalt(strings.NewReader("")) if err == nil || !strings.Contains(err.Error(), expectedErr) { - t.Errorf("newSalt() failed to return the expected error"+ + t.Errorf("newSalt failed to return the expected error"+ "\nexpected: %s\nreceived: %+v", expectedErr, err) } } @@ -178,7 +180,7 @@ func Test_newSalt_ReadLengthError(t *testing.T) { _, err := newSalt(strings.NewReader("A")) if err == nil || !strings.Contains(err.Error(), expectedErr) { - t.Errorf("newSalt() failed to return the expected error"+ + t.Errorf("newSalt failed to return the expected error"+ "\nexpected: %s\nreceived: %+v", expectedErr, err) } } @@ -197,7 +199,7 @@ func Test_setInternalPayload(t *testing.T) { payload := setInternalPayload(internalMessage, timestamp, sender, testMsg) if err != nil { - t.Errorf("setInternalPayload() returned an error: %+v", err) + t.Errorf("setInternalPayload returned an error: %+v", err) } // Attempt to unmarshal and check all values @@ -242,7 +244,7 @@ func Test_setPublicPayload(t *testing.T) { payload := setPublicPayload(publicMessage, salt, encryptedPayload) if err != nil { - t.Errorf("setPublicPayload() returned an error: %+v", err) + t.Errorf("setPublicPayload returned an error: %+v", err) } // Attempt to unmarshal and check all values @@ -261,3 +263,14 @@ func Test_setPublicPayload(t *testing.T) { encryptedPayload, unmarshalled.GetPayload()) } } + +type testProcessor struct { + msgChan chan MessageReceive +} + +func (tp *testProcessor) Process(decryptedMsg MessageReceive, _ format.Message, + _ receptionID.EphemeralIdentity, _ rounds.Round) { + tp.msgChan <- decryptedMsg +} + +func (tp *testProcessor) String() string { return "testProcessor" } diff --git a/groupChat/service.go b/groupChat/service.go new file mode 100644 index 0000000000000000000000000000000000000000..db893354a1bad3cdd7885cc3f6ef8c5b87ff40e8 --- /dev/null +++ b/groupChat/service.go @@ -0,0 +1,95 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package groupChat + +import ( + "github.com/pkg/errors" + "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/cmix/message" + gs "gitlab.com/elixxir/client/groupChat/groupStore" + "gitlab.com/xx_network/primitives/id" +) + +// Error messages. +const ( + // manager.AddService + errServiceExists = "service with tag %q already exists" + + // manager.RemoveService + errServiceNotExists = "service with tag %q does not exist" +) + +func (m *manager) AddService(tag string, p Processor) error { + m.servicesMux.Lock() + defer m.servicesMux.Unlock() + + if _, exists := m.services[tag]; exists { + // Return an error if the service already exists + return errors.Errorf(errServiceExists, tag) + } else { + // Add the service to the list + m.services[tag] = p + } + + // Add a service for every group + for _, g := range m.gs.Groups() { + newService := makeService(g.ID, tag) + m.net.AddService(m.receptionId, newService, &receptionProcessor{m, g, p}) + } + + return nil +} + +func (m *manager) RemoveService(tag string) error { + m.servicesMux.Lock() + defer m.servicesMux.Unlock() + + // Delete the service from the list + oldProcess, exists := m.services[tag] + if exists { + return errors.Errorf(errServiceNotExists, tag) + } else { + delete(m.services, tag) + } + + // Delete service for every group + for _, g := range m.gs.Groups() { + toDelete := makeService(g.ID, tag) + m.net.DeleteService(m.receptionId, toDelete, &receptionProcessor{m, g, oldProcess}) + } + + return nil +} + +// addAllServices adds every service for the given group. +func (m *manager) addAllServices(g gs.Group) { + for tag, p := range m.services { + newService := makeService(g.ID, tag) + m.net.AddService(m.receptionId, newService, &receptionProcessor{m, g, p}) + } +} + +// deleteAllServices deletes every service for the given group. +func (m *manager) deleteAllServices(groupID *id.ID) { + for tag := range m.services { + toDelete := makeService(groupID, tag) + m.net.DeleteService(m.receptionId, toDelete, nil) + } +} + +func makeService(groupID *id.ID, tag string) message.Service { + return message.Service{ + Identifier: groupID[:], + Tag: makeServiceTag(tag), + Metadata: groupID[:], + } +} + +func makeServiceTag(tag string) string { + return catalog.Group + "-" + tag +} diff --git a/groupChat/utils_test.go b/groupChat/utils_test.go index 371d03ba3d87adbbbab9be9b64d12be99006ef7c..7b9778e10938f4d626594543ad7f609c704702f5 100644 --- a/groupChat/utils_test.go +++ b/groupChat/utils_test.go @@ -41,14 +41,14 @@ import ( "gitlab.com/xx_network/primitives/netTime" ) -// newTestManager creates a new Manager for testing. -func newTestManager(rng *rand.Rand, t *testing.T) (*Manager, gs.Group) { - m := &Manager{ +// newTestManager creates a new manager for testing. +func newTestManager(rng *rand.Rand, t *testing.T) (*manager, gs.Group) { + m := &manager{ receptionId: id.NewIdFromString("test", id.User, t), - rng: fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG), - grp: getGroup(), - services: newTestNetworkManager(0, t), + net: newTestNetworkManager(0, t), e2e: newTestE2eManager(randCycInt(rng)), + grp: getGroup(), + rng: fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG), } user := group.Member{ ID: m.receptionId, @@ -66,19 +66,16 @@ func newTestManager(rng *rand.Rand, t *testing.T) (*Manager, gs.Group) { return m, g } -// newTestManager creates a new Manager that has groups stored for testing. One +// newTestManager creates a new manager that has groups stored for testing. One // of the groups in the list is also returned. func newTestManagerWithStore(rng *rand.Rand, numGroups int, sendErr int, - requestFunc RequestCallback, receiveFunc ReceiveCallback, - t *testing.T) (*Manager, gs.Group) { + requestFunc RequestCallback, t *testing.T) (*manager, gs.Group) { - m := &Manager{ - receptionId: id.NewIdFromString("test", id.User, t), - rng: fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG), - grp: getGroup(), + m := &manager{ + services: make(map[string]Processor), requestFunc: requestFunc, - receiveFunc: receiveFunc, - services: newTestNetworkManager(sendErr, t), + receptionId: id.NewIdFromString("test", id.User, t), + net: newTestNetworkManager(sendErr, t), e2e: &testE2eManager{ e2eMessages: []testE2eMessage{}, sendErr: sendErr, @@ -86,6 +83,8 @@ func newTestManagerWithStore(rng *rand.Rand, numGroups int, sendErr int, dhPubKey: randCycInt(rng), partners: make(map[id.ID]partner.Manager), }, + grp: getGroup(), + rng: fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG), } user := group.Member{ ID: m.receptionId, @@ -223,7 +222,7 @@ func getGroup() *cyclic.Group { large.NewIntFromString(getNDF().E2E.Generator, 16)) } -func newTestNetworkManager(sendErr int, t *testing.T) GroupCmix { +func newTestNetworkManager(sendErr int, _ *testing.T) GroupCmix { return &testNetworkManager{ receptionMessages: [][]format.Message{}, sendMessages: [][]cmix.TargetedCmixMessage{}, @@ -248,9 +247,9 @@ type testE2eMessage struct { Payload []byte } -func (tnm *testE2eManager) AddPartner(partnerID *id.ID, partnerPubKey, myPrivKey *cyclic.Int, - partnerSIDHPubKey *sidh.PublicKey, mySIDHPrivKey *sidh.PrivateKey, - sendParams, receiveParams session.Params) (partner.Manager, error) { +func (tnm *testE2eManager) AddPartner(partnerID *id.ID, partnerPubKey, + myPrivKey *cyclic.Int, _ *sidh.PublicKey, _ *sidh.PrivateKey, + _, _ session.Params) (partner.Manager, error) { testPartner := partner.NewTestManager(partnerID, partnerPubKey, myPrivKey, &testing.T{}) tnm.partners[*partnerID] = testPartner @@ -258,8 +257,8 @@ func (tnm *testE2eManager) AddPartner(partnerID *id.ID, partnerPubKey, myPrivKey } func (tnm *testE2eManager) GetPartner(partnerID *id.ID) (partner.Manager, error) { - if partner, ok := tnm.partners[*partnerID]; ok { - return partner, nil + if p, ok := tnm.partners[*partnerID]; ok { + return p, nil } return nil, errors.New("Unable to find partner") } @@ -272,7 +271,9 @@ func (tnm *testE2eManager) GetHistoricalDHPrivkey() *cyclic.Int { return tnm.dhPubKey } -func (tnm *testE2eManager) SendE2E(mt catalog.MessageType, recipient *id.ID, payload []byte, params clientE2E.Params) ([]id.Round, e2e.MessageID, time.Time, error) { +func (tnm *testE2eManager) SendE2E(_ catalog.MessageType, recipient *id.ID, + payload []byte, _ clientE2E.Params) ([]id.Round, e2e.MessageID, time.Time, + error) { tnm.Lock() defer tnm.Unlock() @@ -291,11 +292,11 @@ func (tnm *testE2eManager) SendE2E(mt catalog.MessageType, recipient *id.ID, pay return []id.Round{0, 1, 2, 3}, e2e.MessageID{}, time.Time{}, nil } -func (*testE2eManager) RegisterListener(user *id.ID, messageType catalog.MessageType, newListener receive.Listener) receive.ListenerID { +func (*testE2eManager) RegisterListener(*id.ID, catalog.MessageType, receive.Listener) receive.ListenerID { return receive.ListenerID{} } -func (*testE2eManager) AddService(tag string, processor message.Processor) error { +func (*testE2eManager) AddService(string, message.Processor) error { return nil } @@ -327,7 +328,7 @@ func (tnm *testNetworkManager) GetMaxMessageLength() int { return format.NewMessage(tnm.grp.GetP().ByteLen()).ContentsSize() } -func (tnm *testNetworkManager) SendMany(messages []cmix.TargetedCmixMessage, p cmix.CMIXParams) (id.Round, []ephemeral.Id, error) { +func (tnm *testNetworkManager) SendMany(messages []cmix.TargetedCmixMessage, _ cmix.CMIXParams) (id.Round, []ephemeral.Id, error) { if tnm.sendErr == 1 { return 0, nil, errors.New("SendManyCMIX error") } @@ -337,7 +338,7 @@ func (tnm *testNetworkManager) SendMany(messages []cmix.TargetedCmixMessage, p c tnm.sendMessages = append(tnm.sendMessages, messages) - receiveMessages := []format.Message{} + var receiveMessages []format.Message for _, msg := range messages { receiveMsg := format.NewMessage(tnm.grp.GetP().ByteLen()) receiveMsg.SetMac(msg.Mac) @@ -349,13 +350,8 @@ func (tnm *testNetworkManager) SendMany(messages []cmix.TargetedCmixMessage, p c return 0, nil, nil } -func (*testNetworkManager) AddService(clientID *id.ID, newService message.Service, response message.Processor) { - return -} - -func (*testNetworkManager) DeleteService(clientID *id.ID, toDelete message.Service, processor message.Processor) { - return -} +func (*testNetworkManager) AddService(*id.ID, message.Service, message.Processor) {} +func (*testNetworkManager) DeleteService(*id.ID, message.Service, message.Processor) {} type dummyEventMgr struct{} diff --git a/restlike/connect/request.go b/restlike/connect/request.go index 3d836f2ad7377365bd83b4fc6abb214b7bb88b37..4ea32656a2f3716481153e1955d0435311b61244 100644 --- a/restlike/connect/request.go +++ b/restlike/connect/request.go @@ -46,7 +46,7 @@ func (s *Request) Request(method restlike.Method, path restlike.URI, cb := func(msg *restlike.Message) { signalChannel <- msg } - s.Net.RegisterListener(catalog.XxMessage, response{responseCallback: cb}) + s.Net.RegisterListener(catalog.XxMessage, &response{responseCallback: cb}) // Transmit the Message _, _, _, err = s.Net.SendE2E(catalog.XxMessage, msg, e2eParams) @@ -81,7 +81,7 @@ func (s *Request) AsyncRequest(method restlike.Method, path restlike.URI, } // Build callback for the response - s.Net.RegisterListener(catalog.XxMessage, response{responseCallback: cb}) + s.Net.RegisterListener(catalog.XxMessage, &response{responseCallback: cb}) // Transmit the Message _, _, _, err = s.Net.SendE2E(catalog.XxMessage, msg, e2eParams) diff --git a/restlike/connect/response_test.go b/restlike/connect/response_test.go index f10ea9d8292d7905105edb94b6533347715a4211..f3db1ba40f2024b83522c2d9a5c840d5e4691da4 100644 --- a/restlike/connect/response_test.go +++ b/restlike/connect/response_test.go @@ -31,7 +31,7 @@ func TestSingleResponse_Callback(t *testing.T) { Error: "", } - r := response{cb} + r := &response{cb} testPayload, err := proto.Marshal(testMessage) if err != nil { @@ -61,7 +61,7 @@ func TestSingleResponse_Callback_ProtoErr(t *testing.T) { cb := func(input *restlike.Message) { resultChan <- input } - r := response{cb} + r := &response{cb} r.Hear(receive.Message{Payload: []byte("test")}) diff --git a/restlike/single/receiver_test.go b/restlike/single/receiver_test.go index 6922991fdb686a7350095fe52462699361953e8c..3b06c4c15691c049b1adcf684e9d29893baef121 100644 --- a/restlike/single/receiver_test.go +++ b/restlike/single/receiver_test.go @@ -6,21 +6,14 @@ package single -import ( - "gitlab.com/elixxir/client/cmix/identity/receptionID" - "gitlab.com/elixxir/client/restlike" - "gitlab.com/elixxir/client/single" - "testing" -) +// // Test failure of proto unmarshal +// func TestSingleReceiver_Callback_FailUnmarshal(t *testing.T) { +// ep := restlike.NewEndpoints() +// r := receiver{endpoints: ep} -// Test failure of proto unmarshal -func TestSingleReceiver_Callback_FailUnmarshal(t *testing.T) { - ep := restlike.NewEndpoints() - r := receiver{endpoints: ep} - - testReq := single.BuildTestRequest(make([]byte, 0), t) - r.Callback(testReq, receptionID.EphemeralIdentity{}, nil) -} +// testReq := single.BuildTestRequest(make([]byte, 0), t) +// r.Callback(testReq, receptionID.EphemeralIdentity{}, nil) +// } // Test happy path //func TestSingleReceiver_Callback(t *testing.T) { diff --git a/single/params.go b/single/params.go index 10d60a908022f6d7c0e4857133a8e7a7b8444306..8895818449ba626ea69a112226a8afd182cdc5f3 100644 --- a/single/params.go +++ b/single/params.go @@ -8,6 +8,7 @@ package single import ( + "encoding/json" "gitlab.com/elixxir/client/cmix" "time" ) @@ -32,6 +33,13 @@ type RequestParams struct { CmixParams cmix.CMIXParams } +// requestParamsDisk will be the marshal-able and umarshal-able object. +type requestParamsDisk struct { + Timeout time.Duration + MaxResponseMessages uint8 + CmixParams cmix.CMIXParams +} + // GetDefaultRequestParams returns a RequestParams with the default // configuration. func GetDefaultRequestParams() RequestParams { @@ -41,3 +49,45 @@ func GetDefaultRequestParams() RequestParams { CmixParams: cmix.GetDefaultCMIXParams(), } } + +// GetParameters returns the default network parameters, or override with given +// parameters, if set. +func GetParameters(params string) (RequestParams, error) { + p := GetDefaultRequestParams() + if len(params) > 0 { + err := json.Unmarshal([]byte(params), &p) + if err != nil { + return RequestParams{}, err + } + } + return p, nil +} + +// MarshalJSON adheres to the json.Marshaler interface. +func (rp RequestParams) MarshalJSON() ([]byte, error) { + pDisk := requestParamsDisk{ + Timeout: rp.Timeout, + MaxResponseMessages: rp.MaxResponseMessages, + CmixParams: rp.CmixParams, + } + + return json.Marshal(&pDisk) + +} + +// UnmarshalJSON adheres to the json.Unmarshaler interface. +func (rp *RequestParams) UnmarshalJSON(data []byte) error { + pDisk := requestParamsDisk{} + err := json.Unmarshal(data, &pDisk) + if err != nil { + return err + } + + *rp = RequestParams{ + Timeout: pDisk.Timeout, + MaxResponseMessages: pDisk.MaxResponseMessages, + CmixParams: pDisk.CmixParams, + } + + return nil +} diff --git a/single/params_test.go b/single/params_test.go index 39f56c80c888e1496dffebb2b9f60d8951cd055e..7d8224c6127366af542baecb2e755475311967a0 100644 --- a/single/params_test.go +++ b/single/params_test.go @@ -8,11 +8,42 @@ package single import ( + "bytes" + "encoding/json" "gitlab.com/elixxir/client/cmix" "reflect" "testing" ) +// Tests that no data is lost when marshaling and +// unmarshaling the RequestParams object. +func TestParams_MarshalUnmarshal(t *testing.T) { + p := GetDefaultRequestParams() + data, err := json.Marshal(p) + if err != nil { + t.Fatalf("Marshal error: %+v", err) + } + + t.Logf("%s", string(data)) + + received := RequestParams{} + err = json.Unmarshal(data, &received) + if err != nil { + t.Fatalf("Unmarshal error: %+v", err) + } + + data2, err := json.Marshal(received) + if err != nil { + t.Fatalf("Marshal error: %+v", err) + } + + t.Logf("%s", string(data2)) + + if !bytes.Equal(data, data2) { + t.Fatalf("Data was lost in marshal/unmarshal.") + } +} + // Tests that GetDefaultRequestParams returns a RequestParams with the expected // default values. func TestGetDefaultRequestParams(t *testing.T) { diff --git a/storage/utility/knownRounds_test.go b/storage/utility/knownRounds_test.go index 80f8b43582c44c156e6af64536b64f55714521aa..e7a3a25f8ec33b7d11886b457863e90f48819109 100644 --- a/storage/utility/knownRounds_test.go +++ b/storage/utility/knownRounds_test.go @@ -12,7 +12,7 @@ package utility func TestNewKnownRounds(t *testing.T) { // Set up expected value size := 10 - rootKv := versioned.NewKV(make(ekv.Memstore)) + rootKv := versioned.NewKV(ekv.MakeMemstore()) expectedKR := &KnownRounds{ rounds: knownRounds.NewKnownRound(size), kv: rootKv.Prefix(knownRoundsPrefix), @@ -37,7 +37,7 @@ func TestNewKnownRounds(t *testing.T) { func TestLoadKnownRounds(t *testing.T) { // Set up expected value size := 10 - rootKv := versioned.NewKV(make(ekv.Memstore)) + rootKv := versioned.NewKV(ekv.MakeMemstore()) expectedKR := &KnownRounds{ rounds: knownRounds.NewKnownRound(size), kv: rootKv.Prefix(knownRoundsPrefix), @@ -76,7 +76,7 @@ func TestKnownRounds_save(t *testing.T) { size := 10 expectedKR := &KnownRounds{ rounds: knownRounds.NewKnownRound(size), - kv: versioned.NewKV(make(ekv.Memstore)), + kv: versioned.NewKV(ekv.MakeMemstore()), key: "testKey", } for i := 0; i < (size * 64); i++ { @@ -116,7 +116,7 @@ func TestKnownRounds_save(t *testing.T) { // size := 10 // expectedKR := &KnownRounds{ // rounds: knownRounds.NewKnownRound(size), -// kv: versioned.NewKV(make(ekv.Memstore)), +// kv: versioned.NewKV(ekv.MakeMemstore()), // key: "testKey", // } // for i := 0; i < (size * 64); i++ { @@ -148,7 +148,7 @@ func TestKnownRounds_save(t *testing.T) { func TestKnownRounds_Smoke(t *testing.T) { k := knownRounds.NewKnownRound(10) - kr, err := NewKnownRounds(versioned.NewKV(make(ekv.Memstore)), "testKey", k) + kr, err := NewKnownRounds(versioned.NewKV(ekv.MakeMemstore()), "testKey", k) if err != nil { t.Fatalf("Failed to create new KnownRounds: %v", err) } diff --git a/storage/utility/messageBuffer.go b/storage/utility/messageBuffer.go index f661e73ca3daed2070079501fc1db73567840862..4e5a5d32fb1f6695965cd97d1d28a64512eb0ba0 100644 --- a/storage/utility/messageBuffer.go +++ b/storage/utility/messageBuffer.go @@ -10,11 +10,12 @@ package utility import ( "encoding/base64" "encoding/json" + "sync" + jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/netTime" - "sync" ) // MessageHash stores the hash of a message, which is used as the key for each @@ -198,6 +199,8 @@ func (mb *MessageBuffer) load() error { // Add adds a message to the buffer in "not processing" state. func (mb *MessageBuffer) Add(m interface{}) interface{} { h := mb.handler.HashMessage(m) + jww.TRACE.Printf("Critical Messages Add(%s)", + base64.StdEncoding.EncodeToString(h[:])) mb.mux.Lock() defer mb.mux.Unlock() diff --git a/storage/versioned/kv_test.go b/storage/versioned/kv_test.go index 99bf17a969a0d042b1e1934c07957e00a75f8610..cd34474ed2fe18942286a88db17ccce3f71295c1 100644 --- a/storage/versioned/kv_test.go +++ b/storage/versioned/kv_test.go @@ -197,6 +197,6 @@ func TestVersionedKV_Set(t *testing.T) { o := &Object{} err = kv.Get(key, o) if err != nil { - t.Error("data store didn't have anything in the key: %+v", err) + t.Errorf("data store didn't have anything in the key: %+v", err) } } diff --git a/ud/manager.go b/ud/manager.go index 9d60515e5995059eb4926e6ef33384a69e6a0347..3cd1b679a3586248c14f8608eb31cddb2e1f43e7 100644 --- a/ud/manager.go +++ b/ud/manager.go @@ -2,6 +2,9 @@ package ud import ( "fmt" + "sync" + "time" + "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/api" @@ -13,8 +16,6 @@ import ( "gitlab.com/xx_network/comms/connect" "gitlab.com/xx_network/crypto/csprng" "gitlab.com/xx_network/primitives/id" - "sync" - "time" ) const ( @@ -116,7 +117,7 @@ func NewManager(services CMix, e2e E2E, } // Set storage to registered - if err = m.setRegistered(); err != nil && m.events != nil { + if err = setRegistered(kv); err != nil && m.events != nil { m.events.Report(1, "UserDiscovery", "Registration", fmt.Sprintf("User Registered with UD: %+v", username)) @@ -163,6 +164,13 @@ func NewManagerFromBackup(services CMix, "from backup") } + // Set as registered. Since it's from a backup, + // the client is already registered + if err = setRegistered(kv); err != nil { + return nil, errors.WithMessage(err, "failed to set client as "+ + "registered with user discovery.") + } + // Create the user discovery host object _, err = m.getOrAddUdHost() if err != nil { @@ -170,14 +178,33 @@ func NewManagerFromBackup(services CMix, "not be constructed.") } + return m, nil +} + +// InitStoreFromBackup initializes the UD storage from the backup subsystem +func InitStoreFromBackup(kv *versioned.KV, + username, email, phone fact.Fact) error { + // Initialize our store + udStore, err := store.NewOrLoadStore(kv) + if err != nil { + return err + } + + // Put any passed in missing facts into store + err = udStore.BackUpMissingFacts(email, phone) + if err != nil { + return errors.WithMessage(err, "Failed to restore UD store "+ + "from backup") + } + // Set as registered. Since it's from a backup, // the client is already registered - if err = m.setRegistered(); err != nil { - return nil, errors.WithMessage(err, "failed to set client as "+ + if err = setRegistered(kv); err != nil { + return errors.WithMessage(err, "failed to set client as "+ "registered with user discovery.") } - return m, nil + return nil } // LoadManager loads the state of the Manager diff --git a/ud/registered.go b/ud/registered.go index 47104cc2f56315fcbe11dbf925f7d415f2dbf132..71eab2a4e71ede3019c866c261dd818e325ebdaa 100644 --- a/ud/registered.go +++ b/ud/registered.go @@ -2,6 +2,7 @@ package ud import ( "encoding/binary" + jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/xx_network/primitives/netTime" @@ -21,8 +22,8 @@ func (m *Manager) isRegistered() bool { return true } -// isRegistered returns if the client is registered with user discovery -func (m *Manager) setRegistered() error { +// setRegistered sets the user to registered +func setRegistered(kv *versioned.KV) error { data := make([]byte, 4) binary.BigEndian.PutUint32(data, 1) obj := &versioned.Object{ @@ -31,7 +32,7 @@ func (m *Manager) setRegistered() error { Data: data, } - if err := m.kv.Set(isRegisteredKey, isRegisteredVersion, obj); err != nil { + if err := kv.Set(isRegisteredKey, isRegisteredVersion, obj); err != nil { jww.FATAL.Panicf("Failed to store that the client is "+ "registered: %+v", err) } diff --git a/xxmutils/restoreContacts.go b/xxmutils/restoreContacts.go index 69a09d2e6258479cfdc3a08aaeca050442fdc256..96e9c2b1b8d4fd26680bef805f27bbdb712d71b4 100644 --- a/xxmutils/restoreContacts.go +++ b/xxmutils/restoreContacts.go @@ -11,6 +11,7 @@ import ( "encoding/json" "errors" "fmt" + "gitlab.com/elixxir/client/api/messenger" "gitlab.com/elixxir/client/single" "gitlab.com/xx_network/primitives/netTime" "math" @@ -20,7 +21,6 @@ import ( jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/api" "gitlab.com/elixxir/client/interfaces" "gitlab.com/elixxir/client/storage" "gitlab.com/elixxir/client/storage/versioned" @@ -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 *api.Client, +func RestoreContactsFromBackup(backupPartnerIDs []byte, client *messenger.Client, udManager *ud.Manager, updatesCb interfaces.RestoreContactsUpdater) ([]*id.ID, []*id.ID, []error, error) { @@ -100,7 +100,7 @@ func RestoreContactsFromBackup(backupPartnerIDs []byte, client *api.Client, rsWg.Add(numRoutines) for i := 0; i < numRoutines; i++ { go LookupContacts(lookupCh, foundCh, failCh, client, udContact, lcWg) - go ResetSessions(resetContactCh, restoredCh, failCh, *client, + go ResetSessions(resetContactCh, restoredCh, failCh, client, rsWg) } @@ -178,7 +178,7 @@ func RestoreContactsFromBackup(backupPartnerIDs []byte, client *api.Client, // 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 *api.Client, udContact contact.Contact, + failCh chan failure, client *messenger.Client, udContact contact.Contact, wg *sync.WaitGroup) { defer wg.Done() // Start looking up contacts with user discovery and feed this @@ -205,12 +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 api.Client, wg *sync.WaitGroup) { + client *messenger.Client, wg *sync.WaitGroup) { defer wg.Done() - me := client.GetUser().GetContact() - msg := "Account reset from backup" for c := range in { - _, err := client.ResetSession(*c, me, msg) + _, err := client.GetAuth().Reset(*c) if err == nil { out <- c continue @@ -226,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 *api.Client, udContact contact.Contact) ( +func LookupContact(userID *id.ID, client *messenger.Client, 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 @@ -247,7 +245,7 @@ func LookupContact(userID *id.ID, client *api.Client, udContact contact.Contact) // in MS, so 90 seconds stream := client.GetRng().GetStream() defer stream.Close() - _, _, err = ud.Lookup(client.GetNetworkInterface(), stream, client.GetE2EHandler().GetGroup(), + _, _, err = ud.Lookup(client.GetCmix(), stream, client.GetE2E().GetGroup(), udContact, lookupCB, userID, single.GetDefaultRequestParams()) // Now force a wait for callback to exit