From 14dd8923772fc3433615698beebf87ba9c6938a8 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Sat, 27 Apr 2019 09:20:03 -0700 Subject: [PATCH 001/110] tcp communication better/simpler --- src/comm/comm.go | 92 ++++++++++++++++++++----------------------- src/comm/comm_test.go | 52 ++++++++++++++++++++++++ src/tcp/tcp.go | 46 ++++++++++++++++------ src/tcp/tcp_test.go | 68 ++++++++++++++++++++++++++++++++ 4 files changed, 196 insertions(+), 62 deletions(-) create mode 100644 src/comm/comm_test.go create mode 100644 src/tcp/tcp_test.go diff --git a/src/comm/comm.go b/src/comm/comm.go index 47267b2..7ad3203 100644 --- a/src/comm/comm.go +++ b/src/comm/comm.go @@ -2,10 +2,9 @@ package comm import ( "bytes" + "encoding/binary" "fmt" "net" - "strconv" - "strings" "time" "github.com/pkg/errors" @@ -16,6 +15,19 @@ type Comm struct { connection net.Conn } +// NewConnection gets a new comm to a tcp address +func NewConnection(address string) (c Comm, err error) { + connection, err := net.DialTimeout("tcp", address, 3*time.Hour) + if err != nil { + return + } + connection.SetReadDeadline(time.Now().Add(3 * time.Hour)) + connection.SetDeadline(time.Now().Add(3 * time.Hour)) + connection.SetWriteDeadline(time.Now().Add(3 * time.Hour)) + c = New(connection) + return +} + // New returns a new comm func New(c net.Conn) Comm { c.SetReadDeadline(time.Now().Add(3 * time.Hour)) @@ -35,10 +47,12 @@ func (c Comm) Close() { } func (c Comm) Write(b []byte) (int, error) { - tmpCopy := make([]byte, len(b)+5) - // Copy the buffer so it doesn't get changed while read by the recipient. - copy(tmpCopy[:5], []byte(fmt.Sprintf("%0.5d", len(b)))) - copy(tmpCopy[5:], b) + header := new(bytes.Buffer) + err := binary.Write(header, binary.LittleEndian, uint32(len(b))) + if err != nil { + fmt.Println("binary.Write failed:", err) + } + tmpCopy := append(header.Bytes(), b...) n, err := c.connection.Write(tmpCopy) if n != len(tmpCopy) { if err != nil { @@ -53,68 +67,48 @@ func (c Comm) Write(b []byte) (int, error) { func (c Comm) Read() (buf []byte, numBytes int, bs []byte, err error) { // read until we get 5 bytes - tmp := make([]byte, 5) - n, err := c.connection.Read(tmp) + header := make([]byte, 4) + n, err := c.connection.Read(header) if err != nil { return } - tmpCopy := make([]byte, n) - // Copy the buffer so it doesn't get changed while read by the recipient. - copy(tmpCopy, tmp[:n]) - bs = tmpCopy - - tmp = make([]byte, 1) - for { - // see if we have enough bytes - bs = bytes.Trim(bs, "\x00") - if len(bs) == 5 { - break - } - n, err := c.connection.Read(tmp) - if err != nil { - return nil, 0, nil, err - } - tmpCopy = make([]byte, n) - // Copy the buffer so it doesn't get changed while read by the recipient. - copy(tmpCopy, tmp[:n]) - bs = append(bs, tmpCopy...) + if n < 4 { + err = fmt.Errorf("not enough bytes: %d", n) + return } + // make it so it won't change + header = append([]byte(nil), header...) - numBytes, err = strconv.Atoi(strings.TrimLeft(string(bs), "0")) + var numBytesUint32 uint32 + rbuf := bytes.NewReader(header) + err = binary.Read(rbuf, binary.LittleEndian, &numBytesUint32) if err != nil { - return nil, 0, nil, err + fmt.Println("binary.Read failed:", err) } - buf = []byte{} - tmp = make([]byte, numBytes) + numBytes = int(numBytesUint32) for { - n, err := c.connection.Read(tmp) - if err != nil { - return nil, 0, nil, err + tmp := make([]byte, numBytes) + n, errRead := c.connection.Read(tmp) + if errRead != nil { + err = errRead + return } - tmpCopy = make([]byte, n) - // Copy the buffer so it doesn't get changed while read by the recipient. - copy(tmpCopy, tmp[:n]) - buf = append(buf, bytes.TrimRight(tmpCopy, "\x00")...) - if len(buf) < numBytes { - // shrink the amount we need to read - tmp = tmp[:numBytes-len(buf)] - } else { + buf = append(buf, tmp[:n]...) + if numBytes == len(buf) { break } } - // log.Printf("wanted %d and got %d", numBytes, len(buf)) return } // Send a message -func (c Comm) Send(message string) (err error) { - _, err = c.Write([]byte(message)) +func (c Comm) Send(message []byte) (err error) { + _, err = c.Write(message) return } // Receive a message -func (c Comm) Receive() (s string, err error) { - b, _, _, err := c.Read() - s = string(b) +func (c Comm) Receive() (b []byte, err error) { + b, _, _, err = c.Read() return } diff --git a/src/comm/comm_test.go b/src/comm/comm_test.go new file mode 100644 index 0000000..41430bf --- /dev/null +++ b/src/comm/comm_test.go @@ -0,0 +1,52 @@ +package comm + +import ( + "net" + "testing" + "time" + + log "github.com/cihub/seelog" + "github.com/stretchr/testify/assert" +) + +func TestComm(t *testing.T) { + defer log.Flush() + + port := "8001" + go func() { + log.Debugf("starting TCP server on " + port) + server, err := net.Listen("tcp", "0.0.0.0:"+port) + if err != nil { + log.Error(err) + } + defer server.Close() + // spawn a new goroutine whenever a client connects + for { + connection, err := server.Accept() + if err != nil { + log.Error(err) + } + log.Debugf("client %s connected", connection.RemoteAddr().String()) + go func(port string, connection net.Conn) { + c := New(connection) + err = c.Send([]byte("hello, world")) + assert.Nil(t, err) + data, err := c.Receive() + assert.Nil(t, err) + assert.Equal(t, []byte("hello, computer"), data) + data, err = c.Receive() + assert.Nil(t, err) + assert.Equal(t, []byte{'\x00'}, data) + }(port, connection) + } + }() + + time.Sleep(100 * time.Millisecond) + a, err := NewConnection("localhost:" + port) + assert.Nil(t, err) + data, err := a.Receive() + assert.Equal(t, []byte("hello, world"), data) + assert.Nil(t, err) + assert.Nil(t, a.Send([]byte("hello, computer"))) + assert.Nil(t, a.Send([]byte{'\x00'})) +} diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index 3cece44..599a58b 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -13,8 +13,10 @@ import ( ) type roomInfo struct { - receiver comm.Comm - opened time.Time + first comm.Comm + second comm.Comm + opened time.Time + full bool } type roomMap struct { @@ -77,37 +79,53 @@ func run(port string) (err error) { func clientCommuncation(port string, c comm.Comm) (err error) { // send ok to tell client they are connected log.Debug("sending ok") - err = c.Send("ok") + err = c.Send([]byte("ok")) if err != nil { return } // wait for client to tell me which room they want log.Debug("waiting for answer") - room, err := c.Receive() + roomBytes, err := c.Receive() if err != nil { return } + room := string(roomBytes) rooms.Lock() - // first connection is always the receiver + // create the room if it is new if _, ok := rooms.rooms[room]; !ok { rooms.rooms[room] = roomInfo{ - receiver: c, - opened: time.Now(), + first: c, + opened: time.Now(), } rooms.Unlock() // tell the client that they got the room - err = c.Send("recipient") + err = c.Send([]byte("ok")) if err != nil { log.Error(err) return } - log.Debug("recipient connected") + log.Debugf("room %s has 1", room) return nil } - log.Debug("sender connected") - receiver := rooms.rooms[room].receiver + if rooms.rooms[room].full { + rooms.Unlock() + err = c.Send([]byte("room full")) + if err != nil { + log.Error(err) + return + } + return nil + } + log.Debugf("room %s has 2", room) + rooms.rooms[room] = roomInfo{ + first: rooms.rooms[room].first, + second: c, + opened: rooms.rooms[room].opened, + full: true, + } + otherConnection := rooms.rooms[room].first rooms.Unlock() // second connection is the sender, time to staple connections @@ -120,10 +138,10 @@ func clientCommuncation(port string, c comm.Comm) (err error) { pipe(com1.Connection(), com2.Connection()) wg.Done() log.Debug("done piping") - }(c, receiver, &wg) + }(otherConnection, c, &wg) // tell the sender everything is ready - err = c.Send("sender") + err = c.Send([]byte("ok")) if err != nil { return } @@ -132,6 +150,8 @@ func clientCommuncation(port string, c comm.Comm) (err error) { // delete room rooms.Lock() log.Debugf("deleting room: %s", room) + rooms.rooms[room].first.Close() + rooms.rooms[room].second.Close() delete(rooms.rooms, room) rooms.Unlock() return nil diff --git a/src/tcp/tcp_test.go b/src/tcp/tcp_test.go new file mode 100644 index 0000000..d336b3d --- /dev/null +++ b/src/tcp/tcp_test.go @@ -0,0 +1,68 @@ +package tcp + +import ( + "bytes" + "fmt" + "testing" + "time" + + "github.com/schollz/croc/src/comm" + "github.com/stretchr/testify/assert" +) + +func TestTCP(t *testing.T) { + go Run("debug", "8081") + time.Sleep(100 * time.Millisecond) + c1, err := ConnectToTCPServer("localhost:8081", "testRoom") + assert.Nil(t, err) + c2, err := ConnectToTCPServer("localhost:8081", "testRoom") + assert.Nil(t, err) + _, err = ConnectToTCPServer("localhost:8081", "testRoom") + assert.NotNil(t, err) + + // try sending data + assert.Nil(t, c1.Send([]byte("hello, c2"))) + data, err := c2.Receive() + assert.Nil(t, err) + assert.Equal(t, []byte("hello, c2"), data) + + assert.Nil(t, c2.Send([]byte("hello, c1"))) + data, err = c1.Receive() + assert.Nil(t, err) + assert.Equal(t, []byte("hello, c1"), data) + + c1.Close() + time.Sleep(200 * time.Millisecond) + err = c2.Send([]byte("test")) + assert.Nil(t, err) + _, err = c2.Receive() + assert.NotNil(t, err) +} + +func ConnectToTCPServer(address, room string) (c comm.Comm, err error) { + c, err = comm.NewConnection("localhost:8081") + if err != nil { + return + } + data, err := c.Receive() + if err != nil { + return + } + if !bytes.Equal(data, []byte("ok")) { + err = fmt.Errorf("got bad response: %s", data) + return + } + err = c.Send([]byte(room)) + if err != nil { + return + } + data, err = c.Receive() + if err != nil { + return + } + if !bytes.Equal(data, []byte("ok")) { + err = fmt.Errorf("got bad response: %s", data) + return + } + return +} From 249c0d8ab07f7b2b63d108f036acd344cdd534da Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Sat, 27 Apr 2019 11:15:38 -0700 Subject: [PATCH 002/110] faster encryption by generating key once --- src/crypt/crypt.go | 83 ++++++++++++----------------------------- src/crypt/crypt_test.go | 61 +++++++++++++----------------- src/tcp/tcp.go | 4 +- 3 files changed, 53 insertions(+), 95 deletions(-) diff --git a/src/crypt/crypt.go b/src/crypt/crypt.go index 7160ad5..90acbb7 100644 --- a/src/crypt/crypt.go +++ b/src/crypt/crypt.go @@ -5,85 +5,50 @@ import ( "crypto/cipher" "crypto/rand" "crypto/sha256" - "encoding/base64" - "errors" - "strings" "golang.org/x/crypto/pbkdf2" ) // Encryption stores the data type Encryption struct { - Encrypted []byte `json:"e"` - Salt []byte `json:"s"` - IV []byte `json:"i"` + key []byte + passphrase []byte + Salt []byte `json:"s"` } -func (e Encryption) Bytes() []byte { - return []byte(base64.StdEncoding.EncodeToString(e.Encrypted) + "-" + base64.StdEncoding.EncodeToString(e.Salt) + "-" + base64.StdEncoding.EncodeToString(e.IV)) -} - -func FromBytes(b []byte) (enc Encryption, err error) { - enc = Encryption{} - items := strings.Split(string(b), "-") - if len(items) != 3 { - err = errors.New("not valid") - return +// New generates a new encryption, using the supplied passphrase and +// an optional supplied salt. +func New(passphrase []byte, salt []byte) (e Encryption, err error) { + e.passphrase = passphrase + if salt == nil { + e.Salt = make([]byte, 8) + // http://www.ietf.org/rfc/rfc2898.txt + // Salt. + rand.Read(e.Salt) + } else { + e.Salt = salt } - enc.Encrypted, err = base64.StdEncoding.DecodeString(items[0]) - if err != nil { - return - } - enc.Salt, err = base64.StdEncoding.DecodeString(items[1]) - if err != nil { - return - } - enc.IV, err = base64.StdEncoding.DecodeString(items[2]) + e.key = pbkdf2.Key([]byte(passphrase), e.Salt, 100, 32, sha256.New) return } -// Encrypt will generate an encryption -func Encrypt(plaintext []byte, passphrase []byte, dontencrypt ...bool) Encryption { - if len(dontencrypt) > 0 && dontencrypt[0] { - return Encryption{ - Encrypted: plaintext, - Salt: []byte("salt"), - IV: []byte("iv"), - } - } - key, saltBytes := deriveKey(passphrase, nil) - ivBytes := make([]byte, 12) +// Encrypt will generate an encryption, prefixed with the IV +func (e Encryption) Encrypt(plaintext []byte) []byte { + // generate a random iv each time // http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf // Section 8.2 + ivBytes := make([]byte, 12) rand.Read(ivBytes) - b, _ := aes.NewCipher(key) + b, _ := aes.NewCipher(e.key) aesgcm, _ := cipher.NewGCM(b) encrypted := aesgcm.Seal(nil, ivBytes, plaintext, nil) - return Encryption{ - Encrypted: encrypted, - Salt: saltBytes, - IV: ivBytes, - } + return append(ivBytes, encrypted...) } // Decrypt an encryption -func (e Encryption) Decrypt(passphrase []byte, dontencrypt ...bool) (plaintext []byte, err error) { - if len(dontencrypt) > 0 && dontencrypt[0] { - return e.Encrypted, nil - } - key, _ := deriveKey(passphrase, e.Salt) - b, _ := aes.NewCipher(key) +func (e Encryption) Decrypt(encrypted []byte) (plaintext []byte, err error) { + b, _ := aes.NewCipher(e.key) aesgcm, _ := cipher.NewGCM(b) - plaintext, err = aesgcm.Open(nil, e.IV, e.Encrypted, nil) + plaintext, err = aesgcm.Open(nil, encrypted[:12], encrypted[12:], nil) return } - -func deriveKey(passphrase []byte, salt []byte) ([]byte, []byte) { - if salt == nil { - salt = make([]byte, 8) - // http://www.ietf.org/rfc/rfc2898.txt - // Salt. - rand.Read(salt) - } - return pbkdf2.Key([]byte(passphrase), salt, 100, 32, sha256.New), salt -} diff --git a/src/crypt/crypt_test.go b/src/crypt/crypt_test.go index 472d424..ff60b34 100644 --- a/src/crypt/crypt_test.go +++ b/src/crypt/crypt_test.go @@ -1,41 +1,32 @@ package crypt -import "testing" +import ( + "testing" -func BenchmarkEncryption(b *testing.B) { + "github.com/stretchr/testify/assert" +) + +func BenchmarkEncryptionNew(b *testing.B) { for i := 0; i < b.N; i++ { - Encrypt([]byte(` - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse laoreet justo quis augue vehicula ornare. Nullam nec risus volutpat nulla dictum consectetur. Phasellus porttitor, justo non tincidunt finibus, massa justo iaculis urna, eget mattis nulla libero vitae risus. Vestibulum vehicula nunc id dignissim rutrum. Cras varius ac nulla a imperdiet. Sed finibus, libero in tempor hendrerit, turpis erat faucibus nisl, a consectetur massa mi eget mi. Vestibulum pulvinar lorem id ipsum elementum auctor. - - Morbi at odio a eros eleifend faucibus. Sed at tempor urna, in interdum neque. Curabitur condimentum rhoncus orci, vel vulputate risus ultricies efficitur. Curabitur eu vehicula ligula. Curabitur suscipit ex vitae nunc faucibus vehicula. Mauris sed dictum mauris. Vivamus nec dui at urna porttitor suscipit. Integer ut eros finibus orci consectetur hendrerit id quis dolor. Proin dapibus orci quis massa viverra finibus. Sed quis ligula neque. - - Aenean et fringilla nulla. In et venenatis massa, vel feugiat diam. Sed ornare felis nec egestas suscipit. Sed a ultricies sapien. Aliquam ex leo, tincidunt faucibus neque non, vehicula commodo velit. Vestibulum molestie efficitur velit in vestibulum. Aliquam eget leo felis. Etiam pharetra vulputate egestas. Cras gravida nibh eu sollicitudin facilisis. Nulla facilisi. Nulla tristique arcu vitae arcu pulvinar feugiat. Suspendisse finibus a urna a cursus. Donec bibendum sodales nunc eget tincidunt. Pellentesque blandit ac nunc at consectetur. - - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce congue nibh nisl, et porttitor mauris tempor eget. Vivamus sit amet sagittis ligula. Quisque aliquam orci non odio egestas, vel semper felis efficitur. Vivamus non leo lacus. Etiam non ligula eget erat porta laoreet id id ligula. Proin imperdiet erat id efficitur vehicula. Suspendisse potenti. Morbi ornare finibus metus, eu pretium leo tristique sit amet. Praesent placerat elit quis porttitor rhoncus. Vestibulum consectetur turpis sed lacus placerat, vel laoreet est interdum. Proin id quam ut risus tempor hendrerit nec eu lacus. Duis vel aliquam ex. - - Sed facilisis in ex vitae pellentesque. Donec tempor lobortis dui. Praesent sagittis, elit ac dictum hendrerit, eros risus auctor erat, in pretium nulla mi et felis. Nullam imperdiet erat id erat rutrum fermentum. Praesent ultrices, diam non efficitur gravida, sem quam fermentum est, vitae tristique libero velit eget turpis. Nunc sem risus, venenatis nec suscipit quis, accumsan eu nunc. Fusce fringilla sit amet purus vel ornare. Donec nulla dolor, gravida ac metus nec, tincidunt feugiat sem. Fusce semper varius nunc. - - Nulla facilisi. Quisque in euismod ex, ac sollicitudin dolor. Aliquam erat volutpat. Etiam nisl sem, posuere et pellentesque fermentum, pretium non lorem. Nunc blandit nisl at leo interdum gravida. Proin ullamcorper ultrices dictum. Pellentesque non ligula magna. Sed justo nibh, finibus vitae malesuada ultricies, molestie ac ante. Suspendisse maximus congue viverra. - - Donec a est eu arcu tristique fermentum a quis velit. Aenean eu mollis turpis. Morbi euismod risus eros, at vestibulum lectus iaculis sed. Pellentesque varius eu justo in viverra. Phasellus feugiat tincidunt urna ut accumsan. In ullamcorper vehicula hendrerit. Sed sapien diam, rhoncus nec porta non, gravida et ante. Nulla et volutpat quam, nec venenatis ex. Donec vitae dictum libero, id ornare sapien. Morbi id aliquam ipsum. Cras a ultricies purus. - - Morbi sit amet sagittis metus, vitae dictum nunc. Pellentesque ornare consequat diam, vitae maximus dolor facilisis at. Cras semper imperdiet mollis. Fusce maximus augue quis elit pulvinar, vitae varius nunc tempus. Maecenas et suscipit leo. Morbi tempus neque enim, sit amet vestibulum ex sollicitudin ac. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vel rutrum nisl. Nullam ac vehicula velit. Sed suscipit lacus libero, ac laoreet tortor vehicula a. In aliquam tellus tincidunt ligula fringilla, ut finibus lorem commodo. Sed sit amet porta magna, et aliquam lacus. - - Nulla at libero in velit lacinia feugiat sed sit amet erat. Cras nec iaculis magna. Curabitur efficitur turpis vel risus euismod, sit amet posuere orci efficitur. Nunc tincidunt ante eu nunc lacinia, varius dignissim tellus eleifend. Pellentesque enim urna, porttitor eget tincidunt ut, sollicitudin in enim. Donec sit amet hendrerit orci, ut viverra arcu. Nam vitae semper est. Vestibulum aliquet dolor sed turpis blandit eleifend. Nullam auctor accumsan mauris eu mattis. Etiam interdum purus sit amet libero placerat vehicula. - - Ut ac odio risus. Sed ut dolor ut metus tincidunt egestas. Curabitur ullamcorper lectus interdum nisi euismod, et faucibus dui fringilla. Nunc at purus vel erat hendrerit dapibus a ut ligula. Nulla facilisi. Etiam gravida, dui nec posuere gravida, nunc quam sodales dui, ut congue mauris tortor vitae nunc. Praesent dapibus mi quis pulvinar consequat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque ultricies placerat dolor tempus cursus. Etiam vehicula, dui vel varius ullamcorper, sapien sem malesuada felis, quis suscipit est nibh vel massa. - - Nulla sed mollis enim. Interdum et malesuada fames ac ante ipsum primis in faucibus. Quisque magna purus, faucibus vel ornare vel, semper et odio. Donec non interdum nunc. Maecenas metus augue, maximus ac volutpat id, euismod eget sem. Sed efficitur non diam sed ultrices. Fusce ultrices nisl et suscipit tristique. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi luctus augue vel vehicula iaculis. - - Vivamus iaculis luctus nisl, quis molestie purus mollis vitae. Proin vehicula rutrum finibus. Nulla lacinia auctor tincidunt. Vivamus sollicitudin orci eu porttitor vehicula. Vivamus auctor sem sed risus porta cursus. Donec orci dui, lacinia vitae mi quis, tincidunt feugiat elit. Mauris pharetra faucibus justo non volutpat. Praesent pellentesque condimentum quam quis porta. Praesent sed nisi id eros iaculis condimentum nec in libero. Donec eu blandit enim. Aliquam nec elementum libero. Donec nec nisi suscipit felis blandit rutrum. Morbi magna nulla, porttitor id nisl vitae, imperdiet efficitur leo. Ut eu vestibulum justo, vitae dapibus felis. - - Quisque ac est nec metus sagittis lobortis mollis id metus. Duis a augue eu erat vulputate facilisis varius ac nunc. Suspendisse eleifend enim suscipit erat aliquet, sed feugiat ligula tempor. Aenean dapibus felis porttitor mauris ultricies vehicula. Vestibulum lacinia scelerisque turpis, ut varius nunc suscipit vitae. Praesent blandit mauris eu semper lacinia. Cras mauris augue, tincidunt quis risus tincidunt, blandit euismod erat. Etiam non sagittis leo, eget pharetra risus. - - Donec sodales ultricies neque, non accumsan velit blandit non. Aliquam lacinia orci mauris, commodo porttitor ipsum venenatis sed. Integer sit amet pretium nisi. Ut porttitor, sapien quis gravida egestas, nulla tellus ullamcorper ante, et eleifend diam turpis et odio. Quisque dui orci, commodo sit amet rhoncus ut, pharetra ac leo. Suspendisse non vehicula ex. Morbi gravida lacus vitae ex lacinia, nec aliquam purus consequat. Donec aliquam pretium massa, id viverra nunc blandit sit amet. Donec sed dapibus elit. Cras hendrerit efficitur eros quis malesuada. Aenean a massa in dolor gravida volutpat a et nisi. Nullam sit amet est tempus, condimentum odio egestas, dignissim nibh. Integer tempor id sapien at sagittis. - - Aliquam in urna semper, suscipit metus in, pharetra lectus. Proin tempor nibh turpis, a pulvinar justo mollis sit amet. Fusce massa turpis, tristique id semper sit amet, venenatis in mauris. Maecenas id consectetur purus, sed efficitur ipsum. Sed pretium nisi ut sem pulvinar ullamcorper. Nullam at nunc et quam rhoncus egestas eu eu odio. Nullam commodo urna cursus massa porta consectetur. Sed blandit erat ut imperdiet malesuada. Cras nec fringilla ante. Nam sed gravida urna. Nam non dui quis turpis efficitur feugiat. Fusce in quam ex. - - Nullam purus libero, egestas eget luctus et, malesuada eget est. Curabitur tristique sollicitudin est, imperdiet cras amet. `), []byte(`password`)) + bob, _ := New([]byte("password"), nil) + bob.Encrypt([]byte("hello, world")) } } + +func BenchmarkEncryption(b *testing.B) { + bob, _ := New([]byte("password"), nil) + for i := 0; i < b.N; i++ { + bob.Encrypt([]byte("hello, world")) + } +} + +func TestEncryption(t *testing.T) { + bob, err := New([]byte("password"), nil) + assert.Nil(t, err) + jane, err := New([]byte("password"), bob.Salt) + assert.Nil(t, err) + enc := bob.Encrypt([]byte("hello, world")) + dec, err := jane.Decrypt(enc) + assert.Nil(t, err) + assert.Equal(t, dec, []byte("hello, world")) +} diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index 599a58b..659c744 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -12,6 +12,8 @@ import ( "github.com/schollz/croc/src/models" ) +const TCP_BUFFER_SIZE = 1024 * 64 + type roomInfo struct { first comm.Comm second comm.Comm @@ -163,7 +165,7 @@ func chanFromConn(conn net.Conn) chan []byte { c := make(chan []byte) go func() { - b := make([]byte, models.TCP_BUFFER_SIZE) + b := make([]byte, TCP_BUFFER_SIZE) for { n, err := conn.Read(b) From f238c4b22c8711356c42c722b226c0e8338f4233 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Sat, 27 Apr 2019 16:49:00 -0700 Subject: [PATCH 003/110] modify api of salt --- src/crypt/crypt.go | 23 +++++++++++++---------- src/crypt/crypt_test.go | 2 +- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/crypt/crypt.go b/src/crypt/crypt.go index 90acbb7..d7a27ee 100644 --- a/src/crypt/crypt.go +++ b/src/crypt/crypt.go @@ -9,31 +9,34 @@ import ( "golang.org/x/crypto/pbkdf2" ) -// Encryption stores the data -type Encryption struct { +type encryption struct { key []byte passphrase []byte - Salt []byte `json:"s"` + salt []byte } // New generates a new encryption, using the supplied passphrase and // an optional supplied salt. -func New(passphrase []byte, salt []byte) (e Encryption, err error) { +func New(passphrase []byte, salt []byte) (e encryption, err error) { e.passphrase = passphrase if salt == nil { - e.Salt = make([]byte, 8) + e.salt = make([]byte, 8) // http://www.ietf.org/rfc/rfc2898.txt // Salt. - rand.Read(e.Salt) + rand.Read(e.salt) } else { - e.Salt = salt + e.salt = salt } - e.key = pbkdf2.Key([]byte(passphrase), e.Salt, 100, 32, sha256.New) + e.key = pbkdf2.Key([]byte(passphrase), e.salt, 100, 32, sha256.New) return } +func (e encryption) Salt() []byte { + return e.salt +} + // Encrypt will generate an encryption, prefixed with the IV -func (e Encryption) Encrypt(plaintext []byte) []byte { +func (e encryption) Encrypt(plaintext []byte) []byte { // generate a random iv each time // http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf // Section 8.2 @@ -46,7 +49,7 @@ func (e Encryption) Encrypt(plaintext []byte) []byte { } // Decrypt an encryption -func (e Encryption) Decrypt(encrypted []byte) (plaintext []byte, err error) { +func (e encryption) Decrypt(encrypted []byte) (plaintext []byte, err error) { b, _ := aes.NewCipher(e.key) aesgcm, _ := cipher.NewGCM(b) plaintext, err = aesgcm.Open(nil, encrypted[:12], encrypted[12:], nil) diff --git a/src/crypt/crypt_test.go b/src/crypt/crypt_test.go index ff60b34..c80e510 100644 --- a/src/crypt/crypt_test.go +++ b/src/crypt/crypt_test.go @@ -23,7 +23,7 @@ func BenchmarkEncryption(b *testing.B) { func TestEncryption(t *testing.T) { bob, err := New([]byte("password"), nil) assert.Nil(t, err) - jane, err := New([]byte("password"), bob.Salt) + jane, err := New([]byte("password"), bob.Salt()) assert.Nil(t, err) enc := bob.Encrypt([]byte("hello, world")) dec, err := jane.Decrypt(enc) From 8dc8783bd492c72dbb56f67843d8df42032e5863 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Sat, 27 Apr 2019 17:03:05 -0700 Subject: [PATCH 004/110] propogate errors --- src/crypt/crypt.go | 27 ++++++++++++++++++++------- src/crypt/crypt_test.go | 3 ++- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/crypt/crypt.go b/src/crypt/crypt.go index d7a27ee..2be5793 100644 --- a/src/crypt/crypt.go +++ b/src/crypt/crypt.go @@ -36,22 +36,35 @@ func (e encryption) Salt() []byte { } // Encrypt will generate an encryption, prefixed with the IV -func (e encryption) Encrypt(plaintext []byte) []byte { +func (e encryption) Encrypt(plaintext []byte) (encrypted []byte, err error) { // generate a random iv each time // http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf // Section 8.2 ivBytes := make([]byte, 12) rand.Read(ivBytes) - b, _ := aes.NewCipher(e.key) - aesgcm, _ := cipher.NewGCM(b) - encrypted := aesgcm.Seal(nil, ivBytes, plaintext, nil) - return append(ivBytes, encrypted...) + b, err := aes.NewCipher(e.key) + if err != nil { + return + } + aesgcm, err := cipher.NewGCM(b) + if err != nil { + return + } + encrypted = aesgcm.Seal(nil, ivBytes, plaintext, nil) + encrypted = append(ivBytes, encrypted...) + return } // Decrypt an encryption func (e encryption) Decrypt(encrypted []byte) (plaintext []byte, err error) { - b, _ := aes.NewCipher(e.key) - aesgcm, _ := cipher.NewGCM(b) + b, err := aes.NewCipher(e.key) + if err != nil { + return + } + aesgcm, err := cipher.NewGCM(b) + if err != nil { + return + } plaintext, err = aesgcm.Open(nil, encrypted[:12], encrypted[12:], nil) return } diff --git a/src/crypt/crypt_test.go b/src/crypt/crypt_test.go index c80e510..29d891e 100644 --- a/src/crypt/crypt_test.go +++ b/src/crypt/crypt_test.go @@ -25,7 +25,8 @@ func TestEncryption(t *testing.T) { assert.Nil(t, err) jane, err := New([]byte("password"), bob.Salt()) assert.Nil(t, err) - enc := bob.Encrypt([]byte("hello, world")) + enc, err := bob.Encrypt([]byte("hello, world")) + assert.Nil(t, err) dec, err := jane.Decrypt(enc) assert.Nil(t, err) assert.Equal(t, dec, []byte("hello, world")) From b9a5f450c548f65b5a8ab1ff177ea0c1650732e1 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 13:53:12 -0600 Subject: [PATCH 005/110] simplify --- src/comm/comm.go | 5 +---- src/tcp/tcp.go | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/comm/comm.go b/src/comm/comm.go index 7ad3203..c52f925 100644 --- a/src/comm/comm.go +++ b/src/comm/comm.go @@ -17,13 +17,10 @@ type Comm struct { // NewConnection gets a new comm to a tcp address func NewConnection(address string) (c Comm, err error) { - connection, err := net.DialTimeout("tcp", address, 3*time.Hour) + connection, err := net.DialTimeout("tcp", address, 3*time.Second) if err != nil { return } - connection.SetReadDeadline(time.Now().Add(3 * time.Hour)) - connection.SetDeadline(time.Now().Add(3 * time.Hour)) - connection.SetWriteDeadline(time.Now().Add(3 * time.Hour)) c = New(connection) return } diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index 659c744..41021ea 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -9,7 +9,6 @@ import ( "github.com/pkg/errors" "github.com/schollz/croc/src/comm" "github.com/schollz/croc/src/logger" - "github.com/schollz/croc/src/models" ) const TCP_BUFFER_SIZE = 1024 * 64 From ef25c556a9525410795ab865c2146f83dcf08aae Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 14:06:18 -0600 Subject: [PATCH 006/110] use pointers --- src/comm/comm.go | 35 ++++++++++++++++++++++++++--------- src/tcp/tcp.go | 9 +++++---- src/tcp/tcp_test.go | 10 +++++----- 3 files changed, 36 insertions(+), 18 deletions(-) diff --git a/src/comm/comm.go b/src/comm/comm.go index c52f925..7e11989 100644 --- a/src/comm/comm.go +++ b/src/comm/comm.go @@ -15,8 +15,23 @@ type Comm struct { connection net.Conn } +func (c *Comm) IsClosed() bool { + one := []byte{} + c.connection.SetReadDeadline(time.Now()) + _, err := c.connection.Read(one) + if err != nil { + fmt.Println(err) + c.connection.Close() + c.connection = nil + return true + } else { + c.connection.SetReadDeadline(time.Now().Add(3 * time.Hour)) + } + return false +} + // NewConnection gets a new comm to a tcp address -func NewConnection(address string) (c Comm, err error) { +func NewConnection(address string) (c *Comm, err error) { connection, err := net.DialTimeout("tcp", address, 3*time.Second) if err != nil { return @@ -26,24 +41,26 @@ func NewConnection(address string) (c Comm, err error) { } // New returns a new comm -func New(c net.Conn) Comm { +func New(c net.Conn) *Comm { c.SetReadDeadline(time.Now().Add(3 * time.Hour)) c.SetDeadline(time.Now().Add(3 * time.Hour)) c.SetWriteDeadline(time.Now().Add(3 * time.Hour)) - return Comm{c} + comm := new(Comm) + comm.connection = c + return comm } // Connection returns the net.Conn connection -func (c Comm) Connection() net.Conn { +func (c *Comm) Connection() net.Conn { return c.connection } // Close closes the connection -func (c Comm) Close() { +func (c *Comm) Close() { c.connection.Close() } -func (c Comm) Write(b []byte) (int, error) { +func (c *Comm) Write(b []byte) (int, error) { header := new(bytes.Buffer) err := binary.Write(header, binary.LittleEndian, uint32(len(b))) if err != nil { @@ -62,7 +79,7 @@ func (c Comm) Write(b []byte) (int, error) { return n, err } -func (c Comm) Read() (buf []byte, numBytes int, bs []byte, err error) { +func (c *Comm) Read() (buf []byte, numBytes int, bs []byte, err error) { // read until we get 5 bytes header := make([]byte, 4) n, err := c.connection.Read(header) @@ -99,13 +116,13 @@ func (c Comm) Read() (buf []byte, numBytes int, bs []byte, err error) { } // Send a message -func (c Comm) Send(message []byte) (err error) { +func (c *Comm) Send(message []byte) (err error) { _, err = c.Write(message) return } // Receive a message -func (c Comm) Receive() (b []byte, err error) { +func (c *Comm) Receive() (b []byte, err error) { b, _, _, err = c.Read() return } diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index 41021ea..cb3624a 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -14,8 +14,8 @@ import ( const TCP_BUFFER_SIZE = 1024 * 64 type roomInfo struct { - first comm.Comm - second comm.Comm + first *comm.Comm + second *comm.Comm opened time.Time full bool } @@ -77,7 +77,7 @@ func run(port string) (err error) { } } -func clientCommuncation(port string, c comm.Comm) (err error) { +func clientCommuncation(port string, c *comm.Comm) (err error) { // send ok to tell client they are connected log.Debug("sending ok") err = c.Send([]byte("ok")) @@ -134,7 +134,7 @@ func clientCommuncation(port string, c comm.Comm) (err error) { wg.Add(1) // start piping - go func(com1, com2 comm.Comm, wg *sync.WaitGroup) { + go func(com1, com2 *comm.Comm, wg *sync.WaitGroup) { log.Debug("starting pipes") pipe(com1.Connection(), com2.Connection()) wg.Done() @@ -153,6 +153,7 @@ func clientCommuncation(port string, c comm.Comm) (err error) { log.Debugf("deleting room: %s", room) rooms.rooms[room].first.Close() rooms.rooms[room].second.Close() + rooms.rooms[room] = roomInfo{first: nil, second: nil} delete(rooms.rooms, room) rooms.Unlock() return nil diff --git a/src/tcp/tcp_test.go b/src/tcp/tcp_test.go index d336b3d..5f88b65 100644 --- a/src/tcp/tcp_test.go +++ b/src/tcp/tcp_test.go @@ -20,6 +20,7 @@ func TestTCP(t *testing.T) { _, err = ConnectToTCPServer("localhost:8081", "testRoom") assert.NotNil(t, err) + assert.False(t, c1.IsClosed()) // try sending data assert.Nil(t, c1.Send([]byte("hello, c2"))) data, err := c2.Receive() @@ -32,14 +33,13 @@ func TestTCP(t *testing.T) { assert.Equal(t, []byte("hello, c1"), data) c1.Close() + assert.True(t, c1.IsClosed()) + time.Sleep(200 * time.Millisecond) - err = c2.Send([]byte("test")) - assert.Nil(t, err) - _, err = c2.Receive() - assert.NotNil(t, err) + assert.True(t, c2.IsClosed()) } -func ConnectToTCPServer(address, room string) (c comm.Comm, err error) { +func ConnectToTCPServer(address, room string) (c *comm.Comm, err error) { c, err = comm.NewConnection("localhost:8081") if err != nil { return From 5b0c52a97b11ffebf7f71326de53889db12af681 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 15:46:40 -0600 Subject: [PATCH 007/110] don't dangle --- src/tcp/tcp.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index cb3624a..1e11b62 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -162,7 +162,7 @@ func clientCommuncation(port string, c *comm.Comm) (err error) { // chanFromConn creates a channel from a Conn object, and sends everything it // Read()s from the socket to the channel. func chanFromConn(conn net.Conn) chan []byte { - c := make(chan []byte) + c := make(chan []byte, 1) go func() { b := make([]byte, TCP_BUFFER_SIZE) @@ -181,6 +181,7 @@ func chanFromConn(conn net.Conn) chan []byte { break } } + log.Debug("exiting") }() return c From 2414593c91fe952caf6873dca1a5b4ee7a01074a Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 16:04:47 -0600 Subject: [PATCH 008/110] test sending 40mb --- src/comm/comm_test.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/comm/comm_test.go b/src/comm/comm_test.go index 41430bf..207b231 100644 --- a/src/comm/comm_test.go +++ b/src/comm/comm_test.go @@ -1,6 +1,7 @@ package comm import ( + "crypto/rand" "net" "testing" "time" @@ -11,6 +12,8 @@ import ( func TestComm(t *testing.T) { defer log.Flush() + token := make([]byte, 40000000) + rand.Read(token) port := "8001" go func() { @@ -37,6 +40,9 @@ func TestComm(t *testing.T) { data, err = c.Receive() assert.Nil(t, err) assert.Equal(t, []byte{'\x00'}, data) + data, err = c.Receive() + assert.Nil(t, err) + assert.Equal(t, token, data) }(port, connection) } }() @@ -49,4 +55,7 @@ func TestComm(t *testing.T) { assert.Nil(t, err) assert.Nil(t, a.Send([]byte("hello, computer"))) assert.Nil(t, a.Send([]byte{'\x00'})) + + assert.Nil(t, a.Send(token)) + } From 9030aae880069aa0351b8d0c462ce7e4ee16ea44 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 16:24:22 -0600 Subject: [PATCH 009/110] fix test --- src/tcp/tcp.go | 29 +++++++++++++++++++++++++++++ src/tcp/tcp_test.go | 34 ---------------------------------- 2 files changed, 29 insertions(+), 34 deletions(-) diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index 1e11b62..7ecf25a 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -1,6 +1,8 @@ package tcp import ( + "bytes" + "fmt" "net" "sync" "time" @@ -209,3 +211,30 @@ func pipe(conn1 net.Conn, conn2 net.Conn) { } } } +func ConnectToTCPServer(address, room string) (c *comm.Comm, err error) { + c, err = comm.NewConnection("localhost:8081") + if err != nil { + return + } + data, err := c.Receive() + if err != nil { + return + } + if !bytes.Equal(data, []byte("ok")) { + err = fmt.Errorf("got bad response: %s", data) + return + } + err = c.Send([]byte(room)) + if err != nil { + return + } + data, err = c.Receive() + if err != nil { + return + } + if !bytes.Equal(data, []byte("ok")) { + err = fmt.Errorf("got bad response: %s", data) + return + } + return +} diff --git a/src/tcp/tcp_test.go b/src/tcp/tcp_test.go index 5f88b65..1a75ae4 100644 --- a/src/tcp/tcp_test.go +++ b/src/tcp/tcp_test.go @@ -1,12 +1,9 @@ package tcp import ( - "bytes" - "fmt" "testing" "time" - "github.com/schollz/croc/src/comm" "github.com/stretchr/testify/assert" ) @@ -34,35 +31,4 @@ func TestTCP(t *testing.T) { c1.Close() assert.True(t, c1.IsClosed()) - - time.Sleep(200 * time.Millisecond) - assert.True(t, c2.IsClosed()) -} - -func ConnectToTCPServer(address, room string) (c *comm.Comm, err error) { - c, err = comm.NewConnection("localhost:8081") - if err != nil { - return - } - data, err := c.Receive() - if err != nil { - return - } - if !bytes.Equal(data, []byte("ok")) { - err = fmt.Errorf("got bad response: %s", data) - return - } - err = c.Send([]byte(room)) - if err != nil { - return - } - data, err = c.Receive() - if err != nil { - return - } - if !bytes.Equal(data, []byte("ok")) { - err = fmt.Errorf("got bad response: %s", data) - return - } - return } From 376591384ae0e6a434c3aeae13ea7a49aef3dbef Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 16:33:15 -0600 Subject: [PATCH 010/110] add more to tests --- src/compress/compress_test.go | 12 ++++++++++++ src/crypt/crypt_test.go | 13 +++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/compress/compress_test.go b/src/compress/compress_test.go index 563883d..b8682ff 100644 --- a/src/compress/compress_test.go +++ b/src/compress/compress_test.go @@ -75,4 +75,16 @@ func TestCompress(t *testing.T) { dataRateSavings = 100 * (1.0 - float64(len(compressedB))/float64(len(fable))) fmt.Printf("Level -2: %2.0f%% percent space savings\n", dataRateSavings) assert.True(t, len(compressedB) < len(fable)) + + data := make([]byte, 4096) + rand.Read(data) + compressedB = CompressWithOption(data, -2) + dataRateSavings = 100 * (1.0 - float64(len(compressedB))/float64(len(data))) + fmt.Printf("random, Level -2: %2.0f%% percent space savings\n", dataRateSavings) + + rand.Read(data) + compressedB = CompressWithOption(data, 9) + dataRateSavings = 100 * (1.0 - float64(len(compressedB))/float64(len(data))) + fmt.Printf("random, Level 9: %2.0f%% percent space savings\n", dataRateSavings) + } diff --git a/src/crypt/crypt_test.go b/src/crypt/crypt_test.go index 29d891e..2378601 100644 --- a/src/crypt/crypt_test.go +++ b/src/crypt/crypt_test.go @@ -30,4 +30,17 @@ func TestEncryption(t *testing.T) { dec, err := jane.Decrypt(enc) assert.Nil(t, err) assert.Equal(t, dec, []byte("hello, world")) + + jane2, err := New([]byte("password"), nil) + assert.Nil(t, err) + dec, err = jane2.Decrypt(enc) + assert.NotNil(t, err) + assert.NotEqual(t, dec, []byte("hello, world")) + + jane3, err := New([]byte("passwordwrong"), bob.Salt()) + assert.Nil(t, err) + dec, err = jane3.Decrypt(enc) + assert.NotNil(t, err) + assert.NotEqual(t, dec, []byte("hello, world")) + } From dcc768981613aa0386e6f40e94f93b70aca12d57 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 16:35:07 -0600 Subject: [PATCH 011/110] consolidate utils --- src/utils/exists.go | 13 ------ src/utils/getinput.go | 15 ------- src/utils/hash.go | 33 -------------- src/utils/ip.go | 39 ---------------- src/utils/ip_test.go | 11 ----- src/utils/randomname.go | 16 ------- src/utils/utils.go | 98 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 98 insertions(+), 127 deletions(-) delete mode 100644 src/utils/exists.go delete mode 100644 src/utils/getinput.go delete mode 100644 src/utils/hash.go delete mode 100644 src/utils/ip.go delete mode 100644 src/utils/ip_test.go delete mode 100644 src/utils/randomname.go create mode 100644 src/utils/utils.go diff --git a/src/utils/exists.go b/src/utils/exists.go deleted file mode 100644 index 4f4c743..0000000 --- a/src/utils/exists.go +++ /dev/null @@ -1,13 +0,0 @@ -package utils - -import "os" - -// Exists reports whether the named file or directory exists. -func Exists(name string) bool { - if _, err := os.Stat(name); err != nil { - if os.IsNotExist(err) { - return false - } - } - return true -} diff --git a/src/utils/getinput.go b/src/utils/getinput.go deleted file mode 100644 index 7c397ce..0000000 --- a/src/utils/getinput.go +++ /dev/null @@ -1,15 +0,0 @@ -package utils - -import ( - "bufio" - "fmt" - "os" - "strings" -) - -func GetInput(prompt string) string { - reader := bufio.NewReader(os.Stdin) - fmt.Fprintf(os.Stderr, "%s", prompt) - text, _ := reader.ReadString('\n') - return strings.TrimSpace(text) -} diff --git a/src/utils/hash.go b/src/utils/hash.go deleted file mode 100644 index 34d1c0d..0000000 --- a/src/utils/hash.go +++ /dev/null @@ -1,33 +0,0 @@ -package utils - -import ( - "crypto/md5" - "crypto/sha256" - "fmt" - "io" - "os" -) - -// HashFile returns the md5 hash of a file -func HashFile(fname string) (hash256 []byte, err error) { - f, err := os.Open(fname) - if err != nil { - return - } - defer f.Close() - - h := md5.New() - if _, err = io.Copy(h, f); err != nil { - return - } - - hash256 = h.Sum(nil) - return -} - -// SHA256 returns sha256 sum -func SHA256(s string) string { - sha := sha256.New() - sha.Write([]byte(s)) - return fmt.Sprintf("%x", sha.Sum(nil)) -} diff --git a/src/utils/ip.go b/src/utils/ip.go deleted file mode 100644 index 4142fdf..0000000 --- a/src/utils/ip.go +++ /dev/null @@ -1,39 +0,0 @@ -package utils - -import ( - "io/ioutil" - "log" - "net" - "net/http" - "strings" -) - -func PublicIP() (ip string, err error) { - resp, err := http.Get("https://canhazip.com") - if err != nil { - return - } - defer resp.Body.Close() - - if resp.StatusCode == http.StatusOK { - bodyBytes, err := ioutil.ReadAll(resp.Body) - if err != nil { - return "", err - } - ip = strings.TrimSpace(string(bodyBytes)) - } - return -} - -// Get preferred outbound ip of this machine -func LocalIP() string { - conn, err := net.Dial("udp", "8.8.8.8:80") - if err != nil { - log.Fatal(err) - } - defer conn.Close() - - localAddr := conn.LocalAddr().(*net.UDPAddr) - - return localAddr.IP.String() -} diff --git a/src/utils/ip_test.go b/src/utils/ip_test.go deleted file mode 100644 index ae3fcf6..0000000 --- a/src/utils/ip_test.go +++ /dev/null @@ -1,11 +0,0 @@ -package utils - -import ( - "fmt" - "testing" -) - -func TestGetIP(t *testing.T) { - fmt.Println(PublicIP()) - fmt.Println(LocalIP()) -} diff --git a/src/utils/randomname.go b/src/utils/randomname.go deleted file mode 100644 index b044e09..0000000 --- a/src/utils/randomname.go +++ /dev/null @@ -1,16 +0,0 @@ -package utils - -import ( - "crypto/rand" - "strings" - - "github.com/schollz/mnemonicode" -) - -func GetRandomName() string { - result := []string{} - bs := make([]byte, 4) - rand.Read(bs) - result = mnemonicode.EncodeWordList(result, bs) - return strings.Join(result, "-") -} diff --git a/src/utils/utils.go b/src/utils/utils.go new file mode 100644 index 0000000..4b444be --- /dev/null +++ b/src/utils/utils.go @@ -0,0 +1,98 @@ +package utils + +import ( + "bufio" + "crypto/md5" + "crypto/rand" + "crypto/sha256" + "fmt" + "io" + "io/ioutil" + "log" + "net" + "net/http" + "os" + "strings" + + "github.com/schollz/mnemonicode" +) + +// Exists reports whether the named file or directory exists. +func Exists(name string) bool { + if _, err := os.Stat(name); err != nil { + if os.IsNotExist(err) { + return false + } + } + return true +} + +// GetInput returns the input with a given prompt +func GetInput(prompt string) string { + reader := bufio.NewReader(os.Stdin) + fmt.Fprintf(os.Stderr, "%s", prompt) + text, _ := reader.ReadString('\n') + return strings.TrimSpace(text) +} + +// HashFile returns the md5 hash of a file +func HashFile(fname string) (hash256 []byte, err error) { + f, err := os.Open(fname) + if err != nil { + return + } + defer f.Close() + + h := md5.New() + if _, err = io.Copy(h, f); err != nil { + return + } + + hash256 = h.Sum(nil) + return +} + +// SHA256 returns sha256 sum +func SHA256(s string) string { + sha := sha256.New() + sha.Write([]byte(s)) + return fmt.Sprintf("%x", sha.Sum(nil)) +} + +func PublicIP() (ip string, err error) { + resp, err := http.Get("https://canhazip.com") + if err != nil { + return + } + defer resp.Body.Close() + + if resp.StatusCode == http.StatusOK { + bodyBytes, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + ip = strings.TrimSpace(string(bodyBytes)) + } + return +} + +// Get preferred outbound ip of this machine +func LocalIP() string { + conn, err := net.Dial("udp", "8.8.8.8:80") + if err != nil { + log.Fatal(err) + } + defer conn.Close() + + localAddr := conn.LocalAddr().(*net.UDPAddr) + + return localAddr.IP.String() +} + +func GetRandomName() string { + result := []string{} + bs := make([]byte, 4) + rand.Read(bs) + result = mnemonicode.EncodeWordList(result, bs) + return strings.Join(result, "-") +} From 1f49966bb12bb6d633dc670eaa685770a0247a68 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 16:48:17 -0600 Subject: [PATCH 012/110] use new version of croc --- src/croc/config.go | 187 ---------- src/croc/croc.go | 768 +++++++++++++++++++++++++++++++++++++----- src/croc/croc_test.go | 81 ----- src/croc/models.go | 7 - src/croc/recipient.go | 624 ---------------------------------- src/croc/sender.go | 570 ------------------------------- src/croc/sending.go | 217 ------------ 7 files changed, 689 insertions(+), 1765 deletions(-) delete mode 100644 src/croc/config.go delete mode 100644 src/croc/croc_test.go delete mode 100644 src/croc/models.go delete mode 100644 src/croc/recipient.go delete mode 100644 src/croc/sender.go delete mode 100644 src/croc/sending.go diff --git a/src/croc/config.go b/src/croc/config.go deleted file mode 100644 index 8a37560..0000000 --- a/src/croc/config.go +++ /dev/null @@ -1,187 +0,0 @@ -package croc - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - "path" - "path/filepath" - "time" - - "github.com/BurntSushi/toml" - homedir "github.com/mitchellh/go-homedir" - "github.com/schollz/croc/src/utils" -) - -type Config struct { - // Relay parameters - RelayWebsocketPort string - RelayTCPPorts []string - - // Sender parameters - CurveType string - - // Options for connecting to server - PublicServerIP string - AddressTCPPorts []string - AddressWebsocketPort string - Timeout time.Duration - LocalOnly bool - NoLocal bool - - // Options for file transfering - UseEncryption bool - UseCompression bool - AllowLocalDiscovery bool - NoRecipientPrompt bool - ForceTCP bool - ForceWebsockets bool - Codephrase string -} - -func defaultConfig() Config { - c := Config{} - cr := Init(false) - c.RelayWebsocketPort = cr.RelayWebsocketPort - c.RelayTCPPorts = cr.RelayTCPPorts - c.CurveType = cr.CurveType - c.PublicServerIP = cr.Address - c.AddressTCPPorts = cr.AddressTCPPorts - c.AddressWebsocketPort = cr.AddressWebsocketPort - c.Timeout = cr.Timeout - c.LocalOnly = cr.LocalOnly - c.NoLocal = cr.NoLocal - c.UseEncryption = cr.UseEncryption - c.UseCompression = cr.UseCompression - c.AllowLocalDiscovery = cr.AllowLocalDiscovery - c.NoRecipientPrompt = cr.NoRecipientPrompt - c.ForceTCP = false - c.ForceWebsockets = false - c.Codephrase = "" - return c -} - -func SaveDefaultConfig() error { - homedir, err := homedir.Dir() - if err != nil { - return err - } - os.MkdirAll(path.Join(homedir, ".config", "croc"), 0755) - c := defaultConfig() - buf := new(bytes.Buffer) - toml.NewEncoder(buf).Encode(c) - confTOML := buf.String() - err = ioutil.WriteFile(path.Join(homedir, ".config", "croc", "config.toml"), []byte(confTOML), 0644) - if err == nil { - fmt.Printf("Default config file written at '%s'\r\n", filepath.Clean(path.Join(homedir, ".config", "croc", "config.toml"))) - } - return err -} - -// LoadConfig will override parameters -func (cr *Croc) LoadConfig() (err error) { - homedir, err := homedir.Dir() - if err != nil { - return err - } - pathToConfig := path.Join(homedir, ".config", "croc", "config.toml") - if !utils.Exists(pathToConfig) { - // ignore if doesn't exist - return nil - } - - var c Config - _, err = toml.DecodeFile(pathToConfig, &c) - if err != nil { - return - } - - cDefault := defaultConfig() - // only load if things are different than defaults - // just in case the CLI parameters are used - if c.RelayWebsocketPort != cDefault.RelayWebsocketPort && cr.RelayWebsocketPort == cDefault.RelayWebsocketPort { - cr.RelayWebsocketPort = c.RelayWebsocketPort - fmt.Printf("loaded RelayWebsocketPort from config\n") - } - if !slicesEqual(c.RelayTCPPorts, cDefault.RelayTCPPorts) && slicesEqual(cr.RelayTCPPorts, cDefault.RelayTCPPorts) { - cr.RelayTCPPorts = c.RelayTCPPorts - fmt.Printf("loaded RelayTCPPorts from config\n") - } - if c.CurveType != cDefault.CurveType && cr.CurveType == cDefault.CurveType { - cr.CurveType = c.CurveType - fmt.Printf("loaded CurveType from config\n") - } - if c.PublicServerIP != cDefault.PublicServerIP && cr.Address == cDefault.PublicServerIP { - cr.Address = c.PublicServerIP - fmt.Printf("loaded Address from config\n") - } - if !slicesEqual(c.AddressTCPPorts, cDefault.AddressTCPPorts) { - cr.AddressTCPPorts = c.AddressTCPPorts - fmt.Printf("loaded AddressTCPPorts from config\n") - } - if c.AddressWebsocketPort != cDefault.AddressWebsocketPort && cr.AddressWebsocketPort == cDefault.AddressWebsocketPort { - cr.AddressWebsocketPort = c.AddressWebsocketPort - fmt.Printf("loaded AddressWebsocketPort from config\n") - } - if c.Timeout != cDefault.Timeout && cr.Timeout == cDefault.Timeout { - cr.Timeout = c.Timeout - fmt.Printf("loaded Timeout from config\n") - } - if c.LocalOnly != cDefault.LocalOnly && cr.LocalOnly == cDefault.LocalOnly { - cr.LocalOnly = c.LocalOnly - fmt.Printf("loaded LocalOnly from config\n") - } - if c.NoLocal != cDefault.NoLocal && cr.NoLocal == cDefault.NoLocal { - cr.NoLocal = c.NoLocal - fmt.Printf("loaded NoLocal from config\n") - } - if c.UseEncryption != cDefault.UseEncryption && cr.UseEncryption == cDefault.UseEncryption { - cr.UseEncryption = c.UseEncryption - fmt.Printf("loaded UseEncryption from config\n") - } - if c.UseCompression != cDefault.UseCompression && cr.UseCompression == cDefault.UseCompression { - cr.UseCompression = c.UseCompression - fmt.Printf("loaded UseCompression from config\n") - } - if c.AllowLocalDiscovery != cDefault.AllowLocalDiscovery && cr.AllowLocalDiscovery == cDefault.AllowLocalDiscovery { - cr.AllowLocalDiscovery = c.AllowLocalDiscovery - fmt.Printf("loaded AllowLocalDiscovery from config\n") - } - if c.NoRecipientPrompt != cDefault.NoRecipientPrompt && cr.NoRecipientPrompt == cDefault.NoRecipientPrompt { - cr.NoRecipientPrompt = c.NoRecipientPrompt - fmt.Printf("loaded NoRecipientPrompt from config\n") - } - if c.ForceWebsockets { - cr.ForceSend = 1 - } - if c.ForceTCP { - cr.ForceSend = 2 - } - if c.Codephrase != cDefault.Codephrase && cr.Codephrase == cDefault.Codephrase { - cr.Codephrase = c.Codephrase - fmt.Printf("loaded Codephrase from config\n") - } - return -} - -// slicesEqual checcks if two slices are equal -// from https://stackoverflow.com/a/15312097 -func slicesEqual(a, b []string) bool { - // If one is nil, the other must also be nil. - if (a == nil) != (b == nil) { - return false - } - - if len(a) != len(b) { - return false - } - - for i := range a { - if a[i] != b[i] { - return false - } - } - - return true -} diff --git a/src/croc/croc.go b/src/croc/croc.go index fd11e20..490c424 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -1,96 +1,706 @@ package croc import ( - "runtime" + "bytes" + "crypto/elliptic" + "encoding/base64" + "encoding/json" + "fmt" + "io" + "math" + "os" + "path" + "path/filepath" + "strings" + "sync" "time" - "github.com/schollz/croc/src/logger" - "github.com/schollz/croc/src/models" - "github.com/schollz/croc/src/relay" - "github.com/schollz/croc/src/zipper" + "github.com/denisbrodbeck/machineid" + "github.com/go-redis/redis" + "github.com/mattn/go-colorable" + "github.com/pions/webrtc" + "github.com/schollz/croc/v5/src/crypt" + "github.com/schollz/croc/v5/src/utils" + "github.com/schollz/croc/v5/src/webrtc/pkg/session/common" + "github.com/schollz/croc/v5/src/webrtc/pkg/session/receiver" + "github.com/schollz/croc/v5/src/webrtc/pkg/session/sender" + "github.com/schollz/pake" "github.com/schollz/progressbar/v2" + "github.com/schollz/spinner" + "github.com/sirupsen/logrus" ) +const BufferSize = 4096 * 10 +const Channels = 1 + +var log = logrus.New() + func init() { - runtime.GOMAXPROCS(runtime.NumCPU()) + log.SetFormatter(&logrus.TextFormatter{ForceColors: true}) + log.SetOutput(colorable.NewColorableStdout()) + Debug(false) } -// Croc options -type Croc struct { - // Version is the version of croc - Version string - // Options for all - Debug bool - // ShowText will display text on the stderr - ShowText bool - - // Options for relay - RelayWebsocketPort string - RelayTCPPorts []string - CurveType string - - // Options for connecting to server - Address string - AddressTCPPorts []string - AddressWebsocketPort string - Timeout time.Duration - LocalOnly bool - NoLocal bool - - // Options for file transfering - UseEncryption bool - UseCompression bool - AllowLocalDiscovery bool - NoRecipientPrompt bool - Stdout bool - ForceSend int // 0: ignore, 1: websockets, 2: TCP - - // Parameters for file transfer - Filename string - Codephrase string - - // localIP address - localIP string - // is using local relay - isLocal bool - normalFinish bool - - // state variables - StateString string - Bar *progressbar.ProgressBar - FileInfo models.FileStats - OtherIP string - - // special for window - WindowRecipientPrompt bool - WindowRecipientAccept bool - WindowReceivingString string -} - -// Init will initiate with the default parameters -func Init(debug bool) (c *Croc) { - c = new(Croc) - c.UseCompression = true - c.UseEncryption = true - c.AllowLocalDiscovery = true - c.RelayWebsocketPort = "8153" - c.RelayTCPPorts = []string{"8154", "8155", "8156", "8157", "8158", "8159", "8160", "8161"} - c.CurveType = "siec" - c.Address = "croc4.schollz.com" - c.AddressWebsocketPort = "8153" - c.AddressTCPPorts = []string{"8154", "8155", "8156", "8157", "8158", "8159", "8160", "8161"} - c.NoRecipientPrompt = true - debugLevel := "info" +func Debug(debug bool) { + receiver.Debug(debug) + sender.Debug(debug) if debug { - debugLevel = "debug" - c.Debug = true + log.SetLevel(logrus.DebugLevel) + } else { + log.SetLevel(logrus.WarnLevel) } - SetDebugLevel(debugLevel) +} + +type Client struct { + Options Options + // basic setup + redisdb *redis.Client + log *logrus.Entry + Pake *pake.Pake + + // steps involved in forming relationship + Step1ChannelSecured bool + Step2FileInfoTransfered bool + Step3RecipientRequestFile bool + Step4FileTransfer bool + Step5CloseChannels bool // TODO: Step5 should close files and reset things + + // send / receive information of all files + FilesToTransfer []FileInfo + FilesToTransferCurrentNum int + + // send / receive information of current file + CurrentFile *os.File + CurrentFileChunks []int64 + + sendSess *sender.Session + recvSess *receiver.Session + + // channel data + incomingMessageChannel <-chan *redis.Message + nameOutChannel string + nameInChannel string + + // webrtc connections + peerConnection [8]*webrtc.PeerConnection + dataChannel [8]*webrtc.DataChannel + + bar *progressbar.ProgressBar + spinner *spinner.Spinner + machineID string + + mutex *sync.Mutex + quit chan bool +} + +type Message struct { + Type string `json:"t,omitempty"` + Message string `json:"m,omitempty"` + Bytes []byte `json:"b,omitempty"` + Num int `json:"n,omitempty"` +} + +type Chunk struct { + Bytes []byte `json:"b,omitempty"` + Location int64 `json:"l,omitempty"` +} + +type FileInfo struct { + Name string `json:"n,omitempty"` + FolderRemote string `json:"fr,omitempty"` + FolderSource string `json:"fs,omitempty"` + Hash []byte `json:"h,omitempty"` + Size int64 `json:"s,omitempty"` + ModTime time.Time `json:"m,omitempty"` + IsCompressed bool `json:"c,omitempty"` + IsEncrypted bool `json:"e,omitempty"` +} + +type RemoteFileRequest struct { + CurrentFileChunks []int64 + FilesToTransferCurrentNum int +} + +type SenderInfo struct { + MachineID string + FilesToTransfer []FileInfo +} + +func (m Message) String() string { + b, _ := json.Marshal(m) + return string(b) +} + +type Options struct { + IsSender bool + SharedSecret string + Debug bool + AddressRelay string + Stdout bool + NoPrompt bool +} + +// New establishes a new connection for transfering files between two instances. +func New(ops Options) (c *Client, err error) { + c = new(Client) + + // setup basic info + c.Options = ops + Debug(c.Options.Debug) + log.Debugf("options: %+v", c.Options) + + // set channels + if c.Options.IsSender { + c.nameOutChannel = c.Options.SharedSecret + "2" + c.nameInChannel = c.Options.SharedSecret + "1" + } else { + c.nameOutChannel = c.Options.SharedSecret + "1" + c.nameInChannel = c.Options.SharedSecret + "2" + } + + // initialize redis for communication in establishing channel + c.redisdb = redis.NewClient(&redis.Options{ + Addr: c.Options.AddressRelay, + Password: "", + DB: 4, + WriteTimeout: 1 * time.Hour, + ReadTimeout: 1 * time.Hour, + }) + _, err = c.redisdb.Ping().Result() + if err != nil { + return + } + + // setup channel for listening + pubsub := c.redisdb.Subscribe(c.nameInChannel) + _, err = pubsub.Receive() + if err != nil { + return + } + c.incomingMessageChannel = pubsub.Channel() + + // initialize pake + if c.Options.IsSender { + c.Pake, err = pake.Init([]byte(c.Options.SharedSecret), 1, elliptic.P521(), 1*time.Microsecond) + } else { + c.Pake, err = pake.Init([]byte(c.Options.SharedSecret), 0, elliptic.P521(), 1*time.Microsecond) + } + if err != nil { + return + } + + // initialize logger + c.log = log.WithFields(logrus.Fields{ + "is": "sender", + }) + if !c.Options.IsSender { + c.log = log.WithFields(logrus.Fields{ + "is": "recipient", + }) + } + + c.spinner = spinner.New(spinner.CharSets[9], 100*time.Millisecond) + c.spinner.Writer = os.Stderr + c.spinner.Suffix = " connecting..." + + c.mutex = &sync.Mutex{} return } -func SetDebugLevel(debugLevel string) { - logger.SetLogLevel(debugLevel) - relay.DebugLevel = debugLevel - zipper.DebugLevel = debugLevel +type TransferOptions struct { + PathToFiles []string + KeepPathInRemote bool +} + +// Send will send the specified file +func (c *Client) Send(options TransferOptions) (err error) { + return c.transfer(options) +} + +// Receive will receive a file +func (c *Client) Receive() (err error) { + return c.transfer(TransferOptions{}) +} + +func (c *Client) transfer(options TransferOptions) (err error) { + if c.Options.IsSender { + c.FilesToTransfer = make([]FileInfo, len(options.PathToFiles)) + totalFilesSize := int64(0) + for i, pathToFile := range options.PathToFiles { + var fstats os.FileInfo + var fullPath string + fullPath, err = filepath.Abs(pathToFile) + if err != nil { + return + } + fullPath = filepath.Clean(fullPath) + var folderName string + folderName, _ = filepath.Split(fullPath) + + fstats, err = os.Stat(fullPath) + if err != nil { + return + } + c.FilesToTransfer[i] = FileInfo{ + Name: fstats.Name(), + FolderRemote: ".", + FolderSource: folderName, + Size: fstats.Size(), + ModTime: fstats.ModTime(), + } + c.FilesToTransfer[i].Hash, err = utils.HashFile(fullPath) + totalFilesSize += fstats.Size() + if err != nil { + return + } + if options.KeepPathInRemote { + var curFolder string + curFolder, err = os.Getwd() + if err != nil { + return + } + curFolder, err = filepath.Abs(curFolder) + if err != nil { + return + } + if !strings.HasPrefix(folderName, curFolder) { + err = fmt.Errorf("remote directory must be relative to current") + return + } + c.FilesToTransfer[i].FolderRemote = strings.TrimPrefix(folderName, curFolder) + c.FilesToTransfer[i].FolderRemote = filepath.ToSlash(c.FilesToTransfer[i].FolderRemote) + c.FilesToTransfer[i].FolderRemote = strings.TrimPrefix(c.FilesToTransfer[i].FolderRemote, "/") + if c.FilesToTransfer[i].FolderRemote == "" { + c.FilesToTransfer[i].FolderRemote = "." + } + } + log.Debugf("file %d info: %+v", i, c.FilesToTransfer[i]) + } + fname := fmt.Sprintf("%d files", len(c.FilesToTransfer)) + if len(c.FilesToTransfer) == 1 { + fname = fmt.Sprintf("'%s'", c.FilesToTransfer[0].Name) + } + machID, macIDerr := machineid.ID() + if macIDerr != nil { + log.Error(macIDerr) + return + } + if len(machID) > 6 { + machID = machID[:6] + } + c.machineID = machID + fmt.Fprintf(os.Stderr, "Sending %s (%s) from your machine, '%s'\n", fname, utils.ByteCountDecimal(totalFilesSize), machID) + fmt.Fprintf(os.Stderr, "Code is: %s\nOn the other computer run\n\ncroc %s\n", c.Options.SharedSecret, c.Options.SharedSecret) + c.spinner.Suffix = " waiting for recipient..." + } + c.spinner.Start() + // create channel for quitting + // quit with c.quit <- true + c.quit = make(chan bool) + + // if recipient, initialize with sending pake information + c.log.Debug("ready") + if !c.Options.IsSender && !c.Step1ChannelSecured { + err = c.redisdb.Publish(c.nameOutChannel, Message{ + Type: "pake", + Bytes: c.Pake.Bytes(), + }.String()).Err() + if err != nil { + return + } + } + + // listen for incoming messages and process them + for { + select { + case <-c.quit: + return + case msg := <-c.incomingMessageChannel: + var m Message + err = json.Unmarshal([]byte(msg.Payload), &m) + if err != nil { + return + } + if m.Type == "finished" { + err = c.redisdb.Publish(c.nameOutChannel, Message{ + Type: "finished", + }.String()).Err() + return err + } + err = c.processMessage(m) + if err != nil { + return + } + default: + time.Sleep(1 * time.Millisecond) + } + } + return +} + +func (c *Client) sendOverRedis() (err error) { + go func() { + c.bar = progressbar.NewOptions( + int(c.FilesToTransfer[c.FilesToTransferCurrentNum].Size), + progressbar.OptionSetRenderBlankState(true), + progressbar.OptionSetBytes(int(c.FilesToTransfer[c.FilesToTransferCurrentNum].Size)), + progressbar.OptionSetWriter(os.Stderr), + progressbar.OptionThrottle(1/60*time.Second), + ) + c.CurrentFile, err = os.Open(c.FilesToTransfer[c.FilesToTransferCurrentNum].Name) + if err != nil { + panic(err) + } + location := int64(0) + for { + buf := make([]byte, 4096*128) + n, errRead := c.CurrentFile.Read(buf) + c.bar.Add(n) + chunk := Chunk{ + Bytes: buf[:n], + Location: location, + } + chunkB, _ := json.Marshal(chunk) + err = c.redisdb.Publish(c.nameOutChannel, Message{ + Type: "chunk", + Bytes: chunkB, + }.String()).Err() + if err != nil { + panic(err) + } + location += int64(n) + if errRead == io.EOF { + break + } + if errRead != nil { + panic(errRead) + } + } + }() + return +} + +func (c *Client) processMessage(m Message) (err error) { + switch m.Type { + case "pake": + if c.spinner.Suffix != " performing PAKE..." { + c.spinner.Stop() + c.spinner.Suffix = " performing PAKE..." + c.spinner.Start() + } + notVerified := !c.Pake.IsVerified() + err = c.Pake.Update(m.Bytes) + if err != nil { + return + } + if (notVerified && c.Pake.IsVerified() && !c.Options.IsSender) || !c.Pake.IsVerified() { + err = c.redisdb.Publish(c.nameOutChannel, Message{ + Type: "pake", + Bytes: c.Pake.Bytes(), + }.String()).Err() + } + if c.Pake.IsVerified() { + c.log.Debug(c.Pake.SessionKey()) + c.Step1ChannelSecured = true + } + case "error": + c.spinner.Stop() + fmt.Print("\r") + err = fmt.Errorf("peer error: %s", m.Message) + return err + case "fileinfo": + var senderInfo SenderInfo + var decryptedBytes []byte + key, _ := c.Pake.SessionKey() + decryptedBytes, err = crypt.DecryptFromBytes(m.Bytes, key) + if err != nil { + log.Error(err) + return + } + err = json.Unmarshal(decryptedBytes, &senderInfo) + if err != nil { + log.Error(err) + return + } + c.FilesToTransfer = senderInfo.FilesToTransfer + fname := fmt.Sprintf("%d files", len(c.FilesToTransfer)) + if len(c.FilesToTransfer) == 1 { + fname = fmt.Sprintf("'%s'", c.FilesToTransfer[0].Name) + } + totalSize := int64(0) + for _, fi := range c.FilesToTransfer { + totalSize += fi.Size + } + c.spinner.Stop() + if !c.Options.NoPrompt { + fmt.Fprintf(os.Stderr, "\rAccept %s (%s) from machine '%s'? (y/n) ", fname, utils.ByteCountDecimal(totalSize), senderInfo.MachineID) + if strings.ToLower(strings.TrimSpace(utils.GetInput(""))) != "y" { + err = c.redisdb.Publish(c.nameOutChannel, Message{ + Type: "error", + Message: "refusing files", + }.String()).Err() + return fmt.Errorf("refused files") + } + } else { + fmt.Fprintf(os.Stderr, "\rReceiving %s (%s) from machine '%s'\n", fname, utils.ByteCountDecimal(totalSize), senderInfo.MachineID) + } + c.log.Debug(c.FilesToTransfer) + c.Step2FileInfoTransfered = true + case "recipientready": + var remoteFile RemoteFileRequest + var decryptedBytes []byte + key, _ := c.Pake.SessionKey() + decryptedBytes, err = crypt.DecryptFromBytes(m.Bytes, key) + if err != nil { + log.Error(err) + return + } + err = json.Unmarshal(decryptedBytes, &remoteFile) + if err != nil { + return + } + c.FilesToTransferCurrentNum = remoteFile.FilesToTransferCurrentNum + c.CurrentFileChunks = remoteFile.CurrentFileChunks + c.Step3RecipientRequestFile = true + case "datachannel-offer": + err = c.dataChannelReceive() + if err != nil { + return + } + err = c.recvSess.SetSDP(m.Message) + if err != nil { + return + } + var answer string + answer, err = c.recvSess.CreateAnswer() + if err != nil { + return + } + // Output the answer in base64 so we can paste it in browser + err = c.redisdb.Publish(c.nameOutChannel, Message{ + Type: "datachannel-answer", + Message: answer, + Num: m.Num, + }.String()).Err() + // start receiving data + pathToFile := path.Join(c.FilesToTransfer[c.FilesToTransferCurrentNum].FolderRemote, c.FilesToTransfer[c.FilesToTransferCurrentNum].Name) + c.spinner.Stop() + key, _ := c.Pake.SessionKey() + c.recvSess.ReceiveData(pathToFile, c.FilesToTransfer[c.FilesToTransferCurrentNum].Size, key) + log.Debug("sending close-sender") + err = c.redisdb.Publish(c.nameOutChannel, Message{ + Type: "close-sender", + }.String()).Err() + case "datachannel-answer": + c.log.Debug("got answer:", m.Message) + // Apply the answer as the remote description + err = c.sendSess.SetSDP(m.Message) + pathToFile := path.Join(c.FilesToTransfer[c.FilesToTransferCurrentNum].FolderSource, c.FilesToTransfer[c.FilesToTransferCurrentNum].Name) + c.spinner.Stop() + fmt.Fprintf(os.Stderr, "\r\nTransfering...\n") + key, _ := c.Pake.SessionKey() + c.sendSess.TransferFile(pathToFile, key) + case "close-sender": + log.Debug("close-sender received...") + c.Step4FileTransfer = false + c.Step3RecipientRequestFile = false + c.sendSess.StopSending() + log.Debug("sending close-recipient") + err = c.redisdb.Publish(c.nameOutChannel, Message{ + Type: "close-recipient", + Num: m.Num, + }.String()).Err() + case "close-recipient": + c.Step4FileTransfer = false + c.Step3RecipientRequestFile = false + } + if err != nil { + return + } + err = c.updateState() + + return +} + +func (c *Client) updateState() (err error) { + if c.Options.IsSender && c.Step1ChannelSecured && !c.Step2FileInfoTransfered { + var b []byte + b, err = json.Marshal(SenderInfo{ + MachineID: c.machineID, + FilesToTransfer: c.FilesToTransfer, + }) + if err != nil { + log.Error(err) + return + } + key, _ := c.Pake.SessionKey() + err = c.redisdb.Publish(c.nameOutChannel, Message{ + Type: "fileinfo", + Bytes: crypt.EncryptToBytes(b, key), + }.String()).Err() + if err != nil { + return + } + c.Step2FileInfoTransfered = true + } + if !c.Options.IsSender && c.Step2FileInfoTransfered && !c.Step3RecipientRequestFile { + // find the next file to transfer and send that number + // if the files are the same size, then look for missing chunks + finished := true + for i, fileInfo := range c.FilesToTransfer { + if i < c.FilesToTransferCurrentNum { + continue + } + fileHash, errHash := utils.HashFile(path.Join(fileInfo.FolderRemote, fileInfo.Name)) + if errHash != nil || !bytes.Equal(fileHash, fileInfo.Hash) { + if !bytes.Equal(fileHash, fileInfo.Hash) { + log.Debugf("hashes are not equal %x != %x", fileHash, fileInfo.Hash) + } + finished = false + c.FilesToTransferCurrentNum = i + break + } + // TODO: print out something about this file already existing + } + if finished { + // TODO: do the last finishing stuff + log.Debug("finished") + err = c.redisdb.Publish(c.nameOutChannel, Message{ + Type: "finished", + }.String()).Err() + if err != nil { + panic(err) + } + } + + // start initiating the process to receive a new file + log.Debugf("working on file %d", c.FilesToTransferCurrentNum) + + // recipient requests the file and chunks (if empty, then should receive all chunks) + bRequest, _ := json.Marshal(RemoteFileRequest{ + CurrentFileChunks: c.CurrentFileChunks, + FilesToTransferCurrentNum: c.FilesToTransferCurrentNum, + }) + key, _ := c.Pake.SessionKey() + err = c.redisdb.Publish(c.nameOutChannel, Message{ + Type: "recipientready", + Bytes: crypt.EncryptToBytes(bRequest, key), + }.String()).Err() + if err != nil { + return + } + c.Step3RecipientRequestFile = true + err = c.dataChannelReceive() + } + if c.Options.IsSender && c.Step3RecipientRequestFile && !c.Step4FileTransfer { + c.log.Debug("start sending data!") + err = c.dataChannelSend() + c.Step4FileTransfer = true + } + return +} + +func (c *Client) dataChannelReceive() (err error) { + c.recvSess = receiver.NewWith(receiver.Config{}) + err = c.recvSess.CreateConnection() + if err != nil { + return + } + c.recvSess.CreateDataHandler() + return +} + +func (c *Client) dataChannelSend() (err error) { + c.sendSess = sender.NewWith(sender.Config{ + Configuration: common.Configuration{ + OnCompletion: func() { + }, + }, + }) + + if err := c.sendSess.CreateConnection(); err != nil { + log.Error(err) + return err + } + if err := c.sendSess.CreateDataChannel(); err != nil { + log.Error(err) + return err + } + offer, err := c.sendSess.CreateOffer() + if err != nil { + log.Error(err) + return err + } + + // sending offer + err = c.redisdb.Publish(c.nameOutChannel, Message{ + Type: "datachannel-offer", + Message: offer, + }.String()).Err() + if err != nil { + return + } + + return +} + +// MissingChunks returns the positions of missing chunks. +// If file doesn't exist, it returns an empty chunk list (all chunks). +// If the file size is not the same as requested, it returns an empty chunk list (all chunks). +func MissingChunks(fname string, fsize int64, chunkSize int) (chunks []int64) { + fstat, err := os.Stat(fname) + if fstat.Size() != fsize { + return + } + + f, err := os.Open(fname) + if err != nil { + return + } + defer f.Close() + + buffer := make([]byte, chunkSize) + emptyBuffer := make([]byte, chunkSize) + chunkNum := 0 + chunks = make([]int64, int64(math.Ceil(float64(fsize)/float64(chunkSize)))) + var currentLocation int64 + for { + bytesread, err := f.Read(buffer) + if err != nil { + break + } + if bytes.Equal(buffer[:bytesread], emptyBuffer[:bytesread]) { + chunks[chunkNum] = currentLocation + } + currentLocation += int64(bytesread) + } + if chunkNum == 0 { + chunks = []int64{} + } else { + chunks = chunks[:chunkNum] + } + return +} + +// Encode encodes the input in base64 +// It can optionally zip the input before encoding +func Encode(obj interface{}) string { + b, err := json.Marshal(obj) + if err != nil { + panic(err) + } + + return base64.StdEncoding.EncodeToString(b) +} + +// Decode decodes the input from base64 +// It can optionally unzip the input after decoding +func Decode(in string, obj interface{}) (err error) { + b, err := base64.StdEncoding.DecodeString(in) + if err != nil { + return + } + + err = json.Unmarshal(b, obj) + return } diff --git a/src/croc/croc_test.go b/src/croc/croc_test.go deleted file mode 100644 index 65b07c6..0000000 --- a/src/croc/croc_test.go +++ /dev/null @@ -1,81 +0,0 @@ -package croc - -import ( - "crypto/rand" - "fmt" - "io/ioutil" - "os" - "sync" - "testing" - "time" - - "github.com/schollz/croc/src/utils" - "github.com/stretchr/testify/assert" -) - -func sendAndReceive(t *testing.T, forceSend int, local bool) { - room := utils.GetRandomName() - var startTime time.Time - var durationPerMegabyte float64 - megabytes := 1 - if local { - megabytes = 100 - } - fname := generateRandomFile(megabytes) - var wg sync.WaitGroup - wg.Add(2) - go func() { - defer wg.Done() - c := Init(true) - c.NoLocal = !local - // c.AddressTCPPorts = []string{"8154", "8155"} - c.ForceSend = forceSend - c.UseCompression = true - c.UseEncryption = true - assert.Nil(t, c.Send(fname, room)) - }() - go func() { - defer wg.Done() - time.Sleep(5 * time.Second) - os.MkdirAll("test", 0755) - os.Chdir("test") - c := Init(true) - c.NoLocal = !local - // c.AddressTCPPorts = []string{"8154", "8155"} - c.ForceSend = forceSend - startTime = time.Now() - assert.Nil(t, c.Receive(room)) - durationPerMegabyte = float64(megabytes) / time.Since(startTime).Seconds() - assert.True(t, utils.Exists(fname)) - }() - wg.Wait() - os.Chdir("..") - os.RemoveAll("test") - os.Remove(fname) - fmt.Printf("\n-----\n%2.1f MB/s\n----\n", durationPerMegabyte) -} - -func TestSendReceivePubWebsockets(t *testing.T) { - sendAndReceive(t, 1, false) -} - -func TestSendReceivePubTCP(t *testing.T) { - sendAndReceive(t, 2, false) -} - -func TestSendReceiveLocalWebsockets(t *testing.T) { - sendAndReceive(t, 1, true) -} - -// func TestSendReceiveLocalTCP(t *testing.T) { -// sendAndReceive(t, 2, true) -// } - -func generateRandomFile(megabytes int) (fname string) { - // generate a random file - bigBuff := make([]byte, 1024*1024*megabytes) - rand.Read(bigBuff) - fname = fmt.Sprintf("%dmb.file", megabytes) - ioutil.WriteFile(fname, bigBuff, 0666) - return -} diff --git a/src/croc/models.go b/src/croc/models.go deleted file mode 100644 index de2650a..0000000 --- a/src/croc/models.go +++ /dev/null @@ -1,7 +0,0 @@ -package croc - -type WebSocketMessage struct { - messageType int - message []byte - err error -} diff --git a/src/croc/recipient.go b/src/croc/recipient.go deleted file mode 100644 index 48e529f..0000000 --- a/src/croc/recipient.go +++ /dev/null @@ -1,624 +0,0 @@ -package croc - -import ( - "bufio" - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "os" - "strconv" - "strings" - "sync" - "time" - - log "github.com/cihub/seelog" - humanize "github.com/dustin/go-humanize" - "github.com/gorilla/websocket" - "github.com/pkg/errors" - "github.com/schollz/croc/src/comm" - "github.com/schollz/croc/src/compress" - "github.com/schollz/croc/src/crypt" - "github.com/schollz/croc/src/logger" - "github.com/schollz/croc/src/models" - "github.com/schollz/croc/src/utils" - "github.com/schollz/croc/src/zipper" - "github.com/schollz/pake" - "github.com/schollz/progressbar/v2" - "github.com/schollz/spinner" -) - -var DebugLevel string - -// Receive is the async operation to receive a file -func (cr *Croc) startRecipient(forceSend int, serverAddress string, tcpPorts []string, isLocal bool, done chan error, c *websocket.Conn, codephrase string, noPrompt bool, useStdout bool) { - logger.SetLogLevel(DebugLevel) - err := cr.receive(forceSend, serverAddress, tcpPorts, isLocal, c, codephrase, noPrompt, useStdout) - if err != nil && strings.HasPrefix(err.Error(), "websocket: close 100") { - err = nil - } - done <- err -} - -func (cr *Croc) receive(forceSend int, serverAddress string, tcpPorts []string, isLocal bool, c *websocket.Conn, codephrase string, noPrompt bool, useStdout bool) (err error) { - var sessionKey []byte - var transferTime time.Duration - var hash256 []byte - var progressFile string - var resumeFile bool - var tcpConnections []comm.Comm - var Q *pake.Pake - - dataChan := make(chan []byte, 1024*1024) - isConnectedIfUsingTCP := make(chan bool) - blocks := []string{} - - useWebsockets := true - switch forceSend { - case 0: - if !isLocal { - useWebsockets = false - } - case 1: - useWebsockets = true - case 2: - useWebsockets = false - } - - // start a spinner - spin := spinner.New(spinner.CharSets[9], 100*time.Millisecond) - spin.Writer = os.Stderr - spin.Suffix = " connecting..." - cr.StateString = "Connecting as recipient..." - spin.Start() - defer spin.Stop() - - // both parties should have a weak key - pw := []byte(codephrase) - - // start the reader - websocketMessages := make(chan WebSocketMessage, 1024) - go func() { - defer func() { - if r := recover(); r != nil { - log.Debugf("recovered from %s", r) - } - }() - for { - messageType, message, err := c.ReadMessage() - websocketMessages <- WebSocketMessage{messageType, message, err} - } - }() - - step := 0 - for { - var websocketMessageMain WebSocketMessage - // websocketMessageMain = <-websocketMessages - timeWaitingForMessage := time.Now() - for { - done := false - select { - case websocketMessageMain = <-websocketMessages: - done = true - default: - time.Sleep(10 * time.Millisecond) - } - if done { - break - } - if time.Since(timeWaitingForMessage).Seconds() > 3 && step == 0 { - return fmt.Errorf("You are trying to receive a file with no sender.") - } - } - - messageType := websocketMessageMain.messageType - message := websocketMessageMain.message - err := websocketMessageMain.err - if err != nil { - return err - } - if messageType == websocket.PongMessage || messageType == websocket.PingMessage { - continue - } - if messageType == websocket.TextMessage && bytes.Equal(message, []byte("interrupt")) { - return errors.New("\rinterrupted by other party") - } - - log.Debugf("got %d: %s", messageType, message) - switch step { - case 0: - spin.Stop() - spin.Suffix = " performing PAKE..." - cr.StateString = "Performing PAKE..." - spin.Start() - // sender has initiated, sends their initial data - var initialData models.Initial - err = json.Unmarshal(message, &initialData) - if err != nil { - err = errors.Wrap(err, "incompatible versions of croc") - return err - } - cr.OtherIP = initialData.IPAddress - log.Debugf("sender IP: %s", cr.OtherIP) - - // check whether the version strings are compatible - versionStringsOther := strings.Split(initialData.VersionString, ".") - versionStringsSelf := strings.Split(cr.Version, ".") - if len(versionStringsOther) == 3 && len(versionStringsSelf) == 3 { - if versionStringsSelf[0] != versionStringsOther[0] || versionStringsSelf[1] != versionStringsOther[1] { - return fmt.Errorf("version sender %s is not compatible with recipient %s", cr.Version, initialData.VersionString) - } - } - - // initialize the PAKE with the curve sent from the sender - Q, err = pake.InitCurve(pw, 1, initialData.CurveType, 1*time.Millisecond) - if err != nil { - err = errors.Wrap(err, "incompatible curve type") - return err - } - - // recipient begins by sending back initial data to sender - ip := "" - if isLocal { - ip = utils.LocalIP() - } else { - ip, _ = utils.PublicIP() - } - initialData.VersionString = cr.Version - initialData.IPAddress = ip - bInitialData, _ := json.Marshal(initialData) - c.WriteMessage(websocket.BinaryMessage, bInitialData) - case 1: - // Q receives u - log.Debugf("[%d] Q computes k, sends H(k), v back to P", step) - if err := Q.Update(message); err != nil { - return fmt.Errorf("Recipient is using wrong code phrase.") - } - - // Q has the session key now, but we will still check if its valid - sessionKey, err = Q.SessionKey() - if err != nil { - return fmt.Errorf("Recipient is using wrong code phrase.") - } - log.Debugf("%x\n", sessionKey) - - // initialize TCP connections if using (possible, but unlikely, race condition) - go func() { - log.Debug("initializing TCP connections") - if !useWebsockets { - log.Debugf("connecting to server") - tcpConnections = make([]comm.Comm, len(tcpPorts)) - var wg sync.WaitGroup - wg.Add(len(tcpPorts)) - for i, tcpPort := range tcpPorts { - go func(i int, tcpPort string) { - defer wg.Done() - log.Debugf("connecting to %d", i) - var message string - tcpConnections[i], message, err = connectToTCPServer(utils.SHA256(fmt.Sprintf("%d%x", i, sessionKey)), serverAddress+":"+tcpPort) - if err != nil { - log.Error(err) - } - if message != "recipient" { - log.Errorf("got wrong message: %s", message) - } - }(i, tcpPort) - } - wg.Wait() - log.Debugf("fully connected") - } - isConnectedIfUsingTCP <- true - }() - - c.WriteMessage(websocket.BinaryMessage, Q.Bytes()) - case 2: - log.Debugf("[%d] Q recieves H(k) from P", step) - // check if everything is still kosher with our computed session key - if err := Q.Update(message); err != nil { - log.Debug(err) - return fmt.Errorf("Recipient is using wrong code phrase.") - } - c.WriteMessage(websocket.BinaryMessage, []byte("ready")) - case 3: - spin.Stop() - cr.StateString = "Recieving file info..." - - // unmarshal the file info - log.Debugf("[%d] recieve file info", step) - // do decryption on the file stats - enc, err := crypt.FromBytes(message) - if err != nil { - return err - } - decryptedFileData, err := enc.Decrypt(sessionKey) - if err != nil { - return err - } - err = json.Unmarshal(decryptedFileData, &cr.FileInfo) - if err != nil { - return err - } - log.Debugf("got file stats: %+v", cr.FileInfo) - - // determine if the file is resuming or not - progressFile = fmt.Sprintf("%s.progress", cr.FileInfo.SentName) - overwritingOrReceiving := "Receiving" - if utils.Exists(cr.FileInfo.Name) || utils.Exists(cr.FileInfo.SentName) { - overwritingOrReceiving = "Overwriting" - if utils.Exists(progressFile) { - overwritingOrReceiving = "Resume receiving" - resumeFile = true - } - } - - // send blocks - if resumeFile { - fileWithBlocks, _ := os.Open(progressFile) - scanner := bufio.NewScanner(fileWithBlocks) - for scanner.Scan() { - blocks = append(blocks, strings.TrimSpace(scanner.Text())) - } - fileWithBlocks.Close() - } - blocksBytes, _ := json.Marshal(blocks) - // encrypt the block data and send - encblockBytes := crypt.Encrypt(blocksBytes, sessionKey) - - // wait for TCP connections if using them - _ = <-isConnectedIfUsingTCP - c.WriteMessage(websocket.BinaryMessage, encblockBytes.Bytes()) - - // prompt user about the file - fileOrFolder := "file" - if cr.FileInfo.IsDir { - fileOrFolder = "folder" - } - cr.WindowReceivingString = fmt.Sprintf("%s %s (%s) into: %s", - overwritingOrReceiving, - fileOrFolder, - humanize.Bytes(uint64(cr.FileInfo.Size)), - cr.FileInfo.Name, - ) - fmt.Fprintf(os.Stderr, "\r%s\n", - cr.WindowReceivingString, - ) - if !noPrompt { - if "y" != utils.GetInput("ok? (y/N): ") { - fmt.Fprintf(os.Stderr, "Cancelling request") - c.WriteMessage(websocket.BinaryMessage, []byte("no")) - return nil - } - } - if cr.WindowRecipientPrompt { - // wait until it switches to false - // the window should then set WindowRecipientAccept - for { - if !cr.WindowRecipientPrompt { - if cr.WindowRecipientAccept { - break - } else { - fmt.Fprintf(os.Stderr, "Cancelling request") - c.WriteMessage(websocket.BinaryMessage, []byte("no")) - return nil - } - } - time.Sleep(10 * time.Millisecond) - } - } - - // await file - // erase file if overwriting - if overwritingOrReceiving == "Overwriting" { - os.Remove(cr.FileInfo.SentName) - } - var f *os.File - if utils.Exists(cr.FileInfo.SentName) && resumeFile { - if !useWebsockets { - f, err = os.OpenFile(cr.FileInfo.SentName, os.O_WRONLY, 0644) - } else { - f, err = os.OpenFile(cr.FileInfo.SentName, os.O_APPEND|os.O_WRONLY, 0644) - } - if err != nil { - log.Error(err) - return err - } - } else { - f, err = os.Create(cr.FileInfo.SentName) - if err != nil { - log.Error(err) - return err - } - if !useWebsockets { - if err = f.Truncate(cr.FileInfo.Size); err != nil { - log.Error(err) - return err - } - } - } - - blockSize := 0 - if useWebsockets { - blockSize = models.WEBSOCKET_BUFFER_SIZE / 8 - } else { - blockSize = models.TCP_BUFFER_SIZE / 2 - } - // start the ui for pgoress - cr.StateString = "Recieving file..." - bytesWritten := 0 - fmt.Fprintf(os.Stderr, "\nReceiving (<-%s)...\n", cr.OtherIP) - cr.Bar = progressbar.NewOptions( - int(cr.FileInfo.Size), - progressbar.OptionSetRenderBlankState(true), - progressbar.OptionSetBytes(int(cr.FileInfo.Size)), - progressbar.OptionSetWriter(os.Stderr), - progressbar.OptionThrottle(1/60*time.Second), - ) - cr.Bar.Add((len(blocks) * blockSize)) - finished := make(chan bool) - - go func(finished chan bool, dataChan chan []byte) (err error) { - // remove previous progress - var fProgress *os.File - var progressErr error - if resumeFile { - fProgress, progressErr = os.OpenFile(progressFile, os.O_APPEND|os.O_WRONLY, 0644) - bytesWritten = len(blocks) * blockSize - } else { - os.Remove(progressFile) - fProgress, progressErr = os.Create(progressFile) - } - if progressErr != nil { - panic(progressErr) - } - defer fProgress.Close() - - blocksWritten := 0.0 - blocksToWrite := float64(cr.FileInfo.Size) - if useWebsockets { - blocksToWrite = blocksToWrite/float64(models.WEBSOCKET_BUFFER_SIZE/8) - float64(len(blocks)) - } else { - blocksToWrite = blocksToWrite/float64(models.TCP_BUFFER_SIZE/2) - float64(len(blocks)) - } - for { - message := <-dataChan - // do decryption - var enc crypt.Encryption - err = json.Unmarshal(message, &enc) - if err != nil { - // log.Errorf("%s: [%s] [%+v] (%d/%d) %+v", err.Error(), message, message, len(message), numBytes, bs) - log.Error(err) - return err - } - decrypted, err := enc.Decrypt(sessionKey, !cr.FileInfo.IsEncrypted) - if err != nil { - log.Error(err) - return err - } - - // get location if TCP - var locationToWrite int - if !useWebsockets { - pieces := bytes.SplitN(decrypted, []byte("-"), 2) - decrypted = pieces[1] - locationToWrite, _ = strconv.Atoi(string(pieces[0])) - } - - // do decompression - if cr.FileInfo.IsCompressed && !cr.FileInfo.IsDir { - decrypted = compress.Decompress(decrypted) - } - - var n int - if !useWebsockets { - if err != nil { - log.Error(err) - return err - } - n, err = f.WriteAt(decrypted, int64(locationToWrite)) - fProgress.WriteString(fmt.Sprintf("%d\n", locationToWrite)) - log.Debugf("wrote %d bytes to location %d (%2.0f/%2.0f)", n, locationToWrite, blocksWritten, blocksToWrite) - } else { - // write to file - n, err = f.Write(decrypted) - log.Debugf("wrote %d bytes to location %d (%2.0f/%2.0f)", n, bytesWritten, blocksWritten, blocksToWrite) - fProgress.WriteString(fmt.Sprintf("%d\n", bytesWritten)) - } - if err != nil { - log.Error(err) - return err - } - - // update the bytes written - bytesWritten += n - blocksWritten += 1.0 - // update the progress bar - cr.Bar.Add(n) - if int64(bytesWritten) == cr.FileInfo.Size || blocksWritten >= blocksToWrite { - log.Debug("finished", int64(bytesWritten), cr.FileInfo.Size, blocksWritten, blocksToWrite) - break - } - } - finished <- true - return - }(finished, dataChan) - - log.Debug("telling sender i'm ready") - c.WriteMessage(websocket.BinaryMessage, []byte("ready")) - - startTime := time.Now() - if useWebsockets { - for { - // read from websockets - websocketMessageData := <-websocketMessages - if bytes.HasPrefix(websocketMessageData.message, []byte("error")) { - return fmt.Errorf("%s", websocketMessageData.message) - } - if websocketMessageData.messageType != websocket.BinaryMessage { - continue - } - if err != nil { - log.Error(err) - return err - } - if bytes.Equal(websocketMessageData.message, []byte("magic")) { - log.Debug("got magic") - break - } - dataChan <- websocketMessageData.message - } - } else { - log.Debugf("starting listening with tcp with %d connections", len(tcpConnections)) - - // check to see if any messages are sent - stopMessageSignal := make(chan bool, 1) - errorsDuringTransfer := make(chan error, 24) - go func() { - for { - select { - case sig := <-stopMessageSignal: - errorsDuringTransfer <- nil - log.Debugf("got message signal: %+v", sig) - return - case wsMessage := <-websocketMessages: - log.Debugf("got message: %s", wsMessage.message) - if bytes.HasPrefix(wsMessage.message, []byte("error")) { - log.Debug("stopping transfer") - for i := 0; i < len(tcpConnections)+1; i++ { - errorsDuringTransfer <- fmt.Errorf("%s", wsMessage.message) - } - return - } - default: - continue - } - } - }() - - // using TCP - go func() { - var wg sync.WaitGroup - wg.Add(len(tcpConnections)) - for i := range tcpConnections { - defer func(i int) { - log.Debugf("closing connection %d", i) - tcpConnections[i].Close() - }(i) - go func(wg *sync.WaitGroup, j int) { - defer wg.Done() - for { - select { - case _ = <-errorsDuringTransfer: - log.Debugf("%d got stop", i) - return - default: - } - - log.Debugf("waiting to read on %d", j) - // read from TCP connection - message, _, _, err := tcpConnections[j].Read() - // log.Debugf("message: %s", message) - if err != nil { - panic(err) - } - if bytes.Equal(message, []byte("magic")) { - log.Debugf("%d got magic, leaving", j) - return - } - dataChan <- message - } - }(&wg, i) - } - log.Debug("waiting for tcp goroutines") - wg.Wait() - errorsDuringTransfer <- nil - }() - - // block until this is done - - log.Debug("waiting for error") - errorDuringTransfer := <-errorsDuringTransfer - log.Debug("sending stop message signal") - stopMessageSignal <- true - if errorDuringTransfer != nil { - log.Debugf("got error during transfer: %s", errorDuringTransfer.Error()) - return errorDuringTransfer - } - } - - _ = <-finished - log.Debug("telling sender i'm done") - c.WriteMessage(websocket.BinaryMessage, []byte("done")) - // we are finished - transferTime = time.Since(startTime) - - // close file - err = f.Close() - if err != nil { - return err - } - - // finish bar - cr.Bar.Finish() - - // check hash - hash256, err = utils.HashFile(cr.FileInfo.SentName) - if err != nil { - log.Error(err) - return err - } - // tell the sender the hash so they can quit - c.WriteMessage(websocket.BinaryMessage, append([]byte("hash:"), hash256...)) - case 4: - // receive the hash from the sender so we can check it and quit - log.Debugf("got hash: %x", message) - if bytes.Equal(hash256, message) { - // open directory - if cr.FileInfo.IsDir { - err = zipper.UnzipFile(cr.FileInfo.SentName, ".") - if DebugLevel != "debug" { - os.Remove(cr.FileInfo.SentName) - } - } else { - err = nil - } - if err == nil { - if useStdout && !cr.FileInfo.IsDir { - var bFile []byte - bFile, err = ioutil.ReadFile(cr.FileInfo.SentName) - if err != nil { - return err - } - os.Stdout.Write(bFile) - os.Remove(cr.FileInfo.SentName) - } - transferRate := float64(cr.FileInfo.Size) / 1000000.0 / transferTime.Seconds() - transferType := "MB/s" - if transferRate < 1 { - transferRate = float64(cr.FileInfo.Size) / 1000.0 / transferTime.Seconds() - transferType = "kB/s" - } - folderOrFile := "file" - if cr.FileInfo.IsDir { - folderOrFile = "folder" - } - if useStdout { - cr.FileInfo.Name = "stdout" - } - fmt.Fprintf(os.Stderr, "\nReceived %s written to %s (%2.1f %s)", folderOrFile, cr.FileInfo.Name, transferRate, transferType) - os.Remove(progressFile) - cr.StateString = fmt.Sprintf("Received %s written to %s (%2.1f %s)", folderOrFile, cr.FileInfo.Name, transferRate, transferType) - } - return err - } else { - if DebugLevel != "debug" { - log.Debug("removing corrupted file") - os.Remove(cr.FileInfo.SentName) - } - return errors.New("file corrupted") - } - default: - return fmt.Errorf("unknown step") - } - step++ - } -} diff --git a/src/croc/sender.go b/src/croc/sender.go deleted file mode 100644 index 0615fec..0000000 --- a/src/croc/sender.go +++ /dev/null @@ -1,570 +0,0 @@ -package croc - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net" - "os" - "path/filepath" - "strconv" - "strings" - "sync" - "time" - - log "github.com/cihub/seelog" - "github.com/gorilla/websocket" - "github.com/pkg/errors" - "github.com/schollz/croc/src/comm" - "github.com/schollz/croc/src/compress" - "github.com/schollz/croc/src/crypt" - "github.com/schollz/croc/src/logger" - "github.com/schollz/croc/src/models" - "github.com/schollz/croc/src/utils" - "github.com/schollz/croc/src/zipper" - "github.com/schollz/pake" - progressbar "github.com/schollz/progressbar/v2" - "github.com/schollz/spinner" -) - -// Send is the async call to send data -func (cr *Croc) startSender(forceSend int, serverAddress string, tcpPorts []string, isLocal bool, done chan error, c *websocket.Conn, fname string, codephrase string, useCompression bool, useEncryption bool) { - logger.SetLogLevel(DebugLevel) - log.Debugf("sending %s", fname) - err := cr.send(forceSend, serverAddress, tcpPorts, isLocal, c, fname, codephrase, useCompression, useEncryption) - if err != nil && strings.HasPrefix(err.Error(), "websocket: close 100") { - err = nil - } - done <- err -} - -func (cr *Croc) send(forceSend int, serverAddress string, tcpPorts []string, isLocal bool, c *websocket.Conn, fname string, codephrase string, useCompression bool, useEncryption bool) (err error) { - var f *os.File - defer f.Close() // ignore the error if it wasn't opened :( - var fileHash []byte - var startTransfer time.Time - var tcpConnections []comm.Comm - blocksToSkip := make(map[int64]struct{}) - isConnectedIfUsingTCP := make(chan bool) - - type DataChan struct { - b []byte - currentPostition int64 - bytesRead int - err error - } - dataChan := make(chan DataChan, 1024*1024) - defer close(dataChan) - - useWebsockets := true - switch forceSend { - case 0: - if !isLocal { - useWebsockets = false - } - case 1: - useWebsockets = true - case 2: - useWebsockets = false - } - - fileReady := make(chan error) - - // normalize the file name - fname, err = filepath.Abs(fname) - if err != nil { - return err - } - _, filename := filepath.Split(fname) - - // get ready to generate session key - var sessionKey []byte - - // start a spinner - spin := spinner.New(spinner.CharSets[9], 100*time.Millisecond) - spin.Writer = os.Stderr - defer spin.Stop() - - // both parties should have a weak key - pw := []byte(codephrase) - // initialize sender P ("0" indicates sender) - P, err := pake.InitCurve(pw, 0, cr.CurveType, 1*time.Millisecond) - if err != nil { - return - } - - // start the reader - websocketMessages := make(chan WebSocketMessage, 1024) - go func() { - defer func() { - if r := recover(); r != nil { - log.Debugf("recovered from %s", r) - } - }() - for { - messageType, message, err := c.ReadMessage() - websocketMessages <- WebSocketMessage{messageType, message, err} - } - }() - - step := 0 - for { - websocketMessage := <-websocketMessages - messageType := websocketMessage.messageType - message := websocketMessage.message - errRead := websocketMessage.err - if errRead != nil { - return errRead - } - if messageType == websocket.PongMessage || messageType == websocket.PingMessage { - continue - } - if messageType == websocket.TextMessage && bytes.HasPrefix(message, []byte("interrupt")) { - return errors.New("\rinterrupted by other party") - } - if messageType == websocket.TextMessage && bytes.HasPrefix(message, []byte("err")) { - return errors.New("\r" + string(message)) - } - log.Debugf("got %d: %s", messageType, message) - switch step { - case 0: - // sender initiates communication - ip := "" - if isLocal { - ip = utils.LocalIP() - } else { - ip, _ = utils.PublicIP() - } - - initialData := models.Initial{ - CurveType: cr.CurveType, - IPAddress: ip, - VersionString: cr.Version, // version should match - } - bInitialData, _ := json.Marshal(initialData) - // send the initial data - c.WriteMessage(websocket.BinaryMessage, bInitialData) - case 1: - // first receive the initial data from the recipient - var initialData models.Initial - err = json.Unmarshal(message, &initialData) - if err != nil { - err = errors.Wrap(err, "incompatible versions of croc") - return - } - cr.OtherIP = initialData.IPAddress - log.Debugf("recipient IP: %s", cr.OtherIP) - - go func() { - // recipient might want file! start gathering information about file - fstat, err := os.Stat(fname) - if err != nil { - fileReady <- err - return - } - cr.FileInfo = models.FileStats{ - Name: filename, - Size: fstat.Size(), - ModTime: fstat.ModTime(), - IsDir: fstat.IsDir(), - SentName: fstat.Name(), - IsCompressed: useCompression, - IsEncrypted: useEncryption, - } - if cr.FileInfo.IsDir { - // zip the directory - cr.FileInfo.SentName, err = zipper.ZipFile(fname, true) - if err != nil { - log.Error(err) - fileReady <- err - return - } - fname = cr.FileInfo.SentName - - fstat, err := os.Stat(fname) - if err != nil { - fileReady <- err - return - } - // get new size - cr.FileInfo.Size = fstat.Size() - } - - // open the file - f, err = os.Open(fname) - if err != nil { - fileReady <- err - return - } - fileReady <- nil - - }() - - // send pake data - log.Debugf("[%d] first, P sends u to Q", step) - c.WriteMessage(websocket.BinaryMessage, P.Bytes()) - // start PAKE spinnner - spin.Suffix = " performing PAKE..." - cr.StateString = "Performing PAKE..." - spin.Start() - case 2: - // P recieves H(k),v from Q - log.Debugf("[%d] P computes k, H(k), sends H(k) to Q", step) - err := P.Update(message) - c.WriteMessage(websocket.BinaryMessage, P.Bytes()) - if err != nil { - return fmt.Errorf("Recipient is using wrong code phrase.") - } - - sessionKey, _ = P.SessionKey() - // check(err) - log.Debugf("%x\n", sessionKey) - - // wait for readiness - spin.Stop() - spin.Suffix = " waiting for recipient ok..." - cr.StateString = "Waiting for recipient ok...." - spin.Start() - case 3: - log.Debugf("[%d] recipient declares readiness for file info", step) - if !bytes.HasPrefix(message, []byte("ready")) { - return errors.New("Recipient refused file") - } - - err = <-fileReady // block until file is ready - if err != nil { - return err - } - fstatsBytes, err := json.Marshal(cr.FileInfo) - if err != nil { - return err - } - - // encrypt the file meta data - enc := crypt.Encrypt(fstatsBytes, sessionKey) - // send the file meta data - c.WriteMessage(websocket.BinaryMessage, enc.Bytes()) - case 4: - log.Debugf("[%d] recipient gives blocks", step) - // recipient sends blocks, and sender does not send anything back - // determine if any blocks were sent to skip - enc, err := crypt.FromBytes(message) - if err != nil { - log.Error(err) - return err - } - decrypted, err := enc.Decrypt(sessionKey) - if err != nil { - err = errors.Wrap(err, "could not decrypt blocks with session key") - log.Error(err) - return err - } - - var blocks []string - errBlocks := json.Unmarshal(decrypted, &blocks) - if errBlocks == nil { - for _, block := range blocks { - blockInt64, errBlock := strconv.Atoi(block) - if errBlock == nil { - blocksToSkip[int64(blockInt64)] = struct{}{} - } - } - } - log.Debugf("found blocks: %+v", blocksToSkip) - - // connect to TCP in background - tcpConnections = make([]comm.Comm, len(tcpPorts)) - go func() { - if !useWebsockets { - log.Debugf("connecting to server") - var wg sync.WaitGroup - wg.Add(len(tcpPorts)) - for i, tcpPort := range tcpPorts { - go func(i int, tcpPort string) { - defer wg.Done() - log.Debugf("connecting to %s on connection %d", tcpPort, i) - var message string - tcpConnections[i], message, err = connectToTCPServer(utils.SHA256(fmt.Sprintf("%d%x", i, sessionKey)), serverAddress+":"+tcpPort) - if err != nil { - log.Error(err) - } - if message != "sender" { - log.Errorf("got wrong message: %s", message) - } - }(i, tcpPort) - } - wg.Wait() - } - isConnectedIfUsingTCP <- true - }() - - // start loading the file into memory - // start streaming encryption/compression - if cr.FileInfo.IsDir { - // remove file if zipped - defer os.Remove(cr.FileInfo.SentName) - } - go func(dataChan chan DataChan) { - var buffer []byte - if useWebsockets { - buffer = make([]byte, models.WEBSOCKET_BUFFER_SIZE/8) - } else { - buffer = make([]byte, models.TCP_BUFFER_SIZE/2) - } - - currentPostition := int64(0) - for { - bytesread, err := f.Read(buffer) - if bytesread > 0 { - if _, ok := blocksToSkip[currentPostition]; ok { - log.Debugf("skipping the sending of block %d", currentPostition) - currentPostition += int64(bytesread) - continue - } - - // do compression - var compressedBytes []byte - if useCompression && !cr.FileInfo.IsDir { - compressedBytes = compress.Compress(buffer[:bytesread]) - } else { - compressedBytes = buffer[:bytesread] - } - - // if using TCP, prepend the location to write the data to in the resulting file - if !useWebsockets { - compressedBytes = append([]byte(fmt.Sprintf("%d-", currentPostition)), compressedBytes...) - } - - // do encryption - enc := crypt.Encrypt(compressedBytes, sessionKey, !useEncryption) - encBytes, err := json.Marshal(enc) - if err != nil { - dataChan <- DataChan{ - b: nil, - bytesRead: 0, - err: err, - } - return - } - - dataChan <- DataChan{ - b: encBytes, - bytesRead: bytesread, - err: nil, - } - currentPostition += int64(bytesread) - } - if err != nil { - if err != io.EOF { - log.Error(err) - } - break - } - } - // finish - log.Debug("sending magic") - dataChan <- DataChan{ - b: []byte("magic"), - bytesRead: 0, - err: nil, - } - if !useWebsockets { - log.Debug("sending extra magic to %d others", len(tcpPorts)-1) - for i := 0; i < len(tcpPorts)-1; i++ { - log.Debug("sending magic") - dataChan <- DataChan{ - b: []byte("magic"), - bytesRead: 0, - err: nil, - } - } - } - }(dataChan) - - case 5: - spin.Stop() - - log.Debugf("[%d] recipient declares readiness for file data", step) - if !bytes.HasPrefix(message, []byte("ready")) { - return errors.New("Recipient refused file") - } - cr.StateString = "Transfer in progress..." - fmt.Fprintf(os.Stderr, "\rSending (->%s)...\n", cr.OtherIP) - // send file, compure hash simultaneously - startTransfer = time.Now() - - blockSize := 0 - if useWebsockets { - blockSize = models.WEBSOCKET_BUFFER_SIZE / 8 - } else { - blockSize = models.TCP_BUFFER_SIZE / 2 - } - cr.Bar = progressbar.NewOptions( - int(cr.FileInfo.Size), - progressbar.OptionSetRenderBlankState(true), - progressbar.OptionSetBytes(int(cr.FileInfo.Size)), - progressbar.OptionSetWriter(os.Stderr), - progressbar.OptionThrottle(1/60*time.Second), - ) - cr.Bar.Add(blockSize * len(blocksToSkip)) - - if useWebsockets { - for { - data := <-dataChan - if data.err != nil { - return data.err - } - cr.Bar.Add(data.bytesRead) - - // write data to websockets - err = c.WriteMessage(websocket.BinaryMessage, data.b) - if err != nil { - err = errors.Wrap(err, "problem writing message") - return err - } - if bytes.Equal(data.b, []byte("magic")) { - break - } - } - } else { - _ = <-isConnectedIfUsingTCP - log.Debug("connected and ready to send on tcp") - - // check to see if any messages are sent - stopMessageSignal := make(chan bool, 1) - errorsDuringTransfer := make(chan error, 24) - go func() { - for { - select { - case sig := <-stopMessageSignal: - errorsDuringTransfer <- nil - log.Debugf("got message signal: %+v", sig) - return - case wsMessage := <-websocketMessages: - log.Debugf("got message: %s", wsMessage.message) - if bytes.HasPrefix(wsMessage.message, []byte("error")) { - log.Debug("stopping transfer") - for i := 0; i < len(tcpConnections)+1; i++ { - errorsDuringTransfer <- fmt.Errorf("%s", wsMessage.message) - } - return - } - default: - continue - } - } - }() - - var wg sync.WaitGroup - wg.Add(len(tcpConnections)) - for i := range tcpConnections { - defer func(i int) { - log.Debugf("closing connection %d", i) - tcpConnections[i].Close() - }(i) - go func(i int, wg *sync.WaitGroup, dataChan <-chan DataChan) { - defer wg.Done() - for data := range dataChan { - select { - case _ = <-errorsDuringTransfer: - log.Debugf("%d got stop", i) - return - default: - } - if data.err != nil { - log.Error(data.err) - return - } - cr.Bar.Add(data.bytesRead) - // write data to tcp connection - _, errTcp := tcpConnections[i].Write(data.b) - if errTcp != nil { - errTcp = errors.Wrap(errTcp, "problem writing message") - log.Debug(errTcp) - errorsDuringTransfer <- errTcp - return - } - if bytes.Equal(data.b, []byte("magic")) { - log.Debugf("%d got magic", i) - return - } - } - }(i, &wg, dataChan) - } - - // block until this is done - log.Debug("waiting for tcp goroutines") - wg.Wait() - log.Debug("sending stop message signal") - stopMessageSignal <- true - log.Debug("waiting for error") - errorDuringTransfer := <-errorsDuringTransfer - if errorDuringTransfer != nil { - log.Debugf("got error during transfer: %s", errorDuringTransfer.Error()) - return errorDuringTransfer - } - } - - cr.Bar.Finish() - log.Debug("send hash to finish file") - fileHash, err = utils.HashFile(fname) - if err != nil { - return err - } - case 6: - // recevied something, maybe the file hash - transferTime := time.Since(startTransfer) - if !bytes.HasPrefix(message, []byte("hash:")) { - log.Debugf("%s", message) - continue - } - c.WriteMessage(websocket.BinaryMessage, fileHash) - message = bytes.TrimPrefix(message, []byte("hash:")) - log.Debugf("[%d] determing whether it went ok", step) - if bytes.Equal(message, fileHash) { - log.Debug("file transfered successfully") - transferRate := float64(cr.FileInfo.Size) / 1000000.0 / transferTime.Seconds() - transferType := "MB/s" - if transferRate < 1 { - transferRate = float64(cr.FileInfo.Size) / 1000.0 / transferTime.Seconds() - transferType = "kB/s" - } - fmt.Fprintf(os.Stderr, "\nTransfer complete (%2.1f %s)", transferRate, transferType) - cr.StateString = fmt.Sprintf("Transfer complete (%2.1f %s)", transferRate, transferType) - return nil - } else { - fmt.Fprintf(os.Stderr, "\nTransfer corrupted") - return errors.New("file not transfered succesfully") - } - default: - return fmt.Errorf("unknown step") - } - step++ - } -} - -func connectToTCPServer(room string, address string) (com comm.Comm, message string, err error) { - connection, err := net.DialTimeout("tcp", address, 3*time.Hour) - if err != nil { - return - } - connection.SetReadDeadline(time.Now().Add(3 * time.Hour)) - connection.SetDeadline(time.Now().Add(3 * time.Hour)) - connection.SetWriteDeadline(time.Now().Add(3 * time.Hour)) - - com = comm.New(connection) - ok, err := com.Receive() - if err != nil { - return - } - log.Debugf("server says: %s", ok) - - err = com.Send(room) - if err != nil { - return - } - message, err = com.Receive() - log.Debugf("server says: %s", message) - return -} diff --git a/src/croc/sending.go b/src/croc/sending.go deleted file mode 100644 index 250de26..0000000 --- a/src/croc/sending.go +++ /dev/null @@ -1,217 +0,0 @@ -package croc - -import ( - "errors" - "fmt" - "net/http" - "os" - "os/signal" - "strings" - "time" - - log "github.com/cihub/seelog" - "github.com/gorilla/websocket" - "github.com/schollz/croc/src/relay" - "github.com/schollz/croc/src/utils" - "github.com/schollz/peerdiscovery" -) - -// Send the file -func (c *Croc) Send(fname, codephrase string) (err error) { - defer log.Flush() - log.Debugf("sending %s", fname) - errChan := make(chan error) - - // normally attempt two connections - waitingFor := 2 - - // use public relay - if !c.LocalOnly { - go func() { - // atttempt to connect to public relay - errChan <- c.sendReceive(c.Address, c.AddressWebsocketPort, c.AddressTCPPorts, fname, codephrase, true, false) - }() - } else { - waitingFor = 1 - } - - // use local relay - if !c.NoLocal { - defer func() { - log.Debug("sending relay stop signal") - relay.Stop() - }() - go func() { - // start own relay and connect to it - go relay.Run(c.RelayWebsocketPort, c.RelayTCPPorts) - time.Sleep(250 * time.Millisecond) // race condition here, but this should work most of the time :( - - // broadcast for peer discovery - go func() { - log.Debug("starting local discovery...") - discovered, err := peerdiscovery.Discover(peerdiscovery.Settings{ - Limit: 1, - TimeLimit: 600 * time.Second, - Delay: 50 * time.Millisecond, - Payload: []byte(c.RelayWebsocketPort + "- " + strings.Join(c.RelayTCPPorts, ",")), - MulticastAddress: fmt.Sprintf("239.255.255.%d", 230+int64(time.Now().Minute()/5)), - }) - log.Debug(discovered, err) - }() - - // connect to own relay - errChan <- c.sendReceive("localhost", c.RelayWebsocketPort, c.RelayTCPPorts, fname, codephrase, true, true) - }() - } else { - waitingFor = 1 - } - - err = <-errChan - if err == nil || waitingFor == 1 { - log.Debug("returning") - return - } - log.Debug(err) - return <-errChan -} - -// Receive the file -func (c *Croc) Receive(codephrase string) (err error) { - defer log.Flush() - log.Debug("receiving") - - // use local relay first - if !c.NoLocal { - log.Debug("trying to discover") - // try to discovery codephrase and server through peer network - discovered, errDiscover := peerdiscovery.Discover(peerdiscovery.Settings{ - Limit: 1, - TimeLimit: 300 * time.Millisecond, - Delay: 50 * time.Millisecond, - Payload: []byte("checking"), - AllowSelf: true, - DisableBroadcast: true, - MulticastAddress: fmt.Sprintf("239.255.255.%d", 230+int64(time.Now().Minute()/5)), - }) - log.Debug("finished") - log.Debug(discovered) - if errDiscover != nil { - log.Debug(errDiscover) - } - if len(discovered) > 0 { - if discovered[0].Address == utils.LocalIP() { - discovered[0].Address = "localhost" - } - log.Debugf("discovered %s:%s", discovered[0].Address, discovered[0].Payload) - // see if we can actually connect to it - timeout := time.Duration(200 * time.Millisecond) - client := http.Client{ - Timeout: timeout, - } - ports := strings.Split(string(discovered[0].Payload), "-") - if len(ports) != 2 { - return errors.New("bad payload") - } - resp, err := client.Get(fmt.Sprintf("http://%s:%s/", discovered[0].Address, ports[0])) - if err == nil { - if resp.StatusCode == http.StatusOK { - // we connected, so use this - return c.sendReceive(discovered[0].Address, strings.TrimSpace(ports[0]), strings.Split(strings.TrimSpace(ports[1]), ","), "", codephrase, false, true) - } - } else { - log.Debugf("could not connect: %s", err.Error()) - } - } else { - log.Debug("discovered no peers") - } - } - - // use public relay - if !c.LocalOnly { - log.Debug("using public relay") - return c.sendReceive(c.Address, c.AddressWebsocketPort, c.AddressTCPPorts, "", codephrase, false, false) - } - - return errors.New("must use local or public relay") -} - -func (c *Croc) sendReceive(address, websocketPort string, tcpPorts []string, fname string, codephrase string, isSender bool, isLocal bool) (err error) { - defer log.Flush() - if len(codephrase) < 4 { - return fmt.Errorf("codephrase is too short") - } - - // allow interrupts from Ctl+C - interrupt := make(chan os.Signal, 1) - signal.Notify(interrupt, os.Interrupt) - - done := make(chan error) - // connect to server - websocketAddress := "" - if len(websocketPort) > 0 { - websocketAddress = fmt.Sprintf("ws://%s:%s/ws?room=%s", address, websocketPort, codephrase[:3]) - } else { - websocketAddress = fmt.Sprintf("ws://%s/ws?room=%s", address, codephrase[:3]) - } - log.Debugf("connecting to %s", websocketAddress) - sock, _, err := websocket.DefaultDialer.Dial(websocketAddress, nil) - if err != nil { - log.Error(err) - return - } - defer sock.Close() - - // tell the websockets we are connected - err = sock.WriteMessage(websocket.BinaryMessage, []byte("connected")) - if err != nil { - log.Error(err) - return err - } - - if isSender { - go c.startSender(c.ForceSend, address, tcpPorts, isLocal, done, sock, fname, codephrase, c.UseCompression, c.UseEncryption) - } else { - go c.startRecipient(c.ForceSend, address, tcpPorts, isLocal, done, sock, codephrase, c.NoRecipientPrompt, c.Stdout) - } - - for { - select { - case doneError := <-done: - log.Debug("received done signal") - if doneError != nil { - c.StateString = doneError.Error() - sock.WriteMessage(websocket.TextMessage, []byte("error: "+doneError.Error())) - time.Sleep(50 * time.Millisecond) - } - return doneError - case <-interrupt: - if !c.Debug { - SetDebugLevel("critical") - } - log.Debug("interrupt") - err = sock.WriteMessage(websocket.TextMessage, []byte("error: interrupted by other party")) - if err != nil { - return err - } - time.Sleep(50 * time.Millisecond) - - // Cleanly close the connection by sending a close message and then - // waiting (with timeout) for the server to close the connection. - err := sock.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")) - if err != nil { - log.Debug("write close:", err) - return nil - } - select { - case <-done: - case <-time.After(100 * time.Millisecond): - } - return nil - } - } -} - -// Relay will start a relay on the specified port -func (c *Croc) Relay() (err error) { - return relay.Run(c.RelayWebsocketPort, c.RelayTCPPorts) -} From 1045bd17b546606bf401d4ea7c074a2f389ff86d Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 16:54:31 -0600 Subject: [PATCH 013/110] update croc --- go.mod | 2 +- src/croc/croc.go | 63 ++++++++++++++++++------------------------------ 2 files changed, 24 insertions(+), 41 deletions(-) diff --git a/go.mod b/go.mod index ec4cdad..7ce9d40 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/schollz/croc +module github.com/schollz/croc/v6 require ( github.com/BurntSushi/toml v0.3.1 diff --git a/src/croc/croc.go b/src/croc/croc.go index 490c424..7a1e05d 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -15,15 +15,16 @@ import ( "sync" "time" + log "github.com/cihub/seelog" "github.com/denisbrodbeck/machineid" "github.com/go-redis/redis" - "github.com/mattn/go-colorable" - "github.com/pions/webrtc" - "github.com/schollz/croc/v5/src/crypt" - "github.com/schollz/croc/v5/src/utils" - "github.com/schollz/croc/v5/src/webrtc/pkg/session/common" - "github.com/schollz/croc/v5/src/webrtc/pkg/session/receiver" - "github.com/schollz/croc/v5/src/webrtc/pkg/session/sender" + "github.com/schollz/croc/v6/src/comm" + "github.com/schollz/croc/v6/src/crypt" + "github.com/schollz/croc/v6/src/logger" + "github.com/schollz/croc/v6/src/utils" + "github.com/schollz/croc/v6/src/webrtc/pkg/session/common" + "github.com/schollz/croc/v6/src/webrtc/pkg/session/receiver" + "github.com/schollz/croc/v6/src/webrtc/pkg/session/sender" "github.com/schollz/pake" "github.com/schollz/progressbar/v2" "github.com/schollz/spinner" @@ -33,29 +34,29 @@ import ( const BufferSize = 4096 * 10 const Channels = 1 -var log = logrus.New() - func init() { - log.SetFormatter(&logrus.TextFormatter{ForceColors: true}) - log.SetOutput(colorable.NewColorableStdout()) - Debug(false) + logger.SetLogLevel("debug") } func Debug(debug bool) { - receiver.Debug(debug) - sender.Debug(debug) if debug { - log.SetLevel(logrus.DebugLevel) + logger.SetLogLevel("debug") } else { - log.SetLevel(logrus.WarnLevel) + logger.SetLogLevel("warn") } } +type Options struct { + IsSender bool + SharedSecret string + Debug bool + AddressRelay string + Stdout bool + NoPrompt bool +} + type Client struct { Options Options - // basic setup - redisdb *redis.Client - log *logrus.Entry Pake *pake.Pake // steps involved in forming relationship @@ -63,7 +64,7 @@ type Client struct { Step2FileInfoTransfered bool Step3RecipientRequestFile bool Step4FileTransfer bool - Step5CloseChannels bool // TODO: Step5 should close files and reset things + Step5CloseChannels bool // send / receive information of all files FilesToTransfer []FileInfo @@ -73,17 +74,8 @@ type Client struct { CurrentFile *os.File CurrentFileChunks []int64 - sendSess *sender.Session - recvSess *receiver.Session - - // channel data - incomingMessageChannel <-chan *redis.Message - nameOutChannel string - nameInChannel string - - // webrtc connections - peerConnection [8]*webrtc.PeerConnection - dataChannel [8]*webrtc.DataChannel + // tcp connectios + conn [17]*comm.Comm bar *progressbar.ProgressBar spinner *spinner.Spinner @@ -131,15 +123,6 @@ func (m Message) String() string { return string(b) } -type Options struct { - IsSender bool - SharedSecret string - Debug bool - AddressRelay string - Stdout bool - NoPrompt bool -} - // New establishes a new connection for transfering files between two instances. func New(ops Options) (c *Client, err error) { c = new(Client) From b52001e0644e04ee38b3de0546c0b337b3d6ef03 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 17:05:48 -0600 Subject: [PATCH 014/110] prune --- src/croc/croc.go | 99 +++--------------------------------------------- 1 file changed, 5 insertions(+), 94 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 7a1e05d..211d582 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -6,7 +6,6 @@ import ( "encoding/base64" "encoding/json" "fmt" - "io" "math" "os" "path" @@ -17,7 +16,6 @@ import ( log "github.com/cihub/seelog" "github.com/denisbrodbeck/machineid" - "github.com/go-redis/redis" "github.com/schollz/croc/v6/src/comm" "github.com/schollz/croc/v6/src/crypt" "github.com/schollz/croc/v6/src/logger" @@ -28,7 +26,6 @@ import ( "github.com/schollz/pake" "github.com/schollz/progressbar/v2" "github.com/schollz/spinner" - "github.com/sirupsen/logrus" ) const BufferSize = 4096 * 10 @@ -132,36 +129,6 @@ func New(ops Options) (c *Client, err error) { Debug(c.Options.Debug) log.Debugf("options: %+v", c.Options) - // set channels - if c.Options.IsSender { - c.nameOutChannel = c.Options.SharedSecret + "2" - c.nameInChannel = c.Options.SharedSecret + "1" - } else { - c.nameOutChannel = c.Options.SharedSecret + "1" - c.nameInChannel = c.Options.SharedSecret + "2" - } - - // initialize redis for communication in establishing channel - c.redisdb = redis.NewClient(&redis.Options{ - Addr: c.Options.AddressRelay, - Password: "", - DB: 4, - WriteTimeout: 1 * time.Hour, - ReadTimeout: 1 * time.Hour, - }) - _, err = c.redisdb.Ping().Result() - if err != nil { - return - } - - // setup channel for listening - pubsub := c.redisdb.Subscribe(c.nameInChannel) - _, err = pubsub.Receive() - if err != nil { - return - } - c.incomingMessageChannel = pubsub.Channel() - // initialize pake if c.Options.IsSender { c.Pake, err = pake.Init([]byte(c.Options.SharedSecret), 1, elliptic.P521(), 1*time.Microsecond) @@ -172,20 +139,6 @@ func New(ops Options) (c *Client, err error) { return } - // initialize logger - c.log = log.WithFields(logrus.Fields{ - "is": "sender", - }) - if !c.Options.IsSender { - c.log = log.WithFields(logrus.Fields{ - "is": "recipient", - }) - } - - c.spinner = spinner.New(spinner.CharSets[9], 100*time.Millisecond) - c.spinner.Writer = os.Stderr - c.spinner.Suffix = " connecting..." - c.mutex = &sync.Mutex{} return } @@ -282,7 +235,7 @@ func (c *Client) transfer(options TransferOptions) (err error) { c.quit = make(chan bool) // if recipient, initialize with sending pake information - c.log.Debug("ready") + log.Debug("ready") if !c.Options.IsSender && !c.Step1ChannelSecured { err = c.redisdb.Publish(c.nameOutChannel, Message{ Type: "pake", @@ -321,48 +274,6 @@ func (c *Client) transfer(options TransferOptions) (err error) { return } -func (c *Client) sendOverRedis() (err error) { - go func() { - c.bar = progressbar.NewOptions( - int(c.FilesToTransfer[c.FilesToTransferCurrentNum].Size), - progressbar.OptionSetRenderBlankState(true), - progressbar.OptionSetBytes(int(c.FilesToTransfer[c.FilesToTransferCurrentNum].Size)), - progressbar.OptionSetWriter(os.Stderr), - progressbar.OptionThrottle(1/60*time.Second), - ) - c.CurrentFile, err = os.Open(c.FilesToTransfer[c.FilesToTransferCurrentNum].Name) - if err != nil { - panic(err) - } - location := int64(0) - for { - buf := make([]byte, 4096*128) - n, errRead := c.CurrentFile.Read(buf) - c.bar.Add(n) - chunk := Chunk{ - Bytes: buf[:n], - Location: location, - } - chunkB, _ := json.Marshal(chunk) - err = c.redisdb.Publish(c.nameOutChannel, Message{ - Type: "chunk", - Bytes: chunkB, - }.String()).Err() - if err != nil { - panic(err) - } - location += int64(n) - if errRead == io.EOF { - break - } - if errRead != nil { - panic(errRead) - } - } - }() - return -} - func (c *Client) processMessage(m Message) (err error) { switch m.Type { case "pake": @@ -383,7 +294,7 @@ func (c *Client) processMessage(m Message) (err error) { }.String()).Err() } if c.Pake.IsVerified() { - c.log.Debug(c.Pake.SessionKey()) + log.Debug(c.Pake.SessionKey()) c.Step1ChannelSecured = true } case "error": @@ -427,7 +338,7 @@ func (c *Client) processMessage(m Message) (err error) { } else { fmt.Fprintf(os.Stderr, "\rReceiving %s (%s) from machine '%s'\n", fname, utils.ByteCountDecimal(totalSize), senderInfo.MachineID) } - c.log.Debug(c.FilesToTransfer) + log.Debug(c.FilesToTransfer) c.Step2FileInfoTransfered = true case "recipientready": var remoteFile RemoteFileRequest @@ -475,7 +386,7 @@ func (c *Client) processMessage(m Message) (err error) { Type: "close-sender", }.String()).Err() case "datachannel-answer": - c.log.Debug("got answer:", m.Message) + log.Debug("got answer:", m.Message) // Apply the answer as the remote description err = c.sendSess.SetSDP(m.Message) pathToFile := path.Join(c.FilesToTransfer[c.FilesToTransferCurrentNum].FolderSource, c.FilesToTransfer[c.FilesToTransferCurrentNum].Name) @@ -576,7 +487,7 @@ func (c *Client) updateState() (err error) { err = c.dataChannelReceive() } if c.Options.IsSender && c.Step3RecipientRequestFile && !c.Step4FileTransfer { - c.log.Debug("start sending data!") + log.Debug("start sending data!") err = c.dataChannelSend() c.Step4FileTransfer = true } From 7a8801f8f14f300f766f7218c726a41d6fb290b6 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 17:09:37 -0600 Subject: [PATCH 015/110] add the v5 main --- main.go | 49 ++++++++-- src/cli/cli.go | 236 ++++++++++++++++++++----------------------------- 2 files changed, 140 insertions(+), 145 deletions(-) diff --git a/main.go b/main.go index b55bb36..d756c3d 100644 --- a/main.go +++ b/main.go @@ -1,12 +1,51 @@ package main import ( - "github.com/schollz/croc/src/cli" + "fmt" + + "github.com/schollz/croc/v5/src/cli" ) -var Version string - func main() { - cli.Version = Version - cli.Run() + // f, _ := os.Create("test.1") + // f.Truncate(8096) + // f.Close() + + // file, _ := os.Open("test.1") + // defer file.Close() + + // buffer := make([]byte, 4096) + // emptyBuffer := make([]byte, 4096) + // for { + // bytesread, err := file.Read(buffer) + // if err != nil { + // break + // } + // log.Debugln(bytes.Equal(buffer[:bytesread], emptyBuffer[:bytesread])) + // } + // var sender bool + // flag.BoolVar(&sender, "sender", false, "sender") + // flag.Parse() + // c, err := croc.New(sender, "foo") + // if err != nil { + // panic(err) + // } + // if sender { + // err = c.Send(croc.TransferOptions{ + // // PathToFile: "../wskeystore/README.md", + // // PathToFile: "./src/croc/croc.go", + // // PathToFiles: []string{"C:\\Users\\zacks\\go\\src\\github.com\\schollz\\croc\\src\\croc\\croc.go", "croc.exe"}, + // PathToFiles: []string{"croc2.exe", "croc3.exe"}, //,"croc2.exe", "croc3.exe"}, + // //PathToFiles: []string{"README.md"}, //,"croc2.exe", "croc3.exe"}, + // KeepPathInRemote: false, + // }) + // } else { + // err = c.Receive() + // } + // if err != nil { + // fmt.Println(err) + // } + if err := cli.Run(); err != nil { + fmt.Println(err) + } } diff --git a/src/cli/cli.go b/src/cli/cli.go index 4e24cb1..ff8047f 100644 --- a/src/cli/cli.go +++ b/src/cli/cli.go @@ -1,6 +1,7 @@ package cli import ( + "errors" "fmt" "io" "io/ioutil" @@ -11,18 +12,15 @@ import ( "strings" "time" - humanize "github.com/dustin/go-humanize" - "github.com/pkg/errors" - "github.com/schollz/croc/src/croc" - "github.com/schollz/croc/src/utils" - "github.com/skratchdot/open-golang/open" + "github.com/schollz/croc/v6/src/croc" + "github.com/schollz/croc/v6/src/utils" "github.com/urfave/cli" ) var Version string -var cr *croc.Croc -func Run() { +func Run() (err error) { + runtime.GOMAXPROCS(runtime.NumCPU()) app := cli.NewApp() app.Name = "croc" @@ -42,8 +40,6 @@ func Run() { Description: "send a file over the relay", ArgsUsage: "[filename]", Flags: []cli.Flag{ - cli.BoolFlag{Name: "no-compress, o", Usage: "disable compression"}, - cli.BoolFlag{Name: "no-encrypt, e", Usage: "disable encryption"}, cli.StringFlag{Name: "code, c", Usage: "codephrase used to connect to relay"}, }, HelpName: "croc send", @@ -51,41 +47,12 @@ func Run() { return send(c) }, }, - { - Name: "relay", - Usage: "start a croc relay", - Description: "the croc relay will handle websocket and TCP connections", - Flags: []cli.Flag{}, - HelpName: "croc relay", - Action: func(c *cli.Context) error { - return relay(c) - }, - }, - { - Name: "config", - Usage: "generates a config file", - Description: "the croc config can be used to set static parameters", - Flags: []cli.Flag{}, - HelpName: "croc config", - Action: func(c *cli.Context) error { - return saveDefaultConfig(c) - }, - }, } app.Flags = []cli.Flag{ - cli.StringFlag{Name: "addr", Value: "croc4.schollz.com", Usage: "address of the public relay"}, - cli.StringFlag{Name: "addr-ws", Value: "8153", Usage: "port of the public relay websocket server to connect"}, - cli.StringFlag{Name: "addr-tcp", Value: "8154,8155,8156,8157,8158,8159,8160,8161", Usage: "tcp ports of the public relay server to connect"}, - cli.BoolFlag{Name: "no-local", Usage: "disable local mode"}, - cli.BoolFlag{Name: "local", Usage: "use only local mode"}, cli.BoolFlag{Name: "debug", Usage: "increase verbosity (a lot)"}, cli.BoolFlag{Name: "yes", Usage: "automatically agree to all prompts"}, cli.BoolFlag{Name: "stdout", Usage: "redirect file to stdout"}, - cli.BoolFlag{Name: "force-tcp", Usage: "force TCP"}, - cli.BoolFlag{Name: "force-web", Usage: "force websockets"}, - cli.StringFlag{Name: "port", Value: "8153", Usage: "port that the websocket listens on"}, - cli.StringFlag{Name: "tcp-port", Value: "8154,8155,8156,8157,8158,8159,8160,8161", Usage: "ports that the tcp server listens on"}, - cli.StringFlag{Name: "curve", Value: "siec", Usage: "specify elliptic curve to use for PAKE (p256, p384, p521, siec)"}, + cli.StringFlag{Name: "relay", Value: "198.199.67.130:6372", Usage: "address of the relay"}, cli.StringFlag{Name: "out", Value: ".", Usage: "specify an output folder to receive the file"}, } app.EnableBashCompletion = true @@ -105,44 +72,18 @@ func Run() { } return receive(c) } - app.Before = func(c *cli.Context) error { - cr = croc.Init(c.GlobalBool("debug")) - cr.Version = Version - cr.AllowLocalDiscovery = true - cr.Address = c.GlobalString("addr") - cr.AddressTCPPorts = strings.Split(c.GlobalString("addr-tcp"), ",") - cr.AddressWebsocketPort = c.GlobalString("addr-ws") - cr.NoRecipientPrompt = c.GlobalBool("yes") - cr.Stdout = c.GlobalBool("stdout") - cr.LocalOnly = c.GlobalBool("local") - cr.NoLocal = c.GlobalBool("no-local") - cr.ShowText = true - cr.RelayWebsocketPort = c.String("port") - cr.RelayTCPPorts = strings.Split(c.String("tcp-port"), ",") - cr.CurveType = c.String("curve") - if c.GlobalBool("force-tcp") { - cr.ForceSend = 2 - } - if c.GlobalBool("force-web") { - cr.ForceSend = 1 - } - return nil - } - err := app.Run(os.Args) - if err != nil { - fmt.Fprintf(os.Stderr, "\r\n%s", err.Error()) - } - fmt.Fprintf(os.Stderr, "\r\n") + return app.Run(os.Args) } -func saveDefaultConfig(c *cli.Context) error { - return croc.SaveDefaultConfig() -} +// func saveDefaultConfig(c *cli.Context) error { +// return croc.SaveDefaultConfig() +// } -func send(c *cli.Context) error { +func send(c *cli.Context) (err error) { + + var fnames []string stat, _ := os.Stdin.Stat() - var fname string if (stat.Mode() & os.ModeCharDevice) == 0 { f, err := ioutil.TempFile(".", "croc-stdin-") if err != nil { @@ -156,102 +97,117 @@ func send(c *cli.Context) error { if err != nil { return err } - fname = f.Name() + fnames = []string{f.Name()} defer func() { - err = os.Remove(fname) + err = os.Remove(fnames[0]) if err != nil { log.Println(err) } }() } else { - fname = c.Args().First() + fnames = append([]string{c.Args().First()}, c.Args().Tail()...) } - if fname == "" { + if len(fnames) == 0 { return errors.New("must specify file: croc send [filename]") } - cr.UseCompression = !c.Bool("no-compress") - cr.UseEncryption = !c.Bool("no-encrypt") + + var sharedSecret string if c.String("code") != "" { - cr.Codephrase = c.String("code") + sharedSecret = c.String("code") } - cr.LoadConfig() - if len(cr.Codephrase) == 0 { + // cr.LoadConfig() + if len(sharedSecret) == 0 { // generate code phrase - cr.Codephrase = utils.GetRandomName() + sharedSecret = utils.GetRandomName() } - // print the text - finfo, err := os.Stat(fname) - if err != nil { - return err - } - fname, _ = filepath.Abs(fname) - fname = filepath.Clean(fname) - _, filename := filepath.Split(fname) - fileOrFolder := "file" - fsize := finfo.Size() - if finfo.IsDir() { - fileOrFolder = "folder" - fsize, err = dirSize(fname) + haveFolder := false + paths := []string{} + for _, fname := range fnames { + stat, err := os.Stat(fname) if err != nil { return err } + if stat.IsDir() { + haveFolder = true + err = filepath.Walk(fname, + func(pathName string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if !info.IsDir() { + paths = append(paths, filepath.ToSlash(pathName)) + } + return nil + }) + if err != nil { + return err + } + } else { + paths = append(paths, filepath.ToSlash(fname)) + } } - fmt.Fprintf(os.Stderr, - "Sending %s %s named '%s'\nCode is: %s\nOn the other computer, please run:\n\ncroc %s\n\n", - humanize.Bytes(uint64(fsize)), - fileOrFolder, - filename, - cr.Codephrase, - cr.Codephrase, - ) - if cr.Debug { - croc.SetDebugLevel("debug") + cr, err := croc.New(croc.Options{ + SharedSecret: sharedSecret, + IsSender: true, + Debug: c.GlobalBool("debug"), + NoPrompt: c.GlobalBool("yes"), + AddressRelay: c.GlobalString("relay"), + Stdout: c.GlobalBool("stdout"), + }) + if err != nil { + return } - return cr.Send(fname, cr.Codephrase) + + err = cr.Send(croc.TransferOptions{ + PathToFiles: paths, + KeepPathInRemote: haveFolder, + }) + + return } -func receive(c *cli.Context) error { +func receive(c *cli.Context) (err error) { + var sharedSecret string if c.GlobalString("code") != "" { - cr.Codephrase = c.GlobalString("code") + sharedSecret = c.GlobalString("code") } if c.Args().First() != "" { - cr.Codephrase = c.Args().First() + sharedSecret = c.Args().First() + } + if sharedSecret == "" { + sharedSecret = utils.GetInput("Enter receive code: ") } if c.GlobalString("out") != "" { os.Chdir(c.GlobalString("out")) } - cr.LoadConfig() - openFolder := false - if len(os.Args) == 1 { - // open folder since they didn't give any arguments - openFolder = true - } - if cr.Codephrase == "" { - cr.Codephrase = utils.GetInput("Enter receive code: ") - } - if cr.Debug { - croc.SetDebugLevel("debug") - } - err := cr.Receive(cr.Codephrase) - if err == nil && openFolder { - cwd, _ := os.Getwd() - open.Run(cwd) - } - return err -} -func relay(c *cli.Context) error { - return cr.Relay() -} - -func dirSize(path string) (int64, error) { - var size int64 - err := filepath.Walk(path, func(_ string, info os.FileInfo, err error) error { - if !info.IsDir() { - size += info.Size() - } - return err + cr, err := croc.New(croc.Options{ + SharedSecret: sharedSecret, + IsSender: false, + Debug: c.GlobalBool("debug"), + NoPrompt: c.GlobalBool("yes"), + AddressRelay: c.GlobalString("relay"), + Stdout: c.GlobalBool("stdout"), }) - return size, err + if err != nil { + return + } + err = cr.Receive() + return } + +// func relay(c *cli.Context) error { +// return cr.Relay() +// } + +// func dirSize(path string) (int64, error) { +// var size int64 +// err := filepath.Walk(path, func(_ string, info os.FileInfo, err error) error { +// if !info.IsDir() { +// size += info.Size() +// } +// return err +// }) +// return size, err +// } From 1661bbb221473c7aae5f8516ccfff7e86771acc6 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 17:10:06 -0600 Subject: [PATCH 016/110] remove wina nd zipper --- src/win/Makefile | 24 - src/win/build.bat | 14 - src/win/icon.go | 3028 ------------------------------- src/win/icon.ico | Bin 36278 -> 0 bytes src/win/icon.rc | 1 - src/win/icon_windows_386.syso | Bin 36790 -> 0 bytes src/win/icon_windows_amd64.syso | Bin 36790 -> 0 bytes src/win/main.go | 230 --- src/win/main_windows.go | 250 --- src/zipper/zip.go | 230 --- src/zipper/zip_test.go | 47 - 11 files changed, 3824 deletions(-) delete mode 100644 src/win/Makefile delete mode 100644 src/win/build.bat delete mode 100644 src/win/icon.go delete mode 100644 src/win/icon.ico delete mode 100644 src/win/icon.rc delete mode 100644 src/win/icon_windows_386.syso delete mode 100644 src/win/icon_windows_amd64.syso delete mode 100644 src/win/main.go delete mode 100644 src/win/main_windows.go delete mode 100644 src/zipper/zip.go delete mode 100644 src/zipper/zip_test.go diff --git a/src/win/Makefile b/src/win/Makefile deleted file mode 100644 index 50ee972..0000000 --- a/src/win/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -VERSION=$(shell git describe --tags --abbrev=0) -LDFLAGS=-ldflags "-X main.Version=${VERSION}" - -.PHONY: linux -linux: - GO111MODULE=off qtdeploy ${LDFLAGS} --tags='wincroc' --debug build desktop - -.PHONY: fast -fast: - GO111MODULE=off qtdeploy ${LDFLAGS} --fast --tags='wincroc' --debug build desktop - -windows: - GO111MODULE=off qtdeploy ${LDFLAGS} --tags='wincroc' --debug --docker build windows_64_static - -release: linux windows - mv deploy/linux/win croc - tar -czvf croc_${VERSION}_Linux-64bit_GUI.tar.gz croc - mv deploy/windows/win.exe croc.exe - zip croc_${VERSION}_Windows-64bit_GUI.zip croc.exe - rm -rf dist - mkdir dist - mv *zip dist/ - mv *tar.gz dist/ - \ No newline at end of file diff --git a/src/win/build.bat b/src/win/build.bat deleted file mode 100644 index 521e79b..0000000 --- a/src/win/build.bat +++ /dev/null @@ -1,14 +0,0 @@ -REM getting the output of an executed command in a batch file is not trivial, we use a temp file for it -git describe --tags --abbrev=0 > temp.txt -set /P VERSION=< temp.txt -echo %VERSION% -del temp.txt - -REM build a 32 bit Windows application, this way it will run on both 32 but and 64 bit Windows machines -set GOARCH=386 - -REM -s and -w strip the program of debugging information, making it smaller -REM -H=windowsgui makes the program not have a console window on start-up -go build -ldflags="-s -w -H=windowsgui -X main.Version=%VERSION%" -o croc.exe - -if errorlevel 1 pause diff --git a/src/win/icon.go b/src/win/icon.go deleted file mode 100644 index 7e7bc0b..0000000 --- a/src/win/icon.go +++ /dev/null @@ -1,3028 +0,0 @@ -package main - -var icon = []byte{ - 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, - 0x20, 0x00, 0x68, 0x04, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x18, 0x18, - 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x88, 0x09, 0x00, 0x00, 0xBE, 0x04, - 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0xA8, 0x10, - 0x00, 0x00, 0x46, 0x0E, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x01, 0x00, - 0x20, 0x00, 0xA8, 0x25, 0x00, 0x00, 0xEE, 0x1E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x20, 0x49, 0x00, 0x00, 0x96, 0x44, - 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xCD, - 0x60, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, - 0x5D, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, - 0x5D, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, - 0x5D, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, - 0x5D, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, - 0x5D, 0x70, 0xF3, 0xCD, 0x60, 0xFF, 0xF5, 0xCD, 0x5D, 0xFF, 0xF4, 0xCD, - 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xE4, 0xC6, 0x5F, 0xFF, 0xC8, 0xB9, - 0x58, 0xFF, 0xD2, 0xBC, 0x59, 0xFF, 0xE9, 0xCA, 0x5E, 0xFF, 0xF3, 0xCD, - 0x5D, 0xFF, 0xF4, 0xCE, 0x5E, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0x97, 0xA6, - 0x58, 0xFF, 0x3C, 0x8C, 0x58, 0xFF, 0x3F, 0x7C, 0x4B, 0xFF, 0x60, 0x98, - 0x59, 0xFF, 0x94, 0xAA, 0x5A, 0xFF, 0xCC, 0xAE, 0x50, 0xFF, 0xF2, 0xCB, - 0x5C, 0xFF, 0xF4, 0xCD, 0x5D, 0xFF, 0xF5, 0xCE, 0x5E, 0xFF, 0xF4, 0xCD, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0x91, 0x97, 0x4E, 0xFF, 0x33, 0x90, 0x5B, 0xFF, 0x36, 0xA0, - 0x68, 0xFF, 0x2E, 0x85, 0x56, 0xFF, 0x33, 0x8A, 0x59, 0xFF, 0x53, 0x84, - 0x4C, 0xFF, 0x8C, 0xA0, 0x54, 0xFF, 0x86, 0x8B, 0x46, 0xFF, 0x9A, 0x9C, - 0x4E, 0xFF, 0xC9, 0xB7, 0x57, 0xFF, 0xEC, 0xC6, 0x5A, 0xFF, 0xF3, 0xCD, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xD8, 0xC4, 0x5F, 0xFF, 0x8C, 0xA4, - 0x55, 0xFF, 0x5D, 0x95, 0x57, 0xFF, 0x3F, 0xAE, 0x70, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x41, 0xBA, 0x78, 0xFF, 0x3B, 0xAA, 0x6E, 0xFF, 0x38, 0xA3, - 0x69, 0xFF, 0x32, 0x86, 0x56, 0xFF, 0x41, 0x7A, 0x4D, 0xFF, 0x6F, 0x83, - 0x45, 0xFF, 0xDA, 0xBB, 0x56, 0xFF, 0xF5, 0xCD, 0x5D, 0xFF, 0xF5, 0xCD, - 0x5D, 0xFF, 0xF4, 0xCD, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCD, - 0x60, 0xFF, 0xF4, 0xCD, 0x5D, 0xFF, 0xDF, 0xBD, 0x56, 0xFF, 0x6D, 0x9C, - 0x58, 0xFF, 0x40, 0xB9, 0x78, 0xFF, 0x41, 0xB7, 0x76, 0xFF, 0x43, 0xBE, - 0x7A, 0xFF, 0x44, 0xBF, 0x7C, 0xFF, 0x44, 0xBE, 0x7B, 0xFF, 0x3E, 0xAD, - 0x70, 0xFF, 0x3A, 0xA5, 0x6A, 0xFF, 0x62, 0x9D, 0x5B, 0xFF, 0x93, 0xA3, - 0x54, 0xFF, 0xA4, 0xA8, 0x54, 0xFF, 0xC8, 0xB6, 0x56, 0xFF, 0xEB, 0xCA, - 0x5D, 0xFF, 0xF2, 0xCD, 0x60, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF6, 0xCE, - 0x5E, 0xFF, 0xA4, 0xB0, 0x5B, 0xFF, 0x2F, 0x8E, 0x5B, 0xFF, 0x32, 0x93, - 0x5F, 0xFF, 0x40, 0xB7, 0x76, 0xFF, 0x3B, 0xA8, 0x6C, 0xFF, 0x3F, 0xB2, - 0x73, 0xFF, 0x43, 0xBC, 0x79, 0xFF, 0x44, 0xBF, 0x7C, 0xFF, 0x41, 0xBC, - 0x7A, 0xFF, 0x3F, 0xB7, 0x76, 0xFF, 0x40, 0xB1, 0x72, 0xFF, 0x49, 0xAD, - 0x6D, 0xFF, 0x91, 0xB7, 0x63, 0xFF, 0xF2, 0xCD, 0x60, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF4, 0xCC, 0x5D, 0xFF, 0xD6, 0xC5, 0x5E, 0xFF, 0x80, 0xAE, - 0x61, 0xFF, 0x64, 0xAA, 0x65, 0xFF, 0x47, 0x9F, 0x63, 0xFF, 0x3B, 0x9F, - 0x66, 0xFF, 0x30, 0x8F, 0x5C, 0xFF, 0x33, 0x94, 0x60, 0xFF, 0x3C, 0xA6, - 0x6A, 0xFF, 0x42, 0xBB, 0x79, 0xFF, 0x40, 0xBB, 0x79, 0xFF, 0x40, 0xBC, - 0x7A, 0xFF, 0x3C, 0xB7, 0x77, 0xFF, 0x66, 0x9F, 0x5C, 0xFF, 0xF2, 0xCD, - 0x60, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCD, 0x5E, 0xFF, 0xE6, 0xC6, 0x5C, 0xFF, 0xC9, 0xB4, - 0x55, 0xFF, 0xA1, 0xA9, 0x56, 0xFF, 0x75, 0x9F, 0x58, 0xFF, 0x5A, 0x96, - 0x58, 0xFF, 0x80, 0x91, 0x4C, 0xFF, 0x6F, 0x9E, 0x59, 0xFF, 0x68, 0x91, - 0x51, 0xFF, 0x6A, 0x99, 0x57, 0xFF, 0x78, 0xAA, 0x60, 0xFF, 0xBC, 0xB7, - 0x5A, 0xFF, 0xF2, 0xCD, 0x60, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCC, - 0x5D, 0xFF, 0xF4, 0xCD, 0x5D, 0xFF, 0xF4, 0xCD, 0x5D, 0xFF, 0xF1, 0xCC, - 0x5D, 0xFF, 0xE8, 0xCA, 0x5E, 0xFF, 0xEE, 0xCB, 0x5D, 0xFF, 0xE7, 0xC2, - 0x58, 0xFF, 0xEB, 0xC5, 0x59, 0xFF, 0xED, 0xC6, 0x5A, 0xFF, 0xF0, 0xCB, - 0x5D, 0xFF, 0xF4, 0xCD, 0x5D, 0xFF, 0xF2, 0xCD, 0x60, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCD, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCD, - 0x60, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCD, 0x60, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, - 0x5D, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, - 0x5D, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, - 0x5D, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, - 0x5D, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0xF2, 0xCC, - 0x5D, 0x70, 0xF2, 0xCC, 0x5D, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, - 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xCE, 0x62, 0x01, 0xF2, 0xCC, - 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, - 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, - 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, - 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, - 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, - 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, - 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, - 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCE, 0x62, 0xA2, 0xF2, 0xCC, - 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, - 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, - 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, - 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, - 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, - 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, - 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, - 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCE, 0x62, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCE, 0x62, 0xFF, 0xF5, 0xCD, - 0x5D, 0xFF, 0xF5, 0xCD, 0x5D, 0xFF, 0xF5, 0xCD, 0x5D, 0xFF, 0xF3, 0xCD, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF0, 0xCD, 0x62, 0xFF, 0xC3, 0xB2, - 0x54, 0xFF, 0xBC, 0xB2, 0x56, 0xFF, 0xC3, 0xB2, 0x55, 0xFF, 0xE0, 0xC0, - 0x58, 0xFF, 0xF0, 0xCD, 0x5E, 0xFF, 0xF4, 0xCD, 0x5D, 0xFF, 0xF3, 0xCD, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xC9, 0xB7, 0x5B, 0xFF, 0x4C, 0x98, - 0x5C, 0xFF, 0x38, 0x8D, 0x59, 0xFF, 0x38, 0x7A, 0x4C, 0xFF, 0x5B, 0x9A, - 0x5B, 0xFF, 0x78, 0xAC, 0x62, 0xFF, 0xA8, 0xB9, 0x60, 0xFF, 0xDE, 0xC0, - 0x59, 0xFF, 0xE9, 0xC4, 0x59, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xB6, 0xA9, 0x55, 0xFF, 0x33, 0x7A, - 0x4B, 0xFF, 0x34, 0x93, 0x5E, 0xFF, 0x2A, 0x75, 0x4B, 0xFF, 0x25, 0x65, - 0x41, 0xFF, 0x27, 0x6B, 0x45, 0xFF, 0x3B, 0x91, 0x5C, 0xFF, 0x52, 0x6E, - 0x3D, 0xFF, 0x9A, 0x88, 0x3F, 0xFF, 0xE8, 0xC8, 0x5C, 0xFF, 0xEB, 0xC8, - 0x5C, 0xFF, 0xEA, 0xC5, 0x5A, 0xFF, 0xF2, 0xCD, 0x5E, 0xFF, 0xF4, 0xCD, - 0x5D, 0xFF, 0xF4, 0xCD, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xC7, 0xAF, 0x55, 0xFF, 0x3D, 0x70, - 0x42, 0xFF, 0x39, 0xA7, 0x6C, 0xFF, 0x43, 0xBF, 0x7C, 0xFF, 0x3B, 0xA6, - 0x6B, 0xFF, 0x32, 0x8B, 0x59, 0xFF, 0x35, 0x93, 0x5F, 0xFF, 0x33, 0x86, - 0x56, 0xFF, 0x43, 0x84, 0x50, 0xFF, 0x62, 0x8D, 0x4F, 0xFF, 0x64, 0x84, - 0x48, 0xFF, 0x51, 0x5D, 0x31, 0xFF, 0x6D, 0x7D, 0x41, 0xFF, 0x93, 0xA8, - 0x58, 0xFF, 0xCF, 0xB6, 0x55, 0xFF, 0xED, 0xC7, 0x5A, 0xFF, 0xF4, 0xCE, - 0x5E, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xEE, 0xCD, 0x62, 0xFF, 0x93, 0xAF, - 0x59, 0xFF, 0x54, 0x87, 0x4C, 0xFF, 0x40, 0x89, 0x54, 0xFF, 0x3C, 0xAC, - 0x6F, 0xFF, 0x44, 0xC1, 0x7C, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x43, 0xBF, - 0x7B, 0xFF, 0x42, 0xBC, 0x7A, 0xFF, 0x3A, 0xA8, 0x6C, 0xFF, 0x36, 0x9D, - 0x65, 0xFF, 0x37, 0xA0, 0x67, 0xFF, 0x2A, 0x79, 0x4E, 0xFF, 0x2B, 0x60, - 0x3D, 0xFF, 0x45, 0x76, 0x49, 0xFF, 0x68, 0x75, 0x3C, 0xFF, 0xCA, 0xAC, - 0x4E, 0xFF, 0xF5, 0xCE, 0x5E, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCE, 0x62, 0xFF, 0xED, 0xCC, - 0x5E, 0xFF, 0xE5, 0xC8, 0x5C, 0xFF, 0xC3, 0xA8, 0x4D, 0xFF, 0x60, 0x79, - 0x42, 0xFF, 0x3A, 0xA0, 0x67, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBE, 0x7A, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x44, 0xBF, - 0x7B, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x42, 0xBA, 0x78, 0xFF, 0x41, 0xA9, - 0x6F, 0xFF, 0x34, 0x82, 0x56, 0xFF, 0x2A, 0x7D, 0x50, 0xFF, 0x56, 0x82, - 0x4A, 0xFF, 0xC9, 0xAD, 0x50, 0xFF, 0xED, 0xC6, 0x5A, 0xFF, 0xEF, 0xC8, - 0x5B, 0xFF, 0xF3, 0xCB, 0x5C, 0xFF, 0xF6, 0xCE, 0x5E, 0xFF, 0xF3, 0xCD, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCE, 0x62, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF6, 0xCE, 0x5E, 0xFF, 0xDA, 0xBF, - 0x59, 0xFF, 0x56, 0x93, 0x57, 0xFF, 0x41, 0xBC, 0x7A, 0xFF, 0x42, 0xB9, - 0x77, 0xFF, 0x40, 0xB5, 0x75, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x43, 0xBE, 0x7A, 0xFF, 0x43, 0xBE, - 0x7B, 0xFF, 0x41, 0xB8, 0x76, 0xFF, 0x40, 0xB6, 0x75, 0xFF, 0x40, 0xB4, - 0x74, 0xFF, 0x47, 0x90, 0x58, 0xFF, 0x68, 0x8D, 0x4E, 0xFF, 0x70, 0x92, - 0x50, 0xFF, 0x8A, 0x95, 0x4D, 0xFF, 0xB1, 0xA2, 0x4E, 0xFF, 0xDB, 0xBF, - 0x59, 0xFF, 0xF2, 0xCD, 0x5E, 0xFF, 0xF2, 0xCE, 0x62, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCD, - 0x5E, 0xFF, 0x7D, 0xA1, 0x58, 0xFF, 0x2F, 0x8C, 0x5A, 0xFF, 0x3A, 0xA4, - 0x6A, 0xFF, 0x2E, 0x80, 0x52, 0xFF, 0x42, 0xBA, 0x78, 0xFF, 0x41, 0xB8, - 0x76, 0xFF, 0x3D, 0xAD, 0x6F, 0xFF, 0x42, 0xB9, 0x77, 0xFF, 0x44, 0xBF, - 0x7B, 0xFF, 0x43, 0xBE, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBE, - 0x7A, 0xFF, 0x42, 0xBE, 0x7B, 0xFF, 0x3F, 0xB9, 0x78, 0xFF, 0x3F, 0xB9, - 0x78, 0xFF, 0x3D, 0xAE, 0x70, 0xFF, 0x3D, 0xA0, 0x66, 0xFF, 0x60, 0xB3, - 0x6C, 0xFF, 0xC4, 0xC2, 0x60, 0xFF, 0xF2, 0xCE, 0x62, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF5, 0xCD, - 0x5D, 0xFF, 0x9B, 0xB4, 0x5F, 0xFF, 0x27, 0x72, 0x49, 0xFF, 0x33, 0x98, - 0x62, 0xFF, 0x33, 0x94, 0x60, 0xFF, 0x40, 0xB6, 0x75, 0xFF, 0x40, 0xB7, - 0x76, 0xFF, 0x30, 0x87, 0x56, 0xFF, 0x38, 0x9F, 0x66, 0xFF, 0x3A, 0xA3, - 0x69, 0xFF, 0x40, 0xB5, 0x75, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x43, 0xBE, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x43, 0xBF, 0x7B, 0xFF, 0x3F, 0xB8, - 0x77, 0xFF, 0x7E, 0x9A, 0x53, 0xFF, 0xF2, 0xCE, 0x62, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCC, - 0x5D, 0xFF, 0xE3, 0xCA, 0x5F, 0xFF, 0xA9, 0xC2, 0x67, 0xFF, 0x84, 0xC2, - 0x6F, 0xFF, 0x70, 0xAB, 0x63, 0xFF, 0x3D, 0x89, 0x55, 0xFF, 0x40, 0x9F, - 0x65, 0xFF, 0x3B, 0xAA, 0x6E, 0xFF, 0x33, 0x94, 0x5F, 0xFF, 0x2B, 0x7B, - 0x4E, 0xFF, 0x35, 0x95, 0x60, 0xFF, 0x37, 0x99, 0x62, 0xFF, 0x3F, 0xAD, - 0x6F, 0xFF, 0x44, 0xC0, 0x7C, 0xFF, 0x42, 0xBE, 0x7B, 0xFF, 0x42, 0xBE, - 0x7B, 0xFF, 0x43, 0xBF, 0x7B, 0xFF, 0x42, 0xBD, 0x7A, 0xFF, 0x3A, 0xA7, - 0x6C, 0xFF, 0x82, 0x9B, 0x52, 0xFF, 0xF2, 0xCE, 0x62, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF5, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xE7, 0xC5, 0x5A, 0xFF, 0xBA, 0xA5, 0x4D, 0xFF, 0xB4, 0xAD, - 0x54, 0xFF, 0x6A, 0x8C, 0x4D, 0xFF, 0x4F, 0x93, 0x58, 0xFF, 0x3A, 0x85, - 0x52, 0xFF, 0x32, 0x8A, 0x58, 0xFF, 0x47, 0x63, 0x36, 0xFF, 0x80, 0xA5, - 0x5B, 0xFF, 0x3B, 0x99, 0x61, 0xFF, 0x41, 0x84, 0x51, 0xFF, 0x42, 0x86, - 0x51, 0xFF, 0x40, 0x91, 0x5A, 0xFF, 0x4B, 0xAA, 0x6A, 0xFF, 0x60, 0x8E, - 0x51, 0xFF, 0xCF, 0xC1, 0x5D, 0xFF, 0xF2, 0xCE, 0x62, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF5, 0xCE, 0x5E, 0xFF, 0xF4, 0xCC, - 0x5D, 0xFF, 0xEB, 0xC7, 0x5B, 0xFF, 0xE0, 0xC8, 0x5E, 0xFF, 0xC9, 0xC0, - 0x5D, 0xFF, 0xB0, 0xBF, 0x62, 0xFF, 0xCC, 0xB8, 0x57, 0xFF, 0xE3, 0xC1, - 0x58, 0xFF, 0xA2, 0x93, 0x45, 0xFF, 0xC5, 0xA8, 0x4D, 0xFF, 0xCE, 0xAF, - 0x50, 0xFF, 0xC4, 0xAB, 0x4F, 0xFF, 0xD2, 0xC2, 0x5D, 0xFF, 0xE6, 0xCA, - 0x5E, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF2, 0xCE, 0x62, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF4, 0xCD, - 0x5D, 0xFF, 0xF5, 0xCD, 0x5D, 0xFF, 0xF4, 0xCD, 0x5D, 0xFF, 0xF3, 0xCD, - 0x5D, 0xFF, 0xF5, 0xCE, 0x5E, 0xFF, 0xF4, 0xCE, 0x5E, 0xFF, 0xF4, 0xCE, - 0x5E, 0xFF, 0xF5, 0xCE, 0x5E, 0xFF, 0xF4, 0xCD, 0x5D, 0xFF, 0xF3, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCE, 0x62, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCE, 0x62, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCE, 0x62, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCE, 0x62, 0xA2, 0xF2, 0xCC, - 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, - 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, - 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, - 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, - 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, - 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, - 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCC, - 0x5D, 0xA2, 0xF2, 0xCC, 0x5D, 0xA2, 0xF2, 0xCE, 0x62, 0x01, 0xF2, 0xCC, - 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, - 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, - 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, - 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, - 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, - 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, - 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0xF2, 0xCC, - 0x5D, 0x01, 0xF2, 0xCC, 0x5D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF3, 0xCE, 0x64, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF3, 0xCE, - 0x64, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF3, 0xCE, 0x64, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCE, 0x64, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCE, - 0x64, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF6, 0xCE, 0x5E, 0xFF, 0xF5, 0xCD, - 0x5D, 0xFF, 0xF5, 0xCE, 0x5D, 0xFF, 0xF4, 0xCE, 0x5E, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF4, 0xCF, 0x64, 0xFF, 0xD9, 0xC3, - 0x5C, 0xFF, 0x9C, 0x92, 0x46, 0xFF, 0xB9, 0xB3, 0x58, 0xFF, 0xB4, 0xA9, - 0x51, 0xFF, 0xCF, 0xAF, 0x50, 0xFF, 0xEE, 0xCB, 0x5D, 0xFF, 0xF3, 0xCD, - 0x5E, 0xFF, 0xF4, 0xCD, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xE8, 0xC4, 0x5F, 0xFF, 0x71, 0x9C, 0x57, 0xFF, 0x33, 0x93, - 0x5F, 0xFF, 0x3C, 0x98, 0x60, 0xFF, 0x3B, 0x92, 0x5D, 0xFF, 0x47, 0x78, - 0x47, 0xFF, 0x76, 0xB8, 0x6B, 0xFF, 0x89, 0xAD, 0x5F, 0xFF, 0xB6, 0xBD, - 0x60, 0xFF, 0xEC, 0xCB, 0x5E, 0xFF, 0xF5, 0xCE, 0x5E, 0xFF, 0xF4, 0xCD, - 0x5E, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xDA, 0xBC, - 0x5C, 0xFF, 0x4C, 0x87, 0x50, 0xFF, 0x31, 0x8F, 0x5C, 0xFF, 0x2B, 0x77, - 0x4C, 0xFF, 0x1F, 0x54, 0x35, 0xFF, 0x25, 0x60, 0x3E, 0xFF, 0x39, 0x98, - 0x62, 0xFF, 0x32, 0x83, 0x55, 0xFF, 0x46, 0xA4, 0x68, 0xFF, 0x71, 0x9A, - 0x56, 0xFF, 0x93, 0x7F, 0x3B, 0xFF, 0xBB, 0x9E, 0x48, 0xFF, 0xF2, 0xCB, - 0x5C, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF5, 0xCE, 0x5E, 0xFF, 0xF4, 0xCD, - 0x5E, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xDD, 0xBC, 0x5C, 0xFF, 0x47, 0x6C, - 0x3D, 0xFF, 0x2A, 0x7C, 0x4F, 0xFF, 0x41, 0xB8, 0x76, 0xFF, 0x3C, 0xA9, - 0x6D, 0xFF, 0x2C, 0x7A, 0x4E, 0xFF, 0x1D, 0x4A, 0x2F, 0xFF, 0x1F, 0x4E, - 0x32, 0xFF, 0x2F, 0x7A, 0x4E, 0xFF, 0x2B, 0x73, 0x4A, 0xFF, 0x43, 0x51, - 0x2B, 0xFF, 0x8B, 0x8A, 0x44, 0xFF, 0xCF, 0xC0, 0x5C, 0xFF, 0xE4, 0xC9, - 0x5E, 0xFF, 0xC5, 0xAD, 0x51, 0xFF, 0xD4, 0xB5, 0x53, 0xFF, 0xE6, 0xC9, - 0x5D, 0xFF, 0xEA, 0xCA, 0x5D, 0xFF, 0xF3, 0xCD, 0x5E, 0xFF, 0xF4, 0xCD, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xEA, 0xC7, 0x60, 0xFF, 0x64, 0x73, 0x3B, 0xFF, 0x2C, 0x77, - 0x4B, 0xFF, 0x3F, 0xB2, 0x73, 0xFF, 0x44, 0xC1, 0x7C, 0xFF, 0x44, 0xC0, - 0x7C, 0xFF, 0x3E, 0xAF, 0x70, 0xFF, 0x3A, 0xA2, 0x68, 0xFF, 0x3A, 0xA2, - 0x68, 0xFF, 0x37, 0x99, 0x62, 0xFF, 0x34, 0x8F, 0x5C, 0xFF, 0x33, 0x83, - 0x53, 0xFF, 0x3C, 0x76, 0x48, 0xFF, 0x53, 0x84, 0x4C, 0xFF, 0x31, 0x5A, - 0x35, 0xFF, 0x2E, 0x3E, 0x22, 0xFF, 0x45, 0x5B, 0x32, 0xFF, 0x62, 0x93, - 0x53, 0xFF, 0x96, 0xA9, 0x58, 0xFF, 0xD7, 0xB7, 0x54, 0xFF, 0xEE, 0xC8, - 0x5B, 0xFF, 0xF4, 0xCE, 0x5E, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF5, 0xCF, - 0x64, 0xFF, 0xBB, 0xC1, 0x5F, 0xFF, 0x4D, 0x90, 0x51, 0xFF, 0x35, 0x71, - 0x43, 0xFF, 0x34, 0x8A, 0x58, 0xFF, 0x3E, 0xB1, 0x73, 0xFF, 0x44, 0xC0, - 0x7C, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x44, 0xBF, - 0x7B, 0xFF, 0x44, 0xC0, 0x7C, 0xFF, 0x43, 0xBF, 0x7B, 0xFF, 0x3C, 0xAB, - 0x6E, 0xFF, 0x32, 0x90, 0x5D, 0xFF, 0x37, 0x9C, 0x65, 0xFF, 0x37, 0x9E, - 0x66, 0xFF, 0x29, 0x76, 0x4C, 0xFF, 0x21, 0x50, 0x31, 0xFF, 0x2F, 0x62, - 0x3E, 0xFF, 0x44, 0x6F, 0x41, 0xFF, 0x67, 0x6C, 0x36, 0xFF, 0xC1, 0xA5, - 0x4B, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCE, 0x64, 0xFF, 0xEC, 0xCB, - 0x5D, 0xFF, 0xCE, 0xC8, 0x60, 0xFF, 0xC4, 0xB9, 0x58, 0xFF, 0x95, 0x89, - 0x41, 0xFF, 0x43, 0x62, 0x37, 0xFF, 0x34, 0x91, 0x5D, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x44, 0xBF, - 0x7C, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x42, 0xBA, - 0x78, 0xFF, 0x33, 0x89, 0x58, 0xFF, 0x47, 0x8C, 0x64, 0xFF, 0x31, 0x75, - 0x4F, 0xFF, 0x29, 0x76, 0x4B, 0xFF, 0x38, 0x57, 0x31, 0xFF, 0xBB, 0xA3, - 0x4C, 0xFF, 0xF7, 0xCF, 0x5E, 0xFF, 0xF4, 0xCD, 0x5E, 0xFF, 0xF3, 0xCD, - 0x5D, 0xFF, 0xF3, 0xCD, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCE, 0x64, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF4, 0xCC, - 0x5D, 0xFF, 0xF5, 0xCD, 0x5D, 0xFF, 0xF5, 0xCE, 0x5E, 0xFF, 0xD0, 0xB2, - 0x51, 0xFF, 0x57, 0x70, 0x3D, 0xFF, 0x36, 0x97, 0x61, 0xFF, 0x43, 0xBF, - 0x7B, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBE, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x44, 0xC0, - 0x7C, 0xFF, 0x42, 0xBA, 0x78, 0xFF, 0x30, 0x88, 0x57, 0xFF, 0x31, 0x89, - 0x58, 0xFF, 0x3C, 0xAD, 0x70, 0xFF, 0x4F, 0x7D, 0x48, 0xFF, 0xA2, 0x92, - 0x44, 0xFF, 0xD4, 0xB3, 0x52, 0xFF, 0xE3, 0xBF, 0x56, 0xFF, 0xDD, 0xBA, - 0x55, 0xFF, 0xEF, 0xC9, 0x5B, 0xFF, 0xF6, 0xCF, 0x5E, 0xFF, 0xF5, 0xCE, - 0x5E, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCE, - 0x64, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF5, 0xCE, 0x5E, 0xFF, 0xC9, 0xBA, - 0x59, 0xFF, 0x42, 0x8E, 0x57, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x43, 0xBE, - 0x7A, 0xFF, 0x3F, 0xB2, 0x73, 0xFF, 0x41, 0xB6, 0x76, 0xFF, 0x43, 0xBE, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x43, 0xBC, 0x7A, 0xFF, 0x43, 0xBE, - 0x7B, 0xFF, 0x3F, 0xB4, 0x74, 0xFF, 0x38, 0x91, 0x5C, 0xFF, 0x46, 0x80, - 0x4C, 0xFF, 0x53, 0x83, 0x4C, 0xFF, 0x4D, 0x83, 0x4D, 0xFF, 0x77, 0x85, - 0x45, 0xFF, 0x9B, 0x90, 0x46, 0xFF, 0xBD, 0xA9, 0x50, 0xFF, 0xEE, 0xCB, - 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF3, 0xCE, 0x64, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xE8, 0xCA, 0x5E, 0xFF, 0x5A, 0x93, - 0x56, 0xFF, 0x33, 0x94, 0x60, 0xFF, 0x42, 0xBB, 0x79, 0xFF, 0x31, 0x89, - 0x58, 0xFF, 0x2F, 0x84, 0x54, 0xFF, 0x43, 0xBB, 0x79, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x40, 0xB6, 0x75, 0xFF, 0x42, 0xBB, 0x79, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBE, - 0x7A, 0xFF, 0x43, 0xBF, 0x7B, 0xFF, 0x42, 0xBD, 0x7A, 0xFF, 0x40, 0xBC, - 0x7A, 0xFF, 0x41, 0xBC, 0x7A, 0xFF, 0x3B, 0xA9, 0x6E, 0xFF, 0x36, 0x96, - 0x61, 0xFF, 0x46, 0xA2, 0x66, 0xFF, 0x87, 0xC0, 0x6C, 0xFF, 0xE4, 0xCA, - 0x5F, 0xFF, 0xF3, 0xCE, 0x64, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xEF, 0xCD, 0x5F, 0xFF, 0x6C, 0xA4, 0x5E, 0xFF, 0x19, 0x4E, - 0x31, 0xFF, 0x2E, 0x81, 0x52, 0xFF, 0x36, 0x98, 0x62, 0xFF, 0x2B, 0x77, - 0x4C, 0xFF, 0x42, 0xBA, 0x78, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x38, 0x9D, - 0x65, 0xFF, 0x2B, 0x79, 0x4D, 0xFF, 0x3A, 0xA4, 0x69, 0xFF, 0x43, 0xBC, - 0x79, 0xFF, 0x44, 0xBE, 0x7B, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x43, 0xC0, - 0x7C, 0xFF, 0x43, 0xAC, 0x6D, 0xFF, 0xB2, 0xA9, 0x52, 0xFF, 0xF3, 0xCE, - 0x64, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCC, - 0x5D, 0xFF, 0xA2, 0xBE, 0x65, 0xFF, 0x3E, 0x92, 0x5C, 0xFF, 0x36, 0x9B, - 0x64, 0xFF, 0x3D, 0xB4, 0x75, 0xFF, 0x36, 0x9B, 0x64, 0xFF, 0x3E, 0xAE, - 0x70, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x40, 0xB4, 0x74, 0xFF, 0x35, 0x94, - 0x5F, 0xFF, 0x39, 0xA2, 0x68, 0xFF, 0x2E, 0x81, 0x52, 0xFF, 0x31, 0x88, - 0x57, 0xFF, 0x3F, 0xB1, 0x72, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x3D, 0xAA, - 0x6E, 0xFF, 0x84, 0x8B, 0x46, 0xFF, 0xF3, 0xCE, 0x64, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xED, 0xCC, - 0x5E, 0xFF, 0xCC, 0xCA, 0x64, 0xFF, 0xA2, 0xC7, 0x6B, 0xFF, 0x91, 0xC6, - 0x6F, 0xFF, 0x7A, 0xA7, 0x5D, 0xFF, 0x33, 0x73, 0x47, 0xFF, 0x3D, 0x97, - 0x5F, 0xFF, 0x38, 0x94, 0x5F, 0xFF, 0x40, 0xB5, 0x75, 0xFF, 0x36, 0x98, - 0x61, 0xFF, 0x30, 0x86, 0x55, 0xFF, 0x2E, 0x82, 0x53, 0xFF, 0x37, 0x98, - 0x61, 0xFF, 0x34, 0x8F, 0x5B, 0xFF, 0x38, 0x97, 0x60, 0xFF, 0x42, 0xB9, - 0x78, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x44, 0xBF, - 0x7C, 0xFF, 0x44, 0xBF, 0x7C, 0xFF, 0x43, 0xBF, 0x7B, 0xFF, 0x43, 0xBE, - 0x7A, 0xFF, 0x41, 0xB9, 0x77, 0xFF, 0x3A, 0x93, 0x5D, 0xFF, 0xA9, 0xA7, - 0x52, 0xFF, 0xF3, 0xCE, 0x64, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF4, 0xCC, - 0x5D, 0xFF, 0xF4, 0xCC, 0x5D, 0xFF, 0xF4, 0xCD, 0x5D, 0xFF, 0xE8, 0xC4, - 0x59, 0xFF, 0xA2, 0x8F, 0x42, 0xFF, 0xBF, 0xB5, 0x58, 0xFF, 0x81, 0x8B, - 0x47, 0xFF, 0x43, 0x7B, 0x4A, 0xFF, 0x3A, 0x92, 0x5B, 0xFF, 0x27, 0x70, - 0x46, 0xFF, 0x30, 0x8D, 0x5A, 0xFF, 0x2C, 0x81, 0x53, 0xFF, 0x22, 0x49, - 0x2C, 0xFF, 0x79, 0x89, 0x47, 0xFF, 0x55, 0xB3, 0x6F, 0xFF, 0x3B, 0xAD, - 0x70, 0xFF, 0x36, 0x8E, 0x5A, 0xFF, 0x34, 0x88, 0x56, 0xFF, 0x35, 0x92, - 0x5E, 0xFF, 0x38, 0x9F, 0x66, 0xFF, 0x3F, 0xB4, 0x74, 0xFF, 0x30, 0x7F, - 0x50, 0xFF, 0x68, 0x8C, 0x4E, 0xFF, 0xE2, 0xCB, 0x60, 0xFF, 0xF3, 0xCE, - 0x64, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF5, 0xCE, - 0x5E, 0xFF, 0xF6, 0xCE, 0x5D, 0xFF, 0xE9, 0xC4, 0x59, 0xFF, 0xD2, 0xBA, - 0x57, 0xFF, 0xBF, 0xC1, 0x61, 0xFF, 0x9F, 0xAC, 0x58, 0xFF, 0x7E, 0xAE, - 0x61, 0xFF, 0x66, 0xAB, 0x64, 0xFF, 0x81, 0x8A, 0x46, 0xFF, 0xE6, 0xC3, - 0x59, 0xFF, 0x9D, 0x98, 0x4A, 0xFF, 0x49, 0x5E, 0x32, 0xFF, 0x87, 0x7E, - 0x3C, 0xFF, 0x9C, 0x8B, 0x41, 0xFF, 0x8B, 0x80, 0x3D, 0xFF, 0x80, 0x80, - 0x3F, 0xFF, 0x9F, 0xB5, 0x5F, 0xFF, 0xAF, 0xB9, 0x5F, 0xFF, 0xE4, 0xC8, - 0x5E, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF3, 0xCE, 0x64, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCD, 0x5D, 0xFF, 0xF4, 0xCD, 0x5D, 0xFF, 0xF5, 0xCD, - 0x5D, 0xFF, 0xF5, 0xCD, 0x5D, 0xFF, 0xF0, 0xCD, 0x5E, 0xFF, 0xEC, 0xCC, - 0x5F, 0xFF, 0xF1, 0xCE, 0x5E, 0xFF, 0xF3, 0xCD, 0x5D, 0xFF, 0xF1, 0xCA, - 0x5C, 0xFF, 0xE1, 0xBE, 0x56, 0xFF, 0xF0, 0xCA, 0x5C, 0xFF, 0xF6, 0xCF, - 0x5E, 0xFF, 0xF5, 0xCE, 0x5E, 0xFF, 0xF4, 0xCD, 0x5D, 0xFF, 0xF5, 0xCC, - 0x5D, 0xFF, 0xF5, 0xCD, 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCE, 0x64, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCD, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCE, - 0x64, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCE, 0x64, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCE, 0x64, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCE, - 0x64, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCE, 0x64, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, 0x5D, 0xCD, 0xF2, 0xCC, - 0x5D, 0xCD, 0xF3, 0xCE, 0x64, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, - 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0xF2, 0xCC, 0x5D, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x28, 0x00, - 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF3, 0xCF, 0x68, 0x56, 0xF2, 0xCC, 0x5C, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF3, 0xCF, 0x68, 0xFD, 0xF2, 0xCC, 0x5C, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF3, 0xCC, - 0x5D, 0xFF, 0xF4, 0xCD, 0x5E, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF4, 0xCC, - 0x5C, 0xFF, 0xF4, 0xCC, 0x5D, 0xFF, 0xF4, 0xCE, 0x5E, 0xFF, 0xF3, 0xCD, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF3, 0xCD, 0x5D, 0xFF, 0xC5, 0xC0, - 0x5E, 0xFF, 0x78, 0x77, 0x3A, 0xFF, 0x74, 0x6F, 0x36, 0xFF, 0xBB, 0xBE, - 0x5F, 0xFF, 0x9F, 0xA0, 0x50, 0xFF, 0x97, 0x83, 0x3C, 0xFF, 0xDD, 0xBB, - 0x55, 0xFF, 0xF0, 0xCC, 0x5D, 0xFF, 0xF4, 0xCC, 0x5D, 0xFF, 0xF5, 0xCC, - 0x5D, 0xFF, 0xF4, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF5, 0xD1, 0x68, 0xFF, 0xCF, 0xB2, 0x52, 0xFF, 0x57, 0x9B, - 0x5C, 0xFF, 0x2B, 0x83, 0x55, 0xFF, 0x30, 0x89, 0x59, 0xFF, 0x47, 0xB9, - 0x77, 0xFF, 0x41, 0xB1, 0x72, 0xFF, 0x2B, 0x5B, 0x38, 0xFF, 0x4D, 0x61, - 0x35, 0xFF, 0x80, 0xBA, 0x6B, 0xFF, 0x9E, 0xC0, 0x68, 0xFF, 0xB4, 0xC4, - 0x66, 0xFF, 0xD2, 0xC9, 0x62, 0xFF, 0xF1, 0xCC, 0x5D, 0xFF, 0xF4, 0xCD, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF6, 0xD1, 0x68, 0xFF, 0x9A, 0x91, 0x45, 0xFF, 0x37, 0x94, - 0x5F, 0xFF, 0x43, 0xBF, 0x7B, 0xFF, 0x37, 0x9A, 0x63, 0xFF, 0x21, 0x5A, - 0x39, 0xFF, 0x2D, 0x7E, 0x51, 0xFF, 0x33, 0x8B, 0x59, 0xFF, 0x3B, 0x99, - 0x63, 0xFF, 0x45, 0xBA, 0x78, 0xFF, 0x3D, 0x9E, 0x66, 0xFF, 0x2D, 0x6B, - 0x45, 0xFF, 0x4B, 0x96, 0x5D, 0xFF, 0x9C, 0xC1, 0x69, 0xFF, 0xDA, 0xBD, - 0x58, 0xFF, 0xEC, 0xC6, 0x5A, 0xFF, 0xF0, 0xCB, 0x5C, 0xFF, 0xF0, 0xCA, - 0x5C, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF6, 0xD1, 0x68, 0xFF, 0x98, 0x94, 0x48, 0xFF, 0x2F, 0x83, - 0x53, 0xFF, 0x2A, 0x77, 0x4B, 0xFF, 0x33, 0x8E, 0x5B, 0xFF, 0x2B, 0x77, - 0x4C, 0xFF, 0x1A, 0x43, 0x2A, 0xFF, 0x10, 0x28, 0x18, 0xFF, 0x20, 0x50, - 0x33, 0xFF, 0x3A, 0x94, 0x5F, 0xFF, 0x40, 0xA3, 0x69, 0xFF, 0x36, 0x88, - 0x58, 0xFF, 0x3E, 0xA2, 0x69, 0xFF, 0x4A, 0xB7, 0x75, 0xFF, 0x48, 0x6B, - 0x3E, 0xFF, 0x5E, 0x53, 0x27, 0xFF, 0x75, 0x65, 0x2E, 0xFF, 0xA3, 0x8B, - 0x3F, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF7, 0xD2, 0x69, 0xFF, 0x9C, 0x8B, 0x41, 0xFF, 0x2D, 0x74, - 0x49, 0xFF, 0x1E, 0x56, 0x35, 0xFF, 0x35, 0x96, 0x60, 0xFF, 0x44, 0xC1, - 0x7D, 0xFF, 0x40, 0xB3, 0x74, 0xFF, 0x32, 0x8C, 0x5A, 0xFF, 0x1E, 0x50, - 0x32, 0xFF, 0x12, 0x2C, 0x1B, 0xFF, 0x14, 0x2F, 0x1D, 0xFF, 0x20, 0x4F, - 0x32, 0xFF, 0x34, 0x83, 0x54, 0xFF, 0x3D, 0x9C, 0x64, 0xFF, 0x34, 0x89, - 0x58, 0xFF, 0x41, 0x4F, 0x2A, 0xFF, 0x94, 0x86, 0x3F, 0xFF, 0xBE, 0xAD, - 0x52, 0xFF, 0xEF, 0xCC, 0x5E, 0xFF, 0xF4, 0xCD, 0x5D, 0xFF, 0xF5, 0xCD, - 0x5D, 0xFF, 0xE9, 0xC4, 0x59, 0xFF, 0xED, 0xC8, 0x5B, 0xFF, 0xF5, 0xCE, - 0x5E, 0xFF, 0xF5, 0xCE, 0x5D, 0xFF, 0xF5, 0xCD, 0x5D, 0xFF, 0xF5, 0xCD, - 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF7, 0xD2, 0x69, 0xFF, 0x9F, 0x8B, 0x40, 0xFF, 0x1F, 0x45, - 0x2A, 0xFF, 0x35, 0x92, 0x5E, 0xFF, 0x42, 0xBA, 0x78, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBE, 0x7A, 0xFF, 0x44, 0xBF, 0x7C, 0xFF, 0x42, 0xB9, - 0x77, 0xFF, 0x33, 0x8F, 0x5C, 0xFF, 0x23, 0x5E, 0x3C, 0xFF, 0x24, 0x61, - 0x3E, 0xFF, 0x25, 0x64, 0x40, 0xFF, 0x26, 0x67, 0x42, 0xFF, 0x20, 0x54, - 0x35, 0xFF, 0x1F, 0x45, 0x2A, 0xFF, 0x2C, 0x4C, 0x2D, 0xFF, 0x44, 0x69, - 0x3C, 0xFF, 0x72, 0x97, 0x53, 0xFF, 0xA0, 0xB6, 0x5F, 0xFF, 0xB8, 0xBF, - 0x61, 0xFF, 0x6D, 0x81, 0x45, 0xFF, 0x58, 0x56, 0x2A, 0xFF, 0x90, 0x82, - 0x3D, 0xFF, 0xB2, 0xAF, 0x56, 0xFF, 0xB1, 0xB3, 0x5A, 0xFF, 0xC4, 0xBF, - 0x5E, 0xFF, 0xE1, 0xC9, 0x5E, 0xFF, 0xF3, 0xCD, 0x5E, 0xFF, 0xF3, 0xCD, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF5, 0xD1, 0x68, 0xFF, 0xD1, 0xB6, 0x54, 0xFF, 0x45, 0x66, - 0x37, 0xFF, 0x23, 0x51, 0x31, 0xFF, 0x35, 0x93, 0x5E, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBE, - 0x7B, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x42, 0xBB, 0x79, 0xFF, 0x41, 0xB6, - 0x76, 0xFF, 0x3F, 0xB3, 0x74, 0xFF, 0x3C, 0xAA, 0x6E, 0xFF, 0x32, 0x90, - 0x5D, 0xFF, 0x24, 0x63, 0x3F, 0xFF, 0x26, 0x5C, 0x39, 0xFF, 0x34, 0x74, - 0x47, 0xFF, 0x26, 0x5D, 0x3A, 0xFF, 0x0E, 0x28, 0x19, 0xFF, 0x0E, 0x22, - 0x14, 0xFF, 0x16, 0x2E, 0x1C, 0xFF, 0x23, 0x4E, 0x30, 0xFF, 0x47, 0x99, - 0x5E, 0xFF, 0x5E, 0x97, 0x58, 0xFF, 0xB0, 0xAA, 0x53, 0xFF, 0xE1, 0xBE, - 0x56, 0xFF, 0xF0, 0xCA, 0x5C, 0xFF, 0xF4, 0xCE, 0x5E, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF1, 0xCC, 0x5D, 0xFF, 0x96, 0xBE, - 0x63, 0xFF, 0x45, 0x93, 0x54, 0xFF, 0x27, 0x56, 0x33, 0xFF, 0x28, 0x6C, - 0x45, 0xFF, 0x39, 0xA1, 0x68, 0xFF, 0x42, 0xBC, 0x79, 0xFF, 0x44, 0xBF, - 0x7B, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBE, 0x7A, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x44, 0xBF, - 0x7C, 0xFF, 0x41, 0xB6, 0x75, 0xFF, 0x32, 0x8B, 0x59, 0xFF, 0x2B, 0x76, - 0x4B, 0xFF, 0x33, 0x8E, 0x5B, 0xFF, 0x38, 0x9D, 0x65, 0xFF, 0x36, 0x97, - 0x61, 0xFF, 0x28, 0x70, 0x47, 0xFF, 0x1D, 0x46, 0x2C, 0xFF, 0x2D, 0x67, - 0x40, 0xFF, 0x2B, 0x67, 0x3F, 0xFF, 0x2D, 0x56, 0x32, 0xFF, 0x41, 0x50, - 0x2A, 0xFF, 0x69, 0x63, 0x2F, 0xFF, 0xBD, 0xA3, 0x4B, 0xFF, 0xF1, 0xCB, - 0x5D, 0xFF, 0xF3, 0xCD, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF3, 0xCC, 0x5C, 0xFF, 0xD5, 0xC8, - 0x5F, 0xFF, 0x83, 0xBC, 0x65, 0xFF, 0x76, 0xAF, 0x5E, 0xFF, 0x5E, 0x7C, - 0x41, 0xFF, 0x3A, 0x4E, 0x2B, 0xFF, 0x26, 0x5F, 0x3C, 0xFF, 0x37, 0x9A, - 0x63, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBE, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x44, 0xBF, - 0x7B, 0xFF, 0x44, 0xBF, 0x7C, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x44, 0xBF, - 0x7C, 0xFF, 0x44, 0xC0, 0x7C, 0xFF, 0x2F, 0x7D, 0x4F, 0xFF, 0x15, 0x2D, - 0x1A, 0xFF, 0x2E, 0x4D, 0x35, 0xFF, 0x4C, 0x94, 0x67, 0xFF, 0x37, 0x9C, - 0x64, 0xFF, 0x25, 0x66, 0x40, 0xFF, 0x27, 0x33, 0x1A, 0xFF, 0x84, 0x75, - 0x36, 0xFF, 0xE9, 0xC5, 0x5A, 0xFF, 0xF3, 0xCD, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xEB, 0xCB, 0x5E, 0xFF, 0xEB, 0xCC, 0x5E, 0xFF, 0xEC, 0xCD, - 0x5E, 0xFF, 0xD7, 0xB7, 0x54, 0xFF, 0x84, 0x74, 0x36, 0xFF, 0x2C, 0x3D, - 0x21, 0xFF, 0x29, 0x6D, 0x46, 0xFF, 0x40, 0xB5, 0x75, 0xFF, 0x43, 0xBE, - 0x7B, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x42, 0xB9, 0x77, 0xFF, 0x3A, 0xA1, - 0x67, 0xFF, 0x4F, 0xAE, 0x79, 0xFF, 0x49, 0x7C, 0x5E, 0xFF, 0x1D, 0x4F, - 0x32, 0xFF, 0x36, 0x98, 0x62, 0xFF, 0x2B, 0x71, 0x48, 0xFF, 0x20, 0x43, - 0x28, 0xFF, 0x90, 0x83, 0x3D, 0xFF, 0xF4, 0xCD, 0x5E, 0xFF, 0xF3, 0xCD, - 0x5E, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF4, 0xCD, 0x5E, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xBE, 0xA3, - 0x4B, 0xFF, 0x42, 0x56, 0x2F, 0xFF, 0x25, 0x65, 0x41, 0xFF, 0x41, 0xB8, - 0x77, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x44, 0xBF, - 0x7B, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x38, 0xA2, 0x68, 0xFF, 0x23, 0x62, - 0x3E, 0xFF, 0x1F, 0x58, 0x37, 0xFF, 0x3D, 0xAD, 0x6F, 0xFF, 0x3D, 0xAF, - 0x71, 0xFF, 0x38, 0x64, 0x3B, 0xFF, 0x9F, 0x8B, 0x40, 0xFF, 0xDF, 0xBC, - 0x56, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF6, 0xCF, 0x5E, 0xFF, 0xF6, 0xCF, - 0x5E, 0xFF, 0xF5, 0xCE, 0x5E, 0xFF, 0xF5, 0xCE, 0x5E, 0xFF, 0xF3, 0xCD, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF5, 0xCE, - 0x5E, 0xFF, 0xC1, 0xBE, 0x5E, 0xFF, 0x3F, 0x60, 0x37, 0xFF, 0x36, 0x99, - 0x62, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x43, 0xBC, - 0x7A, 0xFF, 0x3E, 0xAF, 0x71, 0xFF, 0x42, 0xB9, 0x77, 0xFF, 0x44, 0xBF, - 0x7B, 0xFF, 0x3C, 0xAA, 0x6E, 0xFF, 0x2E, 0x68, 0x40, 0xFF, 0x43, 0x57, - 0x2E, 0xFF, 0x76, 0x70, 0x36, 0xFF, 0xA2, 0x8D, 0x41, 0xFF, 0xA9, 0x94, - 0x44, 0xFF, 0x8E, 0x82, 0x3D, 0xFF, 0xAE, 0x97, 0x45, 0xFF, 0xE8, 0xC4, - 0x59, 0xFF, 0xF3, 0xCD, 0x5D, 0xFF, 0xF4, 0xCD, 0x5E, 0xFF, 0xF4, 0xCE, - 0x5E, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF5, 0xCF, 0x5E, 0xFF, 0x89, 0xA1, 0x56, 0xFF, 0x32, 0x8F, - 0x5C, 0xFF, 0x44, 0xC0, 0x7C, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x40, 0xB5, 0x74, 0xFF, 0x3C, 0xA8, 0x6C, 0xFF, 0x43, 0xBC, - 0x79, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x42, 0xBB, 0x79, 0xFF, 0x3B, 0xA9, - 0x6D, 0xFF, 0x33, 0x8F, 0x5B, 0xFF, 0x30, 0x79, 0x4C, 0xFF, 0x33, 0x81, - 0x51, 0xFF, 0x33, 0x8D, 0x5A, 0xFF, 0x34, 0x73, 0x47, 0xFF, 0x55, 0x65, - 0x37, 0xFF, 0x75, 0x71, 0x38, 0xFF, 0x7C, 0x77, 0x3B, 0xFF, 0xBB, 0xA4, - 0x4D, 0xFF, 0xF1, 0xCB, 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF5, 0xCE, 0x5D, 0xFF, 0xB1, 0xB3, 0x59, 0xFF, 0x33, 0x83, - 0x53, 0xFF, 0x3C, 0xAA, 0x6D, 0xFF, 0x42, 0xBB, 0x79, 0xFF, 0x44, 0xBF, - 0x7B, 0xFF, 0x39, 0xA1, 0x67, 0xFF, 0x1E, 0x53, 0x34, 0xFF, 0x3D, 0xAA, - 0x6E, 0xFF, 0x43, 0xBC, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBE, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBE, - 0x7B, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x44, 0xBF, 0x7C, 0xFF, 0x44, 0xBF, - 0x7C, 0xFF, 0x44, 0xC0, 0x7C, 0xFF, 0x42, 0xBC, 0x7A, 0xFF, 0x38, 0x9F, - 0x67, 0xFF, 0x30, 0x86, 0x57, 0xFF, 0x30, 0x88, 0x58, 0xFF, 0x49, 0x98, - 0x5E, 0xFF, 0x85, 0xC0, 0x6D, 0xFF, 0xD4, 0xCA, 0x63, 0xFF, 0xF4, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF4, 0xCC, 0x5D, 0xFF, 0xCB, 0xC7, 0x62, 0xFF, 0x3A, 0x87, - 0x54, 0xFF, 0x1B, 0x4C, 0x2F, 0xFF, 0x2D, 0x7E, 0x51, 0xFF, 0x42, 0xBB, - 0x79, 0xFF, 0x3C, 0xAA, 0x6E, 0xFF, 0x1D, 0x51, 0x33, 0xFF, 0x29, 0x74, - 0x49, 0xFF, 0x42, 0xB9, 0x77, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBE, - 0x7B, 0xFF, 0x3D, 0xAC, 0x6F, 0xFF, 0x36, 0x97, 0x61, 0xFF, 0x41, 0xB9, - 0x77, 0xFF, 0x40, 0xB3, 0x73, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBF, - 0x7B, 0xFF, 0x44, 0xBF, 0x7C, 0xFF, 0x44, 0xBF, 0x7C, 0xFF, 0x42, 0xBF, - 0x7B, 0xFF, 0x3E, 0xBC, 0x7A, 0xFF, 0x83, 0xB3, 0x64, 0xFF, 0xF0, 0xC9, - 0x5C, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF4, 0xCC, 0x5D, 0xFF, 0xD4, 0xCB, 0x63, 0xFF, 0x46, 0xA2, - 0x65, 0xFF, 0x16, 0x3F, 0x27, 0xFF, 0x1E, 0x54, 0x34, 0xFF, 0x28, 0x70, - 0x47, 0xFF, 0x3F, 0xB3, 0x73, 0xFF, 0x29, 0x73, 0x49, 0xFF, 0x2F, 0x84, - 0x54, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBE, - 0x7A, 0xFF, 0x3F, 0xB3, 0x73, 0xFF, 0x24, 0x65, 0x40, 0xFF, 0x22, 0x5F, - 0x3C, 0xFF, 0x31, 0x8A, 0x58, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBC, - 0x79, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x40, 0xBB, 0x79, 0xFF, 0x50, 0x7E, 0x49, 0xFF, 0xDD, 0xBA, - 0x54, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xE5, 0xCB, 0x5F, 0xFF, 0x6B, 0xBA, - 0x6E, 0xFF, 0x23, 0x6E, 0x47, 0xFF, 0x36, 0x9C, 0x64, 0xFF, 0x2E, 0x81, - 0x53, 0xFF, 0x3E, 0xAF, 0x70, 0xFF, 0x42, 0xBB, 0x79, 0xFF, 0x35, 0x8E, - 0x5B, 0xFF, 0x3F, 0xAF, 0x71, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x36, 0x97, 0x61, 0xFF, 0x2B, 0x77, - 0x4C, 0xFF, 0x3E, 0xAF, 0x70, 0xFF, 0x35, 0x95, 0x60, 0xFF, 0x2F, 0x84, - 0x54, 0xFF, 0x3C, 0xA9, 0x6D, 0xFF, 0x3A, 0xA3, 0x69, 0xFF, 0x44, 0xBF, - 0x7B, 0xFF, 0x43, 0xBE, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBF, 0x7B, 0xFF, 0x3A, 0x82, 0x50, 0xFF, 0xB6, 0x9E, - 0x48, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xCE, 0xC9, - 0x63, 0xFF, 0x81, 0xC0, 0x6E, 0xFF, 0x61, 0xBF, 0x75, 0xFF, 0x48, 0xBF, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x45, 0xBF, 0x7B, 0xFF, 0x32, 0x87, - 0x56, 0xFF, 0x36, 0x95, 0x5F, 0xFF, 0x42, 0xBB, 0x79, 0xFF, 0x40, 0xB5, - 0x75, 0xFF, 0x3F, 0xAD, 0x6F, 0xFF, 0x44, 0xBF, 0x7B, 0xFF, 0x44, 0xC1, - 0x7C, 0xFF, 0x3C, 0xAA, 0x6D, 0xFF, 0x31, 0x8A, 0x58, 0xFF, 0x22, 0x5F, - 0x3C, 0xFF, 0x18, 0x43, 0x29, 0xFF, 0x30, 0x85, 0x55, 0xFF, 0x3C, 0xA9, - 0x6D, 0xFF, 0x40, 0xB3, 0x73, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x40, 0xB6, - 0x75, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x42, 0xBD, 0x7A, 0xFF, 0x36, 0x75, 0x48, 0xFF, 0xB4, 0x9C, - 0x48, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCC, - 0x5D, 0xFF, 0xF0, 0xCC, 0x5D, 0xFF, 0xE0, 0xCA, 0x60, 0xFF, 0xBD, 0xC7, - 0x66, 0xFF, 0xAC, 0xC6, 0x69, 0xFF, 0xB9, 0xC9, 0x68, 0xFF, 0x8A, 0xA4, - 0x57, 0xFF, 0x2A, 0x59, 0x36, 0xFF, 0x29, 0x64, 0x3E, 0xFF, 0x3D, 0x9E, - 0x65, 0xFF, 0x2B, 0x6F, 0x46, 0xFF, 0x3E, 0xAD, 0x6F, 0xFF, 0x40, 0xB1, - 0x72, 0xFF, 0x3A, 0xA4, 0x6A, 0xFF, 0x2F, 0x83, 0x53, 0xFF, 0x3B, 0xA5, - 0x6A, 0xFF, 0x30, 0x87, 0x56, 0xFF, 0x42, 0xB9, 0x78, 0xFF, 0x30, 0x82, - 0x53, 0xFF, 0x29, 0x6D, 0x45, 0xFF, 0x39, 0x9F, 0x66, 0xFF, 0x2E, 0x79, - 0x4C, 0xFF, 0x42, 0xBB, 0x79, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBE, 0x7A, 0xFF, 0x43, 0xBF, 0x7B, 0xFF, 0x43, 0xBE, - 0x7B, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBD, 0x7A, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x43, 0xBC, - 0x79, 0xFF, 0x31, 0x8F, 0x5C, 0xFF, 0x60, 0x91, 0x53, 0xFF, 0xE6, 0xC7, - 0x5C, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF5, 0xCC, - 0x5D, 0xFF, 0xF5, 0xCC, 0x5D, 0xFF, 0xF6, 0xCD, 0x5D, 0xFF, 0xE9, 0xC3, - 0x59, 0xFF, 0x77, 0x6C, 0x33, 0xFF, 0x91, 0x82, 0x3D, 0xFF, 0xB9, 0xC1, - 0x62, 0xFF, 0x79, 0x8A, 0x48, 0xFF, 0x2E, 0x5F, 0x3A, 0xFF, 0x2D, 0x74, - 0x49, 0xFF, 0x38, 0xA4, 0x6A, 0xFF, 0x1C, 0x52, 0x33, 0xFF, 0x2C, 0x7E, - 0x50, 0xFF, 0x31, 0x8C, 0x59, 0xFF, 0x36, 0x97, 0x61, 0xFF, 0x31, 0x85, - 0x55, 0xFF, 0x21, 0x57, 0x36, 0xFF, 0x28, 0x41, 0x25, 0xFF, 0x7A, 0x92, - 0x4E, 0xFF, 0x4E, 0xBE, 0x79, 0xFF, 0x43, 0xBF, 0x7C, 0xFF, 0x44, 0xBF, - 0x7B, 0xFF, 0x3F, 0xB2, 0x73, 0xFF, 0x3A, 0xA1, 0x67, 0xFF, 0x3E, 0xAE, - 0x70, 0xFF, 0x40, 0xB5, 0x75, 0xFF, 0x41, 0xB5, 0x75, 0xFF, 0x43, 0xBD, - 0x7A, 0xFF, 0x43, 0xBE, 0x7B, 0xFF, 0x3D, 0xAD, 0x6F, 0xFF, 0x26, 0x69, - 0x43, 0xFF, 0x24, 0x59, 0x37, 0xFF, 0x9F, 0xBB, 0x64, 0xFF, 0xF4, 0xCD, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xEF, 0xCA, 0x5C, 0xFF, 0xF3, 0xCD, 0x5D, 0xFF, 0xF6, 0xCD, - 0x5D, 0xFF, 0xEB, 0xC5, 0x5A, 0xFF, 0x84, 0x76, 0x37, 0xFF, 0x89, 0x9E, - 0x53, 0xFF, 0x6A, 0xB4, 0x6A, 0xFF, 0x4D, 0x98, 0x5C, 0xFF, 0x2E, 0x67, - 0x3E, 0xFF, 0x2D, 0x72, 0x47, 0xFF, 0x39, 0xA9, 0x6D, 0xFF, 0x24, 0x69, - 0x43, 0xFF, 0x16, 0x38, 0x22, 0xFF, 0x76, 0x6C, 0x32, 0xFF, 0xE3, 0xCA, - 0x5F, 0xFF, 0x7A, 0x9D, 0x56, 0xFF, 0x2F, 0x82, 0x53, 0xFF, 0x2E, 0x7A, - 0x4D, 0xFF, 0x30, 0x55, 0x31, 0xFF, 0x35, 0x44, 0x24, 0xFF, 0x30, 0x4B, - 0x2B, 0xFF, 0x2B, 0x4F, 0x2E, 0xFF, 0x26, 0x4B, 0x2D, 0xFF, 0x2C, 0x68, - 0x40, 0xFF, 0x4A, 0xAE, 0x6D, 0xFF, 0x43, 0x9C, 0x61, 0xFF, 0x49, 0x81, - 0x4C, 0xFF, 0xA4, 0xB0, 0x5B, 0xFF, 0xE9, 0xCC, 0x5F, 0xFF, 0xF3, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF0, 0xCA, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xE8, 0xC9, 0x5D, 0xFF, 0xDB, 0xC8, 0x5F, 0xFF, 0xC7, 0xC0, - 0x5E, 0xFF, 0xA8, 0xBE, 0x63, 0xFF, 0x80, 0xC4, 0x71, 0xFF, 0x79, 0xBF, - 0x6F, 0xFF, 0x88, 0x9E, 0x53, 0xFF, 0xDF, 0xBD, 0x56, 0xFF, 0xF5, 0xCE, - 0x5E, 0xFF, 0xC9, 0xAB, 0x4E, 0xFF, 0x6F, 0x68, 0x31, 0xFF, 0x3C, 0x40, - 0x1F, 0xFF, 0x9F, 0x8B, 0x40, 0xFF, 0xD7, 0xB6, 0x53, 0xFF, 0xC8, 0xAA, - 0x4E, 0xFF, 0xBC, 0xA0, 0x49, 0xFF, 0xAD, 0x95, 0x44, 0xFF, 0xA2, 0x8D, - 0x41, 0xFF, 0xC6, 0xB9, 0x59, 0xFF, 0xD0, 0xCA, 0x64, 0xFF, 0xDD, 0xCC, - 0x62, 0xFF, 0xF3, 0xCD, 0x5E, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF3, 0xCC, 0x5D, 0xFF, 0xF5, 0xCD, - 0x5D, 0xFF, 0xF3, 0xCD, 0x5D, 0xFF, 0xF0, 0xCC, 0x5D, 0xFF, 0xEF, 0xCC, - 0x5E, 0xFF, 0xF2, 0xCE, 0x5E, 0xFF, 0xF3, 0xCD, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF4, 0xCD, 0x5E, 0xFF, 0xEF, 0xCA, 0x5C, 0xFF, 0xDD, 0xBC, - 0x56, 0xFF, 0xEF, 0xCA, 0x5C, 0xFF, 0xF4, 0xCE, 0x5E, 0xFF, 0xF5, 0xCE, - 0x5E, 0xFF, 0xF5, 0xCE, 0x5E, 0xFF, 0xF5, 0xCF, 0x5E, 0xFF, 0xF6, 0xCF, - 0x5E, 0xFF, 0xF4, 0xCD, 0x5D, 0xFF, 0xF4, 0xCC, 0x5D, 0xFF, 0xF3, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF3, 0xCD, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFF, 0xF2, 0xCC, 0x5C, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, 0x5D, 0xFF, 0xF2, 0xCC, - 0x5D, 0xFF, 0xF3, 0xCF, 0x68, 0xFD, 0xF2, 0xCC, 0x5C, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, 0x5D, 0xFD, 0xF2, 0xCC, - 0x5D, 0xFD, 0xF3, 0xCF, 0x68, 0x56, 0xF2, 0xCC, 0x5C, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, 0x5D, 0x56, 0xF2, 0xCC, - 0x5D, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, - 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x5C, 0x72, 0xA8, 0x66, 0x00, - 0x00, 0x48, 0xE7, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0xED, 0xBD, 0x77, - 0x90, 0x1C, 0x57, 0x9E, 0xE7, 0xF7, 0x79, 0x2F, 0x33, 0xCB, 0xDB, 0xF6, - 0xDE, 0xC0, 0x7B, 0x80, 0x20, 0x41, 0xCF, 0xE1, 0x70, 0x1C, 0x67, 0x66, - 0xC7, 0xEC, 0xCE, 0xAC, 0xB9, 0xD9, 0xDD, 0xBB, 0xDD, 0xF3, 0xB1, 0x71, - 0xA1, 0x93, 0x4E, 0x11, 0xA7, 0x08, 0x49, 0x17, 0xA1, 0x0B, 0x29, 0xF4, - 0xB7, 0x14, 0xD2, 0xC5, 0x9D, 0x42, 0x17, 0x0A, 0x49, 0x77, 0xAB, 0xDD, - 0xDB, 0xDD, 0x1B, 0x77, 0x73, 0xE3, 0x38, 0x1C, 0x0E, 0xBD, 0x77, 0x20, - 0x08, 0x6F, 0x1A, 0x68, 0xEF, 0xBB, 0xAA, 0xCB, 0xA7, 0x7B, 0xFA, 0x23, - 0xAB, 0xAB, 0xBB, 0x81, 0xEE, 0x86, 0x21, 0x40, 0x80, 0xA8, 0xF7, 0x89, - 0x20, 0x09, 0x36, 0xB2, 0xB3, 0xB2, 0x32, 0xF3, 0xF7, 0x7D, 0xEF, 0xFD, - 0xDE, 0xCF, 0x80, 0x46, 0xA3, 0xD1, 0x68, 0x34, 0x1A, 0x8D, 0x46, 0xA3, - 0xD1, 0x68, 0x34, 0x1A, 0x8D, 0x46, 0xA3, 0xD1, 0x68, 0x34, 0x1A, 0x8D, - 0x46, 0xA3, 0xD1, 0x68, 0x34, 0x1A, 0x8D, 0x46, 0xA3, 0xD1, 0x68, 0x34, - 0x1A, 0x8D, 0x46, 0xA3, 0xD1, 0x68, 0x34, 0x1A, 0x8D, 0x46, 0xA3, 0xD1, - 0x68, 0x34, 0x1A, 0x8D, 0x46, 0xA3, 0xD1, 0x68, 0x34, 0x1A, 0x8D, 0x46, - 0xA3, 0xD1, 0x68, 0x34, 0x1A, 0x8D, 0x46, 0xA3, 0xD1, 0x68, 0x34, 0x1A, - 0x8D, 0x46, 0xA3, 0xD1, 0x68, 0x34, 0x1A, 0x8D, 0x46, 0xA3, 0xD1, 0x68, - 0x34, 0x1A, 0x8D, 0x46, 0xA3, 0xB9, 0xED, 0x88, 0xBF, 0x1C, 0xAB, 0xAA, - 0xE7, 0x66, 0x6D, 0x5C, 0x75, 0xB7, 0x2F, 0x45, 0xA3, 0xD1, 0x7C, 0xDA, - 0xC8, 0xBB, 0x7D, 0x01, 0x1A, 0x8D, 0xE6, 0xEE, 0xA1, 0x05, 0x40, 0xA3, - 0x69, 0x62, 0xB4, 0x00, 0x68, 0x34, 0x4D, 0x8C, 0x16, 0x00, 0x8D, 0xA6, - 0x89, 0xD1, 0x02, 0xA0, 0xD1, 0x34, 0x31, 0x5A, 0x00, 0x34, 0x9A, 0x26, - 0x46, 0x0B, 0x80, 0x46, 0xD3, 0xC4, 0x68, 0x01, 0xD0, 0x68, 0x9A, 0x18, - 0x2D, 0x00, 0x1A, 0x4D, 0x13, 0xA3, 0x05, 0x40, 0xA3, 0x69, 0x62, 0xB4, - 0x00, 0x68, 0x34, 0x4D, 0x8C, 0x16, 0x00, 0x8D, 0xA6, 0x89, 0xD1, 0x02, - 0xA0, 0xD1, 0x34, 0x31, 0x5A, 0x00, 0x34, 0x9A, 0x26, 0x46, 0x0B, 0x80, - 0x46, 0xD3, 0xC4, 0x68, 0x01, 0xD0, 0x68, 0x9A, 0x18, 0x2D, 0x00, 0x1A, - 0x4D, 0x13, 0xA3, 0x05, 0x40, 0xA3, 0x69, 0x62, 0xB4, 0x00, 0x68, 0x34, - 0x4D, 0x8C, 0x16, 0x00, 0x8D, 0xA6, 0x89, 0xD1, 0x02, 0xA0, 0xD1, 0x34, - 0x31, 0x5A, 0x00, 0x34, 0x9A, 0x26, 0x46, 0x0B, 0x80, 0x46, 0xD3, 0xC4, - 0x68, 0x01, 0xD0, 0x68, 0x9A, 0x18, 0x2D, 0x00, 0x1A, 0x4D, 0x13, 0xA3, - 0x05, 0x40, 0xA3, 0x69, 0x62, 0xB4, 0x00, 0x68, 0x34, 0x4D, 0x8C, 0x16, - 0x00, 0x8D, 0xA6, 0x89, 0xD1, 0x02, 0xA0, 0xD1, 0x34, 0x31, 0x5A, 0x00, - 0x34, 0x9A, 0x26, 0x46, 0x0B, 0x80, 0x46, 0xD3, 0xC4, 0x68, 0x01, 0xD0, - 0x68, 0x9A, 0x18, 0x2D, 0x00, 0x1A, 0x4D, 0x13, 0xA3, 0x05, 0x40, 0xA3, - 0x69, 0x62, 0xB4, 0x00, 0x68, 0x34, 0x4D, 0x8C, 0x16, 0x00, 0x8D, 0xA6, - 0x89, 0xD1, 0x02, 0xA0, 0xD1, 0x34, 0x31, 0x5A, 0x00, 0x34, 0x9A, 0x26, - 0x46, 0x0B, 0x80, 0x46, 0xD3, 0xC4, 0x68, 0x01, 0xD0, 0x68, 0x9A, 0x18, - 0x2D, 0x00, 0x1A, 0x4D, 0x13, 0xA3, 0x05, 0x40, 0xA3, 0x69, 0x62, 0xB4, - 0x00, 0x68, 0x34, 0x4D, 0x8C, 0x16, 0x00, 0x8D, 0xA6, 0x89, 0xD1, 0x02, - 0xA0, 0xD1, 0x34, 0x31, 0x5A, 0x00, 0x34, 0x9A, 0x26, 0x46, 0x0B, 0x80, - 0x46, 0xD3, 0xC4, 0x68, 0x01, 0xD0, 0x68, 0x9A, 0x18, 0x2D, 0x00, 0x1A, - 0x4D, 0x13, 0xA3, 0x05, 0x40, 0xA3, 0x69, 0x62, 0xB4, 0x00, 0x68, 0x34, - 0x4D, 0x8C, 0x16, 0x00, 0x8D, 0xA6, 0x89, 0x31, 0xEF, 0xF6, 0x05, 0x68, - 0x34, 0x9F, 0x1A, 0x42, 0x20, 0x84, 0x04, 0x21, 0x00, 0x50, 0xBE, 0x07, - 0x4A, 0xDD, 0xED, 0xAB, 0xBA, 0xAB, 0x68, 0x01, 0xD0, 0xDC, 0x25, 0x04, - 0xF0, 0xE9, 0x19, 0x9F, 0x30, 0x4C, 0xDC, 0xD2, 0x32, 0x85, 0xB1, 0xB3, - 0x38, 0xA5, 0x22, 0x08, 0x41, 0x66, 0xFB, 0x41, 0x42, 0xC9, 0x2C, 0x4A, - 0xF9, 0x77, 0xFB, 0x66, 0xDC, 0x35, 0xB4, 0x00, 0x68, 0x6E, 0x23, 0x02, - 0x90, 0x28, 0x24, 0x2B, 0x06, 0x2E, 0xF0, 0x59, 0x31, 0x74, 0x85, 0xA8, - 0xFF, 0x5C, 0x20, 0x55, 0x11, 0x5F, 0x24, 0xEA, 0xFF, 0x0F, 0xE0, 0x21, - 0xF0, 0x6E, 0xFF, 0x15, 0x49, 0x89, 0xF2, 0x3C, 0x66, 0xDF, 0x7B, 0x81, - 0xA9, 0xD7, 0xFF, 0x33, 0xC5, 0x89, 0x8B, 0xB8, 0x76, 0x0D, 0x81, 0x20, - 0xD1, 0xB7, 0x8D, 0xA1, 0xAF, 0xFD, 0x29, 0xD9, 0x9D, 0x47, 0x1A, 0xB3, - 0x82, 0x66, 0x43, 0x0B, 0x80, 0xE6, 0x36, 0x21, 0xC1, 0x2F, 0x11, 0x75, - 0xDF, 0x25, 0xEA, 0x9D, 0x40, 0xA8, 0x0A, 0xAE, 0xEC, 0xA0, 0x66, 0x1C, - 0xC4, 0x11, 0xED, 0x48, 0xAA, 0x58, 0x6A, 0x12, 0xD3, 0x9F, 0xC3, 0xF4, - 0xC6, 0x90, 0xAA, 0x8C, 0x12, 0x61, 0x00, 0x94, 0xB0, 0xA8, 0x9A, 0x0F, - 0x52, 0x0E, 0x3D, 0xF1, 0x09, 0xA7, 0xE4, 0x02, 0x21, 0x44, 0x60, 0xCC, - 0x42, 0x20, 0xA4, 0xC1, 0xF2, 0xE5, 0x53, 0x8C, 0xBD, 0xF0, 0xD7, 0xCC, - 0x1D, 0x7F, 0x85, 0xE2, 0xF8, 0x05, 0x94, 0xE7, 0x36, 0x8C, 0x7D, 0xF9, - 0xCA, 0x69, 0x6A, 0xB9, 0x79, 0x0E, 0xFC, 0xC3, 0xFF, 0x91, 0x44, 0xF7, - 0xB6, 0xA6, 0x14, 0x01, 0x2D, 0x00, 0x9A, 0x9B, 0x60, 0x65, 0x04, 0x57, - 0xAC, 0x9F, 0xBE, 0x4B, 0x0C, 0x7F, 0x96, 0x78, 0xED, 0x39, 0xE2, 0xCE, - 0x2B, 0x98, 0x6A, 0x0A, 0x81, 0x8B, 0x4F, 0x9C, 0xA8, 0x7C, 0x07, 0x5F, - 0xC4, 0x11, 0xB8, 0x48, 0x55, 0x40, 0xAA, 0x22, 0x52, 0x2D, 0x23, 0xAE, - 0xFA, 0x7D, 0xCB, 0xBD, 0x40, 0x71, 0xD9, 0xC0, 0xEC, 0x78, 0x02, 0xFF, - 0x56, 0xD6, 0xE6, 0x42, 0xE0, 0x55, 0xCB, 0x54, 0x17, 0xA6, 0x29, 0xCD, - 0x8C, 0x52, 0x9E, 0x19, 0xA5, 0x38, 0x7E, 0x9E, 0xC2, 0xD8, 0x39, 0x96, - 0x47, 0x4E, 0xE2, 0x56, 0xCB, 0x08, 0x69, 0x20, 0x8C, 0xF5, 0xAF, 0xFC, - 0xD2, 0xD9, 0xF7, 0xB8, 0xF4, 0xE3, 0x7F, 0xCB, 0xC1, 0x7F, 0xFC, 0x3F, - 0x23, 0x84, 0x71, 0x1B, 0x6E, 0x91, 0x40, 0x20, 0x50, 0xA8, 0xC0, 0xDF, - 0xB0, 0xF6, 0xE7, 0x2B, 0x02, 0xB3, 0x56, 0x68, 0x94, 0xC2, 0x77, 0x5D, - 0x3E, 0xCD, 0xE5, 0xD0, 0x5A, 0xB4, 0x00, 0x68, 0x6E, 0x80, 0xE0, 0x85, - 0x15, 0x7E, 0x01, 0xD3, 0x9F, 0x01, 0x61, 0xE1, 0x1A, 0xDD, 0x28, 0x11, - 0x01, 0x14, 0xF8, 0x65, 0x62, 0xB5, 0x5F, 0x93, 0x74, 0x7E, 0x81, 0x54, - 0x79, 0x82, 0x65, 0x80, 0x85, 0xA0, 0x86, 0xE5, 0x5F, 0xA9, 0x9B, 0xC3, - 0xCA, 0x79, 0x04, 0x60, 0xAC, 0x7B, 0xDD, 0x95, 0xAF, 0x98, 0x3D, 0x7D, - 0x8A, 0xF7, 0x7E, 0xFE, 0x3F, 0x90, 0xD8, 0xFE, 0x14, 0x83, 0xCF, 0xFE, - 0x1D, 0xE2, 0x5D, 0x83, 0x37, 0xB7, 0x36, 0x57, 0x8A, 0xD1, 0xE7, 0xFF, - 0x82, 0xA9, 0xD7, 0x7F, 0x86, 0x53, 0x2E, 0xE2, 0x96, 0x0B, 0xD8, 0x85, - 0x25, 0x7C, 0xD7, 0x46, 0x08, 0x89, 0x90, 0x1B, 0x1B, 0xB7, 0xF2, 0x7D, - 0xE6, 0x3E, 0x7C, 0x99, 0xA5, 0x33, 0xEF, 0xD1, 0xB2, 0xF7, 0xD8, 0xC6, - 0xB3, 0x80, 0xFA, 0xCF, 0x04, 0x62, 0xFD, 0xDF, 0xAF, 0xFC, 0xBC, 0x61, - 0xD8, 0x92, 0xCA, 0xFC, 0x04, 0x4E, 0x31, 0x8F, 0x90, 0x92, 0xE2, 0xD4, - 0x65, 0xDC, 0x72, 0x09, 0x84, 0xA0, 0x3C, 0x39, 0x82, 0x67, 0x57, 0x01, - 0x28, 0x4D, 0x8F, 0xA0, 0x5C, 0x07, 0x84, 0x20, 0xD6, 0xDE, 0xC7, 0xCE, - 0x3F, 0xF8, 0x67, 0x58, 0xB1, 0xE4, 0x35, 0xF7, 0x9B, 0x35, 0x32, 0x59, - 0x77, 0x5B, 0x72, 0xAD, 0xF8, 0x7E, 0x32, 0xB4, 0x00, 0x68, 0xEA, 0xAC, - 0xBE, 0xD8, 0x2B, 0xD3, 0x68, 0xE5, 0x07, 0x06, 0x68, 0xF8, 0xF3, 0xC4, - 0xEC, 0x57, 0x88, 0xB8, 0xEF, 0x05, 0xA3, 0xB8, 0x14, 0x2C, 0x2D, 0x0F, - 0x30, 0x57, 0x3A, 0x86, 0x91, 0xDE, 0x49, 0x36, 0x76, 0x9A, 0x84, 0xFF, - 0x4A, 0xC3, 0xF8, 0xD7, 0x9F, 0x53, 0x5C, 0xF7, 0x75, 0x5D, 0x9C, 0xAC, - 0xF2, 0xF6, 0x0F, 0xC6, 0x98, 0xBE, 0x50, 0xC0, 0x3C, 0x7F, 0x89, 0xE2, - 0xC4, 0x05, 0xF6, 0xFC, 0xF1, 0x7F, 0x47, 0x72, 0x60, 0xD7, 0x0D, 0xCD, - 0x04, 0x84, 0x94, 0x14, 0x27, 0x2E, 0x31, 0xF7, 0xC1, 0xCB, 0x2C, 0x9E, - 0x79, 0x37, 0x18, 0xE5, 0xEB, 0x1E, 0xFF, 0xCD, 0x0C, 0x7F, 0x2D, 0x76, - 0x61, 0x89, 0x8B, 0x3F, 0xFE, 0x3F, 0x48, 0x6F, 0x3F, 0x88, 0x19, 0x8D, - 0x07, 0xD7, 0x5D, 0x1F, 0xB1, 0x7D, 0xA7, 0x46, 0x75, 0x61, 0x06, 0xB7, - 0x5A, 0xC2, 0xAD, 0x14, 0x29, 0xCF, 0x4D, 0xE0, 0x3B, 0x2E, 0x6E, 0x79, - 0x99, 0xEA, 0xC2, 0x0C, 0xCA, 0xF3, 0xB0, 0x8B, 0x8B, 0xD8, 0xF9, 0x39, - 0x94, 0xEF, 0xE3, 0x56, 0xCB, 0x81, 0xE8, 0x20, 0x70, 0xCA, 0x45, 0x7C, - 0xCF, 0x41, 0x00, 0x4E, 0xB9, 0x88, 0xF2, 0x3C, 0x40, 0xE1, 0x56, 0x0A, - 0x28, 0xE5, 0x23, 0x10, 0x84, 0x53, 0x59, 0x7A, 0x8F, 0xEE, 0xA0, 0x65, - 0xEF, 0x63, 0x20, 0x25, 0x02, 0x07, 0xCB, 0x9F, 0x41, 0xE0, 0x61, 0xA8, - 0x45, 0x0C, 0x7F, 0x09, 0x00, 0x25, 0x42, 0x38, 0xB2, 0x07, 0xDB, 0xD8, - 0x81, 0x6B, 0xF4, 0xD5, 0xEF, 0xF3, 0x27, 0x77, 0x5E, 0x6A, 0x01, 0xB8, - 0xCF, 0x11, 0xB2, 0xEE, 0x90, 0x53, 0x6A, 0x93, 0x11, 0x35, 0x98, 0xD2, - 0x4B, 0x77, 0x12, 0x49, 0x0D, 0xB7, 0x66, 0x33, 0x7D, 0xE2, 0x63, 0x6A, - 0xF3, 0x63, 0x6C, 0xFB, 0xD2, 0x97, 0x88, 0x8A, 0x8B, 0x44, 0x9D, 0xD7, - 0xB1, 0xFC, 0xC9, 0x60, 0xEA, 0x2E, 0x14, 0x6E, 0xD9, 0x63, 0xF2, 0xB5, - 0xF7, 0x38, 0xF9, 0xC6, 0x7F, 0x44, 0x58, 0x49, 0xB6, 0x1F, 0x31, 0x49, - 0x3E, 0x69, 0x62, 0xA5, 0xE4, 0x8D, 0xCF, 0xDC, 0x05, 0x28, 0x4F, 0x71, - 0xE1, 0xED, 0x45, 0x8E, 0xFF, 0x72, 0x86, 0xF9, 0xB1, 0x32, 0x42, 0x48, - 0xBC, 0x6A, 0x99, 0xD9, 0x0F, 0x5E, 0xC4, 0x8C, 0x25, 0x39, 0xF0, 0x0F, - 0xFE, 0x27, 0xAC, 0x78, 0x7A, 0xD3, 0x13, 0x08, 0x55, 0xAE, 0xFF, 0x31, - 0x45, 0x69, 0x6A, 0x84, 0xEA, 0xD2, 0x2C, 0xC2, 0x30, 0xD7, 0x1B, 0xBD, - 0x5A, 0xFF, 0x99, 0x1B, 0xA1, 0x7C, 0x8F, 0x85, 0x53, 0x6F, 0xF3, 0xC1, - 0xFF, 0xF6, 0x5F, 0xD1, 0xB2, 0xF7, 0x61, 0xEC, 0xFC, 0x02, 0xD5, 0xC5, - 0x19, 0xAA, 0x0B, 0x53, 0x28, 0xE5, 0xE3, 0xDB, 0x55, 0x7C, 0xCF, 0x43, - 0x79, 0x0E, 0x5E, 0xAD, 0x82, 0xF2, 0x15, 0xBE, 0xEB, 0xE0, 0xDB, 0x55, - 0x94, 0x52, 0xF8, 0xAE, 0x8D, 0xEF, 0xD4, 0xEA, 0x62, 0x25, 0xD6, 0x7C, - 0xCE, 0xEA, 0x9F, 0xC5, 0x5A, 0x81, 0x95, 0x06, 0x82, 0xE0, 0x1A, 0x95, - 0x57, 0x26, 0x51, 0xFE, 0x11, 0xAD, 0xD5, 0x37, 0x11, 0x42, 0x20, 0xF0, - 0x11, 0x54, 0x11, 0x4A, 0x21, 0xB0, 0x11, 0xCA, 0x0E, 0x8E, 0x13, 0x12, - 0x25, 0xA2, 0xF8, 0xC4, 0x71, 0x8C, 0x21, 0x4A, 0xD6, 0x33, 0x54, 0xCD, - 0xFD, 0x20, 0xC2, 0x7C, 0x12, 0x21, 0xD0, 0x02, 0x70, 0xDF, 0x22, 0x70, - 0x4A, 0x39, 0xAE, 0xFC, 0xF2, 0x2F, 0x59, 0x3C, 0xF3, 0x36, 0x3D, 0x8F, - 0xFF, 0x16, 0xDD, 0x8F, 0x7D, 0x1D, 0x23, 0x1C, 0x63, 0xD5, 0x2A, 0x7C, - 0x22, 0xCE, 0x07, 0xC4, 0x6B, 0xBF, 0xC6, 0x54, 0x13, 0x08, 0xE1, 0x53, - 0x5E, 0xAA, 0xF1, 0xE1, 0xF3, 0xA7, 0xC0, 0xAD, 0xF2, 0xC8, 0xD3, 0x67, - 0x91, 0xAA, 0x54, 0x1F, 0xD9, 0x83, 0x73, 0x82, 0x60, 0xEC, 0xD4, 0x32, - 0x67, 0x5E, 0x1E, 0xA7, 0x38, 0x57, 0x41, 0x29, 0xC5, 0x8C, 0x95, 0x61, - 0x78, 0xEF, 0x00, 0xF1, 0x4C, 0x02, 0xE5, 0xDD, 0x98, 0x02, 0xCC, 0x5F, - 0x2E, 0x73, 0xE2, 0xD7, 0x73, 0x8C, 0x9F, 0xCA, 0x53, 0x58, 0xB0, 0x57, - 0x67, 0xD6, 0x42, 0xA0, 0x5C, 0x87, 0xD9, 0xF7, 0x7E, 0xCD, 0x48, 0xD7, - 0x10, 0xBB, 0xFF, 0xF0, 0x9F, 0xD7, 0x47, 0xCE, 0x6B, 0xBF, 0x9F, 0xE1, - 0x2F, 0x04, 0xDF, 0x42, 0x66, 0xA8, 0xCC, 0x4F, 0x63, 0x2F, 0xE7, 0x82, - 0x6B, 0x54, 0x81, 0x2D, 0x26, 0x5A, 0x4C, 0x22, 0x09, 0xA3, 0x31, 0x45, - 0x77, 0x6D, 0x9F, 0xFC, 0x9C, 0x8D, 0xEF, 0x5D, 0x3B, 0xD3, 0xF7, 0x1D, - 0x9B, 0xB9, 0x0F, 0x5E, 0x22, 0x77, 0xEE, 0x43, 0x7C, 0xC7, 0xC6, 0x73, - 0x6A, 0xF8, 0x76, 0xED, 0x2A, 0xD1, 0xD8, 0xD8, 0xA0, 0x57, 0x1C, 0x8E, - 0xB7, 0x42, 0x2C, 0x2D, 0xE9, 0xEC, 0x2F, 0x13, 0x56, 0x97, 0xD7, 0x88, - 0xD5, 0xB5, 0x4A, 0x25, 0x14, 0xA0, 0x4A, 0x18, 0xCC, 0x62, 0xFA, 0x93, - 0x84, 0xBC, 0xD3, 0xB8, 0xB2, 0x8F, 0x42, 0xE8, 0xEB, 0x54, 0xAD, 0x87, - 0x6E, 0xF9, 0x2D, 0xD1, 0x02, 0x70, 0x9F, 0xE2, 0x7B, 0x0E, 0x17, 0x7F, - 0xF0, 0x6F, 0x18, 0x7F, 0xF9, 0x87, 0xD8, 0x85, 0x25, 0x0A, 0xA3, 0x67, - 0x50, 0x9E, 0x47, 0xCF, 0x53, 0xDF, 0xC2, 0x08, 0x45, 0x30, 0xBC, 0x39, - 0x52, 0xF6, 0x0F, 0x88, 0xB8, 0xEF, 0x63, 0xF8, 0x0B, 0x08, 0x1C, 0x04, - 0x02, 0x4F, 0x3A, 0xA4, 0x52, 0x05, 0x72, 0x33, 0x15, 0x42, 0x4C, 0xE2, - 0x2B, 0x58, 0xFB, 0x42, 0x8E, 0x9D, 0x5C, 0xE6, 0xFD, 0x9F, 0x4D, 0x50, - 0x58, 0xB4, 0x91, 0x46, 0xF0, 0xD2, 0xCF, 0x5E, 0x29, 0x31, 0x7E, 0x7A, - 0x99, 0x6C, 0x4F, 0x14, 0x33, 0x2C, 0xB7, 0x5C, 0xA2, 0x4E, 0x5F, 0x28, - 0xF2, 0xD1, 0xAF, 0x66, 0x58, 0x18, 0xAD, 0x50, 0x58, 0xB4, 0xF1, 0x6C, - 0xFF, 0xDA, 0x65, 0xB7, 0x10, 0x38, 0xC5, 0x3C, 0x53, 0x6F, 0xFC, 0x94, - 0xD6, 0x83, 0x8F, 0xD3, 0xB6, 0xFF, 0xF1, 0x6B, 0x66, 0x2F, 0x0A, 0x81, - 0xA9, 0x66, 0x01, 0xA8, 0xB1, 0x33, 0x18, 0x91, 0x5D, 0x97, 0xB6, 0xFE, - 0x28, 0x03, 0x07, 0x13, 0xF4, 0xEE, 0x4D, 0x10, 0xCF, 0x58, 0x08, 0x29, - 0x1A, 0xE7, 0x57, 0xBE, 0xC2, 0xB1, 0x15, 0xD3, 0xE7, 0x8B, 0x4C, 0x9E, - 0x2D, 0x33, 0x79, 0xAE, 0x44, 0xAD, 0xBC, 0x7A, 0x5E, 0xE5, 0xFB, 0xD8, - 0xCB, 0x8B, 0x8D, 0x6B, 0x10, 0xC6, 0x6D, 0x70, 0x0A, 0x6E, 0x42, 0x28, - 0x2A, 0xE9, 0xD9, 0x15, 0x67, 0xFF, 0xE7, 0xB3, 0x44, 0xE2, 0x1B, 0x9B, - 0xA1, 0x52, 0x50, 0x59, 0x76, 0x28, 0x2D, 0xDA, 0x08, 0x43, 0x10, 0x4B, - 0x5B, 0xC4, 0x33, 0x16, 0x28, 0x17, 0xD3, 0x9F, 0xC1, 0xF4, 0xE7, 0x90, - 0x7E, 0x1E, 0x84, 0x45, 0xC5, 0x7C, 0x10, 0x81, 0x7B, 0xD3, 0xD7, 0xA1, - 0x05, 0xE0, 0x3E, 0x44, 0x48, 0x83, 0xC9, 0x17, 0x7F, 0xC8, 0xD4, 0x5B, - 0xBF, 0x08, 0x5E, 0x68, 0x21, 0xA8, 0x2D, 0xCD, 0x71, 0xF1, 0xC7, 0xFF, - 0x86, 0xEC, 0xEE, 0x23, 0xB4, 0x75, 0x16, 0x48, 0xD5, 0x7E, 0x40, 0xC8, - 0xBB, 0x84, 0xA0, 0x42, 0x63, 0xFF, 0x5E, 0x80, 0x10, 0x12, 0x33, 0x6C, - 0x12, 0xAC, 0xDD, 0x25, 0x2B, 0xD6, 0x2C, 0xA4, 0x60, 0x71, 0xBC, 0xCC, - 0xC9, 0x17, 0x67, 0x58, 0x9C, 0x28, 0xAF, 0xFB, 0x3C, 0xDF, 0xF5, 0xB9, - 0xF0, 0xD6, 0x3C, 0x1D, 0xC3, 0x71, 0xFA, 0xF7, 0xA7, 0xF1, 0x37, 0x98, - 0x05, 0x38, 0x55, 0x9F, 0x77, 0xFF, 0xD3, 0x14, 0x23, 0xEF, 0x2F, 0x51, - 0x58, 0xA8, 0xE1, 0xB9, 0x2A, 0x30, 0xCC, 0xCD, 0x76, 0xDE, 0x04, 0x14, - 0x27, 0x2F, 0x71, 0xE5, 0x17, 0xFF, 0x8E, 0xD4, 0xC0, 0x5E, 0xAC, 0x64, - 0xE6, 0x2A, 0x7F, 0x80, 0x41, 0xC8, 0xBB, 0x08, 0x40, 0xD5, 0x7F, 0x8A, - 0x8E, 0x21, 0x97, 0xFE, 0xBF, 0xDF, 0x4A, 0x6B, 0xA7, 0x24, 0x92, 0x30, - 0xB1, 0xA2, 0x06, 0xD2, 0x60, 0x43, 0x31, 0xCA, 0x74, 0x86, 0xD8, 0xF6, - 0x60, 0x86, 0xC2, 0x82, 0xCD, 0xB9, 0x37, 0x96, 0xB9, 0xF8, 0x5E, 0x0E, - 0xBB, 0xEC, 0xD5, 0x67, 0xF0, 0x37, 0xB1, 0x15, 0x28, 0xAE, 0x0A, 0x67, - 0x52, 0x5B, 0x1F, 0x17, 0x49, 0x1A, 0x74, 0x0C, 0x46, 0xE9, 0xD9, 0x1D, - 0xA3, 0x6F, 0x5F, 0x92, 0x48, 0xA2, 0x3E, 0x43, 0xD9, 0x20, 0x20, 0xDF, - 0xA9, 0xF9, 0x5C, 0x78, 0x7B, 0x91, 0x13, 0xBF, 0x9A, 0xC1, 0xAE, 0x78, - 0x20, 0xC0, 0xB0, 0x24, 0xAD, 0xBD, 0x51, 0x76, 0x3E, 0xDA, 0x4A, 0xDF, - 0xBE, 0x14, 0x56, 0x44, 0x11, 0xF2, 0x2E, 0x12, 0xB5, 0x5F, 0xC5, 0x91, - 0x7D, 0x78, 0xB2, 0xB5, 0x7E, 0x11, 0x37, 0xFE, 0x1D, 0xB4, 0x00, 0xDC, - 0x6F, 0x08, 0x81, 0x5D, 0x58, 0x64, 0xEA, 0xCD, 0x9F, 0x51, 0x99, 0x9B, - 0x58, 0x7D, 0xA1, 0x85, 0xA0, 0x32, 0x3F, 0x49, 0xF5, 0xFD, 0x7F, 0x49, - 0xEA, 0x89, 0x30, 0x61, 0x73, 0x99, 0x60, 0xED, 0x78, 0xFD, 0x97, 0x45, - 0x29, 0x98, 0x3C, 0x9D, 0xE7, 0xED, 0x1F, 0x8D, 0x5F, 0x63, 0xFC, 0x10, - 0x88, 0x43, 0x7E, 0xAE, 0xCA, 0xC7, 0xBF, 0x9E, 0x21, 0x9A, 0xB4, 0x68, - 0xED, 0x8F, 0xA1, 0xFC, 0x55, 0x6B, 0x58, 0x9E, 0xAB, 0xF1, 0xD6, 0xF7, - 0xC7, 0x19, 0x3D, 0xB1, 0x1C, 0xBC, 0xCC, 0xAC, 0xB1, 0x33, 0x41, 0x7D, - 0xED, 0x5B, 0xF7, 0x6F, 0xFB, 0xAB, 0x7E, 0x6F, 0xE5, 0x3A, 0x2C, 0x9C, - 0x7A, 0x8B, 0x89, 0x57, 0x7E, 0xC4, 0xF0, 0x6F, 0xFD, 0x3D, 0x94, 0x5A, - 0xBF, 0x14, 0x10, 0xCA, 0x41, 0xF8, 0x39, 0xAC, 0xDA, 0x47, 0xF4, 0xF5, - 0x4E, 0x10, 0xEB, 0xB2, 0x90, 0x66, 0xFD, 0x95, 0x56, 0xB0, 0xD9, 0x26, - 0x82, 0x19, 0x92, 0x98, 0x61, 0x49, 0x34, 0x65, 0x92, 0xEE, 0x08, 0xB3, - 0xFB, 0xB1, 0x14, 0x67, 0x5E, 0xCB, 0x73, 0xE9, 0x83, 0x1C, 0x76, 0xD9, - 0xDF, 0xD4, 0x8F, 0xB1, 0x72, 0xCD, 0x66, 0x58, 0x90, 0xED, 0x0A, 0xD3, - 0x36, 0x10, 0x27, 0xDB, 0x1B, 0x45, 0xF9, 0x8A, 0xA5, 0x89, 0x0A, 0xCB, - 0xF3, 0x35, 0x6A, 0x65, 0x97, 0xF2, 0xB2, 0x47, 0x24, 0x6E, 0x10, 0x8A, - 0x48, 0x62, 0x69, 0x49, 0x4B, 0x4F, 0x94, 0x6C, 0x4F, 0x98, 0x96, 0xDE, - 0x28, 0xE1, 0x98, 0x81, 0x19, 0x96, 0x58, 0x61, 0x89, 0x10, 0x9B, 0xFB, - 0x38, 0x4D, 0x4B, 0x92, 0x68, 0x09, 0x51, 0x2B, 0xFB, 0x14, 0x16, 0xEC, - 0xD5, 0x7B, 0x39, 0x5B, 0x63, 0xF2, 0x6C, 0x81, 0x44, 0x4B, 0x98, 0xEE, - 0x9D, 0x09, 0x92, 0xED, 0x16, 0x66, 0xE4, 0x47, 0x74, 0xED, 0x7D, 0x87, - 0x64, 0x67, 0x3B, 0x15, 0xE3, 0x20, 0xA5, 0xD0, 0x33, 0xB8, 0x46, 0x2F, - 0x37, 0x92, 0xEA, 0xA3, 0x05, 0xE0, 0x9E, 0x41, 0xA1, 0x94, 0xBA, 0x76, - 0xAB, 0xE9, 0x26, 0x11, 0x42, 0x32, 0xFA, 0xFC, 0xDF, 0x90, 0xBB, 0x70, - 0x3C, 0xD8, 0x8B, 0x5E, 0x63, 0xE0, 0xCA, 0x57, 0x9C, 0x7F, 0xF1, 0x23, - 0x76, 0x1D, 0x1A, 0x24, 0x9C, 0x0D, 0x6D, 0x79, 0x1E, 0xCF, 0x51, 0x94, - 0x73, 0x0E, 0x66, 0x48, 0x70, 0xE5, 0x78, 0x8E, 0x0F, 0x7E, 0x31, 0xC9, - 0xF2, 0x5C, 0xB5, 0xF1, 0xC2, 0x9A, 0xA6, 0x24, 0x92, 0xB0, 0x70, 0x5D, - 0x8F, 0x6A, 0x31, 0x98, 0x7A, 0x8E, 0x9F, 0xCE, 0x93, 0x6A, 0x0B, 0x71, - 0xF8, 0xD9, 0x6E, 0xE2, 0xD9, 0x10, 0x4A, 0x05, 0x23, 0xD9, 0xEB, 0x7F, - 0x35, 0xC6, 0xE8, 0x47, 0x79, 0x3C, 0x57, 0xAD, 0xB9, 0x4E, 0x90, 0xA6, - 0xA4, 0x6B, 0x7B, 0x92, 0x9D, 0x8F, 0x65, 0x69, 0x1F, 0x8C, 0x91, 0x9B, - 0xAE, 0xF1, 0xD2, 0xFF, 0x73, 0x19, 0xBB, 0xEA, 0x35, 0x0E, 0xAA, 0x2D, - 0xCE, 0x30, 0xF9, 0xFA, 0x7F, 0xA6, 0xFD, 0xC8, 0xD3, 0xC4, 0x7B, 0x86, - 0x1B, 0x8E, 0x36, 0xE9, 0xCF, 0x23, 0xFD, 0x39, 0xA4, 0xAA, 0x12, 0xAF, - 0xBD, 0x40, 0x8C, 0xB3, 0xC1, 0x92, 0xE4, 0x46, 0x9D, 0x90, 0x2A, 0xB8, - 0x86, 0x48, 0xC2, 0x20, 0x1C, 0x8F, 0x91, 0xEE, 0x0C, 0xB3, 0xE7, 0x89, - 0x0C, 0x67, 0x5E, 0xCB, 0x31, 0x7A, 0x32, 0x4F, 0x65, 0x79, 0xBD, 0x7A, - 0x58, 0x11, 0x49, 0xD7, 0xF6, 0x38, 0xFD, 0x07, 0x92, 0x74, 0x0C, 0x86, - 0x48, 0xB4, 0x86, 0x90, 0x86, 0xC4, 0x30, 0x83, 0xFB, 0xEB, 0xB9, 0x49, - 0x7C, 0x4F, 0xA1, 0xFC, 0xE0, 0x3E, 0xAF, 0x2C, 0x3D, 0x84, 0x04, 0xC3, - 0x0C, 0x8E, 0x93, 0xE6, 0xFA, 0x29, 0xC3, 0x56, 0x0E, 0x53, 0x21, 0xA1, - 0x7B, 0x57, 0x82, 0xA7, 0xFF, 0x64, 0x80, 0xF7, 0xFF, 0xF3, 0x24, 0x53, - 0xE7, 0x4B, 0x00, 0xF8, 0x9E, 0xA2, 0xB2, 0xEC, 0x52, 0x29, 0xBA, 0x2C, - 0x4D, 0x55, 0x90, 0x86, 0xC0, 0xF7, 0x15, 0x0F, 0x7C, 0x35, 0xCF, 0xE1, - 0x67, 0xBB, 0x49, 0x46, 0xC7, 0x88, 0x78, 0xA7, 0xC8, 0x45, 0xFE, 0x36, - 0x35, 0x73, 0x1F, 0xD7, 0x13, 0x78, 0x2D, 0x00, 0xF7, 0x00, 0xCA, 0xF7, - 0xA8, 0xE5, 0xE6, 0x29, 0x4E, 0x5C, 0xC2, 0x08, 0x85, 0x49, 0x0F, 0xEF, - 0x47, 0x98, 0x56, 0xDD, 0x83, 0x7F, 0xC3, 0x67, 0x01, 0x05, 0xD3, 0xEF, - 0xFC, 0x8A, 0xC9, 0x57, 0x7F, 0x84, 0x53, 0x58, 0x42, 0x08, 0x89, 0x34, - 0x82, 0x17, 0xD1, 0xF7, 0x14, 0x4A, 0x41, 0x7E, 0xDA, 0xE6, 0x95, 0xBF, - 0x98, 0xE2, 0x89, 0xBF, 0xD5, 0x4D, 0xB2, 0x25, 0xB4, 0xE9, 0xFB, 0x51, - 0x58, 0xA8, 0xF1, 0xDA, 0x5F, 0x5E, 0xC6, 0x0C, 0x1B, 0x5C, 0x39, 0xB1, - 0x84, 0x5B, 0xF3, 0x1A, 0x2F, 0x6C, 0x38, 0x66, 0xB2, 0xFF, 0xF3, 0x9D, - 0xEC, 0x7B, 0xBA, 0x83, 0x99, 0x8B, 0x45, 0x3E, 0xF8, 0xF9, 0x24, 0xF3, - 0xA3, 0x25, 0x94, 0x52, 0x9C, 0x7E, 0x6D, 0x8E, 0x58, 0x26, 0xC4, 0xBE, - 0xA7, 0x3B, 0x08, 0xC7, 0x4C, 0x3E, 0xF8, 0xD9, 0x0C, 0x93, 0x67, 0x8A, - 0x0D, 0xE3, 0x17, 0x52, 0x60, 0x18, 0x82, 0x8E, 0x6D, 0x49, 0x0E, 0x3C, - 0xD3, 0x46, 0xCF, 0x9E, 0x24, 0xA1, 0xA8, 0x81, 0x63, 0x7B, 0x9C, 0x7A, - 0x69, 0x0E, 0xC7, 0xBE, 0x76, 0xD8, 0xCE, 0x5F, 0x3C, 0xCE, 0xE5, 0x9F, - 0xFF, 0xDF, 0xEC, 0xFD, 0xDB, 0xFF, 0x3D, 0xD2, 0x0A, 0x03, 0x12, 0x53, - 0x2D, 0x60, 0xB1, 0x48, 0x65, 0xF2, 0x38, 0x52, 0x5A, 0x18, 0xED, 0x1E, - 0x4A, 0xDD, 0x9A, 0x70, 0x0A, 0x01, 0xE1, 0xB8, 0x41, 0xFB, 0x70, 0x94, - 0x4C, 0x77, 0x98, 0xA3, 0xDF, 0x68, 0xA3, 0xB8, 0xE0, 0x50, 0x29, 0x04, - 0xD7, 0x6C, 0x85, 0x05, 0xE9, 0x0E, 0x93, 0x50, 0xCC, 0xC0, 0xB4, 0x24, - 0xD2, 0x14, 0xC1, 0xB4, 0x7D, 0x8D, 0x01, 0x9B, 0xA1, 0x35, 0xFE, 0x82, - 0xAD, 0xD2, 0x1C, 0x6E, 0x62, 0x0B, 0xDF, 0xB4, 0x24, 0xFD, 0xFB, 0x53, - 0xC4, 0x33, 0x16, 0xEF, 0xFF, 0x74, 0x8A, 0x8B, 0xEF, 0xE4, 0x60, 0x25, - 0xA6, 0x42, 0x05, 0x4E, 0x4D, 0x08, 0x84, 0xE4, 0xE3, 0x17, 0xE6, 0x48, - 0x75, 0x46, 0xD8, 0xF9, 0x88, 0x20, 0xA4, 0xCE, 0x91, 0xA9, 0xFE, 0xBF, - 0x2C, 0x46, 0xFF, 0x0C, 0xC7, 0xD8, 0xCE, 0x56, 0xBB, 0x04, 0x5A, 0x00, - 0xEE, 0x32, 0xCA, 0xF7, 0xC8, 0x5F, 0xFC, 0x88, 0x13, 0xFF, 0xF6, 0x5F, - 0x50, 0x9E, 0x99, 0x40, 0x08, 0x41, 0x72, 0x60, 0x27, 0x3B, 0x7F, 0xFF, - 0x9F, 0xD1, 0xBA, 0xF7, 0xD8, 0x35, 0x91, 0x6B, 0xD7, 0xE2, 0x21, 0xF0, - 0x71, 0x8A, 0x4B, 0x8C, 0xFD, 0xE6, 0xC7, 0x5C, 0x79, 0xFE, 0xAF, 0x28, - 0xCF, 0x8E, 0xD5, 0xF7, 0xB1, 0x61, 0xCF, 0x93, 0xAD, 0x74, 0x0C, 0x87, - 0xF8, 0xF8, 0x85, 0x45, 0x16, 0xC6, 0xAB, 0xF8, 0x3E, 0x4C, 0x9C, 0x29, - 0x73, 0xE9, 0xFD, 0x12, 0x07, 0x3E, 0x6F, 0x61, 0x58, 0x6B, 0xB6, 0xA7, - 0x08, 0x5E, 0xAA, 0x85, 0xF1, 0x12, 0x4E, 0xCD, 0x63, 0xF4, 0x64, 0x0E, - 0x04, 0xF8, 0x6B, 0x46, 0xEE, 0x70, 0xDC, 0x64, 0xFF, 0xD3, 0x9D, 0x1C, - 0xFA, 0x52, 0x17, 0x56, 0x44, 0x32, 0x70, 0x28, 0x43, 0x24, 0x61, 0xF0, - 0xEE, 0x4F, 0x26, 0x98, 0x3A, 0x5F, 0xC0, 0x73, 0x15, 0x67, 0x5E, 0x9D, - 0xA3, 0x7B, 0x67, 0x92, 0xB6, 0xA1, 0x04, 0x66, 0x08, 0x62, 0x69, 0x13, - 0xA5, 0x14, 0x56, 0x58, 0xD2, 0xBD, 0x2B, 0xC1, 0xB6, 0x07, 0x5B, 0xE8, - 0xD9, 0x93, 0x24, 0x1C, 0x33, 0x90, 0x86, 0xC0, 0x73, 0x15, 0x13, 0xA7, - 0x0A, 0x9C, 0x7B, 0x7D, 0x61, 0xDD, 0xD2, 0x21, 0xB8, 0x28, 0x81, 0x5B, - 0x2D, 0x31, 0xFB, 0xDE, 0x6F, 0xC8, 0xEE, 0x7E, 0x88, 0xDE, 0x27, 0xBF, - 0x8D, 0xAF, 0x04, 0xA6, 0x3F, 0x8D, 0xE9, 0x4E, 0x90, 0x6E, 0x53, 0x80, - 0x73, 0xCB, 0xC6, 0x7F, 0xD5, 0x47, 0x11, 0x8A, 0x4A, 0x42, 0x51, 0x49, - 0x3C, 0x6D, 0xA1, 0x56, 0x14, 0x4F, 0x08, 0xAE, 0xD1, 0xE2, 0xAD, 0x0C, - 0xF9, 0x36, 0x06, 0xF5, 0x09, 0x29, 0x68, 0xE9, 0x8B, 0xF1, 0xC4, 0xF7, - 0x06, 0xE8, 0xDE, 0x99, 0xE2, 0xE3, 0x17, 0xE6, 0xC8, 0xCD, 0x54, 0xD6, - 0xDD, 0x27, 0x21, 0xA0, 0x9C, 0x77, 0xB8, 0xF0, 0xD6, 0x22, 0xED, 0x03, - 0x31, 0x5A, 0xFA, 0xA2, 0x84, 0xBC, 0xF3, 0xC4, 0x9C, 0xD7, 0x28, 0xC8, - 0x36, 0x7C, 0x91, 0xDA, 0xF4, 0xA2, 0x8C, 0xDF, 0xFD, 0xAF, 0xFF, 0xC5, - 0xBF, 0xBC, 0x58, 0xF2, 0x6E, 0x43, 0x48, 0x81, 0xE6, 0x56, 0x70, 0x0A, - 0x39, 0x8E, 0xFF, 0xEB, 0xFF, 0x86, 0xFC, 0xC5, 0x93, 0x78, 0x76, 0x05, - 0xCF, 0xAE, 0x52, 0x9D, 0x9F, 0x66, 0xE1, 0xE4, 0x9B, 0x48, 0xC3, 0x24, - 0xB5, 0xED, 0x00, 0x42, 0x1A, 0x81, 0x17, 0xDC, 0x77, 0xEA, 0x2F, 0xA2, - 0x0A, 0x02, 0x45, 0xFC, 0x3C, 0x11, 0xE7, 0x04, 0x19, 0xFB, 0x6F, 0x28, - 0x9F, 0xF8, 0xBF, 0x38, 0xFF, 0xCB, 0xE7, 0xC9, 0x4F, 0xCC, 0x35, 0x42, - 0x6F, 0x76, 0x1C, 0xCB, 0x70, 0xF4, 0xEB, 0x6D, 0x74, 0xEF, 0x8C, 0xD1, - 0xDA, 0x1B, 0x63, 0xE2, 0x4C, 0x09, 0xBB, 0xE2, 0x05, 0xC6, 0x18, 0x52, - 0x0C, 0x1D, 0x4E, 0x35, 0xA6, 0xB0, 0x10, 0xBC, 0x48, 0xB5, 0xB2, 0xC7, - 0xC5, 0x77, 0x17, 0x29, 0xE7, 0x1D, 0xD4, 0x55, 0xEB, 0xE8, 0x58, 0xDA, - 0xE2, 0xC0, 0x33, 0x5D, 0x1C, 0xFC, 0x42, 0x57, 0xE0, 0xED, 0xAF, 0xFF, - 0x4E, 0xA2, 0x25, 0x4C, 0xBA, 0x3D, 0x4C, 0x25, 0xEF, 0xE2, 0x54, 0x3D, - 0x86, 0x8F, 0x64, 0xE9, 0x3F, 0x90, 0x26, 0x1C, 0x33, 0x68, 0x1F, 0x8A, - 0xB3, 0xE7, 0x89, 0x36, 0x0E, 0x7D, 0xB9, 0x83, 0x03, 0x5F, 0xE8, 0x64, - 0xF8, 0xC1, 0x2C, 0x2D, 0xBD, 0x51, 0x42, 0x11, 0x03, 0x21, 0x45, 0x30, - 0x2B, 0x99, 0xA9, 0xF1, 0xF2, 0x9F, 0x5F, 0xA1, 0x94, 0x73, 0xD6, 0xDD, - 0x9B, 0x55, 0xF7, 0x45, 0xE0, 0xD7, 0x70, 0x0A, 0x4B, 0xA4, 0x86, 0xF7, - 0x13, 0xC9, 0x76, 0x11, 0x71, 0x3E, 0x24, 0xE6, 0xBE, 0x16, 0xF8, 0x0F, - 0xEE, 0x40, 0x0C, 0x7F, 0x30, 0x7D, 0x17, 0xEB, 0x76, 0x11, 0xEE, 0x16, - 0x42, 0x80, 0x15, 0x31, 0x68, 0x1B, 0x8C, 0xD1, 0xBB, 0x37, 0x85, 0xE7, - 0x2A, 0x0A, 0x73, 0x35, 0xFC, 0x20, 0xAE, 0xA8, 0x71, 0x8F, 0x72, 0xD3, - 0x35, 0xD2, 0x9D, 0x11, 0xDA, 0x06, 0xE2, 0x18, 0x12, 0xA4, 0x2A, 0x53, - 0x35, 0x0F, 0xE3, 0xCB, 0xEC, 0xA6, 0xE7, 0xD6, 0x33, 0x80, 0xBB, 0x88, - 0xEF, 0x3A, 0x4C, 0xBD, 0xF1, 0x33, 0xF2, 0x97, 0x4E, 0x06, 0xB9, 0xE9, - 0x75, 0x94, 0xF2, 0xA9, 0xCC, 0x8D, 0x73, 0xFE, 0x87, 0xFF, 0x06, 0xB7, - 0x5A, 0x61, 0xF0, 0xD9, 0x3F, 0xA6, 0x3A, 0x7F, 0x05, 0x51, 0xF8, 0x88, - 0x8E, 0xDD, 0xFD, 0xF8, 0xCA, 0x24, 0xE2, 0x9D, 0x23, 0xEA, 0xBE, 0x8D, - 0xE1, 0xCF, 0x63, 0x98, 0x3E, 0xE5, 0xF9, 0x59, 0x2A, 0xB9, 0x22, 0x81, - 0x2F, 0x01, 0x32, 0x9D, 0x16, 0x07, 0xBE, 0x90, 0x25, 0xDD, 0x61, 0xA1, - 0x14, 0x74, 0x6E, 0x8B, 0xD0, 0xBB, 0x27, 0xC6, 0xF9, 0xB7, 0x1D, 0x7C, - 0x57, 0xE1, 0x54, 0xD5, 0xEA, 0x08, 0x77, 0x15, 0x1B, 0xBD, 0xEF, 0xE9, - 0xCE, 0x28, 0x47, 0xBE, 0xD2, 0xCD, 0x8E, 0x47, 0x5A, 0x36, 0x34, 0xB8, - 0x8E, 0xE1, 0x04, 0x5F, 0xFC, 0x87, 0xDB, 0x51, 0xBE, 0x42, 0x1A, 0x02, - 0x69, 0x06, 0x41, 0x41, 0xA6, 0x25, 0xC1, 0xDA, 0xFC, 0x1E, 0xD4, 0xCA, - 0x2E, 0xEF, 0xFF, 0x6C, 0x92, 0xFC, 0x4C, 0xAD, 0xF1, 0x33, 0x69, 0x08, - 0x22, 0x09, 0x93, 0x70, 0xCC, 0xA0, 0xB4, 0xE4, 0xE0, 0xD4, 0x7C, 0x50, - 0x82, 0xC5, 0xD3, 0x6F, 0x73, 0xE9, 0x3F, 0xFD, 0x9F, 0xEC, 0xFD, 0x5B, - 0xFF, 0x98, 0x54, 0xE4, 0x22, 0x02, 0x07, 0xD5, 0x44, 0xAF, 0xB0, 0x34, - 0x04, 0xD9, 0x9E, 0x08, 0x4F, 0x7C, 0xAF, 0x9F, 0x1D, 0xC7, 0xB2, 0x1C, - 0xFF, 0xE5, 0x34, 0x13, 0x67, 0x0A, 0x78, 0x9E, 0xAA, 0x7B, 0x50, 0x15, - 0x17, 0xDF, 0x59, 0xA4, 0x67, 0x77, 0x82, 0x8E, 0xE1, 0x04, 0x96, 0x7F, - 0x19, 0xCB, 0x3D, 0x8B, 0x23, 0x7B, 0x40, 0x6C, 0xEC, 0xF3, 0x69, 0x9E, - 0xBB, 0x77, 0x0F, 0xE2, 0xD9, 0x15, 0xC6, 0x5F, 0xFC, 0x8F, 0xF8, 0x8E, - 0xBD, 0xE1, 0xDF, 0xD7, 0x72, 0x73, 0x9C, 0xFB, 0xEB, 0xFF, 0x85, 0x73, - 0xFF, 0xF1, 0x7F, 0x27, 0xD3, 0x19, 0xE6, 0xE1, 0xDF, 0xEE, 0xA2, 0xAD, - 0x96, 0xAA, 0x6F, 0xB3, 0xA9, 0x7A, 0xFA, 0xAC, 0x42, 0x79, 0x82, 0xA5, - 0x69, 0x9B, 0xF2, 0xB2, 0xD7, 0xD8, 0x5A, 0xDB, 0xF3, 0x64, 0x1B, 0x2D, - 0x3D, 0x91, 0xD5, 0x58, 0x72, 0x09, 0x7B, 0x9F, 0x6A, 0x63, 0xE2, 0x4C, - 0x99, 0xE2, 0xA2, 0x4D, 0x38, 0x26, 0x6F, 0x6C, 0xE4, 0x14, 0xD0, 0xDA, - 0x17, 0xE7, 0xC1, 0xDF, 0xEA, 0x65, 0xE0, 0x40, 0x7A, 0x53, 0x9F, 0x81, - 0x90, 0x02, 0x33, 0x74, 0x73, 0x43, 0xA5, 0x53, 0xF3, 0x39, 0xF7, 0xFA, - 0x22, 0x97, 0xDE, 0xCD, 0x35, 0xB6, 0x0E, 0xAD, 0x88, 0xC1, 0xD0, 0xE1, - 0x0C, 0x0F, 0x7E, 0xB3, 0x8B, 0x44, 0x4B, 0x88, 0x89, 0xD3, 0x45, 0xDE, - 0xFA, 0xFE, 0x38, 0x8B, 0x93, 0x15, 0x94, 0xEF, 0x31, 0xFE, 0xF2, 0x0F, - 0x29, 0x5E, 0x7A, 0x99, 0x87, 0xBF, 0xD3, 0x4D, 0xF6, 0xA8, 0x85, 0xBA, - 0xFD, 0x19, 0xC4, 0xF7, 0x34, 0x42, 0x80, 0x15, 0x96, 0xF4, 0xEE, 0x4B, - 0xD1, 0xD2, 0x17, 0xE5, 0xCC, 0x2B, 0x0B, 0x9C, 0x7A, 0x79, 0x8E, 0xE2, - 0x62, 0xF0, 0x0E, 0x4D, 0x9D, 0x2B, 0x32, 0x3F, 0x5A, 0xA1, 0x6D, 0x20, - 0x8E, 0x10, 0x10, 0x73, 0xDF, 0xA7, 0x66, 0x1D, 0xC5, 0x13, 0x1D, 0x6C, - 0xB4, 0x0C, 0xD0, 0x25, 0xC1, 0xEE, 0x12, 0x4A, 0x29, 0x4A, 0x93, 0x97, - 0x28, 0x8C, 0x5F, 0x5C, 0x1F, 0xE4, 0xB2, 0x36, 0xD7, 0x43, 0x05, 0x21, - 0xA7, 0x5E, 0xB5, 0x8C, 0xEF, 0xD4, 0x90, 0xC2, 0xAD, 0x07, 0xEC, 0x38, - 0xF5, 0xA0, 0x8F, 0xE0, 0xC0, 0xB1, 0x53, 0x25, 0xA6, 0xCE, 0x57, 0xF0, - 0xFD, 0xC0, 0x0B, 0xDD, 0xBF, 0x37, 0xC1, 0xE0, 0xA1, 0x38, 0xA1, 0xE8, - 0xFA, 0xA0, 0x9C, 0xF6, 0xC1, 0x10, 0xDB, 0x8E, 0x26, 0x48, 0xB5, 0x87, - 0x18, 0x3E, 0x9A, 0x5A, 0xB7, 0xFE, 0xDF, 0x08, 0x21, 0x05, 0x9D, 0xC3, - 0x09, 0x1E, 0xFB, 0x6E, 0x3F, 0x03, 0x07, 0xD3, 0x37, 0xB3, 0xBD, 0x7C, - 0x5D, 0x3C, 0xC7, 0x67, 0xF4, 0x78, 0x8E, 0x77, 0x7E, 0x34, 0xD1, 0x70, - 0x66, 0x99, 0x96, 0x64, 0xF8, 0x81, 0x2C, 0x4F, 0xFD, 0xF1, 0x00, 0xD9, - 0xEE, 0x28, 0x56, 0xC4, 0x60, 0xF0, 0x48, 0x9A, 0x47, 0x7F, 0xAF, 0x8F, - 0x78, 0xC6, 0xAA, 0x2F, 0x49, 0x3C, 0x6A, 0xB9, 0x25, 0x6A, 0xB9, 0xE5, - 0x3B, 0x32, 0xF5, 0xFF, 0xAC, 0x20, 0x44, 0xB0, 0x24, 0x3B, 0xFA, 0x8D, - 0x2E, 0xBE, 0xF0, 0xF7, 0x87, 0xE8, 0xD9, 0x95, 0x40, 0xC8, 0xE0, 0x7E, - 0x8C, 0x7D, 0x9C, 0xA7, 0x30, 0x5F, 0x0B, 0x44, 0xD9, 0x9F, 0x44, 0xAA, - 0xEA, 0xA6, 0xE7, 0xD1, 0x02, 0xF0, 0x89, 0x10, 0x9B, 0xFC, 0x73, 0x9D, - 0xE3, 0x95, 0x8F, 0x57, 0x5A, 0x60, 0xF2, 0xB5, 0x9F, 0xAD, 0x1B, 0xFD, - 0xCD, 0xB0, 0x24, 0xD9, 0x1E, 0x22, 0x9E, 0xB5, 0x30, 0xAC, 0xD5, 0x47, - 0xA3, 0x08, 0x3C, 0xD1, 0xD1, 0xE4, 0xFA, 0x58, 0x7B, 0x21, 0x61, 0x61, - 0xAC, 0xC2, 0x87, 0xBF, 0x9C, 0x61, 0x6E, 0xA4, 0x84, 0x10, 0x82, 0x70, - 0x42, 0xB2, 0xF7, 0xA9, 0x2C, 0xD9, 0xEE, 0xF0, 0x35, 0xDB, 0x4C, 0x42, - 0x0A, 0x1E, 0xFE, 0x4E, 0x17, 0x5F, 0xFD, 0x27, 0xFD, 0x0C, 0x1F, 0x49, - 0x23, 0x8D, 0x8D, 0xAF, 0x55, 0xD5, 0x8F, 0xED, 0xDD, 0x95, 0xE2, 0x73, - 0x7F, 0x34, 0x4C, 0xD7, 0xCE, 0xE4, 0x86, 0xC7, 0x21, 0xC0, 0x73, 0x15, - 0xB5, 0xB2, 0x17, 0x8C, 0xE0, 0x37, 0x68, 0x8F, 0x9E, 0xAB, 0x18, 0x3F, - 0x5D, 0xE0, 0xF5, 0xBF, 0x1E, 0x6F, 0x6C, 0xF9, 0x09, 0x29, 0xE8, 0x18, - 0x8E, 0xF1, 0xC8, 0x77, 0x7B, 0x09, 0xC7, 0x8D, 0xC6, 0xB9, 0xA4, 0x84, - 0xAE, 0x1D, 0x09, 0xF6, 0x3C, 0xD5, 0x5E, 0x5F, 0x8B, 0x07, 0x4B, 0x9C, - 0x66, 0x2F, 0xE5, 0xB5, 0x96, 0xDE, 0x3D, 0x49, 0x9E, 0xF8, 0xC3, 0x01, - 0x06, 0x0F, 0xA5, 0x31, 0x4C, 0xC1, 0xE4, 0xD9, 0x22, 0xCB, 0x73, 0x36, - 0x28, 0xB0, 0xFC, 0x31, 0x0C, 0x35, 0xC7, 0x66, 0x3B, 0x01, 0x7A, 0x09, - 0x70, 0x53, 0xAC, 0xBC, 0xE1, 0x2A, 0x08, 0x42, 0xA1, 0x86, 0x50, 0x35, - 0x56, 0x6F, 0xAE, 0x81, 0x12, 0x61, 0x14, 0x16, 0x4A, 0x84, 0x58, 0xA7, - 0xAF, 0xAA, 0x86, 0xC4, 0x46, 0xA8, 0x0A, 0x86, 0x3B, 0x41, 0xF1, 0xE4, - 0x4F, 0x98, 0x78, 0xF1, 0x2F, 0xF0, 0xDD, 0x40, 0x00, 0xAC, 0x88, 0xC1, - 0x9E, 0xC7, 0xB3, 0x3C, 0xF4, 0xED, 0x6E, 0x8A, 0x0B, 0x36, 0x1F, 0xFC, - 0x62, 0x96, 0xCB, 0x1F, 0xE6, 0x70, 0xED, 0x60, 0x7D, 0x67, 0x45, 0x24, - 0xB1, 0x8C, 0xB9, 0xFA, 0xE2, 0x8B, 0x60, 0xAF, 0xFE, 0xC2, 0x3B, 0x79, - 0x26, 0x4E, 0x97, 0xEB, 0x19, 0x7C, 0xB0, 0xFB, 0xD1, 0x0C, 0x5D, 0x3B, - 0x62, 0x9B, 0x06, 0x99, 0x48, 0x29, 0xC8, 0x74, 0x45, 0xB6, 0xFE, 0x9A, - 0x4A, 0x11, 0x4D, 0x5A, 0xEC, 0x78, 0xB8, 0x8D, 0x4C, 0x77, 0x64, 0xC3, - 0xF3, 0x08, 0x01, 0xAE, 0xE3, 0x73, 0xE5, 0xC3, 0x1C, 0x93, 0xE7, 0x8A, - 0xF4, 0xEF, 0x4F, 0xD1, 0xB7, 0x2F, 0x85, 0x19, 0xDA, 0x3A, 0x21, 0xC8, - 0xA9, 0xFA, 0x4C, 0x9E, 0x5D, 0xE6, 0x95, 0x3F, 0x1F, 0xA5, 0xB8, 0x64, - 0x37, 0x66, 0x28, 0x89, 0xAC, 0xC5, 0xB1, 0xDF, 0xE9, 0x25, 0x91, 0xB5, - 0xAE, 0xBE, 0x14, 0xA2, 0x49, 0x93, 0xC1, 0x43, 0x69, 0x46, 0xDE, 0xCF, - 0x31, 0x3F, 0x5A, 0xDA, 0x3A, 0x82, 0xB0, 0x09, 0x51, 0x0A, 0xDA, 0xFA, - 0xA3, 0x3C, 0xFC, 0x9D, 0x5E, 0x94, 0x82, 0x2B, 0xC7, 0x73, 0x8C, 0x7D, - 0x9C, 0xA7, 0x7D, 0x30, 0x4A, 0x24, 0x61, 0x10, 0x72, 0xCF, 0x62, 0x1B, - 0xBB, 0xEB, 0x15, 0x98, 0xD6, 0x3F, 0x1C, 0x2D, 0x00, 0x37, 0x44, 0xBD, - 0xBC, 0x95, 0x2A, 0x63, 0xA8, 0x22, 0xD2, 0xCF, 0x63, 0xFA, 0x63, 0x84, - 0xBC, 0x4B, 0x58, 0xFE, 0x28, 0xD2, 0xAF, 0x07, 0x69, 0xC8, 0x14, 0x8E, - 0x31, 0x88, 0x2D, 0x7A, 0x71, 0x8D, 0x3E, 0x94, 0x88, 0xB2, 0x72, 0xC3, - 0x4D, 0x77, 0x94, 0x90, 0x3F, 0x42, 0xD8, 0x3B, 0x43, 0xC8, 0xBB, 0x40, - 0xAC, 0xAD, 0x4C, 0xAA, 0x55, 0x32, 0x5F, 0x0C, 0x46, 0xBF, 0x9E, 0xDD, - 0x09, 0x8E, 0xFD, 0x4E, 0x37, 0xE1, 0x98, 0x41, 0x34, 0x19, 0xE5, 0xF1, - 0x3F, 0xE8, 0xC6, 0x30, 0x7D, 0xCE, 0xBD, 0x91, 0x47, 0x08, 0x48, 0xB6, - 0x5A, 0xA4, 0x3B, 0xC2, 0xAB, 0xFB, 0xE9, 0x42, 0x50, 0x98, 0xAF, 0xB1, - 0x34, 0x55, 0xC3, 0xF7, 0x82, 0xB0, 0xDA, 0xCE, 0xE1, 0x18, 0x3B, 0x1E, - 0xCE, 0x10, 0xCF, 0x58, 0xF8, 0xFE, 0x6D, 0x18, 0x21, 0x37, 0x5B, 0xEF, - 0x0B, 0x70, 0x1D, 0xC5, 0xB9, 0x37, 0x16, 0x78, 0xEF, 0x27, 0x13, 0xE4, - 0xA7, 0x2B, 0x5C, 0x78, 0x7B, 0x8E, 0xC7, 0x7E, 0x7F, 0x90, 0x5D, 0x8F, - 0xB6, 0x22, 0x0C, 0xB1, 0xE1, 0xAE, 0x93, 0xE7, 0x2A, 0x4E, 0xBF, 0x3C, - 0xCF, 0x87, 0xBF, 0x98, 0xA2, 0x94, 0x77, 0x1A, 0xC7, 0x58, 0x11, 0xC9, - 0xCE, 0x47, 0x5B, 0xE8, 0xDE, 0x99, 0xD8, 0xF0, 0x33, 0x95, 0x52, 0xA4, - 0x3A, 0xC2, 0xF4, 0xEF, 0x4F, 0x31, 0x7F, 0xA5, 0x84, 0x19, 0x12, 0x58, - 0x91, 0xEB, 0xA7, 0x19, 0x37, 0x13, 0x4A, 0x41, 0xDB, 0x40, 0x94, 0x47, - 0xBE, 0xDB, 0x87, 0x53, 0xF5, 0x38, 0xF7, 0xFA, 0x02, 0x5D, 0x3B, 0x12, - 0x0C, 0x1E, 0x4E, 0x61, 0x85, 0x16, 0x36, 0xCD, 0x13, 0xD0, 0x02, 0xB0, - 0x21, 0x6B, 0xB6, 0xC6, 0x54, 0x0D, 0xA9, 0x96, 0x31, 0xFC, 0x39, 0x42, - 0xEE, 0x29, 0x62, 0xEE, 0xBB, 0x84, 0xBC, 0xCB, 0xF5, 0x18, 0xFA, 0xF5, - 0xC7, 0xE2, 0x43, 0xC4, 0x7D, 0xFF, 0x86, 0xCE, 0x1D, 0x4D, 0x99, 0x44, - 0x62, 0x41, 0x85, 0xDA, 0x50, 0x44, 0xB2, 0xFF, 0xE9, 0x56, 0x42, 0xD1, - 0x7A, 0x8A, 0xA8, 0x0A, 0xB6, 0xD6, 0x1E, 0xFC, 0x46, 0x0F, 0x95, 0xBC, - 0x87, 0x63, 0xFB, 0x0C, 0x1D, 0x49, 0xAE, 0xDB, 0x92, 0x13, 0x02, 0x2A, - 0x05, 0x9F, 0x4A, 0x21, 0xF8, 0x61, 0x3C, 0x6B, 0x71, 0xF8, 0xD9, 0x56, - 0x3A, 0xB7, 0x45, 0x6F, 0x8B, 0xF1, 0x2B, 0xA5, 0xF0, 0x9C, 0x6B, 0xCF, - 0x23, 0xEA, 0xD3, 0xFE, 0x0B, 0x6F, 0x07, 0xC6, 0xBF, 0x3C, 0x13, 0x44, - 0xA3, 0x95, 0x97, 0x6C, 0x3E, 0xFA, 0xE5, 0x14, 0xB1, 0xB4, 0x45, 0xFF, - 0xBE, 0x8D, 0xFD, 0x05, 0xB5, 0x92, 0xC7, 0xC5, 0x77, 0x16, 0x29, 0xE5, - 0x9C, 0xC6, 0x2C, 0xC1, 0x30, 0x05, 0x7D, 0xFB, 0x92, 0x1C, 0xF9, 0x5A, - 0x77, 0x63, 0x0D, 0x7B, 0xED, 0xB5, 0x40, 0x3C, 0x63, 0x31, 0x70, 0x28, - 0xC5, 0x85, 0x77, 0x16, 0x88, 0x67, 0x2D, 0x52, 0xED, 0x91, 0xDB, 0x91, - 0x0E, 0x7F, 0x5F, 0xA1, 0x7C, 0x68, 0x1F, 0x8C, 0xB2, 0xF7, 0xA9, 0x56, - 0xDE, 0xFA, 0xC1, 0x24, 0x6F, 0x7D, 0x7F, 0x1C, 0xBB, 0xD2, 0x45, 0xB2, - 0xEF, 0x5D, 0x6A, 0x7D, 0x5F, 0xC2, 0xC8, 0xA6, 0xAE, 0xF1, 0x9B, 0x68, - 0x01, 0xD8, 0x60, 0xDD, 0x2E, 0x54, 0x19, 0xA9, 0x8A, 0x18, 0x2A, 0x87, - 0xE5, 0x5E, 0x22, 0xEA, 0xBE, 0x47, 0xC4, 0x3D, 0x81, 0xA0, 0xC4, 0xF5, - 0xD7, 0xFA, 0x37, 0x3E, 0x37, 0x2D, 0xE6, 0x03, 0x55, 0x4E, 0xB6, 0x86, - 0xE8, 0xDA, 0x11, 0x5F, 0x5F, 0x29, 0xCA, 0x57, 0x64, 0xBA, 0xC2, 0x7C, - 0xE5, 0x9F, 0x6C, 0xA3, 0xB2, 0xEC, 0x90, 0xEE, 0x8C, 0x6C, 0x68, 0xD8, - 0xCA, 0x87, 0x78, 0xD6, 0xE4, 0xA1, 0x6F, 0xB6, 0x33, 0x70, 0x30, 0x79, - 0x7B, 0x46, 0x45, 0x11, 0x04, 0x04, 0x15, 0xE6, 0x6B, 0x5C, 0xBD, 0x96, - 0xF0, 0x7D, 0x18, 0x3F, 0xB9, 0xCC, 0xF1, 0x5F, 0x4C, 0x91, 0x9F, 0xAE, - 0x34, 0xFC, 0x08, 0x42, 0x0A, 0x66, 0x47, 0x8A, 0x7C, 0xFC, 0xFC, 0x34, - 0xF1, 0xB4, 0x45, 0x6B, 0x7F, 0xBC, 0xEE, 0xEE, 0x58, 0xFD, 0xDD, 0x58, - 0xDA, 0xE4, 0x91, 0xEF, 0xF6, 0xF1, 0xD6, 0x0F, 0xC6, 0xC9, 0xCF, 0x54, - 0x11, 0x86, 0xA0, 0xAD, 0x3F, 0xC6, 0xA3, 0xBF, 0xDB, 0x4F, 0x38, 0xBA, - 0x75, 0xE6, 0x9D, 0xF2, 0x15, 0xED, 0x83, 0x31, 0x1E, 0xF8, 0x5A, 0x17, - 0xBE, 0xA7, 0x68, 0xEB, 0x8F, 0xE1, 0x6B, 0x3F, 0xC0, 0x35, 0xF8, 0x9E, - 0x62, 0xE7, 0x63, 0x6D, 0xCC, 0x5C, 0x2A, 0x73, 0xFA, 0x95, 0x39, 0x9E, - 0xFF, 0xB7, 0x23, 0x08, 0x75, 0x89, 0xA1, 0xAF, 0x75, 0xB3, 0xFB, 0x7B, - 0xFF, 0x9C, 0x50, 0x6A, 0x25, 0x61, 0x28, 0xA0, 0xC9, 0x05, 0x40, 0x20, - 0x54, 0x09, 0x43, 0xE5, 0x11, 0xAA, 0x8A, 0xC0, 0x0F, 0x46, 0x7B, 0x77, - 0x8C, 0x88, 0x77, 0x9E, 0xB0, 0x77, 0x16, 0x53, 0x4D, 0xAF, 0xA9, 0x72, - 0x7B, 0xFB, 0x7C, 0xA6, 0xB5, 0x92, 0x47, 0x39, 0x67, 0x23, 0x8D, 0x20, - 0xE6, 0xDB, 0x8A, 0x5C, 0x7B, 0x6E, 0xA5, 0x82, 0x2D, 0x1F, 0xAB, 0x23, - 0x7C, 0x6D, 0x84, 0x9C, 0x02, 0x69, 0x0A, 0x5A, 0x7A, 0xC3, 0xEC, 0x79, - 0x32, 0xC5, 0xAE, 0x47, 0x33, 0xD7, 0x5D, 0x7F, 0xDF, 0xCC, 0x7D, 0x09, - 0x52, 0x67, 0xD7, 0x4F, 0x1B, 0x85, 0x14, 0x2C, 0x8E, 0x95, 0x39, 0xF1, - 0xFC, 0x34, 0x73, 0x23, 0xC5, 0x20, 0xB6, 0x7D, 0x0D, 0xD2, 0x08, 0xF2, - 0x06, 0x12, 0xAD, 0x61, 0xF6, 0x3C, 0xD5, 0x81, 0x34, 0x20, 0xD5, 0x1E, - 0xC6, 0x0A, 0xAF, 0x1A, 0x77, 0xCF, 0x9E, 0x04, 0x9F, 0xFF, 0xD3, 0x21, - 0xC6, 0x4F, 0xE5, 0x31, 0x2C, 0xC9, 0xD0, 0x91, 0x2C, 0xB1, 0xF4, 0xF5, - 0x5F, 0x43, 0xA5, 0x82, 0x28, 0xC4, 0x43, 0x5F, 0xE9, 0x0A, 0xFE, 0xDF, - 0x57, 0x77, 0xAB, 0x8C, 0xDE, 0x3D, 0x8F, 0x94, 0xB0, 0xFF, 0x99, 0x0E, - 0xE6, 0xC7, 0x2A, 0x4C, 0x9F, 0x2F, 0x00, 0x82, 0xF1, 0xDF, 0xFC, 0x0D, - 0x1D, 0x0F, 0x7D, 0x99, 0x8E, 0x23, 0x9F, 0x5B, 0x17, 0x5D, 0xDA, 0xC4, - 0x02, 0x10, 0x84, 0x93, 0x46, 0xEC, 0x57, 0x89, 0x7A, 0x27, 0x31, 0xFC, - 0x79, 0x04, 0x36, 0x96, 0x3F, 0x41, 0x90, 0x0A, 0xBB, 0x52, 0xCE, 0xEA, - 0xF6, 0xE7, 0x84, 0x2B, 0x05, 0x97, 0xDE, 0xCF, 0xE1, 0xB9, 0x41, 0xD0, - 0x4C, 0xEF, 0xDE, 0xC4, 0xD6, 0x5B, 0x5A, 0x6A, 0xA3, 0x73, 0x28, 0x92, - 0xAD, 0x16, 0xC7, 0xBE, 0xDD, 0x41, 0x3C, 0x6D, 0xAE, 0x14, 0xFD, 0xB9, - 0x7D, 0x17, 0x78, 0xF5, 0xDD, 0x12, 0x50, 0x2D, 0x38, 0x9C, 0x7D, 0x6D, - 0x8E, 0xD1, 0x8F, 0x96, 0x1A, 0xC6, 0xDF, 0xF0, 0xC8, 0xD7, 0x43, 0x8F, - 0x95, 0x52, 0x9C, 0xFC, 0xCD, 0x0C, 0x73, 0x97, 0x4B, 0xF8, 0x3E, 0x3C, - 0xFD, 0x27, 0x43, 0x74, 0x0C, 0x27, 0xD6, 0x09, 0x58, 0x4B, 0x6F, 0x84, - 0x96, 0xBE, 0x68, 0xE3, 0x7B, 0xDC, 0x8C, 0x21, 0xAB, 0xDB, 0xE1, 0xDB, - 0xB8, 0xCF, 0x59, 0xF1, 0x07, 0x6C, 0x3B, 0x9A, 0x25, 0x37, 0x55, 0xA1, - 0x52, 0x70, 0xF1, 0x9C, 0x1A, 0x13, 0x2F, 0xFF, 0x90, 0xEC, 0xCE, 0x23, - 0x84, 0xD2, 0xAD, 0x8D, 0x67, 0xDC, 0xA4, 0x02, 0x10, 0xEC, 0x8F, 0xA6, - 0xAA, 0x7F, 0x43, 0xDC, 0x79, 0x11, 0xF0, 0x58, 0x2D, 0xBB, 0x78, 0xE7, - 0x6F, 0x49, 0x69, 0xC9, 0xE6, 0xFC, 0x9B, 0x4B, 0x78, 0x8E, 0x22, 0x96, - 0x32, 0x69, 0x1B, 0x88, 0x6D, 0x98, 0x13, 0xBE, 0x15, 0x4A, 0x41, 0x34, - 0x55, 0x17, 0xA7, 0xDB, 0x64, 0x13, 0x8A, 0x60, 0x14, 0x0F, 0xC7, 0x2D, - 0xA0, 0x7A, 0xCD, 0xD4, 0xFF, 0xCA, 0x89, 0x1C, 0xA7, 0x5F, 0x9A, 0x6D, - 0x64, 0x9C, 0xAF, 0x8C, 0xCA, 0xD1, 0xA4, 0x49, 0xAD, 0xE4, 0x51, 0x2D, - 0x3A, 0xF5, 0x34, 0x5C, 0xC5, 0xF4, 0xF9, 0x65, 0xE2, 0xD9, 0xF0, 0xA6, - 0xD7, 0xAE, 0xB7, 0xF1, 0xEE, 0x2C, 0xCA, 0x57, 0x0C, 0x1F, 0x4D, 0x73, - 0xE1, 0xED, 0x79, 0x2A, 0x85, 0x60, 0x26, 0xB7, 0x78, 0xFA, 0xAD, 0x46, - 0x61, 0xD2, 0x15, 0x9A, 0x30, 0x0E, 0x40, 0x60, 0xF8, 0xF3, 0x75, 0xE3, - 0x7F, 0x89, 0xFA, 0x6B, 0xCF, 0xF5, 0xF7, 0xF0, 0x6F, 0x0F, 0xBE, 0xA7, - 0x38, 0xF9, 0x9B, 0x05, 0xE6, 0xC7, 0x82, 0x07, 0x91, 0xEE, 0x8C, 0x10, - 0x49, 0xDE, 0xE2, 0x2C, 0xE3, 0xF6, 0x16, 0x88, 0x05, 0x82, 0xD4, 0xD5, - 0x74, 0x67, 0x74, 0x8D, 0x10, 0x04, 0xA2, 0xB0, 0x3C, 0x5B, 0xE3, 0xC2, - 0x9B, 0x8B, 0x54, 0x0A, 0x4E, 0xBD, 0xEC, 0x7E, 0xB0, 0x7E, 0x3F, 0xFC, - 0x95, 0x6E, 0x1E, 0xFB, 0xFD, 0x41, 0x8E, 0x7C, 0xAD, 0x87, 0x8E, 0xE1, - 0x64, 0x30, 0x33, 0xA8, 0x17, 0xD6, 0x88, 0x65, 0xAD, 0x20, 0x14, 0x58, - 0xF3, 0xA9, 0xA3, 0x14, 0x64, 0xBA, 0x22, 0xF4, 0xEE, 0x4D, 0x05, 0xCE, - 0x65, 0x05, 0xD5, 0xC5, 0x69, 0x9C, 0x52, 0x7E, 0x9D, 0xF8, 0x36, 0xD9, - 0x0C, 0x20, 0x30, 0xFE, 0x64, 0xED, 0x47, 0xC4, 0x9C, 0x57, 0x58, 0xEB, - 0x46, 0x96, 0x86, 0xA8, 0x27, 0xA7, 0xA8, 0x75, 0xD9, 0x6F, 0xB7, 0x9B, - 0xF9, 0xB1, 0x1A, 0x67, 0xDF, 0x58, 0xC4, 0x73, 0x7C, 0xA4, 0x29, 0xC8, - 0x76, 0x47, 0xD6, 0xD7, 0x97, 0xBB, 0x9B, 0xD4, 0x87, 0x76, 0x29, 0xC1, - 0x0A, 0x1B, 0xB4, 0xF4, 0xC5, 0x00, 0x70, 0xAA, 0x1E, 0xA3, 0x27, 0x72, - 0x8C, 0x7D, 0x9C, 0x43, 0x1A, 0x81, 0x7F, 0xA0, 0x7D, 0x5B, 0x9C, 0x87, - 0xBF, 0x33, 0xC0, 0xC0, 0xC1, 0x20, 0xA0, 0x48, 0x29, 0x68, 0x1F, 0x8A, - 0xF3, 0xE6, 0xDF, 0x8C, 0x32, 0x37, 0x52, 0x04, 0xA5, 0x48, 0x64, 0xC3, - 0x98, 0x21, 0xA9, 0x47, 0xFB, 0xBB, 0x84, 0xF2, 0x15, 0x43, 0x47, 0xB2, - 0x5C, 0x7A, 0x37, 0x47, 0xAE, 0xE2, 0x21, 0x00, 0xDF, 0xAE, 0x36, 0x96, - 0x6C, 0xD0, 0x64, 0x02, 0x20, 0xFC, 0x12, 0x89, 0xDA, 0x4F, 0x49, 0xD8, - 0xBF, 0x40, 0xE0, 0xD0, 0x98, 0xF6, 0x2B, 0x98, 0xB9, 0x58, 0x64, 0xFE, - 0x4A, 0x89, 0x48, 0xC2, 0x64, 0xE0, 0x50, 0x76, 0xCB, 0x30, 0xD9, 0x95, - 0x0C, 0x31, 0xA5, 0x6E, 0x6E, 0x4D, 0xAA, 0x14, 0x9C, 0x7D, 0x6D, 0x89, - 0x5A, 0xB1, 0x1E, 0xFD, 0x86, 0xA0, 0x7D, 0xE8, 0xE6, 0xA7, 0xFF, 0xB7, - 0xF4, 0xDD, 0xAF, 0xAA, 0x8D, 0xB7, 0x99, 0x4D, 0x4A, 0x43, 0x10, 0x4F, - 0x5B, 0x44, 0x12, 0x16, 0x2D, 0xBD, 0xC1, 0x3A, 0x7D, 0x61, 0xBC, 0xC2, - 0x99, 0x57, 0x66, 0xF1, 0x9C, 0xA0, 0x26, 0x40, 0xAA, 0x2D, 0xCC, 0xA1, - 0xAF, 0x74, 0x33, 0x74, 0x24, 0x83, 0xEF, 0xA9, 0x46, 0x1C, 0x7F, 0xFF, - 0x81, 0x34, 0xCB, 0x73, 0x9D, 0xBC, 0xB3, 0x64, 0x93, 0x9F, 0xAD, 0xD0, - 0xDA, 0x17, 0x23, 0x14, 0x6B, 0xAA, 0x57, 0xEC, 0x9E, 0xC3, 0x0C, 0x89, - 0xC6, 0xFB, 0x65, 0xC5, 0x52, 0x84, 0x33, 0xED, 0x81, 0xC2, 0x37, 0x9F, - 0x0F, 0x40, 0x12, 0x71, 0xDE, 0x22, 0xEE, 0xFC, 0xA6, 0x1E, 0x14, 0xB1, - 0x6A, 0xFC, 0x0B, 0x63, 0x25, 0x5E, 0xFF, 0xAB, 0x51, 0xC6, 0x3E, 0x5E, - 0x22, 0xD5, 0x1E, 0xE1, 0x99, 0x88, 0x49, 0xFF, 0x81, 0xD4, 0x35, 0xD3, - 0x6B, 0x21, 0x83, 0xE8, 0xBB, 0xE2, 0x6C, 0x8D, 0x6A, 0xC9, 0x25, 0x96, - 0xB2, 0x48, 0xB4, 0x86, 0x6E, 0xBC, 0xCF, 0xA5, 0x0A, 0x0A, 0x68, 0xDA, - 0x35, 0x0F, 0x14, 0xB4, 0xF4, 0x5A, 0xF4, 0xEE, 0x8E, 0x21, 0xE5, 0x9D, - 0x9B, 0x01, 0x88, 0xFA, 0x8C, 0x3C, 0x37, 0x55, 0x21, 0x37, 0x5D, 0xC5, - 0x08, 0x49, 0x5A, 0xBA, 0xA3, 0xC4, 0xB3, 0xD6, 0x86, 0x22, 0x60, 0x98, - 0x82, 0xF6, 0xA1, 0x04, 0x4A, 0x40, 0xA6, 0x33, 0x82, 0x5D, 0xF1, 0x98, - 0xB9, 0x58, 0x60, 0xEE, 0x4A, 0x09, 0x44, 0x50, 0x0C, 0x64, 0xF7, 0x53, - 0x1D, 0x6C, 0x7B, 0xB0, 0x65, 0x83, 0x9D, 0x09, 0xC5, 0x8E, 0x87, 0x5B, - 0xC8, 0xCF, 0x04, 0xDE, 0xE7, 0xFE, 0xFD, 0x41, 0x4A, 0xB0, 0x9E, 0x00, - 0xDC, 0x3D, 0x8A, 0x8B, 0x36, 0xAE, 0x13, 0xCC, 0x74, 0x53, 0x43, 0xFB, - 0xEB, 0x05, 0x55, 0x56, 0x69, 0x1A, 0x01, 0x30, 0xFD, 0x29, 0x52, 0xCE, - 0x73, 0x18, 0x8D, 0x12, 0xD7, 0x01, 0x76, 0xC5, 0xE3, 0xF8, 0xCF, 0xA7, - 0x98, 0x3C, 0x93, 0xC7, 0x30, 0x25, 0x95, 0x65, 0x87, 0xD3, 0x2F, 0xCD, - 0xD0, 0xB7, 0x37, 0xB5, 0x6E, 0x64, 0x16, 0x52, 0x50, 0x2D, 0xBA, 0x5C, - 0x7A, 0x77, 0x91, 0xD1, 0x8F, 0x72, 0x54, 0x0A, 0x0E, 0xF1, 0x4C, 0x88, - 0x1D, 0x8F, 0xB4, 0xD2, 0x7F, 0x20, 0x7D, 0xDD, 0x6A, 0xB8, 0xC1, 0x49, - 0x60, 0xCF, 0xE3, 0x59, 0x32, 0xED, 0x41, 0xB1, 0x89, 0xE1, 0xA3, 0x29, - 0x92, 0x6D, 0xA1, 0x3B, 0xEA, 0x7A, 0xB0, 0xAB, 0x3E, 0x17, 0xDF, 0x59, - 0xE0, 0xCA, 0x87, 0x39, 0xE6, 0x46, 0x4B, 0x58, 0x61, 0x49, 0xC7, 0x70, - 0x82, 0x9D, 0x8F, 0xB6, 0xD1, 0xB7, 0x2F, 0x75, 0xCD, 0xF1, 0x52, 0x0A, - 0xDA, 0x06, 0x63, 0x41, 0xAD, 0x3B, 0x15, 0x78, 0xFE, 0xA7, 0xCF, 0x17, - 0xF0, 0x1C, 0x1F, 0xC3, 0x92, 0xF4, 0xEE, 0x4D, 0xB3, 0xFB, 0x89, 0x76, - 0x42, 0x11, 0xE3, 0x9A, 0xB8, 0x84, 0x15, 0xA7, 0xE0, 0xC1, 0x2F, 0x76, - 0xB2, 0xEB, 0xD1, 0x56, 0xD2, 0x9D, 0x91, 0x4F, 0xBB, 0x09, 0xB0, 0x66, - 0x0D, 0xC2, 0x10, 0x4C, 0x9C, 0x2E, 0x50, 0x2D, 0xBA, 0x08, 0x20, 0xB3, - 0xEB, 0x01, 0x8C, 0x50, 0x64, 0x7D, 0x25, 0xA3, 0xBB, 0x7D, 0x91, 0x9F, - 0xD2, 0xAD, 0x20, 0xEC, 0x9E, 0xC0, 0xF4, 0x27, 0x58, 0x5B, 0x08, 0xD3, - 0xF7, 0x15, 0x33, 0x17, 0x8A, 0x8C, 0x7C, 0xB0, 0xD4, 0x38, 0xD2, 0x73, - 0x7C, 0xE6, 0x2E, 0x17, 0xC9, 0xCF, 0x54, 0xC8, 0x74, 0x07, 0x53, 0x60, - 0x21, 0x05, 0x95, 0x65, 0x87, 0x53, 0x2F, 0xCE, 0x72, 0xE2, 0xF9, 0x69, - 0x0A, 0xF3, 0x55, 0x84, 0x14, 0xB8, 0xB6, 0x8F, 0x15, 0x96, 0xF4, 0xEC, - 0x49, 0x61, 0x85, 0x6F, 0xC0, 0xFE, 0x05, 0x1C, 0xFC, 0x52, 0x1B, 0xDB, - 0x8E, 0xA6, 0x82, 0xE8, 0xB6, 0x6C, 0xE8, 0x8E, 0x6F, 0x6B, 0x9D, 0x7F, - 0x73, 0x81, 0x77, 0x7E, 0x38, 0x46, 0x71, 0xB1, 0xD6, 0x58, 0x02, 0xCC, - 0x5F, 0x29, 0xB1, 0x30, 0x56, 0xE6, 0xC1, 0x6F, 0xF6, 0x32, 0x7C, 0xF4, - 0xAA, 0x62, 0x11, 0x22, 0x28, 0x9A, 0x69, 0x85, 0x01, 0xA5, 0x30, 0x23, - 0x06, 0xDD, 0xBB, 0xD3, 0xD8, 0x15, 0x9F, 0x50, 0xCC, 0x60, 0xEF, 0xE7, - 0xDA, 0x49, 0x77, 0x86, 0x37, 0x8D, 0x36, 0x54, 0xBE, 0x22, 0xD9, 0x16, - 0x26, 0xD9, 0x1E, 0xB9, 0xE9, 0x2D, 0x3E, 0xCD, 0x6D, 0x44, 0xC0, 0xF2, - 0xAC, 0xCD, 0xF4, 0x85, 0x22, 0x4E, 0xD5, 0xC7, 0x30, 0x4D, 0xDA, 0xF6, - 0x3F, 0x76, 0x55, 0x5F, 0x88, 0xA6, 0x11, 0x00, 0x08, 0xB9, 0xE7, 0xEB, - 0x89, 0x3B, 0xAB, 0xC3, 0xAD, 0xEF, 0x2A, 0xCE, 0xBF, 0x35, 0xDF, 0x98, - 0x22, 0x05, 0x37, 0x4E, 0xE0, 0xD4, 0x7C, 0xA6, 0xCE, 0x15, 0xC8, 0xF6, - 0x04, 0x02, 0xE0, 0xD6, 0x3C, 0x46, 0xDE, 0x5F, 0xE4, 0xF8, 0x2F, 0xA7, - 0x28, 0x2F, 0xDB, 0x41, 0xA6, 0x9E, 0x82, 0x48, 0xD2, 0x24, 0xD3, 0x1D, - 0xBD, 0xEE, 0x34, 0xB7, 0xE1, 0x33, 0xF0, 0x03, 0x07, 0x63, 0x2C, 0x1D, - 0x78, 0xD7, 0xEF, 0xA4, 0xF1, 0x0B, 0x29, 0x98, 0xBE, 0x50, 0xE4, 0xE3, - 0x17, 0x66, 0xEA, 0x01, 0x47, 0xEB, 0x4B, 0x7F, 0xCD, 0x8E, 0x14, 0x79, - 0xE7, 0x47, 0xE3, 0x48, 0x53, 0x32, 0xB8, 0x41, 0xAA, 0xEF, 0xCA, 0xF7, - 0x89, 0x26, 0x4C, 0xF6, 0x3D, 0xDD, 0x4E, 0xEF, 0xDE, 0xA0, 0x7A, 0x50, - 0xAA, 0xE3, 0xFA, 0x4A, 0xA7, 0xB7, 0xF9, 0xEE, 0x3E, 0x42, 0x08, 0x26, - 0xCF, 0x2C, 0xD7, 0xAB, 0x2C, 0x29, 0x62, 0x5D, 0x43, 0x24, 0xFA, 0x76, - 0x20, 0x4D, 0x6B, 0x5D, 0xFA, 0x79, 0xD3, 0xEC, 0xD1, 0x04, 0x4D, 0x2A, - 0xD7, 0x17, 0xDE, 0x70, 0x6B, 0x41, 0x66, 0xDA, 0x4A, 0x65, 0x9C, 0x15, - 0x83, 0xB4, 0x2B, 0x1E, 0x33, 0x23, 0x41, 0x86, 0x9D, 0xEF, 0x07, 0xCD, - 0x2C, 0x3E, 0xFE, 0xF5, 0x0C, 0xE5, 0xBC, 0xDD, 0x58, 0xAF, 0x7B, 0xAE, - 0x4F, 0xE7, 0xF6, 0x24, 0x7D, 0xFB, 0x37, 0x4F, 0xAB, 0x5D, 0x61, 0xFE, - 0x4A, 0x89, 0xB1, 0x8F, 0xF3, 0x41, 0xD1, 0x86, 0x7A, 0xD7, 0x9A, 0x3B, - 0x6D, 0x1F, 0x9E, 0xE3, 0x73, 0xEA, 0xC5, 0x19, 0x72, 0x93, 0x41, 0x19, - 0x6F, 0xA5, 0x58, 0xE7, 0xB0, 0x13, 0x22, 0xF0, 0x7D, 0xBC, 0xFB, 0xE3, - 0x71, 0x16, 0xA7, 0x2A, 0x9B, 0x9E, 0x47, 0xA9, 0xC0, 0x31, 0xD8, 0xD2, - 0x1B, 0x0D, 0xA6, 0xF4, 0xDA, 0xAE, 0x3F, 0x13, 0x08, 0x01, 0x73, 0xA3, - 0x25, 0x6A, 0xA5, 0x20, 0x06, 0xA0, 0x65, 0xDF, 0xA3, 0x18, 0x91, 0x58, - 0xA3, 0x4D, 0xEB, 0x0A, 0x4D, 0x33, 0x03, 0x90, 0xAC, 0xA4, 0xED, 0x06, - 0x9A, 0xA7, 0x14, 0x2C, 0x4D, 0x57, 0xA9, 0xD5, 0x83, 0x57, 0xA4, 0x21, - 0x48, 0x76, 0x46, 0x29, 0xE7, 0x1D, 0x9C, 0xAA, 0xCB, 0xD2, 0x64, 0x19, - 0xA7, 0xE6, 0x53, 0x58, 0xA8, 0xF1, 0xD1, 0xAF, 0xA6, 0x99, 0xBB, 0x52, - 0x6A, 0x18, 0xBA, 0xE7, 0xFA, 0x64, 0xBA, 0xA3, 0xEC, 0xFF, 0x7C, 0x07, - 0xAD, 0xFD, 0xB1, 0x0D, 0x1B, 0x61, 0xAC, 0x70, 0xE6, 0xD5, 0x39, 0xCE, - 0xBF, 0xB9, 0x40, 0xB5, 0xE8, 0x90, 0xED, 0x8E, 0xF2, 0xE0, 0xB7, 0x7A, - 0xC9, 0x74, 0x45, 0xEF, 0x68, 0x9D, 0x39, 0x29, 0x05, 0x63, 0x27, 0x97, - 0x99, 0x3A, 0xBB, 0x8C, 0x6B, 0x07, 0x7D, 0xB0, 0x22, 0x09, 0x93, 0x9E, - 0x5D, 0x49, 0x5C, 0x47, 0x31, 0x7E, 0x2A, 0xDF, 0x10, 0xBB, 0xB9, 0xCB, - 0x45, 0x3E, 0xF8, 0xE9, 0x24, 0x4F, 0xFF, 0xC9, 0x70, 0xB0, 0x65, 0xB7, - 0x09, 0x3A, 0x02, 0xEF, 0xB3, 0x85, 0xEF, 0x29, 0x72, 0xD3, 0xB5, 0x7A, - 0x39, 0x35, 0x45, 0xDB, 0xA1, 0x27, 0x30, 0xA3, 0x89, 0x6B, 0x46, 0x9E, - 0xA6, 0x11, 0x80, 0xAB, 0x09, 0xA2, 0xD5, 0x0A, 0xD4, 0x1B, 0xE0, 0x12, - 0x8A, 0x1A, 0x1C, 0xFA, 0x72, 0x37, 0x13, 0xA7, 0xF3, 0x5C, 0x7C, 0x67, - 0x9E, 0x5A, 0xC9, 0x61, 0xE6, 0x52, 0x91, 0xCB, 0xC7, 0x97, 0x18, 0x3D, - 0x11, 0xF8, 0x08, 0x7C, 0x4F, 0x21, 0x4D, 0x41, 0xEF, 0x9E, 0x34, 0x07, - 0xBE, 0xD8, 0xC5, 0xD0, 0x03, 0x99, 0xB5, 0x3B, 0x2A, 0xEB, 0x90, 0xA6, - 0xE0, 0xDC, 0xEB, 0xF3, 0x7C, 0xF0, 0xB3, 0x49, 0x96, 0x26, 0xCA, 0xC1, - 0x6E, 0xC3, 0x68, 0x89, 0x50, 0xCC, 0xE4, 0xD1, 0xDF, 0xEB, 0x27, 0x14, - 0xB9, 0x73, 0x6D, 0xA7, 0x5C, 0xDB, 0xE7, 0xFC, 0x1B, 0x73, 0x14, 0x16, - 0x6A, 0xF5, 0x22, 0x21, 0x26, 0x47, 0xBF, 0xD1, 0xCB, 0xD0, 0xE1, 0x0C, - 0x9E, 0xAB, 0x38, 0xF5, 0x9B, 0x19, 0x4E, 0xBF, 0x32, 0x8B, 0xE7, 0x2A, - 0x94, 0xAF, 0xB8, 0xFC, 0xC1, 0x22, 0x5D, 0x3B, 0x93, 0xEC, 0x7B, 0xBA, - 0xBD, 0xA9, 0xAB, 0xEC, 0xDC, 0x2F, 0x08, 0x01, 0xC5, 0x45, 0x87, 0x6A, - 0xC1, 0x45, 0xF9, 0x8A, 0x48, 0xA6, 0x8D, 0x44, 0xEF, 0x0E, 0xA4, 0x15, - 0xD2, 0x02, 0xB0, 0x82, 0xF2, 0x55, 0x50, 0xCB, 0xBE, 0x3E, 0xB2, 0x19, - 0xA6, 0xA4, 0x77, 0x6F, 0x0A, 0xD7, 0xF6, 0xB8, 0xF8, 0xEE, 0x02, 0x95, - 0x82, 0xCB, 0x47, 0xBF, 0x9A, 0x62, 0xEA, 0x5C, 0x01, 0xB7, 0xE6, 0x13, - 0x8E, 0x9B, 0xF4, 0x1F, 0xC8, 0xD0, 0xB7, 0x2F, 0x4D, 0xE7, 0xF6, 0x44, - 0xD0, 0x07, 0xCF, 0x12, 0x9B, 0x16, 0xCB, 0x98, 0xBB, 0x5C, 0xE6, 0xE3, - 0x5F, 0xCF, 0x90, 0x9B, 0xAA, 0x04, 0x3E, 0x00, 0x82, 0x7B, 0x7F, 0xF1, - 0x9D, 0x05, 0x76, 0x3D, 0xDA, 0x46, 0xE7, 0xF6, 0xF8, 0xA6, 0xE9, 0xAF, - 0x9F, 0x04, 0x21, 0x05, 0x0B, 0xE3, 0x65, 0xE6, 0x47, 0xCB, 0x8D, 0x52, - 0x5B, 0x7B, 0x3F, 0xD7, 0xC1, 0x9E, 0xA7, 0xDA, 0x89, 0x26, 0x03, 0xDF, - 0xC3, 0x91, 0xAF, 0xF7, 0x90, 0x9F, 0xAB, 0x35, 0x66, 0x02, 0x4E, 0xD5, - 0xE3, 0xEC, 0x2B, 0x73, 0xEC, 0x7D, 0xAA, 0x1D, 0x71, 0xE7, 0x74, 0x49, - 0xF3, 0x29, 0x62, 0x57, 0xBC, 0x46, 0xED, 0xC8, 0xD4, 0xF0, 0x7E, 0xAC, - 0x78, 0x6A, 0xC3, 0x0D, 0x99, 0x26, 0x11, 0x80, 0xD5, 0xFA, 0x79, 0x2B, - 0x28, 0x05, 0x4B, 0x93, 0xE5, 0x86, 0x00, 0xB8, 0x76, 0xE0, 0x0F, 0x68, - 0x1B, 0x8C, 0x13, 0x8E, 0x5B, 0xD4, 0x4A, 0x2E, 0x63, 0x27, 0x72, 0xD8, - 0x15, 0x8F, 0x64, 0x5B, 0x98, 0xC3, 0x5F, 0xE9, 0x66, 0xF8, 0xC1, 0x16, - 0x92, 0xAD, 0x21, 0x0C, 0x4B, 0x36, 0x1A, 0x6D, 0x6C, 0x84, 0x52, 0x70, - 0xE6, 0x95, 0x59, 0xE6, 0x2E, 0x17, 0xD7, 0x06, 0x5D, 0x01, 0x50, 0x2D, - 0x3A, 0x5C, 0x78, 0x7B, 0x81, 0xD6, 0xFE, 0xA0, 0xE6, 0xDD, 0xED, 0x46, - 0xCA, 0xA0, 0x43, 0x4F, 0x69, 0x29, 0xF0, 0xFA, 0xB7, 0xF6, 0xC7, 0xD9, - 0xF1, 0x48, 0x2B, 0x91, 0xB8, 0xD9, 0xF8, 0xAE, 0xC9, 0xB6, 0x30, 0x47, - 0xBF, 0xD1, 0xCB, 0xF2, 0x5C, 0x95, 0xA5, 0xA9, 0x0A, 0xA6, 0x25, 0xE9, - 0xDB, 0x97, 0xBA, 0xEB, 0xE5, 0xAF, 0x35, 0x77, 0x00, 0xA5, 0xC8, 0xEC, - 0x3C, 0x82, 0x19, 0x8D, 0x6F, 0xE8, 0xBE, 0x69, 0x0A, 0x27, 0xA0, 0xE1, - 0xCD, 0x80, 0x5A, 0x8D, 0xFC, 0x83, 0xA0, 0x22, 0xED, 0x4A, 0xED, 0x7B, - 0x00, 0xBB, 0xE2, 0x72, 0xEA, 0xA5, 0x19, 0x5C, 0xC7, 0x6F, 0x64, 0xAF, - 0x39, 0xF5, 0x91, 0x7F, 0xC7, 0xC3, 0xAD, 0xEC, 0x7F, 0xA6, 0x93, 0x4C, - 0x67, 0x04, 0x21, 0xC5, 0x96, 0x6B, 0x7E, 0x21, 0x60, 0x69, 0xB2, 0xC2, - 0xCC, 0x85, 0x02, 0x4E, 0xD5, 0x6B, 0x64, 0xC8, 0x35, 0xC4, 0x42, 0xC1, - 0xA5, 0xF7, 0x16, 0xA8, 0x96, 0xEE, 0x4C, 0x39, 0x5B, 0xA7, 0xEA, 0x33, - 0x37, 0x52, 0xA4, 0x52, 0x70, 0x51, 0x3E, 0xEC, 0x79, 0xB2, 0x83, 0x6C, - 0x57, 0xF4, 0x1A, 0x2F, 0x7F, 0xD7, 0x8E, 0x04, 0xCF, 0xFC, 0xBD, 0xED, - 0x3C, 0xFE, 0x07, 0x43, 0x3C, 0xF9, 0x47, 0x43, 0x1C, 0xF8, 0x62, 0xE7, - 0x1D, 0x99, 0x91, 0x68, 0x3E, 0x7D, 0x14, 0x10, 0xCB, 0x58, 0x84, 0xEA, - 0xBB, 0x53, 0xE1, 0x74, 0x3B, 0xD2, 0x0C, 0x6D, 0xE8, 0xC0, 0x6D, 0x82, - 0x19, 0x80, 0x40, 0xF8, 0x95, 0x7A, 0x09, 0xED, 0xFA, 0x0D, 0x52, 0x41, - 0xC3, 0x4A, 0xCF, 0x5D, 0xDB, 0x1A, 0x1A, 0x0A, 0xF3, 0x35, 0x0A, 0x73, - 0x35, 0x86, 0x1E, 0xC8, 0x30, 0xF6, 0xF1, 0x12, 0x28, 0x45, 0xBA, 0x23, - 0xC2, 0xDE, 0xCF, 0x75, 0x62, 0x45, 0x8D, 0x1B, 0xAA, 0xB4, 0x23, 0xA4, - 0x60, 0xFA, 0x7C, 0x31, 0xF0, 0xF8, 0x8B, 0x20, 0x6E, 0xBE, 0x67, 0x4F, - 0x1A, 0xA7, 0xEA, 0xB1, 0x38, 0x51, 0xAE, 0xF7, 0x76, 0x73, 0x58, 0x18, - 0x2F, 0x13, 0xCF, 0x58, 0xD7, 0xDD, 0x41, 0xB8, 0xA9, 0x6F, 0x2A, 0x05, - 0xF3, 0xA3, 0x25, 0x96, 0x67, 0xAB, 0x28, 0x4F, 0xD1, 0x36, 0x14, 0xA7, - 0x77, 0x5F, 0x0A, 0x2B, 0x72, 0x6D, 0x9D, 0x00, 0x69, 0x08, 0x7A, 0xF6, - 0xA4, 0x68, 0x1B, 0x88, 0x23, 0x0D, 0x6E, 0x63, 0x2D, 0x01, 0xCD, 0x5D, - 0x47, 0x41, 0x38, 0x66, 0x70, 0xE4, 0xAB, 0x5D, 0x64, 0x3A, 0x4C, 0xDA, - 0xF6, 0xEC, 0x41, 0x86, 0x56, 0xCB, 0xD3, 0xAD, 0xA5, 0x09, 0x04, 0x00, - 0xAE, 0xC9, 0xF4, 0x53, 0x8A, 0xE2, 0x7C, 0x75, 0x7D, 0xF7, 0xD8, 0x35, - 0x0B, 0xA4, 0xAE, 0xED, 0x09, 0xC2, 0x71, 0x0B, 0xB7, 0xE6, 0xD2, 0xD2, - 0x17, 0xA3, 0xA5, 0x37, 0x72, 0xC3, 0x5E, 0x70, 0x21, 0x04, 0x73, 0x57, - 0x4A, 0x54, 0x96, 0x83, 0xFD, 0xD7, 0xEE, 0x3D, 0x69, 0x1E, 0xFE, 0x4E, - 0x3F, 0x91, 0x84, 0xC9, 0x4B, 0xFF, 0x6E, 0x84, 0x99, 0x0B, 0x05, 0x94, - 0x82, 0xF1, 0x53, 0x79, 0xFA, 0xF6, 0xA4, 0x6E, 0xB3, 0x00, 0xC0, 0xF4, - 0x85, 0x02, 0x85, 0x85, 0x1A, 0xD2, 0x14, 0x1C, 0xF8, 0x62, 0x17, 0xD9, - 0xEE, 0xC8, 0xA6, 0x3B, 0x77, 0xCA, 0x57, 0x58, 0xD1, 0xD5, 0x5D, 0x11, - 0xCD, 0xFD, 0x45, 0xFF, 0xBE, 0x24, 0xD9, 0xA1, 0x21, 0x8A, 0x9D, 0xBD, - 0x78, 0x52, 0x6E, 0xD8, 0x2E, 0xB9, 0x29, 0x96, 0x00, 0x96, 0x9A, 0x46, - 0x28, 0x7B, 0xB5, 0xA6, 0xAF, 0x0A, 0x62, 0xA4, 0x37, 0x34, 0x6A, 0x11, - 0x94, 0xE8, 0xDA, 0x71, 0x2C, 0x1B, 0xB4, 0x63, 0x1A, 0xB8, 0x39, 0x67, - 0x9D, 0xE7, 0xFA, 0x94, 0xF3, 0xF5, 0xF8, 0x6B, 0x05, 0xDB, 0x1E, 0x6C, - 0xA1, 0x63, 0x38, 0x4E, 0x5B, 0x7F, 0x8C, 0x27, 0xFF, 0x70, 0x90, 0x54, - 0x5B, 0x18, 0x94, 0x62, 0xFA, 0x5C, 0x31, 0xE8, 0xE8, 0x72, 0x1B, 0x51, - 0x3E, 0x74, 0xEF, 0x4E, 0x32, 0x70, 0x30, 0xCB, 0xB1, 0xDF, 0xEE, 0x67, - 0xF8, 0x68, 0xB6, 0x9E, 0x8D, 0xB7, 0xD5, 0x2F, 0xA1, 0xF7, 0xF6, 0xEF, - 0x53, 0x0C, 0x13, 0x64, 0xFB, 0xA3, 0x60, 0xA5, 0x37, 0x55, 0xF8, 0xA6, - 0x98, 0x01, 0x04, 0x01, 0x40, 0x3E, 0x13, 0x67, 0x8B, 0x64, 0x7B, 0xA2, - 0x84, 0xA2, 0x06, 0x4B, 0xD3, 0xEB, 0x67, 0x00, 0x8D, 0xA8, 0x55, 0x05, - 0xE1, 0x84, 0xC5, 0xFE, 0x67, 0x3A, 0x51, 0x4A, 0x90, 0xED, 0x8A, 0xDC, - 0xF0, 0xE8, 0x28, 0x04, 0x14, 0x16, 0x6C, 0x6A, 0xE5, 0xD5, 0x52, 0x5A, - 0x8B, 0xE3, 0x15, 0xEC, 0x8A, 0x87, 0x15, 0x96, 0xB4, 0x0D, 0xC4, 0x79, - 0xFC, 0x7B, 0x83, 0xBC, 0xF2, 0xEF, 0x2F, 0x93, 0x9F, 0xAD, 0x50, 0xCE, - 0x39, 0x84, 0xA2, 0xC6, 0x6D, 0x73, 0xBE, 0x29, 0x5F, 0xD1, 0xDA, 0x17, - 0xE3, 0xD1, 0xDF, 0x1F, 0xC0, 0x0A, 0x49, 0x42, 0x51, 0x9D, 0x88, 0xD3, - 0xCC, 0x78, 0x24, 0xA9, 0x98, 0x8F, 0xE2, 0x89, 0x34, 0x9B, 0xA9, 0x7C, - 0x13, 0x08, 0x80, 0x20, 0xE4, 0x8D, 0x30, 0x75, 0x66, 0x9E, 0x37, 0xFE, - 0x62, 0x9C, 0x87, 0xBE, 0xDD, 0x4D, 0xDF, 0xFE, 0x24, 0x95, 0x82, 0x83, - 0x52, 0x41, 0x1F, 0xF7, 0xD6, 0x81, 0x38, 0x47, 0xBF, 0xDE, 0x43, 0xA2, - 0x25, 0x44, 0x2C, 0x13, 0x42, 0x08, 0x68, 0xE9, 0x8B, 0xF1, 0xC8, 0x77, - 0xFB, 0x30, 0xC3, 0xF2, 0xA6, 0x82, 0x60, 0x82, 0xBD, 0xF5, 0xFA, 0x27, - 0x4B, 0xC1, 0xC5, 0x77, 0xE6, 0x29, 0x2E, 0xD6, 0xF8, 0xFC, 0xDF, 0x1D, - 0x26, 0xD5, 0x16, 0xA6, 0xFF, 0x40, 0x86, 0x2F, 0xFE, 0xA3, 0x1D, 0x4C, - 0x9C, 0x59, 0xC6, 0x8A, 0x1A, 0xB7, 0x3D, 0x0F, 0x48, 0x1A, 0x82, 0x44, - 0xD6, 0x6A, 0x88, 0x99, 0xA6, 0x59, 0xF1, 0x29, 0x5B, 0x4F, 0xE0, 0xC8, - 0x01, 0xB6, 0xCA, 0xC8, 0x6A, 0x02, 0x01, 0x00, 0x49, 0x95, 0xA9, 0xB3, - 0x79, 0xF2, 0x33, 0x35, 0xDC, 0x9A, 0x8F, 0xF2, 0x61, 0x71, 0xBC, 0x0C, - 0x02, 0xBA, 0x77, 0x26, 0x79, 0xE2, 0x7B, 0x43, 0x64, 0x7B, 0xA2, 0x18, - 0xE6, 0xEA, 0xBE, 0xBE, 0x34, 0x04, 0xD1, 0xB4, 0x75, 0x73, 0x46, 0x24, - 0x04, 0xC5, 0xC5, 0x60, 0x06, 0xB0, 0x32, 0xAA, 0x3B, 0x15, 0x8F, 0x89, - 0xD3, 0x79, 0xA6, 0xCF, 0x15, 0x89, 0xA5, 0x43, 0x18, 0xA6, 0xA0, 0x7B, - 0x67, 0x82, 0xB6, 0x81, 0x18, 0x56, 0x58, 0xDE, 0x91, 0x4C, 0x40, 0x3D, - 0xEA, 0x37, 0x3B, 0x0A, 0x57, 0xF6, 0x50, 0x0E, 0x3D, 0x8D, 0x27, 0x33, - 0x6C, 0xF5, 0x12, 0x37, 0x85, 0x00, 0x58, 0xFE, 0x18, 0xE5, 0xC5, 0x62, - 0x10, 0x1E, 0x39, 0x53, 0x65, 0x50, 0xA5, 0x39, 0xFA, 0xF5, 0x1E, 0x42, - 0x51, 0x93, 0xAE, 0x9D, 0x89, 0xC6, 0xA8, 0x0F, 0xEB, 0xF7, 0xEC, 0x6F, - 0x76, 0x04, 0x15, 0x22, 0xA8, 0x9E, 0xB3, 0xAE, 0xA2, 0x90, 0x00, 0xE5, - 0x29, 0x66, 0x46, 0x8A, 0x0C, 0x1C, 0x4A, 0x63, 0x58, 0x26, 0x42, 0x8A, - 0x46, 0x0F, 0x00, 0x8D, 0xE6, 0x96, 0x59, 0x29, 0xCE, 0x78, 0x15, 0xAE, - 0xEC, 0x21, 0x17, 0xF9, 0xDB, 0xD8, 0xE6, 0x2E, 0xAE, 0x97, 0x8F, 0x7D, - 0x9F, 0x0B, 0x80, 0x40, 0x7A, 0x53, 0x08, 0x55, 0x0A, 0xF6, 0xE2, 0x09, - 0xF6, 0xFB, 0x11, 0xB0, 0xEB, 0xF1, 0x36, 0x84, 0x10, 0xD7, 0x94, 0xB6, - 0xFE, 0xA4, 0x6C, 0x1A, 0x1C, 0xB4, 0x45, 0xE0, 0x90, 0xA6, 0xF9, 0x68, - 0x54, 0x93, 0x52, 0x5C, 0xD5, 0xA6, 0x5D, 0x70, 0x23, 0x05, 0xA2, 0x6B, - 0x45, 0x0F, 0xBB, 0x0A, 0xB1, 0x4C, 0x98, 0x50, 0x54, 0xD6, 0xCF, 0xA1, - 0xB0, 0xCD, 0x3D, 0x2C, 0x87, 0xBF, 0x4B, 0xCD, 0x38, 0x50, 0x2F, 0x70, - 0xBB, 0xF5, 0x4B, 0x77, 0x9F, 0x0B, 0x00, 0x84, 0xBD, 0x0B, 0x48, 0xB5, - 0xD2, 0xD0, 0x63, 0xF5, 0x7E, 0x18, 0x9F, 0x62, 0xB1, 0x4A, 0x69, 0x08, - 0xFA, 0x0F, 0x64, 0x1A, 0xC5, 0x19, 0x35, 0xCD, 0x8B, 0xF2, 0x15, 0x9E, - 0xAB, 0xC8, 0x4F, 0xDB, 0x8C, 0x7E, 0x9C, 0x63, 0x69, 0xD2, 0x66, 0x71, - 0xAC, 0x02, 0x7E, 0x30, 0x40, 0x99, 0x96, 0x24, 0xDD, 0x1B, 0xD9, 0x78, - 0x65, 0x28, 0x04, 0xD5, 0x82, 0x43, 0x71, 0xCE, 0x46, 0xF9, 0x1E, 0xDD, - 0x4F, 0x7F, 0x8F, 0xE1, 0x6F, 0xFE, 0x09, 0x21, 0xB3, 0x08, 0x7E, 0x09, - 0xDF, 0x68, 0xC3, 0x33, 0x3A, 0xF1, 0x45, 0x1C, 0x6E, 0xB0, 0x9C, 0xFD, - 0x7D, 0x2E, 0x00, 0x02, 0x53, 0xCD, 0x23, 0xA8, 0x47, 0xFC, 0x7D, 0x8A, - 0xC6, 0x27, 0x0D, 0x11, 0x88, 0x8C, 0x80, 0xBD, 0x4F, 0x75, 0xD2, 0xB9, - 0x3D, 0x7E, 0x5B, 0xF7, 0xFC, 0x35, 0x9F, 0x3D, 0x82, 0x62, 0x33, 0x65, - 0xCE, 0xBE, 0xBE, 0xC4, 0xCC, 0xF9, 0x12, 0x6E, 0xCD, 0x43, 0xF9, 0x5C, - 0x13, 0x59, 0x5A, 0xCE, 0x3B, 0x9B, 0x9E, 0x43, 0xF9, 0x41, 0x02, 0x57, - 0x66, 0xFF, 0xE7, 0x68, 0x39, 0xF6, 0x07, 0x10, 0xDB, 0x4E, 0x4D, 0x79, - 0xAC, 0xAE, 0x07, 0x6E, 0x6E, 0x60, 0xBB, 0xCF, 0x05, 0x00, 0x42, 0x6E, - 0x30, 0x03, 0x28, 0x2D, 0x38, 0xF8, 0xAE, 0xBA, 0xF3, 0xE1, 0xAE, 0x4A, - 0x11, 0x8E, 0x9B, 0x6C, 0x3B, 0xD6, 0x46, 0xFF, 0x81, 0x0C, 0xE9, 0x8E, - 0x30, 0xAD, 0x7D, 0x51, 0xC2, 0xF1, 0xFB, 0xFE, 0x56, 0x6B, 0x36, 0x41, - 0xF9, 0x8A, 0x4A, 0xC1, 0xE5, 0xD4, 0x4B, 0x73, 0x8C, 0xBC, 0x93, 0xA7, - 0x56, 0xF2, 0xB7, 0xDC, 0x59, 0xDA, 0x2A, 0xD4, 0x1C, 0x21, 0xC8, 0xEC, - 0x7F, 0x8A, 0xE1, 0xEF, 0xFE, 0x33, 0x52, 0xC3, 0xFB, 0xEA, 0x53, 0xFF, - 0x5B, 0x9F, 0xCD, 0xDE, 0xC7, 0x6F, 0xA5, 0x40, 0xFA, 0x0B, 0x98, 0x6A, - 0x1A, 0x7C, 0x87, 0x52, 0xDE, 0xC1, 0xF7, 0x15, 0xF1, 0x6C, 0xF8, 0xCE, - 0x8D, 0xC4, 0x2A, 0xD8, 0xFA, 0x3B, 0xFA, 0x8D, 0x5E, 0xBA, 0x76, 0x24, - 0x08, 0xC5, 0x82, 0x6D, 0x3E, 0x1D, 0x63, 0xDF, 0x9C, 0x28, 0x5F, 0xE1, - 0x3A, 0x8A, 0x85, 0xD1, 0x32, 0xEF, 0xFD, 0x64, 0x92, 0xDC, 0xA4, 0x8D, - 0xEF, 0x6E, 0x7A, 0xF4, 0x55, 0xFF, 0xBF, 0xB2, 0x64, 0x55, 0x20, 0x24, - 0xD2, 0xB4, 0x10, 0xA1, 0x10, 0x99, 0xFD, 0x8F, 0x33, 0xF4, 0x8D, 0xFF, - 0x92, 0xE4, 0xC0, 0xAE, 0xDB, 0x72, 0x8D, 0xF7, 0xB5, 0x00, 0x44, 0xDC, - 0x8F, 0x31, 0x54, 0x8E, 0xD2, 0x92, 0x83, 0x57, 0x2F, 0xFB, 0x15, 0x4B, - 0x9B, 0x77, 0xCC, 0x20, 0x7D, 0x5F, 0x31, 0x78, 0x28, 0x1D, 0x7C, 0xBA, - 0x36, 0xFA, 0xCF, 0x16, 0x75, 0x67, 0xB9, 0xEB, 0xF8, 0xF8, 0x6E, 0x30, - 0x5D, 0xF7, 0xBD, 0xAB, 0xEA, 0xE7, 0x04, 0xB6, 0x88, 0x61, 0x0A, 0x0C, - 0x53, 0x60, 0x86, 0x64, 0xD0, 0x13, 0x61, 0xED, 0x31, 0x7E, 0x70, 0x0E, - 0xD7, 0xF6, 0xC9, 0xCF, 0xD6, 0xB8, 0xF4, 0xEE, 0x32, 0x97, 0xDE, 0xCB, - 0xE1, 0xD5, 0x13, 0xC3, 0x82, 0xF3, 0x04, 0x29, 0xA2, 0x32, 0x14, 0x45, - 0x9A, 0x21, 0x84, 0x61, 0x20, 0x0D, 0x0B, 0x64, 0x50, 0xC2, 0x59, 0x79, - 0x2E, 0x4A, 0xF9, 0x08, 0x21, 0x11, 0x86, 0x89, 0x11, 0x89, 0x93, 0xDC, - 0x71, 0x94, 0xD6, 0x07, 0xBE, 0x4C, 0xEB, 0xDE, 0x87, 0xEB, 0x75, 0xFD, - 0x6E, 0x0F, 0xF7, 0xAD, 0x00, 0x28, 0x24, 0x61, 0xEF, 0x1C, 0x52, 0x15, - 0x98, 0xBD, 0x52, 0xC1, 0xA9, 0x06, 0x02, 0x70, 0xA7, 0x53, 0x5E, 0xB5, - 0xE1, 0x7F, 0x46, 0xA8, 0x3F, 0x26, 0xDF, 0x55, 0xB8, 0xB6, 0x8F, 0xE7, - 0x28, 0xAA, 0x45, 0x97, 0x89, 0xB3, 0x45, 0x16, 0xC7, 0x6D, 0x66, 0x47, - 0x0A, 0x2C, 0xCF, 0xD9, 0x38, 0xF6, 0xDA, 0x70, 0xD1, 0xA0, 0x46, 0x62, - 0xDB, 0x60, 0x84, 0xD6, 0xFE, 0x08, 0x7D, 0xFB, 0x52, 0x64, 0xBB, 0x22, - 0xEB, 0x06, 0xEB, 0x6A, 0xC1, 0x65, 0xEA, 0x7C, 0x91, 0x91, 0xF7, 0x73, - 0xCC, 0x5E, 0x0E, 0xDE, 0x3B, 0xA5, 0x20, 0x14, 0x91, 0x84, 0x23, 0x21, - 0x8C, 0x70, 0x0C, 0x69, 0x85, 0x31, 0x22, 0x71, 0xB2, 0x87, 0x9F, 0x25, - 0x39, 0xB8, 0x87, 0x68, 0x7B, 0x2F, 0xB1, 0xAE, 0x21, 0xCC, 0x68, 0x02, - 0xE5, 0xB9, 0x54, 0xE7, 0x27, 0xB0, 0x8B, 0x39, 0xCC, 0x68, 0x82, 0x44, - 0xEF, 0x8E, 0xC6, 0x2C, 0x00, 0x29, 0x10, 0xB7, 0xB9, 0x89, 0xC4, 0x7D, - 0x2B, 0x00, 0x82, 0x1A, 0x96, 0x7F, 0x19, 0x49, 0x85, 0x99, 0xF3, 0x45, - 0xEC, 0x4A, 0xA0, 0xC0, 0xE1, 0xB8, 0xF9, 0xA9, 0x34, 0xE2, 0xD0, 0xDC, - 0x63, 0x88, 0xC0, 0x4E, 0x3D, 0x57, 0xE1, 0xD6, 0x82, 0x11, 0xDA, 0xAE, - 0xF9, 0x2C, 0x4D, 0x54, 0x98, 0xBE, 0x58, 0x62, 0xEE, 0x72, 0x95, 0xA9, - 0xF3, 0xC5, 0xC6, 0xDA, 0x7C, 0xB3, 0x2D, 0xDB, 0x52, 0xDE, 0xA1, 0x74, - 0xC2, 0x61, 0xF4, 0x44, 0x81, 0xE3, 0xCF, 0x2D, 0x90, 0x6C, 0xB1, 0x88, - 0x24, 0x82, 0x90, 0x6B, 0xBB, 0xAA, 0x82, 0x3A, 0xFC, 0x35, 0x6F, 0x4D, - 0x24, 0xA6, 0x42, 0x4A, 0x8B, 0x58, 0x4B, 0x1B, 0xE9, 0xED, 0x87, 0x48, - 0xEF, 0x7B, 0x92, 0xE4, 0xE0, 0x3E, 0xD2, 0xC3, 0x07, 0x10, 0xA6, 0xB5, - 0xDA, 0x15, 0x6A, 0x65, 0x64, 0x32, 0x2D, 0xE2, 0xBD, 0x3B, 0x88, 0x2B, - 0x55, 0x17, 0x96, 0x3B, 0x3B, 0xA0, 0xDC, 0xA7, 0x02, 0x20, 0x09, 0xBB, - 0x1F, 0x61, 0xB0, 0x44, 0x71, 0xC1, 0x61, 0xFC, 0x74, 0x11, 0xBB, 0xEA, - 0x61, 0x98, 0x82, 0x74, 0x47, 0x18, 0xC3, 0x10, 0x7A, 0x4F, 0xBE, 0x49, - 0x10, 0x22, 0x30, 0xFA, 0x5A, 0xD9, 0xC3, 0xAE, 0x78, 0x2C, 0x4E, 0x54, - 0x98, 0xB9, 0x58, 0x62, 0x7E, 0xB4, 0xCA, 0xDC, 0xE5, 0x32, 0xB5, 0xB2, - 0xB7, 0xC1, 0xBB, 0x50, 0xDF, 0x9F, 0x67, 0xF3, 0xB2, 0xE6, 0x0A, 0xF0, - 0x7D, 0x9F, 0xDC, 0xB4, 0xB7, 0xF1, 0xB4, 0x52, 0x29, 0x14, 0x0A, 0x33, - 0x12, 0x27, 0x3D, 0xBC, 0x9F, 0x1D, 0xDF, 0xF9, 0x33, 0xDA, 0x0E, 0x3E, - 0x71, 0x4D, 0x63, 0x8E, 0x2D, 0x2F, 0xFC, 0x53, 0xE0, 0x3E, 0x13, 0x80, - 0x7A, 0xB7, 0x1F, 0x21, 0x09, 0xFB, 0x23, 0xD8, 0xF9, 0x25, 0x3E, 0xF8, - 0xF9, 0x0C, 0x4B, 0x93, 0x55, 0x50, 0x90, 0x6A, 0x0D, 0x23, 0x4D, 0xA1, - 0xB7, 0xE2, 0x9B, 0x00, 0x21, 0x82, 0x2E, 0x4E, 0xE5, 0xBC, 0xC3, 0xFC, - 0x58, 0x85, 0x2B, 0xC7, 0x73, 0x8C, 0x9F, 0x29, 0x53, 0x98, 0xDF, 0x24, - 0x0B, 0x54, 0xA9, 0xC0, 0xA3, 0x2E, 0xC0, 0x0C, 0x47, 0x31, 0xA3, 0x09, - 0x8C, 0x50, 0x14, 0x19, 0x0A, 0x5F, 0x53, 0x4B, 0x1F, 0x04, 0xBE, 0x6B, - 0xE3, 0x55, 0x4A, 0xB8, 0xB5, 0x32, 0x4E, 0x29, 0x8F, 0xEF, 0xD8, 0xAC, - 0x38, 0x12, 0x84, 0x90, 0x18, 0xD1, 0x38, 0xA1, 0x44, 0x86, 0x8E, 0xA3, - 0x5F, 0x60, 0xDB, 0xB7, 0xFE, 0x01, 0xF1, 0xAE, 0x95, 0x98, 0xFC, 0x7B, - 0x8B, 0xFB, 0x48, 0x00, 0x14, 0x52, 0x15, 0x11, 0xCA, 0xC1, 0xF3, 0x0D, - 0x96, 0x2F, 0xBC, 0xCD, 0xC5, 0xE7, 0x4E, 0x71, 0xFE, 0xCD, 0x1C, 0xB5, - 0x72, 0x30, 0xFD, 0xEF, 0xD8, 0x11, 0xBB, 0x7E, 0x7A, 0xAC, 0xE6, 0xB3, - 0x8D, 0x00, 0x7C, 0x28, 0x2C, 0xDA, 0x4C, 0x9F, 0x2F, 0x71, 0xE6, 0xB5, - 0x45, 0x26, 0xCF, 0x16, 0x71, 0x1D, 0x75, 0xED, 0xA0, 0xBA, 0xC6, 0xE8, - 0x43, 0x89, 0x0C, 0xA1, 0x64, 0x0B, 0xE1, 0x4C, 0x2B, 0xC9, 0xFE, 0x9D, - 0xA4, 0x86, 0x0F, 0x12, 0xEF, 0x1E, 0x22, 0xDA, 0xDE, 0x47, 0xA2, 0x77, - 0x78, 0xFD, 0x9A, 0x40, 0x48, 0x6A, 0xB9, 0x39, 0x96, 0x2F, 0x9F, 0xA2, - 0x30, 0x76, 0x8E, 0xC5, 0xD3, 0xEF, 0x52, 0x9A, 0xBC, 0x84, 0xEF, 0xBA, - 0x48, 0xC3, 0xC0, 0x4A, 0xA4, 0x49, 0x6F, 0x3B, 0x48, 0xFB, 0x03, 0xCF, - 0xD0, 0xB2, 0xF7, 0x41, 0x8C, 0x70, 0xF4, 0x9E, 0x4D, 0xD0, 0x10, 0x7F, - 0x39, 0x56, 0x55, 0xCF, 0xCD, 0xDA, 0xDC, 0xC1, 0x86, 0xB8, 0x9F, 0x02, - 0x06, 0x96, 0x37, 0x42, 0xD4, 0x7E, 0x1D, 0x93, 0x05, 0x96, 0x26, 0x2B, - 0xBC, 0xF2, 0xAF, 0x7E, 0xC8, 0xFC, 0xB9, 0xCB, 0x48, 0xB3, 0x1E, 0x11, - 0xA5, 0xE0, 0xF3, 0x7F, 0x7F, 0x90, 0xDD, 0x4F, 0xB4, 0xE8, 0x96, 0xD5, - 0xF7, 0x30, 0x2B, 0x4D, 0x57, 0x6F, 0xF5, 0x77, 0x5D, 0xDB, 0x67, 0xEE, - 0x4A, 0x85, 0xE3, 0xBF, 0x9C, 0xE5, 0xCA, 0x47, 0xCB, 0xD7, 0x1A, 0xBE, - 0x52, 0x8D, 0xC6, 0x18, 0xA1, 0x64, 0x96, 0x50, 0xBA, 0x8D, 0x48, 0xB6, - 0x83, 0xB6, 0x03, 0x8F, 0xD1, 0xBA, 0xFF, 0x51, 0x32, 0x3B, 0x8F, 0x34, - 0x0C, 0xB6, 0xB1, 0x07, 0xB0, 0xD9, 0x05, 0x09, 0x81, 0x10, 0x02, 0x21, - 0x0D, 0xCA, 0x73, 0x13, 0xD4, 0x72, 0xF3, 0x84, 0xE2, 0x29, 0x22, 0xAD, - 0x5D, 0x48, 0x2B, 0x1C, 0x7C, 0xCE, 0x3D, 0x6A, 0xF8, 0x2B, 0xDC, 0x07, - 0x33, 0x00, 0x81, 0xA0, 0x46, 0xA2, 0xF6, 0x1C, 0x09, 0xFB, 0xA7, 0x48, - 0xD3, 0x67, 0xE4, 0xF8, 0x2C, 0xB5, 0xC5, 0x19, 0x84, 0xB1, 0x1A, 0x0E, - 0x19, 0x49, 0x9A, 0x74, 0x6D, 0x8F, 0x6B, 0xE3, 0xBF, 0x07, 0x11, 0x22, - 0xF8, 0x97, 0xEF, 0x2A, 0xAA, 0x65, 0x97, 0x50, 0xD4, 0xB8, 0xE9, 0x58, - 0x0D, 0x21, 0x82, 0x3A, 0x8F, 0x23, 0x1F, 0xE4, 0x79, 0xFF, 0xA7, 0x33, - 0x2C, 0x8C, 0x57, 0x11, 0xA2, 0x7E, 0xEE, 0x95, 0x91, 0x5E, 0xF9, 0x84, - 0x52, 0x2D, 0x84, 0x33, 0xED, 0x44, 0x5A, 0x3A, 0x69, 0xD9, 0xF7, 0x08, - 0xAD, 0xFB, 0x1E, 0x26, 0xB3, 0xF3, 0x01, 0xCC, 0x48, 0xAC, 0x21, 0x0E, - 0xCA, 0xBF, 0xC1, 0x7A, 0x8D, 0xF5, 0xF3, 0x2A, 0xDF, 0x27, 0xD2, 0xD2, - 0x49, 0xA4, 0xA5, 0x73, 0xF5, 0xE7, 0x37, 0x7A, 0x8E, 0xBB, 0xCC, 0x7D, - 0x20, 0x00, 0x12, 0xCB, 0xBD, 0x84, 0xE5, 0x5F, 0xC0, 0x30, 0x7D, 0x96, - 0xA6, 0x5D, 0x2E, 0xBE, 0x53, 0xA0, 0xB8, 0xE4, 0xAE, 0x53, 0xFE, 0xDD, - 0x8F, 0xB7, 0x90, 0x68, 0xB1, 0x74, 0xB3, 0xCA, 0x7B, 0x84, 0x86, 0xD1, - 0x7B, 0x8A, 0x72, 0xCE, 0xA6, 0xB8, 0x68, 0xB3, 0x38, 0x59, 0x61, 0x79, - 0xA6, 0xCA, 0xC0, 0xE1, 0x2C, 0x5D, 0x3B, 0x12, 0x37, 0x75, 0x2E, 0xA7, - 0xE6, 0x73, 0xE1, 0xED, 0x1C, 0xEF, 0xFE, 0x64, 0x9A, 0xFC, 0x4C, 0x2D, - 0xD8, 0x9F, 0x57, 0x3E, 0xCA, 0xF3, 0xB0, 0xE2, 0x69, 0x22, 0x2D, 0x1D, - 0x44, 0xB2, 0x9D, 0xB4, 0x1E, 0x78, 0x94, 0x96, 0xBD, 0x0F, 0x93, 0xDD, - 0xF5, 0x40, 0xD0, 0x28, 0x83, 0xC0, 0x80, 0x3F, 0xB1, 0xC1, 0xDE, 0xE3, - 0x23, 0xFD, 0x66, 0x7C, 0xF6, 0x05, 0x40, 0x9A, 0x84, 0x8C, 0x05, 0x2C, - 0x99, 0xA7, 0x30, 0xEB, 0xF0, 0xFE, 0x4F, 0x67, 0x99, 0xBE, 0x58, 0x6A, - 0xFC, 0x75, 0x50, 0x25, 0x27, 0xCA, 0xEE, 0x27, 0x5B, 0x09, 0xC7, 0x4C, - 0x6D, 0xFC, 0x77, 0x19, 0x21, 0xEA, 0x9D, 0x96, 0x0B, 0x2E, 0xF9, 0xB9, - 0x6A, 0xB0, 0x0D, 0x77, 0x7E, 0x99, 0xA9, 0xF3, 0x45, 0xE6, 0xAF, 0x94, - 0x30, 0x23, 0x06, 0xD5, 0xB2, 0x47, 0xD7, 0xCE, 0xC4, 0x8D, 0x3D, 0xAB, - 0xBA, 0x97, 0xFF, 0xD2, 0x7B, 0x79, 0xDE, 0x5B, 0x6B, 0xFC, 0x9E, 0x4B, - 0xA4, 0xA5, 0x93, 0xE4, 0xE0, 0x1E, 0xD2, 0xDB, 0x0E, 0x91, 0xDD, 0x75, - 0x84, 0xEC, 0xCE, 0xC3, 0x44, 0x5A, 0xBB, 0x01, 0x71, 0x7B, 0x8C, 0xFE, - 0x3E, 0xE0, 0xB3, 0x2B, 0x00, 0xF5, 0xC5, 0x62, 0x69, 0xE2, 0x02, 0x4B, - 0x17, 0x5E, 0x61, 0x6A, 0xF9, 0x22, 0x53, 0xA7, 0x66, 0x19, 0x79, 0x3F, - 0xBF, 0x5A, 0x8E, 0xDB, 0x87, 0x68, 0xDA, 0xE2, 0xD0, 0xB3, 0x1D, 0x64, - 0x7B, 0x22, 0x41, 0xC8, 0xB4, 0x16, 0x80, 0xBB, 0xC2, 0x8A, 0xE1, 0x17, - 0x17, 0x6A, 0x2C, 0x8C, 0x57, 0x98, 0x3A, 0x57, 0x60, 0xE2, 0x74, 0x9E, - 0xB9, 0xCB, 0x25, 0x9C, 0x9A, 0x17, 0xC4, 0xB9, 0x98, 0x02, 0xDF, 0xF5, - 0x59, 0x1C, 0x2B, 0xDF, 0xF8, 0x44, 0x4D, 0xC1, 0xE4, 0x99, 0x22, 0x1F, - 0xFE, 0x62, 0x86, 0xDC, 0x74, 0x50, 0x0C, 0x15, 0x15, 0x34, 0xC3, 0xE8, - 0xFB, 0xFC, 0x77, 0xE9, 0x7B, 0xFA, 0x3B, 0x44, 0x5B, 0xBB, 0xEA, 0x53, - 0x75, 0x0F, 0xE5, 0xFB, 0x37, 0x72, 0xD6, 0xA6, 0xE1, 0x33, 0x29, 0x00, - 0x42, 0x1A, 0x78, 0x76, 0x95, 0xC5, 0x53, 0x6F, 0x71, 0xF9, 0xE7, 0x7F, - 0xCE, 0xF4, 0xBB, 0x2F, 0x62, 0x17, 0x0B, 0x48, 0x43, 0x22, 0xD7, 0x74, - 0xE2, 0x8D, 0xA5, 0x2D, 0x0E, 0x7E, 0xB9, 0x9D, 0x9D, 0x8F, 0xB4, 0x60, - 0x85, 0x75, 0xD9, 0xEB, 0xBB, 0x81, 0x10, 0x41, 0x9F, 0xFA, 0xE2, 0x7C, - 0x8D, 0xD9, 0x91, 0x12, 0xA3, 0x1F, 0xE5, 0xB8, 0xF2, 0x51, 0x8E, 0xE5, - 0xF9, 0x6A, 0x23, 0x4F, 0x62, 0x65, 0xBD, 0x1F, 0x24, 0xB6, 0x08, 0xCC, - 0x88, 0xC4, 0xF3, 0x54, 0xA3, 0x11, 0xEB, 0x66, 0x48, 0x43, 0xB0, 0x30, - 0x56, 0xE1, 0xF8, 0x73, 0xB3, 0xCC, 0x8F, 0x56, 0xEA, 0x02, 0xE2, 0xD0, - 0x76, 0xF0, 0x31, 0x76, 0xFE, 0xEE, 0x3F, 0x0D, 0xF6, 0xDD, 0x4D, 0x13, - 0xDF, 0x75, 0xAE, 0x7F, 0xA1, 0x4D, 0xCA, 0x67, 0x4B, 0x00, 0xEA, 0x1E, - 0xD7, 0xCA, 0xDC, 0x04, 0x53, 0x6F, 0xFE, 0x82, 0xB1, 0xE7, 0xFF, 0x03, - 0x4B, 0xE7, 0x8E, 0x23, 0xA4, 0x81, 0x19, 0x5A, 0x75, 0xF8, 0xAD, 0x35, - 0xFE, 0xC3, 0xCF, 0x76, 0x12, 0x5E, 0xD3, 0x15, 0x47, 0xF3, 0xE9, 0x21, - 0xA5, 0xA0, 0x5A, 0x72, 0x99, 0xBE, 0x50, 0xE4, 0xF2, 0x07, 0x8B, 0x5C, - 0x7A, 0x6F, 0x89, 0x52, 0x2E, 0xE8, 0x57, 0xB8, 0x91, 0x71, 0xC7, 0xD2, - 0x21, 0x06, 0x0F, 0x65, 0xD9, 0x76, 0xAC, 0x05, 0xE5, 0xB1, 0x65, 0x92, - 0x9B, 0x10, 0x41, 0xFB, 0xAB, 0x73, 0x6F, 0x2E, 0x31, 0x71, 0xA6, 0x88, - 0x10, 0x02, 0xE5, 0x79, 0x24, 0xFA, 0xB6, 0xB3, 0xF3, 0x77, 0xFF, 0x0B, - 0x3A, 0x8E, 0x7C, 0x2E, 0x28, 0x78, 0xAC, 0x47, 0xFC, 0x2D, 0xF9, 0xCC, - 0x08, 0x80, 0x90, 0x06, 0xBE, 0x53, 0x63, 0xE1, 0xEC, 0x9B, 0x8C, 0x3D, - 0xFF, 0x1F, 0x98, 0x7A, 0xF3, 0x39, 0x6A, 0xF9, 0x25, 0xA4, 0xB9, 0xFE, - 0x2B, 0xF8, 0x9E, 0x22, 0xD9, 0x1A, 0xE2, 0xE0, 0x97, 0xDA, 0x39, 0xF0, - 0xA5, 0x0E, 0x6D, 0xFC, 0x77, 0x09, 0x21, 0x05, 0xF3, 0x63, 0x65, 0x2E, - 0xBC, 0xBD, 0xC0, 0xF9, 0x37, 0xE7, 0xC9, 0xCF, 0x54, 0x09, 0xC2, 0x62, - 0x37, 0x8A, 0x9A, 0x83, 0x64, 0x47, 0x84, 0xC3, 0x5F, 0xE9, 0x66, 0xD7, - 0xE3, 0x6D, 0x44, 0x93, 0xE6, 0xBA, 0x94, 0xD8, 0x95, 0xE5, 0xC3, 0xCA, - 0x16, 0xA1, 0xF2, 0x83, 0xB4, 0xEE, 0xF1, 0xD3, 0x45, 0x2E, 0xBD, 0x9B, - 0xC3, 0xA9, 0xF9, 0x48, 0x09, 0x56, 0x22, 0xC5, 0xF0, 0xD7, 0xFE, 0x94, - 0x96, 0x3D, 0x0F, 0xD7, 0xA3, 0x70, 0xF5, 0x73, 0xBF, 0x1E, 0xF7, 0xBE, - 0x00, 0xD4, 0x47, 0xFD, 0xEA, 0xC2, 0x14, 0x13, 0xAF, 0xFE, 0x84, 0xF1, - 0xDF, 0x7C, 0x9F, 0xA5, 0xB3, 0xEF, 0x83, 0x34, 0xAF, 0x31, 0x7E, 0xCF, - 0xF1, 0x69, 0x1F, 0x8A, 0x73, 0xE0, 0x4B, 0x6D, 0xEC, 0x7E, 0xBC, 0x55, - 0x1B, 0xFF, 0x5D, 0xC4, 0xAE, 0x78, 0x7C, 0xF4, 0xAB, 0x69, 0xCE, 0xBE, - 0x3A, 0x8B, 0xE7, 0xF8, 0xF5, 0x24, 0xA9, 0x8D, 0xA7, 0xF4, 0x6D, 0x43, - 0x71, 0x0E, 0x3F, 0xDB, 0xCD, 0x8E, 0x47, 0xDA, 0x30, 0x0C, 0xAE, 0x31, - 0xFE, 0x5A, 0xD9, 0x63, 0xEE, 0x4A, 0x99, 0xD2, 0x92, 0x43, 0x24, 0x11, - 0x6C, 0xE7, 0x3A, 0xB6, 0xC7, 0xF9, 0x37, 0x17, 0x58, 0x9C, 0xAC, 0x06, - 0x4E, 0x3F, 0xDF, 0xA3, 0xFB, 0x91, 0xAF, 0xD2, 0xFD, 0xE8, 0xD7, 0x82, - 0x3E, 0x78, 0xDA, 0xC1, 0x77, 0x43, 0xDC, 0xD3, 0x02, 0x20, 0x0C, 0x13, - 0xAF, 0x5A, 0x66, 0xFE, 0xA3, 0x57, 0x99, 0x78, 0xF5, 0x3F, 0x31, 0xFD, - 0xF6, 0xAF, 0xA9, 0xE5, 0xE6, 0x91, 0xA6, 0xB5, 0xEE, 0x38, 0xA5, 0x82, - 0x4C, 0xCA, 0x81, 0x83, 0x69, 0x0E, 0x7F, 0xB5, 0x83, 0x81, 0x43, 0xE9, - 0xA0, 0xD5, 0x95, 0x36, 0xFE, 0xBB, 0x82, 0x10, 0x41, 0x55, 0x9B, 0xB9, - 0x91, 0x22, 0xAE, 0xED, 0x6F, 0xBA, 0xA7, 0xAF, 0x14, 0x74, 0x0C, 0x27, - 0x78, 0xF8, 0x77, 0xFA, 0x18, 0x3C, 0x92, 0x0D, 0xAA, 0xDD, 0xAC, 0x7D, - 0x64, 0x0A, 0x16, 0x26, 0xAA, 0x9C, 0x7E, 0x75, 0x81, 0xC9, 0x33, 0x05, - 0x4A, 0x4B, 0x2E, 0x91, 0x84, 0x49, 0xDF, 0xBE, 0x24, 0x9E, 0xEB, 0x33, - 0x76, 0xB2, 0x80, 0x90, 0x81, 0xC7, 0x3F, 0x3D, 0xBC, 0x8F, 0xBE, 0x67, - 0x7E, 0x97, 0x68, 0x47, 0x2F, 0xCA, 0xD3, 0xC6, 0x7F, 0xA3, 0xDC, 0x93, - 0x02, 0x20, 0xA4, 0x44, 0xF9, 0x3E, 0xCB, 0x23, 0x27, 0x99, 0x7A, 0xF3, - 0x39, 0x26, 0x5E, 0xF9, 0x21, 0xCB, 0x97, 0xCF, 0x34, 0x0A, 0x23, 0xAC, - 0xC5, 0xF7, 0x14, 0xE1, 0x84, 0xC5, 0x8E, 0x87, 0xB2, 0x1C, 0xFC, 0x72, - 0x1B, 0xED, 0x43, 0xB1, 0x86, 0x13, 0x50, 0x73, 0x87, 0x10, 0x41, 0x0B, - 0x34, 0xD4, 0x7A, 0x83, 0x55, 0xF8, 0xF8, 0x2A, 0x30, 0x3E, 0xDB, 0xAE, - 0x61, 0x3B, 0x35, 0x5C, 0xCF, 0xC5, 0x92, 0x66, 0x70, 0xFC, 0xEA, 0x81, - 0x28, 0xA5, 0xE8, 0xDB, 0x9F, 0xE1, 0xC8, 0xD7, 0x7B, 0x18, 0x3C, 0x98, - 0xDE, 0xF0, 0x79, 0xCD, 0x8F, 0x96, 0x79, 0xFB, 0x47, 0xD3, 0x8C, 0x7E, - 0x5C, 0x68, 0xCC, 0x22, 0x4A, 0x79, 0x87, 0xA5, 0xE9, 0x2A, 0xA2, 0x1E, - 0x43, 0x20, 0x50, 0x18, 0xD1, 0x24, 0xBD, 0x9F, 0xFB, 0x2E, 0x99, 0x9D, - 0x47, 0xF4, 0x9A, 0xFF, 0x26, 0xB9, 0xB7, 0x04, 0xA0, 0x1E, 0x5A, 0x59, - 0x5D, 0x98, 0x66, 0xEA, 0xCD, 0x5F, 0x32, 0xF9, 0xDA, 0x4F, 0xC9, 0x5F, - 0x3C, 0x81, 0x5D, 0x58, 0x42, 0x18, 0xEB, 0x2F, 0x75, 0x65, 0x2D, 0xD8, - 0xB1, 0x2D, 0xC6, 0x9E, 0xA7, 0xDA, 0xD9, 0xFE, 0x50, 0x86, 0x64, 0x5B, - 0xE8, 0xDA, 0x51, 0x44, 0x73, 0x5B, 0x11, 0x52, 0xE0, 0x54, 0x3D, 0x0A, - 0xF3, 0x36, 0x91, 0x84, 0x49, 0xA2, 0xC5, 0xC2, 0x73, 0x15, 0xBE, 0xF2, - 0xC9, 0x58, 0xDD, 0x6C, 0x4B, 0x1F, 0x25, 0x15, 0x6E, 0xA1, 0x92, 0x72, - 0x38, 0xF4, 0x67, 0xCB, 0xBC, 0xFC, 0xC2, 0x1B, 0xBC, 0xFA, 0xFA, 0xCB, - 0x94, 0x4A, 0xA5, 0x46, 0x86, 0x5B, 0x24, 0x6E, 0xB1, 0xF3, 0xB1, 0x56, - 0xF6, 0x3C, 0xD5, 0x4E, 0xD7, 0xF6, 0xC4, 0xB5, 0xCF, 0x4B, 0xC1, 0xFC, - 0x58, 0x99, 0xB7, 0x7E, 0x30, 0xC5, 0x95, 0x13, 0x85, 0xA0, 0xD2, 0x5D, - 0x7D, 0x16, 0x11, 0x08, 0x4F, 0x20, 0x20, 0x81, 0xD0, 0xFB, 0x74, 0x1C, - 0x7D, 0x9A, 0xAE, 0x47, 0x9F, 0x6D, 0xE4, 0xD3, 0x6B, 0x6E, 0x9C, 0xDB, - 0x28, 0x00, 0x6B, 0xD7, 0x78, 0xEA, 0xAA, 0xFF, 0x6E, 0x76, 0xFC, 0xCA, - 0x1F, 0x05, 0x42, 0x4A, 0x9C, 0xD2, 0x32, 0xD3, 0x6F, 0xFC, 0x8C, 0xC9, - 0xD7, 0x7F, 0x4E, 0xEE, 0xC2, 0x47, 0x94, 0x67, 0xC7, 0x91, 0x86, 0x79, - 0x8D, 0xF1, 0x7B, 0xAE, 0x22, 0xD1, 0x62, 0xB1, 0xFD, 0x58, 0x86, 0x9D, - 0x8F, 0xB6, 0x06, 0x21, 0xBE, 0x21, 0x79, 0x43, 0xDD, 0x7B, 0x35, 0x37, - 0xCF, 0x4A, 0xD4, 0xDE, 0x4A, 0xEB, 0xB3, 0x73, 0xAF, 0x2F, 0x30, 0x7A, - 0xA2, 0x48, 0xA2, 0xC5, 0x62, 0xF7, 0xE3, 0x59, 0x7A, 0xF6, 0x26, 0x48, - 0xC5, 0x33, 0x3C, 0xD0, 0xFA, 0x65, 0xF6, 0x65, 0x9F, 0x26, 0x6C, 0xC4, - 0xF0, 0xDB, 0x7D, 0xCC, 0x9D, 0x06, 0x8F, 0x1C, 0x7C, 0x8A, 0xE8, 0xB6, - 0x2A, 0x57, 0x26, 0xCE, 0x21, 0x14, 0x18, 0x21, 0x49, 0xB6, 0x27, 0x46, - 0xDF, 0xDE, 0x14, 0xF1, 0xAC, 0x75, 0x8D, 0xF1, 0x2B, 0x05, 0x0B, 0x63, - 0x65, 0xDE, 0xFA, 0xFE, 0x14, 0xA3, 0x27, 0x0A, 0x5B, 0x66, 0xC5, 0xFA, - 0x8E, 0x4D, 0xCB, 0xBE, 0x63, 0x0C, 0x7D, 0xFD, 0x4F, 0x89, 0x77, 0x0D, - 0x6A, 0xE3, 0xBF, 0x05, 0x6E, 0x83, 0x00, 0x04, 0xD1, 0x35, 0xD2, 0xCF, - 0x63, 0xF9, 0x13, 0xF8, 0x84, 0xF1, 0x44, 0x0A, 0x44, 0x18, 0x5F, 0xA6, - 0x40, 0x6C, 0xF0, 0x11, 0xCA, 0x46, 0xFA, 0x4B, 0x04, 0xA9, 0x93, 0x02, - 0xDF, 0xB1, 0xB9, 0xFC, 0x9B, 0x17, 0x98, 0xFD, 0xE0, 0x25, 0xF2, 0x17, - 0x8E, 0x53, 0x9C, 0xBC, 0x8C, 0x90, 0xC6, 0x86, 0xD3, 0x7D, 0x2B, 0x62, - 0x30, 0x78, 0x38, 0xC9, 0xAE, 0xC7, 0x5B, 0xE8, 0xDB, 0x9F, 0x24, 0x9E, - 0x09, 0xA1, 0x94, 0xD2, 0xC6, 0x7F, 0x07, 0x10, 0x02, 0x5C, 0x47, 0x51, - 0x5A, 0xB2, 0xA9, 0x16, 0x5C, 0xC6, 0x4F, 0x2E, 0x33, 0x75, 0x6E, 0x99, - 0x99, 0xCB, 0x15, 0xCA, 0xCB, 0x0A, 0xD3, 0x14, 0xCC, 0x8F, 0x96, 0xE9, - 0xDD, 0x97, 0x24, 0x95, 0x2E, 0x91, 0x6B, 0x3B, 0x4E, 0xF5, 0x70, 0x0B, - 0x99, 0x4C, 0x9A, 0xFE, 0xBE, 0x3E, 0x96, 0xBC, 0x71, 0x2E, 0x87, 0x4E, - 0xD3, 0x7D, 0x34, 0x4A, 0xEB, 0x91, 0x5E, 0xA4, 0x04, 0x69, 0x48, 0xC2, - 0x71, 0x63, 0xE3, 0x99, 0x9A, 0x80, 0x72, 0xCE, 0xE1, 0x83, 0x9F, 0xCD, - 0x30, 0xFA, 0x71, 0x61, 0xCB, 0xEC, 0x59, 0xDF, 0x75, 0x48, 0x0D, 0xED, - 0x65, 0xFB, 0xB7, 0xFF, 0x31, 0x2D, 0x7B, 0x1E, 0xFA, 0x64, 0x59, 0x44, - 0x4D, 0xCC, 0x27, 0x13, 0x00, 0x61, 0x60, 0x7A, 0x93, 0x98, 0x95, 0x57, - 0x51, 0xB5, 0xCB, 0x18, 0xAA, 0x80, 0x14, 0x26, 0x92, 0x08, 0x08, 0x13, - 0x25, 0x22, 0x6C, 0xBC, 0x99, 0xEB, 0x22, 0xA9, 0x01, 0x8A, 0xFC, 0xE5, - 0x25, 0xC6, 0x3E, 0x9C, 0x66, 0xE4, 0x95, 0xE3, 0x94, 0xA6, 0xC7, 0x36, - 0x37, 0xFC, 0xB0, 0xA4, 0xFF, 0x40, 0x8A, 0xED, 0xC7, 0x32, 0xF4, 0xEE, - 0x49, 0x92, 0xEE, 0x0A, 0x23, 0x0D, 0xED, 0xE8, 0xBB, 0x63, 0x08, 0xB0, - 0xAB, 0x3E, 0x17, 0xDF, 0xC9, 0x71, 0xE6, 0xD5, 0x05, 0x3C, 0x47, 0x91, - 0x9B, 0x2A, 0x53, 0x5E, 0xAA, 0x20, 0x4C, 0x13, 0x23, 0x14, 0xF4, 0x1F, - 0x9C, 0x1F, 0xAB, 0x92, 0x9F, 0xB5, 0x91, 0xE6, 0x12, 0x1F, 0x59, 0xB3, - 0xBC, 0xFC, 0xEB, 0xB7, 0x89, 0x46, 0xA2, 0x1C, 0x7C, 0x62, 0x90, 0xD4, - 0x0E, 0x58, 0xF4, 0x66, 0xF1, 0xFD, 0x0A, 0xE9, 0x36, 0x93, 0x95, 0x4D, - 0x9B, 0x8D, 0xAA, 0xDE, 0x06, 0x8E, 0x43, 0x97, 0x77, 0x7E, 0x38, 0xC9, - 0xE5, 0xE3, 0xCB, 0x5B, 0x5E, 0x9A, 0xEF, 0xDA, 0xA4, 0x06, 0xF6, 0xB0, - 0xEB, 0xF7, 0xFE, 0x29, 0x9D, 0x47, 0xBF, 0x80, 0x34, 0xAC, 0x46, 0x86, - 0x9F, 0xE6, 0xE6, 0xB8, 0x75, 0x01, 0x10, 0x06, 0xA2, 0x7A, 0x09, 0xA3, - 0xF4, 0x53, 0xA4, 0xFB, 0x31, 0xCA, 0xAB, 0xA0, 0xEA, 0xB5, 0xB6, 0x64, - 0xA3, 0x92, 0xCA, 0x46, 0x0F, 0x3A, 0xA8, 0xCD, 0xB4, 0x74, 0x7E, 0x96, - 0x8B, 0x6F, 0x2F, 0x90, 0xBB, 0x9C, 0x63, 0x79, 0xB6, 0x8C, 0x5D, 0xF6, - 0x36, 0x34, 0x7C, 0x33, 0x24, 0xE9, 0xDB, 0x9F, 0x62, 0xE7, 0x23, 0x59, - 0xBA, 0x77, 0x25, 0x48, 0x77, 0x84, 0x1B, 0xD3, 0x7D, 0x6D, 0xFC, 0x77, - 0x0E, 0x01, 0x54, 0x96, 0x5D, 0x2E, 0xBE, 0x93, 0x63, 0xFC, 0x54, 0x11, - 0x61, 0x80, 0x50, 0x0A, 0x61, 0xD4, 0x1B, 0x9A, 0xD6, 0xCB, 0xD0, 0x4B, - 0x43, 0xE0, 0x39, 0x0A, 0xD7, 0xF1, 0xB0, 0x2B, 0xCB, 0xE4, 0x72, 0x39, - 0x3C, 0xCF, 0xC7, 0x6E, 0x1F, 0x67, 0x5B, 0xBA, 0x03, 0x33, 0x6C, 0x11, - 0x0A, 0x03, 0x6A, 0xEB, 0x2A, 0x4C, 0xB3, 0x23, 0x65, 0xDE, 0xFD, 0xC9, - 0x0C, 0xE3, 0x27, 0x97, 0x71, 0x6D, 0xB5, 0xF1, 0xE8, 0x5F, 0xCF, 0xD6, - 0xEB, 0x38, 0xF2, 0x39, 0x76, 0xFE, 0xEE, 0x3F, 0x25, 0xB3, 0xEB, 0x01, - 0x8C, 0x70, 0x54, 0x1B, 0xFF, 0x27, 0xE0, 0x16, 0x05, 0x40, 0x62, 0x7A, - 0x53, 0x58, 0xD5, 0x5F, 0xA1, 0x6A, 0xC7, 0x51, 0xC2, 0xBB, 0x76, 0xAA, - 0xBF, 0xC1, 0x03, 0x14, 0x52, 0x50, 0x9C, 0x2D, 0x73, 0xE5, 0xCD, 0x71, - 0x26, 0x3E, 0x9C, 0x21, 0x37, 0x55, 0xC1, 0xB3, 0xBD, 0xFA, 0xFA, 0xB2, - 0x3E, 0x53, 0x50, 0x41, 0x75, 0x5D, 0x2B, 0x22, 0xD9, 0xF9, 0x48, 0x96, - 0xED, 0x0F, 0xB7, 0xD0, 0xD2, 0x17, 0x21, 0xD5, 0x1E, 0xC6, 0xAA, 0x1B, - 0xBE, 0x9E, 0xEE, 0x7F, 0x0A, 0x08, 0x81, 0x6B, 0xFB, 0x94, 0x96, 0x6C, - 0xA4, 0x59, 0x6F, 0x57, 0x55, 0x2F, 0x7B, 0x1E, 0x4C, 0xDF, 0xFD, 0xD5, - 0x67, 0x26, 0x56, 0x1E, 0xB7, 0x40, 0x4A, 0x03, 0x7C, 0x41, 0xA2, 0x25, - 0x4E, 0x28, 0x12, 0x42, 0x29, 0x08, 0x47, 0xFC, 0x6B, 0x8B, 0xA5, 0xD6, - 0x77, 0x12, 0x6A, 0x65, 0x97, 0x73, 0xAF, 0x2F, 0x70, 0xE6, 0xD5, 0x25, - 0xE6, 0xAE, 0x54, 0x36, 0xED, 0x77, 0xA7, 0x7C, 0x0F, 0x2B, 0x9E, 0xA2, - 0xE7, 0x89, 0x6F, 0x32, 0xFC, 0xF5, 0x3F, 0x25, 0x39, 0xB0, 0x1B, 0x84, - 0xD0, 0xC6, 0xFF, 0x09, 0xB9, 0x05, 0x01, 0x10, 0x08, 0x55, 0x41, 0x56, - 0xDE, 0x46, 0x54, 0xDF, 0x03, 0xE1, 0x71, 0xBD, 0x52, 0x47, 0x42, 0x08, - 0xDC, 0xA2, 0xC3, 0xC8, 0x1B, 0xA3, 0x5C, 0x79, 0x7F, 0x8E, 0xE5, 0xA9, - 0x22, 0xB5, 0x92, 0xDB, 0x88, 0xF0, 0x82, 0x46, 0xA5, 0x64, 0x92, 0xAD, - 0x21, 0x86, 0x1E, 0x4C, 0x33, 0xFC, 0x40, 0x86, 0x4C, 0x77, 0x84, 0x64, - 0x4B, 0x08, 0x61, 0x04, 0x2F, 0x9D, 0x36, 0xFC, 0x4F, 0x99, 0xAB, 0x7C, - 0x2B, 0x6A, 0xFD, 0xBF, 0xAE, 0x3A, 0x54, 0x61, 0x98, 0x06, 0x2D, 0x7D, - 0x51, 0x5A, 0x7B, 0x63, 0x64, 0xBA, 0x63, 0x80, 0xC0, 0xB4, 0x7C, 0xC2, - 0x31, 0x81, 0x94, 0xAB, 0xCE, 0x44, 0x50, 0x2C, 0xCF, 0xD6, 0x18, 0x3D, - 0x91, 0xE7, 0xCA, 0x47, 0xC5, 0x20, 0xC8, 0x27, 0x57, 0x4F, 0xDF, 0xDE, - 0xA0, 0x6A, 0x8F, 0x90, 0x92, 0xCC, 0xAE, 0x07, 0x18, 0xFA, 0xEA, 0xDF, - 0xA1, 0xFD, 0xC8, 0xE7, 0x88, 0x64, 0x3B, 0x3F, 0x13, 0xC5, 0x36, 0x3E, - 0x0B, 0xDC, 0xBC, 0x00, 0x08, 0x89, 0xA8, 0x8D, 0x23, 0x4A, 0xC7, 0x51, - 0xAA, 0xC6, 0xF5, 0x7A, 0x90, 0x09, 0x29, 0x18, 0x7B, 0x6F, 0x96, 0x8B, - 0x2F, 0x5E, 0x21, 0x37, 0xBE, 0x4C, 0xB5, 0xE0, 0x04, 0x22, 0xBF, 0xA6, - 0x94, 0xB2, 0x34, 0x04, 0x9D, 0xDB, 0xE2, 0x0C, 0x1F, 0x49, 0x33, 0x78, - 0x38, 0xF0, 0x0E, 0x47, 0xD3, 0x16, 0xF5, 0x5A, 0x0E, 0x7A, 0xAA, 0x7F, - 0x17, 0x08, 0x0A, 0xD2, 0xAE, 0x69, 0x54, 0xA9, 0x00, 0xAF, 0x9E, 0x42, - 0xBB, 0xC6, 0x35, 0xAF, 0x7C, 0x85, 0x15, 0x35, 0xE8, 0x1C, 0x4E, 0xD0, - 0x77, 0xB0, 0x85, 0x74, 0x67, 0x94, 0x50, 0xC4, 0xC0, 0x0C, 0x1B, 0x28, - 0xA5, 0x88, 0x25, 0x4D, 0xAC, 0xB0, 0x4F, 0x69, 0xA9, 0x46, 0x6E, 0xBA, - 0xC6, 0xDC, 0x95, 0x12, 0xF3, 0x63, 0x36, 0x4B, 0x53, 0x15, 0xCA, 0x4B, - 0x0E, 0x95, 0x82, 0x8B, 0xEF, 0x6F, 0x5E, 0x03, 0x33, 0xD6, 0xD9, 0x4F, - 0xDF, 0x33, 0xBF, 0x47, 0xEF, 0x93, 0xDF, 0x24, 0xDA, 0xD6, 0x13, 0x4C, - 0xF9, 0xF5, 0x5E, 0xFF, 0x6D, 0xE3, 0x26, 0x05, 0x40, 0x20, 0xFC, 0x32, - 0x86, 0x73, 0x12, 0xE9, 0x5D, 0x01, 0xB1, 0xB9, 0xF1, 0x0B, 0x01, 0xA5, - 0x85, 0x2A, 0x67, 0x7E, 0x75, 0x99, 0xC9, 0xE3, 0x73, 0x94, 0x16, 0xCB, - 0xA8, 0xFA, 0x83, 0x5E, 0x79, 0xD6, 0x42, 0x0A, 0x86, 0x0E, 0x25, 0x19, - 0x3E, 0x9A, 0xA5, 0x67, 0x4F, 0x92, 0x58, 0xDA, 0x0C, 0x5A, 0x68, 0xD5, - 0x03, 0x4C, 0xB4, 0xD9, 0xDF, 0x05, 0x44, 0x50, 0x2B, 0x7F, 0x7E, 0xB4, - 0xCC, 0xC5, 0x77, 0x96, 0x28, 0x2E, 0xD8, 0xE0, 0xFB, 0xF8, 0x7E, 0x50, - 0x5C, 0x43, 0x29, 0x45, 0x34, 0x15, 0x26, 0xD1, 0x1A, 0x23, 0x14, 0x16, - 0xA4, 0xBB, 0xA3, 0xB4, 0x0D, 0xA7, 0x49, 0x77, 0x04, 0xED, 0xCF, 0xA4, - 0x21, 0x51, 0x28, 0x04, 0x50, 0x98, 0xAF, 0x72, 0xEE, 0x95, 0x05, 0x16, - 0xC7, 0xCB, 0xD4, 0x2A, 0x1E, 0x6E, 0xCD, 0xC7, 0xAE, 0x7A, 0xD8, 0x15, - 0x1F, 0xAF, 0x5E, 0x83, 0xAE, 0x51, 0xB5, 0x67, 0x2D, 0x4A, 0x61, 0x44, - 0x62, 0x74, 0x3D, 0xFC, 0x65, 0x06, 0xBF, 0xF2, 0x47, 0x24, 0x07, 0xF7, - 0x12, 0x4A, 0x64, 0xEA, 0x39, 0xFC, 0xDA, 0xF8, 0x6F, 0x27, 0x37, 0x27, - 0x00, 0x42, 0x22, 0x6A, 0x13, 0xC8, 0xF2, 0x89, 0xFA, 0xD4, 0x7F, 0xE3, - 0x74, 0x2D, 0xDF, 0x36, 0x99, 0xFC, 0x78, 0x86, 0x73, 0x2F, 0x5C, 0x62, - 0xF1, 0x72, 0xBE, 0xBE, 0xCE, 0x5F, 0x7D, 0xD0, 0xA1, 0xA8, 0x41, 0xCF, - 0xEE, 0x04, 0xFB, 0x9F, 0x69, 0xA7, 0x6D, 0x20, 0x4A, 0x24, 0x69, 0x06, - 0xE9, 0xBA, 0xE8, 0xD1, 0xFE, 0x6E, 0xE2, 0xB9, 0x8A, 0xC9, 0x33, 0xCB, - 0x9C, 0x7A, 0x71, 0x96, 0x99, 0x8B, 0x25, 0x6A, 0x25, 0x17, 0xBB, 0xEC, - 0x35, 0x12, 0x6B, 0xA4, 0x29, 0x69, 0xE9, 0x4D, 0xB0, 0xFD, 0x91, 0x4E, - 0xDA, 0x86, 0x32, 0x00, 0x98, 0x21, 0x89, 0x19, 0x31, 0x90, 0x32, 0x70, - 0xF2, 0x29, 0xA5, 0xB0, 0x8B, 0x35, 0x26, 0xCF, 0x2E, 0x73, 0xE5, 0xF8, - 0x12, 0xCB, 0x73, 0x55, 0x9C, 0x9A, 0xDF, 0x58, 0xDB, 0xAF, 0x94, 0xBA, - 0xDF, 0x6C, 0xC4, 0x17, 0xD2, 0x20, 0x39, 0xB0, 0x93, 0x6D, 0xDF, 0xF8, - 0x07, 0xB4, 0x1F, 0xF9, 0x1C, 0xA1, 0x74, 0x2B, 0x42, 0x1A, 0x3A, 0xB6, - 0xFF, 0x0E, 0x71, 0x13, 0x02, 0x20, 0x10, 0xCA, 0xC6, 0x70, 0x2F, 0x20, - 0xBD, 0xCB, 0x6C, 0xD8, 0x5D, 0x43, 0x40, 0x65, 0xB1, 0xCA, 0xF9, 0x17, - 0x46, 0x19, 0x7D, 0x6F, 0x9A, 0xF2, 0x62, 0x35, 0x30, 0xE8, 0x95, 0xDE, - 0x07, 0x52, 0xB0, 0xFD, 0x58, 0x9A, 0x83, 0x5F, 0xEA, 0x20, 0xDD, 0x19, - 0x21, 0x9A, 0x34, 0xEB, 0x05, 0x1C, 0xF4, 0x72, 0x6E, 0x33, 0x7C, 0x4F, - 0x51, 0x98, 0xAF, 0x31, 0x7D, 0xA1, 0x48, 0x7E, 0xA6, 0x4A, 0x6E, 0xAA, - 0x4A, 0x24, 0x69, 0xD1, 0xD2, 0x1B, 0xA1, 0x73, 0x7B, 0x82, 0x96, 0xBE, - 0x18, 0xD2, 0x10, 0xB7, 0xD6, 0x43, 0xA2, 0x3E, 0xCB, 0xF2, 0x5C, 0x9F, - 0xF1, 0x93, 0xCB, 0x9C, 0x7D, 0x65, 0x8E, 0xA9, 0x73, 0x05, 0x2A, 0xCB, - 0x4E, 0x50, 0x4C, 0xB3, 0x7E, 0x58, 0x24, 0x19, 0xA2, 0xEF, 0x70, 0x3B, - 0x3D, 0xFB, 0x5A, 0x48, 0xB6, 0x58, 0x84, 0x62, 0x26, 0xA6, 0x65, 0xAC, - 0xAB, 0x9B, 0x5F, 0x5C, 0xAC, 0xB1, 0x70, 0x25, 0xCF, 0xCC, 0xA5, 0x32, - 0xF9, 0x99, 0x2A, 0xB5, 0x92, 0x83, 0x53, 0xF5, 0x1A, 0xB3, 0xBE, 0x4D, - 0xAF, 0xAD, 0xAE, 0x04, 0xD2, 0x0C, 0x91, 0xDD, 0xF5, 0x20, 0xDD, 0x8F, - 0x3D, 0x4B, 0xE7, 0x83, 0x5F, 0x24, 0x9C, 0x6E, 0x43, 0x86, 0x23, 0xF5, - 0x35, 0xA0, 0x7E, 0x39, 0xEE, 0x14, 0x37, 0x25, 0x00, 0x38, 0x39, 0xA8, - 0x8E, 0xD6, 0x47, 0x7F, 0xE3, 0x9A, 0xBF, 0x2F, 0x5C, 0x59, 0xE0, 0xE4, - 0x2F, 0x2E, 0x33, 0x71, 0x72, 0x09, 0xB7, 0xEA, 0x36, 0x7E, 0x4D, 0x88, - 0x20, 0xE3, 0xEB, 0xA1, 0x6F, 0x76, 0xD1, 0xB5, 0x33, 0x4E, 0x34, 0x69, - 0x05, 0xAB, 0x87, 0x4F, 0xB9, 0x65, 0xF7, 0x67, 0x09, 0xBB, 0xE2, 0x31, - 0x7E, 0x32, 0xCF, 0xD9, 0x57, 0xE7, 0x99, 0xB9, 0x58, 0xAC, 0xF7, 0xAC, - 0x53, 0x78, 0x8E, 0x42, 0x18, 0x60, 0x98, 0x12, 0xD3, 0x92, 0xC4, 0x5B, - 0x42, 0xF4, 0xEC, 0x49, 0xD2, 0xB3, 0x27, 0x45, 0xDB, 0x40, 0x8C, 0x58, - 0xC6, 0x5A, 0x0D, 0x9B, 0x5D, 0x73, 0x3E, 0xB5, 0xE6, 0x0F, 0x4A, 0x41, - 0x7E, 0xA6, 0xCA, 0xC2, 0x58, 0x99, 0xD9, 0x8B, 0x25, 0xC6, 0x4F, 0xE5, - 0x29, 0x2D, 0xD9, 0xD4, 0x4A, 0x2E, 0x9E, 0xA3, 0x1A, 0xCF, 0x4C, 0x29, - 0x48, 0xB5, 0x47, 0x38, 0xF8, 0xEC, 0x00, 0xED, 0xDB, 0xD3, 0x98, 0x21, - 0x03, 0x29, 0x69, 0x8C, 0xF4, 0x9E, 0xED, 0x31, 0x7F, 0x39, 0xCF, 0xE8, - 0x47, 0x4B, 0x2C, 0x4D, 0xD5, 0x70, 0x6A, 0x1E, 0xAE, 0xED, 0xAF, 0xDF, - 0xE7, 0x6F, 0xAC, 0xF7, 0xD6, 0x84, 0xF2, 0x12, 0x84, 0x7C, 0x5B, 0xC9, - 0xA0, 0x7C, 0x76, 0x76, 0xE7, 0x11, 0x5A, 0xF7, 0x3F, 0x42, 0xBC, 0x7B, - 0x1B, 0x66, 0x2C, 0x89, 0x51, 0x2F, 0xD0, 0xA9, 0x0D, 0xFF, 0xCE, 0x73, - 0xE3, 0x02, 0x20, 0x40, 0x78, 0x4B, 0x48, 0x77, 0x82, 0xAB, 0xE5, 0xDC, - 0xB7, 0x0D, 0xC6, 0xDF, 0x9F, 0xE2, 0xEC, 0xAF, 0x2F, 0x90, 0x9B, 0x28, - 0xAE, 0xBE, 0x00, 0x02, 0xA4, 0x10, 0xEC, 0x7D, 0xBA, 0x95, 0xC3, 0x5F, - 0xED, 0x24, 0xDD, 0xB1, 0xA6, 0x33, 0xAF, 0x7E, 0xB6, 0x1B, 0xE2, 0x39, - 0x8A, 0xD9, 0x91, 0x12, 0xEF, 0xFC, 0x60, 0x8C, 0xD9, 0x91, 0x12, 0x76, - 0xD5, 0x0B, 0x8C, 0x7E, 0xED, 0x2D, 0x77, 0xC1, 0xAD, 0xF9, 0x54, 0x15, - 0x94, 0xF3, 0x36, 0x8B, 0x13, 0x65, 0xCE, 0xBC, 0x3C, 0x87, 0x61, 0x4A, - 0xAC, 0x88, 0x24, 0xD5, 0x11, 0x21, 0x14, 0x31, 0x88, 0xA4, 0x2C, 0x92, - 0x6D, 0x21, 0x7C, 0x4F, 0x91, 0x9B, 0xAA, 0xE0, 0xDA, 0x3E, 0x4E, 0xD5, - 0x27, 0x3F, 0x5D, 0xC5, 0xB1, 0xBD, 0xA0, 0x2F, 0x5E, 0xBD, 0x91, 0x25, - 0x3E, 0xD7, 0x44, 0x73, 0x47, 0x12, 0x16, 0xC3, 0xC7, 0x3A, 0xE9, 0xDE, - 0x93, 0x5D, 0xB7, 0x5B, 0x03, 0x81, 0xE3, 0x76, 0x76, 0xAC, 0xC8, 0x99, - 0x57, 0x66, 0xC9, 0xCF, 0xD6, 0x02, 0x47, 0x1E, 0x60, 0x46, 0x4D, 0x12, - 0x69, 0x0B, 0xD3, 0x12, 0xE4, 0xE7, 0x6B, 0xD8, 0x55, 0x85, 0x15, 0x32, - 0x89, 0x74, 0x0C, 0x12, 0x69, 0xE9, 0x21, 0xDE, 0xB3, 0x8D, 0x64, 0xFF, - 0x0E, 0x12, 0x3D, 0xDB, 0x88, 0x76, 0xF4, 0x63, 0x84, 0xA3, 0x18, 0x56, - 0x08, 0x19, 0x8A, 0x04, 0x21, 0xDF, 0xDA, 0xF0, 0x3F, 0x55, 0x6E, 0x50, - 0x00, 0x04, 0xF8, 0x36, 0xD2, 0x1D, 0x41, 0xFA, 0x63, 0xEB, 0xA6, 0xFF, - 0x5E, 0xD9, 0xE5, 0xFC, 0x8B, 0x97, 0x38, 0xF7, 0xD2, 0x28, 0xD5, 0x7C, - 0xAD, 0xF1, 0xEC, 0x84, 0x80, 0x64, 0x9B, 0xC5, 0x83, 0xDF, 0xEA, 0x66, - 0xF8, 0x68, 0x96, 0x68, 0xC2, 0xBC, 0x17, 0x1B, 0xA3, 0xDC, 0x33, 0x28, - 0x05, 0x95, 0x65, 0x87, 0xE3, 0xBF, 0x98, 0xE6, 0xE4, 0x0B, 0x33, 0xD8, - 0x15, 0xAF, 0x21, 0xA4, 0x2B, 0x8E, 0x32, 0x21, 0x45, 0x7D, 0x1D, 0x5D, - 0x37, 0x46, 0xEA, 0x2D, 0xA8, 0x6D, 0x1F, 0x77, 0xCD, 0x3A, 0x7B, 0x79, - 0xAE, 0xD6, 0xD8, 0x67, 0x97, 0x46, 0xB0, 0xC4, 0xF2, 0x3D, 0xBF, 0xB1, - 0x83, 0xB7, 0x61, 0xFF, 0xF9, 0xAB, 0x9E, 0x8D, 0x42, 0x61, 0x85, 0x0D, - 0xD2, 0x1D, 0xD1, 0x0D, 0x1B, 0x9E, 0xFA, 0x9E, 0xA2, 0x6D, 0x28, 0xC5, - 0x83, 0xDF, 0xB6, 0x98, 0x1B, 0x29, 0xE0, 0x2B, 0xC8, 0x74, 0x44, 0x89, - 0x66, 0xC2, 0x98, 0xE1, 0x60, 0x76, 0xE8, 0x11, 0x65, 0x6A, 0xFE, 0x01, - 0xA2, 0xFD, 0x4F, 0x92, 0xEA, 0x1B, 0x40, 0x84, 0x53, 0x08, 0x23, 0x84, - 0x34, 0x83, 0xFC, 0x0E, 0x21, 0x0D, 0xD6, 0x95, 0x69, 0xD6, 0x86, 0xFF, - 0xA9, 0x73, 0x43, 0x02, 0x20, 0x84, 0xA0, 0x3C, 0x37, 0x89, 0x73, 0xE5, - 0x3D, 0x3A, 0xBA, 0xBD, 0x86, 0xF7, 0xBF, 0x92, 0xAB, 0x71, 0xE6, 0xB9, - 0x11, 0x46, 0x5E, 0x9F, 0xC0, 0xAD, 0xAD, 0x3A, 0x69, 0x84, 0x14, 0xF4, - 0xEE, 0x4D, 0xF0, 0xD0, 0xB7, 0xBB, 0xE9, 0xDA, 0x1E, 0xC7, 0xD0, 0xB5, - 0xF8, 0x37, 0x45, 0xA9, 0xA0, 0x99, 0xC5, 0xF4, 0xF9, 0x02, 0x6F, 0x7D, - 0x7F, 0x9C, 0xF9, 0xCB, 0xA5, 0x60, 0x44, 0xAE, 0x23, 0xA5, 0x40, 0x5A, - 0x92, 0x78, 0x4B, 0x94, 0x8E, 0x6D, 0x09, 0x52, 0x1D, 0x61, 0x22, 0x89, - 0x08, 0x00, 0xD5, 0xA2, 0xC3, 0xD2, 0x64, 0x99, 0xF9, 0xCB, 0xCB, 0x94, - 0x16, 0x2A, 0xF8, 0x7E, 0x20, 0x08, 0xAB, 0x06, 0xAE, 0xF0, 0x6E, 0xB1, - 0x1C, 0x9E, 0x10, 0x82, 0x52, 0xAE, 0xC6, 0xE9, 0x97, 0x27, 0x08, 0xC5, - 0x14, 0xD9, 0xBE, 0xEC, 0x35, 0xC7, 0x48, 0x43, 0x90, 0x68, 0x8D, 0x11, - 0xCB, 0x04, 0xD7, 0x23, 0xA4, 0x58, 0x15, 0x0B, 0x21, 0xF1, 0xDB, 0xBF, - 0x46, 0xEF, 0x91, 0x6F, 0x20, 0x42, 0xAD, 0x5B, 0x14, 0x04, 0xD1, 0x46, - 0x7F, 0x37, 0xB9, 0x01, 0x01, 0x08, 0x02, 0x7F, 0xFC, 0x85, 0x37, 0x19, - 0x7D, 0xFE, 0xC7, 0xCC, 0x67, 0x2D, 0x3A, 0xF7, 0x75, 0x90, 0x9F, 0x28, - 0x30, 0xF2, 0xC6, 0x04, 0x8B, 0xA3, 0x85, 0x75, 0x9E, 0x7B, 0x69, 0x08, - 0x76, 0x3D, 0x9E, 0xE5, 0xC1, 0x6F, 0x76, 0x93, 0xEE, 0x8C, 0x7C, 0x5A, - 0x3D, 0x0E, 0x3F, 0x73, 0x28, 0x05, 0x9E, 0xED, 0x53, 0x5C, 0xB2, 0x39, - 0xF1, 0xFC, 0x0C, 0x67, 0x5E, 0x9A, 0xC3, 0xAE, 0x7A, 0x8D, 0x7B, 0x29, - 0x4D, 0x49, 0x28, 0x6A, 0xD0, 0xB9, 0x23, 0xC5, 0xE0, 0x91, 0x0E, 0x5A, - 0x06, 0x12, 0xF5, 0x2E, 0x34, 0x34, 0x72, 0xEB, 0x95, 0x82, 0x81, 0xC3, - 0x0A, 0xDF, 0x75, 0x59, 0x1C, 0xCB, 0x73, 0xE9, 0x9D, 0x05, 0xE6, 0x2E, - 0x17, 0x71, 0x2A, 0xEE, 0x6D, 0x19, 0x4C, 0x95, 0xAF, 0x98, 0x1F, 0x29, - 0x70, 0xFC, 0xA7, 0x63, 0x1C, 0xF9, 0xA6, 0x24, 0xDB, 0x9B, 0xA9, 0x17, - 0xEE, 0x5C, 0x83, 0x08, 0xAE, 0x75, 0xFD, 0xCF, 0x0C, 0xFC, 0xF6, 0xAF, - 0xE1, 0xB7, 0x7D, 0x0B, 0x69, 0xB5, 0xDE, 0xED, 0x5B, 0xAD, 0xD9, 0x82, - 0xEB, 0x0B, 0x80, 0x10, 0xB8, 0xC5, 0x39, 0xE6, 0x3F, 0x7A, 0x83, 0x2B, - 0xEF, 0x4E, 0xA0, 0x94, 0xE4, 0xCC, 0xF3, 0x63, 0x41, 0x06, 0x9E, 0xAB, - 0xD6, 0xBD, 0x10, 0xE1, 0x98, 0xC1, 0x81, 0x2F, 0xB5, 0x73, 0xF0, 0x8B, - 0x1D, 0xC4, 0xB3, 0xD6, 0x75, 0x4F, 0xDD, 0x6C, 0x28, 0x05, 0xBE, 0x1B, - 0xF4, 0xA2, 0xCF, 0xCF, 0xD6, 0x38, 0xFB, 0xDA, 0x3C, 0x17, 0xDF, 0x5A, - 0xA0, 0x9C, 0xB7, 0x1B, 0xFB, 0xE2, 0x86, 0x25, 0x89, 0x24, 0x43, 0xF4, - 0x1F, 0x6C, 0xA3, 0x67, 0x6F, 0x86, 0x4C, 0x77, 0x6C, 0xFD, 0xC8, 0xBA, - 0x06, 0x01, 0x60, 0x08, 0x0C, 0x2B, 0x44, 0xC7, 0x8E, 0x36, 0xDA, 0x86, - 0xD2, 0xCC, 0x5C, 0x58, 0xE6, 0xF4, 0x8B, 0xD3, 0xE4, 0x26, 0x8B, 0x37, - 0x25, 0x02, 0xD2, 0x94, 0xC8, 0xBA, 0x1D, 0xAF, 0xCC, 0x24, 0x56, 0x32, - 0xF6, 0x96, 0xA6, 0xAA, 0x8C, 0x9D, 0xC8, 0xD1, 0xD2, 0x9F, 0x41, 0x6D, - 0xBA, 0x1B, 0xA7, 0x40, 0x98, 0xF8, 0x46, 0x1C, 0xD5, 0xF2, 0x05, 0x54, - 0xDB, 0x6F, 0xA1, 0xB4, 0xF1, 0xDF, 0xF3, 0x5C, 0x57, 0x00, 0x94, 0xEB, - 0x30, 0xFB, 0xF1, 0xC7, 0x9C, 0x7F, 0xEE, 0x55, 0x3C, 0x5B, 0x81, 0xF0, - 0xD9, 0x28, 0x14, 0x23, 0x91, 0x09, 0xF1, 0xC0, 0x37, 0x3A, 0xEB, 0x0D, - 0x38, 0x8C, 0xEB, 0x9D, 0xF6, 0xFE, 0x65, 0xC5, 0xC7, 0xB9, 0x66, 0x3A, - 0xEE, 0xBB, 0x0A, 0xCF, 0xF5, 0x29, 0x2E, 0x3A, 0xCC, 0x5C, 0x2C, 0x30, - 0x76, 0x62, 0x99, 0xB1, 0x93, 0x39, 0xDC, 0xDA, 0xAA, 0xC7, 0x7C, 0xC5, - 0xF0, 0x07, 0x0E, 0xB7, 0xB3, 0xED, 0xA1, 0x56, 0xC2, 0xC9, 0x70, 0xA3, - 0x10, 0xE6, 0x0D, 0x7D, 0xAC, 0x14, 0x18, 0xA1, 0x10, 0xDD, 0x7B, 0x5A, - 0x11, 0x86, 0xC1, 0x47, 0x3F, 0x1F, 0x65, 0x79, 0xA6, 0xBC, 0xA1, 0x70, - 0xAC, 0xC5, 0x30, 0x25, 0xE1, 0x84, 0x45, 0xFB, 0xF6, 0x0C, 0xE9, 0x8E, - 0x08, 0xCA, 0x0F, 0xD2, 0x7F, 0x4B, 0x8B, 0x65, 0x8A, 0x8B, 0x36, 0xBE, - 0x1B, 0x5C, 0xA3, 0x53, 0x59, 0x89, 0x00, 0x5C, 0x5B, 0xEB, 0x41, 0x04, - 0xCB, 0x41, 0x61, 0x82, 0xB0, 0x20, 0xB5, 0x07, 0xDA, 0xBE, 0x8A, 0x8A, - 0xEE, 0xAF, 0x67, 0x82, 0x6A, 0xEE, 0x75, 0xB6, 0x14, 0x00, 0x21, 0x25, - 0xA5, 0xC9, 0x4B, 0x5C, 0xFE, 0xF9, 0xBF, 0xA7, 0x34, 0x3B, 0xB5, 0x9A, - 0xFC, 0xB1, 0xEE, 0x18, 0x41, 0xAA, 0xDD, 0xE2, 0x91, 0xEF, 0xF4, 0xB0, - 0xFD, 0x91, 0x96, 0xEB, 0xD6, 0x72, 0xFF, 0x54, 0xB9, 0xBA, 0x3E, 0xC9, - 0x66, 0x7F, 0x7F, 0x9D, 0x63, 0x04, 0xC1, 0xA8, 0xE8, 0xBB, 0x81, 0xF4, - 0xF9, 0x3E, 0x28, 0x2F, 0xD8, 0x2E, 0x53, 0x75, 0xA7, 0xDA, 0xCA, 0xD4, - 0x7D, 0xE5, 0xCF, 0xD5, 0xA2, 0x47, 0x71, 0xB1, 0xC6, 0xD2, 0x54, 0x95, - 0xA5, 0x89, 0x2A, 0xB3, 0x23, 0x05, 0xF2, 0x33, 0xD5, 0x60, 0xD6, 0xE4, - 0xD3, 0x98, 0x39, 0x99, 0x21, 0x83, 0x48, 0xC2, 0xA2, 0xEF, 0x50, 0x1B, - 0xDB, 0x8F, 0xB5, 0x11, 0x49, 0x85, 0x37, 0x31, 0x5A, 0xB5, 0xE6, 0x82, - 0xEA, 0x8F, 0x4D, 0x79, 0xAC, 0xBA, 0xEF, 0x03, 0xC1, 0x59, 0x9A, 0x28, - 0x72, 0xF6, 0x95, 0x29, 0x0A, 0xF3, 0xD5, 0x2D, 0x8C, 0xBF, 0xFE, 0xD9, - 0x61, 0x83, 0x81, 0x23, 0xED, 0x1C, 0xF8, 0x42, 0x27, 0x66, 0x34, 0xB2, - 0x2E, 0xEC, 0xF7, 0x9A, 0x90, 0x7F, 0x51, 0xFF, 0xFE, 0xD2, 0x04, 0x11, - 0x06, 0x69, 0xE1, 0x8B, 0x08, 0x84, 0x3B, 0x21, 0xBE, 0x1D, 0x95, 0x3C, - 0x86, 0x8A, 0x6E, 0x43, 0x09, 0x0B, 0xED, 0xED, 0xFD, 0xEC, 0xB0, 0xF5, - 0x0C, 0x40, 0x48, 0xAA, 0x8B, 0x33, 0xCC, 0x9F, 0x78, 0x6D, 0x4D, 0xE6, - 0xD7, 0x6A, 0x2D, 0x38, 0xC3, 0x14, 0x74, 0xEF, 0x8A, 0xF3, 0xE0, 0x37, - 0xBB, 0xE9, 0xDD, 0x97, 0xBC, 0xA7, 0x8C, 0xDF, 0xAE, 0x78, 0x38, 0xB5, - 0x20, 0x10, 0xC5, 0x0C, 0x4B, 0x42, 0x11, 0x23, 0x08, 0x3A, 0x22, 0x78, - 0x3D, 0x3D, 0x57, 0x61, 0x57, 0x3C, 0x3C, 0xA7, 0xDE, 0x29, 0x36, 0x6A, - 0x10, 0x8A, 0xAE, 0xCE, 0x5C, 0x3C, 0x57, 0xE1, 0x54, 0x3D, 0x9C, 0x5A, - 0xB0, 0xFF, 0x5E, 0x29, 0x38, 0xE4, 0xA6, 0xAB, 0x28, 0x05, 0xA5, 0x9C, - 0x43, 0x39, 0x67, 0x23, 0x44, 0x60, 0xF0, 0xCB, 0x73, 0x35, 0xAA, 0xCB, - 0x4E, 0x50, 0xB3, 0x6E, 0xC9, 0xA6, 0x94, 0x73, 0x50, 0x9E, 0x5A, 0xB3, - 0xF7, 0xAE, 0xD6, 0x1B, 0x94, 0x0A, 0x8C, 0x2F, 0x92, 0xB4, 0xE8, 0x3D, - 0xD0, 0xC6, 0x8E, 0x63, 0x6D, 0x44, 0xD2, 0x6B, 0x0D, 0x7F, 0xAD, 0xE5, - 0x19, 0x60, 0x84, 0x40, 0x84, 0x40, 0x86, 0x50, 0x46, 0x02, 0x15, 0xE9, - 0x0E, 0xA2, 0x32, 0xAB, 0x93, 0x88, 0xDA, 0x34, 0xF8, 0x55, 0x3C, 0xDB, - 0x63, 0x6E, 0x64, 0x99, 0x93, 0xBF, 0x1A, 0x63, 0x71, 0xA2, 0xB8, 0xBE, - 0x06, 0x5F, 0xFD, 0x1A, 0x00, 0x84, 0x61, 0x60, 0x46, 0xE2, 0x98, 0xD1, - 0x18, 0xDD, 0x07, 0x7A, 0x39, 0xF8, 0x6C, 0x7F, 0xD0, 0x32, 0x1D, 0x10, - 0xCA, 0x25, 0x10, 0x14, 0x75, 0x95, 0x09, 0x0B, 0x40, 0xA2, 0x8C, 0x38, - 0xC4, 0xFB, 0x20, 0xBE, 0x17, 0x15, 0xD9, 0x89, 0x1F, 0xEA, 0x46, 0x89, - 0xD8, 0x6A, 0x78, 0x9F, 0x36, 0xFC, 0xCF, 0x1C, 0x5B, 0x0B, 0x80, 0x52, - 0xF8, 0x8E, 0x8D, 0xEF, 0x38, 0x20, 0x0C, 0xA4, 0x69, 0x20, 0x4C, 0x13, - 0xAF, 0x66, 0x63, 0x5A, 0x82, 0xA1, 0x23, 0x29, 0x1E, 0xFA, 0x76, 0x37, - 0xED, 0x43, 0xF1, 0x7B, 0x22, 0x84, 0xB7, 0x51, 0xAF, 0x6E, 0xC1, 0xE6, - 0xFC, 0x1B, 0x0B, 0x4C, 0x9C, 0xCA, 0xE3, 0xD4, 0x7C, 0x3A, 0xB6, 0x27, - 0x18, 0x38, 0x98, 0xA6, 0xAD, 0x3F, 0x86, 0x15, 0x35, 0x70, 0x2A, 0x1E, - 0xF3, 0xA3, 0x65, 0x2E, 0x7F, 0x98, 0x63, 0x71, 0xBC, 0x8C, 0x34, 0x60, - 0xF8, 0x68, 0x96, 0xA1, 0x07, 0xB2, 0x18, 0x96, 0xC4, 0xA9, 0x7A, 0xE4, - 0xA6, 0x6B, 0x8C, 0x9F, 0xCA, 0x33, 0x7B, 0xA1, 0xC8, 0xC2, 0x78, 0xB9, - 0x21, 0x14, 0xB0, 0xC1, 0x64, 0xE1, 0x46, 0xBE, 0x7A, 0x7D, 0x54, 0xB5, - 0x22, 0x06, 0xD1, 0xA4, 0x45, 0xCF, 0xBE, 0x56, 0xB6, 0x1F, 0x6B, 0x27, - 0x9A, 0x0D, 0xAF, 0x99, 0xE6, 0x2B, 0x90, 0x16, 0xC8, 0x08, 0x88, 0x30, - 0xCA, 0x88, 0xE2, 0x9B, 0x2D, 0x88, 0xF8, 0x36, 0x88, 0x6D, 0x87, 0xD8, - 0x10, 0xBE, 0xD1, 0xD1, 0x18, 0x65, 0xA5, 0x9F, 0x43, 0xE6, 0x7E, 0x85, - 0x37, 0xF6, 0x53, 0x46, 0xDE, 0x3E, 0xC3, 0xB9, 0xD7, 0xA6, 0x29, 0xD7, - 0x1B, 0x6F, 0xAC, 0x8A, 0x8E, 0x42, 0x5A, 0x16, 0x56, 0x2C, 0x89, 0x19, - 0x4D, 0x10, 0xEB, 0xEC, 0xA5, 0xFD, 0xC8, 0xD3, 0x64, 0xF7, 0x3C, 0x44, - 0xEB, 0xFE, 0x47, 0xC0, 0xB4, 0x70, 0x01, 0x94, 0x8F, 0xE1, 0x2F, 0x20, - 0xFC, 0xDC, 0x06, 0x5F, 0x4E, 0xE2, 0xCB, 0x0C, 0xBE, 0xD1, 0xCE, 0xBA, - 0x99, 0x88, 0xE6, 0x33, 0xCF, 0x16, 0x02, 0x20, 0xF0, 0xEC, 0x2A, 0xF6, - 0xF2, 0x3C, 0x66, 0x34, 0x8A, 0x5B, 0xB5, 0x11, 0x52, 0x62, 0x84, 0x2C, - 0x22, 0x31, 0xC1, 0xF6, 0x07, 0x53, 0x1C, 0x7E, 0xB6, 0x83, 0x74, 0x57, - 0xB0, 0x6E, 0x5C, 0x4D, 0xF5, 0xFC, 0xF4, 0xE3, 0xF9, 0x85, 0x14, 0xB8, - 0x35, 0x8F, 0xCA, 0xB2, 0xC3, 0xE5, 0xE3, 0x79, 0x4E, 0xFC, 0x72, 0x9A, - 0xC5, 0x89, 0x72, 0xC3, 0x09, 0x36, 0x7B, 0xA9, 0xC8, 0xC7, 0xBF, 0x9A, - 0xA6, 0x73, 0x7B, 0x82, 0xD6, 0xFE, 0x18, 0x33, 0x17, 0x8B, 0x2C, 0x4E, - 0x54, 0xD6, 0x5D, 0xE7, 0xD4, 0xD9, 0x02, 0xEF, 0xFD, 0x78, 0x92, 0x78, - 0x4B, 0x88, 0xE5, 0xD9, 0x20, 0xAA, 0xED, 0x76, 0xB0, 0x72, 0x0D, 0xE1, - 0xB8, 0x49, 0x24, 0x6E, 0xD1, 0xB5, 0xA7, 0x85, 0x1D, 0xC7, 0xDA, 0x88, - 0xB5, 0x84, 0xEB, 0x36, 0x24, 0xC1, 0x08, 0x83, 0x8C, 0xA2, 0xCC, 0x34, - 0x2A, 0xDA, 0x8B, 0x48, 0xEC, 0xC0, 0x0F, 0x6D, 0x83, 0xE8, 0x50, 0x50, - 0x56, 0x6D, 0x13, 0x7C, 0x99, 0x45, 0xB4, 0x7F, 0x87, 0x89, 0x77, 0xC7, - 0x38, 0xF7, 0xFA, 0xCB, 0x94, 0x17, 0xCB, 0x41, 0x06, 0x9F, 0x61, 0x62, - 0x46, 0x13, 0x98, 0xB1, 0x24, 0x66, 0x34, 0x4E, 0xBC, 0x7B, 0x90, 0xB6, - 0x43, 0x4F, 0xD1, 0xB2, 0xF7, 0x41, 0xD2, 0xDB, 0x0E, 0x5E, 0x53, 0x78, - 0x25, 0xB8, 0x89, 0x06, 0x9E, 0xD1, 0x01, 0x46, 0xC7, 0xF5, 0xEE, 0xF6, - 0xA7, 0xF7, 0x60, 0x35, 0x77, 0x9C, 0xCD, 0x05, 0x40, 0x04, 0x0E, 0x40, - 0xA7, 0x5C, 0x40, 0x9A, 0x16, 0xD2, 0xF2, 0x51, 0x4A, 0x10, 0x8E, 0x99, - 0xEC, 0x79, 0x3C, 0xC5, 0x91, 0x67, 0x3B, 0x08, 0xC7, 0x8C, 0x46, 0xAC, - 0x7F, 0x39, 0xEF, 0x50, 0xCA, 0xD9, 0x48, 0x29, 0x48, 0xB5, 0x47, 0xB0, - 0x22, 0x77, 0xBE, 0x17, 0x9F, 0x90, 0x41, 0x33, 0xC9, 0x72, 0xCE, 0x61, - 0xFC, 0x64, 0x9E, 0x8F, 0x5F, 0x98, 0x61, 0xFA, 0x42, 0x11, 0xDF, 0xD9, - 0xB8, 0xA2, 0xCC, 0xCC, 0xC5, 0x22, 0x33, 0x17, 0x8A, 0x1B, 0x17, 0x9C, - 0x50, 0x50, 0x2D, 0xB9, 0x54, 0x8A, 0x2B, 0x85, 0x25, 0x57, 0xE3, 0xDC, - 0xAF, 0x5A, 0x0A, 0xAF, 0xBF, 0x86, 0xB5, 0xE9, 0x8D, 0x2B, 0x27, 0x22, - 0x58, 0xE3, 0x9B, 0x61, 0x83, 0x70, 0xCC, 0x24, 0x92, 0x0E, 0xD3, 0x7F, - 0xA0, 0x85, 0xBE, 0xBD, 0x19, 0xA2, 0xD9, 0x30, 0x98, 0x71, 0x90, 0x31, - 0x94, 0x99, 0xC0, 0x37, 0x5A, 0x10, 0xF1, 0x41, 0x54, 0x74, 0x3B, 0x24, - 0x0F, 0xE1, 0xCB, 0x0C, 0xD7, 0x7E, 0xEA, 0x66, 0x28, 0x7C, 0x15, 0x22, - 0xBE, 0xE3, 0x59, 0xB2, 0xFB, 0x4F, 0xC3, 0x99, 0x77, 0x31, 0xA2, 0x71, - 0x12, 0x3D, 0xC3, 0x64, 0x77, 0x3D, 0x40, 0x66, 0xE7, 0x11, 0xD2, 0x3B, - 0x0E, 0x13, 0x4E, 0xB7, 0xD6, 0x97, 0x6E, 0x37, 0x7A, 0x5E, 0x4D, 0xB3, - 0x70, 0x63, 0x81, 0x40, 0x86, 0x81, 0x61, 0x59, 0xB8, 0x35, 0x87, 0x64, - 0xAB, 0xA4, 0x6F, 0x5F, 0x82, 0x48, 0x22, 0x68, 0xDF, 0xB4, 0xB2, 0xEE, - 0x3D, 0xFE, 0xDC, 0x14, 0x67, 0x5F, 0x9B, 0xC3, 0x0C, 0x4B, 0x1E, 0xFF, - 0x83, 0x41, 0x86, 0x8F, 0x64, 0xAF, 0xEB, 0x81, 0xBE, 0x55, 0x84, 0x14, - 0xF8, 0x9E, 0x4F, 0x69, 0xC1, 0x66, 0xEE, 0x72, 0x89, 0x73, 0xAF, 0x2F, - 0x70, 0xF9, 0x83, 0xA5, 0xA0, 0xC8, 0x88, 0x14, 0x5B, 0x0F, 0x52, 0x9B, - 0xF8, 0xD7, 0x94, 0x0A, 0x44, 0xC3, 0x8A, 0x18, 0x84, 0xA2, 0x16, 0x56, - 0x48, 0x60, 0x84, 0x0C, 0x0C, 0x53, 0xD4, 0xFB, 0x0E, 0x06, 0x5E, 0x6F, - 0xDF, 0xF3, 0x71, 0x6C, 0xBF, 0x11, 0x51, 0x57, 0xC9, 0xD7, 0xA8, 0x95, - 0xEA, 0xD9, 0x8E, 0x86, 0x41, 0x28, 0x99, 0x05, 0x05, 0xA1, 0x78, 0x88, - 0xB6, 0x6D, 0x2D, 0x74, 0xED, 0x48, 0xD3, 0xB9, 0x2B, 0x8D, 0x15, 0x32, - 0x50, 0x32, 0x82, 0x92, 0x09, 0x54, 0x62, 0x07, 0x2A, 0xB2, 0x0D, 0x12, - 0xBB, 0xF0, 0xCD, 0x5E, 0x56, 0xA3, 0xE1, 0x6E, 0x3E, 0x39, 0x42, 0xF9, - 0x1E, 0x99, 0x1D, 0x87, 0xD8, 0xFB, 0x27, 0xFF, 0x2D, 0xC5, 0xB1, 0x73, - 0xC4, 0xBB, 0x06, 0x49, 0xF4, 0xED, 0x44, 0x5A, 0xE1, 0xF5, 0x45, 0x33, - 0x74, 0x94, 0x9D, 0x66, 0x03, 0x6E, 0x2C, 0x14, 0xB8, 0x3E, 0xAD, 0x14, - 0xC2, 0x0D, 0x46, 0xFC, 0x95, 0xA9, 0xB3, 0x08, 0x82, 0x59, 0xCE, 0xBC, - 0x36, 0xCB, 0xD9, 0x37, 0xE6, 0x70, 0x6C, 0x1F, 0xBB, 0xE6, 0x71, 0xEA, - 0xA5, 0x39, 0x32, 0x9D, 0x51, 0x5A, 0xFB, 0x62, 0xD7, 0x06, 0x8E, 0x7C, - 0x02, 0x82, 0x2E, 0x30, 0x8A, 0xE2, 0x42, 0xD0, 0x69, 0xF6, 0xC2, 0x9B, - 0x81, 0xE1, 0x57, 0x0A, 0x6E, 0x90, 0x11, 0x77, 0x93, 0x82, 0xA3, 0x54, - 0xF0, 0xAF, 0x50, 0xD4, 0x24, 0xDE, 0x12, 0x21, 0x96, 0x36, 0x69, 0x1D, - 0x88, 0xD3, 0xD2, 0x9B, 0x20, 0xD1, 0x6A, 0x11, 0xCF, 0x44, 0x89, 0x24, - 0x0D, 0x12, 0x2D, 0xA1, 0x60, 0x9B, 0xBB, 0xDE, 0xA6, 0xAA, 0xB0, 0x60, - 0xE3, 0x7B, 0x02, 0xB7, 0x66, 0x73, 0xE5, 0xC3, 0x05, 0xCE, 0xBC, 0x3A, - 0x4B, 0x71, 0xBE, 0x4C, 0xDB, 0xDE, 0x87, 0xE8, 0x7D, 0xFA, 0x77, 0x50, - 0xBE, 0x4F, 0xFB, 0xB6, 0x16, 0x32, 0xFD, 0xED, 0x41, 0xD3, 0x4A, 0x05, - 0x2E, 0x20, 0x62, 0xDD, 0x78, 0xD6, 0xB6, 0xC0, 0x8B, 0xAF, 0xD6, 0x1A, - 0xFC, 0x27, 0xBB, 0x47, 0xCA, 0xF7, 0x48, 0xF4, 0x6E, 0x27, 0xD9, 0xBB, - 0xA3, 0x9E, 0xA1, 0xA7, 0x74, 0xFA, 0xAC, 0xE6, 0x86, 0xB8, 0xBE, 0x00, - 0xAC, 0xBC, 0x9F, 0xF5, 0x80, 0x74, 0x29, 0x54, 0xBD, 0xDA, 0x4B, 0x30, - 0xFD, 0x9D, 0x38, 0x93, 0x67, 0xE4, 0xBD, 0x25, 0xEC, 0x8A, 0x57, 0x6F, - 0xCD, 0x2D, 0x98, 0x3E, 0xBF, 0xCC, 0xEC, 0x48, 0x91, 0x4C, 0x67, 0xA4, - 0xE1, 0x79, 0xBF, 0x65, 0x44, 0x10, 0x0E, 0xEB, 0x3A, 0x3E, 0xCB, 0x53, - 0x95, 0xC0, 0x79, 0xF7, 0x41, 0x8E, 0x91, 0xF7, 0x97, 0xA8, 0x2C, 0x3B, - 0x48, 0x43, 0x6C, 0xDA, 0x7A, 0x6A, 0xD3, 0xAF, 0x54, 0x37, 0xFC, 0x70, - 0xC2, 0x24, 0xDB, 0x1D, 0xA7, 0x6B, 0x67, 0x92, 0x81, 0x23, 0xED, 0xB4, - 0xF7, 0x87, 0x89, 0x24, 0x43, 0xAB, 0xB6, 0x19, 0x98, 0x13, 0xBE, 0xBB, - 0x6A, 0xA0, 0x66, 0x48, 0xD2, 0xD2, 0x53, 0xDF, 0xE3, 0x16, 0x11, 0xDA, - 0x06, 0x13, 0xD4, 0xCA, 0x1E, 0x27, 0x9E, 0x77, 0x19, 0xFC, 0xEA, 0xDF, - 0x61, 0xE8, 0x6B, 0x7F, 0xDC, 0x28, 0x9C, 0xE1, 0xAF, 0x54, 0x35, 0x11, - 0xEB, 0x3E, 0x98, 0x2D, 0xA2, 0x69, 0x6E, 0x1D, 0xA5, 0x50, 0x7A, 0x7A, - 0xAF, 0xB9, 0x49, 0xB6, 0x16, 0x00, 0x29, 0xEA, 0x0E, 0x23, 0xD5, 0xD8, - 0x56, 0x8A, 0xA5, 0x4D, 0xD2, 0x1D, 0x61, 0x00, 0xEC, 0xB2, 0xCB, 0xE8, - 0x89, 0x1C, 0x0B, 0x13, 0xE5, 0x75, 0x46, 0xE8, 0x2B, 0xC5, 0xDC, 0xE5, - 0x22, 0x03, 0x07, 0xD2, 0xC4, 0xB3, 0xA1, 0x5B, 0x9A, 0x7D, 0xAE, 0x24, - 0xBF, 0xD8, 0x15, 0x8F, 0xFC, 0x4C, 0xB5, 0x3E, 0xD5, 0x9F, 0x67, 0xFC, - 0xD4, 0x32, 0x6E, 0xCD, 0x0F, 0x62, 0xE4, 0x6F, 0xD0, 0xF0, 0x57, 0x0C, - 0x7E, 0x65, 0x09, 0x1C, 0x4B, 0x5B, 0x64, 0xBA, 0xE3, 0xF4, 0xED, 0x4F, - 0xB3, 0xFD, 0x58, 0x07, 0x2D, 0x7D, 0xD1, 0xFA, 0x71, 0x6A, 0xE3, 0x44, - 0x99, 0x8D, 0xCE, 0x07, 0x08, 0x82, 0x48, 0x48, 0x21, 0x4D, 0xAC, 0x44, - 0x1B, 0xB5, 0x7C, 0x1E, 0x67, 0x79, 0x11, 0x33, 0x9E, 0x42, 0xAC, 0x18, - 0xA3, 0x50, 0xAB, 0x09, 0xF1, 0x6B, 0xEA, 0xA0, 0xE9, 0x62, 0x96, 0x9A, - 0x7B, 0x81, 0xCD, 0x05, 0x40, 0x29, 0x0C, 0x2B, 0x42, 0x38, 0x13, 0x6C, - 0xFD, 0x28, 0x05, 0x66, 0x28, 0x08, 0xFA, 0x89, 0x24, 0x4D, 0x84, 0x08, - 0x7A, 0xB7, 0xCD, 0x5D, 0xBE, 0xD6, 0xA9, 0x26, 0x08, 0x3A, 0xC8, 0xD8, - 0x35, 0x9F, 0xF8, 0x4D, 0x36, 0x6C, 0x58, 0x89, 0x7E, 0xAB, 0x16, 0x5D, - 0xE6, 0xAF, 0x94, 0x99, 0xB9, 0x54, 0xE4, 0xD2, 0xBB, 0x8B, 0xCC, 0x5E, - 0x2A, 0xE2, 0x54, 0xFD, 0xAD, 0x47, 0xFC, 0xFA, 0x5A, 0x7E, 0x75, 0xD9, - 0x1B, 0x8C, 0xC0, 0x91, 0xA4, 0x49, 0x24, 0x11, 0x22, 0x1C, 0xB7, 0x48, - 0xB6, 0x86, 0xE8, 0xDE, 0x95, 0xA4, 0xEF, 0x40, 0x1B, 0xAD, 0x7D, 0xD1, - 0xE0, 0xBB, 0xDD, 0xEC, 0xAE, 0x45, 0x7D, 0x56, 0xE2, 0x39, 0x3E, 0x17, - 0xDE, 0x5A, 0x62, 0xE4, 0xC3, 0x12, 0xD5, 0x7C, 0x85, 0x4B, 0x3F, 0xFD, - 0xF7, 0xB8, 0x95, 0x65, 0x3A, 0x1F, 0x78, 0x92, 0x68, 0x47, 0x1F, 0x46, - 0x38, 0x86, 0x10, 0xC1, 0x6E, 0x8A, 0x5B, 0x2D, 0xA1, 0x7C, 0x1F, 0x01, - 0x84, 0xD2, 0xAD, 0x81, 0xAF, 0x40, 0xA3, 0xB9, 0xCB, 0x6C, 0x1D, 0x09, - 0x68, 0x5A, 0x58, 0xC9, 0x0C, 0xBE, 0xEB, 0x22, 0x50, 0x74, 0x6D, 0x8F, - 0x32, 0x78, 0x28, 0x15, 0xAC, 0x6B, 0xFD, 0xA0, 0x7F, 0xDB, 0xE2, 0x54, - 0x25, 0x28, 0x07, 0x55, 0x8F, 0x1B, 0x0F, 0x9C, 0x70, 0x82, 0x52, 0xDE, - 0xC6, 0xB5, 0x6F, 0x70, 0xAA, 0x5B, 0x37, 0x28, 0xE5, 0x2B, 0x96, 0x26, - 0x2B, 0x2C, 0x4D, 0x54, 0x98, 0xBE, 0x50, 0x64, 0xE4, 0xBD, 0xA5, 0x60, - 0x3B, 0xAF, 0xDE, 0x0F, 0x7E, 0x23, 0xC3, 0x5F, 0x29, 0x1A, 0xAA, 0x7C, - 0x45, 0x28, 0x66, 0x92, 0x6C, 0x0D, 0x11, 0x8A, 0x59, 0x98, 0x61, 0x93, - 0x68, 0xC2, 0x0C, 0x44, 0xAB, 0x33, 0x42, 0xB2, 0x2D, 0x46, 0xA2, 0x2D, - 0x4A, 0xC7, 0x60, 0x8C, 0x50, 0x54, 0x06, 0x42, 0x71, 0x0B, 0xDB, 0x95, - 0x52, 0x0A, 0xEC, 0x9A, 0xC7, 0xD2, 0x64, 0x8D, 0x99, 0x8B, 0x45, 0x4E, - 0xFE, 0x66, 0x81, 0xDC, 0x54, 0x0D, 0x69, 0x1A, 0x14, 0x27, 0xC7, 0x39, - 0xFD, 0x17, 0xFF, 0x8A, 0xA9, 0x37, 0x9E, 0x23, 0xB3, 0xE3, 0x20, 0x56, - 0x32, 0x8B, 0x10, 0x12, 0xB7, 0xBC, 0x4C, 0x2D, 0xBF, 0x80, 0xEF, 0x79, - 0x08, 0x21, 0x48, 0xF4, 0x6C, 0x63, 0xF8, 0xEB, 0x7F, 0x48, 0xAC, 0xAB, - 0x7F, 0xC3, 0xE8, 0x4A, 0x8D, 0xE6, 0xD3, 0x62, 0x4B, 0x01, 0x50, 0xBE, - 0x87, 0x5B, 0x2E, 0xE0, 0x96, 0x2B, 0xC4, 0xD2, 0x26, 0xDB, 0x1E, 0x4C, - 0xD1, 0xB3, 0x27, 0x89, 0xF2, 0x15, 0x95, 0x65, 0x97, 0xA5, 0xC9, 0x32, - 0x4E, 0xCD, 0x6B, 0x6C, 0xFD, 0xB5, 0xF4, 0x46, 0x99, 0x1F, 0x2D, 0x53, - 0x58, 0xA8, 0xD5, 0xE3, 0xC2, 0xAE, 0x57, 0x2E, 0x7C, 0x75, 0x9A, 0xBF, - 0x34, 0x59, 0x61, 0xEE, 0x4A, 0x89, 0x2B, 0x1F, 0xE4, 0x98, 0x3A, 0x57, - 0xA0, 0x30, 0x5F, 0x6B, 0x38, 0xF6, 0x36, 0x73, 0xEE, 0xF9, 0xEE, 0xCA, - 0x3A, 0x3E, 0x46, 0xBA, 0x33, 0x42, 0xA6, 0x3B, 0x4A, 0x4B, 0x5F, 0x94, - 0x68, 0x3A, 0x4A, 0x38, 0x16, 0x8C, 0xF6, 0x2B, 0x79, 0x09, 0x2B, 0xB3, - 0x01, 0xFF, 0x06, 0xA7, 0xF9, 0x9B, 0x5D, 0xEF, 0xF2, 0xBC, 0xCD, 0x85, - 0xB7, 0x97, 0xB8, 0xF4, 0x7E, 0x9E, 0xB9, 0xCB, 0x95, 0xC0, 0xF7, 0xB1, - 0x12, 0x61, 0x58, 0xCF, 0xA6, 0x59, 0xBA, 0x78, 0x9E, 0xC5, 0xF3, 0x67, - 0x56, 0xB7, 0xDD, 0xEA, 0xFE, 0x93, 0x46, 0x71, 0x1C, 0xC3, 0xA4, 0xF3, - 0xD8, 0xE7, 0x89, 0x75, 0xF6, 0xE9, 0x6D, 0x75, 0xCD, 0x5D, 0x65, 0x8B, - 0x38, 0x00, 0x81, 0x57, 0xAB, 0x50, 0x9A, 0x1E, 0xC5, 0xB5, 0x1D, 0x22, - 0xC9, 0x28, 0x99, 0xEE, 0x48, 0x3D, 0x76, 0x45, 0x90, 0x9B, 0xA9, 0xB0, - 0x34, 0x59, 0x09, 0x4A, 0x3B, 0x45, 0x4C, 0x76, 0x3F, 0xDE, 0xCE, 0x9E, - 0x27, 0xDA, 0xF9, 0xF0, 0x97, 0x53, 0x9C, 0x7E, 0x65, 0x76, 0xEB, 0xB6, - 0xA0, 0x32, 0x48, 0x6B, 0x2D, 0x2E, 0xD8, 0xCC, 0x5E, 0x2A, 0x31, 0x7D, - 0xBE, 0xC0, 0xD4, 0xF9, 0x02, 0x33, 0x17, 0x8B, 0xD8, 0x65, 0x2F, 0x48, - 0x6C, 0xD9, 0xA2, 0x86, 0x80, 0xF2, 0x15, 0x86, 0x25, 0xE9, 0xDC, 0x9E, - 0x60, 0xF0, 0x48, 0x1B, 0xDD, 0xBB, 0xD3, 0xB4, 0x0F, 0xC6, 0x1B, 0x5B, - 0x93, 0xC1, 0x16, 0x7E, 0x30, 0x23, 0xF1, 0xDC, 0x6B, 0xD7, 0xDA, 0xEB, - 0x3A, 0x55, 0xDF, 0xA0, 0x16, 0x08, 0x11, 0x14, 0xEC, 0x38, 0xF9, 0xE2, - 0x1C, 0x1F, 0xFE, 0x7C, 0x1E, 0xBB, 0xEA, 0x6D, 0xEC, 0x87, 0x58, 0x09, - 0xB9, 0x95, 0x46, 0xFD, 0xBF, 0xD7, 0x7E, 0x8F, 0x48, 0xA6, 0x95, 0x44, - 0xCF, 0x50, 0xE3, 0x18, 0x8D, 0xE6, 0x6E, 0xB1, 0xE5, 0x0C, 0xC0, 0xAD, - 0x94, 0x28, 0x4E, 0x5D, 0x41, 0x4A, 0x49, 0xAA, 0x2D, 0x4C, 0x6B, 0x5F, - 0x14, 0xA5, 0x14, 0xD2, 0x90, 0xE4, 0x67, 0xAB, 0x2C, 0x4E, 0x96, 0x91, - 0x52, 0x30, 0x78, 0x30, 0xCB, 0xF6, 0x87, 0x5A, 0x89, 0xB7, 0x84, 0x18, - 0x3A, 0x92, 0x65, 0xE2, 0xEC, 0x32, 0x9E, 0xED, 0xAD, 0xF3, 0x4A, 0xAF, - 0x8C, 0xF6, 0xBE, 0x17, 0x94, 0x9C, 0x9E, 0xBE, 0x50, 0x60, 0xE6, 0x7C, - 0x91, 0xC9, 0xD3, 0xCB, 0x2C, 0x4E, 0x54, 0x1A, 0xCB, 0x80, 0xEB, 0x39, - 0xF6, 0x7C, 0x4F, 0x11, 0xCF, 0x86, 0xD9, 0xFE, 0x70, 0x3B, 0xBB, 0x1F, - 0x6F, 0xA5, 0x63, 0x5B, 0x2A, 0x38, 0x6F, 0xBD, 0x32, 0xCE, 0x96, 0xD4, - 0x3F, 0xA3, 0x56, 0x76, 0xF1, 0xDC, 0x20, 0x7A, 0x31, 0x9A, 0xB4, 0x6E, - 0xA8, 0xA5, 0xB8, 0x90, 0x82, 0xD9, 0x2B, 0x65, 0x4E, 0xBD, 0x34, 0x8F, - 0x53, 0xF3, 0xD7, 0x5D, 0x67, 0x50, 0xAE, 0xDA, 0x43, 0xF9, 0x3E, 0x56, - 0x3C, 0x41, 0x38, 0x91, 0x44, 0x18, 0x81, 0xE1, 0x97, 0xE7, 0xE7, 0xF0, - 0xEC, 0x20, 0x8A, 0x72, 0xA5, 0xFD, 0x79, 0xE7, 0x83, 0x4F, 0x60, 0xC5, - 0x92, 0x77, 0xFB, 0xD9, 0x6B, 0x34, 0x9B, 0x0B, 0x80, 0x40, 0xE0, 0xBB, - 0x36, 0xF6, 0xF2, 0x12, 0x56, 0xC4, 0xA0, 0xA5, 0x2F, 0x46, 0x3C, 0x1B, - 0xC2, 0x73, 0x82, 0xF2, 0x53, 0xC5, 0x45, 0x9B, 0x6A, 0xD1, 0xA3, 0x6F, - 0x6F, 0x9A, 0x7D, 0x9F, 0x6F, 0x27, 0xD5, 0x11, 0xC6, 0x73, 0x7C, 0xDA, - 0x87, 0xE2, 0xA4, 0x3B, 0xC2, 0x54, 0x96, 0x5D, 0xCC, 0x7A, 0xA1, 0x08, - 0xC3, 0x14, 0x94, 0x72, 0x0E, 0x73, 0x97, 0xCB, 0x4C, 0x9E, 0x5D, 0x66, - 0xE6, 0x42, 0x91, 0xE9, 0xF3, 0x05, 0xAA, 0xC5, 0xA0, 0x1B, 0xCC, 0x8D, - 0x6E, 0x15, 0x2A, 0x05, 0xD9, 0x9E, 0x18, 0x07, 0xBF, 0xD2, 0xCB, 0xCE, - 0x47, 0xDB, 0x89, 0xA6, 0xCC, 0x20, 0xBB, 0xEE, 0x46, 0xA6, 0xF4, 0xF5, - 0x4E, 0xB7, 0x53, 0x67, 0x72, 0xCC, 0x5E, 0x2C, 0xE2, 0xD4, 0x7C, 0x84, - 0x80, 0x6C, 0x5F, 0x8C, 0xFE, 0x03, 0x69, 0x62, 0x29, 0x6B, 0x4B, 0x11, - 0x10, 0x42, 0xE1, 0xD8, 0x16, 0xD5, 0x6A, 0x0C, 0x44, 0xA1, 0x1E, 0x08, - 0xE4, 0x21, 0x0D, 0x83, 0x64, 0xDF, 0x10, 0xA9, 0xC1, 0x9D, 0xC4, 0xBB, - 0x06, 0x89, 0x75, 0xF4, 0x10, 0xAA, 0x0B, 0x80, 0x00, 0x4A, 0x73, 0xB3, - 0xD4, 0x96, 0xE6, 0xA8, 0xCC, 0x4F, 0x52, 0x5B, 0x5E, 0xC4, 0x8A, 0x27, - 0xD9, 0xF6, 0x5B, 0x7F, 0x84, 0x11, 0x89, 0xDE, 0xED, 0x67, 0xAF, 0xD1, - 0x5C, 0x2F, 0x0E, 0x20, 0x58, 0xC9, 0x1B, 0x96, 0x24, 0x94, 0x30, 0x1B, - 0x31, 0xFF, 0x95, 0x92, 0x4B, 0x71, 0xD1, 0x26, 0xD3, 0x19, 0x61, 0xFF, - 0xE7, 0x3B, 0xE8, 0x18, 0x4A, 0x34, 0x1C, 0x6A, 0x56, 0x44, 0xD2, 0xBD, - 0x33, 0xC5, 0xF2, 0x6C, 0x0D, 0xC3, 0x92, 0x08, 0x01, 0x67, 0x5F, 0x5B, - 0xE0, 0xCA, 0xF1, 0x25, 0xE6, 0x46, 0xCA, 0xCC, 0x5D, 0x29, 0xA1, 0x3C, - 0x85, 0xB8, 0x8E, 0x37, 0xDF, 0xAF, 0x8F, 0xCA, 0x52, 0xAE, 0xCE, 0x1C, - 0x32, 0x5D, 0x51, 0x1E, 0xFA, 0xED, 0x01, 0xB6, 0x1F, 0x6B, 0xC3, 0xB0, - 0xE4, 0xBA, 0xFD, 0xF9, 0xEB, 0x61, 0x57, 0x3C, 0xCE, 0xBD, 0x3E, 0xCB, - 0xC8, 0xBB, 0x4B, 0x14, 0x66, 0x6B, 0xA8, 0x7A, 0x16, 0x6D, 0x28, 0x96, - 0x67, 0x71, 0xBC, 0xCC, 0x9E, 0xA7, 0xDA, 0xC8, 0x74, 0xC5, 0x36, 0xFD, - 0x7D, 0x5F, 0x99, 0x64, 0x76, 0x1E, 0xA3, 0xEF, 0xC9, 0x0A, 0x97, 0x9F, - 0xFB, 0x6B, 0xCC, 0x48, 0x98, 0xF6, 0x3D, 0xC7, 0x68, 0x3B, 0xF8, 0x28, - 0xD9, 0x5D, 0x07, 0x49, 0xF6, 0x6D, 0x23, 0xD6, 0xD9, 0x8F, 0x19, 0x89, - 0x35, 0xFC, 0x0D, 0x50, 0xCF, 0x53, 0xA8, 0x14, 0xA9, 0xCC, 0x4F, 0x61, - 0x17, 0x72, 0x98, 0xD1, 0x18, 0x89, 0x9E, 0xED, 0xE8, 0x52, 0x49, 0x9A, - 0x7B, 0x81, 0x1B, 0xA8, 0x08, 0xB4, 0x9A, 0x3A, 0x2B, 0x04, 0x28, 0x21, - 0xA8, 0x16, 0x5D, 0x0C, 0xCB, 0x60, 0xFF, 0xE7, 0x3B, 0xE9, 0x3F, 0x90, - 0x46, 0x1A, 0x6B, 0x22, 0x4E, 0x3D, 0xC5, 0xC0, 0x81, 0x34, 0x4B, 0x93, - 0x55, 0xCC, 0xB0, 0x41, 0x71, 0xD1, 0xE6, 0xC3, 0x9F, 0x4F, 0x31, 0x79, - 0x26, 0x68, 0xF9, 0x2C, 0x0D, 0x81, 0xD8, 0x68, 0xC4, 0xAF, 0x3B, 0xE8, - 0xF0, 0x83, 0xC4, 0x99, 0xAE, 0xDD, 0x49, 0xE2, 0x19, 0x8B, 0xD9, 0x4B, - 0x25, 0xE6, 0x2F, 0x97, 0x88, 0x65, 0xC3, 0xEC, 0xFF, 0x62, 0x6F, 0x60, - 0xFC, 0xA6, 0xB8, 0x29, 0x0F, 0xBE, 0xF2, 0xE1, 0xE2, 0x3B, 0xF3, 0x9C, - 0x7D, 0x79, 0x96, 0x5A, 0xC9, 0x6F, 0xF8, 0x20, 0x00, 0xDC, 0xAA, 0xC7, - 0xC8, 0x3B, 0x8B, 0xB8, 0x55, 0x97, 0x87, 0xBE, 0xD3, 0x4F, 0x24, 0xBE, - 0x41, 0xA2, 0x8C, 0x72, 0xB1, 0x55, 0x0F, 0xA2, 0xFF, 0xB7, 0xD9, 0xF5, - 0xDD, 0x04, 0xD9, 0x5D, 0x07, 0x31, 0x43, 0x16, 0xE9, 0x6D, 0x7B, 0x49, - 0x0F, 0xEF, 0xC3, 0x88, 0xC4, 0xEA, 0xC1, 0x3F, 0x3E, 0x9E, 0x5D, 0xBB, - 0xF6, 0x16, 0x9A, 0x21, 0xE2, 0xDD, 0x43, 0xC4, 0x7B, 0xA4, 0x8E, 0xD2, - 0xD3, 0xDC, 0x53, 0x5C, 0x47, 0x00, 0x14, 0x02, 0x85, 0xE7, 0x42, 0x69, - 0x49, 0x61, 0x57, 0x7C, 0xCC, 0xB0, 0xC4, 0x30, 0x05, 0x43, 0x87, 0x33, - 0xB4, 0x0D, 0xC4, 0x08, 0xC5, 0xCC, 0x75, 0xC6, 0xA8, 0x14, 0x24, 0x5A, - 0xC3, 0x84, 0xE3, 0x26, 0x66, 0x58, 0xB2, 0x30, 0x56, 0xA6, 0x5A, 0x70, - 0xD6, 0x35, 0x02, 0x5D, 0x7B, 0xAC, 0xF2, 0x83, 0xD1, 0xD2, 0x8A, 0x18, - 0x74, 0x0D, 0x27, 0xE8, 0xDC, 0x1E, 0x0F, 0x1A, 0x5E, 0xF4, 0x47, 0x89, - 0x26, 0x2D, 0xAE, 0x7C, 0xB8, 0xC4, 0xDB, 0xDF, 0x1F, 0xA7, 0xFF, 0x40, - 0x0B, 0x7B, 0x9E, 0xEA, 0x08, 0x8C, 0xFF, 0x26, 0x9C, 0xF8, 0x42, 0x0A, - 0x46, 0x3F, 0x5A, 0xE0, 0xC2, 0x1B, 0x0B, 0xD8, 0x65, 0xB5, 0x2E, 0x4F, - 0xBE, 0x11, 0x20, 0xE4, 0xC3, 0xD8, 0x89, 0x65, 0x62, 0x2D, 0x73, 0x3C, - 0xF0, 0xF5, 0x9E, 0xF5, 0xE9, 0xB9, 0xC2, 0xC0, 0x09, 0x1D, 0x64, 0x39, - 0xFC, 0x2D, 0x6C, 0x73, 0x3F, 0xE9, 0xE1, 0x08, 0xD9, 0x1D, 0xFB, 0x03, - 0x27, 0x63, 0x7D, 0xED, 0xEF, 0x3B, 0xF6, 0x75, 0x6E, 0xE3, 0x4A, 0xE9, - 0x34, 0x1D, 0xFC, 0xA3, 0xB9, 0xB7, 0xD8, 0x54, 0x00, 0x14, 0x0A, 0x69, - 0x58, 0x58, 0xF1, 0x14, 0x42, 0x1A, 0x2C, 0x4E, 0x7B, 0x8C, 0x9F, 0x2E, - 0x33, 0x7C, 0x34, 0x41, 0x3C, 0x63, 0x11, 0xCF, 0x58, 0x41, 0x48, 0xF0, - 0x06, 0x23, 0xB1, 0x10, 0x10, 0xAA, 0x6F, 0xBF, 0xC5, 0x33, 0xA1, 0x75, - 0x6B, 0xFC, 0x15, 0x87, 0x9B, 0x52, 0x10, 0x4D, 0x9B, 0x74, 0x0C, 0x05, - 0x29, 0xBA, 0x5D, 0x3B, 0x12, 0xA4, 0x3A, 0x22, 0xA4, 0x3B, 0xC3, 0xC4, - 0x33, 0x56, 0x63, 0x8A, 0xDE, 0x7F, 0x30, 0x8D, 0x5D, 0x51, 0x74, 0xEF, - 0xCC, 0x10, 0x4D, 0x9A, 0x37, 0xBD, 0x85, 0x57, 0x29, 0x38, 0x5C, 0x78, - 0x73, 0x81, 0xE2, 0xBC, 0x1D, 0x9C, 0x93, 0x55, 0x87, 0x5F, 0xB2, 0x23, - 0x4C, 0xA2, 0xC5, 0x24, 0x96, 0x0E, 0x11, 0x4D, 0x87, 0x69, 0xED, 0x8F, - 0xAF, 0xD9, 0x95, 0xF3, 0x41, 0x84, 0xA9, 0x46, 0x1F, 0xA5, 0x18, 0xF9, - 0x16, 0x8E, 0xB1, 0x2D, 0xF8, 0x5D, 0xDF, 0xC3, 0xD3, 0x23, 0xB8, 0xE6, - 0x3E, 0x61, 0xCB, 0x19, 0x80, 0x11, 0x0A, 0x13, 0x6D, 0xEB, 0x42, 0x5A, - 0x06, 0x85, 0x79, 0x87, 0x91, 0x0F, 0x8B, 0x74, 0xEF, 0x08, 0x46, 0xF7, - 0xEB, 0x76, 0xED, 0xAD, 0xFF, 0x55, 0x2C, 0x6D, 0xD1, 0xB7, 0x3F, 0x4D, - 0x6E, 0xAA, 0x8A, 0xF2, 0xA1, 0x63, 0x7B, 0x82, 0xD6, 0xFE, 0x28, 0xAD, - 0x03, 0x71, 0xD2, 0x9D, 0x61, 0x92, 0x6D, 0x61, 0xE2, 0xD9, 0x50, 0x50, - 0x44, 0xB4, 0x7E, 0x4E, 0x6F, 0xCD, 0xDA, 0x3E, 0x96, 0x0E, 0xB1, 0xFB, - 0x89, 0x76, 0xAC, 0x48, 0xE8, 0xA6, 0x8D, 0x5F, 0x48, 0xC1, 0xD9, 0xD7, - 0xE6, 0x99, 0xBB, 0x5C, 0xC6, 0x8A, 0x4A, 0x92, 0xED, 0x16, 0xB1, 0x6C, - 0x8C, 0x54, 0x6B, 0x88, 0x74, 0x47, 0x84, 0x68, 0xDA, 0x24, 0x1C, 0x37, - 0xEA, 0x19, 0x80, 0x26, 0xE1, 0x58, 0x3D, 0xC3, 0x11, 0x85, 0x67, 0x75, - 0x51, 0x0C, 0x7F, 0x95, 0x5A, 0xF8, 0x61, 0x1C, 0xD9, 0x8B, 0xC0, 0xBD, - 0xA9, 0xCF, 0xD6, 0x68, 0x3E, 0x0B, 0x6C, 0x19, 0x0A, 0x6C, 0xC6, 0x12, - 0x24, 0xFB, 0x77, 0x21, 0x0D, 0x13, 0xCF, 0x83, 0xA5, 0x29, 0x87, 0x85, - 0x71, 0x9B, 0xDE, 0x3D, 0xD6, 0x8D, 0x67, 0xF9, 0x09, 0x38, 0xF2, 0xB5, - 0x6E, 0x06, 0x0E, 0x06, 0x25, 0xA5, 0xE3, 0xD9, 0x10, 0xB1, 0x94, 0x45, - 0x2C, 0x6D, 0x61, 0x86, 0x65, 0x23, 0x7C, 0x77, 0x33, 0x87, 0x9E, 0x61, - 0x09, 0xA2, 0x69, 0x13, 0xDF, 0x15, 0xAB, 0x3D, 0xE6, 0xD4, 0x6A, 0xE5, - 0xDA, 0x2D, 0x51, 0x8A, 0xD6, 0x81, 0x38, 0x8F, 0xFE, 0xC1, 0x20, 0xA1, - 0x98, 0x41, 0x38, 0x26, 0xB1, 0x22, 0x16, 0xE1, 0xB8, 0x41, 0x24, 0x66, - 0x36, 0x6A, 0xFA, 0xAD, 0x04, 0xEC, 0xF8, 0x9E, 0x07, 0xC2, 0xA2, 0x1A, - 0x39, 0x46, 0x29, 0xFC, 0x65, 0x6C, 0x73, 0x37, 0x4A, 0x44, 0xB5, 0xF1, - 0x6B, 0xEE, 0x5B, 0xB6, 0x0E, 0x05, 0x36, 0x2C, 0xC2, 0xD9, 0x4E, 0xC2, - 0x99, 0x4E, 0xEC, 0xE2, 0x12, 0x95, 0xA2, 0x47, 0x7E, 0xCE, 0xA1, 0x77, - 0xEF, 0x4D, 0x7C, 0x82, 0x22, 0x88, 0xD2, 0xEB, 0x8A, 0xD4, 0xAB, 0x6B, - 0xD6, 0x13, 0x0C, 0x6F, 0x20, 0x22, 0x4F, 0x08, 0xB0, 0x2B, 0x3E, 0xA3, - 0x27, 0x8A, 0x4C, 0x9E, 0xAB, 0x60, 0x97, 0x3D, 0x96, 0xE7, 0x6D, 0x42, - 0x51, 0xD8, 0xF1, 0x70, 0x86, 0xED, 0x0F, 0xB5, 0x6C, 0xFD, 0xD1, 0x0A, - 0x7A, 0x76, 0x25, 0x30, 0x4C, 0xD9, 0xE8, 0x75, 0xB7, 0x32, 0xFF, 0xF7, - 0x1B, 0xE2, 0x51, 0x57, 0x00, 0x61, 0x62, 0x47, 0x1F, 0xA2, 0x6C, 0x3D, - 0x86, 0x63, 0xED, 0xC6, 0x95, 0x5D, 0xF5, 0xBF, 0xD7, 0xEB, 0x76, 0xCD, - 0xFD, 0xCB, 0x75, 0x6A, 0x02, 0xFA, 0x84, 0x92, 0x59, 0xD2, 0x3B, 0x0E, - 0x32, 0xFB, 0xC1, 0x8B, 0xF8, 0x9E, 0x11, 0x74, 0x8D, 0xBD, 0xC9, 0x1D, - 0x2C, 0xE5, 0xDF, 0x42, 0xA2, 0xAA, 0x00, 0xA7, 0xEA, 0x73, 0xEE, 0x8D, - 0x65, 0xDE, 0xFE, 0xE1, 0x2C, 0x95, 0xA2, 0x8B, 0xEF, 0x2A, 0xEC, 0xAA, - 0x8F, 0x10, 0x0A, 0xA5, 0x04, 0xED, 0x83, 0x09, 0xD2, 0x9D, 0xE1, 0x2D, - 0x67, 0x02, 0x41, 0x8E, 0x81, 0xBF, 0x41, 0xAA, 0x6C, 0xBD, 0xD6, 0x5D, - 0xA8, 0x8F, 0x9A, 0xB9, 0x9B, 0x9A, 0x79, 0x10, 0xC7, 0xDA, 0x81, 0x2B, - 0xDB, 0x01, 0x0B, 0x6D, 0xF8, 0x9A, 0x66, 0xE0, 0x3A, 0xB9, 0x00, 0x8A, - 0x48, 0x6B, 0x17, 0x1D, 0x0F, 0x3C, 0xCD, 0xDC, 0xF1, 0x97, 0xD9, 0xA8, - 0x70, 0xC5, 0x86, 0x95, 0xA6, 0xAE, 0x57, 0x8E, 0xFB, 0x06, 0xF0, 0x5D, - 0x18, 0x3F, 0x5D, 0xE1, 0x9D, 0x1F, 0xCF, 0x92, 0x9B, 0xAD, 0x21, 0xEB, - 0xA5, 0xB7, 0x0C, 0x53, 0xE0, 0x7B, 0x50, 0x58, 0xA8, 0x52, 0x5A, 0xAA, - 0x90, 0xE9, 0x0A, 0x6F, 0xF0, 0x31, 0xAB, 0x85, 0x36, 0x94, 0xD5, 0x89, - 0x6B, 0xF6, 0xE0, 0x89, 0x16, 0x3C, 0x91, 0xC6, 0x25, 0x05, 0x48, 0x40, - 0xE0, 0x99, 0xDD, 0xF8, 0x46, 0x2B, 0xBE, 0x48, 0xE1, 0xC9, 0x14, 0xAB, - 0x86, 0xAF, 0x8D, 0x5F, 0xD3, 0x1C, 0x5C, 0x77, 0x1B, 0x50, 0x5A, 0x21, - 0x3A, 0x8E, 0x7E, 0x81, 0xCA, 0xFC, 0x14, 0x33, 0xAF, 0xFD, 0x05, 0x2B, - 0x56, 0x2D, 0xA4, 0x60, 0x61, 0xAC, 0xCC, 0xF4, 0x85, 0x22, 0x2D, 0x3D, - 0x51, 0x3A, 0x86, 0xE3, 0x20, 0xA1, 0x30, 0x57, 0xC3, 0xAE, 0x04, 0x5E, - 0xF2, 0x48, 0x32, 0xD8, 0x2D, 0xB8, 0x95, 0x82, 0x1D, 0x33, 0x17, 0xCA, - 0xBC, 0xF2, 0xE7, 0x53, 0xE4, 0x67, 0xED, 0x6B, 0xCA, 0x8D, 0x0B, 0x01, - 0xD5, 0x82, 0x4B, 0x79, 0xD9, 0x41, 0x88, 0xB5, 0x15, 0x75, 0x14, 0x18, - 0x51, 0x5C, 0x6B, 0x88, 0x8A, 0x71, 0x08, 0xC7, 0xDC, 0x8E, 0x6F, 0xB4, - 0xA1, 0x44, 0x14, 0x85, 0x85, 0x12, 0x26, 0x8A, 0x95, 0x7D, 0x7E, 0x81, - 0x12, 0x61, 0x02, 0x31, 0x58, 0x39, 0x87, 0x36, 0x7C, 0x4D, 0x73, 0x71, - 0x03, 0x15, 0x81, 0x14, 0xA1, 0x54, 0x0B, 0xC3, 0x5F, 0xFF, 0xBB, 0xB4, - 0xED, 0xD9, 0x4D, 0xD2, 0xFE, 0x3E, 0xCA, 0x9F, 0x41, 0x08, 0x89, 0x5D, - 0xF1, 0xB8, 0xF0, 0xE6, 0x02, 0x4B, 0x13, 0x15, 0xC2, 0x71, 0x23, 0x08, - 0xB7, 0xB5, 0x57, 0xD3, 0x6C, 0x85, 0x14, 0xF4, 0xEF, 0x4F, 0x73, 0xE4, - 0xEB, 0xDD, 0x41, 0x11, 0x91, 0x1B, 0xD4, 0x81, 0xA5, 0xC9, 0x2A, 0xAF, - 0xFD, 0xF5, 0x24, 0x8B, 0x93, 0xD5, 0x0D, 0x2E, 0x47, 0x11, 0xC9, 0x66, - 0xE8, 0x78, 0xE4, 0x2B, 0xC8, 0x3D, 0x4F, 0xB2, 0x1C, 0x2D, 0xE1, 0xFB, - 0x02, 0x4F, 0xA4, 0xF1, 0x8D, 0x6C, 0xDD, 0xE0, 0x63, 0x78, 0x22, 0x51, - 0xEF, 0x4E, 0xB3, 0x55, 0xC2, 0x8D, 0x36, 0x7A, 0x4D, 0x73, 0x73, 0x83, - 0xED, 0xC1, 0xC1, 0x8C, 0xA7, 0xC8, 0xEC, 0x7B, 0x86, 0x58, 0xB9, 0x86, - 0xE7, 0xFD, 0x7F, 0x18, 0x46, 0x10, 0xF1, 0xE6, 0x54, 0x3D, 0x72, 0x33, - 0xD5, 0x46, 0x5F, 0xB9, 0xAB, 0x53, 0xED, 0x8A, 0x0B, 0x35, 0x16, 0x27, - 0x2B, 0x7C, 0xF1, 0x1F, 0x6D, 0x23, 0xDD, 0x11, 0xDE, 0x32, 0x88, 0xC7, - 0x77, 0x15, 0x93, 0xE7, 0x2B, 0xBC, 0xF6, 0x57, 0x93, 0xCC, 0x5E, 0xBC, - 0xD6, 0xF8, 0x65, 0x28, 0x4C, 0xDB, 0xFE, 0xA3, 0xEC, 0xF8, 0xE6, 0x1F, - 0xD3, 0xB2, 0xEF, 0x61, 0xAC, 0x58, 0x8C, 0xA2, 0x74, 0xEB, 0x6D, 0x2C, - 0x0C, 0x94, 0x30, 0x59, 0x6F, 0xF0, 0x9F, 0xBC, 0xDE, 0x9E, 0x46, 0x73, - 0x3F, 0x73, 0xC3, 0x02, 0x80, 0xF2, 0x11, 0x32, 0x8C, 0x13, 0x7B, 0x90, - 0x4A, 0xE5, 0x14, 0x09, 0xFF, 0x75, 0xA2, 0x29, 0x8B, 0x68, 0xCA, 0x0A, - 0x32, 0x06, 0x36, 0xCA, 0xD9, 0x17, 0x02, 0xD7, 0xF6, 0x99, 0x3C, 0xB3, - 0xCC, 0xD9, 0xD7, 0x16, 0x38, 0xFC, 0x6C, 0x4F, 0x10, 0x20, 0x74, 0x95, - 0x4D, 0xFA, 0xBE, 0x62, 0xFE, 0x4A, 0x95, 0x73, 0xAF, 0x2F, 0x70, 0xF6, - 0xF5, 0x65, 0x4A, 0x79, 0x87, 0xB5, 0x15, 0xB3, 0x8C, 0x50, 0x98, 0x96, - 0xBD, 0x47, 0xD8, 0xF1, 0xCD, 0x3F, 0xA2, 0x65, 0xEF, 0xC3, 0x58, 0x89, - 0x14, 0xD2, 0x0A, 0x05, 0x8D, 0x4B, 0x08, 0xB3, 0xFE, 0x84, 0xDA, 0xE0, - 0x35, 0x9A, 0x1B, 0xE5, 0xC6, 0x05, 0x00, 0x00, 0x1F, 0x57, 0xF6, 0x50, - 0x0A, 0x3F, 0x8B, 0x55, 0x9B, 0x25, 0x9E, 0xB9, 0x40, 0x3C, 0x1B, 0x6E, - 0x14, 0xBC, 0xD8, 0x6C, 0x78, 0x57, 0x9E, 0xCF, 0x7C, 0xE5, 0x09, 0xA6, - 0xA2, 0x7F, 0x46, 0x28, 0x99, 0xB9, 0xEA, 0xB8, 0x20, 0x59, 0xE6, 0xE4, - 0x9B, 0xFF, 0x2B, 0x23, 0x2F, 0x5C, 0xC2, 0x2E, 0xBB, 0xF5, 0x1C, 0x24, - 0x81, 0x34, 0x0C, 0x52, 0xFD, 0x83, 0x0C, 0x7D, 0xED, 0x7B, 0x74, 0x3F, - 0xF2, 0x15, 0xC2, 0x99, 0xB6, 0x86, 0xE1, 0xAF, 0x9E, 0x43, 0x1B, 0xBC, - 0x46, 0x73, 0xAB, 0xDC, 0xA4, 0x00, 0x04, 0x54, 0xCD, 0xC3, 0xE4, 0x95, - 0x43, 0xD2, 0x78, 0x9E, 0x96, 0x3D, 0x5D, 0x74, 0x4E, 0xCF, 0xE2, 0xD9, - 0x35, 0xCA, 0x73, 0x13, 0x38, 0xC5, 0x20, 0xE9, 0xA7, 0x11, 0x28, 0xA4, - 0x7C, 0x94, 0x52, 0x18, 0xF1, 0x0E, 0x3C, 0xB3, 0x13, 0x57, 0xA6, 0xAF, - 0xB1, 0x59, 0x15, 0x6D, 0xA3, 0xF7, 0x2B, 0xFF, 0x88, 0x99, 0x93, 0x23, - 0xB8, 0x63, 0x97, 0x10, 0x12, 0x12, 0xDD, 0xBD, 0x0C, 0x7D, 0xF5, 0x6F, - 0xD1, 0xF3, 0xE8, 0xB3, 0x84, 0xD2, 0x2D, 0x18, 0xA1, 0x7A, 0x25, 0x5E, - 0x5D, 0xDF, 0x5E, 0xA3, 0xB9, 0x6D, 0x88, 0xBF, 0x1C, 0xAB, 0xAA, 0xE7, - 0x66, 0x6D, 0x6E, 0x22, 0xB3, 0x36, 0xF8, 0x45, 0x5C, 0x84, 0xB2, 0xF1, - 0x1C, 0xAF, 0x5E, 0x88, 0x23, 0x88, 0x93, 0x57, 0x0A, 0x9C, 0xE5, 0x05, - 0xCA, 0x73, 0x53, 0xF8, 0xAE, 0x4D, 0x61, 0xFC, 0x02, 0x6E, 0xB9, 0x48, - 0xDF, 0xE7, 0xBE, 0x4D, 0xA2, 0x6F, 0xC7, 0x86, 0x15, 0x72, 0x20, 0x28, - 0xAA, 0x51, 0xCB, 0xCD, 0x93, 0xBB, 0xF0, 0x11, 0x46, 0x38, 0x4A, 0x7A, - 0xDB, 0x7E, 0x8C, 0x70, 0x14, 0x23, 0x14, 0xBE, 0xDB, 0xF7, 0x48, 0xA3, - 0xB9, 0x6F, 0xB9, 0x65, 0x01, 0xD8, 0x12, 0x15, 0x64, 0xCA, 0xAD, 0x8A, - 0x82, 0x42, 0x9A, 0xA1, 0x4D, 0x8D, 0x7F, 0xDD, 0xAF, 0x7A, 0x6E, 0x50, - 0x39, 0x47, 0x97, 0xCB, 0xD2, 0x68, 0xEE, 0x38, 0xB7, 0xB4, 0x04, 0xB8, - 0x2E, 0x42, 0x20, 0x8C, 0x7A, 0x4D, 0x3C, 0xE3, 0xE6, 0x3E, 0xE2, 0x66, - 0x8F, 0xD7, 0x68, 0x34, 0xB7, 0x8E, 0xAE, 0x49, 0xAD, 0xD1, 0x34, 0x31, - 0x5A, 0x00, 0x34, 0x9A, 0x26, 0x46, 0x0B, 0x80, 0x46, 0xD3, 0xC4, 0x68, - 0x01, 0xD0, 0x68, 0x9A, 0x18, 0x2D, 0x00, 0x1A, 0x4D, 0x13, 0xA3, 0x05, - 0x40, 0xA3, 0x69, 0x62, 0xB4, 0x00, 0x68, 0x34, 0x4D, 0x8C, 0x16, 0x00, - 0x8D, 0xA6, 0x89, 0xD1, 0x02, 0xA0, 0xD1, 0x34, 0x31, 0x5A, 0x00, 0x34, - 0x9A, 0x26, 0x46, 0x0B, 0x80, 0x46, 0xD3, 0xC4, 0x68, 0x01, 0xD0, 0x68, - 0x9A, 0x18, 0x2D, 0x00, 0x1A, 0x4D, 0x13, 0xA3, 0x05, 0x40, 0xA3, 0x69, - 0x62, 0xB4, 0x00, 0x68, 0x34, 0x4D, 0x8C, 0x16, 0x00, 0x8D, 0xA6, 0x89, - 0xD1, 0x02, 0xA0, 0xD1, 0x34, 0x31, 0x5A, 0x00, 0x34, 0x9A, 0x26, 0x46, - 0x0B, 0x80, 0x46, 0xD3, 0xC4, 0x68, 0x01, 0xD0, 0x68, 0x9A, 0x18, 0x2D, - 0x00, 0x1A, 0x4D, 0x13, 0xA3, 0x05, 0x40, 0xA3, 0x69, 0x62, 0xB4, 0x00, - 0x68, 0x34, 0x4D, 0x8C, 0x16, 0x00, 0x8D, 0xA6, 0x89, 0xD1, 0x02, 0xA0, - 0xD1, 0x34, 0x31, 0x5A, 0x00, 0x34, 0x9A, 0x26, 0x46, 0x0B, 0x80, 0x46, - 0xD3, 0xC4, 0x68, 0x01, 0xD0, 0x68, 0x9A, 0x18, 0x2D, 0x00, 0x1A, 0x4D, - 0x13, 0xA3, 0x05, 0x40, 0xA3, 0x69, 0x62, 0xB4, 0x00, 0x68, 0x34, 0x4D, - 0x8C, 0x16, 0x00, 0x8D, 0xA6, 0x89, 0xD1, 0x02, 0xA0, 0xD1, 0x68, 0x34, - 0x1A, 0x8D, 0x46, 0xA3, 0xD1, 0x68, 0x34, 0x1A, 0x8D, 0x46, 0xA3, 0xD1, - 0x68, 0x34, 0x1A, 0x8D, 0x46, 0xA3, 0xD1, 0x68, 0x34, 0x1A, 0x8D, 0x46, - 0xA3, 0xD1, 0x68, 0x34, 0x1A, 0x8D, 0x46, 0xA3, 0xD1, 0x68, 0x34, 0x1A, - 0x8D, 0x46, 0xA3, 0xD1, 0x68, 0x34, 0x1A, 0x8D, 0x46, 0xA3, 0xD1, 0x68, - 0x34, 0x1A, 0x8D, 0x46, 0xA3, 0xD1, 0x68, 0x34, 0x1A, 0x8D, 0x46, 0xA3, - 0xD1, 0x68, 0x34, 0x1A, 0x8D, 0x46, 0xA3, 0xD1, 0x68, 0x34, 0x1A, 0x8D, - 0x46, 0xA3, 0xD1, 0x68, 0x34, 0x1A, 0x8D, 0x46, 0xA3, 0xD1, 0x68, 0x34, - 0x1A, 0xCD, 0xED, 0xE4, 0xFF, 0x07, 0xBD, 0x5B, 0xCF, 0x15, 0x8D, 0x7D, - 0x6A, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, - 0x60, 0x82, -} diff --git a/src/win/icon.ico b/src/win/icon.ico deleted file mode 100644 index 61da00924c34e0870905c32075012e5504c33c75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36278 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 TP-lsM3z!}~)YGieu!;O1LZj?K diff --git a/src/win/icon.rc b/src/win/icon.rc deleted file mode 100644 index b20115c..0000000 --- a/src/win/icon.rc +++ /dev/null @@ -1 +0,0 @@ -IDI_ICON1 ICON DISCARDABLE "icon.ico" \ No newline at end of file diff --git a/src/win/icon_windows_386.syso b/src/win/icon_windows_386.syso deleted file mode 100644 index 5289d69e5a9ab512055d2777d48c29fc2ab95f08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36790 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 AZU6uP diff --git a/src/win/icon_windows_amd64.syso b/src/win/icon_windows_amd64.syso deleted file mode 100644 index 72330be138130f538f02e55d57dfb6637e98540b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36790 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 1 { - cli.Run() - return - } - - var isWorking bool - app := widgets.NewQApplication(len(os.Args), os.Args) - - window := widgets.NewQMainWindow(nil, 0) - if runtime.GOOS == "windows" { - window.SetFixedSize2(300, 150) - window.SetWindowTitle("croc " + Version) - } else { - window.SetFixedSize2(400, 150) - window.SetWindowTitle("🐊📦 croc " + Version) - } - - widget := widgets.NewQWidget(nil, 0) - widget.SetLayout(widgets.NewQVBoxLayout()) - window.SetCentralWidget(widget) - - labels := make([]*CustomLabel, 3) - for i := range labels { - label := NewCustomLabel(nil, 0) - label.SetAlignment(core.Qt__AlignCenter) - widget.Layout().AddWidget(label) - labels[i] = label - } - labels[0].SetText("secure data transfer") - labels[1].SetText("Click 'Send' or 'Receive' to start") - - button := widgets.NewQPushButton2("Send", nil) - button.ConnectClicked(func(bool) { - if isWorking { - dialog("Can only do one send or receive at a time") - return - } - isWorking = true - - var fileDialog = widgets.NewQFileDialog2(window, "Open file to send...", "", "") - fileDialog.SetAcceptMode(widgets.QFileDialog__AcceptOpen) - fileDialog.SetFileMode(widgets.QFileDialog__AnyFile) - if fileDialog.Exec() != int(widgets.QDialog__Accepted) { - isWorking = false - return - } - var fn = fileDialog.SelectedFiles()[0] - if len(fn) == 0 { - dialog(fmt.Sprintf("No file selected")) - isWorking = false - return - } - - go func() { - cr := croc.Init(false) - done := make(chan bool) - codePhrase := utils.GetRandomName() - _, fname := filepath.Split(fn) - labels[0].UpdateTextFromGoroutine(fmt.Sprintf("Sending '%s'", fname)) - labels[1].UpdateTextFromGoroutine(fmt.Sprintf("Code phrase: %s", codePhrase)) - - go func(done chan bool) { - for { - if cr.OtherIP != "" && cr.FileInfo.SentName != "" { - bytesString := humanize.Bytes(uint64(cr.FileInfo.Size)) - fileOrFolder := "file" - if cr.FileInfo.IsDir { - fileOrFolder = "folder" - } - labels[0].UpdateTextFromGoroutine(fmt.Sprintf("Sending %s %s '%s' to %s", bytesString, fileOrFolder, cr.FileInfo.SentName, cr.OtherIP)) - } - if cr.Bar != nil { - barState := cr.Bar.State() - labels[1].UpdateTextFromGoroutine(fmt.Sprintf("%2.1f%% [%2.0fs:%2.0fs]", barState.CurrentPercent*100, barState.SecondsSince, barState.SecondsLeft)) - } - labels[2].UpdateTextFromGoroutine(cr.StateString) - time.Sleep(100 * time.Millisecond) - select { - case _ = <-done: - labels[2].UpdateTextFromGoroutine(cr.StateString) - return - default: - continue - } - } - }(done) - - cr.Send(fn, codePhrase) - done <- true - isWorking = false - }() - }) - widget.Layout().AddWidget(button) - - receiveButton := widgets.NewQPushButton2("Receive", nil) - receiveButton.ConnectClicked(func(bool) { - if isWorking { - dialog("Can only do one send or receive at a time") - return - } - labels[1].SetText("") - labels[2].SetText("please wait...") - isWorking = true - defer func() { - isWorking = false - }() - - // determine the folder to save the file - var folderDialog = widgets.NewQFileDialog2(window, "Open folder to receive file...", "", "") - folderDialog.SetAcceptMode(widgets.QFileDialog__AcceptOpen) - folderDialog.SetFileMode(widgets.QFileDialog__DirectoryOnly) - if folderDialog.Exec() != int(widgets.QDialog__Accepted) { - return - } - var fn = folderDialog.SelectedFiles()[0] - if len(fn) == 0 { - labels[2].SetText(fmt.Sprintf("No folder selected")) - return - } - - var codePhrase = widgets.QInputDialog_GetText(window, "croc", "Enter code phrase:", - widgets.QLineEdit__Normal, "", true, core.Qt__Dialog, core.Qt__ImhNone) - if len(codePhrase) < 3 { - labels[2].SetText(fmt.Sprintf("Invalid codephrase: '%s'", codePhrase)) - return - } - - cr := croc.Init(false) - cr.WindowRecipientPrompt = true - - done := make(chan bool) - go func() { - // change into the receiving directory - cwd, _ := os.Getwd() - defer os.Chdir(cwd) - os.Chdir(fn) - err := cr.Receive(codePhrase) - if err == nil { - open.Run(fn) - } - done <- true - done <- true - isWorking = false - }() - go func() { - for { - if cr.Bar != nil { - barState := cr.Bar.State() - labels[1].UpdateTextFromGoroutine(fmt.Sprintf("%2.1f%% [%2.0fs:%2.0fs]", barState.CurrentPercent*100, barState.SecondsSince, barState.SecondsLeft)) - } - if cr.StateString != "" { - labels[2].UpdateTextFromGoroutine(cr.StateString) - } - time.Sleep(100 * time.Millisecond) - select { - case _ = <-done: - labels[2].UpdateTextFromGoroutine(cr.StateString) - return - default: - continue - } - } - }() - - for { - if cr.WindowReceivingString != "" { - var question = widgets.QMessageBox_Question(window, "croc", fmt.Sprintf("%s?", cr.WindowReceivingString), widgets.QMessageBox__Yes|widgets.QMessageBox__No, 0) - if question == widgets.QMessageBox__Yes { - cr.WindowRecipientAccept = true - labels[0].SetText(cr.WindowReceivingString) - } else { - cr.WindowRecipientAccept = false - labels[2].SetText("canceled") - } - cr.WindowRecipientPrompt = false - cr.WindowReceivingString = "" - break - } - time.Sleep(100 * time.Millisecond) - select { - case _ = <-done: - labels[2].SetText(cr.StateString) - return - default: - continue - } - } - - }) - widget.Layout().AddWidget(receiveButton) - - window.Show() - app.Exec() -} - -func dialog(s string) { - var info = widgets.NewQMessageBox(nil) - info.SetWindowTitle("Info") - info.SetText(s) - info.Exec() -} diff --git a/src/win/main_windows.go b/src/win/main_windows.go deleted file mode 100644 index 1e9e584..0000000 --- a/src/win/main_windows.go +++ /dev/null @@ -1,250 +0,0 @@ -package main - -import ( - "fmt" - "os" - "path/filepath" - "runtime" - "time" - - humanize "github.com/dustin/go-humanize" - "github.com/gonutz/w32" - "github.com/gonutz/wui" - "github.com/schollz/croc/src/cli" - "github.com/schollz/croc/src/croc" - "github.com/schollz/croc/src/utils" - "github.com/skratchdot/open-golang/open" -) - -var Version string - -func main() { - if len(os.Args) > 1 { - cli.Run() - return - } - - var isWorking bool - - font, _ := wui.NewFont(wui.FontDesc{ - Name: "Tahoma", - Height: -11, - }) - - window := wui.NewWindow() - window.SetFont(font) - window.SetIconFromMem(icon) - window.SetStyle(w32.WS_OVERLAPPED | w32.WS_CAPTION | w32.WS_SYSMENU | w32.WS_MINIMIZEBOX) - if runtime.GOOS == "windows" { - window.SetClientSize(300, 150) - window.SetTitle("croc " + Version) - } else { - window.SetClientSize(400, 150) - window.SetTitle("🐊📦 croc " + Version) - } - - labels := make([]*wui.Label, 3) - for i := range labels { - label := wui.NewLabel() - label.SetCenterAlign() - label.SetBounds(0, 10+i*20, window.ClientWidth(), 20) - window.Add(label) - labels[i] = label - } - labels[0].SetText("secure data transfer") - labels[1].SetText("Click 'Send' or 'Receive' to start") - - button := wui.NewButton() - button.SetText("Send") - window.Add(button) - button.SetBounds(10, window.ClientHeight()-70, window.ClientWidth()-20, 25) - button.SetOnClick(func() { - if isWorking { - wui.MessageBoxError(window, "Error", "Can only do one send or receive at a time") - return - } - isWorking = true - - fileDialog := wui.NewFileOpenDialog() - fileDialog.SetTitle("Open file to send...") - accepted, fn := fileDialog.ExecuteSingleSelection(window) - if !accepted { - isWorking = false - return - } - if fn == "" { - wui.MessageBoxError(window, "Error", "No file selected") - isWorking = false - return - } - - go func() { - cr := croc.Init(false) - done := make(chan bool) - codePhrase := utils.GetRandomName() - _, fname := filepath.Split(fn) - labels[0].SetText(fmt.Sprintf("Sending '%s'", fname)) - labels[1].SetText(fmt.Sprintf("Code phrase: %s", codePhrase)) - - go func(done chan bool) { - for { - if cr.OtherIP != "" && cr.FileInfo.SentName != "" { - bytesString := humanize.Bytes(uint64(cr.FileInfo.Size)) - fileOrFolder := "file" - if cr.FileInfo.IsDir { - fileOrFolder = "folder" - } - labels[0].SetText(fmt.Sprintf("Sending %s %s '%s' to %s", bytesString, fileOrFolder, cr.FileInfo.SentName, cr.OtherIP)) - } - if cr.Bar != nil { - barState := cr.Bar.State() - labels[1].SetText(fmt.Sprintf("%2.1f%% [%2.0fs:%2.0fs]", barState.CurrentPercent*100, barState.SecondsSince, barState.SecondsLeft)) - } - labels[2].SetText(cr.StateString) - time.Sleep(100 * time.Millisecond) - select { - case _ = <-done: - labels[2].SetText(cr.StateString) - return - default: - continue - } - } - }(done) - - cr.Send(fn, codePhrase) - done <- true - isWorking = false - }() - }) - - receiveButton := wui.NewButton() - receiveButton.SetText("Receive") - window.Add(receiveButton) - receiveButton.SetBounds(10, window.ClientHeight()-35, window.ClientWidth()-20, 25) - receiveButton.SetOnClick(func() { - if isWorking { - wui.MessageBoxError(window, "Error", "Can only do one send or receive at a time") - return - } - labels[1].SetText("") - labels[2].SetText("please wait...") - isWorking = true - defer func() { - isWorking = false - }() - - // determine the folder to save the file - folderDialog := wui.NewFolderSelectDialog() - folderDialog.SetTitle("Open folder to receive file...") - accepted, fn := folderDialog.Execute(window) - if !accepted { - return - } - if len(fn) == 0 { - labels[2].SetText(fmt.Sprintf("No folder selected")) - return - } - - passDlg := wui.NewDialogWindow() - passDlg.SetTitle("Enter code phrase") - passDlg.SetClientSize(window.ClientWidth()-20, 40) - pass := wui.NewEditLine() - passDlg.Add(pass) - pass.SetPassword(true) - pass.SetBounds(10, 10, passDlg.ClientWidth()-20, 20) - var passAccepted bool - passDlg.SetShortcut(wui.ShortcutKeys{Key: w32.VK_RETURN}, func() { - passAccepted = true - passDlg.Close() - }) - passDlg.SetShortcut(wui.ShortcutKeys{Key: w32.VK_ESCAPE}, func() { - passDlg.Close() - }) - var codePhrase string - passDlg.SetOnShow(func() { - passDlg.SetX(window.X() + (window.Width()-passDlg.Width())/2) - passDlg.SetY(window.Y() + (window.Height()-passDlg.Height())/2) - pass.Focus() - }) - passDlg.SetOnClose(func() { - if passAccepted { - codePhrase = pass.Text() - } - }) - passDlg.ShowModal(window) - passDlg.Destroy() - if len(codePhrase) < 3 { - labels[2].SetText(fmt.Sprintf("Invalid codephrase: '%s'", codePhrase)) - return - } - - cr := croc.Init(false) - cr.WindowRecipientPrompt = true - - done := make(chan bool) - go func() { - // change into the receiving directory - cwd, _ := os.Getwd() - defer os.Chdir(cwd) - os.Chdir(fn) - err := cr.Receive(codePhrase) - if err == nil { - open.Run(fn) - } - done <- true - done <- true - isWorking = false - }() - go func() { - for { - if cr.Bar != nil { - barState := cr.Bar.State() - labels[1].SetText(fmt.Sprintf("%2.1f%% [%2.0fs:%2.0fs]", barState.CurrentPercent*100, barState.SecondsSince, barState.SecondsLeft)) - } - if cr.StateString != "" { - labels[2].SetText(cr.StateString) - } - time.Sleep(100 * time.Millisecond) - select { - case _ = <-done: - labels[2].SetText(cr.StateString) - return - default: - continue - } - } - }() - - for { - if cr.WindowReceivingString != "" { - question := wui.MessageBoxYesNo( - window, - "croc", - fmt.Sprintf("%s?", cr.WindowReceivingString), - ) - if question { - cr.WindowRecipientAccept = true - labels[0].SetText(cr.WindowReceivingString) - } else { - cr.WindowRecipientAccept = false - labels[2].SetText("canceled") - } - cr.WindowRecipientPrompt = false - cr.WindowReceivingString = "" - break - } - time.Sleep(100 * time.Millisecond) - select { - case _ = <-done: - labels[2].SetText(cr.StateString) - return - default: - continue - } - } - - }) - - window.Show() -} diff --git a/src/zipper/zip.go b/src/zipper/zip.go deleted file mode 100644 index f91d420..0000000 --- a/src/zipper/zip.go +++ /dev/null @@ -1,230 +0,0 @@ -package zipper - -import ( - "archive/zip" - "compress/flate" - "fmt" - "io" - "os" - "path" - "path/filepath" - "strings" - - log "github.com/cihub/seelog" - "github.com/schollz/croc/src/logger" -) - -var DebugLevel string - -func init() { - DebugLevel = "info" -} - -// UnzipFile will unzip the src directory into the dest -func UnzipFile(src, dest string) (err error) { - logger.SetLogLevel(DebugLevel) - - r, err := zip.OpenReader(src) - if err != nil { - return - } - defer r.Close() - - for _, f := range r.File { - var rc io.ReadCloser - rc, err = f.Open() - if err != nil { - return - } - defer rc.Close() - - // Store filename/path for returning and using later on - fpath := filepath.Join(dest, f.Name) - log.Debugf("unzipping %s", fpath) - fpath = filepath.FromSlash(fpath) - - if f.FileInfo().IsDir() { - - // Make Folder - os.MkdirAll(fpath, os.ModePerm) - - } else { - - // Make File - if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil { - return - } - - var outFile *os.File - outFile, err = os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) - if err != nil { - return - } - - _, err = io.Copy(outFile, rc) - - // Close the file without defer to close before next iteration of loop - outFile.Close() - - if err != nil { - return - } - - } - } - if err == nil { - log.Debugf("unzipped %s to %s", src, dest) - } - return -} - -// ZipFiles will zip all the files and the folders as if they were in the same directory -func ZipFiles(fnames []string, compress bool) (writtenFilename string, err error) { - logger.SetLogLevel(DebugLevel) - if len(fnames) == 0 { - err = fmt.Errorf("must provide files to zip") - return - } - - log.Debugf("zipping %s with compression? %v", fnames, compress) - writtenFilename = fmt.Sprintf("%d_files.croc.zip", len(fnames)) - err = makeZip(writtenFilename, fnames, compress) - return -} - -// ZipFile will zip the folder -func ZipFile(fname string, compress bool) (writtenFilename string, err error) { - logger.SetLogLevel(DebugLevel) - - // get path to file and the filename - _, filename := filepath.Split(fname) - writtenFilename = filename + ".croc.zip" - err = makeZip(writtenFilename, []string{fname}, compress) - return -} - -func makeZip(writtenFilename string, fnames []string, compress bool) (err error) { - log.Debugf("creating file: %s", writtenFilename) - f, err := os.Create(writtenFilename) - if err != nil { - log.Error(err) - return - } - defer f.Close() - - zipWriter := zip.NewWriter(f) - zipWriter.RegisterCompressor(zip.Deflate, func(out io.Writer) (io.WriteCloser, error) { - if compress { - return flate.NewWriter(out, flate.BestSpeed) - } else { - return flate.NewWriter(out, flate.NoCompression) - } - }) - defer zipWriter.Close() - - err = zipFiles(fnames, compress, zipWriter) - if err == nil { - log.Debugf("wrote zip file to %s", writtenFilename) - } else { - log.Error(err) - } - return -} - -func zipFiles(fnames []string, compress bool, zipWriter *zip.Writer) (err error) { - for _, fname := range fnames { - // get absolute filename - absPath, err := filepath.Abs(filepath.Clean(fname)) - if err != nil { - log.Error(err) - return err - } - absPath = filepath.ToSlash(absPath) - - // get path to file and the filename - fpath, fname := filepath.Split(absPath) - - // Get the file information for the target - log.Debugf("checking %s", absPath) - ftarget, err := os.Open(absPath) - if err != nil { - log.Error(err) - return err - } - defer ftarget.Close() - info, err := ftarget.Stat() - if err != nil { - log.Error(err) - return err - } - - // write header informaiton - header, err := zip.FileInfoHeader(info) - if err != nil { - log.Error(err) - return err - } - - var writer io.Writer - if info.IsDir() { - baseDir := filepath.Clean(path.Join(fpath, fname)) - log.Debugf("walking base dir: %s", baseDir) - filepath.Walk(baseDir, func(curpath string, info os.FileInfo, err error) error { - curpath = filepath.Clean(curpath) - - if err != nil { - log.Error(err) - return err - } - - header, err := zip.FileInfoHeader(info) - if err != nil { - log.Error(err) - return err - } - - if baseDir != "" { - header.Name = path.Join(fname, strings.TrimPrefix(curpath, baseDir)) - } - header.Name = filepath.ToSlash(filepath.Clean(header.Name)) - log.Debug(header.Name) - - if info.IsDir() { - header.Name += "/" - } else { - header.Method = zip.Deflate - } - - writer, err = zipWriter.CreateHeader(header) - if err != nil { - return err - } - - if info.IsDir() { - return nil - } - - file, err := os.Open(curpath) - if err != nil { - log.Error(err) - return err - } - defer file.Close() - _, err = io.Copy(writer, file) - return err - }) - } else { - writer, err = zipWriter.CreateHeader(header) - if err != nil { - log.Error(err) - return err - } - _, err = io.Copy(writer, ftarget) - if err != nil { - log.Error(err) - return err - } - } - } - return nil -} diff --git a/src/zipper/zip_test.go b/src/zipper/zip_test.go deleted file mode 100644 index 23cfbea..0000000 --- a/src/zipper/zip_test.go +++ /dev/null @@ -1,47 +0,0 @@ -package zipper - -import ( - "os" - "path" - "testing" - - log "github.com/cihub/seelog" - "github.com/schollz/croc/src/utils" - "github.com/stretchr/testify/assert" -) - -func TestZip(t *testing.T) { - defer log.Flush() - DebugLevel = "debug" - writtenFilename1, err := ZipFile("../croc", true) - assert.Nil(t, err) - err = UnzipFile(writtenFilename1, ".") - assert.Nil(t, err) - assert.True(t, utils.Exists("croc")) - - writtenFilename2, err := ZipFile("../../README.md", false) - assert.Nil(t, err) - err = UnzipFile(writtenFilename2, ".") - assert.Nil(t, err) - assert.True(t, utils.Exists("README.md")) - - os.Remove("README.md") - os.RemoveAll("croc") - os.Remove(writtenFilename1) - os.Remove(writtenFilename2) -} - -func TestZipFiles(t *testing.T) { - defer log.Flush() - DebugLevel = "debug" - writtenFilename, err := ZipFiles([]string{"../../LICENSE", "../win/Makefile", "../utils"}, true) - assert.Nil(t, err) - err = UnzipFile(writtenFilename, "zipfilestest") - assert.Nil(t, err) - assert.True(t, utils.Exists("zipfilestest/LICENSE")) - assert.True(t, utils.Exists("zipfilestest/Makefile")) - assert.True(t, utils.Exists("zipfilestest/utils/exists.go")) - os.RemoveAll("zipfilestest") - err = os.Remove(path.Join(".", writtenFilename)) - assert.Nil(t, err) -} From cee4c36f8bf88123e5c5e11681b57bf93acb9f40 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 17:12:04 -0600 Subject: [PATCH 017/110] prune --- go.mod | 1 + main.go | 2 +- src/croc/croc.go | 3 --- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 7ce9d40..361e573 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/schollz/croc/v6 require ( github.com/BurntSushi/toml v0.3.1 github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 + github.com/denisbrodbeck/machineid v1.0.1 github.com/dustin/go-humanize v1.0.0 github.com/fatih/color v1.7.0 // indirect github.com/gonutz/w32 v1.0.0 diff --git a/main.go b/main.go index d756c3d..30ae1ee 100644 --- a/main.go +++ b/main.go @@ -3,7 +3,7 @@ package main import ( "fmt" - "github.com/schollz/croc/v5/src/cli" + "github.com/schollz/croc/v6/src/cli" ) func main() { diff --git a/src/croc/croc.go b/src/croc/croc.go index 211d582..e26fb1b 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -20,9 +20,6 @@ import ( "github.com/schollz/croc/v6/src/crypt" "github.com/schollz/croc/v6/src/logger" "github.com/schollz/croc/v6/src/utils" - "github.com/schollz/croc/v6/src/webrtc/pkg/session/common" - "github.com/schollz/croc/v6/src/webrtc/pkg/session/receiver" - "github.com/schollz/croc/v6/src/webrtc/pkg/session/sender" "github.com/schollz/pake" "github.com/schollz/progressbar/v2" "github.com/schollz/spinner" From c1d66d530150c89978291ef7ec77312d43d80453 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 17:12:12 -0600 Subject: [PATCH 018/110] add go.sum --- go.sum | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 go.sum diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..86c9c8d --- /dev/null +++ b/go.sum @@ -0,0 +1,56 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ= +github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/gonutz/w32 v1.0.0/go.mod h1:Rc/YP5K9gv0FW4p6X9qL3E7Y56lfMflEol1fLElfMW4= +github.com/gonutz/wui v1.0.0/go.mod h1:cpEPmIh19mpxkcho2qMHLX16gVteB1aee8g11887kyE= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mitchellh/colorstring v0.0.0-20150917214807-8631ce90f286/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/schollz/croc v3.0.6+incompatible h1:rCfc8MGgcGjNW2/qSoulPh8CRGH+Ej4i3RWYOwhX9pE= +github.com/schollz/mnemonicode v1.0.1 h1:LiH5hwADZwjwnfXsaD4xgnMyTAtaKHN+e5AyjRU6WSU= +github.com/schollz/mnemonicode v1.0.1/go.mod h1:cl4UAOhUV0mkdjMj/QYaUZbZZdF8BnOqoz8rHMzwboY= +github.com/schollz/pake v1.1.0 h1:+tYqsPVkuirFpmeRePjYTUhIHHKLufdmd7QfuspaXCk= +github.com/schollz/pake v1.1.0/go.mod h1:pL7Z08gnQ4OQ3G27s5e5T6TEzp6cFc5GzCwLm0f75Io= +github.com/schollz/peerdiscovery v1.4.0/go.mod h1:DXj/7VvxAkUuSZNabx3q8t524uWbrhMPxeX151kvvHs= +github.com/schollz/progressbar/v2 v2.9.1/go.mod h1:l6tn6yU6ZdQoF8lwX/VoAUQ3FjhCbrcZDnl9xeWZzYw= +github.com/schollz/progressbar/v2 v2.10.0 h1:AxYYUjr5fOPlA0Pcqc3R3kDBrqyLFWk2P7LRLdXb3yE= +github.com/schollz/progressbar/v2 v2.10.0/go.mod h1:l6tn6yU6ZdQoF8lwX/VoAUQ3FjhCbrcZDnl9xeWZzYw= +github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9 h1:y08o5oQ/slxXE/F0uh5dd8mdVvb+w4NLcNSDSq4c2F0= +github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9/go.mod h1:kCMoQsqzx4MzGJWaALr6tKyCnlrY0kILGLkA1FOiLF4= +github.com/skratchdot/open-golang v0.0.0-20190104022628-a2dfa6d0dab6/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +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= +github.com/tscholl2/siec v0.0.0-20180721101609-21667da05937 h1:lhssCpSe3TjKcbvUoPzFMuv9oUyZDgI3Cmgolfw2C90= +github.com/tscholl2/siec v0.0.0-20180721101609-21667da05937/go.mod h1:KL9+ubr1JZdaKjgAaHr+tCytEncXBa1pR6FjbTsOJnw= +github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20190206173232-65e2d4e15006/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313 h1:pczuHS43Cp2ktBEEmLwScxgjWsBSzdaQiKzUyf3DTTc= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From 005a206460b15fae69a13caed9cc13f69d97ea62 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 17:12:26 -0600 Subject: [PATCH 019/110] update go.mod --- go.mod | 8 -------- go.sum | 16 ++++------------ 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index 361e573..868a4b0 100644 --- a/go.mod +++ b/go.mod @@ -1,28 +1,20 @@ module github.com/schollz/croc/v6 require ( - github.com/BurntSushi/toml v0.3.1 github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 github.com/denisbrodbeck/machineid v1.0.1 - github.com/dustin/go-humanize v1.0.0 github.com/fatih/color v1.7.0 // indirect - github.com/gonutz/w32 v1.0.0 - github.com/gonutz/wui v1.0.0 github.com/gorilla/websocket v1.4.0 github.com/mattn/go-colorable v0.1.1 // indirect github.com/mattn/go-isatty v0.0.7 // indirect github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect - github.com/mitchellh/go-homedir v1.1.0 github.com/pkg/errors v0.8.1 github.com/schollz/mnemonicode v1.0.1 github.com/schollz/pake v1.1.0 - github.com/schollz/peerdiscovery v1.4.0 github.com/schollz/progressbar/v2 v2.10.0 github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9 - github.com/skratchdot/open-golang v0.0.0-20190104022628-a2dfa6d0dab6 github.com/stretchr/testify v1.3.0 github.com/urfave/cli v1.20.0 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 - golang.org/x/net v0.0.0-20190311183353-d8887717615a // indirect golang.org/x/sys v0.0.0-20190312061237-fead79001313 // indirect ) diff --git a/go.sum b/go.sum index 86c9c8d..76fd821 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,13 @@ -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= 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/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ= github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/gonutz/w32 v1.0.0/go.mod h1:Rc/YP5K9gv0FW4p6X9qL3E7Y56lfMflEol1fLElfMW4= -github.com/gonutz/wui v1.0.0/go.mod h1:cpEPmIh19mpxkcho2qMHLX16gVteB1aee8g11887kyE= +github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= @@ -19,25 +17,21 @@ github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mitchellh/colorstring v0.0.0-20150917214807-8631ce90f286/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/schollz/croc v3.0.6+incompatible h1:rCfc8MGgcGjNW2/qSoulPh8CRGH+Ej4i3RWYOwhX9pE= github.com/schollz/mnemonicode v1.0.1 h1:LiH5hwADZwjwnfXsaD4xgnMyTAtaKHN+e5AyjRU6WSU= github.com/schollz/mnemonicode v1.0.1/go.mod h1:cl4UAOhUV0mkdjMj/QYaUZbZZdF8BnOqoz8rHMzwboY= github.com/schollz/pake v1.1.0 h1:+tYqsPVkuirFpmeRePjYTUhIHHKLufdmd7QfuspaXCk= github.com/schollz/pake v1.1.0/go.mod h1:pL7Z08gnQ4OQ3G27s5e5T6TEzp6cFc5GzCwLm0f75Io= -github.com/schollz/peerdiscovery v1.4.0/go.mod h1:DXj/7VvxAkUuSZNabx3q8t524uWbrhMPxeX151kvvHs= -github.com/schollz/progressbar/v2 v2.9.1/go.mod h1:l6tn6yU6ZdQoF8lwX/VoAUQ3FjhCbrcZDnl9xeWZzYw= github.com/schollz/progressbar/v2 v2.10.0 h1:AxYYUjr5fOPlA0Pcqc3R3kDBrqyLFWk2P7LRLdXb3yE= github.com/schollz/progressbar/v2 v2.10.0/go.mod h1:l6tn6yU6ZdQoF8lwX/VoAUQ3FjhCbrcZDnl9xeWZzYw= github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9 h1:y08o5oQ/slxXE/F0uh5dd8mdVvb+w4NLcNSDSq4c2F0= github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9/go.mod h1:kCMoQsqzx4MzGJWaALr6tKyCnlrY0kILGLkA1FOiLF4= -github.com/skratchdot/open-golang v0.0.0-20190104022628-a2dfa6d0dab6/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -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 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/tscholl2/siec v0.0.0-20180721101609-21667da05937 h1:lhssCpSe3TjKcbvUoPzFMuv9oUyZDgI3Cmgolfw2C90= github.com/tscholl2/siec v0.0.0-20180721101609-21667da05937/go.mod h1:KL9+ubr1JZdaKjgAaHr+tCytEncXBa1pR6FjbTsOJnw= @@ -46,8 +40,6 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20190206173232-65e2d4e15006/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313 h1:pczuHS43Cp2ktBEEmLwScxgjWsBSzdaQiKzUyf3DTTc= From 3685a887b89100145520f0858018b551119db608 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 17:16:38 -0600 Subject: [PATCH 020/110] add bytecountdecimal --- src/utils/utils.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/utils/utils.go b/src/utils/utils.go index 4b444be..64d066e 100644 --- a/src/utils/utils.go +++ b/src/utils/utils.go @@ -96,3 +96,16 @@ func GetRandomName() string { result = mnemonicode.EncodeWordList(result, bs) return strings.Join(result, "-") } + +func ByteCountDecimal(b int64) string { + const unit = 1000 + if b < unit { + return fmt.Sprintf("%d B", b) + } + div, exp := int64(unit), 0 + for n := b / unit; n >= unit; n /= unit { + div *= unit + exp++ + } + return fmt.Sprintf("%.1f %cB", float64(b)/float64(div), "kMGTPE"[exp]) +} From ca0b898ca3663b50bce40a0b646826157efe6c91 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 17:24:37 -0600 Subject: [PATCH 021/110] add tests --- src/utils/utils_test.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/utils/utils_test.go diff --git a/src/utils/utils_test.go b/src/utils/utils_test.go new file mode 100644 index 0000000..2d4d9c4 --- /dev/null +++ b/src/utils/utils_test.go @@ -0,0 +1,29 @@ +package utils + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +// Exists reports whether the named file or directory exists. +func TestExists(t *testing.T) { + assert.True(t, Exists("utils.go")) +} + +// HashFile returns the md5 hash of a file +func TestHashFile(t *testing.T) { + b, err := HashFile("utils.go") + assert.Nil(t, err) + assert.Equal(t, "33303e23c9c5e9c194d50b399391754e", fmt.Sprintf("%x", b)) +} + +// SHA256 returns sha256 sum +func TestSHA256(t *testing.T) { + assert.Equal(t, "09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b", SHA256("hello, world")) +} + +func TestByteCountDecimal(t *testing.T) { + assert.Equal(t, "10.0 kB", ByteCountDecimal(10000)) +} From bbd7caa148b19946378d85ddd7467fec3d4bdc70 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 17:25:20 -0600 Subject: [PATCH 022/110] remove relay --- go.sum | 1 + src/relay/conn.go | 123 --------------------------------------------- src/relay/hub.go | 105 -------------------------------------- src/relay/relay.go | 55 -------------------- 4 files changed, 1 insertion(+), 283 deletions(-) delete mode 100644 src/relay/conn.go delete mode 100644 src/relay/hub.go delete mode 100644 src/relay/relay.go diff --git a/go.sum b/go.sum index 76fd821..74c7c04 100644 --- a/go.sum +++ b/go.sum @@ -21,6 +21,7 @@ github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/schollz/croc v3.0.6+incompatible h1:rCfc8MGgcGjNW2/qSoulPh8CRGH+Ej4i3RWYOwhX9pE= github.com/schollz/mnemonicode v1.0.1 h1:LiH5hwADZwjwnfXsaD4xgnMyTAtaKHN+e5AyjRU6WSU= github.com/schollz/mnemonicode v1.0.1/go.mod h1:cl4UAOhUV0mkdjMj/QYaUZbZZdF8BnOqoz8rHMzwboY= github.com/schollz/pake v1.1.0 h1:+tYqsPVkuirFpmeRePjYTUhIHHKLufdmd7QfuspaXCk= diff --git a/src/relay/conn.go b/src/relay/conn.go deleted file mode 100644 index 71a565a..0000000 --- a/src/relay/conn.go +++ /dev/null @@ -1,123 +0,0 @@ -package relay - -import ( - "net/http" - "time" - - log "github.com/cihub/seelog" - "github.com/gorilla/websocket" - "github.com/schollz/croc/src/models" -) - -const ( - // Time allowed to write a message to the peer. - writeWait = 6000 * time.Second - - // Time allowed to read the next pong message from the peer. - pongWait = 6000 * time.Second - - // Send pings to peer with this period. Must be less than pongWait. - pingPeriod = (pongWait * 9) / 10 - - // Maximum message size allowed from peer. - maxMessageSize = models.WEBSOCKET_BUFFER_SIZE / 2 -) - -var upgrader = websocket.Upgrader{ - ReadBufferSize: models.WEBSOCKET_BUFFER_SIZE, - WriteBufferSize: models.WEBSOCKET_BUFFER_SIZE, -} - -// connection is an middleman between the websocket connection and the hub. -type connection struct { - // The websocket connection. - ws *websocket.Conn - - // Buffered channel of outbound messages. - send chan messageChannel -} - -type messageChannel struct { - data []byte - messageType int -} - -// readPump pumps messages from the websocket connection to the hub. -func (s subscription) readPump() { - c := s.conn - defer func() { - h.unregister <- s - c.ws.Close() - }() - c.ws.SetReadLimit(maxMessageSize) - c.ws.SetReadDeadline(time.Now().Add(pongWait)) - c.ws.SetPongHandler(func(string) error { c.ws.SetReadDeadline(time.Now().Add(pongWait)); return nil }) - for { - messageType, msg, err := c.ws.ReadMessage() - if err != nil { - if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) { - log.Debugf("unexpected close: %v", err) - } - break - } - h.broadcast <- message{messageChannel{msg, messageType}, s.room, c.ws.RemoteAddr().String()} - } -} - -// write writes a message with the given message type and payload. -func (c *connection) write(mt int, payload []byte) error { - c.ws.SetWriteDeadline(time.Now().Add(writeWait)) - return c.ws.WriteMessage(mt, payload) -} - -// writePump pumps messages from the hub to the websocket connection. -func (s *subscription) writePump() { - c := s.conn - ticker := time.NewTicker(pingPeriod) - defer func() { - ticker.Stop() - c.ws.Close() - }() - for { - select { - case message, ok := <-c.send: - if !ok { - err := c.write(websocket.CloseMessage, []byte{}) - if err != nil { - log.Debug(err) - } - return - } - if err := c.write(message.messageType, message.data); err != nil { - log.Debug(err) - return - } - case <-ticker.C: - if err := c.write(websocket.PingMessage, []byte{}); err != nil { - log.Debug(err) - return - } - } - } -} - -// serveWs handles websocket requests from the peer. -func serveWs(w http.ResponseWriter, r *http.Request) { - ws, err := upgrader.Upgrade(w, r, nil) - if err != nil { - log.Debug(err) - return - } - vals := r.URL.Query() - room := "default" - rooms, ok := vals["room"] - if ok { - room = rooms[0] - } - - c := &connection{send: make(chan messageChannel, 256), ws: ws} - s := subscription{c, room} - h.register <- s - go s.writePump() - s.readPump() -} diff --git a/src/relay/hub.go b/src/relay/hub.go deleted file mode 100644 index bbb11b3..0000000 --- a/src/relay/hub.go +++ /dev/null @@ -1,105 +0,0 @@ -package relay - -import ( - "sync" - - log "github.com/cihub/seelog" -) - -type message struct { - msg messageChannel - room string - remoteOrigin string -} - -type subscription struct { - conn *connection - room string -} - -// hub maintains the set of active connections and broadcasts messages to the -// connections. -type hub struct { - // Registered connections. - rooms roomMap - - // Inbound messages from the connections. - broadcast chan message - - // Register requests from the connections. - register chan subscription - - // Unregister requests from connections. - unregister chan subscription -} - -type roomMap struct { - rooms map[string]map[*connection]bool - sync.Mutex -} - -var h = hub{ - broadcast: make(chan message), - register: make(chan subscription), - unregister: make(chan subscription), - rooms: roomMap{rooms: make(map[string]map[*connection]bool)}, -} - -func (h *hub) run() { - for { - if stop { - log.Debug("stopping hub") - return - } - select { - case s := <-h.register: - log.Debugf("adding connection to %s", s.room) - h.rooms.Lock() - connections := h.rooms.rooms[s.room] - if connections == nil { - connections = make(map[*connection]bool) - h.rooms.rooms[s.room] = connections - } - h.rooms.rooms[s.room][s.conn] = true - if len(h.rooms.rooms) > 2 { - // if more than three, close all of them - for connection := range h.rooms.rooms[s.room] { - close(connection.send) - } - log.Debugf("deleting room %s", s.room) - delete(h.rooms.rooms, s.room) - } - h.rooms.Unlock() - case s := <-h.unregister: - // if one leaves, close all of them - h.rooms.Lock() - if _, ok := h.rooms.rooms[s.room]; ok { - for connection := range h.rooms.rooms[s.room] { - close(connection.send) - } - log.Debugf("deleting room %s", s.room) - delete(h.rooms.rooms, s.room) - } - h.rooms.Unlock() - case m := <-h.broadcast: - h.rooms.Lock() - connections := h.rooms.rooms[m.room] - for c := range connections { - if c.ws.RemoteAddr().String() == m.remoteOrigin { - continue - } - select { - case c.send <- m.msg: - default: - close(c.send) - delete(connections, c) - if len(connections) == 0 { - log.Debugf("deleting room %s", m.room) - delete(h.rooms.rooms, m.room) - } - } - } - h.rooms.Unlock() - } - } -} diff --git a/src/relay/relay.go b/src/relay/relay.go deleted file mode 100644 index 951a1ea..0000000 --- a/src/relay/relay.go +++ /dev/null @@ -1,55 +0,0 @@ -package relay - -import ( - "context" - "fmt" - "net/http" - "time" - - log "github.com/cihub/seelog" - "github.com/schollz/croc/src/logger" - "github.com/schollz/croc/src/tcp" -) - -var DebugLevel string -var stop bool - -func Stop() { - log.Debug("got stop signal") - stop = true -} - -// Run is the async operation for running a server -func Run(port string, tcpPorts []string) (err error) { - logger.SetLogLevel(DebugLevel) - - if len(tcpPorts) > 0 { - for _, tcpPort := range tcpPorts { - go tcp.Run(DebugLevel, tcpPort) - } - } - - go h.run() - log.Debug("running relay on " + port) - m := http.NewServeMux() - s := http.Server{Addr: ":" + port, Handler: m} - m.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) { - serveWs(w, r) - }) - m.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, "ok") - }) - go func() { - for { - if stop { - s.Shutdown(context.Background()) - log.Debug("stopping http server") - return - } - time.Sleep(10 * time.Millisecond) - } - }() - s.ListenAndServe() - log.Debug("finished") - return -} From 06541ee0d307a8919ee7982aeb32baaa11112437 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 17:29:36 -0600 Subject: [PATCH 023/110] encapsulate --- src/tcp/tcp.go | 64 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 26 deletions(-) diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index 7ecf25a..d76cc20 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -15,6 +15,11 @@ import ( const TCP_BUFFER_SIZE = 1024 * 64 +type server struct { + port string + rooms roomMap +} + type roomInfo struct { first *comm.Comm second *comm.Comm @@ -31,22 +36,29 @@ var rooms roomMap // Run starts a tcp listener, run async func Run(debugLevel, port string) { + s = new(server) + s.port = port + s.debugLevel = debugLevel + s.start() +} + +func (s *server) start() { logger.SetLogLevel(debugLevel) - rooms.Lock() - rooms.rooms = make(map[string]roomInfo) - rooms.Unlock() + s.rooms.Lock() + s.rooms.rooms = make(map[string]roomInfo) + s.rooms.Unlock() // delete old rooms go func() { for { time.Sleep(10 * time.Minute) - rooms.Lock() - for room := range rooms.rooms { - if time.Since(rooms.rooms[room].opened) > 3*time.Hour { - delete(rooms.rooms, room) + s.rooms.Lock() + for room := range s.rooms.rooms { + if time.Since(s.rooms.rooms[room].opened) > 3*time.Hour { + delete(s.rooms.rooms, room) } } - rooms.Unlock() + s.rooms.Unlock() } }() @@ -56,7 +68,7 @@ func Run(debugLevel, port string) { } } -func run(port string) (err error) { +func (s *server) run() (err error) { log.Debugf("starting TCP server on " + port) server, err := net.Listen("tcp", "0.0.0.0:"+port) if err != nil { @@ -95,14 +107,14 @@ func clientCommuncation(port string, c *comm.Comm) (err error) { } room := string(roomBytes) - rooms.Lock() + s.rooms.Lock() // create the room if it is new - if _, ok := rooms.rooms[room]; !ok { - rooms.rooms[room] = roomInfo{ + if _, ok := s.rooms.rooms[room]; !ok { + s.rooms.rooms[room] = roomInfo{ first: c, opened: time.Now(), } - rooms.Unlock() + s.rooms.Unlock() // tell the client that they got the room err = c.Send([]byte("ok")) if err != nil { @@ -112,8 +124,8 @@ func clientCommuncation(port string, c *comm.Comm) (err error) { log.Debugf("room %s has 1", room) return nil } - if rooms.rooms[room].full { - rooms.Unlock() + if s.rooms.rooms[room].full { + s.rooms.Unlock() err = c.Send([]byte("room full")) if err != nil { log.Error(err) @@ -122,14 +134,14 @@ func clientCommuncation(port string, c *comm.Comm) (err error) { return nil } log.Debugf("room %s has 2", room) - rooms.rooms[room] = roomInfo{ - first: rooms.rooms[room].first, + s.rooms.rooms[room] = roomInfo{ + first: s.rooms.rooms[room].first, second: c, - opened: rooms.rooms[room].opened, + opened: s.rooms.rooms[room].opened, full: true, } - otherConnection := rooms.rooms[room].first - rooms.Unlock() + otherConnection := s.rooms.rooms[room].first + s.rooms.Unlock() // second connection is the sender, time to staple connections var wg sync.WaitGroup @@ -151,13 +163,13 @@ func clientCommuncation(port string, c *comm.Comm) (err error) { wg.Wait() // delete room - rooms.Lock() + s.rooms.Lock() log.Debugf("deleting room: %s", room) - rooms.rooms[room].first.Close() - rooms.rooms[room].second.Close() - rooms.rooms[room] = roomInfo{first: nil, second: nil} - delete(rooms.rooms, room) - rooms.Unlock() + s.rooms.rooms[room].first.Close() + s.rooms.rooms[room].second.Close() + s.rooms.rooms[room] = roomInfo{first: nil, second: nil} + delete(s.rooms.rooms, room) + s.rooms.Unlock() return nil } From 7d9b199ca3dfe69a6e66693bddf319032bbeb28f Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 17:38:49 -0600 Subject: [PATCH 024/110] works --- src/tcp/tcp.go | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index d76cc20..e95d777 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -9,15 +9,16 @@ import ( log "github.com/cihub/seelog" "github.com/pkg/errors" - "github.com/schollz/croc/src/comm" - "github.com/schollz/croc/src/logger" + "github.com/schollz/croc/v6/src/comm" + "github.com/schollz/croc/v6/src/logger" ) const TCP_BUFFER_SIZE = 1024 * 64 type server struct { - port string - rooms roomMap + port string + debugLevel string + rooms roomMap } type roomInfo struct { @@ -32,18 +33,16 @@ type roomMap struct { sync.Mutex } -var rooms roomMap - // Run starts a tcp listener, run async func Run(debugLevel, port string) { - s = new(server) + s := new(server) s.port = port s.debugLevel = debugLevel s.start() } func (s *server) start() { - logger.SetLogLevel(debugLevel) + logger.SetLogLevel(s.debugLevel) s.rooms.Lock() s.rooms.rooms = make(map[string]roomInfo) s.rooms.Unlock() @@ -62,17 +61,17 @@ func (s *server) start() { } }() - err := run(port) + err := s.run() if err != nil { log.Error(err) } } func (s *server) run() (err error) { - log.Debugf("starting TCP server on " + port) - server, err := net.Listen("tcp", "0.0.0.0:"+port) + log.Debugf("starting TCP server on " + s.port) + server, err := net.Listen("tcp", "0.0.0.0:"+s.port) if err != nil { - return errors.Wrap(err, "Error listening on :"+port) + return errors.Wrap(err, "Error listening on :"+s.port) } defer server.Close() // spawn a new goroutine whenever a client connects @@ -83,15 +82,15 @@ func (s *server) run() (err error) { } log.Debugf("client %s connected", connection.RemoteAddr().String()) go func(port string, connection net.Conn) { - errCommunication := clientCommuncation(port, comm.New(connection)) + errCommunication := s.clientCommuncation(port, comm.New(connection)) if errCommunication != nil { log.Warnf("relay-%s: %s", connection.RemoteAddr().String(), errCommunication.Error()) } - }(port, connection) + }(s.port, connection) } } -func clientCommuncation(port string, c *comm.Comm) (err error) { +func (s *server) clientCommuncation(port string, c *comm.Comm) (err error) { // send ok to tell client they are connected log.Debug("sending ok") err = c.Send([]byte("ok")) From a7f12ca1797f0e1192204825a829307a7cfd764e Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 17:58:37 -0600 Subject: [PATCH 025/110] need to export encryption --- src/crypt/crypt.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/crypt/crypt.go b/src/crypt/crypt.go index 2be5793..b64b9bc 100644 --- a/src/crypt/crypt.go +++ b/src/crypt/crypt.go @@ -9,15 +9,15 @@ import ( "golang.org/x/crypto/pbkdf2" ) -type encryption struct { +type Encryption struct { key []byte passphrase []byte salt []byte } -// New generates a new encryption, using the supplied passphrase and +// New generates a new Encryption, using the supplied passphrase and // an optional supplied salt. -func New(passphrase []byte, salt []byte) (e encryption, err error) { +func New(passphrase []byte, salt []byte) (e Encryption, err error) { e.passphrase = passphrase if salt == nil { e.salt = make([]byte, 8) @@ -31,12 +31,12 @@ func New(passphrase []byte, salt []byte) (e encryption, err error) { return } -func (e encryption) Salt() []byte { +func (e Encryption) Salt() []byte { return e.salt } -// Encrypt will generate an encryption, prefixed with the IV -func (e encryption) Encrypt(plaintext []byte) (encrypted []byte, err error) { +// Encrypt will generate an Encryption, prefixed with the IV +func (e Encryption) Encrypt(plaintext []byte) (encrypted []byte, err error) { // generate a random iv each time // http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf // Section 8.2 @@ -55,8 +55,8 @@ func (e encryption) Encrypt(plaintext []byte) (encrypted []byte, err error) { return } -// Decrypt an encryption -func (e encryption) Decrypt(encrypted []byte) (plaintext []byte, err error) { +// Decrypt an Encryption +func (e Encryption) Decrypt(encrypted []byte) (plaintext []byte, err error) { b, err := aes.NewCipher(e.key) if err != nil { return From 6b149480d493a5fb46c25493e02baf021ade50f5 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 18:03:19 -0600 Subject: [PATCH 026/110] add messaging --- src/message/message.go | 40 +++++++++++++++++++++++++++++++++++++ src/message/message_test.go | 23 +++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 src/message/message.go create mode 100644 src/message/message_test.go diff --git a/src/message/message.go b/src/message/message.go new file mode 100644 index 0000000..049a53f --- /dev/null +++ b/src/message/message.go @@ -0,0 +1,40 @@ +package message + +import ( + "encoding/json" + + "github.com/schollz/croc/v6/src/compress" + "github.com/schollz/croc/v6/src/crypt" +) + +type Message struct { + Type string `json:"t,omitempty"` + Message string `json:"m,omitempty"` + Bytes []byte `json:"b,omitempty"` + Num int `json:"n,omitempty"` +} + +func Encode(m Message, e ...crypt.Encryption) (b []byte, err error) { + b, err = json.Marshal(m) + if err != nil { + return + } + + b = compress.Compress(b) + if len(e) > 0 { + b, err = e[0].Encrypt(b) + } + return +} + +func Decode(b []byte, e ...crypt.Encryption) (m Message, err error) { + if len(e) > 0 { + b, err = e[0].Decrypt(b) + if err != nil { + return + } + } + b = compress.Decompress(b) + err = json.Unmarshal(b, &m) + return +} diff --git a/src/message/message_test.go b/src/message/message_test.go new file mode 100644 index 0000000..5de3471 --- /dev/null +++ b/src/message/message_test.go @@ -0,0 +1,23 @@ +package message + +import ( + "fmt" + "testing" + + "github.com/schollz/croc/v6/src/crypt" + "github.com/stretchr/testify/assert" +) + +func TestMessage(t *testing.T) { + m := Message{Type: "message", Message: "hello, world"} + e, err := crypt.New([]byte("passphrase"), nil) + assert.Nil(t, err) + fmt.Println(e.Salt()) + b, err := Encode(m, e) + assert.Nil(t, err) + fmt.Printf("%x\n", b) + + m2, err := Decode(b, e) + assert.Nil(t, err) + assert.Equal(t, m, m2) +} From a17f3096a0f449d7bab0408d8dc4abf8e7134b03 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 18:55:37 -0700 Subject: [PATCH 027/110] no isclosed --- src/comm/comm.go | 15 --------------- src/comm/comm_test.go | 2 +- src/tcp/tcp_test.go | 2 -- src/utils/utils_test.go | 2 +- 4 files changed, 2 insertions(+), 19 deletions(-) diff --git a/src/comm/comm.go b/src/comm/comm.go index 7e11989..70c4a8a 100644 --- a/src/comm/comm.go +++ b/src/comm/comm.go @@ -15,21 +15,6 @@ type Comm struct { connection net.Conn } -func (c *Comm) IsClosed() bool { - one := []byte{} - c.connection.SetReadDeadline(time.Now()) - _, err := c.connection.Read(one) - if err != nil { - fmt.Println(err) - c.connection.Close() - c.connection = nil - return true - } else { - c.connection.SetReadDeadline(time.Now().Add(3 * time.Hour)) - } - return false -} - // NewConnection gets a new comm to a tcp address func NewConnection(address string) (c *Comm, err error) { connection, err := net.DialTimeout("tcp", address, 3*time.Second) diff --git a/src/comm/comm_test.go b/src/comm/comm_test.go index 207b231..5db5f1a 100644 --- a/src/comm/comm_test.go +++ b/src/comm/comm_test.go @@ -47,7 +47,7 @@ func TestComm(t *testing.T) { } }() - time.Sleep(100 * time.Millisecond) + time.Sleep(300 * time.Millisecond) a, err := NewConnection("localhost:" + port) assert.Nil(t, err) data, err := a.Receive() diff --git a/src/tcp/tcp_test.go b/src/tcp/tcp_test.go index 1a75ae4..73f2a94 100644 --- a/src/tcp/tcp_test.go +++ b/src/tcp/tcp_test.go @@ -17,7 +17,6 @@ func TestTCP(t *testing.T) { _, err = ConnectToTCPServer("localhost:8081", "testRoom") assert.NotNil(t, err) - assert.False(t, c1.IsClosed()) // try sending data assert.Nil(t, c1.Send([]byte("hello, c2"))) data, err := c2.Receive() @@ -30,5 +29,4 @@ func TestTCP(t *testing.T) { assert.Equal(t, []byte("hello, c1"), data) c1.Close() - assert.True(t, c1.IsClosed()) } diff --git a/src/utils/utils_test.go b/src/utils/utils_test.go index 2d4d9c4..2b8ab8e 100644 --- a/src/utils/utils_test.go +++ b/src/utils/utils_test.go @@ -16,7 +16,7 @@ func TestExists(t *testing.T) { func TestHashFile(t *testing.T) { b, err := HashFile("utils.go") assert.Nil(t, err) - assert.Equal(t, "33303e23c9c5e9c194d50b399391754e", fmt.Sprintf("%x", b)) + assert.Equal(t, "9a66e5c18b9759073666953da376c037", fmt.Sprintf("%x", b)) } // SHA256 returns sha256 sum From 9223fc79e9d337cc9a5a7034904cef5c2740fb4c Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 19:19:25 -0700 Subject: [PATCH 028/110] allow option to skip encryption --- src/crypt/crypt.go | 13 +++++++++++++ src/crypt/crypt_test.go | 15 +++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/crypt/crypt.go b/src/crypt/crypt.go index b64b9bc..743eb91 100644 --- a/src/crypt/crypt.go +++ b/src/crypt/crypt.go @@ -17,7 +17,12 @@ type Encryption struct { // New generates a new Encryption, using the supplied passphrase and // an optional supplied salt. +// Passing nil passphrase will not use decryption. func New(passphrase []byte, salt []byte) (e Encryption, err error) { + if passphrase == nil { + e = Encryption{nil, nil, nil} + return + } e.passphrase = passphrase if salt == nil { e.salt = make([]byte, 8) @@ -37,6 +42,10 @@ func (e Encryption) Salt() []byte { // Encrypt will generate an Encryption, prefixed with the IV func (e Encryption) Encrypt(plaintext []byte) (encrypted []byte, err error) { + if e.passphrase == nil { + encrypted = plaintext + return + } // generate a random iv each time // http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf // Section 8.2 @@ -57,6 +66,10 @@ func (e Encryption) Encrypt(plaintext []byte) (encrypted []byte, err error) { // Decrypt an Encryption func (e Encryption) Decrypt(encrypted []byte) (plaintext []byte, err error) { + if e.passphrase == nil { + plaintext = encrypted + return + } b, err := aes.NewCipher(e.key) if err != nil { return diff --git a/src/crypt/crypt_test.go b/src/crypt/crypt_test.go index 2378601..f4fc6b9 100644 --- a/src/crypt/crypt_test.go +++ b/src/crypt/crypt_test.go @@ -44,3 +44,18 @@ func TestEncryption(t *testing.T) { assert.NotEqual(t, dec, []byte("hello, world")) } + + +func TestNoEncryption(t *testing.T) { + bob, err := New(nil, nil) + assert.Nil(t, err) + jane, err := New(nil,nil) + assert.Nil(t, err) + enc, err := bob.Encrypt([]byte("hello, world")) + assert.Nil(t, err) + dec, err := jane.Decrypt(enc) + assert.Nil(t, err) + assert.Equal(t, dec, []byte("hello, world")) + assert.Equal(t, enc, []byte("hello, world")) + +} \ No newline at end of file From 662bce58a3a9fc21db5f9e9ae19126520fb7b1ac Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 19:19:48 -0700 Subject: [PATCH 029/110] allow sending --- src/message/message.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/message/message.go b/src/message/message.go index 049a53f..5322c9b 100644 --- a/src/message/message.go +++ b/src/message/message.go @@ -5,8 +5,10 @@ import ( "github.com/schollz/croc/v6/src/compress" "github.com/schollz/croc/v6/src/crypt" + "github.com/schollz/croc/v6/src/comm" ) +// Message is the possible payload for messaging type Message struct { Type string `json:"t,omitempty"` Message string `json:"m,omitempty"` @@ -14,6 +16,22 @@ type Message struct { Num int `json:"n,omitempty"` } +func (m Message) String() string { + b, _ := json.Marshal(m) + return string(b) +} + +// Send will send out +func Send(c *comm.Comm, m Message) (err error) { + mSend, err := Encode(m) + if err != nil { + return + } + _, err = c.Write(mSend) +return +} + +// Encode will convert to bytes func Encode(m Message, e ...crypt.Encryption) (b []byte, err error) { b, err = json.Marshal(m) if err != nil { @@ -27,6 +45,7 @@ func Encode(m Message, e ...crypt.Encryption) (b []byte, err error) { return } +// Decode will convert from bytes func Decode(b []byte, e ...crypt.Encryption) (m Message, err error) { if len(e) > 0 { b, err = e[0].Decrypt(b) From 972dce1ec58c3f2f1dff4a66be2b97ffc8eeffa1 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 19:20:03 -0700 Subject: [PATCH 030/110] don't hardcode address --- src/tcp/tcp.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index e95d777..404a03e 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -222,8 +222,9 @@ func pipe(conn1 net.Conn, conn2 net.Conn) { } } } + func ConnectToTCPServer(address, room string) (c *comm.Comm, err error) { - c, err = comm.NewConnection("localhost:8081") + c, err = comm.NewConnection(address) if err != nil { return } From ac113dfe47937c531ce2a21255aa53e1e2e18e1b Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 19:50:01 -0700 Subject: [PATCH 031/110] initial part works --- src/cli/cli.go | 4 +- src/croc/croc.go | 285 ++++++++++-------------------------- src/message/message.go | 27 ++-- src/message/message_test.go | 6 +- src/utils/utils.go | 42 ++++++ 5 files changed, 136 insertions(+), 228 deletions(-) diff --git a/src/cli/cli.go b/src/cli/cli.go index ff8047f..7543208 100644 --- a/src/cli/cli.go +++ b/src/cli/cli.go @@ -152,7 +152,7 @@ func send(c *cli.Context) (err error) { IsSender: true, Debug: c.GlobalBool("debug"), NoPrompt: c.GlobalBool("yes"), - AddressRelay: c.GlobalString("relay"), + RelayAddress: c.GlobalString("relay"), Stdout: c.GlobalBool("stdout"), }) if err != nil { @@ -187,7 +187,7 @@ func receive(c *cli.Context) (err error) { IsSender: false, Debug: c.GlobalBool("debug"), NoPrompt: c.GlobalBool("yes"), - AddressRelay: c.GlobalString("relay"), + RelayAddress: c.GlobalString("relay"), Stdout: c.GlobalBool("stdout"), }) if err != nil { diff --git a/src/croc/croc.go b/src/croc/croc.go index e26fb1b..55b13e5 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -6,7 +6,6 @@ import ( "encoding/base64" "encoding/json" "fmt" - "math" "os" "path" "path/filepath" @@ -16,18 +15,18 @@ import ( log "github.com/cihub/seelog" "github.com/denisbrodbeck/machineid" + "github.com/pkg/errors" "github.com/schollz/croc/v6/src/comm" "github.com/schollz/croc/v6/src/crypt" "github.com/schollz/croc/v6/src/logger" + "github.com/schollz/croc/v6/src/message" + "github.com/schollz/croc/v6/src/tcp" "github.com/schollz/croc/v6/src/utils" "github.com/schollz/pake" "github.com/schollz/progressbar/v2" "github.com/schollz/spinner" ) -const BufferSize = 4096 * 10 -const Channels = 1 - func init() { logger.SetLogLevel("debug") } @@ -44,7 +43,8 @@ type Options struct { IsSender bool SharedSecret string Debug bool - AddressRelay string + RelayAddress string + RelayPorts []string Stdout bool NoPrompt bool } @@ -52,6 +52,7 @@ type Options struct { type Client struct { Options Options Pake *pake.Pake + Key crypt.Encryption // steps involved in forming relationship Step1ChannelSecured bool @@ -68,8 +69,8 @@ type Client struct { CurrentFile *os.File CurrentFileChunks []int64 - // tcp connectios - conn [17]*comm.Comm + // tcp connections + conn []*comm.Comm bar *progressbar.ProgressBar spinner *spinner.Spinner @@ -79,13 +80,6 @@ type Client struct { quit chan bool } -type Message struct { - Type string `json:"t,omitempty"` - Message string `json:"m,omitempty"` - Bytes []byte `json:"b,omitempty"` - Num int `json:"n,omitempty"` -} - type Chunk struct { Bytes []byte `json:"b,omitempty"` Location int64 `json:"l,omitempty"` @@ -112,11 +106,6 @@ type SenderInfo struct { FilesToTransfer []FileInfo } -func (m Message) String() string { - b, _ := json.Marshal(m) - return string(b) -} - // New establishes a new connection for transfering files between two instances. func New(ops Options) (c *Client, err error) { c = new(Client) @@ -126,6 +115,22 @@ func New(ops Options) (c *Client, err error) { Debug(c.Options.Debug) log.Debugf("options: %+v", c.Options) + log.Debug("establishing connection") + c.conn = make([]*comm.Comm, len(c.Options.RelayPorts)) + // connect to the relay for messaging + c.conn[0], err = tcp.ConnectToTCPServer(fmt.Sprintf("%s:%s", c.Options.RelayAddress, c.Options.RelayPorts[0]), c.Options.SharedSecret) + if err != nil { + err = errors.Wrap(err, fmt.Sprintf("could not connect to %s:%s", c.Options.RelayAddress, c.Options.RelayPorts[0])) + return + } + log.Debugf("connection established: %+v", c.conn[0]) + + // use default key (no encryption, until PAKE succeeds) + c.Key, err = crypt.New(nil, nil) + if err != nil { + return + } + // initialize pake if c.Options.IsSender { c.Pake, err = pake.Init([]byte(c.Options.SharedSecret), 1, elliptic.P521(), 1*time.Microsecond) @@ -140,6 +145,7 @@ func New(ops Options) (c *Client, err error) { return } +// TransferOptions for sending type TransferOptions struct { PathToFiles []string KeepPathInRemote bool @@ -156,6 +162,8 @@ func (c *Client) Receive() (err error) { } func (c *Client) transfer(options TransferOptions) (err error) { + // connect to the server + if c.Options.IsSender { c.FilesToTransfer = make([]FileInfo, len(options.PathToFiles)) totalFilesSize := int64(0) @@ -224,9 +232,9 @@ func (c *Client) transfer(options TransferOptions) (err error) { c.machineID = machID fmt.Fprintf(os.Stderr, "Sending %s (%s) from your machine, '%s'\n", fname, utils.ByteCountDecimal(totalFilesSize), machID) fmt.Fprintf(os.Stderr, "Code is: %s\nOn the other computer run\n\ncroc %s\n", c.Options.SharedSecret, c.Options.SharedSecret) - c.spinner.Suffix = " waiting for recipient..." + // // c.spinner.Suffix = " waiting for recipient..." } - c.spinner.Start() + // c.spinner.Start() // create channel for quitting // quit with c.quit <- true c.quit = make(chan bool) @@ -234,10 +242,10 @@ func (c *Client) transfer(options TransferOptions) (err error) { // if recipient, initialize with sending pake information log.Debug("ready") if !c.Options.IsSender && !c.Step1ChannelSecured { - err = c.redisdb.Publish(c.nameOutChannel, Message{ + err = message.Send(c.conn[0], c.Key, message.Message{ Type: "pake", Bytes: c.Pake.Bytes(), - }.String()).Err() + }) if err != nil { return } @@ -245,70 +253,63 @@ func (c *Client) transfer(options TransferOptions) (err error) { // listen for incoming messages and process them for { - select { - case <-c.quit: + var data []byte + data, err = c.conn[0].Receive() + if err != nil { + return + } + err = c.processMessage(data) + if err != nil { return - case msg := <-c.incomingMessageChannel: - var m Message - err = json.Unmarshal([]byte(msg.Payload), &m) - if err != nil { - return - } - if m.Type == "finished" { - err = c.redisdb.Publish(c.nameOutChannel, Message{ - Type: "finished", - }.String()).Err() - return err - } - err = c.processMessage(m) - if err != nil { - return - } - default: - time.Sleep(1 * time.Millisecond) } } return } -func (c *Client) processMessage(m Message) (err error) { +func (c *Client) processMessage(payload []byte) (err error) { + m, err := message.Decode(c.Key, payload) + if err != nil { + return + } + switch m.Type { case "pake": - if c.spinner.Suffix != " performing PAKE..." { - c.spinner.Stop() - c.spinner.Suffix = " performing PAKE..." - c.spinner.Start() - } + // if // c.spinner.Suffix != " performing PAKE..." { + // // c.spinner.Stop() + // // c.spinner.Suffix = " performing PAKE..." + // // c.spinner.Start() + // } notVerified := !c.Pake.IsVerified() err = c.Pake.Update(m.Bytes) if err != nil { return } if (notVerified && c.Pake.IsVerified() && !c.Options.IsSender) || !c.Pake.IsVerified() { - err = c.redisdb.Publish(c.nameOutChannel, Message{ + err = message.Send(c.conn[0], c.Key, message.Message{ Type: "pake", Bytes: c.Pake.Bytes(), - }.String()).Err() + }) } if c.Pake.IsVerified() { - log.Debug(c.Pake.SessionKey()) + log.Debug("session key is verified, generating encryption") + key, err := c.Pake.SessionKey() + if err != nil { + return err + } + c.Key, err = crypt.New(key, []byte(c.Options.SharedSecret)) + if err != nil { + return err + } c.Step1ChannelSecured = true } case "error": - c.spinner.Stop() + // c.spinner.Stop() fmt.Print("\r") err = fmt.Errorf("peer error: %s", m.Message) return err case "fileinfo": var senderInfo SenderInfo - var decryptedBytes []byte - key, _ := c.Pake.SessionKey() - decryptedBytes, err = crypt.DecryptFromBytes(m.Bytes, key) - if err != nil { - log.Error(err) - return - } - err = json.Unmarshal(decryptedBytes, &senderInfo) + err = json.Unmarshal(m.Bytes, &senderInfo) if err != nil { log.Error(err) return @@ -322,14 +323,14 @@ func (c *Client) processMessage(m Message) (err error) { for _, fi := range c.FilesToTransfer { totalSize += fi.Size } - c.spinner.Stop() + // c.spinner.Stop() if !c.Options.NoPrompt { fmt.Fprintf(os.Stderr, "\rAccept %s (%s) from machine '%s'? (y/n) ", fname, utils.ByteCountDecimal(totalSize), senderInfo.MachineID) if strings.ToLower(strings.TrimSpace(utils.GetInput(""))) != "y" { - err = c.redisdb.Publish(c.nameOutChannel, Message{ + err = message.Send(c.conn[0], c.Key, message.Message{ Type: "error", Message: "refusing files", - }.String()).Err() + }) return fmt.Errorf("refused files") } } else { @@ -339,68 +340,22 @@ func (c *Client) processMessage(m Message) (err error) { c.Step2FileInfoTransfered = true case "recipientready": var remoteFile RemoteFileRequest - var decryptedBytes []byte - key, _ := c.Pake.SessionKey() - decryptedBytes, err = crypt.DecryptFromBytes(m.Bytes, key) - if err != nil { - log.Error(err) - return - } - err = json.Unmarshal(decryptedBytes, &remoteFile) + err = json.Unmarshal(m.Bytes, &remoteFile) if err != nil { return } c.FilesToTransferCurrentNum = remoteFile.FilesToTransferCurrentNum c.CurrentFileChunks = remoteFile.CurrentFileChunks c.Step3RecipientRequestFile = true - case "datachannel-offer": - err = c.dataChannelReceive() - if err != nil { - return - } - err = c.recvSess.SetSDP(m.Message) - if err != nil { - return - } - var answer string - answer, err = c.recvSess.CreateAnswer() - if err != nil { - return - } - // Output the answer in base64 so we can paste it in browser - err = c.redisdb.Publish(c.nameOutChannel, Message{ - Type: "datachannel-answer", - Message: answer, - Num: m.Num, - }.String()).Err() - // start receiving data - pathToFile := path.Join(c.FilesToTransfer[c.FilesToTransferCurrentNum].FolderRemote, c.FilesToTransfer[c.FilesToTransferCurrentNum].Name) - c.spinner.Stop() - key, _ := c.Pake.SessionKey() - c.recvSess.ReceiveData(pathToFile, c.FilesToTransfer[c.FilesToTransferCurrentNum].Size, key) - log.Debug("sending close-sender") - err = c.redisdb.Publish(c.nameOutChannel, Message{ - Type: "close-sender", - }.String()).Err() - case "datachannel-answer": - log.Debug("got answer:", m.Message) - // Apply the answer as the remote description - err = c.sendSess.SetSDP(m.Message) - pathToFile := path.Join(c.FilesToTransfer[c.FilesToTransferCurrentNum].FolderSource, c.FilesToTransfer[c.FilesToTransferCurrentNum].Name) - c.spinner.Stop() - fmt.Fprintf(os.Stderr, "\r\nTransfering...\n") - key, _ := c.Pake.SessionKey() - c.sendSess.TransferFile(pathToFile, key) case "close-sender": log.Debug("close-sender received...") c.Step4FileTransfer = false c.Step3RecipientRequestFile = false - c.sendSess.StopSending() log.Debug("sending close-recipient") - err = c.redisdb.Publish(c.nameOutChannel, Message{ + err = message.Send(c.conn[0], c.Key, message.Message{ Type: "close-recipient", Num: m.Num, - }.String()).Err() + }) case "close-recipient": c.Step4FileTransfer = false c.Step3RecipientRequestFile = false @@ -424,11 +379,10 @@ func (c *Client) updateState() (err error) { log.Error(err) return } - key, _ := c.Pake.SessionKey() - err = c.redisdb.Publish(c.nameOutChannel, Message{ + err = message.Send(c.conn[0], c.Key, message.Message{ Type: "fileinfo", - Bytes: crypt.EncryptToBytes(b, key), - }.String()).Err() + Bytes: b, + }) if err != nil { return } @@ -456,9 +410,9 @@ func (c *Client) updateState() (err error) { if finished { // TODO: do the last finishing stuff log.Debug("finished") - err = c.redisdb.Publish(c.nameOutChannel, Message{ + err = message.Send(c.conn[0], c.Key, message.Message{ Type: "finished", - }.String()).Err() + }) if err != nil { panic(err) } @@ -472,107 +426,24 @@ func (c *Client) updateState() (err error) { CurrentFileChunks: c.CurrentFileChunks, FilesToTransferCurrentNum: c.FilesToTransferCurrentNum, }) - key, _ := c.Pake.SessionKey() - err = c.redisdb.Publish(c.nameOutChannel, Message{ + err = message.Send(c.conn[0], c.Key, message.Message{ Type: "recipientready", - Bytes: crypt.EncryptToBytes(bRequest, key), - }.String()).Err() + Bytes: bRequest, + }) if err != nil { return } c.Step3RecipientRequestFile = true - err = c.dataChannelReceive() + // TODO: receive } if c.Options.IsSender && c.Step3RecipientRequestFile && !c.Step4FileTransfer { log.Debug("start sending data!") - err = c.dataChannelSend() + // TODO: send c.Step4FileTransfer = true } return } -func (c *Client) dataChannelReceive() (err error) { - c.recvSess = receiver.NewWith(receiver.Config{}) - err = c.recvSess.CreateConnection() - if err != nil { - return - } - c.recvSess.CreateDataHandler() - return -} - -func (c *Client) dataChannelSend() (err error) { - c.sendSess = sender.NewWith(sender.Config{ - Configuration: common.Configuration{ - OnCompletion: func() { - }, - }, - }) - - if err := c.sendSess.CreateConnection(); err != nil { - log.Error(err) - return err - } - if err := c.sendSess.CreateDataChannel(); err != nil { - log.Error(err) - return err - } - offer, err := c.sendSess.CreateOffer() - if err != nil { - log.Error(err) - return err - } - - // sending offer - err = c.redisdb.Publish(c.nameOutChannel, Message{ - Type: "datachannel-offer", - Message: offer, - }.String()).Err() - if err != nil { - return - } - - return -} - -// MissingChunks returns the positions of missing chunks. -// If file doesn't exist, it returns an empty chunk list (all chunks). -// If the file size is not the same as requested, it returns an empty chunk list (all chunks). -func MissingChunks(fname string, fsize int64, chunkSize int) (chunks []int64) { - fstat, err := os.Stat(fname) - if fstat.Size() != fsize { - return - } - - f, err := os.Open(fname) - if err != nil { - return - } - defer f.Close() - - buffer := make([]byte, chunkSize) - emptyBuffer := make([]byte, chunkSize) - chunkNum := 0 - chunks = make([]int64, int64(math.Ceil(float64(fsize)/float64(chunkSize)))) - var currentLocation int64 - for { - bytesread, err := f.Read(buffer) - if err != nil { - break - } - if bytes.Equal(buffer[:bytesread], emptyBuffer[:bytesread]) { - chunks[chunkNum] = currentLocation - } - currentLocation += int64(bytesread) - } - if chunkNum == 0 { - chunks = []int64{} - } else { - chunks = chunks[:chunkNum] - } - return -} - // Encode encodes the input in base64 // It can optionally zip the input before encoding func Encode(obj interface{}) string { diff --git a/src/message/message.go b/src/message/message.go index 5322c9b..2c43c8c 100644 --- a/src/message/message.go +++ b/src/message/message.go @@ -3,9 +3,9 @@ package message import ( "encoding/json" + "github.com/schollz/croc/v6/src/comm" "github.com/schollz/croc/v6/src/compress" "github.com/schollz/croc/v6/src/crypt" - "github.com/schollz/croc/v6/src/comm" ) // Message is the possible payload for messaging @@ -21,37 +21,32 @@ func (m Message) String() string { return string(b) } -// Send will send out -func Send(c *comm.Comm, m Message) (err error) { - mSend, err := Encode(m) +// Send will send out +func Send(c *comm.Comm, key crypt.Encryption, m Message) (err error) { + mSend, err := Encode(key, m) if err != nil { return } _, err = c.Write(mSend) -return + return } // Encode will convert to bytes -func Encode(m Message, e ...crypt.Encryption) (b []byte, err error) { +func Encode(key crypt.Encryption, m Message) (b []byte, err error) { b, err = json.Marshal(m) if err != nil { return } - b = compress.Compress(b) - if len(e) > 0 { - b, err = e[0].Encrypt(b) - } + b, err = key.Encrypt(b) return } // Decode will convert from bytes -func Decode(b []byte, e ...crypt.Encryption) (m Message, err error) { - if len(e) > 0 { - b, err = e[0].Decrypt(b) - if err != nil { - return - } +func Decode(key crypt.Encryption, b []byte) (m Message, err error) { + b, err = key.Decrypt(b) + if err != nil { + return } b = compress.Decompress(b) err = json.Unmarshal(b, &m) diff --git a/src/message/message_test.go b/src/message/message_test.go index 5de3471..861500c 100644 --- a/src/message/message_test.go +++ b/src/message/message_test.go @@ -10,14 +10,14 @@ import ( func TestMessage(t *testing.T) { m := Message{Type: "message", Message: "hello, world"} - e, err := crypt.New([]byte("passphrase"), nil) + e, err := crypt.New(nil, nil) assert.Nil(t, err) fmt.Println(e.Salt()) - b, err := Encode(m, e) + b, err := Encode(e, m) assert.Nil(t, err) fmt.Printf("%x\n", b) - m2, err := Decode(b, e) + m2, err := Decode(e, b) assert.Nil(t, err) assert.Equal(t, m, m2) } diff --git a/src/utils/utils.go b/src/utils/utils.go index 64d066e..32f5989 100644 --- a/src/utils/utils.go +++ b/src/utils/utils.go @@ -9,7 +9,9 @@ import ( "io" "io/ioutil" "log" + "bytes" "net" + "math" "net/http" "os" "strings" @@ -109,3 +111,43 @@ func ByteCountDecimal(b int64) string { } return fmt.Sprintf("%.1f %cB", float64(b)/float64(div), "kMGTPE"[exp]) } + + + +// MissingChunks returns the positions of missing chunks. +// If file doesn't exist, it returns an empty chunk list (all chunks). +// If the file size is not the same as requested, it returns an empty chunk list (all chunks). +func MissingChunks(fname string, fsize int64, chunkSize int) (chunks []int64) { + fstat, err := os.Stat(fname) + if fstat.Size() != fsize { + return + } + + f, err := os.Open(fname) + if err != nil { + return + } + defer f.Close() + + buffer := make([]byte, chunkSize) + emptyBuffer := make([]byte, chunkSize) + chunkNum := 0 + chunks = make([]int64, int64(math.Ceil(float64(fsize)/float64(chunkSize)))) + var currentLocation int64 + for { + bytesread, err := f.Read(buffer) + if err != nil { + break + } + if bytes.Equal(buffer[:bytesread], emptyBuffer[:bytesread]) { + chunks[chunkNum] = currentLocation + } + currentLocation += int64(bytesread) + } + if chunkNum == 0 { + chunks = []int64{} + } else { + chunks = chunks[:chunkNum] + } + return +} From 7d1f7adddb44522416000d93c999f1286d077155 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 19:51:44 -0700 Subject: [PATCH 032/110] remove travis for now --- .travis.yml | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 39ad0d7..0000000 --- a/.travis.yml +++ /dev/null @@ -1,21 +0,0 @@ -language: go - -go: - - tip - -env: - - "PATH=/home/travis/gopath/bin:$PATH" - -install: true - -script: - - env GO111MODULE=on go build -v - - env GO111MODULE=on go test -v -cover github.com/schollz/croc/src/compress - - env GO111MODULE=on go test -v -cover github.com/schollz/croc/src/croc - - env GO111MODULE=on go test -v -cover github.com/schollz/croc/src/crypt - - env GO111MODULE=on go test -v -cover github.com/schollz/croc/src/models - - env GO111MODULE=on go test -v -cover github.com/schollz/croc/src/relay - - env GO111MODULE=on go test -v -cover github.com/schollz/croc/src/tcp - - env GO111MODULE=on go test -v -cover github.com/schollz/croc/src/utils - - env GO111MODULE=on go test -v -cover github.com/schollz/croc/src/zipper - From 859130a9880ca35916aa9abd0d288f79716eb6ce Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 19:51:54 -0700 Subject: [PATCH 033/110] add croc test --- src/croc/croc_test.go | 67 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/croc/croc_test.go diff --git a/src/croc/croc_test.go b/src/croc/croc_test.go new file mode 100644 index 0000000..643fc52 --- /dev/null +++ b/src/croc/croc_test.go @@ -0,0 +1,67 @@ +package croc + +import ( + "sync" + "testing" + "time" + + log "github.com/cihub/seelog" + "github.com/schollz/croc/v6/src/tcp" +) + +func TestCroc(t *testing.T) { + defer log.Flush() + + go tcp.Run("debug", "8081") + go tcp.Run("debug", "8082") + go tcp.Run("debug", "8083") + go tcp.Run("debug", "8084") + go tcp.Run("debug", "8085") + time.Sleep(300 * time.Millisecond) + + log.Flush() + log.Debug("setting up sender") + log.Flush() + sender, err := New(Options{ + IsSender: true, + SharedSecret: "test", + Debug: true, + RelayAddress: "localhost", + RelayPorts: []string{"8081", "8082", "8083"}, + Stdout: false, + NoPrompt: true, + }) + if err != nil { + panic(err) + } + + log.Debug("setting up receiver") + receiver, err := New(Options{ + IsSender: false, + SharedSecret: "test", + Debug: true, + RelayAddress: "localhost", + RelayPorts: []string{"8081", "8082", "8083"}, + Stdout: false, + NoPrompt: true, + }) + if err != nil { + panic(err) + } + + var wg sync.WaitGroup + wg.Add(2) + go func() { + sender.Send(TransferOptions{ + PathToFiles: []string{"../../README.md"}, + }) + wg.Done() + }() + time.Sleep(100 * time.Millisecond) + go func() { + receiver.Receive() + wg.Done() + }() + + wg.Wait() +} From c1c8e394991b3bb1c7c38f0621c2c17ca8c84441 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 20:40:42 -0700 Subject: [PATCH 034/110] working --- go.mod | 7 +- go.sum | 11 +++ src/croc/croc.go | 209 +++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 201 insertions(+), 26 deletions(-) diff --git a/go.mod b/go.mod index 868a4b0..3c6c141 100644 --- a/go.mod +++ b/go.mod @@ -4,17 +4,20 @@ require ( github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 github.com/denisbrodbeck/machineid v1.0.1 github.com/fatih/color v1.7.0 // indirect + github.com/google/pprof v0.0.0-20190404155422-f8f10df84213 // indirect github.com/gorilla/websocket v1.4.0 + github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6 // indirect github.com/mattn/go-colorable v0.1.1 // indirect github.com/mattn/go-isatty v0.0.7 // indirect - github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect github.com/pkg/errors v0.8.1 github.com/schollz/mnemonicode v1.0.1 github.com/schollz/pake v1.1.0 - github.com/schollz/progressbar/v2 v2.10.0 + github.com/schollz/progressbar/v2 v2.12.0 github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9 + github.com/stretchr/objx v0.2.0 // indirect github.com/stretchr/testify v1.3.0 github.com/urfave/cli v1.20.0 + golang.org/x/arch v0.0.0-20190312162104-788fe5ffcd8c // indirect golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 golang.org/x/sys v0.0.0-20190312061237-fead79001313 // indirect ) diff --git a/go.sum b/go.sum index 74c7c04..dba7df7 100644 --- a/go.sum +++ b/go.sum @@ -7,8 +7,12 @@ github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMS github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/google/pprof v0.0.0-20190404155422-f8f10df84213 h1:y77GPNuZbqlt3/OjKA9yysnnxxqW+XwLaGY3ol9Mgmc= +github.com/google/pprof v0.0.0-20190404155422-f8f10df84213/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6 h1:UDMh68UUwekSh5iP2OMhRRZJiiBccgV7axzUG8vi56c= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -28,9 +32,13 @@ github.com/schollz/pake v1.1.0 h1:+tYqsPVkuirFpmeRePjYTUhIHHKLufdmd7QfuspaXCk= github.com/schollz/pake v1.1.0/go.mod h1:pL7Z08gnQ4OQ3G27s5e5T6TEzp6cFc5GzCwLm0f75Io= github.com/schollz/progressbar/v2 v2.10.0 h1:AxYYUjr5fOPlA0Pcqc3R3kDBrqyLFWk2P7LRLdXb3yE= github.com/schollz/progressbar/v2 v2.10.0/go.mod h1:l6tn6yU6ZdQoF8lwX/VoAUQ3FjhCbrcZDnl9xeWZzYw= +github.com/schollz/progressbar/v2 v2.12.0 h1:eTkmx9oWkRqi+rAzSDsreLbwGHvlrLJDR8xzmO0ccDI= +github.com/schollz/progressbar/v2 v2.12.0/go.mod h1:fBI3onORwtNtwCWJHsrXtjE3QnJOtqIZrvr3rDaF7L0= github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9 h1:y08o5oQ/slxXE/F0uh5dd8mdVvb+w4NLcNSDSq4c2F0= github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9/go.mod h1:kCMoQsqzx4MzGJWaALr6tKyCnlrY0kILGLkA1FOiLF4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -38,6 +46,8 @@ github.com/tscholl2/siec v0.0.0-20180721101609-21667da05937 h1:lhssCpSe3TjKcbvUo github.com/tscholl2/siec v0.0.0-20180721101609-21667da05937/go.mod h1:KL9+ubr1JZdaKjgAaHr+tCytEncXBa1pR6FjbTsOJnw= github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +golang.org/x/arch v0.0.0-20190312162104-788fe5ffcd8c h1:Rx/HTKi09myZ25t1SOlDHmHOy/mKxNAcu0hP1oPX9qM= +golang.org/x/arch v0.0.0-20190312162104-788fe5ffcd8c/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -47,3 +57,4 @@ golang.org/x/sys v0.0.0-20190312061237-fead79001313 h1:pczuHS43Cp2ktBEEmLwScxgjW golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/src/croc/croc.go b/src/croc/croc.go index 55b13e5..9c2ac00 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -3,9 +3,11 @@ package croc import ( "bytes" "crypto/elliptic" - "encoding/base64" + "encoding/binary" "encoding/json" "fmt" + "io" + "math" "os" "path" "path/filepath" @@ -17,6 +19,7 @@ import ( "github.com/denisbrodbeck/machineid" "github.com/pkg/errors" "github.com/schollz/croc/v6/src/comm" + "github.com/schollz/croc/v6/src/compress" "github.com/schollz/croc/v6/src/crypt" "github.com/schollz/croc/v6/src/logger" "github.com/schollz/croc/v6/src/message" @@ -254,25 +257,35 @@ func (c *Client) transfer(options TransferOptions) (err error) { // listen for incoming messages and process them for { var data []byte + var done bool data, err = c.conn[0].Receive() if err != nil { return } - err = c.processMessage(data) + done, err = c.processMessage(data) if err != nil { return } + if done { + break + } } return } -func (c *Client) processMessage(payload []byte) (err error) { +func (c *Client) processMessage(payload []byte) (done bool, err error) { m, err := message.Decode(c.Key, payload) if err != nil { return } switch m.Type { + case "finished": + err = message.Send(c.conn[0], c.Key, message.Message{ + Type: "finished", + }) + done = true + return case "pake": // if // c.spinner.Suffix != " performing PAKE..." { // // c.spinner.Stop() @@ -294,11 +307,25 @@ func (c *Client) processMessage(payload []byte) (err error) { log.Debug("session key is verified, generating encryption") key, err := c.Pake.SessionKey() if err != nil { - return err + return true, err } c.Key, err = crypt.New(key, []byte(c.Options.SharedSecret)) if err != nil { - return err + return true, err + } + + // connects to the other ports of the server for transfer + for i := 1; i < len(c.Options.RelayPorts); i++ { + c.conn[i], err = tcp.ConnectToTCPServer( + fmt.Sprintf("%s:%s", c.Options.RelayAddress, c.Options.RelayPorts[i]), + fmt.Sprintf("%s-%d", utils.SHA256(c.Options.SharedSecret)[:7], i), + ) + if err != nil { + return true, err + } + if !c.Options.IsSender { + go c.receiveData(i) + } } c.Step1ChannelSecured = true } @@ -306,7 +333,7 @@ func (c *Client) processMessage(payload []byte) (err error) { // c.spinner.Stop() fmt.Print("\r") err = fmt.Errorf("peer error: %s", m.Message) - return err + return true, err case "fileinfo": var senderInfo SenderInfo err = json.Unmarshal(m.Bytes, &senderInfo) @@ -331,7 +358,7 @@ func (c *Client) processMessage(payload []byte) (err error) { Type: "error", Message: "refusing files", }) - return fmt.Errorf("refused files") + return true, fmt.Errorf("refused files") } } else { fmt.Fprintf(os.Stderr, "\rReceiving %s (%s) from machine '%s'\n", fname, utils.ByteCountDecimal(totalSize), senderInfo.MachineID) @@ -354,7 +381,6 @@ func (c *Client) processMessage(payload []byte) (err error) { log.Debug("sending close-recipient") err = message.Send(c.conn[0], c.Key, message.Message{ Type: "close-recipient", - Num: m.Num, }) case "close-recipient": c.Step4FileTransfer = false @@ -421,6 +447,53 @@ func (c *Client) updateState() (err error) { // start initiating the process to receive a new file log.Debugf("working on file %d", c.FilesToTransferCurrentNum) + // recipient sets the file + pathToFile := path.Join( + c.FilesToTransfer[c.FilesToTransferCurrentNum].FolderRemote, + c.FilesToTransfer[c.FilesToTransferCurrentNum].Name, + ) + folderForFile, _ := filepath.Split(pathToFile) + os.MkdirAll(folderForFile, os.ModePerm) + var errOpen error + c.CurrentFile, errOpen = os.OpenFile( + pathToFile, + os.O_WRONLY, 0666) + truncate := false + if errOpen == nil { + stat, _ := c.CurrentFile.Stat() + truncate = stat.Size() != c.FilesToTransfer[c.FilesToTransferCurrentNum].Size + } else { + c.CurrentFile, errOpen = os.Create(pathToFile) + if errOpen != nil { + errOpen = errors.Wrap(errOpen, "could not create "+pathToFile) + log.Error(errOpen) + return errOpen + } + truncate = true + } + if truncate { + err := c.CurrentFile.Truncate(c.FilesToTransfer[c.FilesToTransferCurrentNum].Size) + if err != nil { + err = errors.Wrap(err, "could not truncate "+pathToFile) + log.Error(err) + return err + } + } + + // setup the progressbar + c.bar = progressbar.NewOptions64( + c.FilesToTransfer[c.FilesToTransferCurrentNum].Size, + progressbar.OptionOnCompletion(func() { + fmt.Println(" ✔️") + }), + progressbar.OptionSetWidth(8), + progressbar.OptionSetDescription(c.FilesToTransfer[c.FilesToTransferCurrentNum].Name), + progressbar.OptionSetRenderBlankState(true), + progressbar.OptionSetBytes64(c.FilesToTransfer[c.FilesToTransferCurrentNum].Size), + progressbar.OptionSetWriter(os.Stderr), + progressbar.OptionThrottle(100*time.Millisecond), + ) + // recipient requests the file and chunks (if empty, then should receive all chunks) bRequest, _ := json.Marshal(RemoteFileRequest{ CurrentFileChunks: c.CurrentFileChunks, @@ -434,35 +507,123 @@ func (c *Client) updateState() (err error) { return } c.Step3RecipientRequestFile = true - // TODO: receive } if c.Options.IsSender && c.Step3RecipientRequestFile && !c.Step4FileTransfer { log.Debug("start sending data!") - // TODO: send c.Step4FileTransfer = true + // setup the progressbar + c.bar = progressbar.NewOptions64( + c.FilesToTransfer[c.FilesToTransferCurrentNum].Size, + progressbar.OptionOnCompletion(func() { + fmt.Println(" ✔️") + }), + progressbar.OptionSetWidth(8), + progressbar.OptionSetDescription(c.FilesToTransfer[c.FilesToTransferCurrentNum].Name), + progressbar.OptionSetRenderBlankState(true), + progressbar.OptionSetBytes64(c.FilesToTransfer[c.FilesToTransferCurrentNum].Size), + progressbar.OptionSetWriter(os.Stderr), + progressbar.OptionThrottle(100*time.Millisecond), + ) + for i := 1; i < len(c.Options.RelayPorts); i++ { + go c.sendData(i) + } } return } -// Encode encodes the input in base64 -// It can optionally zip the input before encoding -func Encode(obj interface{}) string { - b, err := json.Marshal(obj) +func (c *Client) receiveData(i int) { + + for { + data, err := c.conn[i].Receive() + if err != nil { + log.Errorf("%s: %s", i, err.Error()) + } + data, err = c.Key.Decrypt(data) + if err != nil { + panic(err) + } + data = compress.Decompress(data) + + // get position + var position uint64 + rbuf := bytes.NewReader(data[:8]) + err = binary.Read(rbuf, binary.LittleEndian, &position) + if err != nil { + fmt.Println("binary.Read failed:", err) + } + positionInt64 := int64(position) + + c.mutex.Lock() + n, err := c.CurrentFile.WriteAt(data[8:], positionInt64) + c.mutex.Unlock() + if err != nil { + panic(err) + } + c.bar.Add(n) + if c.bar.State().CurrentBytes == float64(c.FilesToTransfer[c.FilesToTransferCurrentNum].Size) { + log.Debug("finished receiving!") + c.CurrentFile.Close() + log.Debug("sending close-sender") + err = message.Send(c.conn[0], c.Key, message.Message{ + Type: "close-sender", + }) + if err != nil { + panic(err) + } + } + } + + return +} + +func (c *Client) sendData(i int) { + pathToFile := path.Join( + c.FilesToTransfer[c.FilesToTransferCurrentNum].FolderSource, + c.FilesToTransfer[c.FilesToTransferCurrentNum].Name, + ) + log.Debugf("opening %s to read", pathToFile) + f, err := os.Open(pathToFile) if err != nil { panic(err) } + defer f.Close() - return base64.StdEncoding.EncodeToString(b) -} + pos := uint64(0) + curi := float64(0) + for { + // Read file + data := make([]byte, 1000) + n, err := f.Read(data) + if err != nil { + if err == io.EOF { + return + } + panic(err) + } -// Decode decodes the input from base64 -// It can optionally unzip the input after decoding -func Decode(in string, obj interface{}) (err error) { - b, err := base64.StdEncoding.DecodeString(in) - if err != nil { - return + if math.Mod(curi, float64(len(c.Options.RelayPorts)-1))+1 == float64(i) { + posByte := make([]byte, 8) + binary.LittleEndian.PutUint64(posByte, pos) + + dataToSend, err := c.Key.Encrypt( + compress.Compress( + append(posByte, data[:n]...), + ), + ) + if err != nil { + panic(err) + } + + err = c.conn[i].Send(dataToSend) + if err != nil { + panic(err) + } + c.bar.Add(n) + } + + curi++ + pos += uint64(n) } - - err = json.Unmarshal(b, obj) return + } From 42d35898b5230056ee7c3f04a38f4b9f66ea50d5 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 21:25:30 -0700 Subject: [PATCH 035/110] progressbar is not accurate in total --- src/cli/cli.go | 36 ++++++++++++++++++++++++++++++++---- src/croc/croc.go | 20 +++++++++++++++----- src/tcp/tcp.go | 11 ++++++----- 3 files changed, 53 insertions(+), 14 deletions(-) diff --git a/src/cli/cli.go b/src/cli/cli.go index 7543208..d75fea9 100644 --- a/src/cli/cli.go +++ b/src/cli/cli.go @@ -13,6 +13,7 @@ import ( "time" "github.com/schollz/croc/v6/src/croc" + "github.com/schollz/croc/v6/src/tcp" "github.com/schollz/croc/v6/src/utils" "github.com/urfave/cli" ) @@ -47,12 +48,21 @@ func Run() (err error) { return send(c) }, }, + { + Name: "relay", + Description: "start relay", + HelpName: "croc relay", + Action: func(c *cli.Context) error { + return relay(c) + }, + }, } app.Flags = []cli.Flag{ cli.BoolFlag{Name: "debug", Usage: "increase verbosity (a lot)"}, cli.BoolFlag{Name: "yes", Usage: "automatically agree to all prompts"}, cli.BoolFlag{Name: "stdout", Usage: "redirect file to stdout"}, - cli.StringFlag{Name: "relay", Value: "198.199.67.130:6372", Usage: "address of the relay"}, + cli.StringFlag{Name: "relay", Value: "198.199.67.130", Usage: "address of the relay"}, + cli.StringFlag{Name: "ports", Value: "9009,9010,9011,9012,9013,9014,9015,9016,9017,9018", Usage: "address of the relay"}, cli.StringFlag{Name: "out", Value: ".", Usage: "specify an output folder to receive the file"}, } app.EnableBashCompletion = true @@ -153,6 +163,7 @@ func send(c *cli.Context) (err error) { Debug: c.GlobalBool("debug"), NoPrompt: c.GlobalBool("yes"), RelayAddress: c.GlobalString("relay"), + RelayPorts: strings.Split(c.GlobalString("ports"), ","), Stdout: c.GlobalBool("stdout"), }) if err != nil { @@ -189,6 +200,7 @@ func receive(c *cli.Context) (err error) { NoPrompt: c.GlobalBool("yes"), RelayAddress: c.GlobalString("relay"), Stdout: c.GlobalBool("stdout"), + RelayPorts: strings.Split(c.GlobalString("ports"), ","), }) if err != nil { return @@ -197,9 +209,25 @@ func receive(c *cli.Context) (err error) { return } -// func relay(c *cli.Context) error { -// return cr.Relay() -// } +func relay(c *cli.Context) (err error) { + debugString := "warn" + if c.GlobalBool("debug") { + debugString = "debug" + } + ports := strings.Split(c.GlobalString("ports"), ",") + for i, port := range ports { + if i == 0 { + continue + } + go func(portStr string) { + err = tcp.Run(debugString, portStr) + if err != nil { + panic(err) + } + }(port) + } + return tcp.Run(debugString, ports[0]) +} // func dirSize(path string) (int64, error) { // var size int64 diff --git a/src/croc/croc.go b/src/croc/croc.go index 9c2ac00..026c30f 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -71,6 +71,7 @@ type Client struct { // send / receive information of current file CurrentFile *os.File CurrentFileChunks []int64 + TotalSent int64 // tcp connections conn []*comm.Comm @@ -493,6 +494,7 @@ func (c *Client) updateState() (err error) { progressbar.OptionSetWriter(os.Stderr), progressbar.OptionThrottle(100*time.Millisecond), ) + c.TotalSent = 0 // recipient requests the file and chunks (if empty, then should receive all chunks) bRequest, _ := json.Marshal(RemoteFileRequest{ @@ -524,6 +526,7 @@ func (c *Client) updateState() (err error) { progressbar.OptionSetWriter(os.Stderr), progressbar.OptionThrottle(100*time.Millisecond), ) + c.TotalSent = 0 for i := 1; i < len(c.Options.RelayPorts); i++ { go c.sendData(i) } @@ -532,7 +535,6 @@ func (c *Client) updateState() (err error) { } func (c *Client) receiveData(i int) { - for { data, err := c.conn[i].Receive() if err != nil { @@ -554,13 +556,15 @@ func (c *Client) receiveData(i int) { positionInt64 := int64(position) c.mutex.Lock() - n, err := c.CurrentFile.WriteAt(data[8:], positionInt64) + _, err = c.CurrentFile.WriteAt(data[8:], positionInt64) c.mutex.Unlock() if err != nil { panic(err) } - c.bar.Add(n) - if c.bar.State().CurrentBytes == float64(c.FilesToTransfer[c.FilesToTransferCurrentNum].Size) { + c.bar.Add(len(data[8:])) + c.TotalSent += int64(len(data[8:])) + log.Debugf("state: %+v", c.bar.State()) + if c.TotalSent == c.FilesToTransfer[c.FilesToTransferCurrentNum].Size { log.Debug("finished receiving!") c.CurrentFile.Close() log.Debug("sending close-sender") @@ -577,6 +581,9 @@ func (c *Client) receiveData(i int) { } func (c *Client) sendData(i int) { + defer func() { + log.Debugf("finished with %d", i) + }() pathToFile := path.Join( c.FilesToTransfer[c.FilesToTransferCurrentNum].FolderSource, c.FilesToTransfer[c.FilesToTransferCurrentNum].Name, @@ -592,7 +599,7 @@ func (c *Client) sendData(i int) { curi := float64(0) for { // Read file - data := make([]byte, 1000) + data := make([]byte, 40000) n, err := f.Read(data) if err != nil { if err == io.EOF { @@ -619,6 +626,9 @@ func (c *Client) sendData(i int) { panic(err) } c.bar.Add(n) + c.TotalSent += int64(n) + log.Debug(c.TotalSent) + // time.Sleep(10 * time.Millisecond) } curi++ diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index 404a03e..01be938 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -34,14 +34,14 @@ type roomMap struct { } // Run starts a tcp listener, run async -func Run(debugLevel, port string) { +func Run(debugLevel, port string) (err error) { s := new(server) s.port = port s.debugLevel = debugLevel - s.start() + return s.start() } -func (s *server) start() { +func (s *server) start() (err error) { logger.SetLogLevel(s.debugLevel) s.rooms.Lock() s.rooms.rooms = make(map[string]roomInfo) @@ -61,10 +61,11 @@ func (s *server) start() { } }() - err := s.run() + err = s.run() if err != nil { log.Error(err) - } + } + return } func (s *server) run() (err error) { From 330e76e09c2cf559d519dcf6db9b372a8f75be07 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Mon, 29 Apr 2019 21:33:13 -0700 Subject: [PATCH 036/110] fix --- src/comm/comm.go | 2 +- src/tcp/tcp.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/comm/comm.go b/src/comm/comm.go index 70c4a8a..607f8f6 100644 --- a/src/comm/comm.go +++ b/src/comm/comm.go @@ -17,7 +17,7 @@ type Comm struct { // NewConnection gets a new comm to a tcp address func NewConnection(address string) (c *Comm, err error) { - connection, err := net.DialTimeout("tcp", address, 3*time.Second) + connection, err := net.DialTimeout("tcp", address, 30*time.Second) if err != nil { return } diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index 01be938..e69915f 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -70,7 +70,7 @@ func (s *server) start() (err error) { func (s *server) run() (err error) { log.Debugf("starting TCP server on " + s.port) - server, err := net.Listen("tcp", "0.0.0.0:"+s.port) + server, err := net.Listen("tcp", ":"+s.port) if err != nil { return errors.Wrap(err, "Error listening on :"+s.port) } From 000dfc15bea82601369162c68b2853178d84c593 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 06:57:45 -0700 Subject: [PATCH 037/110] fiX comm --- src/comm/comm.go | 3 ++- src/croc/croc.go | 15 ++++++++++----- src/models/constants.go | 3 +-- src/models/filestats.go | 14 -------------- src/models/initial.go | 7 ------- src/tcp/tcp.go | 4 ++-- 6 files changed, 15 insertions(+), 31 deletions(-) delete mode 100644 src/models/filestats.go delete mode 100644 src/models/initial.go diff --git a/src/comm/comm.go b/src/comm/comm.go index 607f8f6..be44855 100644 --- a/src/comm/comm.go +++ b/src/comm/comm.go @@ -86,7 +86,8 @@ func (c *Comm) Read() (buf []byte, numBytes int, bs []byte, err error) { } numBytes = int(numBytesUint32) for { - tmp := make([]byte, numBytes) + // log.Debugf("bytes: %d/%d",len(buf),numBytes) + tmp := make([]byte, numBytes-len(buf)) n, errRead := c.connection.Read(tmp) if errRead != nil { err = errRead diff --git a/src/croc/croc.go b/src/croc/croc.go index 026c30f..6e420c3 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -23,6 +23,7 @@ import ( "github.com/schollz/croc/v6/src/crypt" "github.com/schollz/croc/v6/src/logger" "github.com/schollz/croc/v6/src/message" + "github.com/schollz/croc/v6/src/models" "github.com/schollz/croc/v6/src/tcp" "github.com/schollz/croc/v6/src/utils" "github.com/schollz/pake" @@ -536,10 +537,13 @@ func (c *Client) updateState() (err error) { func (c *Client) receiveData(i int) { for { + log.Debug("waiting for data") data, err := c.conn[i].Receive() if err != nil { log.Errorf("%s: %s", i, err.Error()) + continue } + data, err = c.Key.Decrypt(data) if err != nil { panic(err) @@ -563,7 +567,7 @@ func (c *Client) receiveData(i int) { } c.bar.Add(len(data[8:])) c.TotalSent += int64(len(data[8:])) - log.Debugf("state: %+v", c.bar.State()) + log.Debugf("block: %+v", positionInt64) if c.TotalSent == c.FilesToTransfer[c.FilesToTransferCurrentNum].Size { log.Debug("finished receiving!") c.CurrentFile.Close() @@ -599,11 +603,11 @@ func (c *Client) sendData(i int) { curi := float64(0) for { // Read file - data := make([]byte, 40000) + data := make([]byte, models.TCP_BUFFER_SIZE/2) n, err := f.Read(data) if err != nil { if err == io.EOF { - return + break } panic(err) } @@ -628,12 +632,13 @@ func (c *Client) sendData(i int) { c.bar.Add(n) c.TotalSent += int64(n) log.Debug(c.TotalSent) - // time.Sleep(10 * time.Millisecond) + time.Sleep(100 * time.Millisecond) } curi++ pos += uint64(n) } - return + time.Sleep(10 * time.Second) + return } diff --git a/src/models/constants.go b/src/models/constants.go index 0c23ef9..7a985c6 100644 --- a/src/models/constants.go +++ b/src/models/constants.go @@ -1,4 +1,3 @@ package models -const WEBSOCKET_BUFFER_SIZE = 1024 * 1024 * 32 -const TCP_BUFFER_SIZE = 1024 * 64 +const TCP_BUFFER_SIZE = 1024 * 640 diff --git a/src/models/filestats.go b/src/models/filestats.go deleted file mode 100644 index 446e831..0000000 --- a/src/models/filestats.go +++ /dev/null @@ -1,14 +0,0 @@ -package models - -import "time" - -// FileStats are the file stats transfered to the other -type FileStats struct { - Name string - Size int64 - ModTime time.Time - IsDir bool - SentName string - IsCompressed bool - IsEncrypted bool -} diff --git a/src/models/initial.go b/src/models/initial.go deleted file mode 100644 index 75b0877..0000000 --- a/src/models/initial.go +++ /dev/null @@ -1,7 +0,0 @@ -package models - -type Initial struct { - CurveType string - IPAddress string - VersionString string -} diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index e69915f..02be442 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -11,9 +11,9 @@ import ( "github.com/pkg/errors" "github.com/schollz/croc/v6/src/comm" "github.com/schollz/croc/v6/src/logger" + "github.com/schollz/croc/v6/src/models" ) -const TCP_BUFFER_SIZE = 1024 * 64 type server struct { port string @@ -179,7 +179,7 @@ func chanFromConn(conn net.Conn) chan []byte { c := make(chan []byte, 1) go func() { - b := make([]byte, TCP_BUFFER_SIZE) + b := make([]byte, models.TCP_BUFFER_SIZE) for { n, err := conn.Read(b) From 3c051f4283db01b9c475046bcbc1557d75558ad4 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 06:58:57 -0700 Subject: [PATCH 038/110] smaller packet --- src/models/constants.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/models/constants.go b/src/models/constants.go index 7a985c6..f1b11e6 100644 --- a/src/models/constants.go +++ b/src/models/constants.go @@ -1,3 +1,3 @@ package models -const TCP_BUFFER_SIZE = 1024 * 640 +const TCP_BUFFER_SIZE = 1024 * 64 From e54045ef5a71a5520960def70dcdb0466d02281b Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 07:07:07 -0700 Subject: [PATCH 039/110] read until 4 bytes --- src/comm/comm.go | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/comm/comm.go b/src/comm/comm.go index be44855..7ed4b3a 100644 --- a/src/comm/comm.go +++ b/src/comm/comm.go @@ -65,18 +65,21 @@ func (c *Comm) Write(b []byte) (int, error) { } func (c *Comm) Read() (buf []byte, numBytes int, bs []byte, err error) { - // read until we get 5 bytes - header := make([]byte, 4) - n, err := c.connection.Read(header) - if err != nil { - return + // read until we get 4 bytes for the header + var header []byte + numBytes = 4 + for { + tmp := make([]byte,numBytes-len(header)) + n, errRead := c.connection.Read(tmp) + if errRead != nil { + err = errRead + return + } + header = append(header, tmp[:n]...) + if numBytes == len(header) { + break + } } - if n < 4 { - err = fmt.Errorf("not enough bytes: %d", n) - return - } - // make it so it won't change - header = append([]byte(nil), header...) var numBytesUint32 uint32 rbuf := bytes.NewReader(header) From 4f20f3ce4343ca8de2f77daa746bd545c3a14169 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 07:07:23 -0700 Subject: [PATCH 040/110] connect in parallel --- src/croc/croc.go | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 6e420c3..06a074b 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -317,18 +317,24 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { } // connects to the other ports of the server for transfer + var wg sync.WaitGroup + wg.Add(len(c.Options.RelayPorts) - 1) for i := 1; i < len(c.Options.RelayPorts); i++ { - c.conn[i], err = tcp.ConnectToTCPServer( - fmt.Sprintf("%s:%s", c.Options.RelayAddress, c.Options.RelayPorts[i]), - fmt.Sprintf("%s-%d", utils.SHA256(c.Options.SharedSecret)[:7], i), - ) - if err != nil { - return true, err - } - if !c.Options.IsSender { - go c.receiveData(i) - } + go func(j int) { + defer wg.Done() + c.conn[j], err = tcp.ConnectToTCPServer( + fmt.Sprintf("%s:%s", c.Options.RelayAddress, c.Options.RelayPorts[j]), + fmt.Sprintf("%s-%d", utils.SHA256(c.Options.SharedSecret)[:7], j), + ) + if err != nil { + panic(err) + } + if !c.Options.IsSender { + go c.receiveData(j) + } + }(i) } + wg.Wait() c.Step1ChannelSecured = true } case "error": @@ -631,8 +637,7 @@ func (c *Client) sendData(i int) { } c.bar.Add(n) c.TotalSent += int64(n) - log.Debug(c.TotalSent) - time.Sleep(100 * time.Millisecond) + // time.Sleep(100 * time.Millisecond) } curi++ From 6da93ae8da48634441982c96e5db79586989c770 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 07:29:02 -0700 Subject: [PATCH 041/110] allow resume --- src/croc/croc.go | 72 +++++++++++++++++++++++++++++------------ src/utils/utils.go | 3 +- src/utils/utils_test.go | 7 +++- 3 files changed, 60 insertions(+), 22 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 06a074b..1cec896 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -70,9 +70,11 @@ type Client struct { FilesToTransferCurrentNum int // send / receive information of current file - CurrentFile *os.File - CurrentFileChunks []int64 - TotalSent int64 + CurrentFile *os.File + CurrentFileChunks []int64 + TotalSent int64 + TotalChunksTransfered int + chunkMap map[uint64]struct{} // tcp connections conn []*comm.Comm @@ -381,6 +383,11 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { } c.FilesToTransferCurrentNum = remoteFile.FilesToTransferCurrentNum c.CurrentFileChunks = remoteFile.CurrentFileChunks + log.Debugf("current file chunks: %+v", c.CurrentFileChunks) + c.chunkMap = make(map[uint64]struct{}) + for _, chunk := range c.CurrentFileChunks { + c.chunkMap[uint64(chunk)] = struct{}{} + } c.Step3RecipientRequestFile = true case "close-sender": log.Debug("close-sender received...") @@ -504,6 +511,13 @@ func (c *Client) updateState() (err error) { c.TotalSent = 0 // recipient requests the file and chunks (if empty, then should receive all chunks) + // TODO: determine the missing chunks + c.CurrentFileChunks = utils.MissingChunks( + pathToFile, + c.FilesToTransfer[c.FilesToTransferCurrentNum].Size, + models.TCP_BUFFER_SIZE/2, + ) + c.bar.Add(len(c.CurrentFileChunks) * models.TCP_BUFFER_SIZE / 2) bRequest, _ := json.Marshal(RemoteFileRequest{ CurrentFileChunks: c.CurrentFileChunks, FilesToTransferCurrentNum: c.FilesToTransferCurrentNum, @@ -533,6 +547,7 @@ func (c *Client) updateState() (err error) { progressbar.OptionSetWriter(os.Stderr), progressbar.OptionThrottle(100*time.Millisecond), ) + c.bar.Add(len(c.CurrentFileChunks) * models.TCP_BUFFER_SIZE / 2) c.TotalSent = 0 for i := 1; i < len(c.Options.RelayPorts); i++ { go c.sendData(i) @@ -573,8 +588,9 @@ func (c *Client) receiveData(i int) { } c.bar.Add(len(data[8:])) c.TotalSent += int64(len(data[8:])) + c.TotalChunksTransfered++ log.Debugf("block: %+v", positionInt64) - if c.TotalSent == c.FilesToTransfer[c.FilesToTransferCurrentNum].Size { + if c.TotalChunksTransfered == len(c.CurrentFileChunks) || c.TotalSent == c.FilesToTransfer[c.FilesToTransferCurrentNum].Size { log.Debug("finished receiving!") c.CurrentFile.Close() log.Debug("sending close-sender") @@ -619,25 +635,41 @@ func (c *Client) sendData(i int) { } if math.Mod(curi, float64(len(c.Options.RelayPorts)-1))+1 == float64(i) { - posByte := make([]byte, 8) - binary.LittleEndian.PutUint64(posByte, pos) - - dataToSend, err := c.Key.Encrypt( - compress.Compress( - append(posByte, data[:n]...), - ), - ) - if err != nil { - panic(err) + // check to see if this is a chunk that the recipient wants + usableChunk := true + c.mutex.Lock() + if len(c.chunkMap) != 0 { + if _, ok := c.chunkMap[pos]; !ok { + usableChunk = false + } else { + delete(c.chunkMap, pos) + } } + c.mutex.Unlock() + if usableChunk { + log.Debugf("sending chunk %d", pos) + posByte := make([]byte, 8) + binary.LittleEndian.PutUint64(posByte, pos) - err = c.conn[i].Send(dataToSend) - if err != nil { - panic(err) + dataToSend, err := c.Key.Encrypt( + compress.Compress( + append(posByte, data[:n]...), + ), + ) + if err != nil { + panic(err) + } + + err = c.conn[i].Send(dataToSend) + if err != nil { + panic(err) + } + c.bar.Add(n) + c.TotalSent += int64(n) + // time.Sleep(100 * time.Millisecond) + } else { + log.Debugf("skipping chunk %d", pos) } - c.bar.Add(n) - c.TotalSent += int64(n) - // time.Sleep(100 * time.Millisecond) } curi++ diff --git a/src/utils/utils.go b/src/utils/utils.go index 32f5989..36460c4 100644 --- a/src/utils/utils.go +++ b/src/utils/utils.go @@ -129,18 +129,19 @@ func MissingChunks(fname string, fsize int64, chunkSize int) (chunks []int64) { } defer f.Close() - buffer := make([]byte, chunkSize) emptyBuffer := make([]byte, chunkSize) chunkNum := 0 chunks = make([]int64, int64(math.Ceil(float64(fsize)/float64(chunkSize)))) var currentLocation int64 for { + buffer := make([]byte, chunkSize) bytesread, err := f.Read(buffer) if err != nil { break } if bytes.Equal(buffer[:bytesread], emptyBuffer[:bytesread]) { chunks[chunkNum] = currentLocation + chunkNum++ } currentLocation += int64(bytesread) } diff --git a/src/utils/utils_test.go b/src/utils/utils_test.go index 2b8ab8e..d8b084d 100644 --- a/src/utils/utils_test.go +++ b/src/utils/utils_test.go @@ -16,7 +16,7 @@ func TestExists(t *testing.T) { func TestHashFile(t *testing.T) { b, err := HashFile("utils.go") assert.Nil(t, err) - assert.Equal(t, "9a66e5c18b9759073666953da376c037", fmt.Sprintf("%x", b)) + assert.Equal(t, "6d39c2f3468e0d5869e0c9b349503175", fmt.Sprintf("%x", b)) } // SHA256 returns sha256 sum @@ -27,3 +27,8 @@ func TestSHA256(t *testing.T) { func TestByteCountDecimal(t *testing.T) { assert.Equal(t, "10.0 kB", ByteCountDecimal(10000)) } + +func TestMissingChunks(t *testing.T) { + chunks := MissingChunks("test",11346432,1024 * 32) + assert.Equal(t,202,len(chunks)) +} From 04844cf72cb8a3ae2558fa79287653a190cff8a3 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 07:44:16 -0700 Subject: [PATCH 042/110] check if missing chunks file exists --- src/croc/croc.go | 9 +++++++-- src/utils/utils.go | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 1cec896..dc8a648 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -517,7 +517,9 @@ func (c *Client) updateState() (err error) { c.FilesToTransfer[c.FilesToTransferCurrentNum].Size, models.TCP_BUFFER_SIZE/2, ) - c.bar.Add(len(c.CurrentFileChunks) * models.TCP_BUFFER_SIZE / 2) + if len(c.CurrentFileChunks) > 0 { + c.bar.Add(len(c.CurrentFileChunks) * models.TCP_BUFFER_SIZE / 2) + } bRequest, _ := json.Marshal(RemoteFileRequest{ CurrentFileChunks: c.CurrentFileChunks, FilesToTransferCurrentNum: c.FilesToTransferCurrentNum, @@ -547,7 +549,10 @@ func (c *Client) updateState() (err error) { progressbar.OptionSetWriter(os.Stderr), progressbar.OptionThrottle(100*time.Millisecond), ) - c.bar.Add(len(c.CurrentFileChunks) * models.TCP_BUFFER_SIZE / 2) + log.Info(c.CurrentFileChunks) + // if len(c.CurrentFileChunks) > 0 { + // c.bar.Add(len(c.CurrentFileChunks) * models.TCP_BUFFER_SIZE / 2) + // } c.TotalSent = 0 for i := 1; i < len(c.Options.RelayPorts); i++ { go c.sendData(i) diff --git a/src/utils/utils.go b/src/utils/utils.go index 36460c4..55e411c 100644 --- a/src/utils/utils.go +++ b/src/utils/utils.go @@ -119,7 +119,7 @@ func ByteCountDecimal(b int64) string { // If the file size is not the same as requested, it returns an empty chunk list (all chunks). func MissingChunks(fname string, fsize int64, chunkSize int) (chunks []int64) { fstat, err := os.Stat(fname) - if fstat.Size() != fsize { + if fstat.Size() != fsize || err != nil { return } From be7c2ad1fb58223b574717ac7225beb5cddb282b Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 07:47:05 -0700 Subject: [PATCH 043/110] check if missing chunks file exists --- src/croc/croc.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index dc8a648..4356f5c 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -474,9 +474,19 @@ func (c *Client) updateState() (err error) { pathToFile, os.O_WRONLY, 0666) truncate := false + c.CurrentFileChunks = []int64{} if errOpen == nil { stat, _ := c.CurrentFile.Stat() truncate = stat.Size() != c.FilesToTransfer[c.FilesToTransferCurrentNum].Size + if truncate == false { + // recipient requests the file and chunks (if empty, then should receive all chunks) + // TODO: determine the missing chunks + c.CurrentFileChunks = utils.MissingChunks( + pathToFile, + c.FilesToTransfer[c.FilesToTransferCurrentNum].Size, + models.TCP_BUFFER_SIZE/2, + ) + } } else { c.CurrentFile, errOpen = os.Create(pathToFile) if errOpen != nil { @@ -510,13 +520,6 @@ func (c *Client) updateState() (err error) { ) c.TotalSent = 0 - // recipient requests the file and chunks (if empty, then should receive all chunks) - // TODO: determine the missing chunks - c.CurrentFileChunks = utils.MissingChunks( - pathToFile, - c.FilesToTransfer[c.FilesToTransferCurrentNum].Size, - models.TCP_BUFFER_SIZE/2, - ) if len(c.CurrentFileChunks) > 0 { c.bar.Add(len(c.CurrentFileChunks) * models.TCP_BUFFER_SIZE / 2) } From 87d295f62b78649f0b7c21ebae775bd70c825aad Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 07:51:48 -0700 Subject: [PATCH 044/110] simplify bar add --- src/croc/croc.go | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 4356f5c..836a66f 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -518,11 +518,8 @@ func (c *Client) updateState() (err error) { progressbar.OptionSetWriter(os.Stderr), progressbar.OptionThrottle(100*time.Millisecond), ) + c.bar.Add(len(c.CurrentFileChunks) * models.TCP_BUFFER_SIZE / 2) c.TotalSent = 0 - - if len(c.CurrentFileChunks) > 0 { - c.bar.Add(len(c.CurrentFileChunks) * models.TCP_BUFFER_SIZE / 2) - } bRequest, _ := json.Marshal(RemoteFileRequest{ CurrentFileChunks: c.CurrentFileChunks, FilesToTransferCurrentNum: c.FilesToTransferCurrentNum, @@ -552,10 +549,7 @@ func (c *Client) updateState() (err error) { progressbar.OptionSetWriter(os.Stderr), progressbar.OptionThrottle(100*time.Millisecond), ) - log.Info(c.CurrentFileChunks) - // if len(c.CurrentFileChunks) > 0 { - // c.bar.Add(len(c.CurrentFileChunks) * models.TCP_BUFFER_SIZE / 2) - // } + c.bar.Add(len(c.CurrentFileChunks) * models.TCP_BUFFER_SIZE / 2) c.TotalSent = 0 for i := 1; i < len(c.Options.RelayPorts); i++ { go c.sendData(i) @@ -655,7 +649,7 @@ func (c *Client) sendData(i int) { } c.mutex.Unlock() if usableChunk { - log.Debugf("sending chunk %d", pos) + // log.Debugf("sending chunk %d", pos) posByte := make([]byte, 8) binary.LittleEndian.PutUint64(posByte, pos) @@ -676,7 +670,7 @@ func (c *Client) sendData(i int) { c.TotalSent += int64(n) // time.Sleep(100 * time.Millisecond) } else { - log.Debugf("skipping chunk %d", pos) + // log.Debugf("skipping chunk %d", pos) } } From 3bf7635f339cb0cc2b4b7a8bb9d094a59006577d Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 08:58:09 -0700 Subject: [PATCH 045/110] improve ui --- src/croc/croc.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 836a66f..bf5fe73 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -509,10 +509,10 @@ func (c *Client) updateState() (err error) { c.bar = progressbar.NewOptions64( c.FilesToTransfer[c.FilesToTransferCurrentNum].Size, progressbar.OptionOnCompletion(func() { - fmt.Println(" ✔️") + fmt.Fprintf(os.Stderr, " ✔️\n") }), progressbar.OptionSetWidth(8), - progressbar.OptionSetDescription(c.FilesToTransfer[c.FilesToTransferCurrentNum].Name), + progressbar.OptionSetDescription(fmt.Sprintf("%28s", c.FilesToTransfer[c.FilesToTransferCurrentNum].Name)), progressbar.OptionSetRenderBlankState(true), progressbar.OptionSetBytes64(c.FilesToTransfer[c.FilesToTransferCurrentNum].Size), progressbar.OptionSetWriter(os.Stderr), @@ -540,10 +540,10 @@ func (c *Client) updateState() (err error) { c.bar = progressbar.NewOptions64( c.FilesToTransfer[c.FilesToTransferCurrentNum].Size, progressbar.OptionOnCompletion(func() { - fmt.Println(" ✔️") + fmt.Fprintf(os.Stderr, " ✔️\n") }), progressbar.OptionSetWidth(8), - progressbar.OptionSetDescription(c.FilesToTransfer[c.FilesToTransferCurrentNum].Name), + progressbar.OptionSetDescription(fmt.Sprintf("%28s", c.FilesToTransfer[c.FilesToTransferCurrentNum].Name)), progressbar.OptionSetRenderBlankState(true), progressbar.OptionSetBytes64(c.FilesToTransfer[c.FilesToTransferCurrentNum].Size), progressbar.OptionSetWriter(os.Stderr), @@ -563,8 +563,7 @@ func (c *Client) receiveData(i int) { log.Debug("waiting for data") data, err := c.conn[i].Receive() if err != nil { - log.Errorf("%s: %s", i, err.Error()) - continue + break } data, err = c.Key.Decrypt(data) @@ -578,7 +577,7 @@ func (c *Client) receiveData(i int) { rbuf := bytes.NewReader(data[:8]) err = binary.Read(rbuf, binary.LittleEndian, &position) if err != nil { - fmt.Println("binary.Read failed:", err) + panic(err) } positionInt64 := int64(position) From c8fdd4726a4a415be40241544bb1bb1c972ee4a8 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 09:24:32 -0700 Subject: [PATCH 046/110] simplify ui --- src/croc/croc.go | 48 ++++++++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index bf5fe73..e553036 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -506,19 +506,7 @@ func (c *Client) updateState() (err error) { } // setup the progressbar - c.bar = progressbar.NewOptions64( - c.FilesToTransfer[c.FilesToTransferCurrentNum].Size, - progressbar.OptionOnCompletion(func() { - fmt.Fprintf(os.Stderr, " ✔️\n") - }), - progressbar.OptionSetWidth(8), - progressbar.OptionSetDescription(fmt.Sprintf("%28s", c.FilesToTransfer[c.FilesToTransferCurrentNum].Name)), - progressbar.OptionSetRenderBlankState(true), - progressbar.OptionSetBytes64(c.FilesToTransfer[c.FilesToTransferCurrentNum].Size), - progressbar.OptionSetWriter(os.Stderr), - progressbar.OptionThrottle(100*time.Millisecond), - ) - c.bar.Add(len(c.CurrentFileChunks) * models.TCP_BUFFER_SIZE / 2) + c.setBar() c.TotalSent = 0 bRequest, _ := json.Marshal(RemoteFileRequest{ CurrentFileChunks: c.CurrentFileChunks, @@ -537,19 +525,7 @@ func (c *Client) updateState() (err error) { log.Debug("start sending data!") c.Step4FileTransfer = true // setup the progressbar - c.bar = progressbar.NewOptions64( - c.FilesToTransfer[c.FilesToTransferCurrentNum].Size, - progressbar.OptionOnCompletion(func() { - fmt.Fprintf(os.Stderr, " ✔️\n") - }), - progressbar.OptionSetWidth(8), - progressbar.OptionSetDescription(fmt.Sprintf("%28s", c.FilesToTransfer[c.FilesToTransferCurrentNum].Name)), - progressbar.OptionSetRenderBlankState(true), - progressbar.OptionSetBytes64(c.FilesToTransfer[c.FilesToTransferCurrentNum].Size), - progressbar.OptionSetWriter(os.Stderr), - progressbar.OptionThrottle(100*time.Millisecond), - ) - c.bar.Add(len(c.CurrentFileChunks) * models.TCP_BUFFER_SIZE / 2) + c.setBar() c.TotalSent = 0 for i := 1; i < len(c.Options.RelayPorts); i++ { go c.sendData(i) @@ -558,6 +534,26 @@ func (c *Client) updateState() (err error) { return } +func (c *Client) setBar() { + description := fmt.Sprintf("%28s", c.FilesToTransfer[c.FilesToTransferCurrentNum].Name) + if len(c.FilesToTransfer) == 1 { + description = c.FilesToTransfer[c.FilesToTransferCurrentNum].Name + } + c.bar = progressbar.NewOptions64( + c.FilesToTransfer[c.FilesToTransferCurrentNum].Size, + progressbar.OptionOnCompletion(func() { + fmt.Fprintf(os.Stderr, " ✔️\n") + }), + progressbar.OptionSetWidth(8), + progressbar.OptionSetDescription(description), + progressbar.OptionSetRenderBlankState(true), + progressbar.OptionSetBytes64(c.FilesToTransfer[c.FilesToTransferCurrentNum].Size), + progressbar.OptionSetWriter(os.Stderr), + progressbar.OptionThrottle(100*time.Millisecond), + ) + c.bar.Add(len(c.CurrentFileChunks) * models.TCP_BUFFER_SIZE / 2) +} + func (c *Client) receiveData(i int) { for { log.Debug("waiting for data") From 346b2d988139b8e699259f4b2e74f1bf2b1af5d6 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 10:28:34 -0600 Subject: [PATCH 047/110] update deps --- go.mod | 10 +++------- go.sum | 25 +++++++++---------------- 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/go.mod b/go.mod index 3c6c141..c6c30e6 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,6 @@ require ( github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 github.com/denisbrodbeck/machineid v1.0.1 github.com/fatih/color v1.7.0 // indirect - github.com/google/pprof v0.0.0-20190404155422-f8f10df84213 // indirect - github.com/gorilla/websocket v1.4.0 - github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6 // indirect github.com/mattn/go-colorable v0.1.1 // indirect github.com/mattn/go-isatty v0.0.7 // indirect github.com/pkg/errors v0.8.1 @@ -14,10 +11,9 @@ require ( github.com/schollz/pake v1.1.0 github.com/schollz/progressbar/v2 v2.12.0 github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9 - github.com/stretchr/objx v0.2.0 // indirect github.com/stretchr/testify v1.3.0 github.com/urfave/cli v1.20.0 - golang.org/x/arch v0.0.0-20190312162104-788fe5ffcd8c // indirect - golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 - golang.org/x/sys v0.0.0-20190312061237-fead79001313 // indirect + golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734 + golang.org/x/sys v0.0.0-20190429190828-d89cdac9e872 // indirect + golang.org/x/text v0.3.2 // indirect ) diff --git a/go.sum b/go.sum index dba7df7..ae25423 100644 --- a/go.sum +++ b/go.sum @@ -7,38 +7,27 @@ github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMS github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/google/pprof v0.0.0-20190404155422-f8f10df84213 h1:y77GPNuZbqlt3/OjKA9yysnnxxqW+XwLaGY3ol9Mgmc= -github.com/google/pprof v0.0.0-20190404155422-f8f10df84213/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6 h1:UDMh68UUwekSh5iP2OMhRRZJiiBccgV7axzUG8vi56c= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mitchellh/colorstring v0.0.0-20150917214807-8631ce90f286/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/schollz/croc v3.0.6+incompatible h1:rCfc8MGgcGjNW2/qSoulPh8CRGH+Ej4i3RWYOwhX9pE= github.com/schollz/mnemonicode v1.0.1 h1:LiH5hwADZwjwnfXsaD4xgnMyTAtaKHN+e5AyjRU6WSU= github.com/schollz/mnemonicode v1.0.1/go.mod h1:cl4UAOhUV0mkdjMj/QYaUZbZZdF8BnOqoz8rHMzwboY= github.com/schollz/pake v1.1.0 h1:+tYqsPVkuirFpmeRePjYTUhIHHKLufdmd7QfuspaXCk= github.com/schollz/pake v1.1.0/go.mod h1:pL7Z08gnQ4OQ3G27s5e5T6TEzp6cFc5GzCwLm0f75Io= -github.com/schollz/progressbar/v2 v2.10.0 h1:AxYYUjr5fOPlA0Pcqc3R3kDBrqyLFWk2P7LRLdXb3yE= -github.com/schollz/progressbar/v2 v2.10.0/go.mod h1:l6tn6yU6ZdQoF8lwX/VoAUQ3FjhCbrcZDnl9xeWZzYw= github.com/schollz/progressbar/v2 v2.12.0 h1:eTkmx9oWkRqi+rAzSDsreLbwGHvlrLJDR8xzmO0ccDI= github.com/schollz/progressbar/v2 v2.12.0/go.mod h1:fBI3onORwtNtwCWJHsrXtjE3QnJOtqIZrvr3rDaF7L0= github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9 h1:y08o5oQ/slxXE/F0uh5dd8mdVvb+w4NLcNSDSq4c2F0= github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9/go.mod h1:kCMoQsqzx4MzGJWaALr6tKyCnlrY0kILGLkA1FOiLF4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -46,15 +35,19 @@ github.com/tscholl2/siec v0.0.0-20180721101609-21667da05937 h1:lhssCpSe3TjKcbvUo github.com/tscholl2/siec v0.0.0-20180721101609-21667da05937/go.mod h1:KL9+ubr1JZdaKjgAaHr+tCytEncXBa1pR6FjbTsOJnw= github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -golang.org/x/arch v0.0.0-20190312162104-788fe5ffcd8c h1:Rx/HTKi09myZ25t1SOlDHmHOy/mKxNAcu0hP1oPX9qM= -golang.org/x/arch v0.0.0-20190312162104-788fe5ffcd8c/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734 h1:p/H982KKEjUnLJkM3tt/LemDnOc1GiZL5FCVlORJ5zo= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313 h1:pczuHS43Cp2ktBEEmLwScxgjWsBSzdaQiKzUyf3DTTc= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190429190828-d89cdac9e872 h1:cGjJzUd8RgBw428LXP65YXni0aiGNA4Bl+ls8SmLOm8= +golang.org/x/sys v0.0.0-20190429190828-d89cdac9e872/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From d56a25cf769d74c7ed8744e9ff344e224b542de3 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 10:43:52 -0600 Subject: [PATCH 048/110] make sure bar finishes --- go.mod | 2 +- go.sum | 4 ++-- src/croc/croc.go | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c6c30e6..d008210 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/pkg/errors v0.8.1 github.com/schollz/mnemonicode v1.0.1 github.com/schollz/pake v1.1.0 - github.com/schollz/progressbar/v2 v2.12.0 + github.com/schollz/progressbar/v2 v2.12.1 github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9 github.com/stretchr/testify v1.3.0 github.com/urfave/cli v1.20.0 diff --git a/go.sum b/go.sum index ae25423..322b486 100644 --- a/go.sum +++ b/go.sum @@ -22,8 +22,8 @@ github.com/schollz/mnemonicode v1.0.1 h1:LiH5hwADZwjwnfXsaD4xgnMyTAtaKHN+e5AyjRU github.com/schollz/mnemonicode v1.0.1/go.mod h1:cl4UAOhUV0mkdjMj/QYaUZbZZdF8BnOqoz8rHMzwboY= github.com/schollz/pake v1.1.0 h1:+tYqsPVkuirFpmeRePjYTUhIHHKLufdmd7QfuspaXCk= github.com/schollz/pake v1.1.0/go.mod h1:pL7Z08gnQ4OQ3G27s5e5T6TEzp6cFc5GzCwLm0f75Io= -github.com/schollz/progressbar/v2 v2.12.0 h1:eTkmx9oWkRqi+rAzSDsreLbwGHvlrLJDR8xzmO0ccDI= -github.com/schollz/progressbar/v2 v2.12.0/go.mod h1:fBI3onORwtNtwCWJHsrXtjE3QnJOtqIZrvr3rDaF7L0= +github.com/schollz/progressbar/v2 v2.12.1 h1:0Ce7IBClG+s3lxXN1Noqwh7aToKGL5a3mnMfPJqDlv4= +github.com/schollz/progressbar/v2 v2.12.1/go.mod h1:fBI3onORwtNtwCWJHsrXtjE3QnJOtqIZrvr3rDaF7L0= github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9 h1:y08o5oQ/slxXE/F0uh5dd8mdVvb+w4NLcNSDSq4c2F0= github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9/go.mod h1:kCMoQsqzx4MzGJWaALr6tKyCnlrY0kILGLkA1FOiLF4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/src/croc/croc.go b/src/croc/croc.go index e553036..b805642 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -390,6 +390,7 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { } c.Step3RecipientRequestFile = true case "close-sender": + c.bar.Finish() log.Debug("close-sender received...") c.Step4FileTransfer = false c.Step3RecipientRequestFile = false From 962ea50aee103dd598cc0b1f6452ea7c8c84f80a Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 11:14:21 -0600 Subject: [PATCH 049/110] add back travis --- .travis.yml | 19 +++++++++++++++++++ src/tcp/tcp_test.go | 1 + src/utils/utils_test.go | 7 +------ 3 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..9c5a255 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,19 @@ +language: go + +go: + - tip + +env: + - "PATH=/home/travis/gopath/bin:$PATH" + +install: true + +script: + - env GO111MODULE=on go build -v + - env GO111MODULE=on go test -v -cover github.com/schollz/croc/v6/src/compress + - env GO111MODULE=on go test -v -cover github.com/schollz/croc/v6/src/croc + - env GO111MODULE=on go test -v -cover github.com/schollz/croc/v6/src/crypt + - env GO111MODULE=on go test -v -cover github.com/schollz/croc/v6/src/tcp + - env GO111MODULE=on go test -v -cover github.com/schollz/croc/v6/src/utils + - env GO111MODULE=on go test -v -cover github.com/schollz/croc/v6/src/comm + diff --git a/src/tcp/tcp_test.go b/src/tcp/tcp_test.go index 73f2a94..14482fd 100644 --- a/src/tcp/tcp_test.go +++ b/src/tcp/tcp_test.go @@ -29,4 +29,5 @@ func TestTCP(t *testing.T) { assert.Equal(t, []byte("hello, c1"), data) c1.Close() + time.Sleep(300 * time.Millisecond) } diff --git a/src/utils/utils_test.go b/src/utils/utils_test.go index d8b084d..a3e0e1f 100644 --- a/src/utils/utils_test.go +++ b/src/utils/utils_test.go @@ -16,7 +16,7 @@ func TestExists(t *testing.T) { func TestHashFile(t *testing.T) { b, err := HashFile("utils.go") assert.Nil(t, err) - assert.Equal(t, "6d39c2f3468e0d5869e0c9b349503175", fmt.Sprintf("%x", b)) + assert.Equal(t, "314965d4170cd0c70bd2e4f6c977750a", fmt.Sprintf("%x", b)) } // SHA256 returns sha256 sum @@ -27,8 +27,3 @@ func TestSHA256(t *testing.T) { func TestByteCountDecimal(t *testing.T) { assert.Equal(t, "10.0 kB", ByteCountDecimal(10000)) } - -func TestMissingChunks(t *testing.T) { - chunks := MissingChunks("test",11346432,1024 * 32) - assert.Equal(t,202,len(chunks)) -} From b9d2be5378a5ad7254c06110ce6ee4dad4ac7106 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 11:19:03 -0600 Subject: [PATCH 050/110] add discovery --- go.mod | 1 + go.sum | 6 ++++++ src/croc/croc.go | 22 ++++++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/go.mod b/go.mod index d008210..a14bdac 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( github.com/pkg/errors v0.8.1 github.com/schollz/mnemonicode v1.0.1 github.com/schollz/pake v1.1.0 + github.com/schollz/peerdiscovery v1.4.0 github.com/schollz/progressbar/v2 v2.12.1 github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9 github.com/stretchr/testify v1.3.0 diff --git a/go.sum b/go.sum index 322b486..a14f75b 100644 --- a/go.sum +++ b/go.sum @@ -12,6 +12,7 @@ github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcncea github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mitchellh/colorstring v0.0.0-20150917214807-8631ce90f286/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= @@ -22,6 +23,9 @@ github.com/schollz/mnemonicode v1.0.1 h1:LiH5hwADZwjwnfXsaD4xgnMyTAtaKHN+e5AyjRU github.com/schollz/mnemonicode v1.0.1/go.mod h1:cl4UAOhUV0mkdjMj/QYaUZbZZdF8BnOqoz8rHMzwboY= github.com/schollz/pake v1.1.0 h1:+tYqsPVkuirFpmeRePjYTUhIHHKLufdmd7QfuspaXCk= github.com/schollz/pake v1.1.0/go.mod h1:pL7Z08gnQ4OQ3G27s5e5T6TEzp6cFc5GzCwLm0f75Io= +github.com/schollz/peerdiscovery v1.4.0 h1:wJWiJUBSMY2io9eIG1+gauXm8WD6sJVN5M+pLd4fYZQ= +github.com/schollz/peerdiscovery v1.4.0/go.mod h1:DXj/7VvxAkUuSZNabx3q8t524uWbrhMPxeX151kvvHs= +github.com/schollz/progressbar/v2 v2.9.1/go.mod h1:l6tn6yU6ZdQoF8lwX/VoAUQ3FjhCbrcZDnl9xeWZzYw= github.com/schollz/progressbar/v2 v2.12.1 h1:0Ce7IBClG+s3lxXN1Noqwh7aToKGL5a3mnMfPJqDlv4= github.com/schollz/progressbar/v2 v2.12.1/go.mod h1:fBI3onORwtNtwCWJHsrXtjE3QnJOtqIZrvr3rDaF7L0= github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9 h1:y08o5oQ/slxXE/F0uh5dd8mdVvb+w4NLcNSDSq4c2F0= @@ -40,6 +44,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90Pveol golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734 h1:p/H982KKEjUnLJkM3tt/LemDnOc1GiZL5FCVlORJ5zo= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/net v0.0.0-20190206173232-65e2d4e15006/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/src/croc/croc.go b/src/croc/croc.go index b805642..1139988 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -27,6 +27,7 @@ import ( "github.com/schollz/croc/v6/src/tcp" "github.com/schollz/croc/v6/src/utils" "github.com/schollz/pake" + "github.com/schollz/peerdiscovery" "github.com/schollz/progressbar/v2" "github.com/schollz/spinner" ) @@ -160,11 +161,32 @@ type TransferOptions struct { // Send will send the specified file func (c *Client) Send(options TransferOptions) (err error) { + // look for peers first + go func() { + discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ + Limit: 1, + Payload: []byte("192.168.0.4:9009"), + Delay: 10 * time.Millisecond, + TimeLimit: 30 * time.Second, + }) + fmt.Println(discoveries, err) + }() + return c.transfer(options) } // Receive will receive a file func (c *Client) Receive() (err error) { + discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ + Limit: 1, + Payload: []byte("ok"), + Delay: 10 * time.Millisecond, + TimeLimit: 100 * time.Millisecond, + }) + fmt.Println(discoveries) + fmt.Println(err) + return nil + return c.transfer(TransferOptions{}) } From 258331360237008361669d1395f662ff47f6a8df Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 11:23:53 -0600 Subject: [PATCH 051/110] allow discovery --- src/croc/croc.go | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 1139988..76d4975 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -165,7 +165,7 @@ func (c *Client) Send(options TransferOptions) (err error) { go func() { discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ Limit: 1, - Payload: []byte("192.168.0.4:9009"), + Payload: []byte(c.Options.RelayPorts[0]), Delay: 10 * time.Millisecond, TimeLimit: 30 * time.Second, }) @@ -177,14 +177,15 @@ func (c *Client) Send(options TransferOptions) (err error) { // Receive will receive a file func (c *Client) Receive() (err error) { - discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ - Limit: 1, - Payload: []byte("ok"), - Delay: 10 * time.Millisecond, - TimeLimit: 100 * time.Millisecond, - }) - fmt.Println(discoveries) - fmt.Println(err) + // look for peers first + //discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ + // Limit: 1, + // Payload: []byte("ok"), + // Delay: 10 * time.Millisecond, + // TimeLimit: 100 * time.Millisecond, + //}) + //fmt.Println(discoveries) + //fmt.Println(err) return nil return c.transfer(TransferOptions{}) From 3e9283dc01a5a07c65db0217a5e0bd98ade61219 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 11:25:04 -0600 Subject: [PATCH 052/110] add todo --- TODO | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 TODO diff --git a/TODO b/TODO new file mode 100644 index 0000000..6844fb9 --- /dev/null +++ b/TODO @@ -0,0 +1,6 @@ +# TODO + +- [ ] Add function option for the address of the server to connect to +- [ ] Relay should give information about the available ports +- [ ] Only Relay has option to select a port +- [ ] Only send/receive CLI has options to set the address (including port) From d1780e70b79ff4886e13e14db1ae011e9e959666 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 11:26:37 -0600 Subject: [PATCH 053/110] disable travis --- .travis.yml => travis.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .travis.yml => travis.yml (100%) diff --git a/.travis.yml b/travis.yml similarity index 100% rename from .travis.yml rename to travis.yml From a35779f7181f1443b628db6db51fb5254acdb67a Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 11:30:36 -0600 Subject: [PATCH 054/110] block connection --- src/croc/croc.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/croc/croc.go b/src/croc/croc.go index 76d4975..fbc8226 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -132,6 +132,7 @@ func New(ops Options) (c *Client, err error) { return } log.Debugf("connection established: %+v", c.conn[0]) + fmt.Println(c.conn[0].Receive()) // use default key (no encryption, until PAKE succeeds) c.Key, err = crypt.New(nil, nil) From ce45c53b382751b6b376ec667e3c30e7f757056e Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 11:32:11 -0600 Subject: [PATCH 055/110] make initial connection --- src/croc/croc.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index fbc8226..4cc876f 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -132,7 +132,11 @@ func New(ops Options) (c *Client, err error) { return } log.Debugf("connection established: %+v", c.conn[0]) - fmt.Println(c.conn[0].Receive()) + if c.Options.IsSender { + fmt.Println(c.conn[0].Receive()) + } else { + c.conn[0].Send([]byte("hello")) + } // use default key (no encryption, until PAKE succeeds) c.Key, err = crypt.New(nil, nil) From 8f816304f945fc7e4b8e6a1d5e10dce6f2860926 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 11:35:02 -0600 Subject: [PATCH 056/110] make initial connection --- src/croc/croc.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/croc/croc.go b/src/croc/croc.go index 4cc876f..a31c7af 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -137,6 +137,7 @@ func New(ops Options) (c *Client, err error) { } else { c.conn[0].Send([]byte("hello")) } + log.Debug("exchanged header message") // use default key (no encryption, until PAKE succeeds) c.Key, err = crypt.New(nil, nil) From a70aa0a4fc872f6350278c52ac8b0f9c61c38127 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 11:35:27 -0600 Subject: [PATCH 057/110] make initial connection --- src/croc/croc.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index a31c7af..d6d7c1b 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -192,8 +192,6 @@ func (c *Client) Receive() (err error) { //}) //fmt.Println(discoveries) //fmt.Println(err) - return nil - return c.transfer(TransferOptions{}) } From 7060eec8d1c53417f416fdbf5495cced5135187a Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 11:39:45 -0600 Subject: [PATCH 058/110] need two ways to connect --- src/croc/croc.go | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index d6d7c1b..7e4022d 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -123,21 +123,8 @@ func New(ops Options) (c *Client, err error) { Debug(c.Options.Debug) log.Debugf("options: %+v", c.Options) - log.Debug("establishing connection") c.conn = make([]*comm.Comm, len(c.Options.RelayPorts)) - // connect to the relay for messaging - c.conn[0], err = tcp.ConnectToTCPServer(fmt.Sprintf("%s:%s", c.Options.RelayAddress, c.Options.RelayPorts[0]), c.Options.SharedSecret) - if err != nil { - err = errors.Wrap(err, fmt.Sprintf("could not connect to %s:%s", c.Options.RelayAddress, c.Options.RelayPorts[0])) - return - } - log.Debugf("connection established: %+v", c.conn[0]) - if c.Options.IsSender { - fmt.Println(c.conn[0].Receive()) - } else { - c.conn[0].Send([]byte("hello")) - } - log.Debug("exchanged header message") + // use default key (no encryption, until PAKE succeeds) c.Key, err = crypt.New(nil, nil) @@ -178,6 +165,26 @@ func (c *Client) Send(options TransferOptions) (err error) { fmt.Println(discoveries, err) }() + return +} + +func (c *Client) send(address string) (err error) + + // connect to the relay for messaging + log.Debug("establishing connection") + c.conn[0], err = tcp.ConnectToTCPServer(c.Options.RelayAddress, c.Options.SharedSecret) + if err != nil { + err = errors.Wrap(err, fmt.Sprintf("could not connect to %s:%s", c.Options.RelayAddress, c.Options.RelayPorts[0])) + return + } + log.Debugf("connection established: %+v", c.conn[0]) + if c.Options.IsSender { + fmt.Println(c.conn[0].Receive()) + } else { + c.conn[0].Send([]byte("hello")) + } + log.Debug("exchanged header message") + return c.transfer(options) } From f4d24a1f72488ba990bf8412a37c9a735526610e Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 12:46:35 -0600 Subject: [PATCH 059/110] update --- src/croc/croc.go | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 7e4022d..3a50b46 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -123,8 +123,7 @@ func New(ops Options) (c *Client, err error) { Debug(c.Options.Debug) log.Debugf("options: %+v", c.Options) - c.conn = make([]*comm.Comm, len(c.Options.RelayPorts)) - + c.conn = make([]*comm.Comm, 16) // use default key (no encryption, until PAKE succeeds) c.Key, err = crypt.New(nil, nil) @@ -158,34 +157,30 @@ func (c *Client) Send(options TransferOptions) (err error) { go func() { discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ Limit: 1, - Payload: []byte(c.Options.RelayPorts[0]), + Payload: []byte("9009"), Delay: 10 * time.Millisecond, TimeLimit: 30 * time.Second, }) fmt.Println(discoveries, err) }() - return -} - -func (c *Client) send(address string) (err error) - // connect to the relay for messaging - log.Debug("establishing connection") - c.conn[0], err = tcp.ConnectToTCPServer(c.Options.RelayAddress, c.Options.SharedSecret) - if err != nil { - err = errors.Wrap(err, fmt.Sprintf("could not connect to %s:%s", c.Options.RelayAddress, c.Options.RelayPorts[0])) - return - } - log.Debugf("connection established: %+v", c.conn[0]) - if c.Options.IsSender { - fmt.Println(c.conn[0].Receive()) - } else { - c.conn[0].Send([]byte("hello")) - } - log.Debug("exchanged header message") + errchan := make(chan error, 1) - return c.transfer(options) + go func() { + log.Debug("establishing connection") + c.conn[0], err = tcp.ConnectToTCPServer(c.Options.RelayAddress, c.Options.SharedSecret) + if err != nil { + err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) + return + } + log.Debugf("connection established: %+v", c.conn[0]) + fmt.Println(c.conn[0].Receive()) + log.Debug("exchanged header message") + errchan <- c.transfer(options) + }() + + return <-errchan } // Receive will receive a file @@ -199,6 +194,15 @@ func (c *Client) Receive() (err error) { //}) //fmt.Println(discoveries) //fmt.Println(err) + log.Debug("establishing connection") + c.conn[0], err = tcp.ConnectToTCPServer(c.Options.RelayAddress, c.Options.SharedSecret) + if err != nil { + err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) + return + } + log.Debugf("connection established: %+v", c.conn[0]) + c.conn[0].Send([]byte("handshake")) + log.Debug("exchanged header message") return c.transfer(TransferOptions{}) } From 89e4871af22ebcb8e12459b910b8a9cbd420da0c Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 12:49:51 -0600 Subject: [PATCH 060/110] redo --- src/croc/croc.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 3a50b46..6882c4c 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -169,7 +169,7 @@ func (c *Client) Send(options TransferOptions) (err error) { go func() { log.Debug("establishing connection") - c.conn[0], err = tcp.ConnectToTCPServer(c.Options.RelayAddress, c.Options.SharedSecret) + c.conn[0], err = tcp.ConnectToTCPServer(c.Options.RelayAddress+":"+c.Options.RelayPorts[0], c.Options.SharedSecret) if err != nil { err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) return @@ -195,7 +195,7 @@ func (c *Client) Receive() (err error) { //fmt.Println(discoveries) //fmt.Println(err) log.Debug("establishing connection") - c.conn[0], err = tcp.ConnectToTCPServer(c.Options.RelayAddress, c.Options.SharedSecret) + c.conn[0], err = tcp.ConnectToTCPServer(c.Options.RelayAddress+":"+c.Options.RelayPorts[0], c.Options.SharedSecret) if err != nil { err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) return From a58a0df91039b4006f61fd9cd4006f25d41dfd29 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 12:55:18 -0600 Subject: [PATCH 061/110] add peer --- src/croc/croc.go | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 6882c4c..93bd33e 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -153,6 +153,9 @@ type TransferOptions struct { // Send will send the specified file func (c *Client) Send(options TransferOptions) (err error) { + // connect to the relay for messaging + errchan := make(chan error, 1) + // look for peers first go func() { discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ @@ -161,11 +164,12 @@ func (c *Client) Send(options TransferOptions) (err error) { Delay: 10 * time.Millisecond, TimeLimit: 30 * time.Second, }) - fmt.Println(discoveries, err) - }() + log.Debugf("discoveries: %+v", discoveries) - // connect to the relay for messaging - errchan := make(chan error, 1) + if err == nil && len(discoveries) > 0 { + log.Debug("using local server") + } + }() go func() { log.Debug("establishing connection") @@ -175,7 +179,7 @@ func (c *Client) Send(options TransferOptions) (err error) { return } log.Debugf("connection established: %+v", c.conn[0]) - fmt.Println(c.conn[0].Receive()) + log.Debug(c.conn[0].Receive()) log.Debug("exchanged header message") errchan <- c.transfer(options) }() @@ -186,14 +190,13 @@ func (c *Client) Send(options TransferOptions) (err error) { // Receive will receive a file func (c *Client) Receive() (err error) { // look for peers first - //discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ - // Limit: 1, - // Payload: []byte("ok"), - // Delay: 10 * time.Millisecond, - // TimeLimit: 100 * time.Millisecond, - //}) - //fmt.Println(discoveries) - //fmt.Println(err) + discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ + Limit: 1, + Payload: []byte("ok"), + Delay: 10 * time.Millisecond, + TimeLimit: 100 * time.Millisecond, + }) + log.Debugf("discoveries: %+v", discoveries) log.Debug("establishing connection") c.conn[0], err = tcp.ConnectToTCPServer(c.Options.RelayAddress+":"+c.Options.RelayPorts[0], c.Options.SharedSecret) if err != nil { From 002cc0050c61a85aa6f1dc3abf3aeb5a0268ec97 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 13:07:30 -0600 Subject: [PATCH 062/110] can switch between local and nonlocal --- src/croc/croc.go | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 93bd33e..23700bd 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -156,6 +156,16 @@ func (c *Client) Send(options TransferOptions) (err error) { // connect to the relay for messaging errchan := make(chan error, 1) + // setup the relay locally + for _, port := range c.Options.RelayPorts { + go func(portStr string) { + err = tcp.Run("debug", portStr) + if err != nil { + panic(err) + } + }(port) + } + // look for peers first go func() { discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ @@ -172,14 +182,42 @@ func (c *Client) Send(options TransferOptions) (err error) { }() go func() { + time.Sleep(500 * time.Millisecond) log.Debug("establishing connection") - c.conn[0], err = tcp.ConnectToTCPServer(c.Options.RelayAddress+":"+c.Options.RelayPorts[0], c.Options.SharedSecret) + conn, err := tcp.ConnectToTCPServer("localhost:"+c.Options.RelayPorts[0], c.Options.SharedSecret) if err != nil { err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) return } - log.Debugf("connection established: %+v", c.conn[0]) - log.Debug(c.conn[0].Receive()) + log.Debugf("connection established: %+v", conn) + for { + data, _ := conn.Receive() + if bytes.Equal(data, []byte("handshake")) { + break + } + } + c.conn[0] = conn + log.Debug("exchanged header message") + c.Options.RelayAddress = "localhost" + errchan <- c.transfer(options) + }() + + go func() { + log.Debug("establishing connection") + conn, err := tcp.ConnectToTCPServer(c.Options.RelayAddress+":"+c.Options.RelayPorts[0], c.Options.SharedSecret) + if err != nil { + err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) + return + } + log.Debugf("connection established: %+v", conn) + for { + data, _ := conn.Receive() + if bytes.Equal(data, []byte("handshake")) { + break + } + } + + c.conn[0] = conn log.Debug("exchanged header message") errchan <- c.transfer(options) }() From e8f465060f21b6657ed53a0e30604a6351d0b2f4 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 15:32:52 -0600 Subject: [PATCH 063/110] move todo to wiki --- TODO | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 TODO diff --git a/TODO b/TODO deleted file mode 100644 index 6844fb9..0000000 --- a/TODO +++ /dev/null @@ -1,6 +0,0 @@ -# TODO - -- [ ] Add function option for the address of the server to connect to -- [ ] Relay should give information about the available ports -- [ ] Only Relay has option to select a port -- [ ] Only send/receive CLI has options to set the address (including port) From a1e5a283f9d95edf9158731255ea6c132dc40e36 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 15:39:59 -0600 Subject: [PATCH 064/110] move file info stuff --- src/croc/croc.go | 148 ++++++++++++++++++++++++----------------------- 1 file changed, 75 insertions(+), 73 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 23700bd..d13e399 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -153,13 +153,87 @@ type TransferOptions struct { // Send will send the specified file func (c *Client) Send(options TransferOptions) (err error) { + c.FilesToTransfer = make([]FileInfo, len(options.PathToFiles)) + totalFilesSize := int64(0) + for i, pathToFile := range options.PathToFiles { + var fstats os.FileInfo + var fullPath string + fullPath, err = filepath.Abs(pathToFile) + if err != nil { + return + } + fullPath = filepath.Clean(fullPath) + var folderName string + folderName, _ = filepath.Split(fullPath) + + fstats, err = os.Stat(fullPath) + if err != nil { + return + } + c.FilesToTransfer[i] = FileInfo{ + Name: fstats.Name(), + FolderRemote: ".", + FolderSource: folderName, + Size: fstats.Size(), + ModTime: fstats.ModTime(), + } + c.FilesToTransfer[i].Hash, err = utils.HashFile(fullPath) + totalFilesSize += fstats.Size() + if err != nil { + return + } + if options.KeepPathInRemote { + var curFolder string + curFolder, err = os.Getwd() + if err != nil { + return + } + curFolder, err = filepath.Abs(curFolder) + if err != nil { + return + } + if !strings.HasPrefix(folderName, curFolder) { + err = fmt.Errorf("remote directory must be relative to current") + return + } + c.FilesToTransfer[i].FolderRemote = strings.TrimPrefix(folderName, curFolder) + c.FilesToTransfer[i].FolderRemote = filepath.ToSlash(c.FilesToTransfer[i].FolderRemote) + c.FilesToTransfer[i].FolderRemote = strings.TrimPrefix(c.FilesToTransfer[i].FolderRemote, "/") + if c.FilesToTransfer[i].FolderRemote == "" { + c.FilesToTransfer[i].FolderRemote = "." + } + } + log.Debugf("file %d info: %+v", i, c.FilesToTransfer[i]) + } + fname := fmt.Sprintf("%d files", len(c.FilesToTransfer)) + if len(c.FilesToTransfer) == 1 { + fname = fmt.Sprintf("'%s'", c.FilesToTransfer[0].Name) + } + machID, macIDerr := machineid.ID() + if macIDerr != nil { + log.Error(macIDerr) + return + } + if len(machID) > 6 { + machID = machID[:6] + } + c.machineID = machID + fmt.Fprintf(os.Stderr, "Sending %s (%s) from your machine, '%s'\n", fname, utils.ByteCountDecimal(totalFilesSize), machID) + fmt.Fprintf(os.Stderr, "Code is: %s\nOn the other computer run\n\ncroc %s\n", c.Options.SharedSecret, c.Options.SharedSecret) + // // c.spinner.Suffix = " waiting for recipient..." + // c.spinner.Start() + // create channel for quitting // connect to the relay for messaging errchan := make(chan error, 1) // setup the relay locally for _, port := range c.Options.RelayPorts { go func(portStr string) { - err = tcp.Run("debug", portStr) + debugString := "warn" + if c.Options.Debug { + debugString = "debug" + } + err = tcp.Run(debugString, portStr) if err != nil { panic(err) } @@ -250,78 +324,6 @@ func (c *Client) Receive() (err error) { func (c *Client) transfer(options TransferOptions) (err error) { // connect to the server - if c.Options.IsSender { - c.FilesToTransfer = make([]FileInfo, len(options.PathToFiles)) - totalFilesSize := int64(0) - for i, pathToFile := range options.PathToFiles { - var fstats os.FileInfo - var fullPath string - fullPath, err = filepath.Abs(pathToFile) - if err != nil { - return - } - fullPath = filepath.Clean(fullPath) - var folderName string - folderName, _ = filepath.Split(fullPath) - - fstats, err = os.Stat(fullPath) - if err != nil { - return - } - c.FilesToTransfer[i] = FileInfo{ - Name: fstats.Name(), - FolderRemote: ".", - FolderSource: folderName, - Size: fstats.Size(), - ModTime: fstats.ModTime(), - } - c.FilesToTransfer[i].Hash, err = utils.HashFile(fullPath) - totalFilesSize += fstats.Size() - if err != nil { - return - } - if options.KeepPathInRemote { - var curFolder string - curFolder, err = os.Getwd() - if err != nil { - return - } - curFolder, err = filepath.Abs(curFolder) - if err != nil { - return - } - if !strings.HasPrefix(folderName, curFolder) { - err = fmt.Errorf("remote directory must be relative to current") - return - } - c.FilesToTransfer[i].FolderRemote = strings.TrimPrefix(folderName, curFolder) - c.FilesToTransfer[i].FolderRemote = filepath.ToSlash(c.FilesToTransfer[i].FolderRemote) - c.FilesToTransfer[i].FolderRemote = strings.TrimPrefix(c.FilesToTransfer[i].FolderRemote, "/") - if c.FilesToTransfer[i].FolderRemote == "" { - c.FilesToTransfer[i].FolderRemote = "." - } - } - log.Debugf("file %d info: %+v", i, c.FilesToTransfer[i]) - } - fname := fmt.Sprintf("%d files", len(c.FilesToTransfer)) - if len(c.FilesToTransfer) == 1 { - fname = fmt.Sprintf("'%s'", c.FilesToTransfer[0].Name) - } - machID, macIDerr := machineid.ID() - if macIDerr != nil { - log.Error(macIDerr) - return - } - if len(machID) > 6 { - machID = machID[:6] - } - c.machineID = machID - fmt.Fprintf(os.Stderr, "Sending %s (%s) from your machine, '%s'\n", fname, utils.ByteCountDecimal(totalFilesSize), machID) - fmt.Fprintf(os.Stderr, "Code is: %s\nOn the other computer run\n\ncroc %s\n", c.Options.SharedSecret, c.Options.SharedSecret) - // // c.spinner.Suffix = " waiting for recipient..." - } - // c.spinner.Start() - // create channel for quitting // quit with c.quit <- true c.quit = make(chan bool) From e72795985b82a4e9b6d9c343472d049447c101c4 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 15:46:27 -0600 Subject: [PATCH 065/110] fix tests with nodisable flag --- src/croc/croc.go | 113 ++++++++++++++++++++++-------------------- src/croc/croc_test.go | 2 + 2 files changed, 62 insertions(+), 53 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index d13e399..303a7c4 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -52,6 +52,7 @@ type Options struct { RelayPorts []string Stdout bool NoPrompt bool + DisableLocal bool } type Client struct { @@ -226,56 +227,58 @@ func (c *Client) Send(options TransferOptions) (err error) { // connect to the relay for messaging errchan := make(chan error, 1) - // setup the relay locally - for _, port := range c.Options.RelayPorts { - go func(portStr string) { - debugString := "warn" - if c.Options.Debug { - debugString = "debug" + if !c.Options.DisableLocal { + // setup the relay locally + for _, port := range c.Options.RelayPorts { + go func(portStr string) { + debugString := "warn" + if c.Options.Debug { + debugString = "debug" + } + err = tcp.Run(debugString, portStr) + if err != nil { + panic(err) + } + }(port) + } + + // look for peers first + go func() { + discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ + Limit: 1, + Payload: []byte("9009"), + Delay: 10 * time.Millisecond, + TimeLimit: 30 * time.Second, + }) + log.Debugf("discoveries: %+v", discoveries) + + if err == nil && len(discoveries) > 0 { + log.Debug("using local server") } - err = tcp.Run(debugString, portStr) + }() + + go func() { + time.Sleep(500 * time.Millisecond) + log.Debug("establishing connection") + conn, err := tcp.ConnectToTCPServer("localhost:"+c.Options.RelayPorts[0], c.Options.SharedSecret) if err != nil { - panic(err) + err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) + return } - }(port) + log.Debugf("connection established: %+v", conn) + for { + data, _ := conn.Receive() + if bytes.Equal(data, []byte("handshake")) { + break + } + } + c.conn[0] = conn + log.Debug("exchanged header message") + c.Options.RelayAddress = "localhost" + errchan <- c.transfer(options) + }() } - // look for peers first - go func() { - discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ - Limit: 1, - Payload: []byte("9009"), - Delay: 10 * time.Millisecond, - TimeLimit: 30 * time.Second, - }) - log.Debugf("discoveries: %+v", discoveries) - - if err == nil && len(discoveries) > 0 { - log.Debug("using local server") - } - }() - - go func() { - time.Sleep(500 * time.Millisecond) - log.Debug("establishing connection") - conn, err := tcp.ConnectToTCPServer("localhost:"+c.Options.RelayPorts[0], c.Options.SharedSecret) - if err != nil { - err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) - return - } - log.Debugf("connection established: %+v", conn) - for { - data, _ := conn.Receive() - if bytes.Equal(data, []byte("handshake")) { - break - } - } - c.conn[0] = conn - log.Debug("exchanged header message") - c.Options.RelayAddress = "localhost" - errchan <- c.transfer(options) - }() - go func() { log.Debug("establishing connection") conn, err := tcp.ConnectToTCPServer(c.Options.RelayAddress+":"+c.Options.RelayPorts[0], c.Options.SharedSecret) @@ -302,14 +305,18 @@ func (c *Client) Send(options TransferOptions) (err error) { // Receive will receive a file func (c *Client) Receive() (err error) { // look for peers first - discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ - Limit: 1, - Payload: []byte("ok"), - Delay: 10 * time.Millisecond, - TimeLimit: 100 * time.Millisecond, - }) - log.Debugf("discoveries: %+v", discoveries) - log.Debug("establishing connection") + if !c.Options.DisableLocal { + + discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ + Limit: 1, + Payload: []byte("ok"), + Delay: 10 * time.Millisecond, + TimeLimit: 100 * time.Millisecond, + }) + _ = err + log.Debugf("discoveries: %+v", discoveries) + log.Debug("establishing connection") + } c.conn[0], err = tcp.ConnectToTCPServer(c.Options.RelayAddress+":"+c.Options.RelayPorts[0], c.Options.SharedSecret) if err != nil { err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) diff --git a/src/croc/croc_test.go b/src/croc/croc_test.go index 643fc52..746904c 100644 --- a/src/croc/croc_test.go +++ b/src/croc/croc_test.go @@ -30,6 +30,7 @@ func TestCroc(t *testing.T) { RelayPorts: []string{"8081", "8082", "8083"}, Stdout: false, NoPrompt: true, + DisableLocal: true, }) if err != nil { panic(err) @@ -44,6 +45,7 @@ func TestCroc(t *testing.T) { RelayPorts: []string{"8081", "8082", "8083"}, Stdout: false, NoPrompt: true, + DisableLocal: true, }) if err != nil { panic(err) From 9952da9f6d87010a0797f00191f5339edaf1a23c Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 16:10:07 -0600 Subject: [PATCH 066/110] use random salt --- src/croc/croc.go | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 303a7c4..e823090 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -3,6 +3,7 @@ package croc import ( "bytes" "crypto/elliptic" + "crypto/rand" "encoding/binary" "encoding/json" "fmt" @@ -396,14 +397,13 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { }) } if c.Pake.IsVerified() { - log.Debug("session key is verified, generating encryption") - key, err := c.Pake.SessionKey() - if err != nil { - return true, err - } - c.Key, err = crypt.New(key, []byte(c.Options.SharedSecret)) - if err != nil { - return true, err + if c.Options.IsSender { + salt := make([]byte, 8) + rand.Read(salt) + err = message.Send(c.conn[0], c.Key, message.Message{ + Type: "salt", + Bytes: salt, + }) } // connects to the other ports of the server for transfer @@ -425,8 +425,24 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { }(i) } wg.Wait() - c.Step1ChannelSecured = true } + case "salt": + if !c.Options.IsSender { + err = message.Send(c.conn[0], c.Key, message.Message{ + Type: "salt", + Bytes: m.Bytes, + }) + } + log.Debugf("session key is verified, generating encryption with salt: %x", m.Bytes) + key, err := c.Pake.SessionKey() + if err != nil { + return true, err + } + c.Key, err = crypt.New(key, m.Bytes) + if err != nil { + return true, err + } + c.Step1ChannelSecured = true case "error": // c.spinner.Stop() fmt.Print("\r") From 23c9a9cff8069dd46f063ff2f49d8c6b391d2407 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 16:26:16 -0600 Subject: [PATCH 067/110] longer bar --- src/croc/croc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index e823090..2c983ee 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -649,7 +649,7 @@ func (c *Client) setBar() { progressbar.OptionOnCompletion(func() { fmt.Fprintf(os.Stderr, " ✔️\n") }), - progressbar.OptionSetWidth(8), + progressbar.OptionSetWidth(16), progressbar.OptionSetDescription(description), progressbar.OptionSetRenderBlankState(true), progressbar.OptionSetBytes64(c.FilesToTransfer[c.FilesToTransferCurrentNum].Size), From 63ec16f7fb3ba40fad9c5d3085875e88de8be25b Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 17:05:19 -0600 Subject: [PATCH 068/110] add banner --- src/croc/croc.go | 16 +++++++++++----- src/tcp/tcp.go | 20 ++++++++++---------- src/tcp/tcp_test.go | 6 +++--- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 2c983ee..61add9f 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -261,7 +261,9 @@ func (c *Client) Send(options TransferOptions) (err error) { go func() { time.Sleep(500 * time.Millisecond) log.Debug("establishing connection") - conn, err := tcp.ConnectToTCPServer("localhost:"+c.Options.RelayPorts[0], c.Options.SharedSecret) + var banner string + conn, banner, err := tcp.ConnectToTCPServer("localhost:"+c.Options.RelayPorts[0], c.Options.SharedSecret) + log.Debugf("banner: %s", banner) if err != nil { err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) return @@ -282,7 +284,9 @@ func (c *Client) Send(options TransferOptions) (err error) { go func() { log.Debug("establishing connection") - conn, err := tcp.ConnectToTCPServer(c.Options.RelayAddress+":"+c.Options.RelayPorts[0], c.Options.SharedSecret) + var banner string + conn, banner, err := tcp.ConnectToTCPServer(c.Options.RelayAddress+":"+c.Options.RelayPorts[0], c.Options.SharedSecret) + log.Debugf("banner: %s", banner) if err != nil { err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) return @@ -318,7 +322,9 @@ func (c *Client) Receive() (err error) { log.Debugf("discoveries: %+v", discoveries) log.Debug("establishing connection") } - c.conn[0], err = tcp.ConnectToTCPServer(c.Options.RelayAddress+":"+c.Options.RelayPorts[0], c.Options.SharedSecret) + var banner string + c.conn[0], banner, err = tcp.ConnectToTCPServer(c.Options.RelayAddress+":"+c.Options.RelayPorts[0], c.Options.SharedSecret) + log.Debugf("banner: %s", banner) if err != nil { err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) return @@ -412,7 +418,7 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { for i := 1; i < len(c.Options.RelayPorts); i++ { go func(j int) { defer wg.Done() - c.conn[j], err = tcp.ConnectToTCPServer( + c.conn[j], _, err = tcp.ConnectToTCPServer( fmt.Sprintf("%s:%s", c.Options.RelayAddress, c.Options.RelayPorts[j]), fmt.Sprintf("%s-%d", utils.SHA256(c.Options.SharedSecret)[:7], j), ) @@ -640,7 +646,7 @@ func (c *Client) updateState() (err error) { } func (c *Client) setBar() { - description := fmt.Sprintf("%28s", c.FilesToTransfer[c.FilesToTransferCurrentNum].Name) + description := fmt.Sprintf("%-28s", c.FilesToTransfer[c.FilesToTransferCurrentNum].Name) if len(c.FilesToTransfer) == 1 { description = c.FilesToTransfer[c.FilesToTransferCurrentNum].Name } diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index 02be442..6294820 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -14,10 +14,10 @@ import ( "github.com/schollz/croc/v6/src/models" ) - type server struct { port string debugLevel string + banner string rooms roomMap } @@ -34,10 +34,13 @@ type roomMap struct { } // Run starts a tcp listener, run async -func Run(debugLevel, port string) (err error) { +func Run(debugLevel, port string, banner ...string) (err error) { s := new(server) s.port = port s.debugLevel = debugLevel + if len(banner) > 0 { + s.banner = banner[0] + } return s.start() } @@ -64,8 +67,8 @@ func (s *server) start() (err error) { err = s.run() if err != nil { log.Error(err) - } - return + } + return } func (s *server) run() (err error) { @@ -94,7 +97,7 @@ func (s *server) run() (err error) { func (s *server) clientCommuncation(port string, c *comm.Comm) (err error) { // send ok to tell client they are connected log.Debug("sending ok") - err = c.Send([]byte("ok")) + err = c.Send([]byte(s.banner)) if err != nil { return } @@ -224,7 +227,7 @@ func pipe(conn1 net.Conn, conn2 net.Conn) { } } -func ConnectToTCPServer(address, room string) (c *comm.Comm, err error) { +func ConnectToTCPServer(address, room string) (c *comm.Comm, banner string, err error) { c, err = comm.NewConnection(address) if err != nil { return @@ -233,10 +236,7 @@ func ConnectToTCPServer(address, room string) (c *comm.Comm, err error) { if err != nil { return } - if !bytes.Equal(data, []byte("ok")) { - err = fmt.Errorf("got bad response: %s", data) - return - } + banner = string(data) err = c.Send([]byte(room)) if err != nil { return diff --git a/src/tcp/tcp_test.go b/src/tcp/tcp_test.go index 14482fd..f048b46 100644 --- a/src/tcp/tcp_test.go +++ b/src/tcp/tcp_test.go @@ -10,11 +10,11 @@ import ( func TestTCP(t *testing.T) { go Run("debug", "8081") time.Sleep(100 * time.Millisecond) - c1, err := ConnectToTCPServer("localhost:8081", "testRoom") + c1, _, err := ConnectToTCPServer("localhost:8081", "testRoom") assert.Nil(t, err) - c2, err := ConnectToTCPServer("localhost:8081", "testRoom") + c2, _, err := ConnectToTCPServer("localhost:8081", "testRoom") assert.Nil(t, err) - _, err = ConnectToTCPServer("localhost:8081", "testRoom") + _, _, err = ConnectToTCPServer("localhost:8081", "testRoom") assert.NotNil(t, err) // try sending data From c5bbdb4cb5656f43579ff6fa80679082231f6db2 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 17:09:44 -0600 Subject: [PATCH 069/110] allow banner --- src/cli/cli.go | 2 +- src/croc/croc.go | 2 +- src/croc/croc_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cli/cli.go b/src/cli/cli.go index d75fea9..dee5704 100644 --- a/src/cli/cli.go +++ b/src/cli/cli.go @@ -220,7 +220,7 @@ func relay(c *cli.Context) (err error) { continue } go func(portStr string) { - err = tcp.Run(debugString, portStr) + err = tcp.Run(debugString, portStr, c.GlobalString("ports")) if err != nil { panic(err) } diff --git a/src/croc/croc.go b/src/croc/croc.go index 61add9f..584f165 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -236,7 +236,7 @@ func (c *Client) Send(options TransferOptions) (err error) { if c.Options.Debug { debugString = "debug" } - err = tcp.Run(debugString, portStr) + err = tcp.Run(debugString, portStr, strings.Join(c.Options.RelayPorts, ",")) if err != nil { panic(err) } diff --git a/src/croc/croc_test.go b/src/croc/croc_test.go index 746904c..267a2d0 100644 --- a/src/croc/croc_test.go +++ b/src/croc/croc_test.go @@ -12,7 +12,7 @@ import ( func TestCroc(t *testing.T) { defer log.Flush() - go tcp.Run("debug", "8081") + go tcp.Run("debug", "8081", "8082,8083,8084,8085") go tcp.Run("debug", "8082") go tcp.Run("debug", "8083") go tcp.Run("debug", "8084") From 1275c6b1b5f0e2de2042d9b8e361205f64c73f32 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 17:19:10 -0600 Subject: [PATCH 070/110] get tcp port information from banner --- src/cli/cli.go | 11 ++++++----- src/croc/croc.go | 16 ++++++++-------- src/croc/croc_test.go | 6 ++---- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/cli/cli.go b/src/cli/cli.go index dee5704..3dc29a0 100644 --- a/src/cli/cli.go +++ b/src/cli/cli.go @@ -55,14 +55,16 @@ func Run() (err error) { Action: func(c *cli.Context) error { return relay(c) }, + Flags: []cli.Flag{ + cli.StringFlag{Name: "ports", Value: "9009,9010,9011,9012,9013,9014,9015,9016,9017,9018", Usage: "ports of the relay"}, + }, }, } app.Flags = []cli.Flag{ cli.BoolFlag{Name: "debug", Usage: "increase verbosity (a lot)"}, cli.BoolFlag{Name: "yes", Usage: "automatically agree to all prompts"}, cli.BoolFlag{Name: "stdout", Usage: "redirect file to stdout"}, - cli.StringFlag{Name: "relay", Value: "198.199.67.130", Usage: "address of the relay"}, - cli.StringFlag{Name: "ports", Value: "9009,9010,9011,9012,9013,9014,9015,9016,9017,9018", Usage: "address of the relay"}, + cli.StringFlag{Name: "relay", Value: "198.199.67.130:9009", Usage: "address of the relay"}, cli.StringFlag{Name: "out", Value: ".", Usage: "specify an output folder to receive the file"}, } app.EnableBashCompletion = true @@ -163,7 +165,6 @@ func send(c *cli.Context) (err error) { Debug: c.GlobalBool("debug"), NoPrompt: c.GlobalBool("yes"), RelayAddress: c.GlobalString("relay"), - RelayPorts: strings.Split(c.GlobalString("ports"), ","), Stdout: c.GlobalBool("stdout"), }) if err != nil { @@ -200,7 +201,6 @@ func receive(c *cli.Context) (err error) { NoPrompt: c.GlobalBool("yes"), RelayAddress: c.GlobalString("relay"), Stdout: c.GlobalBool("stdout"), - RelayPorts: strings.Split(c.GlobalString("ports"), ","), }) if err != nil { return @@ -215,12 +215,13 @@ func relay(c *cli.Context) (err error) { debugString = "debug" } ports := strings.Split(c.GlobalString("ports"), ",") + tcpPorts := strings.Join(ports[1:], ",") for i, port := range ports { if i == 0 { continue } go func(portStr string) { - err = tcp.Run(debugString, portStr, c.GlobalString("ports")) + err = tcp.Run(debugString, portStr, tcpPorts) if err != nil { panic(err) } diff --git a/src/croc/croc.go b/src/croc/croc.go index 584f165..bc257a3 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -262,7 +262,7 @@ func (c *Client) Send(options TransferOptions) (err error) { time.Sleep(500 * time.Millisecond) log.Debug("establishing connection") var banner string - conn, banner, err := tcp.ConnectToTCPServer("localhost:"+c.Options.RelayPorts[0], c.Options.SharedSecret) + conn, banner, err := tcp.ConnectToTCPServer("localhost:9001", c.Options.SharedSecret) log.Debugf("banner: %s", banner) if err != nil { err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) @@ -283,9 +283,9 @@ func (c *Client) Send(options TransferOptions) (err error) { } go func() { - log.Debug("establishing connection") + log.Debug("establishing connection to %s", c.Options.RelayAddress) var banner string - conn, banner, err := tcp.ConnectToTCPServer(c.Options.RelayAddress+":"+c.Options.RelayPorts[0], c.Options.SharedSecret) + conn, banner, err := tcp.ConnectToTCPServer(c.Options.RelayAddress, c.Options.SharedSecret) log.Debugf("banner: %s", banner) if err != nil { err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) @@ -323,7 +323,7 @@ func (c *Client) Receive() (err error) { log.Debug("establishing connection") } var banner string - c.conn[0], banner, err = tcp.ConnectToTCPServer(c.Options.RelayAddress+":"+c.Options.RelayPorts[0], c.Options.SharedSecret) + c.conn[0], banner, err = tcp.ConnectToTCPServer(c.Options.RelayAddress, c.Options.SharedSecret) log.Debugf("banner: %s", banner) if err != nil { err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) @@ -414,8 +414,8 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { // connects to the other ports of the server for transfer var wg sync.WaitGroup - wg.Add(len(c.Options.RelayPorts) - 1) - for i := 1; i < len(c.Options.RelayPorts); i++ { + wg.Add(len(c.Options.RelayPorts)) + for i := 0; i < len(c.Options.RelayPorts); i++ { go func(j int) { defer wg.Done() c.conn[j], _, err = tcp.ConnectToTCPServer( @@ -638,7 +638,7 @@ func (c *Client) updateState() (err error) { // setup the progressbar c.setBar() c.TotalSent = 0 - for i := 1; i < len(c.Options.RelayPorts); i++ { + for i := 0; i < len(c.Options.RelayPorts); i++ { go c.sendData(i) } } @@ -742,7 +742,7 @@ func (c *Client) sendData(i int) { panic(err) } - if math.Mod(curi, float64(len(c.Options.RelayPorts)-1))+1 == float64(i) { + if math.Mod(curi, float64(len(c.Options.RelayPorts))) == float64(i) { // check to see if this is a chunk that the recipient wants usableChunk := true c.mutex.Lock() diff --git a/src/croc/croc_test.go b/src/croc/croc_test.go index 267a2d0..8db469a 100644 --- a/src/croc/croc_test.go +++ b/src/croc/croc_test.go @@ -26,8 +26,7 @@ func TestCroc(t *testing.T) { IsSender: true, SharedSecret: "test", Debug: true, - RelayAddress: "localhost", - RelayPorts: []string{"8081", "8082", "8083"}, + RelayAddress: "localhost:8081", Stdout: false, NoPrompt: true, DisableLocal: true, @@ -41,8 +40,7 @@ func TestCroc(t *testing.T) { IsSender: false, SharedSecret: "test", Debug: true, - RelayAddress: "localhost", - RelayPorts: []string{"8081", "8082", "8083"}, + RelayAddress: "localhost:8081", Stdout: false, NoPrompt: true, DisableLocal: true, From ec8768bc70243fdbfa0d224088a630a887c8bc6a Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 17:20:11 -0600 Subject: [PATCH 071/110] activate travis --- travis.yml => .travis.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename travis.yml => .travis.yml (100%) diff --git a/travis.yml b/.travis.yml similarity index 100% rename from travis.yml rename to .travis.yml From 2c2c3f58ac7fcae2ac61a1420f60af6c01bd88f1 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 23:26:32 +0000 Subject: [PATCH 072/110] ifix cliwq! --- src/cli/cli.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cli/cli.go b/src/cli/cli.go index 3dc29a0..bb96574 100644 --- a/src/cli/cli.go +++ b/src/cli/cli.go @@ -214,20 +214,20 @@ func relay(c *cli.Context) (err error) { if c.GlobalBool("debug") { debugString = "debug" } - ports := strings.Split(c.GlobalString("ports"), ",") + ports := strings.Split(c.String("ports"), ",") tcpPorts := strings.Join(ports[1:], ",") for i, port := range ports { if i == 0 { continue } go func(portStr string) { - err = tcp.Run(debugString, portStr, tcpPorts) + err = tcp.Run(debugString, portStr) if err != nil { panic(err) } }(port) } - return tcp.Run(debugString, ports[0]) + return tcp.Run(debugString, ports[0],tcpPorts) } // func dirSize(path string) (int64, error) { From 4be02ad249a0b7fc53bc3dbc2305a6024480a121 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 30 Apr 2019 17:39:36 -0600 Subject: [PATCH 073/110] get ports from tcp server --- src/croc/croc.go | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index bc257a3..2e6b701 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -278,6 +278,7 @@ func (c *Client) Send(options TransferOptions) (err error) { c.conn[0] = conn log.Debug("exchanged header message") c.Options.RelayAddress = "localhost" + c.Options.RelayPorts = strings.Split(banner, ",") errchan <- c.transfer(options) }() } @@ -300,6 +301,7 @@ func (c *Client) Send(options TransferOptions) (err error) { } c.conn[0] = conn + c.Options.RelayPorts = strings.Split(banner, ",") log.Debug("exchanged header message") errchan <- c.transfer(options) }() @@ -311,7 +313,6 @@ func (c *Client) Send(options TransferOptions) (err error) { func (c *Client) Receive() (err error) { // look for peers first if !c.Options.DisableLocal { - discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ Limit: 1, Payload: []byte("ok"), @@ -331,6 +332,7 @@ func (c *Client) Receive() (err error) { } log.Debugf("connection established: %+v", c.conn[0]) c.conn[0].Send([]byte("handshake")) + c.Options.RelayPorts = strings.Split(banner, ",") log.Debug("exchanged header message") return c.transfer(TransferOptions{}) } @@ -404,22 +406,29 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { } if c.Pake.IsVerified() { if c.Options.IsSender { + log.Debug("generating salt") salt := make([]byte, 8) rand.Read(salt) err = message.Send(c.conn[0], c.Key, message.Message{ Type: "salt", Bytes: salt, }) + if err != nil { + return + } } // connects to the other ports of the server for transfer var wg sync.WaitGroup wg.Add(len(c.Options.RelayPorts)) for i := 0; i < len(c.Options.RelayPorts); i++ { + log.Debugf("port: [%s]", c.Options.RelayPorts[i]) go func(j int) { defer wg.Done() - c.conn[j], _, err = tcp.ConnectToTCPServer( - fmt.Sprintf("%s:%s", c.Options.RelayAddress, c.Options.RelayPorts[j]), + server := fmt.Sprintf("%s:%s", strings.Split(c.Options.RelayAddress, ":")[0], c.Options.RelayPorts[j]) + log.Debugf("connecting to %s", server) + c.conn[j+1], _, err = tcp.ConnectToTCPServer( + server, fmt.Sprintf("%s-%d", utils.SHA256(c.Options.SharedSecret)[:7], j), ) if err != nil { @@ -433,6 +442,7 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { wg.Wait() } case "salt": + log.Debug("received salt") if !c.Options.IsSender { err = message.Send(c.conn[0], c.Key, message.Message{ Type: "salt", @@ -668,7 +678,7 @@ func (c *Client) setBar() { func (c *Client) receiveData(i int) { for { log.Debug("waiting for data") - data, err := c.conn[i].Receive() + data, err := c.conn[i+1].Receive() if err != nil { break } @@ -768,7 +778,7 @@ func (c *Client) sendData(i int) { panic(err) } - err = c.conn[i].Send(dataToSend) + err = c.conn[i+1].Send(dataToSend) if err != nil { panic(err) } From 883dff96b896438b4e55d5c750ff89600a786119 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 10:33:34 -0600 Subject: [PATCH 074/110] sender should be able to connect to the port --- src/cli/cli.go | 9 ++++----- src/croc/croc.go | 7 ++++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cli/cli.go b/src/cli/cli.go index bb96574..32fe567 100644 --- a/src/cli/cli.go +++ b/src/cli/cli.go @@ -55,9 +55,6 @@ func Run() (err error) { Action: func(c *cli.Context) error { return relay(c) }, - Flags: []cli.Flag{ - cli.StringFlag{Name: "ports", Value: "9009,9010,9011,9012,9013,9014,9015,9016,9017,9018", Usage: "ports of the relay"}, - }, }, } app.Flags = []cli.Flag{ @@ -66,6 +63,7 @@ func Run() (err error) { cli.BoolFlag{Name: "stdout", Usage: "redirect file to stdout"}, cli.StringFlag{Name: "relay", Value: "198.199.67.130:9009", Usage: "address of the relay"}, cli.StringFlag{Name: "out", Value: ".", Usage: "specify an output folder to receive the file"}, + cli.StringFlag{Name: "ports", Value: "9009,9010,9011,9012,9013,9014,9015,9016,9017,9018", Usage: "ports of the relay"}, } app.EnableBashCompletion = true app.HideHelp = false @@ -166,6 +164,7 @@ func send(c *cli.Context) (err error) { NoPrompt: c.GlobalBool("yes"), RelayAddress: c.GlobalString("relay"), Stdout: c.GlobalBool("stdout"), + RelayPorts: strings.Split(c.GlobalString("ports"), ","), }) if err != nil { return @@ -214,7 +213,7 @@ func relay(c *cli.Context) (err error) { if c.GlobalBool("debug") { debugString = "debug" } - ports := strings.Split(c.String("ports"), ",") + ports := strings.Split(c.GlobalString("ports"), ",") tcpPorts := strings.Join(ports[1:], ",") for i, port := range ports { if i == 0 { @@ -227,7 +226,7 @@ func relay(c *cli.Context) (err error) { } }(port) } - return tcp.Run(debugString, ports[0],tcpPorts) + return tcp.Run(debugString, ports[0], tcpPorts) } // func dirSize(path string) (int64, error) { diff --git a/src/croc/croc.go b/src/croc/croc.go index 2e6b701..02da35d 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -231,12 +231,13 @@ func (c *Client) Send(options TransferOptions) (err error) { if !c.Options.DisableLocal { // setup the relay locally for _, port := range c.Options.RelayPorts { + go func(portStr string) { debugString := "warn" if c.Options.Debug { debugString = "debug" } - err = tcp.Run(debugString, portStr, strings.Join(c.Options.RelayPorts, ",")) + err = tcp.Run(debugString, portStr, strings.Join(c.Options.RelayPorts[1:], ",")) if err != nil { panic(err) } @@ -262,10 +263,10 @@ func (c *Client) Send(options TransferOptions) (err error) { time.Sleep(500 * time.Millisecond) log.Debug("establishing connection") var banner string - conn, banner, err := tcp.ConnectToTCPServer("localhost:9001", c.Options.SharedSecret) + conn, banner, err := tcp.ConnectToTCPServer("localhost:"+c.Options.RelayPorts[0], c.Options.SharedSecret) log.Debugf("banner: %s", banner) if err != nil { - err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) + err = errors.Wrap(err, fmt.Sprintf("could not connect to localhost:%s", c.Options.RelayPorts[0])) return } log.Debugf("connection established: %+v", conn) From f3e2a260d95a99e3a677d1137318ae4ede8e8bdb Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 10:38:31 -0600 Subject: [PATCH 075/110] update relay address if a peer is found --- src/croc/croc.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 02da35d..b25c3f9 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -312,7 +312,8 @@ func (c *Client) Send(options TransferOptions) (err error) { // Receive will receive a file func (c *Client) Receive() (err error) { - // look for peers first + // recipient will look for peers first + // and continue if it doesn't find any within 100 ms if !c.Options.DisableLocal { discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ Limit: 1, @@ -320,7 +321,9 @@ func (c *Client) Receive() (err error) { Delay: 10 * time.Millisecond, TimeLimit: 100 * time.Millisecond, }) - _ = err + if err == nil && len(discoveries) > 0 { + c.Options.RelayAddress = fmt.Sprintf("%s:%s", discoveries[0].Address, discoveries[0].Payload) + } log.Debugf("discoveries: %+v", discoveries) log.Debug("establishing connection") } From 5bffeabbba5923b36daf4cddedcd71c24250bbef Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 11:03:16 -0600 Subject: [PATCH 076/110] print connecting message --- src/croc/croc.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/croc/croc.go b/src/croc/croc.go index b25c3f9..e618e9d 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -312,6 +312,7 @@ func (c *Client) Send(options TransferOptions) (err error) { // Receive will receive a file func (c *Client) Receive() (err error) { + fmt.Fprintf(os.Stderr, "connecting...") // recipient will look for peers first // and continue if it doesn't find any within 100 ms if !c.Options.DisableLocal { From 29dceee8f4a87831d83d29960a06891a0ffb9ca5 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 11:39:14 -0600 Subject: [PATCH 077/110] fixes --- src/croc/croc.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/croc/croc.go b/src/croc/croc.go index e618e9d..02ef551 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -393,6 +393,7 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { done = true return case "pake": + log.Debug("received pake payload") // if // c.spinner.Suffix != " performing PAKE..." { // // c.spinner.Stop() // // c.spinner.Suffix = " performing PAKE..." @@ -439,6 +440,7 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { if err != nil { panic(err) } + log.Debugf("connected to %s", server) if !c.Options.IsSender { go c.receiveData(j) } From 6ac43432139e26ddece90536279d27bbf17b5315 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 11:45:13 -0600 Subject: [PATCH 078/110] increase verbosity --- src/tcp/tcp.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index 6294820..2a08262 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -232,15 +232,18 @@ func ConnectToTCPServer(address, room string) (c *comm.Comm, banner string, err if err != nil { return } + log.Debug("waiting for first ok") data, err := c.Receive() if err != nil { return } banner = string(data) + log.Debug("sending room") err = c.Send([]byte(room)) if err != nil { return } + log.Debug("waiting for room confirmation") data, err = c.Receive() if err != nil { return @@ -249,5 +252,6 @@ func ConnectToTCPServer(address, room string) (c *comm.Comm, banner string, err err = fmt.Errorf("got bad response: %s", data) return } + log.Debug("all set") return } From 48819a9e03c956a96fefac367d210e832c51881f Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 11:59:12 -0600 Subject: [PATCH 079/110] disable local --- src/croc/croc.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 02ef551..5208580 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -323,7 +323,7 @@ func (c *Client) Receive() (err error) { TimeLimit: 100 * time.Millisecond, }) if err == nil && len(discoveries) > 0 { - c.Options.RelayAddress = fmt.Sprintf("%s:%s", discoveries[0].Address, discoveries[0].Payload) + //c.Options.RelayAddress = fmt.Sprintf("%s:%s", discoveries[0].Address, discoveries[0].Payload) } log.Debugf("discoveries: %+v", discoveries) log.Debug("establishing connection") @@ -451,6 +451,7 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { case "salt": log.Debug("received salt") if !c.Options.IsSender { + log.Debug("sending salt back") err = message.Send(c.conn[0], c.Key, message.Message{ Type: "salt", Bytes: m.Bytes, From 9f6936e1ff96697dc2fac930a340c376459576c8 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 12:08:24 -0600 Subject: [PATCH 080/110] small fix --- src/comm/comm.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/comm/comm.go b/src/comm/comm.go index 7ed4b3a..a19f5e6 100644 --- a/src/comm/comm.go +++ b/src/comm/comm.go @@ -69,7 +69,7 @@ func (c *Comm) Read() (buf []byte, numBytes int, bs []byte, err error) { var header []byte numBytes = 4 for { - tmp := make([]byte,numBytes-len(header)) + tmp := make([]byte, numBytes-len(header)) n, errRead := c.connection.Read(tmp) if errRead != nil { err = errRead @@ -88,6 +88,7 @@ func (c *Comm) Read() (buf []byte, numBytes int, bs []byte, err error) { fmt.Println("binary.Read failed:", err) } numBytes = int(numBytesUint32) + buf = make([]byte, 0) for { // log.Debugf("bytes: %d/%d",len(buf),numBytes) tmp := make([]byte, numBytes-len(buf)) From 655ffdb4c033360f141dcb04f129443a3b1f8a06 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 12:11:20 -0600 Subject: [PATCH 081/110] delete room on errors --- src/tcp/tcp.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index 2a08262..4380e1e 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -122,6 +122,7 @@ func (s *server) clientCommuncation(port string, c *comm.Comm) (err error) { err = c.Send([]byte("ok")) if err != nil { log.Error(err) + s.deleteRoom(room) return } log.Debugf("room %s has 1", room) @@ -132,6 +133,7 @@ func (s *server) clientCommuncation(port string, c *comm.Comm) (err error) { err = c.Send([]byte("room full")) if err != nil { log.Error(err) + s.deleteRoom(room) return } return nil @@ -161,19 +163,28 @@ func (s *server) clientCommuncation(port string, c *comm.Comm) (err error) { // tell the sender everything is ready err = c.Send([]byte("ok")) if err != nil { + s.deleteRoom(room) return } wg.Wait() // delete room + s.deleteRoom(room) + return nil +} + +func (s *server) deleteRoom(room string) { s.rooms.Lock() + defer s.rooms.Unlock() + if _, ok := s.rooms.rooms[room]; !ok { + return + } log.Debugf("deleting room: %s", room) s.rooms.rooms[room].first.Close() s.rooms.rooms[room].second.Close() s.rooms.rooms[room] = roomInfo{first: nil, second: nil} delete(s.rooms.rooms, room) - s.rooms.Unlock() - return nil + } // chanFromConn creates a channel from a Conn object, and sends everything it From be1c1d6206a0e9f7991a4a4b6ed95a8071ec83a4 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 12:16:47 -0600 Subject: [PATCH 082/110] change message --- src/tcp/tcp.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index 4380e1e..86853ad 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -96,7 +96,7 @@ func (s *server) run() (err error) { func (s *server) clientCommuncation(port string, c *comm.Comm) (err error) { // send ok to tell client they are connected - log.Debug("sending ok") + log.Debug("sending " + s.banner) err = c.Send([]byte(s.banner)) if err != nil { return From e1745757ac65ff76900574f6a7ea6df45e5235a0 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 12:17:53 -0600 Subject: [PATCH 083/110] change message --- src/tcp/tcp.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index 86853ad..622fe97 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -96,7 +96,7 @@ func (s *server) run() (err error) { func (s *server) clientCommuncation(port string, c *comm.Comm) (err error) { // send ok to tell client they are connected - log.Debug("sending " + s.banner) + log.Debugf("sending '%s'", s.banner) err = c.Send([]byte(s.banner)) if err != nil { return From b55af54b106ccfa9bbe4e5d26280d1f9ff64dab2 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 12:20:02 -0600 Subject: [PATCH 084/110] change message --- src/tcp/tcp.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index 622fe97..43691b0 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -97,7 +97,12 @@ func (s *server) run() (err error) { func (s *server) clientCommuncation(port string, c *comm.Comm) (err error) { // send ok to tell client they are connected log.Debugf("sending '%s'", s.banner) - err = c.Send([]byte(s.banner)) + if len(s.banner) > 0 { + err = c.Send([]byte(s.banner)) + } else { + err = c.Send([]byte("ok")) + + } if err != nil { return } From 4a27806ffe43dd07e18bb1464c4cf3e975513ee7 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 12:30:58 -0600 Subject: [PATCH 085/110] allow local --- src/croc/croc.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 5208580..9351f24 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -323,7 +323,8 @@ func (c *Client) Receive() (err error) { TimeLimit: 100 * time.Millisecond, }) if err == nil && len(discoveries) > 0 { - //c.Options.RelayAddress = fmt.Sprintf("%s:%s", discoveries[0].Address, discoveries[0].Payload) + log.Debug("switching to local") + c.Options.RelayAddress = fmt.Sprintf("%s:%s", discoveries[0].Address, discoveries[0].Payload) } log.Debugf("discoveries: %+v", discoveries) log.Debug("establishing connection") From eceddb364e8eed60f054afe41113066703186d30 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 12:32:00 -0600 Subject: [PATCH 086/110] reduce number of default ports --- src/cli/cli.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cli/cli.go b/src/cli/cli.go index 32fe567..9de45bc 100644 --- a/src/cli/cli.go +++ b/src/cli/cli.go @@ -63,7 +63,7 @@ func Run() (err error) { cli.BoolFlag{Name: "stdout", Usage: "redirect file to stdout"}, cli.StringFlag{Name: "relay", Value: "198.199.67.130:9009", Usage: "address of the relay"}, cli.StringFlag{Name: "out", Value: ".", Usage: "specify an output folder to receive the file"}, - cli.StringFlag{Name: "ports", Value: "9009,9010,9011,9012,9013,9014,9015,9016,9017,9018", Usage: "ports of the relay"}, + cli.StringFlag{Name: "ports", Value: "9009,9010,9011,9012,9013", Usage: "ports of the relay"}, } app.EnableBashCompletion = true app.HideHelp = false From ecfdb2d440a14b3217ed0266af2063492cf53e6d Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 13:09:47 -0600 Subject: [PATCH 087/110] stdout should erase file --- src/croc/croc.go | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 9351f24..317c94a 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -8,6 +8,7 @@ import ( "encoding/json" "fmt" "io" + "io/ioutil" "math" "os" "path" @@ -367,16 +368,24 @@ func (c *Client) transfer(options TransferOptions) (err error) { var done bool data, err = c.conn[0].Receive() if err != nil { - return + break } done, err = c.processMessage(data) if err != nil { - return + break } if done { break } } + + if c.Options.Stdout && !c.Options.IsSender { + pathToFile := path.Join( + c.FilesToTransfer[c.FilesToTransferCurrentNum].FolderRemote, + c.FilesToTransfer[c.FilesToTransferCurrentNum].Name, + ) + os.Remove(pathToFile) + } return } @@ -720,6 +729,14 @@ func (c *Client) receiveData(i int) { if c.TotalChunksTransfered == len(c.CurrentFileChunks) || c.TotalSent == c.FilesToTransfer[c.FilesToTransferCurrentNum].Size { log.Debug("finished receiving!") c.CurrentFile.Close() + if c.Options.Stdout { + pathToFile := path.Join( + c.FilesToTransfer[c.FilesToTransferCurrentNum].FolderRemote, + c.FilesToTransfer[c.FilesToTransferCurrentNum].Name, + ) + b, _ := ioutil.ReadFile(pathToFile) + fmt.Print(string(b)) + } log.Debug("sending close-sender") err = message.Send(c.conn[0], c.Key, message.Message{ Type: "close-sender", From 77b11e3c3f3ae0c12dc6b565e77d1a9909e416ca Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 13:20:30 -0600 Subject: [PATCH 088/110] simplify readme --- README.md | 60 +++++++++++-------------------------------------------- 1 file changed, 12 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 2f6203d..1eec9b3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ src="https://user-images.githubusercontent.com/6550035/46709024-9b23ad00-cbf6-11e8-9fb2-ca8b20b7dbec.jpg" width="408px" border="0" alt="croc">
-
Version +Version Code coverage Build
@@ -15,79 +15,43 @@ Status

curl https://getcroc.schollz.com | bash

-*croc* is a tool that allows any two computers to simply and securely transfer files and folders. There are many tools that can do this but AFAIK *croc* is the only tool that is easily installed and used on any platform, *and* has secure peer-to-peer transferring, *and* has the capability to resume broken transfers. +*croc* is a tool that allows any two computers to simply and securely transfer files and folders. There are many tools that can do this but AFAIK *croc* is the only tool that is easily installed and used on any platform, *and* has secure peer-to-peer transferring (through a relay), allows multiple files, *and* has the capability to resume broken transfers. -## Overview -**Transmit encrypted data with a code phrase** +For more information on how croc works, see [my blog post](https://schollz.com/software/croc). -*croc* securely transfers data using *code phrases* - a combination of three random words (mnemonicoded 4 bytes). The code phrase is shared between the sender and the recipient for password authenticated key exchange ([PAKE](https://github.com/schollz/pake)), a cryptographic method to use a shared weak key (the "code phrase") to generate a strong key for secure end-to-end encryption. By default, a code phrase can only be used once between two parties so an attacker would have a chance of less than 1 in *4 billion* to guess the code phrase correctly to steal the data. An attacker with the wrong code phrase will fail the PAKE and the sender will be notified without any data transfering. Only two people with the right code phrase will be able to computers transfer encrypted data through a relay. - -**Fast data transfer through TCP** - -The actual data transfer is accomplished using a relay, either using raw TCP sockets or websockets. If both computers are on the LAN network then *croc* will use a local relay, otherwise a public relay is used. All the data going through the relay is encrypted using the PAKE-generated session key, so the relay can't spy on information passing through it. The data is transferred in blocks, where each block is compressed and encrypted, and the recipient keeps track of blocks received so that it can resume the transfer if interrupted. - -**Relay allows any two computers to connect** - -*croc* differs from a utility like *scp* because it doesn't require any two computers to have enabled port-forwarding. Instead, *croc* will uses a relay - a temporary server setup locally (if both computers are on lan) or publicly (default is at croc4.schollz.com). Any two computers can connect to the relay, and after securing their channel with PAKE, they can transfer encrypted metadata and data through the relay. The relay works by first having the computers communicate the PAKE protocol via websockets, and then exchanging encrypted metadata, and then stapling the TCP connections directly so that they can transfer directly. - -**Why another data transfer utility?** - -My motivation to write *croc*, as stupid as it sounds, is because I wanted to create a program that made it easy to send a 3GB+ PBS documentary to my friend in a different country. My friend has a Windows computer and is not comfortable using a terminal. So I wanted to write a program that, while secure, is simple to receive a file. *croc* accomplishes this, and now I find myself using it almost everyday at work. To receive a file you can just download the executable and double click on it. The name is inspired by the [fable of the frog and the crocodile](https://web.archive.org/web/20180926035731/http://allaboutfrogs.org/stories/crocodile.html). - -## Examples - -The first example shows the basic transfer of some file or folder from computer 1 to computer 2. _These two gifs should run in sync if you force-reload (Ctl+F5)_ - -![send](.github/1.gif) - -![receive](.github/2.gif) - -The second example shows how you can restart a broken transfer. Here, computer 2 presses Ctl+C during a transfer to abruptly break the connection, and then resumes by having computer 1 re-send the file. _These two gifs should run in sync if you force-reload (Ctl+F5)_ - -![send](.github/3.gif) - -![receive](.github/4.gif) - -In version 4, there is now a GUI available for [Windows](https://github.com/schollz/croc/releases/latest) and [Linux](https://github.com/schollz/croc/releases/latest): - -
- -
## Install -[Download the latest release for your system](https://github.com/schollz/croc/releases/latest). - -Or, you can [install Go](https://golang.org/dl/) and build from source with `go get github.com/schollz/croc`. Since *croc* uses [Go modules](https://golang.org/doc/go1.11#modules) it requires Go version 1.11+. - -Or, you can quickly install a release from the command-line: +Download [the latest release for your system](https://github.com/schollz/croc/releases/latest), or install a release from the command-line: ``` $ curl https://getcroc.schollz.com | bash ``` + +Or, you can [install Go](https://golang.org/dl/) and build from source (requires Go 1.11+): + ``` -$ wget -qO- https://getcroc.schollz.com | bash +go get github.com/schollz/croc ``` + ## Usage -The basic usage is to just do +To send a file, simply do: ``` $ croc send FILE ``` -to send and then on the other computer you can just do +Them to receive the file, you can just do ``` -$ croc [code phrase] +$ croc [code-phrase] ``` -to receive (you'll be prompted to enter the code phrase). Note, by default, you don't need any arguments for receiving, instead you will be prompted to enter the code phrase. This makes it possible for you to just double click the executable to run (nice for those of us that aren't computer wizards). - ### Custom code phrase You can send with your own code phrase (must be more than 4 characters). From 868051bc2a09ffd0ef8fc3f82789ffa1873f2b56 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 13:48:09 -0600 Subject: [PATCH 089/110] update ports --- src/cli/cli.go | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/cli/cli.go b/src/cli/cli.go index 9de45bc..b0e5f43 100644 --- a/src/cli/cli.go +++ b/src/cli/cli.go @@ -42,6 +42,7 @@ func Run() (err error) { ArgsUsage: "[filename]", Flags: []cli.Flag{ cli.StringFlag{Name: "code, c", Usage: "codephrase used to connect to relay"}, + cli.StringFlag{Name: "ports", Value: "9009,9010,9011,9012,9013", Usage: "ports of the local relay (optional)"}, }, HelpName: "croc send", Action: func(c *cli.Context) error { @@ -55,6 +56,9 @@ func Run() (err error) { Action: func(c *cli.Context) error { return relay(c) }, + Flags: []cli.Flag{ + cli.StringFlag{Name: "ports", Value: "9009,9010,9011,9012,9013", Usage: "ports of the relay"}, + }, }, } app.Flags = []cli.Flag{ @@ -63,7 +67,6 @@ func Run() (err error) { cli.BoolFlag{Name: "stdout", Usage: "redirect file to stdout"}, cli.StringFlag{Name: "relay", Value: "198.199.67.130:9009", Usage: "address of the relay"}, cli.StringFlag{Name: "out", Value: ".", Usage: "specify an output folder to receive the file"}, - cli.StringFlag{Name: "ports", Value: "9009,9010,9011,9012,9013", Usage: "ports of the relay"}, } app.EnableBashCompletion = true app.HideHelp = false @@ -164,7 +167,7 @@ func send(c *cli.Context) (err error) { NoPrompt: c.GlobalBool("yes"), RelayAddress: c.GlobalString("relay"), Stdout: c.GlobalBool("stdout"), - RelayPorts: strings.Split(c.GlobalString("ports"), ","), + RelayPorts: strings.Split(c.String("ports"), ","), }) if err != nil { return @@ -194,12 +197,13 @@ func receive(c *cli.Context) (err error) { } cr, err := croc.New(croc.Options{ - SharedSecret: sharedSecret, - IsSender: false, - Debug: c.GlobalBool("debug"), - NoPrompt: c.GlobalBool("yes"), - RelayAddress: c.GlobalString("relay"), - Stdout: c.GlobalBool("stdout"), + SharedSecret: sharedSecret, + IsSender: false, + Debug: c.GlobalBool("debug"), + NoPrompt: c.GlobalBool("yes"), + RelayAddress: c.GlobalString("relay"), + Stdout: c.GlobalBool("stdout"), + PathToReceive: c.GlobalString("out"), }) if err != nil { return @@ -213,7 +217,7 @@ func relay(c *cli.Context) (err error) { if c.GlobalBool("debug") { debugString = "debug" } - ports := strings.Split(c.GlobalString("ports"), ",") + ports := strings.Split(c.String("ports"), ",") tcpPorts := strings.Join(ports[1:], ",") for i, port := range ports { if i == 0 { From 494b224db0f022c434bc108ffe7b59a9944794fa Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 13:49:58 -0600 Subject: [PATCH 090/110] fix --- src/cli/cli.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/cli/cli.go b/src/cli/cli.go index b0e5f43..65f257c 100644 --- a/src/cli/cli.go +++ b/src/cli/cli.go @@ -197,13 +197,12 @@ func receive(c *cli.Context) (err error) { } cr, err := croc.New(croc.Options{ - SharedSecret: sharedSecret, - IsSender: false, - Debug: c.GlobalBool("debug"), - NoPrompt: c.GlobalBool("yes"), - RelayAddress: c.GlobalString("relay"), - Stdout: c.GlobalBool("stdout"), - PathToReceive: c.GlobalString("out"), + SharedSecret: sharedSecret, + IsSender: false, + Debug: c.GlobalBool("debug"), + NoPrompt: c.GlobalBool("yes"), + RelayAddress: c.GlobalString("relay"), + Stdout: c.GlobalBool("stdout"), }) if err != nil { return From 7162e5e45b0fa03d98d2782cf718775eca234747 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 17:10:02 -0600 Subject: [PATCH 091/110] collect ipaddr from connecting to tcp --- src/tcp/tcp.go | 17 +++++++++-------- src/tcp/tcp_test.go | 11 +++++++---- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index 43691b0..afb7eb0 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -4,6 +4,7 @@ import ( "bytes" "fmt" "net" + "strings" "sync" "time" @@ -96,13 +97,12 @@ func (s *server) run() (err error) { func (s *server) clientCommuncation(port string, c *comm.Comm) (err error) { // send ok to tell client they are connected - log.Debugf("sending '%s'", s.banner) - if len(s.banner) > 0 { - err = c.Send([]byte(s.banner)) - } else { - err = c.Send([]byte("ok")) - + banner := s.banner + if len(banner) == 0 { + banner = "ok" } + log.Debugf("sending '%s'", banner) + err = c.Send([]byte(banner + "|||" + c.Connection().RemoteAddr().String())) if err != nil { return } @@ -243,7 +243,7 @@ func pipe(conn1 net.Conn, conn2 net.Conn) { } } -func ConnectToTCPServer(address, room string) (c *comm.Comm, banner string, err error) { +func ConnectToTCPServer(address, room string) (c *comm.Comm, banner string, ipaddr string, err error) { c, err = comm.NewConnection(address) if err != nil { return @@ -253,7 +253,8 @@ func ConnectToTCPServer(address, room string) (c *comm.Comm, banner string, err if err != nil { return } - banner = string(data) + banner = strings.Split(string(data), "|||")[0] + ipaddr = strings.Split(string(data), "|||")[1] log.Debug("sending room") err = c.Send([]byte(room)) if err != nil { diff --git a/src/tcp/tcp_test.go b/src/tcp/tcp_test.go index f048b46..99dce45 100644 --- a/src/tcp/tcp_test.go +++ b/src/tcp/tcp_test.go @@ -1,6 +1,7 @@ package tcp import ( + "strings" "testing" "time" @@ -8,13 +9,15 @@ import ( ) func TestTCP(t *testing.T) { - go Run("debug", "8081") + go Run("debug", "8081", "8082") time.Sleep(100 * time.Millisecond) - c1, _, err := ConnectToTCPServer("localhost:8081", "testRoom") + c1, banner, ipaddr, err := ConnectToTCPServer("localhost:8081", "testRoom") + assert.Equal(t, banner, "8082") + assert.True(t, strings.HasPrefix(ipaddr, "127.0.0.1")) assert.Nil(t, err) - c2, _, err := ConnectToTCPServer("localhost:8081", "testRoom") + c2, _, _, err := ConnectToTCPServer("localhost:8081", "testRoom") assert.Nil(t, err) - _, _, err = ConnectToTCPServer("localhost:8081", "testRoom") + _, _, _, err = ConnectToTCPServer("localhost:8081", "testRoom") assert.NotNil(t, err) // try sending data From b109b419de0aec8081898c0f38785052ef3a86f3 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 17:27:49 -0600 Subject: [PATCH 092/110] save the extenral ip --- src/croc/croc.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 317c94a..0c6e310 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -58,9 +58,10 @@ type Options struct { } type Client struct { - Options Options - Pake *pake.Pake - Key crypt.Encryption + Options Options + Pake *pake.Pake + Key crypt.Encryption + ExternalIP string // steps involved in forming relationship Step1ChannelSecured bool @@ -264,7 +265,7 @@ func (c *Client) Send(options TransferOptions) (err error) { time.Sleep(500 * time.Millisecond) log.Debug("establishing connection") var banner string - conn, banner, err := tcp.ConnectToTCPServer("localhost:"+c.Options.RelayPorts[0], c.Options.SharedSecret) + conn, banner, ipaddr, err := tcp.ConnectToTCPServer("localhost:"+c.Options.RelayPorts[0], c.Options.SharedSecret) log.Debugf("banner: %s", banner) if err != nil { err = errors.Wrap(err, fmt.Sprintf("could not connect to localhost:%s", c.Options.RelayPorts[0])) @@ -281,6 +282,7 @@ func (c *Client) Send(options TransferOptions) (err error) { log.Debug("exchanged header message") c.Options.RelayAddress = "localhost" c.Options.RelayPorts = strings.Split(banner, ",") + c.ExternalIP = ipaddr errchan <- c.transfer(options) }() } @@ -288,7 +290,7 @@ func (c *Client) Send(options TransferOptions) (err error) { go func() { log.Debug("establishing connection to %s", c.Options.RelayAddress) var banner string - conn, banner, err := tcp.ConnectToTCPServer(c.Options.RelayAddress, c.Options.SharedSecret) + conn, banner, ipaddr, err := tcp.ConnectToTCPServer(c.Options.RelayAddress, c.Options.SharedSecret) log.Debugf("banner: %s", banner) if err != nil { err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) @@ -304,6 +306,7 @@ func (c *Client) Send(options TransferOptions) (err error) { c.conn[0] = conn c.Options.RelayPorts = strings.Split(banner, ",") + c.ExternalIP = ipaddr log.Debug("exchanged header message") errchan <- c.transfer(options) }() @@ -331,7 +334,7 @@ func (c *Client) Receive() (err error) { log.Debug("establishing connection") } var banner string - c.conn[0], banner, err = tcp.ConnectToTCPServer(c.Options.RelayAddress, c.Options.SharedSecret) + c.conn[0], banner, c.ExternalIP, err = tcp.ConnectToTCPServer(c.Options.RelayAddress, c.Options.SharedSecret) log.Debugf("banner: %s", banner) if err != nil { err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) @@ -443,7 +446,7 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { defer wg.Done() server := fmt.Sprintf("%s:%s", strings.Split(c.Options.RelayAddress, ":")[0], c.Options.RelayPorts[j]) log.Debugf("connecting to %s", server) - c.conn[j+1], _, err = tcp.ConnectToTCPServer( + c.conn[j+1], _, _, err = tcp.ConnectToTCPServer( server, fmt.Sprintf("%s-%d", utils.SHA256(c.Options.SharedSecret)[:7], j), ) From 359dc4549bd1afa5e2ae71bec446c867e59b646f Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 17:44:09 -0600 Subject: [PATCH 093/110] share public ip as info --- src/croc/croc.go | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 0c6e310..d78588c 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -58,10 +58,10 @@ type Options struct { } type Client struct { - Options Options - Pake *pake.Pake - Key crypt.Encryption - ExternalIP string + Options Options + Pake *pake.Pake + Key crypt.Encryption + ExternalIP, ExternalIPConnected string // steps involved in forming relationship Step1ChannelSecured bool @@ -429,8 +429,9 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { salt := make([]byte, 8) rand.Read(salt) err = message.Send(c.conn[0], c.Key, message.Message{ - Type: "salt", - Bytes: salt, + Type: "salt", + Bytes: salt, + Message: c.ExternalIP, }) if err != nil { return @@ -466,8 +467,9 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { if !c.Options.IsSender { log.Debug("sending salt back") err = message.Send(c.conn[0], c.Key, message.Message{ - Type: "salt", - Bytes: m.Bytes, + Type: "salt", + Bytes: m.Bytes, + Message: c.ExternalIP, }) } log.Debugf("session key is verified, generating encryption with salt: %x", m.Bytes) @@ -479,6 +481,8 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { if err != nil { return true, err } + c.ExternalIPConnected = m.Message + log.Debugf("connected as %s -> %s", c.ExternalIP, c.ExternalIPConnected) c.Step1ChannelSecured = true case "error": // c.spinner.Stop() From 67f69c892d0c2a02451645c1c293130572d101e5 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 17:49:49 -0600 Subject: [PATCH 094/110] use external ip in ui --- src/croc/croc.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index d78588c..ca0901e 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -507,7 +507,7 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { } // c.spinner.Stop() if !c.Options.NoPrompt { - fmt.Fprintf(os.Stderr, "\rAccept %s (%s) from machine '%s'? (y/n) ", fname, utils.ByteCountDecimal(totalSize), senderInfo.MachineID) + fmt.Fprintf(os.Stderr, "\rAccept %s (%s)? (y/n) ", fname, utils.ByteCountDecimal(totalSize)) if strings.ToLower(strings.TrimSpace(utils.GetInput(""))) != "y" { err = message.Send(c.conn[0], c.Key, message.Message{ Type: "error", @@ -516,8 +516,10 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { return true, fmt.Errorf("refused files") } } else { - fmt.Fprintf(os.Stderr, "\rReceiving %s (%s) from machine '%s'\n", fname, utils.ByteCountDecimal(totalSize), senderInfo.MachineID) + fmt.Fprintf(os.Stderr, "\rReceiving %s (%s) \n", fname, utils.ByteCountDecimal(totalSize)) } + fmt.Fprintf(os.Stderr, "\nReceiving (<-%s)\n", c.ExternalIPConnected) + log.Debug(c.FilesToTransfer) c.Step2FileInfoTransfered = true case "recipientready": @@ -669,6 +671,7 @@ func (c *Client) updateState() (err error) { } if c.Options.IsSender && c.Step3RecipientRequestFile && !c.Step4FileTransfer { log.Debug("start sending data!") + fmt.Fprintf(os.Stderr, "\nSending (->%s)\n", c.ExternalIPConnected) c.Step4FileTransfer = true // setup the progressbar c.setBar() From 2b42c5365c5d34b42135b93847b79f6e0d10aa42 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Wed, 1 May 2019 17:52:37 -0600 Subject: [PATCH 095/110] don't show ui each time --- src/croc/croc.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index ca0901e..7393213 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -87,6 +87,7 @@ type Client struct { bar *progressbar.ProgressBar spinner *spinner.Spinner machineID string + firstSend bool mutex *sync.Mutex quit chan bool @@ -671,7 +672,10 @@ func (c *Client) updateState() (err error) { } if c.Options.IsSender && c.Step3RecipientRequestFile && !c.Step4FileTransfer { log.Debug("start sending data!") - fmt.Fprintf(os.Stderr, "\nSending (->%s)\n", c.ExternalIPConnected) + if !c.firstSend { + fmt.Fprintf(os.Stderr, "\nSending (->%s)\n", c.ExternalIPConnected) + c.firstSend = true + } c.Step4FileTransfer = true // setup the progressbar c.setBar() From abc5e3f6c04e0d857c7b0b94562c8b66667fee7d Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Thu, 2 May 2019 11:31:26 -0700 Subject: [PATCH 096/110] move install script --- .github/1.gif | Bin 30546 -> 0 bytes .github/2.gif | Bin 25386 -> 0 bytes .github/3.gif | Bin 207577 -> 0 bytes .github/4.gif | Bin 359149 -> 0 bytes .github/issue_template.md | 17 ----------------- {.github => src/install}/default.txt | 0 6 files changed, 17 deletions(-) delete mode 100644 .github/1.gif delete mode 100644 .github/2.gif delete mode 100644 .github/3.gif delete mode 100644 .github/4.gif delete mode 100644 .github/issue_template.md rename {.github => src/install}/default.txt (100%) diff --git a/.github/1.gif b/.github/1.gif deleted file mode 100644 index ee2993678effd6a4398c511809b25f7db3472dd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30546 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 diff --git a/.github/2.gif b/.github/2.gif deleted file mode 100644 index b2293706122878924b17d0888afc6490b1e372e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25386 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 yTcQD1Vgy%hb-YNoCGE0nW*?JU51 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

    U3poo6T-McfC-?%3clTZXgfjjUk+$3={~xt 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

    2sbi19XrZ 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�R{CFWD>~8`-nEx$GUWoa^ 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≦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 diff --git a/.github/issue_template.md b/.github/issue_template.md deleted file mode 100644 index d2eb468..0000000 --- a/.github/issue_template.md +++ /dev/null @@ -1,17 +0,0 @@ -## Expected Behavior - - -## Actual Behavior - - -## Steps to Reproduce the Problem - - 1. - 1. - 1. - -## Specifications - - - Version (`croc -version` or let me know latest commit in git log if using dev): - - Platform: - - Subsystem: diff --git a/.github/default.txt b/src/install/default.txt similarity index 100% rename from .github/default.txt rename to src/install/default.txt From 95c2b0f48af2f9dbc6bbd82403f12742703302dd Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Thu, 2 May 2019 11:41:03 -0700 Subject: [PATCH 097/110] Don't throw error if cannot connect to server --- src/croc/croc.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/croc/croc.go b/src/croc/croc.go index 7393213..84534e6 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -295,6 +295,7 @@ func (c *Client) Send(options TransferOptions) (err error) { log.Debugf("banner: %s", banner) if err != nil { err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress)) + log.Debug(err) return } log.Debugf("connection established: %+v", conn) From 2e5f33c0814d23185e7fcd317e1f8adfb08823b6 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Thu, 2 May 2019 11:44:10 -0700 Subject: [PATCH 098/110] print out securing --- src/croc/croc.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/croc/croc.go b/src/croc/croc.go index 84534e6..7c47e58 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -346,6 +346,7 @@ func (c *Client) Receive() (err error) { c.conn[0].Send([]byte("handshake")) c.Options.RelayPorts = strings.Split(banner, ",") log.Debug("exchanged header message") + fmt.Fprintf(os.Stderr, "\rsecuring channel...") return c.transfer(TransferOptions{}) } From 7af57b339048a49068667b1b1dfdc7d0f1013e87 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Thu, 2 May 2019 11:44:54 -0700 Subject: [PATCH 099/110] slightly larger bar --- src/croc/croc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 7c47e58..6037a1a 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -699,7 +699,7 @@ func (c *Client) setBar() { progressbar.OptionOnCompletion(func() { fmt.Fprintf(os.Stderr, " ✔️\n") }), - progressbar.OptionSetWidth(16), + progressbar.OptionSetWidth(20), progressbar.OptionSetDescription(description), progressbar.OptionSetRenderBlankState(true), progressbar.OptionSetBytes64(c.FilesToTransfer[c.FilesToTransferCurrentNum].Size), From aae63876d604ce4c97d86c17a0232295aa710c8e Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Thu, 2 May 2019 11:45:42 -0700 Subject: [PATCH 100/110] use local port --- src/croc/croc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index 6037a1a..d070b74 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -251,7 +251,7 @@ func (c *Client) Send(options TransferOptions) (err error) { go func() { discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ Limit: 1, - Payload: []byte("9009"), + Payload: []byte(c.Options.RelayPorts[0]), Delay: 10 * time.Millisecond, TimeLimit: 30 * time.Second, }) From 9cf4050913a2f83025ac2eacb6855fae1a568a4d Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Thu, 2 May 2019 11:47:19 -0700 Subject: [PATCH 101/110] no limit to sender discoveries --- src/croc/croc.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index d070b74..d4a903f 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -250,9 +250,9 @@ func (c *Client) Send(options TransferOptions) (err error) { // look for peers first go func() { discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ - Limit: 1, + Limit: -1, Payload: []byte(c.Options.RelayPorts[0]), - Delay: 10 * time.Millisecond, + Delay: 5 * time.Millisecond, TimeLimit: 30 * time.Second, }) log.Debugf("discoveries: %+v", discoveries) From 462fad8d8e7484b03bf4c7f03d6c18592d0dd849 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Thu, 2 May 2019 11:50:01 -0700 Subject: [PATCH 102/110] modify discover parameters --- src/croc/croc.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/croc/croc.go b/src/croc/croc.go index d4a903f..7ad7ea6 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -252,7 +252,7 @@ func (c *Client) Send(options TransferOptions) (err error) { discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ Limit: -1, Payload: []byte(c.Options.RelayPorts[0]), - Delay: 5 * time.Millisecond, + Delay: 10 * time.Millisecond, TimeLimit: 30 * time.Second, }) log.Debugf("discoveries: %+v", discoveries) @@ -322,6 +322,7 @@ func (c *Client) Receive() (err error) { // recipient will look for peers first // and continue if it doesn't find any within 100 ms if !c.Options.DisableLocal { + log.Debug("attempt to discover peers") discoveries, err := peerdiscovery.Discover(peerdiscovery.Settings{ Limit: 1, Payload: []byte("ok"), From 7377f536fc952d38da193827a41a821fe1094b59 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Thu, 2 May 2019 12:08:23 -0700 Subject: [PATCH 103/110] update ui and readme --- README.md | 65 ++++++++++++++++++------------------------------ src/cli/cli.go | 2 +- src/croc/croc.go | 2 +- src/tcp/tcp.go | 2 +- 4 files changed, 27 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 1eec9b3..ade6b8a 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ width="408px" border="0" alt="croc">
    Version -Code coverage Build
 Status @@ -15,10 +14,15 @@ Status">

    curl https://getcroc.schollz.com | bash

    -*croc* is a tool that allows any two computers to simply and securely transfer files and folders. There are many tools that can do this but AFAIK *croc* is the only tool that is easily installed and used on any platform, *and* has secure peer-to-peer transferring (through a relay), allows multiple files, *and* has the capability to resume broken transfers. +`croc` is a tool that allows any two computers to simply and securely transfer files and folders. AFAIK, this is the only CLI file-transfer tool that: +- enables **cross-platform** transferes (Windows, Linux, Mac) +- enables secure **peer-to-peer** transferring (through a relay) +- allows **multiple file** transfers +- allows **resuming transfers** that are interrupted +- does *not* require a server or port-forwarding -For more information on how croc works, see [my blog post](https://schollz.com/software/croc). +For more information on how `croc` works, see [my blog post](https://schollz.com/software/croc6). ## Install @@ -44,75 +48,59 @@ To send a file, simply do: ``` $ croc send FILE +Sending 'FILE' (X MB) +Code is: code-phrase ``` -Them to receive the file, you can just do +Them to receive the file on another computer, you can just do ``` -$ croc [code-phrase] +$ croc code-phrase ``` +The code phrase is used to establish password-authenticated key agreement ([PAKE](https://en.wikipedia.org/wiki/Password-authenticated_key_agreement)) which generates a secret key for the sender and recipient to use for end-to-end encryption. + ### Custom code phrase You can send with your own code phrase (must be more than 4 characters). ``` -$ croc send --code [code phrase] [filename] +$ croc send --code [code-phrase] [filename] ``` -### Use locally -*croc* automatically will attempt to start a local connection on your LAN to transfer the file much faster. It uses [peer discovery](https://github.com/schollz/peerdiscovery), basically broadcasting a message on the local subnet to see if another *croc* user wants to receive the file. *croc* will utilize the first incoming connection from either the local network or the public relay and follow through with PAKE. +### Use pipes - stdin and stdout -You can change this behavior by forcing *croc* to use only local connections (`--local`) or force to use the public relay only (`--no-local`): - -``` -$ croc --local/--no-local send [filename] -``` - -### Using pipes - stdin and stdout - -You can easily use *croc* in pipes when you need to send data through stdin or get data from stdout. To send you can just use pipes: +You can pipe to `croc`: ``` $ cat [filename] | croc send ``` -In this case *croc* will automatically use the stdin data and send and assign a filename like "croc-stdin-123456789". To receive to stdout at you can always just use the `-yes` and `-stdout` flags which will automatically approve the transfer and pipe it out to stdout. +In this case `croc` will automatically use the stdin data and send and assign a filename like "croc-stdin-123456789". To receive to stdout at you can always just use the `--yes` and `--stdout` flags which will automatically approve the transfer and pipe it out to stdout. ``` -$ croc -yes -stdout [code phrase] > out +$ croc --yes --stdout [code-phrase] > out ``` All of the other text printed to the console is going to `stderr` so it will not interfere with the message going to stdout. ### Self-host relay -The relay is needed to staple the parallel incoming and outgoing connections. The relay temporarily stores connection information and the encrypted meta information. The default uses a public relay at, `croc4.schollz.com`. You can also run your own relay, it is very easy, just run: +The relay is needed to staple the parallel incoming and outgoing connections. By default, `croc` uses a public relay but you can also run your own relay: ``` $ croc relay ``` -Make sure to open up TCP ports (see `croc relay --help` for which ports to open). Relays can also be customized to which elliptic curve they will use (default is siec). +Make sure to open up TCP ports (see `croc relay --help` for which ports to open). -You can send files using your relay by entering `-addr` to change the relay that you are using if you want to custom host your own. +You can send files using your relay by entering `--relay` to change the relay that you are using if you want to custom host your own. ``` -$ croc -addr "myrelay.example.com" send [filename] +$ croc --relay "myrelay.example.com:9009" send [filename] ``` -### Configuration file - -You can also make some paramters static by using a configuration file. To get started with the config file just do - -``` -$ croc config -``` - -which will generate the file that you can edit. -Any changes you make to the configuration file will be applied *before* the command-line flags, if any. - ## License @@ -120,11 +108,6 @@ MIT ## Acknowledgements -*croc* has been through many iterations, and I am awed by all the great contributions! If you feel like contributing, in any way, by all means you can send an Issue, a PR, ask a question, or tweet me ([@yakczar](http://ctt.ec/Rq054)). +`croc` has been through many iterations, and I am awed by all the great contributions! If you feel like contributing, in any way, by all means you can send an Issue, a PR, ask a question, or tweet me ([@yakczar](http://ctt.ec/Rq054)). -Thanks... - -- ...[@warner](https://github.com/warner) for the [idea](https://github.com/warner/magic-wormhole). -- ...[@tscholl2](https://github.com/tscholl2) for the [encryption gists](https://gist.github.com/tscholl2/dc7dc15dc132ea70a98e8542fefffa28). -- ...[@skorokithakis](https://github.com/skorokithakis) for [code on proxying two connections](https://www.stavros.io/posts/proxying-two-connections-go/). -- ...for making pull requests [@Girbons](https://github.com/Girbons), [@techtide](https://github.com/techtide), [@heymatthew](https://github.com/heymatthew), [@Lunsford94](https://github.com/Lunsford94), [@lummie](https://github.com/lummie), [@jesuiscamille](https://github.com/jesuiscamille), [@threefjord](https://github.com/threefjord), [@marcossegovia](https://github.com/marcossegovia), [@csleong98](https://github.com/csleong98), [@afotescu](https://github.com/afotescu), [@callmefever](https://github.com/callmefever), [@El-JojA](https://github.com/El-JojA), [@anatolyyyyyy](https://github.com/anatolyyyyyy), [@goggle](https://github.com/goggle), [@smileboywtu](https://github.com/smileboywtu), [@nicolashardy](https://github.com/nicolashardy)! +Thanks [@warner](https://github.com/warner) for the [idea](https://github.com/warner/magic-wormhole), [@tscholl2](https://github.com/tscholl2) for the [encryption gists](https://gist.github.com/tscholl2/dc7dc15dc132ea70a98e8542fefffa28), [@skorokithakis](https://github.com/skorokithakis) for [code on proxying two connections](https://www.stavros.io/posts/proxying-two-connections-go/). Finally thanks for making pull requests [@Girbons](https://github.com/Girbons), [@techtide](https://github.com/techtide), [@heymatthew](https://github.com/heymatthew), [@Lunsford94](https://github.com/Lunsford94), [@lummie](https://github.com/lummie), [@jesuiscamille](https://github.com/jesuiscamille), [@threefjord](https://github.com/threefjord), [@marcossegovia](https://github.com/marcossegovia), [@csleong98](https://github.com/csleong98), [@afotescu](https://github.com/afotescu), [@callmefever](https://github.com/callmefever), [@El-JojA](https://github.com/El-JojA), [@anatolyyyyyy](https://github.com/anatolyyyyyy), [@goggle](https://github.com/goggle), [@smileboywtu](https://github.com/smileboywtu), [@nicolashardy](https://github.com/nicolashardy)! diff --git a/src/cli/cli.go b/src/cli/cli.go index 65f257c..3dec2aa 100644 --- a/src/cli/cli.go +++ b/src/cli/cli.go @@ -212,7 +212,7 @@ func receive(c *cli.Context) (err error) { } func relay(c *cli.Context) (err error) { - debugString := "warn" + debugString := "info" if c.GlobalBool("debug") { debugString = "debug" } diff --git a/src/croc/croc.go b/src/croc/croc.go index 7ad7ea6..eba0a56 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -223,7 +223,7 @@ func (c *Client) Send(options TransferOptions) (err error) { machID = machID[:6] } c.machineID = machID - fmt.Fprintf(os.Stderr, "Sending %s (%s) from your machine, '%s'\n", fname, utils.ByteCountDecimal(totalFilesSize), machID) + fmt.Fprintf(os.Stderr, "Sending %s (%s)\n", fname, utils.ByteCountDecimal(totalFilesSize)) fmt.Fprintf(os.Stderr, "Code is: %s\nOn the other computer run\n\ncroc %s\n", c.Options.SharedSecret, c.Options.SharedSecret) // // c.spinner.Suffix = " waiting for recipient..." // c.spinner.Start() diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index afb7eb0..14a37fc 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -73,7 +73,7 @@ func (s *server) start() (err error) { } func (s *server) run() (err error) { - log.Debugf("starting TCP server on " + s.port) + log.Infof("starting TCP server on " + s.port) server, err := net.Listen("tcp", ":"+s.port) if err != nil { return errors.Wrap(err, "Error listening on :"+s.port) From 9e61f3870719801702c2f6f8a0c4cc6842f944a5 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Thu, 2 May 2019 13:14:09 -0700 Subject: [PATCH 104/110] add go generate code for updating version --- main.go | 39 +------------------------- src/cli/cli.go | 6 ++-- src/install/updateversion.go | 53 ++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 41 deletions(-) create mode 100644 src/install/updateversion.go diff --git a/main.go b/main.go index 30ae1ee..1a2d6a0 100644 --- a/main.go +++ b/main.go @@ -1,4 +1,5 @@ package main +//go:generate go run src/install/updateversion.go import ( "fmt" @@ -7,44 +8,6 @@ import ( ) func main() { - // f, _ := os.Create("test.1") - // f.Truncate(8096) - // f.Close() - - // file, _ := os.Open("test.1") - // defer file.Close() - - // buffer := make([]byte, 4096) - // emptyBuffer := make([]byte, 4096) - // for { - // bytesread, err := file.Read(buffer) - // if err != nil { - // break - // } - // log.Debugln(bytes.Equal(buffer[:bytesread], emptyBuffer[:bytesread])) - // } - // var sender bool - // flag.BoolVar(&sender, "sender", false, "sender") - // flag.Parse() - // c, err := croc.New(sender, "foo") - // if err != nil { - // panic(err) - // } - // if sender { - // err = c.Send(croc.TransferOptions{ - // // PathToFile: "../wskeystore/README.md", - // // PathToFile: "./src/croc/croc.go", - // // PathToFiles: []string{"C:\\Users\\zacks\\go\\src\\github.com\\schollz\\croc\\src\\croc\\croc.go", "croc.exe"}, - // PathToFiles: []string{"croc2.exe", "croc3.exe"}, //,"croc2.exe", "croc3.exe"}, - // //PathToFiles: []string{"README.md"}, //,"croc2.exe", "croc3.exe"}, - // KeepPathInRemote: false, - // }) - // } else { - // err = c.Receive() - // } - // if err != nil { - // fmt.Println(err) - // } if err := cli.Run(); err != nil { fmt.Println(err) } diff --git a/src/cli/cli.go b/src/cli/cli.go index 3dec2aa..048a3e1 100644 --- a/src/cli/cli.go +++ b/src/cli/cli.go @@ -21,14 +21,14 @@ import ( var Version string func Run() (err error) { - +// use all of the processors runtime.GOMAXPROCS(runtime.NumCPU()) + app := cli.NewApp() app.Name = "croc" if Version == "" { - Version = "dev" + Version = "6.0.0" } - app.Version = Version app.Compiled = time.Now() app.Usage = "easily and securely transfer stuff from one computer to another" diff --git a/src/install/updateversion.go b/src/install/updateversion.go new file mode 100644 index 0000000..b65a905 --- /dev/null +++ b/src/install/updateversion.go @@ -0,0 +1,53 @@ +package main + +import ( + "fmt" + "io/ioutil" + "strings" +) + +func main() { + err := run() + if err != nil { + fmt.Println(err) + } +} + +func run() (err error) { + b, err := ioutil.ReadFile("README.md") + if err != nil { + return + } + newVersion := GetStringInBetween(string(b), "version-", "-b") + + b, err = ioutil.ReadFile("src/cli/cli.go") + if err != nil { + return + } + oldVersion := GetStringInBetween(string(b), `Version = "`, `"`) + + if newVersion != oldVersion { + fmt.Printf("new version: '%s'\n", newVersion) + fmt.Printf("old version: '%s'\n", oldVersion) + newCli := strings.Replace(string(b), fmt.Sprintf(`Version = "%s"`, oldVersion), fmt.Sprintf(`Version = "%s"`, newVersion), 1) + err = ioutil.WriteFile("src/cli/cli.go", []byte(newCli), 0644) + } else { + fmt.Printf("current version: '%s'\n", oldVersion) + } + return +} + +// GetStringInBetween Returns empty string if no start string found +func GetStringInBetween(str string, start string, end string) (result string) { + s := strings.Index(str, start) + if s == -1 { + return + } + s += len(start) + e := strings.Index(str[s:], end) + if e == -1 { + return + } + e += s + return str[s:e] +} From 37b29aebce3268085e1f36df38b16abe06419d9d Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Thu, 2 May 2019 13:23:23 -0700 Subject: [PATCH 105/110] update version --- src/install/updateversion.go | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/install/updateversion.go b/src/install/updateversion.go index b65a905..fa1df07 100644 --- a/src/install/updateversion.go +++ b/src/install/updateversion.go @@ -3,6 +3,7 @@ package main import ( "fmt" "io/ioutil" + "os/exec" "strings" ) @@ -14,26 +15,32 @@ func main() { } func run() (err error) { - b, err := ioutil.ReadFile("README.md") + version, err := exec.Command("git", "describe").Output() if err != nil { return } - newVersion := GetStringInBetween(string(b), "version-", "-b") - b, err = ioutil.ReadFile("src/cli/cli.go") + err = replaceInFile("src/cli/cli.go", `Version ="`, `"`, string(version)) + return +} + +func replaceInFile(fname, start, end, replacement string) (err error) { + b, err := ioutil.ReadFile(fname) if err != nil { return } - oldVersion := GetStringInBetween(string(b), `Version = "`, `"`) - - if newVersion != oldVersion { - fmt.Printf("new version: '%s'\n", newVersion) - fmt.Printf("old version: '%s'\n", oldVersion) - newCli := strings.Replace(string(b), fmt.Sprintf(`Version = "%s"`, oldVersion), fmt.Sprintf(`Version = "%s"`, newVersion), 1) - err = ioutil.WriteFile("src/cli/cli.go", []byte(newCli), 0644) - } else { - fmt.Printf("current version: '%s'\n", oldVersion) + oldVersion := GetStringInBetween(string(b), start, end) + if oldVersion == "" { + err = fmt.Errorf("nothing") + return } + newF := strings.Replace( + string(b), + fmt.Sprintf("%s%s%s", start, oldVersion, end), + fmt.Sprintf("%s%s%s", start, replacement, end), + 1, + ) + err = ioutil.WriteFile(fname, []byte(newF), 0644) return } From 2f4e5cdec48c56f8e92de8207bbdef5cf3bd6eb6 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Thu, 2 May 2019 13:25:03 -0700 Subject: [PATCH 106/110] update versoin --- src/cli/cli.go | 2 +- src/install/updateversion.go | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/cli/cli.go b/src/cli/cli.go index 048a3e1..decd6df 100644 --- a/src/cli/cli.go +++ b/src/cli/cli.go @@ -27,7 +27,7 @@ func Run() (err error) { app := cli.NewApp() app.Name = "croc" if Version == "" { - Version = "6.0.0" + Version = "v4.1.6-105-g37b29ae" } app.Version = Version app.Compiled = time.Now() diff --git a/src/install/updateversion.go b/src/install/updateversion.go index fa1df07..b54ce01 100644 --- a/src/install/updateversion.go +++ b/src/install/updateversion.go @@ -19,8 +19,12 @@ func run() (err error) { if err != nil { return } + versionNew := strings.TrimSpace(string(version)) - err = replaceInFile("src/cli/cli.go", `Version ="`, `"`, string(version)) + err = replaceInFile("src/cli/cli.go", `Version = "`, `"`, versionNew) + if err == nil { + fmt.Printf("updated cli.go to version %s\n", versionNew) + } return } From 78e4ee2b68cc5976dbcd25331cb012c8834b39e8 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Thu, 2 May 2019 13:28:28 -0700 Subject: [PATCH 107/110] update version --- README.md | 2 +- src/cli/cli.go | 2 +- src/install/updateversion.go | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ade6b8a..52d0c4f 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ src="https://user-images.githubusercontent.com/6550035/46709024-9b23ad00-cbf6-11e8-9fb2-ca8b20b7dbec.jpg" width="408px" border="0" alt="croc">
    -Version +Version Build
 Status diff --git a/src/cli/cli.go b/src/cli/cli.go index decd6df..dc86f5d 100644 --- a/src/cli/cli.go +++ b/src/cli/cli.go @@ -27,7 +27,7 @@ func Run() (err error) { app := cli.NewApp() app.Name = "croc" if Version == "" { - Version = "v4.1.6-105-g37b29ae" + Version = "v4.1.6-106-g2f4e5cd" } app.Version = Version app.Compiled = time.Now() diff --git a/src/install/updateversion.go b/src/install/updateversion.go index b54ce01..4426297 100644 --- a/src/install/updateversion.go +++ b/src/install/updateversion.go @@ -25,6 +25,11 @@ func run() (err error) { if err == nil { fmt.Printf("updated cli.go to version %s\n", versionNew) } + err = replaceInFile("README.md", `version-`, `-b`, strings.Split(versionNew, "-")[0]) + if err == nil { + fmt.Printf("updated README to version %s\n", strings.Split(versionNew, "-")[0]) + } + return } From 2515cfa31e9fbe95444a93084d5c2b226c299bb9 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Thu, 2 May 2019 13:31:48 -0700 Subject: [PATCH 108/110] update version --- README.md | 2 +- src/cli/cli.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 52d0c4f..ada90b3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ src="https://user-images.githubusercontent.com/6550035/46709024-9b23ad00-cbf6-11e8-9fb2-ca8b20b7dbec.jpg" width="408px" border="0" alt="croc">
    -Version +Version Build
 Status diff --git a/src/cli/cli.go b/src/cli/cli.go index dc86f5d..fa20cb4 100644 --- a/src/cli/cli.go +++ b/src/cli/cli.go @@ -27,7 +27,7 @@ func Run() (err error) { app := cli.NewApp() app.Name = "croc" if Version == "" { - Version = "v4.1.6-106-g2f4e5cd" + Version = "v6.0.0" } app.Version = Version app.Compiled = time.Now() From 2da7fa22adad6f863efd8d8e6058f9ae65a918c5 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Thu, 2 May 2019 13:40:14 -0700 Subject: [PATCH 109/110] minor --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ada90b3..6482d48 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Status"> `croc` is a tool that allows any two computers to simply and securely transfer files and folders. AFAIK, this is the only CLI file-transfer tool that: -- enables **cross-platform** transferes (Windows, Linux, Mac) +- enables **cross-platform** transfers (Windows, Linux, Mac) - enables secure **peer-to-peer** transferring (through a relay) - allows **multiple file** transfers - allows **resuming transfers** that are interrupted @@ -77,13 +77,13 @@ You can pipe to `croc`: $ cat [filename] | croc send ``` -In this case `croc` will automatically use the stdin data and send and assign a filename like "croc-stdin-123456789". To receive to stdout at you can always just use the `--yes` and `--stdout` flags which will automatically approve the transfer and pipe it out to stdout. +In this case `croc` will automatically use the stdin data and send and assign a filename like "croc-stdin-123456789". To receive to `stdout` at you can always just use the `--yes` and `--stdout` flags which will automatically approve the transfer and pipe it out to `stdout`. ``` $ croc --yes --stdout [code-phrase] > out ``` -All of the other text printed to the console is going to `stderr` so it will not interfere with the message going to stdout. +All of the other text printed to the console is going to `stderr` so it will not interfere with the message going to `stdout`. ### Self-host relay From e29179dd9ce973d87da48307dd9f6f2201003c28 Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Thu, 2 May 2019 16:06:57 -0700 Subject: [PATCH 110/110] update readme --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6482d48..751caf4 100644 --- a/README.md +++ b/README.md @@ -14,15 +14,16 @@ Status">

    curl https://getcroc.schollz.com | bash

    -`croc` is a tool that allows any two computers to simply and securely transfer files and folders. AFAIK, this is the only CLI file-transfer tool that: +`croc` is a tool that allows any two computers to simply and securely transfer files and folders. AFAIK, *croc* is the only CLI file-transfer tool does **all** of the following: -- enables **cross-platform** transfers (Windows, Linux, Mac) -- enables secure **peer-to-peer** transferring (through a relay) +- allows **any two computers** to transfer data (using a relay) +- provides **end-to-end encryption** (using PAKE) +- enables easy **cross-platform** transfers (Windows, Linux, Mac) - allows **multiple file** transfers - allows **resuming transfers** that are interrupted - does *not* require a server or port-forwarding -For more information on how `croc` works, see [my blog post](https://schollz.com/software/croc6). +For more information about `croc`, see [my blog post](https://schollz.com/software/croc6). ## Install