From 14d6d32a4136e7049ecc8e936288ef4e46930018 Mon Sep 17 00:00:00 2001 From: Alex Grintsvayg Date: Wed, 9 Jan 2019 17:52:30 -0500 Subject: [PATCH] move dht to lbry.go repo --- cluster/cluster.go | 6 +- cmd/cluster.go | 2 +- cmd/dht.go | 4 +- cmd/root.go | 6 +- cmd/start.go | 4 +- cmd/upload.go | 2 +- db/db.go | 10 +- dht/bits/bitmap.go | 399 --- dht/bits/bitmap_test.go | 386 --- dht/bits/range.go | 65 - dht/bits/range_test.go | 48 - dht/bootstrap.go | 212 -- dht/bootstrap_test.go | 24 - dht/config.go | 76 - dht/contact.go | 118 - dht/contact_test.go | 31 - dht/dht.go | 232 -- dht/dht_announce.go | 214 -- dht/dht_test.go | 181 -- dht/fixtures/TestRoutingTable_Save.golden | 3060 --------------------- dht/message.go | 463 ---- dht/message_test.go | 223 -- dht/node.go | 474 ---- dht/node_finder.go | 338 --- dht/node_test.go | 422 --- dht/routing_table.go | 463 ---- dht/routing_table_test.go | 328 --- dht/rpc.go | 187 -- dht/store.go | 62 - dht/testing.go | 312 --- dht/token_cache.go | 71 - dht/token_manager.go | 78 - go.mod | 45 +- go.sum | 122 + peer/server.go | 4 +- prism/prism.go | 8 +- prism/prism_test.go | 2 +- reflector/blocklist.go | 2 +- reflector/client.go | 2 +- reflector/server.go | 4 +- reflector/server_test.go | 2 +- reflector/stats.go | 4 +- store/dbbacked.go | 2 +- store/file.go | 2 +- store/memory.go | 2 +- store/memory_test.go | 2 +- store/s3.go | 2 +- store/store.go | 2 +- stream/blob.go | 2 +- stream/json.go | 2 +- wallet/network.go | 2 +- wallet/transport.go | 2 +- 52 files changed, 194 insertions(+), 8522 deletions(-) delete mode 100644 dht/bits/bitmap.go delete mode 100644 dht/bits/bitmap_test.go delete mode 100644 dht/bits/range.go delete mode 100644 dht/bits/range_test.go delete mode 100644 dht/bootstrap.go delete mode 100644 dht/bootstrap_test.go delete mode 100644 dht/config.go delete mode 100644 dht/contact.go delete mode 100644 dht/contact_test.go delete mode 100644 dht/dht.go delete mode 100644 dht/dht_announce.go delete mode 100644 dht/dht_test.go delete mode 100644 dht/fixtures/TestRoutingTable_Save.golden delete mode 100644 dht/message.go delete mode 100644 dht/message_test.go delete mode 100644 dht/node.go delete mode 100644 dht/node_finder.go delete mode 100644 dht/node_test.go delete mode 100644 dht/routing_table.go delete mode 100644 dht/routing_table_test.go delete mode 100644 dht/rpc.go delete mode 100644 dht/store.go delete mode 100644 dht/testing.go delete mode 100644 dht/token_cache.go delete mode 100644 dht/token_manager.go diff --git a/cluster/cluster.go b/cluster/cluster.go index 9b7f711..cfa1e04 100644 --- a/cluster/cluster.go +++ b/cluster/cluster.go @@ -6,9 +6,9 @@ import ( "sort" "time" - "github.com/lbryio/lbry.go/crypto" - "github.com/lbryio/lbry.go/errors" - "github.com/lbryio/lbry.go/stop" + "github.com/lbryio/lbry.go/extras/crypto" + "github.com/lbryio/lbry.go/extras/errors" + "github.com/lbryio/lbry.go/extras/stop" "github.com/hashicorp/serf/serf" log "github.com/sirupsen/logrus" diff --git a/cmd/cluster.go b/cmd/cluster.go index 0a15e8b..e2d7632 100644 --- a/cmd/cluster.go +++ b/cmd/cluster.go @@ -6,7 +6,7 @@ import ( "strconv" "syscall" - "github.com/lbryio/lbry.go/crypto" + "github.com/lbryio/lbry.go/extras/crypto" "github.com/lbryio/reflector.go/cluster" log "github.com/sirupsen/logrus" diff --git a/cmd/dht.go b/cmd/dht.go index 28d79a0..81e4247 100644 --- a/cmd/dht.go +++ b/cmd/dht.go @@ -8,8 +8,8 @@ import ( "syscall" "time" - "github.com/lbryio/reflector.go/dht" - "github.com/lbryio/reflector.go/dht/bits" + "github.com/lbryio/lbry.go/dht" + "github.com/lbryio/lbry.go/dht/bits" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" diff --git a/cmd/root.go b/cmd/root.go index aa83e77..e7a0e5d 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -5,9 +5,9 @@ import ( "io/ioutil" "os" - "github.com/lbryio/lbry.go/errors" - "github.com/lbryio/lbry.go/util" - "github.com/lbryio/reflector.go/dht" + "github.com/lbryio/lbry.go/dht" + "github.com/lbryio/lbry.go/extras/errors" + "github.com/lbryio/lbry.go/extras/util" "github.com/lbryio/reflector.go/updater" "github.com/johntdyer/slackrus" diff --git a/cmd/start.go b/cmd/start.go index 58c941a..fbb2123 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -7,10 +7,10 @@ import ( "strings" "syscall" + "github.com/lbryio/lbry.go/dht" + "github.com/lbryio/lbry.go/dht/bits" "github.com/lbryio/reflector.go/cluster" "github.com/lbryio/reflector.go/db" - "github.com/lbryio/reflector.go/dht" - "github.com/lbryio/reflector.go/dht/bits" "github.com/lbryio/reflector.go/peer" "github.com/lbryio/reflector.go/prism" "github.com/lbryio/reflector.go/reflector" diff --git a/cmd/upload.go b/cmd/upload.go index 7506d35..f7df368 100644 --- a/cmd/upload.go +++ b/cmd/upload.go @@ -14,7 +14,7 @@ import ( "github.com/lbryio/reflector.go/peer" "github.com/lbryio/reflector.go/store" - "github.com/lbryio/lbry.go/stop" + "github.com/lbryio/lbry.go/extras/stop" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" diff --git a/db/db.go b/db/db.go index fc4bcb8..559a3d0 100644 --- a/db/db.go +++ b/db/db.go @@ -4,9 +4,9 @@ import ( "context" "database/sql" - "github.com/lbryio/lbry.go/errors" - "github.com/lbryio/lbry.go/querytools" - "github.com/lbryio/reflector.go/dht/bits" + "github.com/lbryio/lbry.go/dht/bits" + "github.com/lbryio/lbry.go/extras/errors" + qt "github.com/lbryio/lbry.go/extras/query" _ "github.com/go-sql-driver/mysql" // blank import for db driver log "github.com/sirupsen/logrus" @@ -33,7 +33,7 @@ type SQL struct { } func logQuery(query string, args ...interface{}) { - s, err := querytools.InterpolateParams(query, args...) + s, err := qt.InterpolateParams(query, args...) if err != nil { log.Errorln(err) } else { @@ -111,7 +111,7 @@ func (s *SQL) HasBlobs(hashes []string) (map[string]bool, error) { log.Debugf("getting hashes[%d:%d] of %d", doneIndex, sliceEnd, len(hashes)) batch := hashes[doneIndex:sliceEnd] - query := "SELECT hash FROM blob_ WHERE is_stored = ? && hash IN (" + querytools.Qs(len(batch)) + ")" + query := "SELECT hash FROM blob_ WHERE is_stored = ? && hash IN (" + qt.Qs(len(batch)) + ")" args := make([]interface{}, len(batch)+1) args[0] = true for i := range batch { diff --git a/dht/bits/bitmap.go b/dht/bits/bitmap.go deleted file mode 100644 index a711ff5..0000000 --- a/dht/bits/bitmap.go +++ /dev/null @@ -1,399 +0,0 @@ -package bits - -import ( - "crypto/rand" - "encoding/hex" - "math/big" - "strconv" - "strings" - - "github.com/lbryio/lbry.go/errors" - - "github.com/lyoshenka/bencode" -) - -// TODO: http://roaringbitmap.org/ - -const ( - NumBytes = 48 // bytes - NumBits = NumBytes * 8 -) - -// Bitmap is a generalized representation of an identifier or data that can be sorted, compared fast. Used by the DHT -// package as a way to handle the unique identifiers of a DHT node. -type Bitmap [NumBytes]byte - -func (b Bitmap) RawString() string { - return string(b[:]) -} - -func (b Bitmap) String() string { - return b.Hex() -} - -// BString returns the bitmap as a string of 0s and 1s -func (b Bitmap) BString() string { - var s string - for _, byte := range b { - s += strconv.FormatInt(int64(byte), 2) - } - return s -} - -// Hex returns a hexadecimal representation of the bitmap. -func (b Bitmap) Hex() string { - return hex.EncodeToString(b[:]) -} - -// HexShort returns a hexadecimal representation of the first 4 bytes. -func (b Bitmap) HexShort() string { - return hex.EncodeToString(b[:4]) -} - -// HexSimplified returns the hexadecimal representation with all leading 0's removed -func (b Bitmap) HexSimplified() string { - simple := strings.TrimLeft(b.Hex(), "0") - if simple == "" { - simple = "0" - } - return simple -} - -func (b Bitmap) Big() *big.Int { - i := new(big.Int) - i.SetString(b.Hex(), 16) - return i -} - -// Cmp compares b and other and returns: -// -// -1 if b < other -// 0 if b == other -// +1 if b > other -// -func (b Bitmap) Cmp(other Bitmap) int { - for k := range b { - if b[k] < other[k] { - return -1 - } else if b[k] > other[k] { - return 1 - } - } - return 0 -} - -// Closer returns true if dist(b,x) < dist(b,y) -func (b Bitmap) Closer(x, y Bitmap) bool { - return x.Xor(b).Cmp(y.Xor(b)) < 0 -} - -// Equals returns true if every byte in bitmap are equal, false otherwise -func (b Bitmap) Equals(other Bitmap) bool { - return b.Cmp(other) == 0 -} - -// Copy returns a duplicate value for the bitmap. -func (b Bitmap) Copy() Bitmap { - var ret Bitmap - copy(ret[:], b[:]) - return ret -} - -// Xor returns a diff bitmap. If they are equal, the returned bitmap will be all 0's. If 100% unique the returned -// bitmap will be all 1's. -func (b Bitmap) Xor(other Bitmap) Bitmap { - var ret Bitmap - for k := range b { - ret[k] = b[k] ^ other[k] - } - return ret -} - -// And returns a comparison bitmap, that for each byte returns the AND true table result -func (b Bitmap) And(other Bitmap) Bitmap { - var ret Bitmap - for k := range b { - ret[k] = b[k] & other[k] - } - return ret -} - -// Or returns a comparison bitmap, that for each byte returns the OR true table result -func (b Bitmap) Or(other Bitmap) Bitmap { - var ret Bitmap - for k := range b { - ret[k] = b[k] | other[k] - } - return ret -} - -// Not returns a complimentary bitmap that is an inverse. So b.NOT.NOT = b -func (b Bitmap) Not() Bitmap { - var ret Bitmap - for k := range b { - ret[k] = ^b[k] - } - return ret -} - -func (b Bitmap) add(other Bitmap) (Bitmap, bool) { - var ret Bitmap - carry := false - for i := NumBits - 1; i >= 0; i-- { - bBit := getBit(b[:], i) - oBit := getBit(other[:], i) - setBit(ret[:], i, bBit != oBit != carry) - carry = (bBit && oBit) || (bBit && carry) || (oBit && carry) - } - return ret, carry -} - -// Add returns a bitmap that treats both bitmaps as numbers and adding them together. Since the size of a bitmap is -// limited, an overflow is possible when adding bitmaps. -func (b Bitmap) Add(other Bitmap) Bitmap { - ret, carry := b.add(other) - if carry { - panic("overflow in bitmap addition. limited to " + strconv.Itoa(NumBits) + " bits.") - } - return ret -} - -// Sub returns a bitmap that treats both bitmaps as numbers and subtracts then via the inverse of the other and adding -// then together a + (-b). Negative bitmaps are not supported so other must be greater than this. -func (b Bitmap) Sub(other Bitmap) Bitmap { - if b.Cmp(other) < 0 { - // ToDo: Why is this not supported? Should it say not implemented? BitMap might have a generic use case outside of dht. - panic("negative bitmaps not supported") - } - complement, _ := other.Not().add(FromShortHexP("1")) - ret, _ := b.add(complement) - return ret -} - -// Get returns the binary bit at the position passed. -func (b Bitmap) Get(n int) bool { - return getBit(b[:], n) -} - -// Set sets the binary bit at the position passed. -func (b Bitmap) Set(n int, one bool) Bitmap { - ret := b.Copy() - setBit(ret[:], n, one) - return ret -} - -// PrefixLen returns the number of leading 0 bits -func (b Bitmap) PrefixLen() int { - for i := range b { - for j := 0; j < 8; j++ { - if (b[i]>>uint8(7-j))&0x1 != 0 { - return i*8 + j - } - } - } - return NumBits -} - -// Prefix returns a copy of b with the first n bits set to 1 (if `one` is true) or 0 (if `one` is false) -// https://stackoverflow.com/a/23192263/182709 -func (b Bitmap) Prefix(n int, one bool) Bitmap { - ret := b.Copy() - -Outer: - for i := range ret { - for j := 0; j < 8; j++ { - if i*8+j < n { - if one { - ret[i] |= 1 << uint(7-j) - } else { - ret[i] &= ^(1 << uint(7-j)) - } - } else { - break Outer - } - } - } - - return ret -} - -// Suffix returns a copy of b with the last n bits set to 1 (if `one` is true) or 0 (if `one` is false) -// https://stackoverflow.com/a/23192263/182709 -func (b Bitmap) Suffix(n int, one bool) Bitmap { - ret := b.Copy() - -Outer: - for i := len(ret) - 1; i >= 0; i-- { - for j := 7; j >= 0; j-- { - if i*8+j >= NumBits-n { - if one { - ret[i] |= 1 << uint(7-j) - } else { - ret[i] &= ^(1 << uint(7-j)) - } - } else { - break Outer - } - } - } - - return ret -} - -// MarshalBencode implements the Marshaller(bencode)/Message interface. -func (b Bitmap) MarshalBencode() ([]byte, error) { - str := string(b[:]) - return bencode.EncodeBytes(str) -} - -// UnmarshalBencode implements the Marshaller(bencode)/Message interface. -func (b *Bitmap) UnmarshalBencode(encoded []byte) error { - var str string - err := bencode.DecodeBytes(encoded, &str) - if err != nil { - return err - } - if len(str) != NumBytes { - return errors.Err("invalid bitmap length") - } - copy(b[:], str) - return nil -} - -// FromBytes returns a bitmap as long as the byte array is of a specific length specified in the parameters. -func FromBytes(data []byte) (Bitmap, error) { - var bmp Bitmap - - if len(data) != len(bmp) { - return bmp, errors.Err("invalid bitmap of length %d", len(data)) - } - - copy(bmp[:], data) - return bmp, nil -} - -// FromBytesP returns a bitmap as long as the byte array is of a specific length specified in the parameters -// otherwise it wil panic. -func FromBytesP(data []byte) Bitmap { - bmp, err := FromBytes(data) - if err != nil { - panic(err) - } - return bmp -} - -//FromString returns a bitmap by converting the string to bytes and creating from bytes as long as the byte array -// is of a specific length specified in the parameters -func FromString(data string) (Bitmap, error) { - return FromBytes([]byte(data)) -} - -//FromStringP returns a bitmap by converting the string to bytes and creating from bytes as long as the byte array -// is of a specific length specified in the parameters otherwise it wil panic. -func FromStringP(data string) Bitmap { - bmp, err := FromString(data) - if err != nil { - panic(err) - } - return bmp -} - -//FromHex returns a bitmap by converting the hex string to bytes and creating from bytes as long as the byte array -// is of a specific length specified in the parameters -func FromHex(hexStr string) (Bitmap, error) { - decoded, err := hex.DecodeString(hexStr) - if err != nil { - return Bitmap{}, errors.Err(err) - } - return FromBytes(decoded) -} - -//FromHexP returns a bitmap by converting the hex string to bytes and creating from bytes as long as the byte array -// is of a specific length specified in the parameters otherwise it wil panic. -func FromHexP(hexStr string) Bitmap { - bmp, err := FromHex(hexStr) - if err != nil { - panic(err) - } - return bmp -} - -//FromShortHex returns a bitmap by converting the hex string to bytes, adding the leading zeros prefix to the -// hex string and creating from bytes as long as the byte array is of a specific length specified in the parameters -func FromShortHex(hexStr string) (Bitmap, error) { - return FromHex(strings.Repeat("0", NumBytes*2-len(hexStr)) + hexStr) -} - -//FromShortHexP returns a bitmap by converting the hex string to bytes, adding the leading zeros prefix to the -// hex string and creating from bytes as long as the byte array is of a specific length specified in the parameters -// otherwise it wil panic. -func FromShortHexP(hexStr string) Bitmap { - bmp, err := FromShortHex(hexStr) - if err != nil { - panic(err) - } - return bmp -} - -func FromBigP(b *big.Int) Bitmap { - return FromShortHexP(b.Text(16)) -} - -// MaxP returns a bitmap with all bits set to 1 -func MaxP() Bitmap { - return FromHexP(strings.Repeat("f", NumBytes*2)) -} - -// Rand generates a cryptographically random bitmap with the confines of the parameters specified. -func Rand() Bitmap { - var id Bitmap - _, err := rand.Read(id[:]) - if err != nil { - panic(err) - } - return id -} - -// RandInRangeP generates a cryptographically random bitmap and while it is greater than the high threshold -// bitmap will subtract the diff between high and low until it is no longer greater that the high. -func RandInRangeP(low, high Bitmap) Bitmap { - diff := high.Sub(low) - r := Rand() - for r.Cmp(diff) > 0 { - r = r.Sub(diff) - } - //ToDo - Adding the low at this point doesn't gurantee it will be within the range. Consider bitmaps as numbers and - // I have a range of 50-100. If get to say 60, and add 50, I would be at 110. Should protect against this? - return r.Add(low) -} - -func getBit(b []byte, n int) bool { - i := n / 8 - j := n % 8 - return b[i]&(1< 0 -} - -func setBit(b []byte, n int, one bool) { - i := n / 8 - j := n % 8 - if one { - b[i] |= 1 << uint(7-j) - } else { - b[i] &= ^(1 << uint(7-j)) - } -} - -// Closest returns the closest bitmap to target. if no bitmaps are provided, target itself is returned -func Closest(target Bitmap, bitmaps ...Bitmap) Bitmap { - if len(bitmaps) == 0 { - return target - } - - var closest *Bitmap - for _, b := range bitmaps { - if closest == nil || target.Closer(b, *closest) { - closest = &b - } - } - return *closest -} diff --git a/dht/bits/bitmap_test.go b/dht/bits/bitmap_test.go deleted file mode 100644 index d709d7a..0000000 --- a/dht/bits/bitmap_test.go +++ /dev/null @@ -1,386 +0,0 @@ -package bits - -import ( - "fmt" - "testing" - - "github.com/lyoshenka/bencode" -) - -func TestBitmap(t *testing.T) { - a := Bitmap{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, - } - b := Bitmap{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 46, - } - c := Bitmap{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, - } - - if !a.Equals(a) { - t.Error("bitmap does not equal itself") - } - if a.Equals(b) { - t.Error("bitmap equals another bitmap with different id") - } - - if !a.Xor(b).Equals(c) { - t.Error(a.Xor(b)) - } - - if c.PrefixLen() != 375 { - t.Error(c.PrefixLen()) - } - - if b.Cmp(a) < 0 { - t.Error("bitmap fails Cmp test") - } - - if a.Closer(c, b) || !a.Closer(b, c) || c.Closer(a, b) || c.Closer(b, c) { - t.Error("bitmap fails Closer test") - } - - id := "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" - if FromHexP(id).Hex() != id { - t.Error(FromHexP(id).Hex()) - } -} - -func TestBitmap_GetBit(t *testing.T) { - tt := []struct { - bit int - expected bool - panic bool - }{ - {bit: 383, expected: false, panic: false}, - {bit: 382, expected: true, panic: false}, - {bit: 381, expected: false, panic: false}, - {bit: 380, expected: true, panic: false}, - } - - b := FromShortHexP("a") - - for _, test := range tt { - actual := getBit(b[:], test.bit) - if test.expected != actual { - t.Errorf("getting bit %d of %s: expected %t, got %t", test.bit, b.HexSimplified(), test.expected, actual) - } - } -} - -func TestBitmap_SetBit(t *testing.T) { - tt := []struct { - hex string - bit int - one bool - expected string - panic bool - }{ - {hex: "0", bit: 383, one: true, expected: "1", panic: false}, - {hex: "0", bit: 382, one: true, expected: "2", panic: false}, - {hex: "0", bit: 381, one: true, expected: "4", panic: false}, - {hex: "0", bit: 385, one: true, expected: "1", panic: true}, - {hex: "0", bit: 384, one: true, expected: "1", panic: true}, - } - - for _, test := range tt { - expected := FromShortHexP(test.expected) - actual := FromShortHexP(test.hex) - if test.panic { - assertPanic(t, fmt.Sprintf("setting bit %d to %t", test.bit, test.one), func() { setBit(actual[:], test.bit, test.one) }) - } else { - setBit(actual[:], test.bit, test.one) - if !expected.Equals(actual) { - t.Errorf("setting bit %d to %t: expected %s, got %s", test.bit, test.one, test.expected, actual.HexSimplified()) - } - - } - } -} - -func TestBitmap_FromHexShort(t *testing.T) { - tt := []struct { - short string - long string - }{ - {short: "", long: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {short: "0", long: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {short: "00000", long: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {short: "9473745bc", long: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000009473745bc"}, - {short: "09473745bc", long: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000009473745bc"}, - {short: "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", - long: "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"}, - } - - for _, test := range tt { - short := FromShortHexP(test.short) - long := FromHexP(test.long) - if !short.Equals(long) { - t.Errorf("short hex %s: expected %s, got %s", test.short, long.Hex(), short.Hex()) - } - } -} - -func TestBitmapMarshal(t *testing.T) { - b := FromStringP("123456789012345678901234567890123456789012345678") - encoded, err := bencode.EncodeBytes(b) - if err != nil { - t.Error(err) - } - - if string(encoded) != "48:123456789012345678901234567890123456789012345678" { - t.Error("encoding does not match expected") - } -} - -func TestBitmapMarshalEmbedded(t *testing.T) { - e := struct { - A string - B Bitmap - C int - }{ - A: "1", - B: FromStringP("222222222222222222222222222222222222222222222222"), - C: 3, - } - - encoded, err := bencode.EncodeBytes(e) - if err != nil { - t.Error(err) - } - - if string(encoded) != "d1:A1:11:B48:2222222222222222222222222222222222222222222222221:Ci3ee" { - t.Error("encoding does not match expected") - } -} - -func TestBitmapMarshalEmbedded2(t *testing.T) { - encoded, err := bencode.EncodeBytes([]interface{}{ - FromStringP("333333333333333333333333333333333333333333333333"), - }) - if err != nil { - t.Error(err) - } - - if string(encoded) != "l48:333333333333333333333333333333333333333333333333e" { - t.Error("encoding does not match expected") - } -} - -func TestBitmap_PrefixLen(t *testing.T) { - tt := []struct { - hex string - len int - }{ - {len: 0, hex: "F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {len: 0, hex: "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {len: 1, hex: "700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {len: 1, hex: "400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {len: 384, hex: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {len: 383, hex: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"}, - {len: 382, hex: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"}, - {len: 382, hex: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"}, - } - - for _, test := range tt { - len := FromHexP(test.hex).PrefixLen() - if len != test.len { - t.Errorf("got prefix len %d; expected %d for %s", len, test.len, test.hex) - } - } -} - -func TestBitmap_Prefix(t *testing.T) { - allOne := FromHexP("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff") - - zerosTT := []struct { - zeros int - expected string - }{ - {zeros: -123, expected: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, - {zeros: 0, expected: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, - {zeros: 1, expected: "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, - {zeros: 69, expected: "000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, - {zeros: 383, expected: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"}, - {zeros: 384, expected: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {zeros: 400, expected: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - } - - for _, test := range zerosTT { - expected := FromHexP(test.expected) - actual := allOne.Prefix(test.zeros, false) - if !actual.Equals(expected) { - t.Errorf("%d zeros: got %s; expected %s", test.zeros, actual.Hex(), expected.Hex()) - } - } - - for i := 0; i < NumBits; i++ { - b := allOne.Prefix(i, false) - if b.PrefixLen() != i { - t.Errorf("got prefix len %d; expected %d for %s", b.PrefixLen(), i, b.Hex()) - } - } - - allZero := FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") - - onesTT := []struct { - ones int - expected string - }{ - {ones: -123, expected: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {ones: 0, expected: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {ones: 1, expected: "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {ones: 69, expected: "fffffffffffffffff8000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {ones: 383, expected: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"}, - {ones: 384, expected: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, - {ones: 400, expected: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, - } - - for _, test := range onesTT { - expected := FromHexP(test.expected) - actual := allZero.Prefix(test.ones, true) - if !actual.Equals(expected) { - t.Errorf("%d ones: got %s; expected %s", test.ones, actual.Hex(), expected.Hex()) - } - } -} - -func TestBitmap_Suffix(t *testing.T) { - allOne := FromHexP("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff") - - zerosTT := []struct { - zeros int - expected string - }{ - {zeros: -123, expected: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, - {zeros: 0, expected: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, - {zeros: 1, expected: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"}, - {zeros: 69, expected: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000"}, - {zeros: 383, expected: "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {zeros: 384, expected: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {zeros: 400, expected: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - } - - for _, test := range zerosTT { - expected := FromHexP(test.expected) - actual := allOne.Suffix(test.zeros, false) - if !actual.Equals(expected) { - t.Errorf("%d zeros: got %s; expected %s", test.zeros, actual.Hex(), expected.Hex()) - } - } - - for i := 0; i < NumBits; i++ { - b := allOne.Prefix(i, false) - if b.PrefixLen() != i { - t.Errorf("got prefix len %d; expected %d for %s", b.PrefixLen(), i, b.Hex()) - } - } - - allZero := FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") - - onesTT := []struct { - ones int - expected string - }{ - {ones: -123, expected: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {ones: 0, expected: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}, - {ones: 1, expected: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"}, - {ones: 69, expected: "0000000000000000000000000000000000000000000000000000000000000000000000000000001fffffffffffffffff"}, - {ones: 383, expected: "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, - {ones: 384, expected: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, - {ones: 400, expected: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}, - } - - for _, test := range onesTT { - expected := FromHexP(test.expected) - actual := allZero.Suffix(test.ones, true) - if !actual.Equals(expected) { - t.Errorf("%d ones: got %s; expected %s", test.ones, actual.Hex(), expected.Hex()) - } - } -} - -func TestBitmap_Add(t *testing.T) { - tt := []struct { - a, b, sum string - panic bool - }{ - {"0", "0", "0", false}, - {"0", "1", "1", false}, - {"1", "0", "1", false}, - {"1", "1", "2", false}, - {"8", "4", "c", false}, - {"1000", "0010", "1010", false}, - {"1111", "1111", "2222", false}, - {"ffff", "1", "10000", false}, - {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", false}, - {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "1", "", true}, - } - - for _, test := range tt { - a := FromShortHexP(test.a) - b := FromShortHexP(test.b) - expected := FromShortHexP(test.sum) - if test.panic { - assertPanic(t, fmt.Sprintf("adding %s and %s", test.a, test.b), func() { a.Add(b) }) - } else { - actual := a.Add(b) - if !expected.Equals(actual) { - t.Errorf("adding %s and %s; expected %s, got %s", test.a, test.b, test.sum, actual.HexSimplified()) - } - } - } -} - -func TestBitmap_Sub(t *testing.T) { - tt := []struct { - a, b, sum string - panic bool - }{ - {"0", "0", "0", false}, - {"1", "0", "1", false}, - {"1", "1", "0", false}, - {"8", "4", "4", false}, - {"f", "9", "6", false}, - {"f", "e", "1", false}, - {"10", "f", "1", false}, - {"2222", "1111", "1111", false}, - {"ffff", "1", "fffe", false}, - {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", false}, - {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0", false}, - {"0", "1", "", true}, - } - - for _, test := range tt { - a := FromShortHexP(test.a) - b := FromShortHexP(test.b) - expected := FromShortHexP(test.sum) - if test.panic { - assertPanic(t, fmt.Sprintf("subtracting %s - %s", test.a, test.b), func() { a.Sub(b) }) - } else { - actual := a.Sub(b) - if !expected.Equals(actual) { - t.Errorf("subtracting %s - %s; expected %s, got %s", test.a, test.b, test.sum, actual.HexSimplified()) - } - } - } -} - -func assertPanic(t *testing.T, text string, f func()) { - defer func() { - if r := recover(); r == nil { - t.Errorf("%s: did not panic as expected", text) - } - }() - f() -} diff --git a/dht/bits/range.go b/dht/bits/range.go deleted file mode 100644 index 0e2a34a..0000000 --- a/dht/bits/range.go +++ /dev/null @@ -1,65 +0,0 @@ -package bits - -import ( - "math/big" - - "github.com/lbryio/errors.go" -) - -// Range has a start and end -type Range struct { - Start Bitmap - End Bitmap -} - -func MaxRange() Range { - return Range{ - Start: Bitmap{}, - End: MaxP(), - } -} - -// IntervalP divides the range into `num` intervals and returns the `n`th one -// intervals are approximately the same size, but may not be exact because of rounding issues -// the first interval always starts at the beginning of the range, and the last interval always ends at the end -func (r Range) IntervalP(n, num int) Range { - if num < 1 || n < 1 || n > num { - panic(errors.Err("invalid interval %d of %d", n, num)) - } - - start := r.intervalStart(n, num) - end := r.End.Big() - if n < num { - end = r.intervalStart(n+1, num) - end.Sub(end, big.NewInt(1)) - } - - return Range{FromBigP(start), FromBigP(end)} -} - -func (r Range) intervalStart(n, num int) *big.Int { - // formula: - // size = (end - start) / num - // rem = (end - start) % num - // intervalStart = rangeStart + (size * n-1) + ((rem * n-1) % num) - - size := new(big.Int) - rem := new(big.Int) - size.Sub(r.End.Big(), r.Start.Big()).DivMod(size, big.NewInt(int64(num)), rem) - - size.Mul(size, big.NewInt(int64(n-1))) - rem.Mul(rem, big.NewInt(int64(n-1))).Mod(rem, big.NewInt(int64(num))) - - start := r.Start.Big() - start.Add(start, size).Add(start, rem) - - return start -} - -func (r Range) IntervalSize() *big.Int { - return (&big.Int{}).Sub(r.End.Big(), r.Start.Big()) -} - -func (r Range) Contains(b Bitmap) bool { - return r.Start.Cmp(b) <= 0 && r.End.Cmp(b) >= 0 -} diff --git a/dht/bits/range_test.go b/dht/bits/range_test.go deleted file mode 100644 index 79d31eb..0000000 --- a/dht/bits/range_test.go +++ /dev/null @@ -1,48 +0,0 @@ -package bits - -import ( - "math/big" - "testing" -) - -func TestMaxRange(t *testing.T) { - start := FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") - end := FromHexP("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff") - r := MaxRange() - - if !r.Start.Equals(start) { - t.Error("max range does not start at the beginning") - } - if !r.End.Equals(end) { - t.Error("max range does not end at the end") - } -} - -func TestRange_IntervalP(t *testing.T) { - max := MaxRange() - - numIntervals := 97 - expectedAvg := (&big.Int{}).Div(max.IntervalSize(), big.NewInt(int64(numIntervals))) - maxDiff := big.NewInt(int64(numIntervals)) - - var lastEnd Bitmap - - for i := 1; i <= numIntervals; i++ { - ival := max.IntervalP(i, numIntervals) - if i == 1 && !ival.Start.Equals(max.Start) { - t.Error("first interval does not start at 0") - } - if i == numIntervals && !ival.End.Equals(max.End) { - t.Error("last interval does not end at max") - } - if i > 1 && !ival.Start.Equals(lastEnd.Add(FromShortHexP("1"))) { - t.Errorf("interval %d of %d: last end was %s, this start is %s", i, numIntervals, lastEnd.Hex(), ival.Start.Hex()) - } - - if ival.IntervalSize().Cmp((&big.Int{}).Add(expectedAvg, maxDiff)) > 0 || ival.IntervalSize().Cmp((&big.Int{}).Sub(expectedAvg, maxDiff)) < 0 { - t.Errorf("interval %d of %d: interval size is outside the normal range", i, numIntervals) - } - - lastEnd = ival.End - } -} diff --git a/dht/bootstrap.go b/dht/bootstrap.go deleted file mode 100644 index dd649a7..0000000 --- a/dht/bootstrap.go +++ /dev/null @@ -1,212 +0,0 @@ -package dht - -import ( - "math/rand" - "net" - "sync" - "time" - - "github.com/lbryio/reflector.go/dht/bits" -) - -const ( - bootstrapDefaultRefreshDuration = 15 * time.Minute -) - -// BootstrapNode is a configured node setup for testing. -type BootstrapNode struct { - Node - - initialPingInterval time.Duration - checkInterval time.Duration - - nlock *sync.RWMutex - peers map[bits.Bitmap]*peer - nodeIDs []bits.Bitmap // necessary for efficient random ID selection -} - -// NewBootstrapNode returns a BootstrapNode pointer. -func NewBootstrapNode(id bits.Bitmap, initialPingInterval, rePingInterval time.Duration) *BootstrapNode { - b := &BootstrapNode{ - Node: *NewNode(id), - - initialPingInterval: initialPingInterval, - checkInterval: rePingInterval, - - nlock: &sync.RWMutex{}, - peers: make(map[bits.Bitmap]*peer), - nodeIDs: make([]bits.Bitmap, 0), - } - - b.requestHandler = b.handleRequest - - return b -} - -// Add manually adds a contact -func (b *BootstrapNode) Add(c Contact) { - b.upsert(c) -} - -// Connect connects to the given connection and starts any background threads necessary -func (b *BootstrapNode) Connect(conn UDPConn) error { - err := b.Node.Connect(conn) - if err != nil { - return err - } - - log.Infof("[%s] bootstrap: node connected", b.id.HexShort()) - - go func() { - t := time.NewTicker(b.checkInterval / 5) - for { - select { - case <-t.C: - b.check() - case <-b.grp.Ch(): - return - } - } - }() - - return nil -} - -// upsert adds the contact to the list, or updates the lastPinged time -func (b *BootstrapNode) upsert(c Contact) { - b.nlock.Lock() - defer b.nlock.Unlock() - - if peer, exists := b.peers[c.ID]; exists { - log.Debugf("[%s] bootstrap: touching contact %s", b.id.HexShort(), peer.Contact.ID.HexShort()) - peer.Touch() - return - } - - log.Debugf("[%s] bootstrap: adding new contact %s", b.id.HexShort(), c.ID.HexShort()) - b.peers[c.ID] = &peer{c, b.id.Xor(c.ID), time.Now(), 0} - b.nodeIDs = append(b.nodeIDs, c.ID) -} - -// remove removes the contact from the list -func (b *BootstrapNode) remove(c Contact) { - b.nlock.Lock() - defer b.nlock.Unlock() - - _, exists := b.peers[c.ID] - if !exists { - return - } - - log.Debugf("[%s] bootstrap: removing contact %s", b.id.HexShort(), c.ID.HexShort()) - delete(b.peers, c.ID) - for i := range b.nodeIDs { - if b.nodeIDs[i].Equals(c.ID) { - b.nodeIDs = append(b.nodeIDs[:i], b.nodeIDs[i+1:]...) - break - } - } -} - -// get returns up to `limit` random contacts from the list -func (b *BootstrapNode) get(limit int) []Contact { - b.nlock.RLock() - defer b.nlock.RUnlock() - - if len(b.peers) < limit { - limit = len(b.peers) - } - - ret := make([]Contact, limit) - for i, k := range randKeys(len(b.nodeIDs))[:limit] { - ret[i] = b.peers[b.nodeIDs[k]].Contact - } - - return ret -} - -// ping pings a node. if the node responds, it is added to the list. otherwise, it is removed -func (b *BootstrapNode) ping(c Contact) { - log.Debugf("[%s] bootstrap: pinging %s", b.id.HexShort(), c.ID.HexShort()) - b.grp.Add(1) - defer b.grp.Done() - - resCh := b.SendAsync(c, Request{Method: pingMethod}) - - var res *Response - - select { - case res = <-resCh: - case <-b.grp.Ch(): - return - } - - if res != nil && res.Data == pingSuccessResponse { - b.upsert(c) - } else { - b.remove(c) - } -} - -func (b *BootstrapNode) check() { - b.nlock.RLock() - defer b.nlock.RUnlock() - - for i := range b.peers { - if !b.peers[i].ActiveInLast(b.checkInterval) { - go b.ping(b.peers[i].Contact) - } - } -} - -// handleRequest handles the requests received from udp. -func (b *BootstrapNode) handleRequest(addr *net.UDPAddr, request Request) { - switch request.Method { - case pingMethod: - err := b.sendMessage(addr, Response{ID: request.ID, NodeID: b.id, Data: pingSuccessResponse}) - if err != nil { - log.Error("error sending response message - ", err) - } - case findNodeMethod: - if request.Arg == nil { - log.Errorln("request is missing arg") - return - } - - err := b.sendMessage(addr, Response{ - ID: request.ID, - NodeID: b.id, - Contacts: b.get(bucketSize), - }) - if err != nil { - log.Error("error sending 'findnodemethod' response message - ", err) - } - } - - go func() { - b.nlock.RLock() - _, exists := b.peers[request.NodeID] - b.nlock.RUnlock() - if !exists { - log.Debugf("[%s] bootstrap: queuing %s to ping", b.id.HexShort(), request.NodeID.HexShort()) - <-time.After(b.initialPingInterval) - b.nlock.RLock() - _, exists = b.peers[request.NodeID] - b.nlock.RUnlock() - if !exists { - b.ping(Contact{ID: request.NodeID, IP: addr.IP, Port: addr.Port}) - } - } - }() -} - -func randKeys(max int) []int { - keys := make([]int, max) - for k := range keys { - keys[k] = k - } - rand.Shuffle(max, func(i, j int) { - keys[i], keys[j] = keys[j], keys[i] - }) - return keys -} diff --git a/dht/bootstrap_test.go b/dht/bootstrap_test.go deleted file mode 100644 index 4997467..0000000 --- a/dht/bootstrap_test.go +++ /dev/null @@ -1,24 +0,0 @@ -package dht - -import ( - "net" - "testing" - - "github.com/lbryio/reflector.go/dht/bits" -) - -func TestBootstrapPing(t *testing.T) { - b := NewBootstrapNode(bits.Rand(), 10, bootstrapDefaultRefreshDuration) - - listener, err := net.ListenPacket(Network, "127.0.0.1:54320") - if err != nil { - panic(err) - } - - err = b.Connect(listener.(*net.UDPConn)) - if err != nil { - t.Error(err) - } - - b.Shutdown() -} diff --git a/dht/config.go b/dht/config.go deleted file mode 100644 index 21a1900..0000000 --- a/dht/config.go +++ /dev/null @@ -1,76 +0,0 @@ -package dht - -import ( - "strconv" - "time" - - "github.com/lbryio/reflector.go/dht/bits" - peerproto "github.com/lbryio/reflector.go/peer" -) - -const ( - Network = "udp4" - DefaultPort = 4444 - - DefaultAnnounceRate = 10 // send at most this many announces per second - DefaultReannounceTime = 50 * time.Minute // should be a bit less than hash expiration time - - // TODO: all these constants should be defaults, and should be used to set values in the standard Config. then the code should use values in the config - // TODO: alternatively, have a global Config for constants. at least that way tests can modify the values - alpha = 3 // this is the constant alpha in the spec - bucketSize = 8 // this is the constant k in the spec - nodeIDLength = bits.NumBytes // bytes. this is the constant B in the spec - messageIDLength = 20 // bytes. - - udpRetry = 1 - udpTimeout = 5 * time.Second - udpMaxMessageLength = 4096 // bytes. I think our longest message is ~676 bytes, so I rounded up to 1024 - // scratch that. a findValue could return more than K results if a lot of nodes are storing that value, so we need more buffer - - maxPeerFails = 3 // after this many failures, a peer is considered bad and will be removed from the routing table - //tExpire = 60 * time.Minute // the time after which a key/value pair expires; this is a time-to-live (TTL) from the original publication date - tRefresh = 1 * time.Hour // the time after which an otherwise unaccessed bucket must be refreshed - //tReplicate = 1 * time.Hour // the interval between Kademlia replication events, when a node is required to publish its entire database - //tNodeRefresh = 15 * time.Minute // the time after which a good node becomes questionable if it has not messaged us - - compactNodeInfoLength = nodeIDLength + 6 // nodeID + 4 for IP + 2 for port - - tokenSecretRotationInterval = 5 * time.Minute // how often the token-generating secret is rotated -) - -// Config represents the configure of dht. -type Config struct { - // this node's address. format is `ip:port` - Address string - // the seed nodes through which we can join in dht network - SeedNodes []string - // the hex-encoded node id for this node. if string is empty, a random id will be generated - NodeID string - // print the state of the dht every X time - PrintState time.Duration - // the port that clients can use to download blobs using the LBRY peer protocol - PeerProtocolPort int - // if nonzero, an RPC server will listen to requests on this port and respond to them - RPCPort int - // the time after which the original publisher must reannounce a key/value pair - ReannounceTime time.Duration - // send at most this many announces per second - AnnounceRate int - // channel that will receive notifications about announcements - AnnounceNotificationCh chan announceNotification -} - -// NewStandardConfig returns a Config pointer with default values. -func NewStandardConfig() *Config { - return &Config{ - Address: "0.0.0.0:" + strconv.Itoa(DefaultPort), - SeedNodes: []string{ - "lbrynet1.lbry.io:4444", - "lbrynet2.lbry.io:4444", - "lbrynet3.lbry.io:4444", - }, - PeerProtocolPort: peerproto.DefaultPort, - ReannounceTime: DefaultReannounceTime, - AnnounceRate: DefaultAnnounceRate, - } -} diff --git a/dht/contact.go b/dht/contact.go deleted file mode 100644 index 724e51f..0000000 --- a/dht/contact.go +++ /dev/null @@ -1,118 +0,0 @@ -package dht - -import ( - "bytes" - "net" - "sort" - "strconv" - - "github.com/lbryio/lbry.go/errors" - "github.com/lbryio/reflector.go/dht/bits" - - "github.com/lyoshenka/bencode" -) - -// TODO: if routing table is ever empty (aka the node is isolated), it should re-bootstrap - -// Contact contains information for contacting another node on the network -type Contact struct { - ID bits.Bitmap - IP net.IP - Port int // the udp port used for the dht - PeerPort int // the tcp port a peer can be contacted on for blob requests -} - -// Equals returns true if two contacts are the same. -func (c Contact) Equals(other Contact, checkID bool) bool { - return c.IP.Equal(other.IP) && c.Port == other.Port && (!checkID || c.ID == other.ID) -} - -// Addr returns the address of the contact. -func (c Contact) Addr() *net.UDPAddr { - return &net.UDPAddr{IP: c.IP, Port: c.Port} -} - -// String returns a short string representation of the contact -func (c Contact) String() string { - str := c.ID.HexShort() + "@" + c.Addr().String() - if c.PeerPort != 0 { - str += "(" + strconv.Itoa(c.PeerPort) + ")" - } - return str -} - -// MarshalCompact returns a compact byteslice representation of the contact -// NOTE: The compact representation always uses the tcp PeerPort, not the udp Port. This is dumb, but that's how the python daemon does it -func (c Contact) MarshalCompact() ([]byte, error) { - if c.IP.To4() == nil { - return nil, errors.Err("ip not set") - } - if c.PeerPort < 0 || c.PeerPort > 65535 { - return nil, errors.Err("invalid port") - } - - var buf bytes.Buffer - buf.Write(c.IP.To4()) - buf.WriteByte(byte(c.PeerPort >> 8)) - buf.WriteByte(byte(c.PeerPort)) - buf.Write(c.ID[:]) - - if buf.Len() != compactNodeInfoLength { - return nil, errors.Err("i dont know how this happened") - } - - return buf.Bytes(), nil -} - -// UnmarshalCompact unmarshals the compact byteslice representation of a contact. -// NOTE: The compact representation always uses the tcp PeerPort, not the udp Port. This is dumb, but that's how the python daemon does it -func (c *Contact) UnmarshalCompact(b []byte) error { - if len(b) != compactNodeInfoLength { - return errors.Err("invalid compact length") - } - c.IP = net.IPv4(b[0], b[1], b[2], b[3]).To4() - c.PeerPort = int(uint16(b[5]) | uint16(b[4])<<8) - c.ID = bits.FromBytesP(b[6:]) - return nil -} - -// MarshalBencode returns the serialized byte slice representation of a contact. -func (c Contact) MarshalBencode() ([]byte, error) { - return bencode.EncodeBytes([]interface{}{c.ID, c.IP.String(), c.Port}) -} - -// UnmarshalBencode unmarshals the serialized byte slice into the appropriate fields of the contact. -func (c *Contact) UnmarshalBencode(b []byte) error { - var raw []bencode.RawMessage - err := bencode.DecodeBytes(b, &raw) - if err != nil { - return err - } - - if len(raw) != 3 { - return errors.Err("contact must have 3 elements; got %d", len(raw)) - } - - err = bencode.DecodeBytes(raw[0], &c.ID) - if err != nil { - return err - } - - var ipStr string - err = bencode.DecodeBytes(raw[1], &ipStr) - if err != nil { - return err - } - c.IP = net.ParseIP(ipStr).To4() - if c.IP == nil { - return errors.Err("invalid IP") - } - - return bencode.DecodeBytes(raw[2], &c.Port) -} - -func sortByDistance(contacts []Contact, target bits.Bitmap) { - sort.Slice(contacts, func(i, j int) bool { - return contacts[i].ID.Xor(target).Cmp(contacts[j].ID.Xor(target)) < 0 - }) -} diff --git a/dht/contact_test.go b/dht/contact_test.go deleted file mode 100644 index cfe5abc..0000000 --- a/dht/contact_test.go +++ /dev/null @@ -1,31 +0,0 @@ -package dht - -import ( - "net" - "reflect" - "testing" - - "github.com/lbryio/reflector.go/dht/bits" -) - -func TestCompactEncoding(t *testing.T) { - c := Contact{ - ID: bits.FromHexP("1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f41"), - IP: net.ParseIP("1.2.3.4"), - PeerPort: int(55<<8 + 66), - } - - var compact []byte - compact, err := c.MarshalCompact() - if err != nil { - t.Fatal(err) - } - - if len(compact) != compactNodeInfoLength { - t.Fatalf("got length of %d; expected %d", len(compact), compactNodeInfoLength) - } - - if !reflect.DeepEqual(compact, append([]byte{1, 2, 3, 4, 55, 66}, c.ID[:]...)) { - t.Errorf("compact bytes not encoded correctly") - } -} diff --git a/dht/dht.go b/dht/dht.go deleted file mode 100644 index 9681730..0000000 --- a/dht/dht.go +++ /dev/null @@ -1,232 +0,0 @@ -package dht - -import ( - "fmt" - "net" - "strings" - "time" - - "github.com/lbryio/reflector.go/dht/bits" - - "github.com/lbryio/lbry.go/errors" - "github.com/lbryio/lbry.go/stop" - - "github.com/sirupsen/logrus" - "github.com/spf13/cast" -) - -var log *logrus.Logger - -func UseLogger(l *logrus.Logger) { - log = l -} - -func init() { - log = logrus.StandardLogger() - //log.SetFormatter(&log.TextFormatter{ForceColors: true}) - //log.SetLevel(log.DebugLevel) -} - -// DHT represents a DHT node. -type DHT struct { - // config - conf *Config - // local contact - contact Contact - // node - node *Node - // stopGroup to shut down DHT - grp *stop.Group - // channel is closed when DHT joins network - joined chan struct{} - // cache for store tokens - tokenCache *tokenCache - // hashes that need to be put into the announce queue or removed from the queue - announceAddRemove chan queueEdit -} - -// New returns a DHT pointer. If config is nil, then config will be set to the default config. -func New(config *Config) *DHT { - if config == nil { - config = NewStandardConfig() - } - - d := &DHT{ - conf: config, - grp: stop.New(), - joined: make(chan struct{}), - announceAddRemove: make(chan queueEdit), - } - return d -} - -func (dht *DHT) connect(conn UDPConn) error { - contact, err := getContact(dht.conf.NodeID, dht.conf.Address) - if err != nil { - return err - } - - dht.contact = contact - dht.node = NewNode(contact.ID) - dht.tokenCache = newTokenCache(dht.node, tokenSecretRotationInterval) - - return dht.node.Connect(conn) -} - -// Start starts the dht -func (dht *DHT) Start() error { - listener, err := net.ListenPacket(Network, dht.conf.Address) - if err != nil { - return errors.Err(err) - } - conn := listener.(*net.UDPConn) - - err = dht.connect(conn) - if err != nil { - return err - } - - dht.join() - log.Infof("[%s] DHT ready on %s (%d nodes found during join)", - dht.node.id.HexShort(), dht.contact.Addr().String(), dht.node.rt.Count()) - - dht.grp.Add(1) - go func() { - dht.runAnnouncer() - dht.grp.Done() - }() - - if dht.conf.RPCPort > 0 { - dht.grp.Add(1) - go func() { - dht.runRPCServer(dht.conf.RPCPort) - dht.grp.Done() - }() - } - - return nil -} - -// join makes current node join the dht network. -func (dht *DHT) join() { - defer close(dht.joined) // if anyone's waiting for join to finish, they'll know its done - - log.Infof("[%s] joining DHT network", dht.node.id.HexShort()) - - // ping nodes, which gets their real node IDs and adds them to the routing table - atLeastOneNodeResponded := false - for _, addr := range dht.conf.SeedNodes { - err := dht.Ping(addr) - if err != nil { - log.Error(errors.Prefix(fmt.Sprintf("[%s] join", dht.node.id.HexShort()), err)) - } else { - atLeastOneNodeResponded = true - } - } - - if !atLeastOneNodeResponded { - log.Errorf("[%s] join: no nodes responded to initial ping", dht.node.id.HexShort()) - return - } - - // now call iterativeFind on yourself - _, _, err := FindContacts(dht.node, dht.node.id, false, dht.grp.Child()) - if err != nil { - log.Errorf("[%s] join: %s", dht.node.id.HexShort(), err.Error()) - } - - // TODO: after joining, refresh all buckets further away than our closest neighbor - // http://xlattice.sourceforge.net/components/protocol/kademlia/specs.html#join -} - -// WaitUntilJoined blocks until the node joins the network. -func (dht *DHT) WaitUntilJoined() { - if dht.joined == nil { - panic("dht not initialized") - } - <-dht.joined -} - -// Shutdown shuts down the dht -func (dht *DHT) Shutdown() { - log.Debugf("[%s] DHT shutting down", dht.node.id.HexShort()) - dht.grp.StopAndWait() - dht.node.Shutdown() - log.Debugf("[%s] DHT stopped", dht.node.id.HexShort()) -} - -// Ping pings a given address, creates a temporary contact for sending a message, and returns an error if communication -// fails. -func (dht *DHT) Ping(addr string) error { - raddr, err := net.ResolveUDPAddr(Network, addr) - if err != nil { - return err - } - - tmpNode := Contact{ID: bits.Rand(), IP: raddr.IP, Port: raddr.Port} - res := dht.node.Send(tmpNode, Request{Method: pingMethod}, SendOptions{skipIDCheck: true}) - if res == nil { - return errors.Err("no response from node %s", addr) - } - - return nil -} - -// Get returns the list of nodes that have the blob for the given hash -func (dht *DHT) Get(hash bits.Bitmap) ([]Contact, error) { - contacts, found, err := FindContacts(dht.node, hash, true, dht.grp.Child()) - if err != nil { - return nil, err - } - - if found { - return contacts, nil - } - return nil, nil -} - -// PrintState prints the current state of the DHT including address, nr outstanding transactions, stored hashes as well -// as current bucket information. -func (dht *DHT) PrintState() { - log.Printf("DHT node %s at %s", dht.contact.String(), time.Now().Format(time.RFC822Z)) - log.Printf("Outstanding transactions: %d", dht.node.CountActiveTransactions()) - log.Printf("Stored hashes: %d", dht.node.store.CountStoredHashes()) - log.Printf("Buckets:") - for _, line := range strings.Split(dht.node.rt.BucketInfo(), "\n") { - log.Println(line) - } -} - -func (dht DHT) ID() bits.Bitmap { - return dht.contact.ID -} - -func getContact(nodeID, addr string) (Contact, error) { - var c Contact - if nodeID == "" { - c.ID = bits.Rand() - } else { - c.ID = bits.FromHexP(nodeID) - } - - ip, port, err := net.SplitHostPort(addr) - if err != nil { - return c, errors.Err(err) - } else if ip == "" { - return c, errors.Err("address does not contain an IP") - } else if port == "" { - return c, errors.Err("address does not contain a port") - } - - c.IP = net.ParseIP(ip) - if c.IP == nil { - return c, errors.Err("invalid ip") - } - - c.Port, err = cast.ToIntE(port) - if err != nil { - return c, errors.Err(err) - } - - return c, nil -} diff --git a/dht/dht_announce.go b/dht/dht_announce.go deleted file mode 100644 index 645c180..0000000 --- a/dht/dht_announce.go +++ /dev/null @@ -1,214 +0,0 @@ -package dht - -import ( - "container/ring" - "context" - "math" - "sync" - "time" - - "github.com/lbryio/lbry.go/errors" - "github.com/lbryio/reflector.go/dht/bits" - - "golang.org/x/time/rate" -) - -type queueEdit struct { - hash bits.Bitmap - add bool -} - -const ( - announceStarted = "started" - announceFinishd = "finished" -) - -type announceNotification struct { - hash bits.Bitmap - action string - err error -} - -// Add adds the hash to the list of hashes this node is announcing -func (dht *DHT) Add(hash bits.Bitmap) { - dht.announceAddRemove <- queueEdit{hash: hash, add: true} -} - -// Remove removes the hash from the list of hashes this node is announcing -func (dht *DHT) Remove(hash bits.Bitmap) { - dht.announceAddRemove <- queueEdit{hash: hash, add: false} -} - -func (dht *DHT) runAnnouncer() { - type hashAndTime struct { - hash bits.Bitmap - lastAnnounce time.Time - } - - var queue *ring.Ring - hashes := make(map[bits.Bitmap]*ring.Ring) - - var announceNextHash <-chan time.Time - timer := time.NewTimer(math.MaxInt64) - timer.Stop() - - limitCh := make(chan time.Time) - dht.grp.Add(1) - go func() { - defer dht.grp.Done() - limiter := rate.NewLimiter(rate.Limit(dht.conf.AnnounceRate), dht.conf.AnnounceRate) - for { - err := limiter.Wait(context.Background()) // TODO: should use grp.ctx somehow? so when grp is closed, wait returns - if err != nil { - log.Error(errors.Prefix("rate limiter", err)) - continue - } - select { - case limitCh <- time.Now(): - case <-dht.grp.Ch(): - return - } - } - }() - - maintenance := time.NewTicker(1 * time.Minute) - - // TODO: work to space hash announces out so they aren't bunched up around the reannounce time. track time since last announce. if its been more than the ideal time (reannounce time / numhashes), start announcing hashes early - - for { - select { - case <-dht.grp.Ch(): - return - - case <-maintenance.C: - maxAnnounce := dht.conf.AnnounceRate * int(dht.conf.ReannounceTime.Seconds()) - if len(hashes) > maxAnnounce { - // TODO: send this to slack - log.Warnf("DHT has %d hashes, but can only announce %d hashes in the %s reannounce window. Raise the announce rate or spawn more nodes.", - len(hashes), maxAnnounce, dht.conf.ReannounceTime.String()) - } - - case change := <-dht.announceAddRemove: - if change.add { - if _, exists := hashes[change.hash]; exists { - continue - } - - r := ring.New(1) - r.Value = hashAndTime{hash: change.hash} - if queue != nil { - queue.Prev().Link(r) - } - queue = r - hashes[change.hash] = r - announceNextHash = limitCh // announce next hash ASAP - } else { - r, exists := hashes[change.hash] - if !exists { - continue - } - - delete(hashes, change.hash) - - if len(hashes) == 0 { - queue = ring.New(0) - announceNextHash = nil // no hashes to announce, wait indefinitely - } else { - if r == queue { - queue = queue.Next() // don't lose our pointer - } - r.Prev().Link(r.Next()) - } - } - - case <-announceNextHash: - dht.grp.Add(1) - ht := queue.Value.(hashAndTime) - - if !ht.lastAnnounce.IsZero() { - nextAnnounce := ht.lastAnnounce.Add(dht.conf.ReannounceTime) - if nextAnnounce.After(time.Now()) { - timer.Reset(time.Until(nextAnnounce)) - announceNextHash = timer.C // wait until next hash should be announced - continue - } - } - - if dht.conf.AnnounceNotificationCh != nil { - dht.conf.AnnounceNotificationCh <- announceNotification{ - hash: ht.hash, - action: announceStarted, - } - } - - go func(hash bits.Bitmap) { - defer dht.grp.Done() - err := dht.announce(hash) - if err != nil { - log.Error(errors.Prefix("announce", err)) - } - - if dht.conf.AnnounceNotificationCh != nil { - dht.conf.AnnounceNotificationCh <- announceNotification{ - hash: ht.hash, - action: announceFinishd, - err: err, - } - } - }(ht.hash) - - queue.Value = hashAndTime{hash: ht.hash, lastAnnounce: time.Now()} - queue = queue.Next() - announceNextHash = limitCh // announce next hash ASAP - } - } -} - -// Announce announces to the DHT that this node has the blob for the given hash -func (dht *DHT) announce(hash bits.Bitmap) error { - contacts, _, err := FindContacts(dht.node, hash, false, dht.grp.Child()) - if err != nil { - return err - } - - // self-store if we found less than K contacts, or we're closer than the farthest contact - if len(contacts) < bucketSize { - contacts = append(contacts, dht.contact) - } else if hash.Closer(dht.node.id, contacts[bucketSize-1].ID) { - contacts[bucketSize-1] = dht.contact - } - - wg := &sync.WaitGroup{} - for _, c := range contacts { - wg.Add(1) - go func(c Contact) { - dht.store(hash, c) - wg.Done() - }(c) - } - - wg.Wait() - - return nil -} - -func (dht *DHT) store(hash bits.Bitmap, c Contact) { - if dht.contact.ID == c.ID { - // self-store - c.PeerPort = dht.conf.PeerProtocolPort - dht.node.Store(hash, c) - return - } - - dht.node.SendAsync(c, Request{ - Method: storeMethod, - StoreArgs: &storeArgs{ - BlobHash: hash, - Value: storeArgsValue{ - Token: dht.tokenCache.Get(c, hash, dht.grp.Ch()), - LbryID: dht.contact.ID, - Port: dht.conf.PeerProtocolPort, - }, - }, - }) -} diff --git a/dht/dht_test.go b/dht/dht_test.go deleted file mode 100644 index 6079314..0000000 --- a/dht/dht_test.go +++ /dev/null @@ -1,181 +0,0 @@ -package dht - -import ( - "net" - "sync" - "testing" - "time" - - "github.com/lbryio/reflector.go/dht/bits" -) - -func TestNodeFinder_FindNodes(t *testing.T) { - if testing.Short() { - t.Skip("skipping slow nodeFinder test") - } - - bs, dhts := TestingCreateNetwork(t, 3, true, false) - defer func() { - for i := range dhts { - dhts[i].Shutdown() - } - bs.Shutdown() - }() - - contacts, found, err := FindContacts(dhts[2].node, bits.Rand(), false, nil) - if err != nil { - t.Fatal(err) - } - - if found { - t.Fatal("something was found, but it should not have been") - } - - if len(contacts) != 3 { - t.Errorf("expected 3 node, found %d", len(contacts)) - } - - foundBootstrap := false - foundOne := false - foundTwo := false - - for _, n := range contacts { - if n.ID.Equals(bs.id) { - foundBootstrap = true - } - if n.ID.Equals(dhts[0].node.id) { - foundOne = true - } - if n.ID.Equals(dhts[1].node.id) { - foundTwo = true - } - } - - if !foundBootstrap { - t.Errorf("did not find bootstrap node %s", bs.id.Hex()) - } - if !foundOne { - t.Errorf("did not find first node %s", dhts[0].node.id.Hex()) - } - if !foundTwo { - t.Errorf("did not find second node %s", dhts[1].node.id.Hex()) - } -} - -func TestNodeFinder_FindNodes_NoBootstrap(t *testing.T) { - _, dhts := TestingCreateNetwork(t, 3, false, false) - defer func() { - for i := range dhts { - dhts[i].Shutdown() - } - }() - - _, _, err := FindContacts(dhts[2].node, bits.Rand(), false, nil) - if err == nil { - t.Fatal("contact finder should have errored saying that there are no contacts in the routing table") - } -} - -func TestNodeFinder_FindValue(t *testing.T) { - if testing.Short() { - t.Skip("skipping slow nodeFinder test") - } - - bs, dhts := TestingCreateNetwork(t, 3, true, false) - defer func() { - for i := range dhts { - dhts[i].Shutdown() - } - bs.Shutdown() - }() - - blobHashToFind := bits.Rand() - nodeToFind := Contact{ID: bits.Rand(), IP: net.IPv4(1, 2, 3, 4), Port: 5678} - dhts[0].node.store.Upsert(blobHashToFind, nodeToFind) - - contacts, found, err := FindContacts(dhts[2].node, blobHashToFind, true, nil) - if err != nil { - t.Fatal(err) - } - - if !found { - t.Fatal("node was not found") - } - - if len(contacts) != 1 { - t.Fatalf("expected one node, found %d", len(contacts)) - } - - if !contacts[0].ID.Equals(nodeToFind.ID) { - t.Fatalf("found node id %s, expected %s", contacts[0].ID.Hex(), nodeToFind.ID.Hex()) - } -} - -func TestDHT_LargeDHT(t *testing.T) { - if testing.Short() { - t.Skip("skipping large DHT test") - } - - nodes := 100 - bs, dhts := TestingCreateNetwork(t, nodes, true, true) - defer func() { - for _, d := range dhts { - go d.Shutdown() - } - bs.Shutdown() - time.Sleep(1 * time.Second) - }() - - wg := &sync.WaitGroup{} - ids := make([]bits.Bitmap, nodes) - for i := range ids { - ids[i] = bits.Rand() - wg.Add(1) - go func(index int) { - defer wg.Done() - err := dhts[index].announce(ids[index]) - if err != nil { - t.Error("error announcing random bitmap - ", err) - } - }(i) - } - wg.Wait() - - // check that each node is in at learst 1 other routing table - rtCounts := make(map[bits.Bitmap]int) - for _, d := range dhts { - for _, d2 := range dhts { - if d.node.id.Equals(d2.node.id) { - continue - } - c := d2.node.rt.GetClosest(d.node.id, 1) - if len(c) > 1 { - t.Error("rt returned more than one node when only one requested") - } else if len(c) == 1 && c[0].ID.Equals(d.node.id) { - rtCounts[d.node.id]++ - } - } - } - - for k, v := range rtCounts { - if v == 0 { - t.Errorf("%s was not in any routing tables", k.HexShort()) - } - } - - // check that each ID is stored by at least 3 nodes - storeCounts := make(map[bits.Bitmap]int) - for _, d := range dhts { - for _, id := range ids { - if len(d.node.store.Get(id)) > 0 { - storeCounts[id]++ - } - } - } - - for k, v := range storeCounts { - if v == 0 { - t.Errorf("%s was not stored by any nodes", k.HexShort()) - } - } -} diff --git a/dht/fixtures/TestRoutingTable_Save.golden b/dht/fixtures/TestRoutingTable_Save.golden deleted file mode 100644 index 624b2ec..0000000 --- a/dht/fixtures/TestRoutingTable_Save.golden +++ /dev/null @@ -1,3060 +0,0 @@ -{ - "id": "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f41", - "contacts": [ - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f40-1.2.3.0-1", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f42-1.2.3.0-9", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f43-1.2.3.1-10", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f44-1.2.3.0-17", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f45-1.2.3.1-18", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f46-1.2.3.2-19", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f47-1.2.3.3-20", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f48-1.2.3.0-25", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f49-1.2.3.1-26", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f4a-1.2.3.2-27", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f4b-1.2.3.3-28", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f4c-1.2.3.4-29", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f4d-1.2.3.5-30", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f4e-1.2.3.6-31", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f4f-1.2.3.7-32", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f50-1.2.3.0-33", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f51-1.2.3.1-34", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f52-1.2.3.2-35", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f53-1.2.3.3-36", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f54-1.2.3.4-37", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f55-1.2.3.5-38", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f56-1.2.3.6-39", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f57-1.2.3.7-40", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f60-1.2.3.0-41", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f61-1.2.3.1-42", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f62-1.2.3.2-43", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f63-1.2.3.3-44", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f64-1.2.3.4-45", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f65-1.2.3.5-46", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f66-1.2.3.6-47", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f67-1.2.3.7-48", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f00-1.2.3.0-49", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f01-1.2.3.1-50", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f02-1.2.3.2-51", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f03-1.2.3.3-52", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f04-1.2.3.4-53", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f05-1.2.3.5-54", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f06-1.2.3.6-55", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f07-1.2.3.7-56", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f80-1.2.3.0-57", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f81-1.2.3.1-58", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f82-1.2.3.2-59", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f83-1.2.3.3-60", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f84-1.2.3.4-61", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f85-1.2.3.5-62", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f86-1.2.3.6-63", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f87-1.2.3.7-64", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277e00-1.2.3.0-65", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277e01-1.2.3.1-66", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277e02-1.2.3.2-67", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277e03-1.2.3.3-68", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277e04-1.2.3.4-69", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277e05-1.2.3.5-70", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277e06-1.2.3.6-71", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277e07-1.2.3.7-72", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277c00-1.2.3.0-73", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277c01-1.2.3.1-74", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277c02-1.2.3.2-75", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277c03-1.2.3.3-76", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277c04-1.2.3.4-77", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277c05-1.2.3.5-78", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277c06-1.2.3.6-79", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277c07-1.2.3.7-80", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277800-1.2.3.0-81", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277801-1.2.3.1-82", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277802-1.2.3.2-83", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277803-1.2.3.3-84", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277804-1.2.3.4-85", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277805-1.2.3.5-86", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277806-1.2.3.6-87", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277807-1.2.3.7-88", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277000-1.2.3.0-89", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277001-1.2.3.1-90", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277002-1.2.3.2-91", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277003-1.2.3.3-92", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277004-1.2.3.4-93", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277005-1.2.3.5-94", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277006-1.2.3.6-95", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277007-1.2.3.7-96", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db276000-1.2.3.0-97", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db276001-1.2.3.1-98", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db276002-1.2.3.2-99", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db276003-1.2.3.3-100", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db276004-1.2.3.4-101", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db276005-1.2.3.5-102", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db276006-1.2.3.6-103", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db276007-1.2.3.7-104", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db274000-1.2.3.0-105", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db274001-1.2.3.1-106", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db274002-1.2.3.2-107", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db274003-1.2.3.3-108", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db274004-1.2.3.4-109", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db274005-1.2.3.5-110", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db274006-1.2.3.6-111", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db274007-1.2.3.7-112", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db270000-1.2.3.0-113", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db270001-1.2.3.1-114", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db270002-1.2.3.2-115", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db270003-1.2.3.3-116", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db270004-1.2.3.4-117", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db270005-1.2.3.5-118", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db270006-1.2.3.6-119", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db270007-1.2.3.7-120", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db278000-1.2.3.0-121", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db278001-1.2.3.1-122", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db278002-1.2.3.2-123", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db278003-1.2.3.3-124", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db278004-1.2.3.4-125", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db278005-1.2.3.5-126", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db278006-1.2.3.6-127", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db278007-1.2.3.7-128", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db260000-1.2.3.0-129", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db260001-1.2.3.1-130", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db260002-1.2.3.2-131", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db260003-1.2.3.3-132", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db260004-1.2.3.4-133", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db260005-1.2.3.5-134", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db260006-1.2.3.6-135", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db260007-1.2.3.7-136", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db240000-1.2.3.0-137", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db240001-1.2.3.1-138", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db240002-1.2.3.2-139", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db240003-1.2.3.3-140", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db240004-1.2.3.4-141", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db240005-1.2.3.5-142", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db240006-1.2.3.6-143", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db240007-1.2.3.7-144", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db200000-1.2.3.0-145", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db200001-1.2.3.1-146", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db200002-1.2.3.2-147", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db200003-1.2.3.3-148", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db200004-1.2.3.4-149", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db200005-1.2.3.5-150", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db200006-1.2.3.6-151", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db200007-1.2.3.7-152", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db280000-1.2.3.0-153", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db280001-1.2.3.1-154", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db280002-1.2.3.2-155", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db280003-1.2.3.3-156", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db280004-1.2.3.4-157", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db280005-1.2.3.5-158", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db280006-1.2.3.6-159", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db280007-1.2.3.7-160", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db300000-1.2.3.0-161", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db300001-1.2.3.1-162", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db300002-1.2.3.2-163", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db300003-1.2.3.3-164", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db300004-1.2.3.4-165", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db300005-1.2.3.5-166", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db300006-1.2.3.6-167", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db300007-1.2.3.7-168", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db000000-1.2.3.0-169", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db000001-1.2.3.1-170", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db000002-1.2.3.2-171", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db000003-1.2.3.3-172", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db000004-1.2.3.4-173", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db000005-1.2.3.5-174", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db000006-1.2.3.6-175", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db000007-1.2.3.7-176", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db400000-1.2.3.0-177", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db400001-1.2.3.1-178", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db400002-1.2.3.2-179", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db400003-1.2.3.3-180", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db400004-1.2.3.4-181", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db400005-1.2.3.5-182", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db400006-1.2.3.6-183", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db400007-1.2.3.7-184", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db800000-1.2.3.0-185", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db800001-1.2.3.1-186", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db800002-1.2.3.2-187", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db800003-1.2.3.3-188", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db800004-1.2.3.4-189", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db800005-1.2.3.5-190", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db800006-1.2.3.6-191", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db800007-1.2.3.7-192", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5da000000-1.2.3.0-193", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5da000001-1.2.3.1-194", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5da000002-1.2.3.2-195", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5da000003-1.2.3.3-196", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5da000004-1.2.3.4-197", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5da000005-1.2.3.5-198", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5da000006-1.2.3.6-199", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5da000007-1.2.3.7-200", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5d8000000-1.2.3.0-201", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5d8000001-1.2.3.1-202", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5d8000002-1.2.3.2-203", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5d8000003-1.2.3.3-204", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5d8000004-1.2.3.4-205", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5d8000005-1.2.3.5-206", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5d8000006-1.2.3.6-207", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5d8000007-1.2.3.7-208", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5dc000000-1.2.3.0-209", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5dc000001-1.2.3.1-210", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5dc000002-1.2.3.2-211", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5dc000003-1.2.3.3-212", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5dc000004-1.2.3.4-213", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5dc000005-1.2.3.5-214", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5dc000006-1.2.3.6-215", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5dc000007-1.2.3.7-216", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5d0000000-1.2.3.0-217", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5d0000001-1.2.3.1-218", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5d0000002-1.2.3.2-219", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5d0000003-1.2.3.3-220", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5d0000004-1.2.3.4-221", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5d0000005-1.2.3.5-222", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5d0000006-1.2.3.6-223", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5d0000007-1.2.3.7-224", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5c0000000-1.2.3.0-225", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5c0000001-1.2.3.1-226", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5c0000002-1.2.3.2-227", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5c0000003-1.2.3.3-228", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5c0000004-1.2.3.4-229", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5c0000005-1.2.3.5-230", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5c0000006-1.2.3.6-231", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5c0000007-1.2.3.7-232", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5e0000000-1.2.3.0-233", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5e0000001-1.2.3.1-234", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5e0000002-1.2.3.2-235", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5e0000003-1.2.3.3-236", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5e0000004-1.2.3.4-237", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5e0000005-1.2.3.5-238", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5e0000006-1.2.3.6-239", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5e0000007-1.2.3.7-240", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b580000000-1.2.3.0-241", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b580000001-1.2.3.1-242", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b580000002-1.2.3.2-243", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b580000003-1.2.3.3-244", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b580000004-1.2.3.4-245", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b580000005-1.2.3.5-246", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b580000006-1.2.3.6-247", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b580000007-1.2.3.7-248", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b500000000-1.2.3.0-249", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b500000001-1.2.3.1-250", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b500000002-1.2.3.2-251", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b500000003-1.2.3.3-252", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b500000004-1.2.3.4-253", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b500000005-1.2.3.5-254", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b500000006-1.2.3.6-255", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b500000007-1.2.3.7-256", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b400000000-1.2.3.0-257", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b400000001-1.2.3.1-258", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b400000002-1.2.3.2-259", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b400000003-1.2.3.3-260", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b400000004-1.2.3.4-261", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b400000005-1.2.3.5-262", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b400000006-1.2.3.6-263", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b400000007-1.2.3.7-264", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b600000000-1.2.3.0-265", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b600000001-1.2.3.1-266", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b600000002-1.2.3.2-267", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b600000003-1.2.3.3-268", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b600000004-1.2.3.4-269", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b600000005-1.2.3.5-270", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b600000006-1.2.3.6-271", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b600000007-1.2.3.7-272", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b000000000-1.2.3.0-273", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b000000001-1.2.3.1-274", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b000000002-1.2.3.2-275", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b000000003-1.2.3.3-276", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b000000004-1.2.3.4-277", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b000000005-1.2.3.5-278", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b000000006-1.2.3.6-279", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b000000007-1.2.3.7-280", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b800000000-1.2.3.0-281", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b800000001-1.2.3.1-282", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b800000002-1.2.3.2-283", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b800000003-1.2.3.3-284", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b800000004-1.2.3.4-285", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b800000005-1.2.3.5-286", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b800000006-1.2.3.6-287", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b800000007-1.2.3.7-288", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8a000000000-1.2.3.0-289", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8a000000001-1.2.3.1-290", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8a000000002-1.2.3.2-291", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8a000000003-1.2.3.3-292", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8a000000004-1.2.3.4-293", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8a000000005-1.2.3.5-294", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8a000000006-1.2.3.6-295", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8a000000007-1.2.3.7-296", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f88000000000-1.2.3.0-297", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f88000000001-1.2.3.1-298", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f88000000002-1.2.3.2-299", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f88000000003-1.2.3.3-300", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f88000000004-1.2.3.4-301", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f88000000005-1.2.3.5-302", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f88000000006-1.2.3.6-303", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f88000000007-1.2.3.7-304", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8c000000000-1.2.3.0-305", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8c000000001-1.2.3.1-306", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8c000000002-1.2.3.2-307", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8c000000003-1.2.3.3-308", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8c000000004-1.2.3.4-309", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8c000000005-1.2.3.5-310", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8c000000006-1.2.3.6-311", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8c000000007-1.2.3.7-312", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f80000000000-1.2.3.0-313", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f80000000001-1.2.3.1-314", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f80000000002-1.2.3.2-315", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f80000000003-1.2.3.3-316", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f80000000004-1.2.3.4-317", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f80000000005-1.2.3.5-318", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f80000000006-1.2.3.6-319", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f80000000007-1.2.3.7-320", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f90000000000-1.2.3.0-321", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f90000000001-1.2.3.1-322", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f90000000002-1.2.3.2-323", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f90000000003-1.2.3.3-324", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f90000000004-1.2.3.4-325", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f90000000005-1.2.3.5-326", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f90000000006-1.2.3.6-327", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f90000000007-1.2.3.7-328", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8fa0000000000-1.2.3.0-329", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8fa0000000001-1.2.3.1-330", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8fa0000000002-1.2.3.2-331", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8fa0000000003-1.2.3.3-332", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8fa0000000004-1.2.3.4-333", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8fa0000000005-1.2.3.5-334", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8fa0000000006-1.2.3.6-335", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8fa0000000007-1.2.3.7-336", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8fc0000000000-1.2.3.0-337", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8fc0000000001-1.2.3.1-338", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8fc0000000002-1.2.3.2-339", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8fc0000000003-1.2.3.3-340", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8fc0000000004-1.2.3.4-341", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8fc0000000005-1.2.3.5-342", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8fc0000000006-1.2.3.6-343", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8fc0000000007-1.2.3.7-344", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f00000000000-1.2.3.0-345", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f00000000001-1.2.3.1-346", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f00000000002-1.2.3.2-347", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f00000000003-1.2.3.3-348", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f00000000004-1.2.3.4-349", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f00000000005-1.2.3.5-350", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f00000000006-1.2.3.6-351", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f00000000007-1.2.3.7-352", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8e00000000000-1.2.3.0-353", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8e00000000001-1.2.3.1-354", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8e00000000002-1.2.3.2-355", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8e00000000003-1.2.3.3-356", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8e00000000004-1.2.3.4-357", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8e00000000005-1.2.3.5-358", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8e00000000006-1.2.3.6-359", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8e00000000007-1.2.3.7-360", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8c00000000000-1.2.3.0-361", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8c00000000001-1.2.3.1-362", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8c00000000002-1.2.3.2-363", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8c00000000003-1.2.3.3-364", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8c00000000004-1.2.3.4-365", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8c00000000005-1.2.3.5-366", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8c00000000006-1.2.3.6-367", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8c00000000007-1.2.3.7-368", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8800000000000-1.2.3.0-369", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8800000000001-1.2.3.1-370", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8800000000002-1.2.3.2-371", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8800000000003-1.2.3.3-372", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8800000000004-1.2.3.4-373", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8800000000005-1.2.3.5-374", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8800000000006-1.2.3.6-375", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8800000000007-1.2.3.7-376", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8000000000000-1.2.3.0-377", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8000000000001-1.2.3.1-378", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8000000000002-1.2.3.2-379", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8000000000003-1.2.3.3-380", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8000000000004-1.2.3.4-381", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8000000000005-1.2.3.5-382", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8000000000006-1.2.3.6-383", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8000000000007-1.2.3.7-384", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d9000000000000-1.2.3.0-385", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d9000000000001-1.2.3.1-386", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d9000000000002-1.2.3.2-387", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d9000000000003-1.2.3.3-388", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d9000000000004-1.2.3.4-389", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d9000000000005-1.2.3.5-390", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d9000000000006-1.2.3.6-391", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d9000000000007-1.2.3.7-392", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07da000000000000-1.2.3.0-393", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07da000000000001-1.2.3.1-394", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07da000000000002-1.2.3.2-395", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07da000000000003-1.2.3.3-396", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07da000000000004-1.2.3.4-397", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07da000000000005-1.2.3.5-398", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07da000000000006-1.2.3.6-399", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07da000000000007-1.2.3.7-400", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07dc000000000000-1.2.3.0-401", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07dc000000000001-1.2.3.1-402", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07dc000000000002-1.2.3.2-403", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07dc000000000003-1.2.3.3-404", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07dc000000000004-1.2.3.4-405", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07dc000000000005-1.2.3.5-406", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07dc000000000006-1.2.3.6-407", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07dc000000000007-1.2.3.7-408", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d0000000000000-1.2.3.0-409", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d0000000000001-1.2.3.1-410", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d0000000000002-1.2.3.2-411", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d0000000000003-1.2.3.3-412", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d0000000000004-1.2.3.4-413", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d0000000000005-1.2.3.5-414", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d0000000000006-1.2.3.6-415", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d0000000000007-1.2.3.7-416", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07c0000000000000-1.2.3.0-417", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07c0000000000001-1.2.3.1-418", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07c0000000000002-1.2.3.2-419", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07c0000000000003-1.2.3.3-420", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07c0000000000004-1.2.3.4-421", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07c0000000000005-1.2.3.5-422", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07c0000000000006-1.2.3.6-423", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07c0000000000007-1.2.3.7-424", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07e0000000000000-1.2.3.0-425", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07e0000000000001-1.2.3.1-426", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07e0000000000002-1.2.3.2-427", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07e0000000000003-1.2.3.3-428", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07e0000000000004-1.2.3.4-429", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07e0000000000005-1.2.3.5-430", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07e0000000000006-1.2.3.6-431", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07e0000000000007-1.2.3.7-432", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0780000000000000-1.2.3.0-433", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0780000000000001-1.2.3.1-434", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0780000000000002-1.2.3.2-435", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0780000000000003-1.2.3.3-436", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0780000000000004-1.2.3.4-437", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0780000000000005-1.2.3.5-438", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0780000000000006-1.2.3.6-439", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0780000000000007-1.2.3.7-440", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0700000000000000-1.2.3.0-441", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0700000000000001-1.2.3.1-442", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0700000000000002-1.2.3.2-443", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0700000000000003-1.2.3.3-444", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0700000000000004-1.2.3.4-445", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0700000000000005-1.2.3.5-446", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0700000000000006-1.2.3.6-447", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0700000000000007-1.2.3.7-448", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0600000000000000-1.2.3.0-449", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0600000000000001-1.2.3.1-450", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0600000000000002-1.2.3.2-451", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0600000000000003-1.2.3.3-452", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0600000000000004-1.2.3.4-453", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0600000000000005-1.2.3.5-454", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0600000000000006-1.2.3.6-455", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0600000000000007-1.2.3.7-456", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0400000000000000-1.2.3.0-457", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0400000000000001-1.2.3.1-458", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0400000000000002-1.2.3.2-459", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0400000000000003-1.2.3.3-460", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0400000000000004-1.2.3.4-461", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0400000000000005-1.2.3.5-462", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0400000000000006-1.2.3.6-463", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0400000000000007-1.2.3.7-464", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0000000000000000-1.2.3.0-465", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0000000000000001-1.2.3.1-466", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0000000000000002-1.2.3.2-467", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0000000000000003-1.2.3.3-468", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0000000000000004-1.2.3.4-469", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0000000000000005-1.2.3.5-470", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0000000000000006-1.2.3.6-471", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0000000000000007-1.2.3.7-472", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0800000000000000-1.2.3.0-473", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0800000000000001-1.2.3.1-474", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0800000000000002-1.2.3.2-475", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0800000000000003-1.2.3.3-476", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0800000000000004-1.2.3.4-477", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0800000000000005-1.2.3.5-478", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0800000000000006-1.2.3.6-479", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab0800000000000007-1.2.3.7-480", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab1000000000000000-1.2.3.0-481", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab1000000000000001-1.2.3.1-482", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab1000000000000002-1.2.3.2-483", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab1000000000000003-1.2.3.3-484", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab1000000000000004-1.2.3.4-485", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab1000000000000005-1.2.3.5-486", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab1000000000000006-1.2.3.6-487", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab1000000000000007-1.2.3.7-488", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab2000000000000000-1.2.3.0-489", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab2000000000000001-1.2.3.1-490", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab2000000000000002-1.2.3.2-491", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab2000000000000003-1.2.3.3-492", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab2000000000000004-1.2.3.4-493", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab2000000000000005-1.2.3.5-494", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab2000000000000006-1.2.3.6-495", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab2000000000000007-1.2.3.7-496", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab4000000000000000-1.2.3.0-497", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab4000000000000001-1.2.3.1-498", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab4000000000000002-1.2.3.2-499", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab4000000000000003-1.2.3.3-500", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab4000000000000004-1.2.3.4-501", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab4000000000000005-1.2.3.5-502", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab4000000000000006-1.2.3.6-503", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab4000000000000007-1.2.3.7-504", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab8000000000000000-1.2.3.0-505", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab8000000000000001-1.2.3.1-506", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab8000000000000002-1.2.3.2-507", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab8000000000000003-1.2.3.3-508", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab8000000000000004-1.2.3.4-509", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab8000000000000005-1.2.3.5-510", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab8000000000000006-1.2.3.6-511", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab8000000000000007-1.2.3.7-512", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582daa0000000000000000-1.2.3.0-513", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582daa0000000000000001-1.2.3.1-514", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582daa0000000000000002-1.2.3.2-515", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582daa0000000000000003-1.2.3.3-516", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582daa0000000000000004-1.2.3.4-517", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582daa0000000000000005-1.2.3.5-518", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582daa0000000000000006-1.2.3.6-519", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582daa0000000000000007-1.2.3.7-520", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582da80000000000000000-1.2.3.0-521", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582da80000000000000001-1.2.3.1-522", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582da80000000000000002-1.2.3.2-523", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582da80000000000000003-1.2.3.3-524", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582da80000000000000004-1.2.3.4-525", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582da80000000000000005-1.2.3.5-526", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582da80000000000000006-1.2.3.6-527", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582da80000000000000007-1.2.3.7-528", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dac0000000000000000-1.2.3.0-529", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dac0000000000000001-1.2.3.1-530", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dac0000000000000002-1.2.3.2-531", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dac0000000000000003-1.2.3.3-532", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dac0000000000000004-1.2.3.4-533", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dac0000000000000005-1.2.3.5-534", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dac0000000000000006-1.2.3.6-535", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dac0000000000000007-1.2.3.7-536", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582da00000000000000000-1.2.3.0-537", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582da00000000000000001-1.2.3.1-538", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582da00000000000000002-1.2.3.2-539", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582da00000000000000003-1.2.3.3-540", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582da00000000000000004-1.2.3.4-541", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582da00000000000000005-1.2.3.5-542", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582da00000000000000006-1.2.3.6-543", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582da00000000000000007-1.2.3.7-544", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582db00000000000000000-1.2.3.0-545", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582db00000000000000001-1.2.3.1-546", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582db00000000000000002-1.2.3.2-547", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582db00000000000000003-1.2.3.3-548", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582db00000000000000004-1.2.3.4-549", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582db00000000000000005-1.2.3.5-550", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582db00000000000000006-1.2.3.6-551", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582db00000000000000007-1.2.3.7-552", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582d800000000000000000-1.2.3.0-553", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582d800000000000000001-1.2.3.1-554", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582d800000000000000002-1.2.3.2-555", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582d800000000000000003-1.2.3.3-556", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582d800000000000000004-1.2.3.4-557", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582d800000000000000005-1.2.3.5-558", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582d800000000000000006-1.2.3.6-559", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582d800000000000000007-1.2.3.7-560", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dc00000000000000000-1.2.3.0-561", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dc00000000000000001-1.2.3.1-562", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dc00000000000000002-1.2.3.2-563", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dc00000000000000003-1.2.3.3-564", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dc00000000000000004-1.2.3.4-565", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dc00000000000000005-1.2.3.5-566", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dc00000000000000006-1.2.3.6-567", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dc00000000000000007-1.2.3.7-568", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582d000000000000000000-1.2.3.0-569", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582d000000000000000001-1.2.3.1-570", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582d000000000000000002-1.2.3.2-571", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582d000000000000000003-1.2.3.3-572", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582d000000000000000004-1.2.3.4-573", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582d000000000000000005-1.2.3.5-574", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582d000000000000000006-1.2.3.6-575", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582d000000000000000007-1.2.3.7-576", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582c000000000000000000-1.2.3.0-577", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582c000000000000000001-1.2.3.1-578", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582c000000000000000002-1.2.3.2-579", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582c000000000000000003-1.2.3.3-580", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582c000000000000000004-1.2.3.4-581", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582c000000000000000005-1.2.3.5-582", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582c000000000000000006-1.2.3.6-583", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582c000000000000000007-1.2.3.7-584", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582e000000000000000000-1.2.3.0-585", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582e000000000000000001-1.2.3.1-586", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582e000000000000000002-1.2.3.2-587", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582e000000000000000003-1.2.3.3-588", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582e000000000000000004-1.2.3.4-589", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582e000000000000000005-1.2.3.5-590", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582e000000000000000006-1.2.3.6-591", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582e000000000000000007-1.2.3.7-592", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15828000000000000000000-1.2.3.0-593", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15828000000000000000001-1.2.3.1-594", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15828000000000000000002-1.2.3.2-595", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15828000000000000000003-1.2.3.3-596", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15828000000000000000004-1.2.3.4-597", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15828000000000000000005-1.2.3.5-598", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15828000000000000000006-1.2.3.6-599", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15828000000000000000007-1.2.3.7-600", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15820000000000000000000-1.2.3.0-601", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15820000000000000000001-1.2.3.1-602", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15820000000000000000002-1.2.3.2-603", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15820000000000000000003-1.2.3.3-604", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15820000000000000000004-1.2.3.4-605", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15820000000000000000005-1.2.3.5-606", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15820000000000000000006-1.2.3.6-607", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15820000000000000000007-1.2.3.7-608", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15830000000000000000000-1.2.3.0-609", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15830000000000000000001-1.2.3.1-610", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15830000000000000000002-1.2.3.2-611", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15830000000000000000003-1.2.3.3-612", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15830000000000000000004-1.2.3.4-613", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15830000000000000000005-1.2.3.5-614", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15830000000000000000006-1.2.3.6-615", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15830000000000000000007-1.2.3.7-616", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15800000000000000000000-1.2.3.0-617", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15800000000000000000001-1.2.3.1-618", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15800000000000000000002-1.2.3.2-619", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15800000000000000000003-1.2.3.3-620", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15800000000000000000004-1.2.3.4-621", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15800000000000000000005-1.2.3.5-622", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15800000000000000000006-1.2.3.6-623", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15800000000000000000007-1.2.3.7-624", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15840000000000000000000-1.2.3.0-625", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15840000000000000000001-1.2.3.1-626", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15840000000000000000002-1.2.3.2-627", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15840000000000000000003-1.2.3.3-628", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15840000000000000000004-1.2.3.4-629", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15840000000000000000005-1.2.3.5-630", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15840000000000000000006-1.2.3.6-631", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15840000000000000000007-1.2.3.7-632", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15880000000000000000000-1.2.3.0-633", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15880000000000000000001-1.2.3.1-634", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15880000000000000000002-1.2.3.2-635", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15880000000000000000003-1.2.3.3-636", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15880000000000000000004-1.2.3.4-637", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15880000000000000000005-1.2.3.5-638", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15880000000000000000006-1.2.3.6-639", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15880000000000000000007-1.2.3.7-640", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15900000000000000000000-1.2.3.0-641", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15900000000000000000001-1.2.3.1-642", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15900000000000000000002-1.2.3.2-643", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15900000000000000000003-1.2.3.3-644", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15900000000000000000004-1.2.3.4-645", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15900000000000000000005-1.2.3.5-646", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15900000000000000000006-1.2.3.6-647", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15900000000000000000007-1.2.3.7-648", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15a00000000000000000000-1.2.3.0-649", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15a00000000000000000001-1.2.3.1-650", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15a00000000000000000002-1.2.3.2-651", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15a00000000000000000003-1.2.3.3-652", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15a00000000000000000004-1.2.3.4-653", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15a00000000000000000005-1.2.3.5-654", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15a00000000000000000006-1.2.3.6-655", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15a00000000000000000007-1.2.3.7-656", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15c00000000000000000000-1.2.3.0-657", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15c00000000000000000001-1.2.3.1-658", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15c00000000000000000002-1.2.3.2-659", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15c00000000000000000003-1.2.3.3-660", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15c00000000000000000004-1.2.3.4-661", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15c00000000000000000005-1.2.3.5-662", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15c00000000000000000006-1.2.3.6-663", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15c00000000000000000007-1.2.3.7-664", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15000000000000000000000-1.2.3.0-665", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15000000000000000000001-1.2.3.1-666", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15000000000000000000002-1.2.3.2-667", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15000000000000000000003-1.2.3.3-668", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15000000000000000000004-1.2.3.4-669", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15000000000000000000005-1.2.3.5-670", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15000000000000000000006-1.2.3.6-671", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f15000000000000000000007-1.2.3.7-672", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f14000000000000000000000-1.2.3.0-673", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f14000000000000000000001-1.2.3.1-674", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f14000000000000000000002-1.2.3.2-675", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f14000000000000000000003-1.2.3.3-676", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f14000000000000000000004-1.2.3.4-677", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f14000000000000000000005-1.2.3.5-678", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f14000000000000000000006-1.2.3.6-679", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f14000000000000000000007-1.2.3.7-680", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f16000000000000000000000-1.2.3.0-681", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f16000000000000000000001-1.2.3.1-682", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f16000000000000000000002-1.2.3.2-683", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f16000000000000000000003-1.2.3.3-684", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f16000000000000000000004-1.2.3.4-685", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f16000000000000000000005-1.2.3.5-686", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f16000000000000000000006-1.2.3.6-687", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f16000000000000000000007-1.2.3.7-688", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f10000000000000000000000-1.2.3.0-689", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f10000000000000000000001-1.2.3.1-690", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f10000000000000000000002-1.2.3.2-691", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f10000000000000000000003-1.2.3.3-692", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f10000000000000000000004-1.2.3.4-693", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f10000000000000000000005-1.2.3.5-694", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f10000000000000000000006-1.2.3.6-695", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f10000000000000000000007-1.2.3.7-696", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f18000000000000000000000-1.2.3.0-697", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f18000000000000000000001-1.2.3.1-698", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f18000000000000000000002-1.2.3.2-699", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f18000000000000000000003-1.2.3.3-700", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f18000000000000000000004-1.2.3.4-701", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f18000000000000000000005-1.2.3.5-702", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f18000000000000000000006-1.2.3.6-703", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f18000000000000000000007-1.2.3.7-704", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f00000000000000000000000-1.2.3.0-705", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f00000000000000000000001-1.2.3.1-706", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f00000000000000000000002-1.2.3.2-707", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f00000000000000000000003-1.2.3.3-708", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f00000000000000000000004-1.2.3.4-709", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f00000000000000000000005-1.2.3.5-710", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f00000000000000000000006-1.2.3.6-711", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f00000000000000000000007-1.2.3.7-712", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f20000000000000000000000-1.2.3.0-713", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f20000000000000000000001-1.2.3.1-714", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f20000000000000000000002-1.2.3.2-715", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f20000000000000000000003-1.2.3.3-716", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f20000000000000000000004-1.2.3.4-717", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f20000000000000000000005-1.2.3.5-718", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f20000000000000000000006-1.2.3.6-719", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f20000000000000000000007-1.2.3.7-720", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f40000000000000000000000-1.2.3.0-721", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f40000000000000000000001-1.2.3.1-722", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f40000000000000000000002-1.2.3.2-723", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f40000000000000000000003-1.2.3.3-724", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f40000000000000000000004-1.2.3.4-725", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f40000000000000000000005-1.2.3.5-726", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f40000000000000000000006-1.2.3.6-727", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f40000000000000000000007-1.2.3.7-728", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f80000000000000000000000-1.2.3.0-729", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f80000000000000000000001-1.2.3.1-730", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f80000000000000000000002-1.2.3.2-731", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f80000000000000000000003-1.2.3.3-732", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f80000000000000000000004-1.2.3.4-733", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f80000000000000000000005-1.2.3.5-734", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f80000000000000000000006-1.2.3.6-735", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f80000000000000000000007-1.2.3.7-736", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1e00000000000000000000000-1.2.3.0-737", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1e00000000000000000000001-1.2.3.1-738", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1e00000000000000000000002-1.2.3.2-739", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1e00000000000000000000003-1.2.3.3-740", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1e00000000000000000000004-1.2.3.4-741", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1e00000000000000000000005-1.2.3.5-742", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1e00000000000000000000006-1.2.3.6-743", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1e00000000000000000000007-1.2.3.7-744", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1c00000000000000000000000-1.2.3.0-745", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1c00000000000000000000001-1.2.3.1-746", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1c00000000000000000000002-1.2.3.2-747", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1c00000000000000000000003-1.2.3.3-748", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1c00000000000000000000004-1.2.3.4-749", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1c00000000000000000000005-1.2.3.5-750", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1c00000000000000000000006-1.2.3.6-751", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1c00000000000000000000007-1.2.3.7-752", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1800000000000000000000000-1.2.3.0-753", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1800000000000000000000001-1.2.3.1-754", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1800000000000000000000002-1.2.3.2-755", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1800000000000000000000003-1.2.3.3-756", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1800000000000000000000004-1.2.3.4-757", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1800000000000000000000005-1.2.3.5-758", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1800000000000000000000006-1.2.3.6-759", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1800000000000000000000007-1.2.3.7-760", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1000000000000000000000000-1.2.3.0-761", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1000000000000000000000001-1.2.3.1-762", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1000000000000000000000002-1.2.3.2-763", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1000000000000000000000003-1.2.3.3-764", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1000000000000000000000004-1.2.3.4-765", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1000000000000000000000005-1.2.3.5-766", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1000000000000000000000006-1.2.3.6-767", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1000000000000000000000007-1.2.3.7-768", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa0000000000000000000000000-1.2.3.0-769", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa0000000000000000000000001-1.2.3.1-770", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa0000000000000000000000002-1.2.3.2-771", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa0000000000000000000000003-1.2.3.3-772", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa0000000000000000000000004-1.2.3.4-773", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa0000000000000000000000005-1.2.3.5-774", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa0000000000000000000000006-1.2.3.6-775", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa0000000000000000000000007-1.2.3.7-776", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa2000000000000000000000000-1.2.3.0-777", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa2000000000000000000000001-1.2.3.1-778", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa2000000000000000000000002-1.2.3.2-779", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa2000000000000000000000003-1.2.3.3-780", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa2000000000000000000000004-1.2.3.4-781", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa2000000000000000000000005-1.2.3.5-782", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa2000000000000000000000006-1.2.3.6-783", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa2000000000000000000000007-1.2.3.7-784", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa4000000000000000000000000-1.2.3.0-785", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa4000000000000000000000001-1.2.3.1-786", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa4000000000000000000000002-1.2.3.2-787", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa4000000000000000000000003-1.2.3.3-788", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa4000000000000000000000004-1.2.3.4-789", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa4000000000000000000000005-1.2.3.5-790", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa4000000000000000000000006-1.2.3.6-791", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa4000000000000000000000007-1.2.3.7-792", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa8000000000000000000000000-1.2.3.0-793", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa8000000000000000000000001-1.2.3.1-794", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa8000000000000000000000002-1.2.3.2-795", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa8000000000000000000000003-1.2.3.3-796", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa8000000000000000000000004-1.2.3.4-797", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa8000000000000000000000005-1.2.3.5-798", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa8000000000000000000000006-1.2.3.6-799", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa8000000000000000000000007-1.2.3.7-800", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72ab0000000000000000000000000-1.2.3.0-801", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72ab0000000000000000000000001-1.2.3.1-802", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72ab0000000000000000000000002-1.2.3.2-803", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72ab0000000000000000000000003-1.2.3.3-804", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72ab0000000000000000000000004-1.2.3.4-805", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72ab0000000000000000000000005-1.2.3.5-806", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72ab0000000000000000000000006-1.2.3.6-807", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72ab0000000000000000000000007-1.2.3.7-808", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72a80000000000000000000000000-1.2.3.0-809", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72a80000000000000000000000001-1.2.3.1-810", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72a80000000000000000000000002-1.2.3.2-811", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72a80000000000000000000000003-1.2.3.3-812", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72a80000000000000000000000004-1.2.3.4-813", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72a80000000000000000000000005-1.2.3.5-814", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72a80000000000000000000000006-1.2.3.6-815", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72a80000000000000000000000007-1.2.3.7-816", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72ac0000000000000000000000000-1.2.3.0-817", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72ac0000000000000000000000001-1.2.3.1-818", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72ac0000000000000000000000002-1.2.3.2-819", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72ac0000000000000000000000003-1.2.3.3-820", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72ac0000000000000000000000004-1.2.3.4-821", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72ac0000000000000000000000005-1.2.3.5-822", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72ac0000000000000000000000006-1.2.3.6-823", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72ac0000000000000000000000007-1.2.3.7-824", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72a00000000000000000000000000-1.2.3.0-825", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72a00000000000000000000000001-1.2.3.1-826", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72a00000000000000000000000002-1.2.3.2-827", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72a00000000000000000000000003-1.2.3.3-828", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72a00000000000000000000000004-1.2.3.4-829", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72a00000000000000000000000005-1.2.3.5-830", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72a00000000000000000000000006-1.2.3.6-831", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72a00000000000000000000000007-1.2.3.7-832", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72b00000000000000000000000000-1.2.3.0-833", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72b00000000000000000000000001-1.2.3.1-834", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72b00000000000000000000000002-1.2.3.2-835", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72b00000000000000000000000003-1.2.3.3-836", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72b00000000000000000000000004-1.2.3.4-837", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72b00000000000000000000000005-1.2.3.5-838", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72b00000000000000000000000006-1.2.3.6-839", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72b00000000000000000000000007-1.2.3.7-840", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72800000000000000000000000000-1.2.3.0-841", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72800000000000000000000000001-1.2.3.1-842", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72800000000000000000000000002-1.2.3.2-843", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72800000000000000000000000003-1.2.3.3-844", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72800000000000000000000000004-1.2.3.4-845", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72800000000000000000000000005-1.2.3.5-846", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72800000000000000000000000006-1.2.3.6-847", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72800000000000000000000000007-1.2.3.7-848", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72c00000000000000000000000000-1.2.3.0-849", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72c00000000000000000000000001-1.2.3.1-850", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72c00000000000000000000000002-1.2.3.2-851", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72c00000000000000000000000003-1.2.3.3-852", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72c00000000000000000000000004-1.2.3.4-853", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72c00000000000000000000000005-1.2.3.5-854", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72c00000000000000000000000006-1.2.3.6-855", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72c00000000000000000000000007-1.2.3.7-856", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72000000000000000000000000000-1.2.3.0-857", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72000000000000000000000000001-1.2.3.1-858", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72000000000000000000000000002-1.2.3.2-859", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72000000000000000000000000003-1.2.3.3-860", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72000000000000000000000000004-1.2.3.4-861", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72000000000000000000000000005-1.2.3.5-862", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72000000000000000000000000006-1.2.3.6-863", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72000000000000000000000000007-1.2.3.7-864", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe73000000000000000000000000000-1.2.3.0-865", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe73000000000000000000000000001-1.2.3.1-866", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe73000000000000000000000000002-1.2.3.2-867", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe73000000000000000000000000003-1.2.3.3-868", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe73000000000000000000000000004-1.2.3.4-869", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe73000000000000000000000000005-1.2.3.5-870", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe73000000000000000000000000006-1.2.3.6-871", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe73000000000000000000000000007-1.2.3.7-872", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe70000000000000000000000000000-1.2.3.0-873", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe70000000000000000000000000001-1.2.3.1-874", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe70000000000000000000000000002-1.2.3.2-875", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe70000000000000000000000000003-1.2.3.3-876", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe70000000000000000000000000004-1.2.3.4-877", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe70000000000000000000000000005-1.2.3.5-878", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe70000000000000000000000000006-1.2.3.6-879", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe70000000000000000000000000007-1.2.3.7-880", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe74000000000000000000000000000-1.2.3.0-881", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe74000000000000000000000000001-1.2.3.1-882", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe74000000000000000000000000002-1.2.3.2-883", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe74000000000000000000000000003-1.2.3.3-884", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe74000000000000000000000000004-1.2.3.4-885", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe74000000000000000000000000005-1.2.3.5-886", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe74000000000000000000000000006-1.2.3.6-887", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe74000000000000000000000000007-1.2.3.7-888", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe78000000000000000000000000000-1.2.3.0-889", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe78000000000000000000000000001-1.2.3.1-890", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe78000000000000000000000000002-1.2.3.2-891", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe78000000000000000000000000003-1.2.3.3-892", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe78000000000000000000000000004-1.2.3.4-893", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe78000000000000000000000000005-1.2.3.5-894", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe78000000000000000000000000006-1.2.3.6-895", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe78000000000000000000000000007-1.2.3.7-896", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe60000000000000000000000000000-1.2.3.0-897", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe60000000000000000000000000001-1.2.3.1-898", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe60000000000000000000000000002-1.2.3.2-899", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe60000000000000000000000000003-1.2.3.3-900", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe60000000000000000000000000004-1.2.3.4-901", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe60000000000000000000000000005-1.2.3.5-902", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe60000000000000000000000000006-1.2.3.6-903", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe60000000000000000000000000007-1.2.3.7-904", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe40000000000000000000000000000-1.2.3.0-905", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe40000000000000000000000000001-1.2.3.1-906", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe40000000000000000000000000002-1.2.3.2-907", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe40000000000000000000000000003-1.2.3.3-908", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe40000000000000000000000000004-1.2.3.4-909", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe40000000000000000000000000005-1.2.3.5-910", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe40000000000000000000000000006-1.2.3.6-911", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe40000000000000000000000000007-1.2.3.7-912", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe00000000000000000000000000000-1.2.3.0-913", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe00000000000000000000000000001-1.2.3.1-914", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe00000000000000000000000000002-1.2.3.2-915", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe00000000000000000000000000003-1.2.3.3-916", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe00000000000000000000000000004-1.2.3.4-917", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe00000000000000000000000000005-1.2.3.5-918", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe00000000000000000000000000006-1.2.3.6-919", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe00000000000000000000000000007-1.2.3.7-920", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe80000000000000000000000000000-1.2.3.0-921", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe80000000000000000000000000001-1.2.3.1-922", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe80000000000000000000000000002-1.2.3.2-923", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe80000000000000000000000000003-1.2.3.3-924", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe80000000000000000000000000004-1.2.3.4-925", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe80000000000000000000000000005-1.2.3.5-926", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe80000000000000000000000000006-1.2.3.6-927", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe80000000000000000000000000007-1.2.3.7-928", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158ff00000000000000000000000000000-1.2.3.0-929", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158ff00000000000000000000000000001-1.2.3.1-930", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158ff00000000000000000000000000002-1.2.3.2-931", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158ff00000000000000000000000000003-1.2.3.3-932", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158ff00000000000000000000000000004-1.2.3.4-933", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158ff00000000000000000000000000005-1.2.3.5-934", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158ff00000000000000000000000000006-1.2.3.6-935", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158ff00000000000000000000000000007-1.2.3.7-936", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fc00000000000000000000000000000-1.2.3.0-937", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fc00000000000000000000000000001-1.2.3.1-938", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fc00000000000000000000000000002-1.2.3.2-939", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fc00000000000000000000000000003-1.2.3.3-940", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fc00000000000000000000000000004-1.2.3.4-941", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fc00000000000000000000000000005-1.2.3.5-942", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fc00000000000000000000000000006-1.2.3.6-943", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fc00000000000000000000000000007-1.2.3.7-944", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158f800000000000000000000000000000-1.2.3.0-945", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158f800000000000000000000000000001-1.2.3.1-946", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158f800000000000000000000000000002-1.2.3.2-947", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158f800000000000000000000000000003-1.2.3.3-948", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158f800000000000000000000000000004-1.2.3.4-949", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158f800000000000000000000000000005-1.2.3.5-950", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158f800000000000000000000000000006-1.2.3.6-951", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158f800000000000000000000000000007-1.2.3.7-952", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158f000000000000000000000000000000-1.2.3.0-953", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158f000000000000000000000000000001-1.2.3.1-954", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158f000000000000000000000000000002-1.2.3.2-955", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158f000000000000000000000000000003-1.2.3.3-956", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158f000000000000000000000000000004-1.2.3.4-957", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158f000000000000000000000000000005-1.2.3.5-958", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158f000000000000000000000000000006-1.2.3.6-959", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158f000000000000000000000000000007-1.2.3.7-960", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158e000000000000000000000000000000-1.2.3.0-961", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158e000000000000000000000000000001-1.2.3.1-962", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158e000000000000000000000000000002-1.2.3.2-963", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158e000000000000000000000000000003-1.2.3.3-964", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158e000000000000000000000000000004-1.2.3.4-965", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158e000000000000000000000000000005-1.2.3.5-966", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158e000000000000000000000000000006-1.2.3.6-967", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158e000000000000000000000000000007-1.2.3.7-968", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158c000000000000000000000000000000-1.2.3.0-969", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158c000000000000000000000000000001-1.2.3.1-970", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158c000000000000000000000000000002-1.2.3.2-971", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158c000000000000000000000000000003-1.2.3.3-972", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158c000000000000000000000000000004-1.2.3.4-973", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158c000000000000000000000000000005-1.2.3.5-974", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158c000000000000000000000000000006-1.2.3.6-975", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158c000000000000000000000000000007-1.2.3.7-976", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91588000000000000000000000000000000-1.2.3.0-977", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91588000000000000000000000000000001-1.2.3.1-978", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91588000000000000000000000000000002-1.2.3.2-979", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91588000000000000000000000000000003-1.2.3.3-980", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91588000000000000000000000000000004-1.2.3.4-981", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91588000000000000000000000000000005-1.2.3.5-982", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91588000000000000000000000000000006-1.2.3.6-983", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91588000000000000000000000000000007-1.2.3.7-984", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91580000000000000000000000000000000-1.2.3.0-985", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91580000000000000000000000000000001-1.2.3.1-986", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91580000000000000000000000000000002-1.2.3.2-987", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91580000000000000000000000000000003-1.2.3.3-988", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91580000000000000000000000000000004-1.2.3.4-989", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91580000000000000000000000000000005-1.2.3.5-990", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91580000000000000000000000000000006-1.2.3.6-991", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91580000000000000000000000000000007-1.2.3.7-992", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91590000000000000000000000000000000-1.2.3.0-993", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91590000000000000000000000000000001-1.2.3.1-994", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91590000000000000000000000000000002-1.2.3.2-995", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91590000000000000000000000000000003-1.2.3.3-996", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91590000000000000000000000000000004-1.2.3.4-997", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91590000000000000000000000000000005-1.2.3.5-998", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91590000000000000000000000000000006-1.2.3.6-999", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91590000000000000000000000000000007-1.2.3.7-1000", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d915a0000000000000000000000000000000-1.2.3.0-1001", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d915a0000000000000000000000000000001-1.2.3.1-1002", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d915a0000000000000000000000000000002-1.2.3.2-1003", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d915a0000000000000000000000000000003-1.2.3.3-1004", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d915a0000000000000000000000000000004-1.2.3.4-1005", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d915a0000000000000000000000000000005-1.2.3.5-1006", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d915a0000000000000000000000000000006-1.2.3.6-1007", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d915a0000000000000000000000000000007-1.2.3.7-1008", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d915c0000000000000000000000000000000-1.2.3.0-1009", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d915c0000000000000000000000000000001-1.2.3.1-1010", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d915c0000000000000000000000000000002-1.2.3.2-1011", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d915c0000000000000000000000000000003-1.2.3.3-1012", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d915c0000000000000000000000000000004-1.2.3.4-1013", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d915c0000000000000000000000000000005-1.2.3.5-1014", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d915c0000000000000000000000000000006-1.2.3.6-1015", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d915c0000000000000000000000000000007-1.2.3.7-1016", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91500000000000000000000000000000000-1.2.3.0-1017", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91500000000000000000000000000000001-1.2.3.1-1018", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91500000000000000000000000000000002-1.2.3.2-1019", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91500000000000000000000000000000003-1.2.3.3-1020", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91500000000000000000000000000000004-1.2.3.4-1021", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91500000000000000000000000000000005-1.2.3.5-1022", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91500000000000000000000000000000006-1.2.3.6-1023", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91500000000000000000000000000000007-1.2.3.7-1024", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91400000000000000000000000000000000-1.2.3.0-1025", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91400000000000000000000000000000001-1.2.3.1-1026", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91400000000000000000000000000000002-1.2.3.2-1027", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91400000000000000000000000000000003-1.2.3.3-1028", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91400000000000000000000000000000004-1.2.3.4-1029", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91400000000000000000000000000000005-1.2.3.5-1030", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91400000000000000000000000000000006-1.2.3.6-1031", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91400000000000000000000000000000007-1.2.3.7-1032", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91600000000000000000000000000000000-1.2.3.0-1033", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91600000000000000000000000000000001-1.2.3.1-1034", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91600000000000000000000000000000002-1.2.3.2-1035", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91600000000000000000000000000000003-1.2.3.3-1036", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91600000000000000000000000000000004-1.2.3.4-1037", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91600000000000000000000000000000005-1.2.3.5-1038", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91600000000000000000000000000000006-1.2.3.6-1039", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91600000000000000000000000000000007-1.2.3.7-1040", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91000000000000000000000000000000000-1.2.3.0-1041", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91000000000000000000000000000000001-1.2.3.1-1042", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91000000000000000000000000000000002-1.2.3.2-1043", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91000000000000000000000000000000003-1.2.3.3-1044", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91000000000000000000000000000000004-1.2.3.4-1045", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91000000000000000000000000000000005-1.2.3.5-1046", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91000000000000000000000000000000006-1.2.3.6-1047", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91000000000000000000000000000000007-1.2.3.7-1048", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91800000000000000000000000000000000-1.2.3.0-1049", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91800000000000000000000000000000001-1.2.3.1-1050", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91800000000000000000000000000000002-1.2.3.2-1051", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91800000000000000000000000000000003-1.2.3.3-1052", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91800000000000000000000000000000004-1.2.3.4-1053", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91800000000000000000000000000000005-1.2.3.5-1054", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91800000000000000000000000000000006-1.2.3.6-1055", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d91800000000000000000000000000000007-1.2.3.7-1056", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d90000000000000000000000000000000000-1.2.3.0-1057", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d90000000000000000000000000000000001-1.2.3.1-1058", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d90000000000000000000000000000000002-1.2.3.2-1059", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d90000000000000000000000000000000003-1.2.3.3-1060", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d90000000000000000000000000000000004-1.2.3.4-1061", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d90000000000000000000000000000000005-1.2.3.5-1062", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d90000000000000000000000000000000006-1.2.3.6-1063", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d90000000000000000000000000000000007-1.2.3.7-1064", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d92000000000000000000000000000000000-1.2.3.0-1065", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d92000000000000000000000000000000001-1.2.3.1-1066", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d92000000000000000000000000000000002-1.2.3.2-1067", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d92000000000000000000000000000000003-1.2.3.3-1068", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d92000000000000000000000000000000004-1.2.3.4-1069", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d92000000000000000000000000000000005-1.2.3.5-1070", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d92000000000000000000000000000000006-1.2.3.6-1071", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d92000000000000000000000000000000007-1.2.3.7-1072", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d94000000000000000000000000000000000-1.2.3.0-1073", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d94000000000000000000000000000000001-1.2.3.1-1074", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d94000000000000000000000000000000002-1.2.3.2-1075", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d94000000000000000000000000000000003-1.2.3.3-1076", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d94000000000000000000000000000000004-1.2.3.4-1077", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d94000000000000000000000000000000005-1.2.3.5-1078", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d94000000000000000000000000000000006-1.2.3.6-1079", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d94000000000000000000000000000000007-1.2.3.7-1080", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d98000000000000000000000000000000000-1.2.3.0-1081", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d98000000000000000000000000000000001-1.2.3.1-1082", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d98000000000000000000000000000000002-1.2.3.2-1083", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d98000000000000000000000000000000003-1.2.3.3-1084", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d98000000000000000000000000000000004-1.2.3.4-1085", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d98000000000000000000000000000000005-1.2.3.5-1086", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d98000000000000000000000000000000006-1.2.3.6-1087", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d98000000000000000000000000000000007-1.2.3.7-1088", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d80000000000000000000000000000000000-1.2.3.0-1089", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d80000000000000000000000000000000001-1.2.3.1-1090", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d80000000000000000000000000000000002-1.2.3.2-1091", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d80000000000000000000000000000000003-1.2.3.3-1092", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d80000000000000000000000000000000004-1.2.3.4-1093", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d80000000000000000000000000000000005-1.2.3.5-1094", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d80000000000000000000000000000000006-1.2.3.6-1095", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d80000000000000000000000000000000007-1.2.3.7-1096", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7da0000000000000000000000000000000000-1.2.3.0-1097", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7da0000000000000000000000000000000001-1.2.3.1-1098", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7da0000000000000000000000000000000002-1.2.3.2-1099", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7da0000000000000000000000000000000003-1.2.3.3-1100", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7da0000000000000000000000000000000004-1.2.3.4-1101", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7da0000000000000000000000000000000005-1.2.3.5-1102", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7da0000000000000000000000000000000006-1.2.3.6-1103", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7da0000000000000000000000000000000007-1.2.3.7-1104", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7dc0000000000000000000000000000000000-1.2.3.0-1105", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7dc0000000000000000000000000000000001-1.2.3.1-1106", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7dc0000000000000000000000000000000002-1.2.3.2-1107", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7dc0000000000000000000000000000000003-1.2.3.3-1108", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7dc0000000000000000000000000000000004-1.2.3.4-1109", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7dc0000000000000000000000000000000005-1.2.3.5-1110", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7dc0000000000000000000000000000000006-1.2.3.6-1111", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7dc0000000000000000000000000000000007-1.2.3.7-1112", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d00000000000000000000000000000000000-1.2.3.0-1113", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d00000000000000000000000000000000001-1.2.3.1-1114", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d00000000000000000000000000000000002-1.2.3.2-1115", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d00000000000000000000000000000000003-1.2.3.3-1116", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d00000000000000000000000000000000004-1.2.3.4-1117", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d00000000000000000000000000000000005-1.2.3.5-1118", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d00000000000000000000000000000000006-1.2.3.6-1119", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d00000000000000000000000000000000007-1.2.3.7-1120", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7c00000000000000000000000000000000000-1.2.3.0-1121", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7c00000000000000000000000000000000001-1.2.3.1-1122", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7c00000000000000000000000000000000002-1.2.3.2-1123", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7c00000000000000000000000000000000003-1.2.3.3-1124", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7c00000000000000000000000000000000004-1.2.3.4-1125", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7c00000000000000000000000000000000005-1.2.3.5-1126", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7c00000000000000000000000000000000006-1.2.3.6-1127", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7c00000000000000000000000000000000007-1.2.3.7-1128", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7e00000000000000000000000000000000000-1.2.3.0-1129", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7e00000000000000000000000000000000001-1.2.3.1-1130", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7e00000000000000000000000000000000002-1.2.3.2-1131", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7e00000000000000000000000000000000003-1.2.3.3-1132", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7e00000000000000000000000000000000004-1.2.3.4-1133", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7e00000000000000000000000000000000005-1.2.3.5-1134", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7e00000000000000000000000000000000006-1.2.3.6-1135", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7e00000000000000000000000000000000007-1.2.3.7-1136", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7800000000000000000000000000000000000-1.2.3.0-1137", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7800000000000000000000000000000000001-1.2.3.1-1138", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7800000000000000000000000000000000002-1.2.3.2-1139", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7800000000000000000000000000000000003-1.2.3.3-1140", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7800000000000000000000000000000000004-1.2.3.4-1141", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7800000000000000000000000000000000005-1.2.3.5-1142", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7800000000000000000000000000000000006-1.2.3.6-1143", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7800000000000000000000000000000000007-1.2.3.7-1144", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7000000000000000000000000000000000000-1.2.3.0-1145", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7000000000000000000000000000000000001-1.2.3.1-1146", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7000000000000000000000000000000000002-1.2.3.2-1147", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7000000000000000000000000000000000003-1.2.3.3-1148", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7000000000000000000000000000000000004-1.2.3.4-1149", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7000000000000000000000000000000000005-1.2.3.5-1150", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7000000000000000000000000000000000006-1.2.3.6-1151", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7000000000000000000000000000000000007-1.2.3.7-1152", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c6000000000000000000000000000000000000-1.2.3.0-1153", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c6000000000000000000000000000000000001-1.2.3.1-1154", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c6000000000000000000000000000000000002-1.2.3.2-1155", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c6000000000000000000000000000000000003-1.2.3.3-1156", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c6000000000000000000000000000000000004-1.2.3.4-1157", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c6000000000000000000000000000000000005-1.2.3.5-1158", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c6000000000000000000000000000000000006-1.2.3.6-1159", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c6000000000000000000000000000000000007-1.2.3.7-1160", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c4000000000000000000000000000000000000-1.2.3.0-1161", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c4000000000000000000000000000000000001-1.2.3.1-1162", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c4000000000000000000000000000000000002-1.2.3.2-1163", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c4000000000000000000000000000000000003-1.2.3.3-1164", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c4000000000000000000000000000000000004-1.2.3.4-1165", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c4000000000000000000000000000000000005-1.2.3.5-1166", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c4000000000000000000000000000000000006-1.2.3.6-1167", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c4000000000000000000000000000000000007-1.2.3.7-1168", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c0000000000000000000000000000000000000-1.2.3.0-1169", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c0000000000000000000000000000000000001-1.2.3.1-1170", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c0000000000000000000000000000000000002-1.2.3.2-1171", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c0000000000000000000000000000000000003-1.2.3.3-1172", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c0000000000000000000000000000000000004-1.2.3.4-1173", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c0000000000000000000000000000000000005-1.2.3.5-1174", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c0000000000000000000000000000000000006-1.2.3.6-1175", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c0000000000000000000000000000000000007-1.2.3.7-1176", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c8000000000000000000000000000000000000-1.2.3.0-1177", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c8000000000000000000000000000000000001-1.2.3.1-1178", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c8000000000000000000000000000000000002-1.2.3.2-1179", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c8000000000000000000000000000000000003-1.2.3.3-1180", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c8000000000000000000000000000000000004-1.2.3.4-1181", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c8000000000000000000000000000000000005-1.2.3.5-1182", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c8000000000000000000000000000000000006-1.2.3.6-1183", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c8000000000000000000000000000000000007-1.2.3.7-1184", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515d0000000000000000000000000000000000000-1.2.3.0-1185", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515d0000000000000000000000000000000000001-1.2.3.1-1186", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515d0000000000000000000000000000000000002-1.2.3.2-1187", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515d0000000000000000000000000000000000003-1.2.3.3-1188", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515d0000000000000000000000000000000000004-1.2.3.4-1189", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515d0000000000000000000000000000000000005-1.2.3.5-1190", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515d0000000000000000000000000000000000006-1.2.3.6-1191", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515d0000000000000000000000000000000000007-1.2.3.7-1192", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515e0000000000000000000000000000000000000-1.2.3.0-1193", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515e0000000000000000000000000000000000001-1.2.3.1-1194", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515e0000000000000000000000000000000000002-1.2.3.2-1195", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515e0000000000000000000000000000000000003-1.2.3.3-1196", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515e0000000000000000000000000000000000004-1.2.3.4-1197", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515e0000000000000000000000000000000000005-1.2.3.5-1198", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515e0000000000000000000000000000000000006-1.2.3.6-1199", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515e0000000000000000000000000000000000007-1.2.3.7-1200", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751580000000000000000000000000000000000000-1.2.3.0-1201", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751580000000000000000000000000000000000001-1.2.3.1-1202", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751580000000000000000000000000000000000002-1.2.3.2-1203", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751580000000000000000000000000000000000003-1.2.3.3-1204", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751580000000000000000000000000000000000004-1.2.3.4-1205", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751580000000000000000000000000000000000005-1.2.3.5-1206", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751580000000000000000000000000000000000006-1.2.3.6-1207", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751580000000000000000000000000000000000007-1.2.3.7-1208", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751500000000000000000000000000000000000000-1.2.3.0-1209", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751500000000000000000000000000000000000001-1.2.3.1-1210", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751500000000000000000000000000000000000002-1.2.3.2-1211", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751500000000000000000000000000000000000003-1.2.3.3-1212", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751500000000000000000000000000000000000004-1.2.3.4-1213", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751500000000000000000000000000000000000005-1.2.3.5-1214", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751500000000000000000000000000000000000006-1.2.3.6-1215", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751500000000000000000000000000000000000007-1.2.3.7-1216", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751400000000000000000000000000000000000000-1.2.3.0-1217", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751400000000000000000000000000000000000001-1.2.3.1-1218", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751400000000000000000000000000000000000002-1.2.3.2-1219", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751400000000000000000000000000000000000003-1.2.3.3-1220", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751400000000000000000000000000000000000004-1.2.3.4-1221", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751400000000000000000000000000000000000005-1.2.3.5-1222", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751400000000000000000000000000000000000006-1.2.3.6-1223", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751400000000000000000000000000000000000007-1.2.3.7-1224", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751600000000000000000000000000000000000000-1.2.3.0-1225", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751600000000000000000000000000000000000001-1.2.3.1-1226", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751600000000000000000000000000000000000002-1.2.3.2-1227", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751600000000000000000000000000000000000003-1.2.3.3-1228", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751600000000000000000000000000000000000004-1.2.3.4-1229", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751600000000000000000000000000000000000005-1.2.3.5-1230", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751600000000000000000000000000000000000006-1.2.3.6-1231", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751600000000000000000000000000000000000007-1.2.3.7-1232", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751000000000000000000000000000000000000000-1.2.3.0-1233", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751000000000000000000000000000000000000001-1.2.3.1-1234", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751000000000000000000000000000000000000002-1.2.3.2-1235", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751000000000000000000000000000000000000003-1.2.3.3-1236", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751000000000000000000000000000000000000004-1.2.3.4-1237", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751000000000000000000000000000000000000005-1.2.3.5-1238", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751000000000000000000000000000000000000006-1.2.3.6-1239", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751000000000000000000000000000000000000007-1.2.3.7-1240", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751800000000000000000000000000000000000000-1.2.3.0-1241", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751800000000000000000000000000000000000001-1.2.3.1-1242", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751800000000000000000000000000000000000002-1.2.3.2-1243", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751800000000000000000000000000000000000003-1.2.3.3-1244", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751800000000000000000000000000000000000004-1.2.3.4-1245", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751800000000000000000000000000000000000005-1.2.3.5-1246", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751800000000000000000000000000000000000006-1.2.3.6-1247", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746751800000000000000000000000000000000000007-1.2.3.7-1248", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746750000000000000000000000000000000000000000-1.2.3.0-1249", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746750000000000000000000000000000000000000001-1.2.3.1-1250", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746750000000000000000000000000000000000000002-1.2.3.2-1251", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746750000000000000000000000000000000000000003-1.2.3.3-1252", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746750000000000000000000000000000000000000004-1.2.3.4-1253", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746750000000000000000000000000000000000000005-1.2.3.5-1254", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746750000000000000000000000000000000000000006-1.2.3.6-1255", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746750000000000000000000000000000000000000007-1.2.3.7-1256", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746752000000000000000000000000000000000000000-1.2.3.0-1257", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746752000000000000000000000000000000000000001-1.2.3.1-1258", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746752000000000000000000000000000000000000002-1.2.3.2-1259", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746752000000000000000000000000000000000000003-1.2.3.3-1260", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746752000000000000000000000000000000000000004-1.2.3.4-1261", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746752000000000000000000000000000000000000005-1.2.3.5-1262", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746752000000000000000000000000000000000000006-1.2.3.6-1263", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746752000000000000000000000000000000000000007-1.2.3.7-1264", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746754000000000000000000000000000000000000000-1.2.3.0-1265", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746754000000000000000000000000000000000000001-1.2.3.1-1266", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746754000000000000000000000000000000000000002-1.2.3.2-1267", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746754000000000000000000000000000000000000003-1.2.3.3-1268", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746754000000000000000000000000000000000000004-1.2.3.4-1269", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746754000000000000000000000000000000000000005-1.2.3.5-1270", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746754000000000000000000000000000000000000006-1.2.3.6-1271", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746754000000000000000000000000000000000000007-1.2.3.7-1272", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746758000000000000000000000000000000000000000-1.2.3.0-1273", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746758000000000000000000000000000000000000001-1.2.3.1-1274", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746758000000000000000000000000000000000000002-1.2.3.2-1275", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746758000000000000000000000000000000000000003-1.2.3.3-1276", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746758000000000000000000000000000000000000004-1.2.3.4-1277", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746758000000000000000000000000000000000000005-1.2.3.5-1278", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746758000000000000000000000000000000000000006-1.2.3.6-1279", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746758000000000000000000000000000000000000007-1.2.3.7-1280", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746740000000000000000000000000000000000000000-1.2.3.0-1281", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746740000000000000000000000000000000000000001-1.2.3.1-1282", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746740000000000000000000000000000000000000002-1.2.3.2-1283", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746740000000000000000000000000000000000000003-1.2.3.3-1284", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746740000000000000000000000000000000000000004-1.2.3.4-1285", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746740000000000000000000000000000000000000005-1.2.3.5-1286", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746740000000000000000000000000000000000000006-1.2.3.6-1287", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746740000000000000000000000000000000000000007-1.2.3.7-1288", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746760000000000000000000000000000000000000000-1.2.3.0-1289", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746760000000000000000000000000000000000000001-1.2.3.1-1290", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746760000000000000000000000000000000000000002-1.2.3.2-1291", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746760000000000000000000000000000000000000003-1.2.3.3-1292", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746760000000000000000000000000000000000000004-1.2.3.4-1293", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746760000000000000000000000000000000000000005-1.2.3.5-1294", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746760000000000000000000000000000000000000006-1.2.3.6-1295", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746760000000000000000000000000000000000000007-1.2.3.7-1296", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746700000000000000000000000000000000000000000-1.2.3.0-1297", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746700000000000000000000000000000000000000001-1.2.3.1-1298", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746700000000000000000000000000000000000000002-1.2.3.2-1299", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746700000000000000000000000000000000000000003-1.2.3.3-1300", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746700000000000000000000000000000000000000004-1.2.3.4-1301", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746700000000000000000000000000000000000000005-1.2.3.5-1302", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746700000000000000000000000000000000000000006-1.2.3.6-1303", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746700000000000000000000000000000000000000007-1.2.3.7-1304", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746780000000000000000000000000000000000000000-1.2.3.0-1305", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746780000000000000000000000000000000000000001-1.2.3.1-1306", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746780000000000000000000000000000000000000002-1.2.3.2-1307", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746780000000000000000000000000000000000000003-1.2.3.3-1308", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746780000000000000000000000000000000000000004-1.2.3.4-1309", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746780000000000000000000000000000000000000005-1.2.3.5-1310", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746780000000000000000000000000000000000000006-1.2.3.6-1311", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746780000000000000000000000000000000000000007-1.2.3.7-1312", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746600000000000000000000000000000000000000000-1.2.3.0-1313", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746600000000000000000000000000000000000000001-1.2.3.1-1314", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746600000000000000000000000000000000000000002-1.2.3.2-1315", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746600000000000000000000000000000000000000003-1.2.3.3-1316", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746600000000000000000000000000000000000000004-1.2.3.4-1317", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746600000000000000000000000000000000000000005-1.2.3.5-1318", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746600000000000000000000000000000000000000006-1.2.3.6-1319", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746600000000000000000000000000000000000000007-1.2.3.7-1320", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746400000000000000000000000000000000000000000-1.2.3.0-1321", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746400000000000000000000000000000000000000001-1.2.3.1-1322", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746400000000000000000000000000000000000000002-1.2.3.2-1323", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746400000000000000000000000000000000000000003-1.2.3.3-1324", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746400000000000000000000000000000000000000004-1.2.3.4-1325", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746400000000000000000000000000000000000000005-1.2.3.5-1326", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746400000000000000000000000000000000000000006-1.2.3.6-1327", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746400000000000000000000000000000000000000007-1.2.3.7-1328", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746000000000000000000000000000000000000000000-1.2.3.0-1329", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746000000000000000000000000000000000000000001-1.2.3.1-1330", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746000000000000000000000000000000000000000002-1.2.3.2-1331", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746000000000000000000000000000000000000000003-1.2.3.3-1332", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746000000000000000000000000000000000000000004-1.2.3.4-1333", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746000000000000000000000000000000000000000005-1.2.3.5-1334", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746000000000000000000000000000000000000000006-1.2.3.6-1335", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746000000000000000000000000000000000000000007-1.2.3.7-1336", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746800000000000000000000000000000000000000000-1.2.3.0-1337", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746800000000000000000000000000000000000000001-1.2.3.1-1338", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746800000000000000000000000000000000000000002-1.2.3.2-1339", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746800000000000000000000000000000000000000003-1.2.3.3-1340", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746800000000000000000000000000000000000000004-1.2.3.4-1341", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746800000000000000000000000000000000000000005-1.2.3.5-1342", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746800000000000000000000000000000000000000006-1.2.3.6-1343", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8746800000000000000000000000000000000000000007-1.2.3.7-1344", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8747000000000000000000000000000000000000000000-1.2.3.0-1345", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8747000000000000000000000000000000000000000001-1.2.3.1-1346", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8747000000000000000000000000000000000000000002-1.2.3.2-1347", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8747000000000000000000000000000000000000000003-1.2.3.3-1348", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8747000000000000000000000000000000000000000004-1.2.3.4-1349", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8747000000000000000000000000000000000000000005-1.2.3.5-1350", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8747000000000000000000000000000000000000000006-1.2.3.6-1351", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8747000000000000000000000000000000000000000007-1.2.3.7-1352", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8744000000000000000000000000000000000000000000-1.2.3.0-1353", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8744000000000000000000000000000000000000000001-1.2.3.1-1354", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8744000000000000000000000000000000000000000002-1.2.3.2-1355", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8744000000000000000000000000000000000000000003-1.2.3.3-1356", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8744000000000000000000000000000000000000000004-1.2.3.4-1357", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8744000000000000000000000000000000000000000005-1.2.3.5-1358", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8744000000000000000000000000000000000000000006-1.2.3.6-1359", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8744000000000000000000000000000000000000000007-1.2.3.7-1360", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8740000000000000000000000000000000000000000000-1.2.3.0-1361", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8740000000000000000000000000000000000000000001-1.2.3.1-1362", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8740000000000000000000000000000000000000000002-1.2.3.2-1363", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8740000000000000000000000000000000000000000003-1.2.3.3-1364", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8740000000000000000000000000000000000000000004-1.2.3.4-1365", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8740000000000000000000000000000000000000000005-1.2.3.5-1366", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8740000000000000000000000000000000000000000006-1.2.3.6-1367", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8740000000000000000000000000000000000000000007-1.2.3.7-1368", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8748000000000000000000000000000000000000000000-1.2.3.0-1369", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8748000000000000000000000000000000000000000001-1.2.3.1-1370", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8748000000000000000000000000000000000000000002-1.2.3.2-1371", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8748000000000000000000000000000000000000000003-1.2.3.3-1372", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8748000000000000000000000000000000000000000004-1.2.3.4-1373", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8748000000000000000000000000000000000000000005-1.2.3.5-1374", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8748000000000000000000000000000000000000000006-1.2.3.6-1375", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8748000000000000000000000000000000000000000007-1.2.3.7-1376", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8750000000000000000000000000000000000000000000-1.2.3.0-1377", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8750000000000000000000000000000000000000000001-1.2.3.1-1378", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8750000000000000000000000000000000000000000002-1.2.3.2-1379", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8750000000000000000000000000000000000000000003-1.2.3.3-1380", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8750000000000000000000000000000000000000000004-1.2.3.4-1381", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8750000000000000000000000000000000000000000005-1.2.3.5-1382", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8750000000000000000000000000000000000000000006-1.2.3.6-1383", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8750000000000000000000000000000000000000000007-1.2.3.7-1384", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8760000000000000000000000000000000000000000000-1.2.3.0-1385", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8760000000000000000000000000000000000000000001-1.2.3.1-1386", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8760000000000000000000000000000000000000000002-1.2.3.2-1387", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8760000000000000000000000000000000000000000003-1.2.3.3-1388", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8760000000000000000000000000000000000000000004-1.2.3.4-1389", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8760000000000000000000000000000000000000000005-1.2.3.5-1390", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8760000000000000000000000000000000000000000006-1.2.3.6-1391", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8760000000000000000000000000000000000000000007-1.2.3.7-1392", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8700000000000000000000000000000000000000000000-1.2.3.0-1393", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8700000000000000000000000000000000000000000001-1.2.3.1-1394", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8700000000000000000000000000000000000000000002-1.2.3.2-1395", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8700000000000000000000000000000000000000000003-1.2.3.3-1396", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8700000000000000000000000000000000000000000004-1.2.3.4-1397", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8700000000000000000000000000000000000000000005-1.2.3.5-1398", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8700000000000000000000000000000000000000000006-1.2.3.6-1399", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8700000000000000000000000000000000000000000007-1.2.3.7-1400", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8780000000000000000000000000000000000000000000-1.2.3.0-1401", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8780000000000000000000000000000000000000000001-1.2.3.1-1402", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8780000000000000000000000000000000000000000002-1.2.3.2-1403", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8780000000000000000000000000000000000000000003-1.2.3.3-1404", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8780000000000000000000000000000000000000000004-1.2.3.4-1405", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8780000000000000000000000000000000000000000005-1.2.3.5-1406", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8780000000000000000000000000000000000000000006-1.2.3.6-1407", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8780000000000000000000000000000000000000000007-1.2.3.7-1408", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8600000000000000000000000000000000000000000000-1.2.3.0-1409", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8600000000000000000000000000000000000000000001-1.2.3.1-1410", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8600000000000000000000000000000000000000000002-1.2.3.2-1411", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8600000000000000000000000000000000000000000003-1.2.3.3-1412", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8600000000000000000000000000000000000000000004-1.2.3.4-1413", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8600000000000000000000000000000000000000000005-1.2.3.5-1414", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8600000000000000000000000000000000000000000006-1.2.3.6-1415", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8600000000000000000000000000000000000000000007-1.2.3.7-1416", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8400000000000000000000000000000000000000000000-1.2.3.0-1417", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8400000000000000000000000000000000000000000001-1.2.3.1-1418", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8400000000000000000000000000000000000000000002-1.2.3.2-1419", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8400000000000000000000000000000000000000000003-1.2.3.3-1420", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8400000000000000000000000000000000000000000004-1.2.3.4-1421", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8400000000000000000000000000000000000000000005-1.2.3.5-1422", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8400000000000000000000000000000000000000000006-1.2.3.6-1423", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8400000000000000000000000000000000000000000007-1.2.3.7-1424", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8000000000000000000000000000000000000000000000-1.2.3.0-1425", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8000000000000000000000000000000000000000000001-1.2.3.1-1426", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8000000000000000000000000000000000000000000002-1.2.3.2-1427", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8000000000000000000000000000000000000000000003-1.2.3.3-1428", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8000000000000000000000000000000000000000000004-1.2.3.4-1429", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8000000000000000000000000000000000000000000005-1.2.3.5-1430", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8000000000000000000000000000000000000000000006-1.2.3.6-1431", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8000000000000000000000000000000000000000000007-1.2.3.7-1432", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8800000000000000000000000000000000000000000000-1.2.3.0-1433", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8800000000000000000000000000000000000000000001-1.2.3.1-1434", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8800000000000000000000000000000000000000000002-1.2.3.2-1435", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8800000000000000000000000000000000000000000003-1.2.3.3-1436", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8800000000000000000000000000000000000000000004-1.2.3.4-1437", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8800000000000000000000000000000000000000000005-1.2.3.5-1438", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8800000000000000000000000000000000000000000006-1.2.3.6-1439", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d8800000000000000000000000000000000000000000007-1.2.3.7-1440", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d9000000000000000000000000000000000000000000000-1.2.3.0-1441", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d9000000000000000000000000000000000000000000001-1.2.3.1-1442", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d9000000000000000000000000000000000000000000002-1.2.3.2-1443", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d9000000000000000000000000000000000000000000003-1.2.3.3-1444", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d9000000000000000000000000000000000000000000004-1.2.3.4-1445", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d9000000000000000000000000000000000000000000005-1.2.3.5-1446", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d9000000000000000000000000000000000000000000006-1.2.3.6-1447", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d9000000000000000000000000000000000000000000007-1.2.3.7-1448", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29da000000000000000000000000000000000000000000000-1.2.3.0-1449", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29da000000000000000000000000000000000000000000001-1.2.3.1-1450", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29da000000000000000000000000000000000000000000002-1.2.3.2-1451", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29da000000000000000000000000000000000000000000003-1.2.3.3-1452", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29da000000000000000000000000000000000000000000004-1.2.3.4-1453", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29da000000000000000000000000000000000000000000005-1.2.3.5-1454", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29da000000000000000000000000000000000000000000006-1.2.3.6-1455", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29da000000000000000000000000000000000000000000007-1.2.3.7-1456", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29dc000000000000000000000000000000000000000000000-1.2.3.0-1457", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29dc000000000000000000000000000000000000000000001-1.2.3.1-1458", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29dc000000000000000000000000000000000000000000002-1.2.3.2-1459", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29dc000000000000000000000000000000000000000000003-1.2.3.3-1460", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29dc000000000000000000000000000000000000000000004-1.2.3.4-1461", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29dc000000000000000000000000000000000000000000005-1.2.3.5-1462", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29dc000000000000000000000000000000000000000000006-1.2.3.6-1463", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29dc000000000000000000000000000000000000000000007-1.2.3.7-1464", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d0000000000000000000000000000000000000000000000-1.2.3.0-1465", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d0000000000000000000000000000000000000000000001-1.2.3.1-1466", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d0000000000000000000000000000000000000000000002-1.2.3.2-1467", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d0000000000000000000000000000000000000000000003-1.2.3.3-1468", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d0000000000000000000000000000000000000000000004-1.2.3.4-1469", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d0000000000000000000000000000000000000000000005-1.2.3.5-1470", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d0000000000000000000000000000000000000000000006-1.2.3.6-1471", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d0000000000000000000000000000000000000000000007-1.2.3.7-1472", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29c0000000000000000000000000000000000000000000000-1.2.3.0-1473", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29c0000000000000000000000000000000000000000000001-1.2.3.1-1474", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29c0000000000000000000000000000000000000000000002-1.2.3.2-1475", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29c0000000000000000000000000000000000000000000003-1.2.3.3-1476", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29c0000000000000000000000000000000000000000000004-1.2.3.4-1477", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29c0000000000000000000000000000000000000000000005-1.2.3.5-1478", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29c0000000000000000000000000000000000000000000006-1.2.3.6-1479", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29c0000000000000000000000000000000000000000000007-1.2.3.7-1480", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29e0000000000000000000000000000000000000000000000-1.2.3.0-1481", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29e0000000000000000000000000000000000000000000001-1.2.3.1-1482", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29e0000000000000000000000000000000000000000000002-1.2.3.2-1483", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29e0000000000000000000000000000000000000000000003-1.2.3.3-1484", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29e0000000000000000000000000000000000000000000004-1.2.3.4-1485", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29e0000000000000000000000000000000000000000000005-1.2.3.5-1486", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29e0000000000000000000000000000000000000000000006-1.2.3.6-1487", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29e0000000000000000000000000000000000000000000007-1.2.3.7-1488", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2980000000000000000000000000000000000000000000000-1.2.3.0-1489", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2980000000000000000000000000000000000000000000001-1.2.3.1-1490", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2980000000000000000000000000000000000000000000002-1.2.3.2-1491", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2980000000000000000000000000000000000000000000003-1.2.3.3-1492", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2980000000000000000000000000000000000000000000004-1.2.3.4-1493", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2980000000000000000000000000000000000000000000005-1.2.3.5-1494", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2980000000000000000000000000000000000000000000006-1.2.3.6-1495", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2980000000000000000000000000000000000000000000007-1.2.3.7-1496", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2900000000000000000000000000000000000000000000000-1.2.3.0-1497", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2900000000000000000000000000000000000000000000001-1.2.3.1-1498", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2900000000000000000000000000000000000000000000002-1.2.3.2-1499", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2900000000000000000000000000000000000000000000003-1.2.3.3-1500", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2900000000000000000000000000000000000000000000004-1.2.3.4-1501", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2900000000000000000000000000000000000000000000005-1.2.3.5-1502", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2900000000000000000000000000000000000000000000006-1.2.3.6-1503", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2900000000000000000000000000000000000000000000007-1.2.3.7-1504", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2800000000000000000000000000000000000000000000000-1.2.3.0-1505", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2800000000000000000000000000000000000000000000001-1.2.3.1-1506", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2800000000000000000000000000000000000000000000002-1.2.3.2-1507", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2800000000000000000000000000000000000000000000003-1.2.3.3-1508", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2800000000000000000000000000000000000000000000004-1.2.3.4-1509", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2800000000000000000000000000000000000000000000005-1.2.3.5-1510", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2800000000000000000000000000000000000000000000006-1.2.3.6-1511", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2800000000000000000000000000000000000000000000007-1.2.3.7-1512", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2a00000000000000000000000000000000000000000000000-1.2.3.0-1513", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2a00000000000000000000000000000000000000000000001-1.2.3.1-1514", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2a00000000000000000000000000000000000000000000002-1.2.3.2-1515", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2a00000000000000000000000000000000000000000000003-1.2.3.3-1516", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2a00000000000000000000000000000000000000000000004-1.2.3.4-1517", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2a00000000000000000000000000000000000000000000005-1.2.3.5-1518", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2a00000000000000000000000000000000000000000000006-1.2.3.6-1519", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2a00000000000000000000000000000000000000000000007-1.2.3.7-1520", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2c00000000000000000000000000000000000000000000000-1.2.3.0-1521", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2c00000000000000000000000000000000000000000000001-1.2.3.1-1522", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2c00000000000000000000000000000000000000000000002-1.2.3.2-1523", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2c00000000000000000000000000000000000000000000003-1.2.3.3-1524", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2c00000000000000000000000000000000000000000000004-1.2.3.4-1525", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2c00000000000000000000000000000000000000000000005-1.2.3.5-1526", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2c00000000000000000000000000000000000000000000006-1.2.3.6-1527", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2c00000000000000000000000000000000000000000000007-1.2.3.7-1528", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2000000000000000000000000000000000000000000000000-1.2.3.0-1529", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2000000000000000000000000000000000000000000000001-1.2.3.1-1530", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2000000000000000000000000000000000000000000000002-1.2.3.2-1531", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2000000000000000000000000000000000000000000000003-1.2.3.3-1532", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2000000000000000000000000000000000000000000000004-1.2.3.4-1533", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2000000000000000000000000000000000000000000000005-1.2.3.5-1534", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2000000000000000000000000000000000000000000000006-1.2.3.6-1535", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a2000000000000000000000000000000000000000000000007-1.2.3.7-1536", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a3000000000000000000000000000000000000000000000000-1.2.3.0-1537", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a3000000000000000000000000000000000000000000000001-1.2.3.1-1538", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a3000000000000000000000000000000000000000000000002-1.2.3.2-1539", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a3000000000000000000000000000000000000000000000003-1.2.3.3-1540", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a3000000000000000000000000000000000000000000000004-1.2.3.4-1541", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a3000000000000000000000000000000000000000000000005-1.2.3.5-1542", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a3000000000000000000000000000000000000000000000006-1.2.3.6-1543", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a3000000000000000000000000000000000000000000000007-1.2.3.7-1544", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a0000000000000000000000000000000000000000000000000-1.2.3.0-1545", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a0000000000000000000000000000000000000000000000001-1.2.3.1-1546", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a0000000000000000000000000000000000000000000000002-1.2.3.2-1547", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a0000000000000000000000000000000000000000000000003-1.2.3.3-1548", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a0000000000000000000000000000000000000000000000004-1.2.3.4-1549", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a0000000000000000000000000000000000000000000000005-1.2.3.5-1550", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a0000000000000000000000000000000000000000000000006-1.2.3.6-1551", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a0000000000000000000000000000000000000000000000007-1.2.3.7-1552", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a4000000000000000000000000000000000000000000000000-1.2.3.0-1553", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a4000000000000000000000000000000000000000000000001-1.2.3.1-1554", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a4000000000000000000000000000000000000000000000002-1.2.3.2-1555", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a4000000000000000000000000000000000000000000000003-1.2.3.3-1556", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a4000000000000000000000000000000000000000000000004-1.2.3.4-1557", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a4000000000000000000000000000000000000000000000005-1.2.3.5-1558", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a4000000000000000000000000000000000000000000000006-1.2.3.6-1559", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a4000000000000000000000000000000000000000000000007-1.2.3.7-1560", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a8000000000000000000000000000000000000000000000000-1.2.3.0-1561", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a8000000000000000000000000000000000000000000000001-1.2.3.1-1562", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a8000000000000000000000000000000000000000000000002-1.2.3.2-1563", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a8000000000000000000000000000000000000000000000003-1.2.3.3-1564", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a8000000000000000000000000000000000000000000000004-1.2.3.4-1565", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a8000000000000000000000000000000000000000000000005-1.2.3.5-1566", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a8000000000000000000000000000000000000000000000006-1.2.3.6-1567", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91a8000000000000000000000000000000000000000000000007-1.2.3.7-1568", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91b0000000000000000000000000000000000000000000000000-1.2.3.0-1569", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91b0000000000000000000000000000000000000000000000001-1.2.3.1-1570", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91b0000000000000000000000000000000000000000000000002-1.2.3.2-1571", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91b0000000000000000000000000000000000000000000000003-1.2.3.3-1572", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91b0000000000000000000000000000000000000000000000004-1.2.3.4-1573", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91b0000000000000000000000000000000000000000000000005-1.2.3.5-1574", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91b0000000000000000000000000000000000000000000000006-1.2.3.6-1575", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91b0000000000000000000000000000000000000000000000007-1.2.3.7-1576", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9180000000000000000000000000000000000000000000000000-1.2.3.0-1577", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9180000000000000000000000000000000000000000000000001-1.2.3.1-1578", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9180000000000000000000000000000000000000000000000002-1.2.3.2-1579", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9180000000000000000000000000000000000000000000000003-1.2.3.3-1580", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9180000000000000000000000000000000000000000000000004-1.2.3.4-1581", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9180000000000000000000000000000000000000000000000005-1.2.3.5-1582", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9180000000000000000000000000000000000000000000000006-1.2.3.6-1583", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9180000000000000000000000000000000000000000000000007-1.2.3.7-1584", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91c0000000000000000000000000000000000000000000000000-1.2.3.0-1585", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91c0000000000000000000000000000000000000000000000001-1.2.3.1-1586", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91c0000000000000000000000000000000000000000000000002-1.2.3.2-1587", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91c0000000000000000000000000000000000000000000000003-1.2.3.3-1588", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91c0000000000000000000000000000000000000000000000004-1.2.3.4-1589", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91c0000000000000000000000000000000000000000000000005-1.2.3.5-1590", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91c0000000000000000000000000000000000000000000000006-1.2.3.6-1591", - "1c8aff71b99462464d9eeac639595ab99664be3482cb91c0000000000000000000000000000000000000000000000007-1.2.3.7-1592", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9100000000000000000000000000000000000000000000000000-1.2.3.0-1593", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9100000000000000000000000000000000000000000000000001-1.2.3.1-1594", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9100000000000000000000000000000000000000000000000002-1.2.3.2-1595", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9100000000000000000000000000000000000000000000000003-1.2.3.3-1596", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9100000000000000000000000000000000000000000000000004-1.2.3.4-1597", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9100000000000000000000000000000000000000000000000005-1.2.3.5-1598", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9100000000000000000000000000000000000000000000000006-1.2.3.6-1599", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9100000000000000000000000000000000000000000000000007-1.2.3.7-1600", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9000000000000000000000000000000000000000000000000000-1.2.3.0-1601", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9000000000000000000000000000000000000000000000000001-1.2.3.1-1602", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9000000000000000000000000000000000000000000000000002-1.2.3.2-1603", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9000000000000000000000000000000000000000000000000003-1.2.3.3-1604", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9000000000000000000000000000000000000000000000000004-1.2.3.4-1605", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9000000000000000000000000000000000000000000000000005-1.2.3.5-1606", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9000000000000000000000000000000000000000000000000006-1.2.3.6-1607", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9000000000000000000000000000000000000000000000000007-1.2.3.7-1608", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9200000000000000000000000000000000000000000000000000-1.2.3.0-1609", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9200000000000000000000000000000000000000000000000001-1.2.3.1-1610", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9200000000000000000000000000000000000000000000000002-1.2.3.2-1611", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9200000000000000000000000000000000000000000000000003-1.2.3.3-1612", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9200000000000000000000000000000000000000000000000004-1.2.3.4-1613", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9200000000000000000000000000000000000000000000000005-1.2.3.5-1614", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9200000000000000000000000000000000000000000000000006-1.2.3.6-1615", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9200000000000000000000000000000000000000000000000007-1.2.3.7-1616", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9400000000000000000000000000000000000000000000000000-1.2.3.0-1617", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9400000000000000000000000000000000000000000000000001-1.2.3.1-1618", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9400000000000000000000000000000000000000000000000002-1.2.3.2-1619", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9400000000000000000000000000000000000000000000000003-1.2.3.3-1620", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9400000000000000000000000000000000000000000000000004-1.2.3.4-1621", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9400000000000000000000000000000000000000000000000005-1.2.3.5-1622", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9400000000000000000000000000000000000000000000000006-1.2.3.6-1623", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9400000000000000000000000000000000000000000000000007-1.2.3.7-1624", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9800000000000000000000000000000000000000000000000000-1.2.3.0-1625", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9800000000000000000000000000000000000000000000000001-1.2.3.1-1626", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9800000000000000000000000000000000000000000000000002-1.2.3.2-1627", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9800000000000000000000000000000000000000000000000003-1.2.3.3-1628", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9800000000000000000000000000000000000000000000000004-1.2.3.4-1629", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9800000000000000000000000000000000000000000000000005-1.2.3.5-1630", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9800000000000000000000000000000000000000000000000006-1.2.3.6-1631", - "1c8aff71b99462464d9eeac639595ab99664be3482cb9800000000000000000000000000000000000000000000000007-1.2.3.7-1632", - "1c8aff71b99462464d9eeac639595ab99664be3482cb8000000000000000000000000000000000000000000000000000-1.2.3.0-1633", - "1c8aff71b99462464d9eeac639595ab99664be3482cb8000000000000000000000000000000000000000000000000001-1.2.3.1-1634", - "1c8aff71b99462464d9eeac639595ab99664be3482cb8000000000000000000000000000000000000000000000000002-1.2.3.2-1635", - "1c8aff71b99462464d9eeac639595ab99664be3482cb8000000000000000000000000000000000000000000000000003-1.2.3.3-1636", - "1c8aff71b99462464d9eeac639595ab99664be3482cb8000000000000000000000000000000000000000000000000004-1.2.3.4-1637", - "1c8aff71b99462464d9eeac639595ab99664be3482cb8000000000000000000000000000000000000000000000000005-1.2.3.5-1638", - "1c8aff71b99462464d9eeac639595ab99664be3482cb8000000000000000000000000000000000000000000000000006-1.2.3.6-1639", - "1c8aff71b99462464d9eeac639595ab99664be3482cb8000000000000000000000000000000000000000000000000007-1.2.3.7-1640", - "1c8aff71b99462464d9eeac639595ab99664be3482cba000000000000000000000000000000000000000000000000000-1.2.3.0-1641", - "1c8aff71b99462464d9eeac639595ab99664be3482cba000000000000000000000000000000000000000000000000001-1.2.3.1-1642", - "1c8aff71b99462464d9eeac639595ab99664be3482cba000000000000000000000000000000000000000000000000002-1.2.3.2-1643", - "1c8aff71b99462464d9eeac639595ab99664be3482cba000000000000000000000000000000000000000000000000003-1.2.3.3-1644", - "1c8aff71b99462464d9eeac639595ab99664be3482cba000000000000000000000000000000000000000000000000004-1.2.3.4-1645", - "1c8aff71b99462464d9eeac639595ab99664be3482cba000000000000000000000000000000000000000000000000005-1.2.3.5-1646", - "1c8aff71b99462464d9eeac639595ab99664be3482cba000000000000000000000000000000000000000000000000006-1.2.3.6-1647", - "1c8aff71b99462464d9eeac639595ab99664be3482cba000000000000000000000000000000000000000000000000007-1.2.3.7-1648", - "1c8aff71b99462464d9eeac639595ab99664be3482cbc000000000000000000000000000000000000000000000000000-1.2.3.0-1649", - "1c8aff71b99462464d9eeac639595ab99664be3482cbc000000000000000000000000000000000000000000000000001-1.2.3.1-1650", - "1c8aff71b99462464d9eeac639595ab99664be3482cbc000000000000000000000000000000000000000000000000002-1.2.3.2-1651", - "1c8aff71b99462464d9eeac639595ab99664be3482cbc000000000000000000000000000000000000000000000000003-1.2.3.3-1652", - "1c8aff71b99462464d9eeac639595ab99664be3482cbc000000000000000000000000000000000000000000000000004-1.2.3.4-1653", - "1c8aff71b99462464d9eeac639595ab99664be3482cbc000000000000000000000000000000000000000000000000005-1.2.3.5-1654", - "1c8aff71b99462464d9eeac639595ab99664be3482cbc000000000000000000000000000000000000000000000000006-1.2.3.6-1655", - "1c8aff71b99462464d9eeac639595ab99664be3482cbc000000000000000000000000000000000000000000000000007-1.2.3.7-1656", - "1c8aff71b99462464d9eeac639595ab99664be3482cb0000000000000000000000000000000000000000000000000000-1.2.3.0-1657", - "1c8aff71b99462464d9eeac639595ab99664be3482cb0000000000000000000000000000000000000000000000000001-1.2.3.1-1658", - "1c8aff71b99462464d9eeac639595ab99664be3482cb0000000000000000000000000000000000000000000000000002-1.2.3.2-1659", - "1c8aff71b99462464d9eeac639595ab99664be3482cb0000000000000000000000000000000000000000000000000003-1.2.3.3-1660", - "1c8aff71b99462464d9eeac639595ab99664be3482cb0000000000000000000000000000000000000000000000000004-1.2.3.4-1661", - "1c8aff71b99462464d9eeac639595ab99664be3482cb0000000000000000000000000000000000000000000000000005-1.2.3.5-1662", - "1c8aff71b99462464d9eeac639595ab99664be3482cb0000000000000000000000000000000000000000000000000006-1.2.3.6-1663", - "1c8aff71b99462464d9eeac639595ab99664be3482cb0000000000000000000000000000000000000000000000000007-1.2.3.7-1664", - "1c8aff71b99462464d9eeac639595ab99664be3482ca0000000000000000000000000000000000000000000000000000-1.2.3.0-1665", - "1c8aff71b99462464d9eeac639595ab99664be3482ca0000000000000000000000000000000000000000000000000001-1.2.3.1-1666", - "1c8aff71b99462464d9eeac639595ab99664be3482ca0000000000000000000000000000000000000000000000000002-1.2.3.2-1667", - "1c8aff71b99462464d9eeac639595ab99664be3482ca0000000000000000000000000000000000000000000000000003-1.2.3.3-1668", - "1c8aff71b99462464d9eeac639595ab99664be3482ca0000000000000000000000000000000000000000000000000004-1.2.3.4-1669", - "1c8aff71b99462464d9eeac639595ab99664be3482ca0000000000000000000000000000000000000000000000000005-1.2.3.5-1670", - "1c8aff71b99462464d9eeac639595ab99664be3482ca0000000000000000000000000000000000000000000000000006-1.2.3.6-1671", - "1c8aff71b99462464d9eeac639595ab99664be3482ca0000000000000000000000000000000000000000000000000007-1.2.3.7-1672", - "1c8aff71b99462464d9eeac639595ab99664be3482c80000000000000000000000000000000000000000000000000000-1.2.3.0-1673", - "1c8aff71b99462464d9eeac639595ab99664be3482c80000000000000000000000000000000000000000000000000001-1.2.3.1-1674", - "1c8aff71b99462464d9eeac639595ab99664be3482c80000000000000000000000000000000000000000000000000002-1.2.3.2-1675", - "1c8aff71b99462464d9eeac639595ab99664be3482c80000000000000000000000000000000000000000000000000003-1.2.3.3-1676", - "1c8aff71b99462464d9eeac639595ab99664be3482c80000000000000000000000000000000000000000000000000004-1.2.3.4-1677", - "1c8aff71b99462464d9eeac639595ab99664be3482c80000000000000000000000000000000000000000000000000005-1.2.3.5-1678", - "1c8aff71b99462464d9eeac639595ab99664be3482c80000000000000000000000000000000000000000000000000006-1.2.3.6-1679", - "1c8aff71b99462464d9eeac639595ab99664be3482c80000000000000000000000000000000000000000000000000007-1.2.3.7-1680", - "1c8aff71b99462464d9eeac639595ab99664be3482cc0000000000000000000000000000000000000000000000000000-1.2.3.0-1681", - "1c8aff71b99462464d9eeac639595ab99664be3482cc0000000000000000000000000000000000000000000000000001-1.2.3.1-1682", - "1c8aff71b99462464d9eeac639595ab99664be3482cc0000000000000000000000000000000000000000000000000002-1.2.3.2-1683", - "1c8aff71b99462464d9eeac639595ab99664be3482cc0000000000000000000000000000000000000000000000000003-1.2.3.3-1684", - "1c8aff71b99462464d9eeac639595ab99664be3482cc0000000000000000000000000000000000000000000000000004-1.2.3.4-1685", - "1c8aff71b99462464d9eeac639595ab99664be3482cc0000000000000000000000000000000000000000000000000005-1.2.3.5-1686", - "1c8aff71b99462464d9eeac639595ab99664be3482cc0000000000000000000000000000000000000000000000000006-1.2.3.6-1687", - "1c8aff71b99462464d9eeac639595ab99664be3482cc0000000000000000000000000000000000000000000000000007-1.2.3.7-1688", - "1c8aff71b99462464d9eeac639595ab99664be3482c00000000000000000000000000000000000000000000000000000-1.2.3.0-1689", - "1c8aff71b99462464d9eeac639595ab99664be3482c00000000000000000000000000000000000000000000000000001-1.2.3.1-1690", - "1c8aff71b99462464d9eeac639595ab99664be3482c00000000000000000000000000000000000000000000000000002-1.2.3.2-1691", - "1c8aff71b99462464d9eeac639595ab99664be3482c00000000000000000000000000000000000000000000000000003-1.2.3.3-1692", - "1c8aff71b99462464d9eeac639595ab99664be3482c00000000000000000000000000000000000000000000000000004-1.2.3.4-1693", - "1c8aff71b99462464d9eeac639595ab99664be3482c00000000000000000000000000000000000000000000000000005-1.2.3.5-1694", - "1c8aff71b99462464d9eeac639595ab99664be3482c00000000000000000000000000000000000000000000000000006-1.2.3.6-1695", - "1c8aff71b99462464d9eeac639595ab99664be3482c00000000000000000000000000000000000000000000000000007-1.2.3.7-1696", - "1c8aff71b99462464d9eeac639595ab99664be3482d00000000000000000000000000000000000000000000000000000-1.2.3.0-1697", - "1c8aff71b99462464d9eeac639595ab99664be3482d00000000000000000000000000000000000000000000000000001-1.2.3.1-1698", - "1c8aff71b99462464d9eeac639595ab99664be3482d00000000000000000000000000000000000000000000000000002-1.2.3.2-1699", - "1c8aff71b99462464d9eeac639595ab99664be3482d00000000000000000000000000000000000000000000000000003-1.2.3.3-1700", - "1c8aff71b99462464d9eeac639595ab99664be3482d00000000000000000000000000000000000000000000000000004-1.2.3.4-1701", - "1c8aff71b99462464d9eeac639595ab99664be3482d00000000000000000000000000000000000000000000000000005-1.2.3.5-1702", - "1c8aff71b99462464d9eeac639595ab99664be3482d00000000000000000000000000000000000000000000000000006-1.2.3.6-1703", - "1c8aff71b99462464d9eeac639595ab99664be3482d00000000000000000000000000000000000000000000000000007-1.2.3.7-1704", - "1c8aff71b99462464d9eeac639595ab99664be3482e00000000000000000000000000000000000000000000000000000-1.2.3.0-1705", - "1c8aff71b99462464d9eeac639595ab99664be3482e00000000000000000000000000000000000000000000000000001-1.2.3.1-1706", - "1c8aff71b99462464d9eeac639595ab99664be3482e00000000000000000000000000000000000000000000000000002-1.2.3.2-1707", - "1c8aff71b99462464d9eeac639595ab99664be3482e00000000000000000000000000000000000000000000000000003-1.2.3.3-1708", - "1c8aff71b99462464d9eeac639595ab99664be3482e00000000000000000000000000000000000000000000000000004-1.2.3.4-1709", - "1c8aff71b99462464d9eeac639595ab99664be3482e00000000000000000000000000000000000000000000000000005-1.2.3.5-1710", - "1c8aff71b99462464d9eeac639595ab99664be3482e00000000000000000000000000000000000000000000000000006-1.2.3.6-1711", - "1c8aff71b99462464d9eeac639595ab99664be3482e00000000000000000000000000000000000000000000000000007-1.2.3.7-1712", - "1c8aff71b99462464d9eeac639595ab99664be3482800000000000000000000000000000000000000000000000000000-1.2.3.0-1713", - "1c8aff71b99462464d9eeac639595ab99664be3482800000000000000000000000000000000000000000000000000001-1.2.3.1-1714", - "1c8aff71b99462464d9eeac639595ab99664be3482800000000000000000000000000000000000000000000000000002-1.2.3.2-1715", - "1c8aff71b99462464d9eeac639595ab99664be3482800000000000000000000000000000000000000000000000000003-1.2.3.3-1716", - "1c8aff71b99462464d9eeac639595ab99664be3482800000000000000000000000000000000000000000000000000004-1.2.3.4-1717", - "1c8aff71b99462464d9eeac639595ab99664be3482800000000000000000000000000000000000000000000000000005-1.2.3.5-1718", - "1c8aff71b99462464d9eeac639595ab99664be3482800000000000000000000000000000000000000000000000000006-1.2.3.6-1719", - "1c8aff71b99462464d9eeac639595ab99664be3482800000000000000000000000000000000000000000000000000007-1.2.3.7-1720", - "1c8aff71b99462464d9eeac639595ab99664be3482000000000000000000000000000000000000000000000000000000-1.2.3.0-1721", - "1c8aff71b99462464d9eeac639595ab99664be3482000000000000000000000000000000000000000000000000000001-1.2.3.1-1722", - "1c8aff71b99462464d9eeac639595ab99664be3482000000000000000000000000000000000000000000000000000002-1.2.3.2-1723", - "1c8aff71b99462464d9eeac639595ab99664be3482000000000000000000000000000000000000000000000000000003-1.2.3.3-1724", - "1c8aff71b99462464d9eeac639595ab99664be3482000000000000000000000000000000000000000000000000000004-1.2.3.4-1725", - "1c8aff71b99462464d9eeac639595ab99664be3482000000000000000000000000000000000000000000000000000005-1.2.3.5-1726", - "1c8aff71b99462464d9eeac639595ab99664be3482000000000000000000000000000000000000000000000000000006-1.2.3.6-1727", - "1c8aff71b99462464d9eeac639595ab99664be3482000000000000000000000000000000000000000000000000000007-1.2.3.7-1728", - "1c8aff71b99462464d9eeac639595ab99664be3483000000000000000000000000000000000000000000000000000000-1.2.3.0-1729", - "1c8aff71b99462464d9eeac639595ab99664be3483000000000000000000000000000000000000000000000000000001-1.2.3.1-1730", - "1c8aff71b99462464d9eeac639595ab99664be3483000000000000000000000000000000000000000000000000000002-1.2.3.2-1731", - "1c8aff71b99462464d9eeac639595ab99664be3483000000000000000000000000000000000000000000000000000003-1.2.3.3-1732", - "1c8aff71b99462464d9eeac639595ab99664be3483000000000000000000000000000000000000000000000000000004-1.2.3.4-1733", - "1c8aff71b99462464d9eeac639595ab99664be3483000000000000000000000000000000000000000000000000000005-1.2.3.5-1734", - "1c8aff71b99462464d9eeac639595ab99664be3483000000000000000000000000000000000000000000000000000006-1.2.3.6-1735", - "1c8aff71b99462464d9eeac639595ab99664be3483000000000000000000000000000000000000000000000000000007-1.2.3.7-1736", - "1c8aff71b99462464d9eeac639595ab99664be3480000000000000000000000000000000000000000000000000000000-1.2.3.0-1737", - "1c8aff71b99462464d9eeac639595ab99664be3480000000000000000000000000000000000000000000000000000001-1.2.3.1-1738", - "1c8aff71b99462464d9eeac639595ab99664be3480000000000000000000000000000000000000000000000000000002-1.2.3.2-1739", - "1c8aff71b99462464d9eeac639595ab99664be3480000000000000000000000000000000000000000000000000000003-1.2.3.3-1740", - "1c8aff71b99462464d9eeac639595ab99664be3480000000000000000000000000000000000000000000000000000004-1.2.3.4-1741", - "1c8aff71b99462464d9eeac639595ab99664be3480000000000000000000000000000000000000000000000000000005-1.2.3.5-1742", - "1c8aff71b99462464d9eeac639595ab99664be3480000000000000000000000000000000000000000000000000000006-1.2.3.6-1743", - "1c8aff71b99462464d9eeac639595ab99664be3480000000000000000000000000000000000000000000000000000007-1.2.3.7-1744", - "1c8aff71b99462464d9eeac639595ab99664be3484000000000000000000000000000000000000000000000000000000-1.2.3.0-1745", - "1c8aff71b99462464d9eeac639595ab99664be3484000000000000000000000000000000000000000000000000000001-1.2.3.1-1746", - "1c8aff71b99462464d9eeac639595ab99664be3484000000000000000000000000000000000000000000000000000002-1.2.3.2-1747", - "1c8aff71b99462464d9eeac639595ab99664be3484000000000000000000000000000000000000000000000000000003-1.2.3.3-1748", - "1c8aff71b99462464d9eeac639595ab99664be3484000000000000000000000000000000000000000000000000000004-1.2.3.4-1749", - "1c8aff71b99462464d9eeac639595ab99664be3484000000000000000000000000000000000000000000000000000005-1.2.3.5-1750", - "1c8aff71b99462464d9eeac639595ab99664be3484000000000000000000000000000000000000000000000000000006-1.2.3.6-1751", - "1c8aff71b99462464d9eeac639595ab99664be3484000000000000000000000000000000000000000000000000000007-1.2.3.7-1752", - "1c8aff71b99462464d9eeac639595ab99664be3488000000000000000000000000000000000000000000000000000000-1.2.3.0-1753", - "1c8aff71b99462464d9eeac639595ab99664be3488000000000000000000000000000000000000000000000000000001-1.2.3.1-1754", - "1c8aff71b99462464d9eeac639595ab99664be3488000000000000000000000000000000000000000000000000000002-1.2.3.2-1755", - "1c8aff71b99462464d9eeac639595ab99664be3488000000000000000000000000000000000000000000000000000003-1.2.3.3-1756", - "1c8aff71b99462464d9eeac639595ab99664be3488000000000000000000000000000000000000000000000000000004-1.2.3.4-1757", - "1c8aff71b99462464d9eeac639595ab99664be3488000000000000000000000000000000000000000000000000000005-1.2.3.5-1758", - "1c8aff71b99462464d9eeac639595ab99664be3488000000000000000000000000000000000000000000000000000006-1.2.3.6-1759", - "1c8aff71b99462464d9eeac639595ab99664be3488000000000000000000000000000000000000000000000000000007-1.2.3.7-1760", - "1c8aff71b99462464d9eeac639595ab99664be3490000000000000000000000000000000000000000000000000000000-1.2.3.0-1761", - "1c8aff71b99462464d9eeac639595ab99664be3490000000000000000000000000000000000000000000000000000001-1.2.3.1-1762", - "1c8aff71b99462464d9eeac639595ab99664be3490000000000000000000000000000000000000000000000000000002-1.2.3.2-1763", - "1c8aff71b99462464d9eeac639595ab99664be3490000000000000000000000000000000000000000000000000000003-1.2.3.3-1764", - "1c8aff71b99462464d9eeac639595ab99664be3490000000000000000000000000000000000000000000000000000004-1.2.3.4-1765", - "1c8aff71b99462464d9eeac639595ab99664be3490000000000000000000000000000000000000000000000000000005-1.2.3.5-1766", - "1c8aff71b99462464d9eeac639595ab99664be3490000000000000000000000000000000000000000000000000000006-1.2.3.6-1767", - "1c8aff71b99462464d9eeac639595ab99664be3490000000000000000000000000000000000000000000000000000007-1.2.3.7-1768", - "1c8aff71b99462464d9eeac639595ab99664be34a0000000000000000000000000000000000000000000000000000000-1.2.3.0-1769", - "1c8aff71b99462464d9eeac639595ab99664be34a0000000000000000000000000000000000000000000000000000001-1.2.3.1-1770", - "1c8aff71b99462464d9eeac639595ab99664be34a0000000000000000000000000000000000000000000000000000002-1.2.3.2-1771", - "1c8aff71b99462464d9eeac639595ab99664be34a0000000000000000000000000000000000000000000000000000003-1.2.3.3-1772", - "1c8aff71b99462464d9eeac639595ab99664be34a0000000000000000000000000000000000000000000000000000004-1.2.3.4-1773", - "1c8aff71b99462464d9eeac639595ab99664be34a0000000000000000000000000000000000000000000000000000005-1.2.3.5-1774", - "1c8aff71b99462464d9eeac639595ab99664be34a0000000000000000000000000000000000000000000000000000006-1.2.3.6-1775", - "1c8aff71b99462464d9eeac639595ab99664be34a0000000000000000000000000000000000000000000000000000007-1.2.3.7-1776", - "1c8aff71b99462464d9eeac639595ab99664be34c0000000000000000000000000000000000000000000000000000000-1.2.3.0-1777", - "1c8aff71b99462464d9eeac639595ab99664be34c0000000000000000000000000000000000000000000000000000001-1.2.3.1-1778", - "1c8aff71b99462464d9eeac639595ab99664be34c0000000000000000000000000000000000000000000000000000002-1.2.3.2-1779", - "1c8aff71b99462464d9eeac639595ab99664be34c0000000000000000000000000000000000000000000000000000003-1.2.3.3-1780", - "1c8aff71b99462464d9eeac639595ab99664be34c0000000000000000000000000000000000000000000000000000004-1.2.3.4-1781", - "1c8aff71b99462464d9eeac639595ab99664be34c0000000000000000000000000000000000000000000000000000005-1.2.3.5-1782", - "1c8aff71b99462464d9eeac639595ab99664be34c0000000000000000000000000000000000000000000000000000006-1.2.3.6-1783", - "1c8aff71b99462464d9eeac639595ab99664be34c0000000000000000000000000000000000000000000000000000007-1.2.3.7-1784", - "1c8aff71b99462464d9eeac639595ab99664be3400000000000000000000000000000000000000000000000000000000-1.2.3.0-1785", - "1c8aff71b99462464d9eeac639595ab99664be3400000000000000000000000000000000000000000000000000000001-1.2.3.1-1786", - "1c8aff71b99462464d9eeac639595ab99664be3400000000000000000000000000000000000000000000000000000002-1.2.3.2-1787", - "1c8aff71b99462464d9eeac639595ab99664be3400000000000000000000000000000000000000000000000000000003-1.2.3.3-1788", - "1c8aff71b99462464d9eeac639595ab99664be3400000000000000000000000000000000000000000000000000000004-1.2.3.4-1789", - "1c8aff71b99462464d9eeac639595ab99664be3400000000000000000000000000000000000000000000000000000005-1.2.3.5-1790", - "1c8aff71b99462464d9eeac639595ab99664be3400000000000000000000000000000000000000000000000000000006-1.2.3.6-1791", - "1c8aff71b99462464d9eeac639595ab99664be3400000000000000000000000000000000000000000000000000000007-1.2.3.7-1792", - "1c8aff71b99462464d9eeac639595ab99664be3500000000000000000000000000000000000000000000000000000000-1.2.3.0-1793", - "1c8aff71b99462464d9eeac639595ab99664be3500000000000000000000000000000000000000000000000000000001-1.2.3.1-1794", - "1c8aff71b99462464d9eeac639595ab99664be3500000000000000000000000000000000000000000000000000000002-1.2.3.2-1795", - "1c8aff71b99462464d9eeac639595ab99664be3500000000000000000000000000000000000000000000000000000003-1.2.3.3-1796", - "1c8aff71b99462464d9eeac639595ab99664be3500000000000000000000000000000000000000000000000000000004-1.2.3.4-1797", - "1c8aff71b99462464d9eeac639595ab99664be3500000000000000000000000000000000000000000000000000000005-1.2.3.5-1798", - "1c8aff71b99462464d9eeac639595ab99664be3500000000000000000000000000000000000000000000000000000006-1.2.3.6-1799", - "1c8aff71b99462464d9eeac639595ab99664be3500000000000000000000000000000000000000000000000000000007-1.2.3.7-1800", - "1c8aff71b99462464d9eeac639595ab99664be3600000000000000000000000000000000000000000000000000000000-1.2.3.0-1801", - "1c8aff71b99462464d9eeac639595ab99664be3600000000000000000000000000000000000000000000000000000001-1.2.3.1-1802", - "1c8aff71b99462464d9eeac639595ab99664be3600000000000000000000000000000000000000000000000000000002-1.2.3.2-1803", - "1c8aff71b99462464d9eeac639595ab99664be3600000000000000000000000000000000000000000000000000000003-1.2.3.3-1804", - "1c8aff71b99462464d9eeac639595ab99664be3600000000000000000000000000000000000000000000000000000004-1.2.3.4-1805", - "1c8aff71b99462464d9eeac639595ab99664be3600000000000000000000000000000000000000000000000000000005-1.2.3.5-1806", - "1c8aff71b99462464d9eeac639595ab99664be3600000000000000000000000000000000000000000000000000000006-1.2.3.6-1807", - "1c8aff71b99462464d9eeac639595ab99664be3600000000000000000000000000000000000000000000000000000007-1.2.3.7-1808", - "1c8aff71b99462464d9eeac639595ab99664be3000000000000000000000000000000000000000000000000000000000-1.2.3.0-1809", - "1c8aff71b99462464d9eeac639595ab99664be3000000000000000000000000000000000000000000000000000000001-1.2.3.1-1810", - "1c8aff71b99462464d9eeac639595ab99664be3000000000000000000000000000000000000000000000000000000002-1.2.3.2-1811", - "1c8aff71b99462464d9eeac639595ab99664be3000000000000000000000000000000000000000000000000000000003-1.2.3.3-1812", - "1c8aff71b99462464d9eeac639595ab99664be3000000000000000000000000000000000000000000000000000000004-1.2.3.4-1813", - "1c8aff71b99462464d9eeac639595ab99664be3000000000000000000000000000000000000000000000000000000005-1.2.3.5-1814", - "1c8aff71b99462464d9eeac639595ab99664be3000000000000000000000000000000000000000000000000000000006-1.2.3.6-1815", - "1c8aff71b99462464d9eeac639595ab99664be3000000000000000000000000000000000000000000000000000000007-1.2.3.7-1816", - "1c8aff71b99462464d9eeac639595ab99664be3800000000000000000000000000000000000000000000000000000000-1.2.3.0-1817", - "1c8aff71b99462464d9eeac639595ab99664be3800000000000000000000000000000000000000000000000000000001-1.2.3.1-1818", - "1c8aff71b99462464d9eeac639595ab99664be3800000000000000000000000000000000000000000000000000000002-1.2.3.2-1819", - "1c8aff71b99462464d9eeac639595ab99664be3800000000000000000000000000000000000000000000000000000003-1.2.3.3-1820", - "1c8aff71b99462464d9eeac639595ab99664be3800000000000000000000000000000000000000000000000000000004-1.2.3.4-1821", - "1c8aff71b99462464d9eeac639595ab99664be3800000000000000000000000000000000000000000000000000000005-1.2.3.5-1822", - "1c8aff71b99462464d9eeac639595ab99664be3800000000000000000000000000000000000000000000000000000006-1.2.3.6-1823", - "1c8aff71b99462464d9eeac639595ab99664be3800000000000000000000000000000000000000000000000000000007-1.2.3.7-1824", - "1c8aff71b99462464d9eeac639595ab99664be2000000000000000000000000000000000000000000000000000000000-1.2.3.0-1825", - "1c8aff71b99462464d9eeac639595ab99664be2000000000000000000000000000000000000000000000000000000001-1.2.3.1-1826", - "1c8aff71b99462464d9eeac639595ab99664be2000000000000000000000000000000000000000000000000000000002-1.2.3.2-1827", - "1c8aff71b99462464d9eeac639595ab99664be2000000000000000000000000000000000000000000000000000000003-1.2.3.3-1828", - "1c8aff71b99462464d9eeac639595ab99664be2000000000000000000000000000000000000000000000000000000004-1.2.3.4-1829", - "1c8aff71b99462464d9eeac639595ab99664be2000000000000000000000000000000000000000000000000000000005-1.2.3.5-1830", - "1c8aff71b99462464d9eeac639595ab99664be2000000000000000000000000000000000000000000000000000000006-1.2.3.6-1831", - "1c8aff71b99462464d9eeac639595ab99664be2000000000000000000000000000000000000000000000000000000007-1.2.3.7-1832", - "1c8aff71b99462464d9eeac639595ab99664be0000000000000000000000000000000000000000000000000000000000-1.2.3.0-1833", - "1c8aff71b99462464d9eeac639595ab99664be0000000000000000000000000000000000000000000000000000000001-1.2.3.1-1834", - "1c8aff71b99462464d9eeac639595ab99664be0000000000000000000000000000000000000000000000000000000002-1.2.3.2-1835", - "1c8aff71b99462464d9eeac639595ab99664be0000000000000000000000000000000000000000000000000000000003-1.2.3.3-1836", - "1c8aff71b99462464d9eeac639595ab99664be0000000000000000000000000000000000000000000000000000000004-1.2.3.4-1837", - "1c8aff71b99462464d9eeac639595ab99664be0000000000000000000000000000000000000000000000000000000005-1.2.3.5-1838", - "1c8aff71b99462464d9eeac639595ab99664be0000000000000000000000000000000000000000000000000000000006-1.2.3.6-1839", - "1c8aff71b99462464d9eeac639595ab99664be0000000000000000000000000000000000000000000000000000000007-1.2.3.7-1840", - "1c8aff71b99462464d9eeac639595ab99664be4000000000000000000000000000000000000000000000000000000000-1.2.3.0-1841", - "1c8aff71b99462464d9eeac639595ab99664be4000000000000000000000000000000000000000000000000000000001-1.2.3.1-1842", - "1c8aff71b99462464d9eeac639595ab99664be4000000000000000000000000000000000000000000000000000000002-1.2.3.2-1843", - "1c8aff71b99462464d9eeac639595ab99664be4000000000000000000000000000000000000000000000000000000003-1.2.3.3-1844", - "1c8aff71b99462464d9eeac639595ab99664be4000000000000000000000000000000000000000000000000000000004-1.2.3.4-1845", - "1c8aff71b99462464d9eeac639595ab99664be4000000000000000000000000000000000000000000000000000000005-1.2.3.5-1846", - "1c8aff71b99462464d9eeac639595ab99664be4000000000000000000000000000000000000000000000000000000006-1.2.3.6-1847", - "1c8aff71b99462464d9eeac639595ab99664be4000000000000000000000000000000000000000000000000000000007-1.2.3.7-1848", - "1c8aff71b99462464d9eeac639595ab99664be8000000000000000000000000000000000000000000000000000000000-1.2.3.0-1849", - "1c8aff71b99462464d9eeac639595ab99664be8000000000000000000000000000000000000000000000000000000001-1.2.3.1-1850", - "1c8aff71b99462464d9eeac639595ab99664be8000000000000000000000000000000000000000000000000000000002-1.2.3.2-1851", - "1c8aff71b99462464d9eeac639595ab99664be8000000000000000000000000000000000000000000000000000000003-1.2.3.3-1852", - "1c8aff71b99462464d9eeac639595ab99664be8000000000000000000000000000000000000000000000000000000004-1.2.3.4-1853", - "1c8aff71b99462464d9eeac639595ab99664be8000000000000000000000000000000000000000000000000000000005-1.2.3.5-1854", - "1c8aff71b99462464d9eeac639595ab99664be8000000000000000000000000000000000000000000000000000000006-1.2.3.6-1855", - "1c8aff71b99462464d9eeac639595ab99664be8000000000000000000000000000000000000000000000000000000007-1.2.3.7-1856", - "1c8aff71b99462464d9eeac639595ab99664bf0000000000000000000000000000000000000000000000000000000000-1.2.3.0-1857", - "1c8aff71b99462464d9eeac639595ab99664bf0000000000000000000000000000000000000000000000000000000001-1.2.3.1-1858", - "1c8aff71b99462464d9eeac639595ab99664bf0000000000000000000000000000000000000000000000000000000002-1.2.3.2-1859", - "1c8aff71b99462464d9eeac639595ab99664bf0000000000000000000000000000000000000000000000000000000003-1.2.3.3-1860", - "1c8aff71b99462464d9eeac639595ab99664bf0000000000000000000000000000000000000000000000000000000004-1.2.3.4-1861", - "1c8aff71b99462464d9eeac639595ab99664bf0000000000000000000000000000000000000000000000000000000005-1.2.3.5-1862", - "1c8aff71b99462464d9eeac639595ab99664bf0000000000000000000000000000000000000000000000000000000006-1.2.3.6-1863", - "1c8aff71b99462464d9eeac639595ab99664bf0000000000000000000000000000000000000000000000000000000007-1.2.3.7-1864", - "1c8aff71b99462464d9eeac639595ab99664bc0000000000000000000000000000000000000000000000000000000000-1.2.3.0-1865", - "1c8aff71b99462464d9eeac639595ab99664bc0000000000000000000000000000000000000000000000000000000001-1.2.3.1-1866", - "1c8aff71b99462464d9eeac639595ab99664bc0000000000000000000000000000000000000000000000000000000002-1.2.3.2-1867", - "1c8aff71b99462464d9eeac639595ab99664bc0000000000000000000000000000000000000000000000000000000003-1.2.3.3-1868", - "1c8aff71b99462464d9eeac639595ab99664bc0000000000000000000000000000000000000000000000000000000004-1.2.3.4-1869", - "1c8aff71b99462464d9eeac639595ab99664bc0000000000000000000000000000000000000000000000000000000005-1.2.3.5-1870", - "1c8aff71b99462464d9eeac639595ab99664bc0000000000000000000000000000000000000000000000000000000006-1.2.3.6-1871", - "1c8aff71b99462464d9eeac639595ab99664bc0000000000000000000000000000000000000000000000000000000007-1.2.3.7-1872", - "1c8aff71b99462464d9eeac639595ab99664b80000000000000000000000000000000000000000000000000000000000-1.2.3.0-1873", - "1c8aff71b99462464d9eeac639595ab99664b80000000000000000000000000000000000000000000000000000000001-1.2.3.1-1874", - "1c8aff71b99462464d9eeac639595ab99664b80000000000000000000000000000000000000000000000000000000002-1.2.3.2-1875", - "1c8aff71b99462464d9eeac639595ab99664b80000000000000000000000000000000000000000000000000000000003-1.2.3.3-1876", - "1c8aff71b99462464d9eeac639595ab99664b80000000000000000000000000000000000000000000000000000000004-1.2.3.4-1877", - "1c8aff71b99462464d9eeac639595ab99664b80000000000000000000000000000000000000000000000000000000005-1.2.3.5-1878", - "1c8aff71b99462464d9eeac639595ab99664b80000000000000000000000000000000000000000000000000000000006-1.2.3.6-1879", - "1c8aff71b99462464d9eeac639595ab99664b80000000000000000000000000000000000000000000000000000000007-1.2.3.7-1880", - "1c8aff71b99462464d9eeac639595ab99664b00000000000000000000000000000000000000000000000000000000000-1.2.3.0-1881", - "1c8aff71b99462464d9eeac639595ab99664b00000000000000000000000000000000000000000000000000000000001-1.2.3.1-1882", - "1c8aff71b99462464d9eeac639595ab99664b00000000000000000000000000000000000000000000000000000000002-1.2.3.2-1883", - "1c8aff71b99462464d9eeac639595ab99664b00000000000000000000000000000000000000000000000000000000003-1.2.3.3-1884", - "1c8aff71b99462464d9eeac639595ab99664b00000000000000000000000000000000000000000000000000000000004-1.2.3.4-1885", - "1c8aff71b99462464d9eeac639595ab99664b00000000000000000000000000000000000000000000000000000000005-1.2.3.5-1886", - "1c8aff71b99462464d9eeac639595ab99664b00000000000000000000000000000000000000000000000000000000006-1.2.3.6-1887", - "1c8aff71b99462464d9eeac639595ab99664b00000000000000000000000000000000000000000000000000000000007-1.2.3.7-1888", - "1c8aff71b99462464d9eeac639595ab99664a00000000000000000000000000000000000000000000000000000000000-1.2.3.0-1889", - "1c8aff71b99462464d9eeac639595ab99664a00000000000000000000000000000000000000000000000000000000001-1.2.3.1-1890", - "1c8aff71b99462464d9eeac639595ab99664a00000000000000000000000000000000000000000000000000000000002-1.2.3.2-1891", - "1c8aff71b99462464d9eeac639595ab99664a00000000000000000000000000000000000000000000000000000000003-1.2.3.3-1892", - "1c8aff71b99462464d9eeac639595ab99664a00000000000000000000000000000000000000000000000000000000004-1.2.3.4-1893", - "1c8aff71b99462464d9eeac639595ab99664a00000000000000000000000000000000000000000000000000000000005-1.2.3.5-1894", - "1c8aff71b99462464d9eeac639595ab99664a00000000000000000000000000000000000000000000000000000000006-1.2.3.6-1895", - "1c8aff71b99462464d9eeac639595ab99664a00000000000000000000000000000000000000000000000000000000007-1.2.3.7-1896", - "1c8aff71b99462464d9eeac639595ab99664800000000000000000000000000000000000000000000000000000000000-1.2.3.0-1897", - "1c8aff71b99462464d9eeac639595ab99664800000000000000000000000000000000000000000000000000000000001-1.2.3.1-1898", - "1c8aff71b99462464d9eeac639595ab99664800000000000000000000000000000000000000000000000000000000002-1.2.3.2-1899", - "1c8aff71b99462464d9eeac639595ab99664800000000000000000000000000000000000000000000000000000000003-1.2.3.3-1900", - "1c8aff71b99462464d9eeac639595ab99664800000000000000000000000000000000000000000000000000000000004-1.2.3.4-1901", - "1c8aff71b99462464d9eeac639595ab99664800000000000000000000000000000000000000000000000000000000005-1.2.3.5-1902", - "1c8aff71b99462464d9eeac639595ab99664800000000000000000000000000000000000000000000000000000000006-1.2.3.6-1903", - "1c8aff71b99462464d9eeac639595ab99664800000000000000000000000000000000000000000000000000000000007-1.2.3.7-1904", - "1c8aff71b99462464d9eeac639595ab99664c00000000000000000000000000000000000000000000000000000000000-1.2.3.0-1905", - "1c8aff71b99462464d9eeac639595ab99664c00000000000000000000000000000000000000000000000000000000001-1.2.3.1-1906", - "1c8aff71b99462464d9eeac639595ab99664c00000000000000000000000000000000000000000000000000000000002-1.2.3.2-1907", - "1c8aff71b99462464d9eeac639595ab99664c00000000000000000000000000000000000000000000000000000000003-1.2.3.3-1908", - "1c8aff71b99462464d9eeac639595ab99664c00000000000000000000000000000000000000000000000000000000004-1.2.3.4-1909", - "1c8aff71b99462464d9eeac639595ab99664c00000000000000000000000000000000000000000000000000000000005-1.2.3.5-1910", - "1c8aff71b99462464d9eeac639595ab99664c00000000000000000000000000000000000000000000000000000000006-1.2.3.6-1911", - "1c8aff71b99462464d9eeac639595ab99664c00000000000000000000000000000000000000000000000000000000007-1.2.3.7-1912", - "1c8aff71b99462464d9eeac639595ab99664000000000000000000000000000000000000000000000000000000000000-1.2.3.0-1913", - "1c8aff71b99462464d9eeac639595ab99664000000000000000000000000000000000000000000000000000000000001-1.2.3.1-1914", - "1c8aff71b99462464d9eeac639595ab99664000000000000000000000000000000000000000000000000000000000002-1.2.3.2-1915", - "1c8aff71b99462464d9eeac639595ab99664000000000000000000000000000000000000000000000000000000000003-1.2.3.3-1916", - "1c8aff71b99462464d9eeac639595ab99664000000000000000000000000000000000000000000000000000000000004-1.2.3.4-1917", - "1c8aff71b99462464d9eeac639595ab99664000000000000000000000000000000000000000000000000000000000005-1.2.3.5-1918", - "1c8aff71b99462464d9eeac639595ab99664000000000000000000000000000000000000000000000000000000000006-1.2.3.6-1919", - "1c8aff71b99462464d9eeac639595ab99664000000000000000000000000000000000000000000000000000000000007-1.2.3.7-1920", - "1c8aff71b99462464d9eeac639595ab99665000000000000000000000000000000000000000000000000000000000000-1.2.3.0-1921", - "1c8aff71b99462464d9eeac639595ab99665000000000000000000000000000000000000000000000000000000000001-1.2.3.1-1922", - "1c8aff71b99462464d9eeac639595ab99665000000000000000000000000000000000000000000000000000000000002-1.2.3.2-1923", - "1c8aff71b99462464d9eeac639595ab99665000000000000000000000000000000000000000000000000000000000003-1.2.3.3-1924", - "1c8aff71b99462464d9eeac639595ab99665000000000000000000000000000000000000000000000000000000000004-1.2.3.4-1925", - "1c8aff71b99462464d9eeac639595ab99665000000000000000000000000000000000000000000000000000000000005-1.2.3.5-1926", - "1c8aff71b99462464d9eeac639595ab99665000000000000000000000000000000000000000000000000000000000006-1.2.3.6-1927", - "1c8aff71b99462464d9eeac639595ab99665000000000000000000000000000000000000000000000000000000000007-1.2.3.7-1928", - "1c8aff71b99462464d9eeac639595ab99666000000000000000000000000000000000000000000000000000000000000-1.2.3.0-1929", - "1c8aff71b99462464d9eeac639595ab99666000000000000000000000000000000000000000000000000000000000001-1.2.3.1-1930", - "1c8aff71b99462464d9eeac639595ab99666000000000000000000000000000000000000000000000000000000000002-1.2.3.2-1931", - "1c8aff71b99462464d9eeac639595ab99666000000000000000000000000000000000000000000000000000000000003-1.2.3.3-1932", - "1c8aff71b99462464d9eeac639595ab99666000000000000000000000000000000000000000000000000000000000004-1.2.3.4-1933", - "1c8aff71b99462464d9eeac639595ab99666000000000000000000000000000000000000000000000000000000000005-1.2.3.5-1934", - "1c8aff71b99462464d9eeac639595ab99666000000000000000000000000000000000000000000000000000000000006-1.2.3.6-1935", - "1c8aff71b99462464d9eeac639595ab99666000000000000000000000000000000000000000000000000000000000007-1.2.3.7-1936", - "1c8aff71b99462464d9eeac639595ab99660000000000000000000000000000000000000000000000000000000000000-1.2.3.0-1937", - "1c8aff71b99462464d9eeac639595ab99660000000000000000000000000000000000000000000000000000000000001-1.2.3.1-1938", - "1c8aff71b99462464d9eeac639595ab99660000000000000000000000000000000000000000000000000000000000002-1.2.3.2-1939", - "1c8aff71b99462464d9eeac639595ab99660000000000000000000000000000000000000000000000000000000000003-1.2.3.3-1940", - "1c8aff71b99462464d9eeac639595ab99660000000000000000000000000000000000000000000000000000000000004-1.2.3.4-1941", - "1c8aff71b99462464d9eeac639595ab99660000000000000000000000000000000000000000000000000000000000005-1.2.3.5-1942", - "1c8aff71b99462464d9eeac639595ab99660000000000000000000000000000000000000000000000000000000000006-1.2.3.6-1943", - "1c8aff71b99462464d9eeac639595ab99660000000000000000000000000000000000000000000000000000000000007-1.2.3.7-1944", - "1c8aff71b99462464d9eeac639595ab99668000000000000000000000000000000000000000000000000000000000000-1.2.3.0-1945", - "1c8aff71b99462464d9eeac639595ab99668000000000000000000000000000000000000000000000000000000000001-1.2.3.1-1946", - "1c8aff71b99462464d9eeac639595ab99668000000000000000000000000000000000000000000000000000000000002-1.2.3.2-1947", - "1c8aff71b99462464d9eeac639595ab99668000000000000000000000000000000000000000000000000000000000003-1.2.3.3-1948", - "1c8aff71b99462464d9eeac639595ab99668000000000000000000000000000000000000000000000000000000000004-1.2.3.4-1949", - "1c8aff71b99462464d9eeac639595ab99668000000000000000000000000000000000000000000000000000000000005-1.2.3.5-1950", - "1c8aff71b99462464d9eeac639595ab99668000000000000000000000000000000000000000000000000000000000006-1.2.3.6-1951", - "1c8aff71b99462464d9eeac639595ab99668000000000000000000000000000000000000000000000000000000000007-1.2.3.7-1952", - "1c8aff71b99462464d9eeac639595ab99670000000000000000000000000000000000000000000000000000000000000-1.2.3.0-1953", - "1c8aff71b99462464d9eeac639595ab99670000000000000000000000000000000000000000000000000000000000001-1.2.3.1-1954", - "1c8aff71b99462464d9eeac639595ab99670000000000000000000000000000000000000000000000000000000000002-1.2.3.2-1955", - "1c8aff71b99462464d9eeac639595ab99670000000000000000000000000000000000000000000000000000000000003-1.2.3.3-1956", - "1c8aff71b99462464d9eeac639595ab99670000000000000000000000000000000000000000000000000000000000004-1.2.3.4-1957", - "1c8aff71b99462464d9eeac639595ab99670000000000000000000000000000000000000000000000000000000000005-1.2.3.5-1958", - "1c8aff71b99462464d9eeac639595ab99670000000000000000000000000000000000000000000000000000000000006-1.2.3.6-1959", - "1c8aff71b99462464d9eeac639595ab99670000000000000000000000000000000000000000000000000000000000007-1.2.3.7-1960", - "1c8aff71b99462464d9eeac639595ab99640000000000000000000000000000000000000000000000000000000000000-1.2.3.0-1961", - "1c8aff71b99462464d9eeac639595ab99640000000000000000000000000000000000000000000000000000000000001-1.2.3.1-1962", - "1c8aff71b99462464d9eeac639595ab99640000000000000000000000000000000000000000000000000000000000002-1.2.3.2-1963", - "1c8aff71b99462464d9eeac639595ab99640000000000000000000000000000000000000000000000000000000000003-1.2.3.3-1964", - "1c8aff71b99462464d9eeac639595ab99640000000000000000000000000000000000000000000000000000000000004-1.2.3.4-1965", - "1c8aff71b99462464d9eeac639595ab99640000000000000000000000000000000000000000000000000000000000005-1.2.3.5-1966", - "1c8aff71b99462464d9eeac639595ab99640000000000000000000000000000000000000000000000000000000000006-1.2.3.6-1967", - "1c8aff71b99462464d9eeac639595ab99640000000000000000000000000000000000000000000000000000000000007-1.2.3.7-1968", - "1c8aff71b99462464d9eeac639595ab99600000000000000000000000000000000000000000000000000000000000000-1.2.3.0-1969", - "1c8aff71b99462464d9eeac639595ab99600000000000000000000000000000000000000000000000000000000000001-1.2.3.1-1970", - "1c8aff71b99462464d9eeac639595ab99600000000000000000000000000000000000000000000000000000000000002-1.2.3.2-1971", - "1c8aff71b99462464d9eeac639595ab99600000000000000000000000000000000000000000000000000000000000003-1.2.3.3-1972", - "1c8aff71b99462464d9eeac639595ab99600000000000000000000000000000000000000000000000000000000000004-1.2.3.4-1973", - "1c8aff71b99462464d9eeac639595ab99600000000000000000000000000000000000000000000000000000000000005-1.2.3.5-1974", - "1c8aff71b99462464d9eeac639595ab99600000000000000000000000000000000000000000000000000000000000006-1.2.3.6-1975", - "1c8aff71b99462464d9eeac639595ab99600000000000000000000000000000000000000000000000000000000000007-1.2.3.7-1976", - "1c8aff71b99462464d9eeac639595ab99680000000000000000000000000000000000000000000000000000000000000-1.2.3.0-1977", - "1c8aff71b99462464d9eeac639595ab99680000000000000000000000000000000000000000000000000000000000001-1.2.3.1-1978", - "1c8aff71b99462464d9eeac639595ab99680000000000000000000000000000000000000000000000000000000000002-1.2.3.2-1979", - "1c8aff71b99462464d9eeac639595ab99680000000000000000000000000000000000000000000000000000000000003-1.2.3.3-1980", - "1c8aff71b99462464d9eeac639595ab99680000000000000000000000000000000000000000000000000000000000004-1.2.3.4-1981", - "1c8aff71b99462464d9eeac639595ab99680000000000000000000000000000000000000000000000000000000000005-1.2.3.5-1982", - "1c8aff71b99462464d9eeac639595ab99680000000000000000000000000000000000000000000000000000000000006-1.2.3.6-1983", - "1c8aff71b99462464d9eeac639595ab99680000000000000000000000000000000000000000000000000000000000007-1.2.3.7-1984", - "1c8aff71b99462464d9eeac639595ab99700000000000000000000000000000000000000000000000000000000000000-1.2.3.0-1985", - "1c8aff71b99462464d9eeac639595ab99700000000000000000000000000000000000000000000000000000000000001-1.2.3.1-1986", - "1c8aff71b99462464d9eeac639595ab99700000000000000000000000000000000000000000000000000000000000002-1.2.3.2-1987", - "1c8aff71b99462464d9eeac639595ab99700000000000000000000000000000000000000000000000000000000000003-1.2.3.3-1988", - "1c8aff71b99462464d9eeac639595ab99700000000000000000000000000000000000000000000000000000000000004-1.2.3.4-1989", - "1c8aff71b99462464d9eeac639595ab99700000000000000000000000000000000000000000000000000000000000005-1.2.3.5-1990", - "1c8aff71b99462464d9eeac639595ab99700000000000000000000000000000000000000000000000000000000000006-1.2.3.6-1991", - "1c8aff71b99462464d9eeac639595ab99700000000000000000000000000000000000000000000000000000000000007-1.2.3.7-1992", - "1c8aff71b99462464d9eeac639595ab99400000000000000000000000000000000000000000000000000000000000000-1.2.3.0-1993", - "1c8aff71b99462464d9eeac639595ab99400000000000000000000000000000000000000000000000000000000000001-1.2.3.1-1994", - "1c8aff71b99462464d9eeac639595ab99400000000000000000000000000000000000000000000000000000000000002-1.2.3.2-1995", - "1c8aff71b99462464d9eeac639595ab99400000000000000000000000000000000000000000000000000000000000003-1.2.3.3-1996", - "1c8aff71b99462464d9eeac639595ab99400000000000000000000000000000000000000000000000000000000000004-1.2.3.4-1997", - "1c8aff71b99462464d9eeac639595ab99400000000000000000000000000000000000000000000000000000000000005-1.2.3.5-1998", - "1c8aff71b99462464d9eeac639595ab99400000000000000000000000000000000000000000000000000000000000006-1.2.3.6-1999", - "1c8aff71b99462464d9eeac639595ab99400000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2000", - "1c8aff71b99462464d9eeac639595ab99000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2001", - "1c8aff71b99462464d9eeac639595ab99000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2002", - "1c8aff71b99462464d9eeac639595ab99000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2003", - "1c8aff71b99462464d9eeac639595ab99000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2004", - "1c8aff71b99462464d9eeac639595ab99000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2005", - "1c8aff71b99462464d9eeac639595ab99000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2006", - "1c8aff71b99462464d9eeac639595ab99000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2007", - "1c8aff71b99462464d9eeac639595ab99000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2008", - "1c8aff71b99462464d9eeac639595ab99800000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2009", - "1c8aff71b99462464d9eeac639595ab99800000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2010", - "1c8aff71b99462464d9eeac639595ab99800000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2011", - "1c8aff71b99462464d9eeac639595ab99800000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2012", - "1c8aff71b99462464d9eeac639595ab99800000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2013", - "1c8aff71b99462464d9eeac639595ab99800000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2014", - "1c8aff71b99462464d9eeac639595ab99800000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2015", - "1c8aff71b99462464d9eeac639595ab99800000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2016", - "1c8aff71b99462464d9eeac639595ab98000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2017", - "1c8aff71b99462464d9eeac639595ab98000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2018", - "1c8aff71b99462464d9eeac639595ab98000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2019", - "1c8aff71b99462464d9eeac639595ab98000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2020", - "1c8aff71b99462464d9eeac639595ab98000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2021", - "1c8aff71b99462464d9eeac639595ab98000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2022", - "1c8aff71b99462464d9eeac639595ab98000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2023", - "1c8aff71b99462464d9eeac639595ab98000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2024", - "1c8aff71b99462464d9eeac639595ab9a000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2025", - "1c8aff71b99462464d9eeac639595ab9a000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2026", - "1c8aff71b99462464d9eeac639595ab9a000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2027", - "1c8aff71b99462464d9eeac639595ab9a000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2028", - "1c8aff71b99462464d9eeac639595ab9a000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2029", - "1c8aff71b99462464d9eeac639595ab9a000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2030", - "1c8aff71b99462464d9eeac639595ab9a000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2031", - "1c8aff71b99462464d9eeac639595ab9a000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2032", - "1c8aff71b99462464d9eeac639595ab9c000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2033", - "1c8aff71b99462464d9eeac639595ab9c000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2034", - "1c8aff71b99462464d9eeac639595ab9c000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2035", - "1c8aff71b99462464d9eeac639595ab9c000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2036", - "1c8aff71b99462464d9eeac639595ab9c000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2037", - "1c8aff71b99462464d9eeac639595ab9c000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2038", - "1c8aff71b99462464d9eeac639595ab9c000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2039", - "1c8aff71b99462464d9eeac639595ab9c000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2040", - "1c8aff71b99462464d9eeac639595ab90000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2041", - "1c8aff71b99462464d9eeac639595ab90000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2042", - "1c8aff71b99462464d9eeac639595ab90000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2043", - "1c8aff71b99462464d9eeac639595ab90000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2044", - "1c8aff71b99462464d9eeac639595ab90000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2045", - "1c8aff71b99462464d9eeac639595ab90000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2046", - "1c8aff71b99462464d9eeac639595ab90000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2047", - "1c8aff71b99462464d9eeac639595ab90000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2048", - "1c8aff71b99462464d9eeac639595ab80000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2049", - "1c8aff71b99462464d9eeac639595ab80000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2050", - "1c8aff71b99462464d9eeac639595ab80000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2051", - "1c8aff71b99462464d9eeac639595ab80000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2052", - "1c8aff71b99462464d9eeac639595ab80000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2053", - "1c8aff71b99462464d9eeac639595ab80000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2054", - "1c8aff71b99462464d9eeac639595ab80000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2055", - "1c8aff71b99462464d9eeac639595ab80000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2056", - "1c8aff71b99462464d9eeac639595aba0000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2057", - "1c8aff71b99462464d9eeac639595aba0000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2058", - "1c8aff71b99462464d9eeac639595aba0000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2059", - "1c8aff71b99462464d9eeac639595aba0000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2060", - "1c8aff71b99462464d9eeac639595aba0000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2061", - "1c8aff71b99462464d9eeac639595aba0000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2062", - "1c8aff71b99462464d9eeac639595aba0000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2063", - "1c8aff71b99462464d9eeac639595aba0000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2064", - "1c8aff71b99462464d9eeac639595abc0000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2065", - "1c8aff71b99462464d9eeac639595abc0000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2066", - "1c8aff71b99462464d9eeac639595abc0000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2067", - "1c8aff71b99462464d9eeac639595abc0000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2068", - "1c8aff71b99462464d9eeac639595abc0000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2069", - "1c8aff71b99462464d9eeac639595abc0000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2070", - "1c8aff71b99462464d9eeac639595abc0000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2071", - "1c8aff71b99462464d9eeac639595abc0000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2072", - "1c8aff71b99462464d9eeac639595ab00000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2073", - "1c8aff71b99462464d9eeac639595ab00000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2074", - "1c8aff71b99462464d9eeac639595ab00000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2075", - "1c8aff71b99462464d9eeac639595ab00000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2076", - "1c8aff71b99462464d9eeac639595ab00000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2077", - "1c8aff71b99462464d9eeac639595ab00000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2078", - "1c8aff71b99462464d9eeac639595ab00000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2079", - "1c8aff71b99462464d9eeac639595ab00000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2080", - "1c8aff71b99462464d9eeac639595aa00000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2081", - "1c8aff71b99462464d9eeac639595aa00000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2082", - "1c8aff71b99462464d9eeac639595aa00000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2083", - "1c8aff71b99462464d9eeac639595aa00000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2084", - "1c8aff71b99462464d9eeac639595aa00000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2085", - "1c8aff71b99462464d9eeac639595aa00000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2086", - "1c8aff71b99462464d9eeac639595aa00000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2087", - "1c8aff71b99462464d9eeac639595aa00000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2088", - "1c8aff71b99462464d9eeac639595a800000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2089", - "1c8aff71b99462464d9eeac639595a800000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2090", - "1c8aff71b99462464d9eeac639595a800000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2091", - "1c8aff71b99462464d9eeac639595a800000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2092", - "1c8aff71b99462464d9eeac639595a800000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2093", - "1c8aff71b99462464d9eeac639595a800000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2094", - "1c8aff71b99462464d9eeac639595a800000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2095", - "1c8aff71b99462464d9eeac639595a800000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2096", - "1c8aff71b99462464d9eeac639595ac00000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2097", - "1c8aff71b99462464d9eeac639595ac00000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2098", - "1c8aff71b99462464d9eeac639595ac00000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2099", - "1c8aff71b99462464d9eeac639595ac00000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2100", - "1c8aff71b99462464d9eeac639595ac00000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2101", - "1c8aff71b99462464d9eeac639595ac00000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2102", - "1c8aff71b99462464d9eeac639595ac00000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2103", - "1c8aff71b99462464d9eeac639595ac00000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2104", - "1c8aff71b99462464d9eeac639595a000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2105", - "1c8aff71b99462464d9eeac639595a000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2106", - "1c8aff71b99462464d9eeac639595a000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2107", - "1c8aff71b99462464d9eeac639595a000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2108", - "1c8aff71b99462464d9eeac639595a000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2109", - "1c8aff71b99462464d9eeac639595a000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2110", - "1c8aff71b99462464d9eeac639595a000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2111", - "1c8aff71b99462464d9eeac639595a000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2112", - "1c8aff71b99462464d9eeac639595b000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2113", - "1c8aff71b99462464d9eeac639595b000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2114", - "1c8aff71b99462464d9eeac639595b000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2115", - "1c8aff71b99462464d9eeac639595b000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2116", - "1c8aff71b99462464d9eeac639595b000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2117", - "1c8aff71b99462464d9eeac639595b000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2118", - "1c8aff71b99462464d9eeac639595b000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2119", - "1c8aff71b99462464d9eeac639595b000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2120", - "1c8aff71b99462464d9eeac6395958000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2121", - "1c8aff71b99462464d9eeac6395958000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2122", - "1c8aff71b99462464d9eeac6395958000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2123", - "1c8aff71b99462464d9eeac6395958000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2124", - "1c8aff71b99462464d9eeac6395958000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2125", - "1c8aff71b99462464d9eeac6395958000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2126", - "1c8aff71b99462464d9eeac6395958000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2127", - "1c8aff71b99462464d9eeac6395958000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2128", - "1c8aff71b99462464d9eeac639595c000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2129", - "1c8aff71b99462464d9eeac639595c000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2130", - "1c8aff71b99462464d9eeac639595c000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2131", - "1c8aff71b99462464d9eeac639595c000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2132", - "1c8aff71b99462464d9eeac639595c000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2133", - "1c8aff71b99462464d9eeac639595c000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2134", - "1c8aff71b99462464d9eeac639595c000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2135", - "1c8aff71b99462464d9eeac639595c000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2136", - "1c8aff71b99462464d9eeac6395950000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2137", - "1c8aff71b99462464d9eeac6395950000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2138", - "1c8aff71b99462464d9eeac6395950000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2139", - "1c8aff71b99462464d9eeac6395950000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2140", - "1c8aff71b99462464d9eeac6395950000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2141", - "1c8aff71b99462464d9eeac6395950000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2142", - "1c8aff71b99462464d9eeac6395950000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2143", - "1c8aff71b99462464d9eeac6395950000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2144", - "1c8aff71b99462464d9eeac6395940000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2145", - "1c8aff71b99462464d9eeac6395940000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2146", - "1c8aff71b99462464d9eeac6395940000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2147", - "1c8aff71b99462464d9eeac6395940000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2148", - "1c8aff71b99462464d9eeac6395940000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2149", - "1c8aff71b99462464d9eeac6395940000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2150", - "1c8aff71b99462464d9eeac6395940000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2151", - "1c8aff71b99462464d9eeac6395940000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2152", - "1c8aff71b99462464d9eeac6395960000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2153", - "1c8aff71b99462464d9eeac6395960000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2154", - "1c8aff71b99462464d9eeac6395960000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2155", - "1c8aff71b99462464d9eeac6395960000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2156", - "1c8aff71b99462464d9eeac6395960000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2157", - "1c8aff71b99462464d9eeac6395960000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2158", - "1c8aff71b99462464d9eeac6395960000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2159", - "1c8aff71b99462464d9eeac6395960000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2160", - "1c8aff71b99462464d9eeac6395900000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2161", - "1c8aff71b99462464d9eeac6395900000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2162", - "1c8aff71b99462464d9eeac6395900000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2163", - "1c8aff71b99462464d9eeac6395900000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2164", - "1c8aff71b99462464d9eeac6395900000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2165", - "1c8aff71b99462464d9eeac6395900000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2166", - "1c8aff71b99462464d9eeac6395900000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2167", - "1c8aff71b99462464d9eeac6395900000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2168", - "1c8aff71b99462464d9eeac6395980000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2169", - "1c8aff71b99462464d9eeac6395980000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2170", - "1c8aff71b99462464d9eeac6395980000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2171", - "1c8aff71b99462464d9eeac6395980000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2172", - "1c8aff71b99462464d9eeac6395980000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2173", - "1c8aff71b99462464d9eeac6395980000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2174", - "1c8aff71b99462464d9eeac6395980000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2175", - "1c8aff71b99462464d9eeac6395980000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2176", - "1c8aff71b99462464d9eeac6395800000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2177", - "1c8aff71b99462464d9eeac6395800000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2178", - "1c8aff71b99462464d9eeac6395800000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2179", - "1c8aff71b99462464d9eeac6395800000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2180", - "1c8aff71b99462464d9eeac6395800000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2181", - "1c8aff71b99462464d9eeac6395800000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2182", - "1c8aff71b99462464d9eeac6395800000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2183", - "1c8aff71b99462464d9eeac6395800000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2184", - "1c8aff71b99462464d9eeac6395a00000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2185", - "1c8aff71b99462464d9eeac6395a00000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2186", - "1c8aff71b99462464d9eeac6395a00000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2187", - "1c8aff71b99462464d9eeac6395a00000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2188", - "1c8aff71b99462464d9eeac6395a00000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2189", - "1c8aff71b99462464d9eeac6395a00000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2190", - "1c8aff71b99462464d9eeac6395a00000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2191", - "1c8aff71b99462464d9eeac6395a00000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2192", - "1c8aff71b99462464d9eeac6395c00000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2193", - "1c8aff71b99462464d9eeac6395c00000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2194", - "1c8aff71b99462464d9eeac6395c00000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2195", - "1c8aff71b99462464d9eeac6395c00000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2196", - "1c8aff71b99462464d9eeac6395c00000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2197", - "1c8aff71b99462464d9eeac6395c00000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2198", - "1c8aff71b99462464d9eeac6395c00000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2199", - "1c8aff71b99462464d9eeac6395c00000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2200", - "1c8aff71b99462464d9eeac6395000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2201", - "1c8aff71b99462464d9eeac6395000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2202", - "1c8aff71b99462464d9eeac6395000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2203", - "1c8aff71b99462464d9eeac6395000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2204", - "1c8aff71b99462464d9eeac6395000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2205", - "1c8aff71b99462464d9eeac6395000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2206", - "1c8aff71b99462464d9eeac6395000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2207", - "1c8aff71b99462464d9eeac6395000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2208", - "1c8aff71b99462464d9eeac6394000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2209", - "1c8aff71b99462464d9eeac6394000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2210", - "1c8aff71b99462464d9eeac6394000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2211", - "1c8aff71b99462464d9eeac6394000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2212", - "1c8aff71b99462464d9eeac6394000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2213", - "1c8aff71b99462464d9eeac6394000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2214", - "1c8aff71b99462464d9eeac6394000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2215", - "1c8aff71b99462464d9eeac6394000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2216", - "1c8aff71b99462464d9eeac6396000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2217", - "1c8aff71b99462464d9eeac6396000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2218", - "1c8aff71b99462464d9eeac6396000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2219", - "1c8aff71b99462464d9eeac6396000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2220", - "1c8aff71b99462464d9eeac6396000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2221", - "1c8aff71b99462464d9eeac6396000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2222", - "1c8aff71b99462464d9eeac6396000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2223", - "1c8aff71b99462464d9eeac6396000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2224", - "1c8aff71b99462464d9eeac6390000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2225", - "1c8aff71b99462464d9eeac6390000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2226", - "1c8aff71b99462464d9eeac6390000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2227", - "1c8aff71b99462464d9eeac6390000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2228", - "1c8aff71b99462464d9eeac6390000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2229", - "1c8aff71b99462464d9eeac6390000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2230", - "1c8aff71b99462464d9eeac6390000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2231", - "1c8aff71b99462464d9eeac6390000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2232", - "1c8aff71b99462464d9eeac6398000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2233", - "1c8aff71b99462464d9eeac6398000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2234", - "1c8aff71b99462464d9eeac6398000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2235", - "1c8aff71b99462464d9eeac6398000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2236", - "1c8aff71b99462464d9eeac6398000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2237", - "1c8aff71b99462464d9eeac6398000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2238", - "1c8aff71b99462464d9eeac6398000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2239", - "1c8aff71b99462464d9eeac6398000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2240", - "1c8aff71b99462464d9eeac6380000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2241", - "1c8aff71b99462464d9eeac6380000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2242", - "1c8aff71b99462464d9eeac6380000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2243", - "1c8aff71b99462464d9eeac6380000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2244", - "1c8aff71b99462464d9eeac6380000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2245", - "1c8aff71b99462464d9eeac6380000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2246", - "1c8aff71b99462464d9eeac6380000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2247", - "1c8aff71b99462464d9eeac6380000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2248", - "1c8aff71b99462464d9eeac63a0000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2249", - "1c8aff71b99462464d9eeac63a0000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2250", - "1c8aff71b99462464d9eeac63a0000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2251", - "1c8aff71b99462464d9eeac63a0000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2252", - "1c8aff71b99462464d9eeac63a0000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2253", - "1c8aff71b99462464d9eeac63a0000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2254", - "1c8aff71b99462464d9eeac63a0000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2255", - "1c8aff71b99462464d9eeac63a0000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2256", - "1c8aff71b99462464d9eeac63c0000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2257", - "1c8aff71b99462464d9eeac63c0000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2258", - "1c8aff71b99462464d9eeac63c0000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2259", - "1c8aff71b99462464d9eeac63c0000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2260", - "1c8aff71b99462464d9eeac63c0000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2261", - "1c8aff71b99462464d9eeac63c0000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2262", - "1c8aff71b99462464d9eeac63c0000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2263", - "1c8aff71b99462464d9eeac63c0000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2264", - "1c8aff71b99462464d9eeac6300000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2265", - "1c8aff71b99462464d9eeac6300000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2266", - "1c8aff71b99462464d9eeac6300000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2267", - "1c8aff71b99462464d9eeac6300000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2268", - "1c8aff71b99462464d9eeac6300000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2269", - "1c8aff71b99462464d9eeac6300000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2270", - "1c8aff71b99462464d9eeac6300000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2271", - "1c8aff71b99462464d9eeac6300000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2272", - "1c8aff71b99462464d9eeac6200000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2273", - "1c8aff71b99462464d9eeac6200000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2274", - "1c8aff71b99462464d9eeac6200000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2275", - "1c8aff71b99462464d9eeac6200000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2276", - "1c8aff71b99462464d9eeac6200000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2277", - "1c8aff71b99462464d9eeac6200000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2278", - "1c8aff71b99462464d9eeac6200000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2279", - "1c8aff71b99462464d9eeac6200000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2280", - "1c8aff71b99462464d9eeac6000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2281", - "1c8aff71b99462464d9eeac6000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2282", - "1c8aff71b99462464d9eeac6000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2283", - "1c8aff71b99462464d9eeac6000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2284", - "1c8aff71b99462464d9eeac6000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2285", - "1c8aff71b99462464d9eeac6000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2286", - "1c8aff71b99462464d9eeac6000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2287", - "1c8aff71b99462464d9eeac6000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2288", - "1c8aff71b99462464d9eeac6400000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2289", - "1c8aff71b99462464d9eeac6400000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2290", - "1c8aff71b99462464d9eeac6400000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2291", - "1c8aff71b99462464d9eeac6400000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2292", - "1c8aff71b99462464d9eeac6400000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2293", - "1c8aff71b99462464d9eeac6400000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2294", - "1c8aff71b99462464d9eeac6400000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2295", - "1c8aff71b99462464d9eeac6400000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2296", - "1c8aff71b99462464d9eeac6800000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2297", - "1c8aff71b99462464d9eeac6800000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2298", - "1c8aff71b99462464d9eeac6800000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2299", - "1c8aff71b99462464d9eeac6800000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2300", - "1c8aff71b99462464d9eeac6800000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2301", - "1c8aff71b99462464d9eeac6800000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2302", - "1c8aff71b99462464d9eeac6800000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2303", - "1c8aff71b99462464d9eeac6800000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2304", - "1c8aff71b99462464d9eeac7000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2305", - "1c8aff71b99462464d9eeac7000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2306", - "1c8aff71b99462464d9eeac7000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2307", - "1c8aff71b99462464d9eeac7000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2308", - "1c8aff71b99462464d9eeac7000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2309", - "1c8aff71b99462464d9eeac7000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2310", - "1c8aff71b99462464d9eeac7000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2311", - "1c8aff71b99462464d9eeac7000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2312", - "1c8aff71b99462464d9eeac4000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2313", - "1c8aff71b99462464d9eeac4000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2314", - "1c8aff71b99462464d9eeac4000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2315", - "1c8aff71b99462464d9eeac4000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2316", - "1c8aff71b99462464d9eeac4000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2317", - "1c8aff71b99462464d9eeac4000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2318", - "1c8aff71b99462464d9eeac4000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2319", - "1c8aff71b99462464d9eeac4000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2320", - "1c8aff71b99462464d9eeac0000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2321", - "1c8aff71b99462464d9eeac0000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2322", - "1c8aff71b99462464d9eeac0000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2323", - "1c8aff71b99462464d9eeac0000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2324", - "1c8aff71b99462464d9eeac0000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2325", - "1c8aff71b99462464d9eeac0000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2326", - "1c8aff71b99462464d9eeac0000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2327", - "1c8aff71b99462464d9eeac0000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2328", - "1c8aff71b99462464d9eeac8000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2329", - "1c8aff71b99462464d9eeac8000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2330", - "1c8aff71b99462464d9eeac8000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2331", - "1c8aff71b99462464d9eeac8000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2332", - "1c8aff71b99462464d9eeac8000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2333", - "1c8aff71b99462464d9eeac8000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2334", - "1c8aff71b99462464d9eeac8000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2335", - "1c8aff71b99462464d9eeac8000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2336", - "1c8aff71b99462464d9eead0000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2337", - "1c8aff71b99462464d9eead0000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2338", - "1c8aff71b99462464d9eead0000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2339", - "1c8aff71b99462464d9eead0000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2340", - "1c8aff71b99462464d9eead0000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2341", - "1c8aff71b99462464d9eead0000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2342", - "1c8aff71b99462464d9eead0000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2343", - "1c8aff71b99462464d9eead0000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2344", - "1c8aff71b99462464d9eeae0000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2345", - "1c8aff71b99462464d9eeae0000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2346", - "1c8aff71b99462464d9eeae0000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2347", - "1c8aff71b99462464d9eeae0000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2348", - "1c8aff71b99462464d9eeae0000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2349", - "1c8aff71b99462464d9eeae0000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2350", - "1c8aff71b99462464d9eeae0000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2351", - "1c8aff71b99462464d9eeae0000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2352", - "1c8aff71b99462464d9eea80000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2353", - "1c8aff71b99462464d9eea80000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2354", - "1c8aff71b99462464d9eea80000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2355", - "1c8aff71b99462464d9eea80000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2356", - "1c8aff71b99462464d9eea80000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2357", - "1c8aff71b99462464d9eea80000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2358", - "1c8aff71b99462464d9eea80000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2359", - "1c8aff71b99462464d9eea80000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2360", - "1c8aff71b99462464d9eea00000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2361", - "1c8aff71b99462464d9eea00000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2362", - "1c8aff71b99462464d9eea00000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2363", - "1c8aff71b99462464d9eea00000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2364", - "1c8aff71b99462464d9eea00000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2365", - "1c8aff71b99462464d9eea00000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2366", - "1c8aff71b99462464d9eea00000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2367", - "1c8aff71b99462464d9eea00000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2368", - "1c8aff71b99462464d9eeb00000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2369", - "1c8aff71b99462464d9eeb00000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2370", - "1c8aff71b99462464d9eeb00000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2371", - "1c8aff71b99462464d9eeb00000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2372", - "1c8aff71b99462464d9eeb00000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2373", - "1c8aff71b99462464d9eeb00000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2374", - "1c8aff71b99462464d9eeb00000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2375", - "1c8aff71b99462464d9eeb00000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2376", - "1c8aff71b99462464d9ee800000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2377", - "1c8aff71b99462464d9ee800000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2378", - "1c8aff71b99462464d9ee800000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2379", - "1c8aff71b99462464d9ee800000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2380", - "1c8aff71b99462464d9ee800000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2381", - "1c8aff71b99462464d9ee800000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2382", - "1c8aff71b99462464d9ee800000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2383", - "1c8aff71b99462464d9ee800000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2384", - "1c8aff71b99462464d9eec00000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2385", - "1c8aff71b99462464d9eec00000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2386", - "1c8aff71b99462464d9eec00000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2387", - "1c8aff71b99462464d9eec00000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2388", - "1c8aff71b99462464d9eec00000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2389", - "1c8aff71b99462464d9eec00000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2390", - "1c8aff71b99462464d9eec00000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2391", - "1c8aff71b99462464d9eec00000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2392", - "1c8aff71b99462464d9ee000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2393", - "1c8aff71b99462464d9ee000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2394", - "1c8aff71b99462464d9ee000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2395", - "1c8aff71b99462464d9ee000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2396", - "1c8aff71b99462464d9ee000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2397", - "1c8aff71b99462464d9ee000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2398", - "1c8aff71b99462464d9ee000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2399", - "1c8aff71b99462464d9ee000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2400", - "1c8aff71b99462464d9ef000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2401", - "1c8aff71b99462464d9ef000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2402", - "1c8aff71b99462464d9ef000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2403", - "1c8aff71b99462464d9ef000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2404", - "1c8aff71b99462464d9ef000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2405", - "1c8aff71b99462464d9ef000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2406", - "1c8aff71b99462464d9ef000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2407", - "1c8aff71b99462464d9ef000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2408", - "1c8aff71b99462464d9ec000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2409", - "1c8aff71b99462464d9ec000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2410", - "1c8aff71b99462464d9ec000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2411", - "1c8aff71b99462464d9ec000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2412", - "1c8aff71b99462464d9ec000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2413", - "1c8aff71b99462464d9ec000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2414", - "1c8aff71b99462464d9ec000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2415", - "1c8aff71b99462464d9ec000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2416", - "1c8aff71b99462464d9e8000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2417", - "1c8aff71b99462464d9e8000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2418", - "1c8aff71b99462464d9e8000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2419", - "1c8aff71b99462464d9e8000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2420", - "1c8aff71b99462464d9e8000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2421", - "1c8aff71b99462464d9e8000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2422", - "1c8aff71b99462464d9e8000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2423", - "1c8aff71b99462464d9e8000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2424", - "1c8aff71b99462464d9e0000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2425", - "1c8aff71b99462464d9e0000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2426", - "1c8aff71b99462464d9e0000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2427", - "1c8aff71b99462464d9e0000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2428", - "1c8aff71b99462464d9e0000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2429", - "1c8aff71b99462464d9e0000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2430", - "1c8aff71b99462464d9e0000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2431", - "1c8aff71b99462464d9e0000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2432", - "1c8aff71b99462464d9f0000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2433", - "1c8aff71b99462464d9f0000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2434", - "1c8aff71b99462464d9f0000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2435", - "1c8aff71b99462464d9f0000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2436", - "1c8aff71b99462464d9f0000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2437", - "1c8aff71b99462464d9f0000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2438", - "1c8aff71b99462464d9f0000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2439", - "1c8aff71b99462464d9f0000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2440", - "1c8aff71b99462464d9c0000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2441", - "1c8aff71b99462464d9c0000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2442", - "1c8aff71b99462464d9c0000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2443", - "1c8aff71b99462464d9c0000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2444", - "1c8aff71b99462464d9c0000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2445", - "1c8aff71b99462464d9c0000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2446", - "1c8aff71b99462464d9c0000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2447", - "1c8aff71b99462464d9c0000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2448", - "1c8aff71b99462464d980000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2449", - "1c8aff71b99462464d980000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2450", - "1c8aff71b99462464d980000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2451", - "1c8aff71b99462464d980000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2452", - "1c8aff71b99462464d980000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2453", - "1c8aff71b99462464d980000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2454", - "1c8aff71b99462464d980000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2455", - "1c8aff71b99462464d980000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2456", - "1c8aff71b99462464d900000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2457", - "1c8aff71b99462464d900000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2458", - "1c8aff71b99462464d900000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2459", - "1c8aff71b99462464d900000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2460", - "1c8aff71b99462464d900000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2461", - "1c8aff71b99462464d900000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2462", - "1c8aff71b99462464d900000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2463", - "1c8aff71b99462464d900000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2464", - "1c8aff71b99462464d800000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2465", - "1c8aff71b99462464d800000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2466", - "1c8aff71b99462464d800000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2467", - "1c8aff71b99462464d800000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2468", - "1c8aff71b99462464d800000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2469", - "1c8aff71b99462464d800000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2470", - "1c8aff71b99462464d800000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2471", - "1c8aff71b99462464d800000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2472", - "1c8aff71b99462464da00000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2473", - "1c8aff71b99462464da00000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2474", - "1c8aff71b99462464da00000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2475", - "1c8aff71b99462464da00000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2476", - "1c8aff71b99462464da00000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2477", - "1c8aff71b99462464da00000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2478", - "1c8aff71b99462464da00000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2479", - "1c8aff71b99462464da00000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2480", - "1c8aff71b99462464dc00000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2481", - "1c8aff71b99462464dc00000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2482", - "1c8aff71b99462464dc00000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2483", - "1c8aff71b99462464dc00000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2484", - "1c8aff71b99462464dc00000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2485", - "1c8aff71b99462464dc00000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2486", - "1c8aff71b99462464dc00000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2487", - "1c8aff71b99462464dc00000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2488", - "1c8aff71b99462464d000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2489", - "1c8aff71b99462464d000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2490", - "1c8aff71b99462464d000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2491", - "1c8aff71b99462464d000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2492", - "1c8aff71b99462464d000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2493", - "1c8aff71b99462464d000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2494", - "1c8aff71b99462464d000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2495", - "1c8aff71b99462464d000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2496", - "1c8aff71b99462464c000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2497", - "1c8aff71b99462464c000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2498", - "1c8aff71b99462464c000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2499", - "1c8aff71b99462464c000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2500", - "1c8aff71b99462464c000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2501", - "1c8aff71b99462464c000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2502", - "1c8aff71b99462464c000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2503", - "1c8aff71b99462464c000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2504", - "1c8aff71b99462464e000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2505", - "1c8aff71b99462464e000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2506", - "1c8aff71b99462464e000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2507", - "1c8aff71b99462464e000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2508", - "1c8aff71b99462464e000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2509", - "1c8aff71b99462464e000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2510", - "1c8aff71b99462464e000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2511", - "1c8aff71b99462464e000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2512", - "1c8aff71b994624648000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2513", - "1c8aff71b994624648000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2514", - "1c8aff71b994624648000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2515", - "1c8aff71b994624648000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2516", - "1c8aff71b994624648000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2517", - "1c8aff71b994624648000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2518", - "1c8aff71b994624648000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2519", - "1c8aff71b994624648000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2520", - "1c8aff71b994624640000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2521", - "1c8aff71b994624640000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2522", - "1c8aff71b994624640000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2523", - "1c8aff71b994624640000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2524", - "1c8aff71b994624640000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2525", - "1c8aff71b994624640000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2526", - "1c8aff71b994624640000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2527", - "1c8aff71b994624640000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2528", - "1c8aff71b994624650000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2529", - "1c8aff71b994624650000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2530", - "1c8aff71b994624650000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2531", - "1c8aff71b994624650000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2532", - "1c8aff71b994624650000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2533", - "1c8aff71b994624650000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2534", - "1c8aff71b994624650000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2535", - "1c8aff71b994624650000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2536", - "1c8aff71b994624660000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2537", - "1c8aff71b994624660000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2538", - "1c8aff71b994624660000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2539", - "1c8aff71b994624660000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2540", - "1c8aff71b994624660000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2541", - "1c8aff71b994624660000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2542", - "1c8aff71b994624660000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2543", - "1c8aff71b994624660000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2544", - "1c8aff71b994624600000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2545", - "1c8aff71b994624600000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2546", - "1c8aff71b994624600000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2547", - "1c8aff71b994624600000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2548", - "1c8aff71b994624600000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2549", - "1c8aff71b994624600000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2550", - "1c8aff71b994624600000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2551", - "1c8aff71b994624600000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2552", - "1c8aff71b994624680000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2553", - "1c8aff71b994624680000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2554", - "1c8aff71b994624680000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2555", - "1c8aff71b994624680000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2556", - "1c8aff71b994624680000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2557", - "1c8aff71b994624680000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2558", - "1c8aff71b994624680000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2559", - "1c8aff71b994624680000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2560", - "1c8aff71b994624700000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2561", - "1c8aff71b994624700000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2562", - "1c8aff71b994624700000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2563", - "1c8aff71b994624700000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2564", - "1c8aff71b994624700000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2565", - "1c8aff71b994624700000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2566", - "1c8aff71b994624700000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2567", - "1c8aff71b994624700000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2568", - "1c8aff71b994624400000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2569", - "1c8aff71b994624400000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2570", - "1c8aff71b994624400000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2571", - "1c8aff71b994624400000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2572", - "1c8aff71b994624400000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2573", - "1c8aff71b994624400000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2574", - "1c8aff71b994624400000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2575", - "1c8aff71b994624400000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2576", - "1c8aff71b994624000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2577", - "1c8aff71b994624000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2578", - "1c8aff71b994624000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2579", - "1c8aff71b994624000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2580", - "1c8aff71b994624000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2581", - "1c8aff71b994624000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2582", - "1c8aff71b994624000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2583", - "1c8aff71b994624000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2584", - "1c8aff71b994624800000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2585", - "1c8aff71b994624800000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2586", - "1c8aff71b994624800000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2587", - "1c8aff71b994624800000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2588", - "1c8aff71b994624800000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2589", - "1c8aff71b994624800000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2590", - "1c8aff71b994624800000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2591", - "1c8aff71b994624800000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2592", - "1c8aff71b994625000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2593", - "1c8aff71b994625000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2594", - "1c8aff71b994625000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2595", - "1c8aff71b994625000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2596", - "1c8aff71b994625000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2597", - "1c8aff71b994625000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2598", - "1c8aff71b994625000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2599", - "1c8aff71b994625000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2600", - "1c8aff71b994626000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2601", - "1c8aff71b994626000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2602", - "1c8aff71b994626000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2603", - "1c8aff71b994626000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2604", - "1c8aff71b994626000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2605", - "1c8aff71b994626000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2606", - "1c8aff71b994626000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2607", - "1c8aff71b994626000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2608", - "1c8aff71b994620000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2609", - "1c8aff71b994620000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2610", - "1c8aff71b994620000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2611", - "1c8aff71b994620000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2612", - "1c8aff71b994620000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2613", - "1c8aff71b994620000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2614", - "1c8aff71b994620000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2615", - "1c8aff71b994620000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2616", - "1c8aff71b994628000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2617", - "1c8aff71b994628000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2618", - "1c8aff71b994628000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2619", - "1c8aff71b994628000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2620", - "1c8aff71b994628000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2621", - "1c8aff71b994628000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2622", - "1c8aff71b994628000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2623", - "1c8aff71b994628000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2624", - "1c8aff71b994630000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2625", - "1c8aff71b994630000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2626", - "1c8aff71b994630000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2627", - "1c8aff71b994630000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2628", - "1c8aff71b994630000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2629", - "1c8aff71b994630000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2630", - "1c8aff71b994630000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2631", - "1c8aff71b994630000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2632", - "1c8aff71b994600000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2633", - "1c8aff71b994600000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2634", - "1c8aff71b994600000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2635", - "1c8aff71b994600000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2636", - "1c8aff71b994600000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2637", - "1c8aff71b994600000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2638", - "1c8aff71b994600000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2639", - "1c8aff71b994600000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2640", - "1c8aff71b994640000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2641", - "1c8aff71b994640000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2642", - "1c8aff71b994640000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2643", - "1c8aff71b994640000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2644", - "1c8aff71b994640000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2645", - "1c8aff71b994640000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2646", - "1c8aff71b994640000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2647", - "1c8aff71b994640000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2648", - "1c8aff71b994680000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2649", - "1c8aff71b994680000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2650", - "1c8aff71b994680000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2651", - "1c8aff71b994680000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2652", - "1c8aff71b994680000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2653", - "1c8aff71b994680000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2654", - "1c8aff71b994680000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2655", - "1c8aff71b994680000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2656", - "1c8aff71b994700000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2657", - "1c8aff71b994700000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2658", - "1c8aff71b994700000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2659", - "1c8aff71b994700000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2660", - "1c8aff71b994700000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2661", - "1c8aff71b994700000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2662", - "1c8aff71b994700000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2663", - "1c8aff71b994700000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2664", - "1c8aff71b994400000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2665", - "1c8aff71b994400000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2666", - "1c8aff71b994400000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2667", - "1c8aff71b994400000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2668", - "1c8aff71b994400000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2669", - "1c8aff71b994400000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2670", - "1c8aff71b994400000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2671", - "1c8aff71b994400000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2672", - "1c8aff71b994000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2673", - "1c8aff71b994000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2674", - "1c8aff71b994000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2675", - "1c8aff71b994000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2676", - "1c8aff71b994000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2677", - "1c8aff71b994000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2678", - "1c8aff71b994000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2679", - "1c8aff71b994000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2680", - "1c8aff71b994800000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2681", - "1c8aff71b994800000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2682", - "1c8aff71b994800000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2683", - "1c8aff71b994800000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2684", - "1c8aff71b994800000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2685", - "1c8aff71b994800000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2686", - "1c8aff71b994800000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2687", - "1c8aff71b994800000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2688", - "1c8aff71b995000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2689", - "1c8aff71b995000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2690", - "1c8aff71b995000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2691", - "1c8aff71b995000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2692", - "1c8aff71b995000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2693", - "1c8aff71b995000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2694", - "1c8aff71b995000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2695", - "1c8aff71b995000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2696", - "1c8aff71b996000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2697", - "1c8aff71b996000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2698", - "1c8aff71b996000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2699", - "1c8aff71b996000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2700", - "1c8aff71b996000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2701", - "1c8aff71b996000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2702", - "1c8aff71b996000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2703", - "1c8aff71b996000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2704", - "1c8aff71b990000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2705", - "1c8aff71b990000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2706", - "1c8aff71b990000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2707", - "1c8aff71b990000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2708", - "1c8aff71b990000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2709", - "1c8aff71b990000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2710", - "1c8aff71b990000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2711", - "1c8aff71b990000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2712", - "1c8aff71b998000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2713", - "1c8aff71b998000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2714", - "1c8aff71b998000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2715", - "1c8aff71b998000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2716", - "1c8aff71b998000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2717", - "1c8aff71b998000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2718", - "1c8aff71b998000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2719", - "1c8aff71b998000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2720", - "1c8aff71b980000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2721", - "1c8aff71b980000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2722", - "1c8aff71b980000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2723", - "1c8aff71b980000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2724", - "1c8aff71b980000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2725", - "1c8aff71b980000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2726", - "1c8aff71b980000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2727", - "1c8aff71b980000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2728", - "1c8aff71b9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2729", - "1c8aff71b9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2730", - "1c8aff71b9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2731", - "1c8aff71b9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2732", - "1c8aff71b9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2733", - "1c8aff71b9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2734", - "1c8aff71b9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2735", - "1c8aff71b9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2736", - "1c8aff71b9c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2737", - "1c8aff71b9c0000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2738", - "1c8aff71b9c0000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2739", - "1c8aff71b9c0000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2740", - "1c8aff71b9c0000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2741", - "1c8aff71b9c0000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2742", - "1c8aff71b9c0000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2743", - "1c8aff71b9c0000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2744", - "1c8aff71b900000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2745", - "1c8aff71b900000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2746", - "1c8aff71b900000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2747", - "1c8aff71b900000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2748", - "1c8aff71b900000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2749", - "1c8aff71b900000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2750", - "1c8aff71b900000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2751", - "1c8aff71b900000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2752", - "1c8aff71b800000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2753", - "1c8aff71b800000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2754", - "1c8aff71b800000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2755", - "1c8aff71b800000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2756", - "1c8aff71b800000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2757", - "1c8aff71b800000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2758", - "1c8aff71b800000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2759", - "1c8aff71b800000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2760", - "1c8aff71ba00000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2761", - "1c8aff71ba00000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2762", - "1c8aff71ba00000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2763", - "1c8aff71ba00000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2764", - "1c8aff71ba00000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2765", - "1c8aff71ba00000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2766", - "1c8aff71ba00000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2767", - "1c8aff71ba00000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2768", - "1c8aff71bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2769", - "1c8aff71bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2770", - "1c8aff71bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2771", - "1c8aff71bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2772", - "1c8aff71bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2773", - "1c8aff71bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2774", - "1c8aff71bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2775", - "1c8aff71bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2776", - "1c8aff71b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2777", - "1c8aff71b000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2778", - "1c8aff71b000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2779", - "1c8aff71b000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2780", - "1c8aff71b000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2781", - "1c8aff71b000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2782", - "1c8aff71b000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2783", - "1c8aff71b000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2784", - "1c8aff71a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2785", - "1c8aff71a000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2786", - "1c8aff71a000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2787", - "1c8aff71a000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2788", - "1c8aff71a000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2789", - "1c8aff71a000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2790", - "1c8aff71a000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2791", - "1c8aff71a000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2792", - "1c8aff718000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2793", - "1c8aff718000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2794", - "1c8aff718000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2795", - "1c8aff718000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2796", - "1c8aff718000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2797", - "1c8aff718000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2798", - "1c8aff718000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2799", - "1c8aff718000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2800", - "1c8aff71c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2801", - "1c8aff71c000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2802", - "1c8aff71c000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2803", - "1c8aff71c000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2804", - "1c8aff71c000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2805", - "1c8aff71c000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2806", - "1c8aff71c000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2807", - "1c8aff71c000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2808", - "1c8aff710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2809", - "1c8aff710000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2810", - "1c8aff710000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2811", - "1c8aff710000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2812", - "1c8aff710000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2813", - "1c8aff710000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2814", - "1c8aff710000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2815", - "1c8aff710000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2816", - "1c8aff700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2817", - "1c8aff700000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2818", - "1c8aff700000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2819", - "1c8aff700000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2820", - "1c8aff700000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2821", - "1c8aff700000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2822", - "1c8aff700000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2823", - "1c8aff700000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2824", - "1c8aff720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2825", - "1c8aff720000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2826", - "1c8aff720000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2827", - "1c8aff720000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2828", - "1c8aff720000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2829", - "1c8aff720000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2830", - "1c8aff720000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2831", - "1c8aff720000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2832", - "1c8aff740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2833", - "1c8aff740000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2834", - "1c8aff740000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2835", - "1c8aff740000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2836", - "1c8aff740000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2837", - "1c8aff740000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2838", - "1c8aff740000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2839", - "1c8aff740000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2840", - "1c8aff780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2841", - "1c8aff780000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2842", - "1c8aff780000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2843", - "1c8aff780000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2844", - "1c8aff780000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2845", - "1c8aff780000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2846", - "1c8aff780000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2847", - "1c8aff780000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2848", - "1c8aff600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2849", - "1c8aff600000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2850", - "1c8aff600000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2851", - "1c8aff600000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2852", - "1c8aff600000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2853", - "1c8aff600000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2854", - "1c8aff600000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2855", - "1c8aff600000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2856", - "1c8aff400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2857", - "1c8aff400000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2858", - "1c8aff400000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2859", - "1c8aff400000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2860", - "1c8aff400000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2861", - "1c8aff400000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2862", - "1c8aff400000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2863", - "1c8aff400000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2864", - "1c8aff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2865", - "1c8aff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2866", - "1c8aff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2867", - "1c8aff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2868", - "1c8aff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2869", - "1c8aff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2870", - "1c8aff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2871", - "1c8aff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2872", - "1c8aff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2873", - "1c8aff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2874", - "1c8aff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2875", - "1c8aff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2876", - "1c8aff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2877", - "1c8aff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2878", - "1c8aff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2879", - "1c8aff800000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2880", - "1c8afe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2881", - "1c8afe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2882", - "1c8afe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2883", - "1c8afe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2884", - "1c8afe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2885", - "1c8afe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2886", - "1c8afe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2887", - "1c8afe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2888", - "1c8afc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2889", - "1c8afc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2890", - "1c8afc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2891", - "1c8afc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2892", - "1c8afc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2893", - "1c8afc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2894", - "1c8afc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2895", - "1c8afc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2896", - "1c8af8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2897", - "1c8af8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2898", - "1c8af8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2899", - "1c8af8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2900", - "1c8af8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2901", - "1c8af8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2902", - "1c8af8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2903", - "1c8af8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2904", - "1c8af0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2905", - "1c8af0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2906", - "1c8af0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2907", - "1c8af0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2908", - "1c8af0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2909", - "1c8af0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2910", - "1c8af0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2911", - "1c8af0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2912", - "1c8ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2913", - "1c8ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2914", - "1c8ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2915", - "1c8ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2916", - "1c8ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2917", - "1c8ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2918", - "1c8ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2919", - "1c8ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2920", - "1c8ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2921", - "1c8ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2922", - "1c8ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2923", - "1c8ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2924", - "1c8ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2925", - "1c8ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2926", - "1c8ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2927", - "1c8ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2928", - "1c8a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2929", - "1c8a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2930", - "1c8a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2931", - "1c8a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2932", - "1c8a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2933", - "1c8a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2934", - "1c8a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2935", - "1c8a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2936", - "1c8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2937", - "1c8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2938", - "1c8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2939", - "1c8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2940", - "1c8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2941", - "1c8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2942", - "1c8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2943", - "1c8a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2944", - "1c8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2945", - "1c8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2946", - "1c8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2947", - "1c8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2948", - "1c8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2949", - "1c8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2950", - "1c8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2951", - "1c8b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2952", - "1c8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2953", - "1c8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2954", - "1c8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2955", - "1c8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2956", - "1c8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2957", - "1c8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2958", - "1c8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2959", - "1c8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2960", - "1c8c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2961", - "1c8c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2962", - "1c8c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2963", - "1c8c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2964", - "1c8c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2965", - "1c8c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2966", - "1c8c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2967", - "1c8c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2968", - "1c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2969", - "1c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2970", - "1c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2971", - "1c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2972", - "1c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2973", - "1c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2974", - "1c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2975", - "1c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2976", - "1c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2977", - "1c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2978", - "1c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2979", - "1c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2980", - "1c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2981", - "1c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2982", - "1c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2983", - "1c9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2984", - "1ca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2985", - "1ca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2986", - "1ca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2987", - "1ca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2988", - "1ca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2989", - "1ca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2990", - "1ca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2991", - "1ca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-2992", - "1cc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-2993", - "1cc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-2994", - "1cc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-2995", - "1cc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-2996", - "1cc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-2997", - "1cc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-2998", - "1cc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-2999", - "1cc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-3000", - "1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-3001", - "1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-3002", - "1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-3003", - "1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-3004", - "1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-3005", - "1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-3006", - "1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-3007", - "1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-3008", - "1d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-3009", - "1d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-3010", - "1d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-3011", - "1d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-3012", - "1d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-3013", - "1d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-3014", - "1d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-3015", - "1d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-3016", - "1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-3017", - "1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-3018", - "1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-3019", - "1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-3020", - "1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-3021", - "1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-3022", - "1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-3023", - "1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-3024", - "180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-3025", - "180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-3026", - "180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-3027", - "180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-3028", - "180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-3029", - "180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-3030", - "180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-3031", - "180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-3032", - "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-3033", - "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-3034", - "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-3035", - "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-3036", - "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-3037", - "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-3038", - "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-3039", - "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-3040", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-3041", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-3042", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-3043", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-3044", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-3045", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-3046", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-3047", - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-3048", - "200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-3049", - "200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-3050", - "200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-3051", - "200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-3052", - "200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-3053", - "200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-3054", - "200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-3055", - "200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-3056", - "400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-3057", - "400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-3058", - "400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-3059", - "400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-3060", - "400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-3061", - "400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-3062", - "400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-3063", - "400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-3064", - "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000-1.2.3.0-3065", - "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001-1.2.3.1-3066", - "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002-1.2.3.2-3067", - "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003-1.2.3.3-3068", - "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004-1.2.3.4-3069", - "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005-1.2.3.5-3070", - "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006-1.2.3.6-3071", - "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007-1.2.3.7-3072" - ] -} \ No newline at end of file diff --git a/dht/message.go b/dht/message.go deleted file mode 100644 index 31ad475..0000000 --- a/dht/message.go +++ /dev/null @@ -1,463 +0,0 @@ -package dht - -import ( - "crypto/rand" - "encoding/hex" - "reflect" - "strconv" - "strings" - - "github.com/lbryio/lbry.go/errors" - "github.com/lbryio/reflector.go/dht/bits" - - "github.com/lyoshenka/bencode" - "github.com/spf13/cast" -) - -const ( - pingMethod = "ping" - storeMethod = "store" - findNodeMethod = "findNode" - findValueMethod = "findValue" -) - -const ( - pingSuccessResponse = "pong" - storeSuccessResponse = "OK" -) - -const ( - requestType = 0 - responseType = 1 - errorType = 2 -) - -const ( - // these are strings because bencode requires bytestring keys - headerTypeField = "0" - headerMessageIDField = "1" // message id is 20 bytes long - headerNodeIDField = "2" // node id is 48 bytes long - headerPayloadField = "3" - headerArgsField = "4" - contactsField = "contacts" - tokenField = "token" - protocolVersionField = "protocolVersion" -) - -// Message is a DHT message -type Message interface { - bencode.Marshaler -} - -type messageID [messageIDLength]byte - -// HexShort returns the first 8 hex characters of the hex encoded message id. -func (m messageID) HexShort() string { - return hex.EncodeToString(m[:])[:8] -} - -// UnmarshalBencode takes a byte slice and unmarshals the message id. -func (m *messageID) UnmarshalBencode(encoded []byte) error { - var str string - err := bencode.DecodeBytes(encoded, &str) - if err != nil { - return err - } - copy(m[:], str) - return nil -} - -// MarshallBencode returns the encoded byte slice of the message id. -func (m messageID) MarshalBencode() ([]byte, error) { - str := string(m[:]) - return bencode.EncodeBytes(str) -} - -func newMessageID() messageID { - var m messageID - _, err := rand.Read(m[:]) - if err != nil { - panic(err) - } - return m -} - -// Request represents a DHT request message -type Request struct { - ID messageID - NodeID bits.Bitmap - Method string - Arg *bits.Bitmap - StoreArgs *storeArgs - ProtocolVersion int -} - -// MarshalBencode returns the serialized byte slice representation of the request -func (r Request) MarshalBencode() ([]byte, error) { - var args interface{} - if r.StoreArgs != nil { - args = r.StoreArgs - } else if r.Arg != nil { - args = []bits.Bitmap{*r.Arg} - } else { - args = []string{} // request must always have keys 0-4, so we use an empty list for PING - } - return bencode.EncodeBytes(map[string]interface{}{ - headerTypeField: requestType, - headerMessageIDField: r.ID, - headerNodeIDField: r.NodeID, - headerPayloadField: r.Method, - headerArgsField: args, - }) -} - -// UnmarshalBencode unmarshals the serialized byte slice into the appropriate fields of the request. -func (r *Request) UnmarshalBencode(b []byte) error { - var raw struct { - ID messageID `bencode:"1"` - NodeID bits.Bitmap `bencode:"2"` - Method string `bencode:"3"` - Args bencode.RawMessage `bencode:"4"` - } - err := bencode.DecodeBytes(b, &raw) - if err != nil { - return errors.Prefix("request unmarshal", err) - } - - r.ID = raw.ID - r.NodeID = raw.NodeID - r.Method = raw.Method - - if r.Method == storeMethod { - r.StoreArgs = &storeArgs{} // bencode wont find the unmarshaler on a null pointer. need to fix it. - err = bencode.DecodeBytes(raw.Args, &r.StoreArgs) - if err != nil { - return errors.Prefix("request unmarshal", err) - } - } else if len(raw.Args) > 2 { // 2 because an empty list is `le` - r.Arg, r.ProtocolVersion, err = processArgsAndProtoVersion(raw.Args) - if err != nil { - return errors.Prefix("request unmarshal", err) - } - } - - return nil -} - -func processArgsAndProtoVersion(raw bencode.RawMessage) (arg *bits.Bitmap, version int, err error) { - var args []bencode.RawMessage - err = bencode.DecodeBytes(raw, &args) - if err != nil { - return nil, 0, err - } - - if len(args) == 0 { - return nil, 0, nil - } - - var extras map[string]int - err = bencode.DecodeBytes(args[len(args)-1], &extras) - if err == nil { - if v, exists := extras[protocolVersionField]; exists { - version = v - args = args[:len(args)-1] - } - } - - if len(args) > 0 { - var b bits.Bitmap - err = bencode.DecodeBytes(args[0], &b) - if err != nil { - return nil, 0, err - } - arg = &b - } - - return arg, version, nil -} - -func (r Request) argsDebug() string { - if r.StoreArgs != nil { - return r.StoreArgs.BlobHash.HexShort() + ", " + r.StoreArgs.Value.LbryID.HexShort() + ":" + strconv.Itoa(r.StoreArgs.Value.Port) - } else if r.Arg != nil { - return r.Arg.HexShort() - } - return "" -} - -type storeArgsValue struct { - Token string `bencode:"token"` - LbryID bits.Bitmap `bencode:"lbryid"` - Port int `bencode:"port"` -} - -type storeArgs struct { - BlobHash bits.Bitmap - Value storeArgsValue - NodeID bits.Bitmap // original publisher id? I think this is getting fixed in the new dht stuff - SelfStore bool // this is an int on the wire -} - -// MarshalBencode returns the serialized byte slice representation of the storage arguments. -func (s storeArgs) MarshalBencode() ([]byte, error) { - encodedValue, err := bencode.EncodeString(s.Value) - if err != nil { - return nil, err - } - - selfStoreStr := 0 - if s.SelfStore { - selfStoreStr = 1 - } - - return bencode.EncodeBytes([]interface{}{ - s.BlobHash, - bencode.RawMessage(encodedValue), - s.NodeID, - selfStoreStr, - }) -} - -// UnmarshalBencode unmarshals the serialized byte slice into the appropriate fields of the store arguments. -func (s *storeArgs) UnmarshalBencode(b []byte) error { - var argsInt []bencode.RawMessage - err := bencode.DecodeBytes(b, &argsInt) - if err != nil { - return errors.Prefix("storeArgs unmarshal", err) - } - - if len(argsInt) != 4 { - return errors.Err("unexpected number of fields for store args. got " + cast.ToString(len(argsInt))) - } - - err = bencode.DecodeBytes(argsInt[0], &s.BlobHash) - if err != nil { - return errors.Prefix("storeArgs unmarshal", err) - } - - err = bencode.DecodeBytes(argsInt[1], &s.Value) - if err != nil { - return errors.Prefix("storeArgs unmarshal", err) - } - - err = bencode.DecodeBytes(argsInt[2], &s.NodeID) - if err != nil { - return errors.Prefix("storeArgs unmarshal", err) - } - - var selfStore int - err = bencode.DecodeBytes(argsInt[3], &selfStore) - if err != nil { - return errors.Prefix("storeArgs unmarshal", err) - } - if selfStore == 0 { - s.SelfStore = false - } else if selfStore == 1 { - s.SelfStore = true - } else { - return errors.Err("selfstore must be 1 or 0") - } - - return nil -} - -// Response represents a DHT response message -type Response struct { - ID messageID - NodeID bits.Bitmap - Data string - Contacts []Contact - FindValueKey string - Token string - ProtocolVersion int -} - -func (r Response) argsDebug() string { - if r.Data != "" { - return r.Data - } - - str := "contacts " - if r.FindValueKey != "" { - str = "value for " + hex.EncodeToString([]byte(r.FindValueKey))[:8] + " " - } - - str += "|" - for _, c := range r.Contacts { - str += c.String() + "," - } - str = strings.TrimRight(str, ",") + "|" - - if r.Token != "" { - str += " token: " + hex.EncodeToString([]byte(r.Token))[:8] - } - - return str -} - -// MarshalBencode returns the serialized byte slice representation of the response. -func (r Response) MarshalBencode() ([]byte, error) { - data := map[string]interface{}{ - headerTypeField: responseType, - headerMessageIDField: r.ID, - headerNodeIDField: r.NodeID, - } - - if r.Data != "" { - // ping or store - data[headerPayloadField] = r.Data - } else if r.FindValueKey != "" { - // findValue success - if r.Token == "" { - return nil, errors.Err("response to findValue must have a token") - } - - var contacts [][]byte - for _, c := range r.Contacts { - compact, err := c.MarshalCompact() - if err != nil { - return nil, err - } - contacts = append(contacts, compact) - } - data[headerPayloadField] = map[string]interface{}{ - r.FindValueKey: contacts, - tokenField: r.Token, - } - } else if r.Token != "" { - // findValue failure falling back to findNode - data[headerPayloadField] = map[string]interface{}{ - contactsField: r.Contacts, - tokenField: r.Token, - } - } else { - // straight up findNode - data[headerPayloadField] = r.Contacts - } - - return bencode.EncodeBytes(data) -} - -// UnmarshalBencode unmarshals the serialized byte slice into the appropriate fields of the store arguments. -func (r *Response) UnmarshalBencode(b []byte) error { - var raw struct { - ID messageID `bencode:"1"` - NodeID bits.Bitmap `bencode:"2"` - Data bencode.RawMessage `bencode:"3"` - } - err := bencode.DecodeBytes(b, &raw) - if err != nil { - return err - } - - r.ID = raw.ID - r.NodeID = raw.NodeID - - // maybe data is a string (response to ping or store)? - err = bencode.DecodeBytes(raw.Data, &r.Data) - if err == nil { - return nil - } - - // maybe data is a list of contacts (response to findNode)? - err = bencode.DecodeBytes(raw.Data, &r.Contacts) - if err == nil { - return nil - } - - // it must be a response to findValue - var rawData map[string]bencode.RawMessage - err = bencode.DecodeBytes(raw.Data, &rawData) - if err != nil { - return err - } - - if token, ok := rawData[tokenField]; ok { - err = bencode.DecodeBytes(token, &r.Token) - if err != nil { - return err - } - delete(rawData, tokenField) // so it doesnt mess up findValue key finding below - } - - if protocolVersion, ok := rawData[protocolVersionField]; ok { - err = bencode.DecodeBytes(protocolVersion, &r.ProtocolVersion) - if err != nil { - return err - } - delete(rawData, protocolVersionField) // so it doesnt mess up findValue key finding below - } - - if contacts, ok := rawData[contactsField]; ok { - err = bencode.DecodeBytes(contacts, &r.Contacts) - if err != nil { - return err - } - } else { - for k, v := range rawData { - r.FindValueKey = k - var compactContacts [][]byte - err = bencode.DecodeBytes(v, &compactContacts) - if err != nil { - return err - } - for _, compact := range compactContacts { - var c Contact - err = c.UnmarshalCompact(compact) - if err != nil { - return err - } - r.Contacts = append(r.Contacts, c) - } - break - } - } - - return nil -} - -// Error represents a DHT error response -type Error struct { - ID messageID - NodeID bits.Bitmap - ExceptionType string - Response []string -} - -// MarshalBencode returns the serialized byte slice representation of an error message. -func (e Error) MarshalBencode() ([]byte, error) { - return bencode.EncodeBytes(map[string]interface{}{ - headerTypeField: errorType, - headerMessageIDField: e.ID, - headerNodeIDField: e.NodeID, - headerPayloadField: e.ExceptionType, - headerArgsField: e.Response, - }) -} - -// UnmarshalBencode unmarshals the serialized byte slice into the appropriate fields of the error message. -func (e *Error) UnmarshalBencode(b []byte) error { - var raw struct { - ID messageID `bencode:"1"` - NodeID bits.Bitmap `bencode:"2"` - ExceptionType string `bencode:"3"` - Args interface{} `bencode:"4"` - } - err := bencode.DecodeBytes(b, &raw) - if err != nil { - return err - } - - e.ID = raw.ID - e.NodeID = raw.NodeID - e.ExceptionType = raw.ExceptionType - - if reflect.TypeOf(raw.Args).Kind() == reflect.Slice { - v := reflect.ValueOf(raw.Args) - for i := 0; i < v.Len(); i++ { - e.Response = append(e.Response, cast.ToString(v.Index(i).Interface())) - } - } - - return nil -} diff --git a/dht/message_test.go b/dht/message_test.go deleted file mode 100644 index 040f5a1..0000000 --- a/dht/message_test.go +++ /dev/null @@ -1,223 +0,0 @@ -package dht - -import ( - "encoding/hex" - "net" - "reflect" - "strconv" - "strings" - "testing" - - "github.com/davecgh/go-spew/spew" - "github.com/lbryio/reflector.go/dht/bits" - "github.com/lyoshenka/bencode" -) - -func TestBencodeDecodeStoreArgs(t *testing.T) { - blobHash := "3214D6C2F77FCB5E8D5FC07EDAFBA614F031CE8B2EAB49F924F8143F6DFBADE048D918710072FB98AB1B52B58F4E1468" - lbryID := "7CE1B831DEC8689E44F80F547D2DEA171F6A625E1A4FF6C6165E645F953103DABEB068A622203F859C6C64658FD3AA3B" - port := hex.EncodeToString([]byte("3333")) - token := "17C2D8E1E48EF21567FE4AD5C8ED944B798D3B65AB58D0C9122AD6587D1B5FED472EA2CB12284CEFA1C21EFF302322BD" - nodeID := "7CE1B831DEC8689E44F80F547D2DEA171F6A625E1A4FF6C6165E645F953103DABEB068A622203F859C6C64658FD3AA3B" - selfStore := hex.EncodeToString([]byte("1")) - - raw := "6C" + // start args list - "3438 3A " + blobHash + // blob hash - "64" + // start value dict - "363A6C6272796964 3438 3A " + lbryID + // lbry id - "343A706F7274 69 " + port + " 65" + // port - "353A746F6B656E 3438 3A " + token + // token - "65" + // end value dict - "3438 3A " + nodeID + // node id - "69 " + selfStore + " 65" + // self store (integer) - "65" // end args list - - raw = strings.ToLower(strings.Replace(raw, " ", "", -1)) - - data, err := hex.DecodeString(raw) - if err != nil { - t.Error(err) - return - } - - storeArgs := &storeArgs{} - err = bencode.DecodeBytes(data, storeArgs) - if err != nil { - t.Error(err) - } - - if storeArgs.BlobHash.Hex() != strings.ToLower(blobHash) { - t.Error("blob hash mismatch") - } - if storeArgs.Value.LbryID.Hex() != strings.ToLower(lbryID) { - t.Error("lbryid mismatch") - } - if hex.EncodeToString([]byte(strconv.Itoa(storeArgs.Value.Port))) != port { - t.Error("port mismatch") - } - if hex.EncodeToString([]byte(storeArgs.Value.Token)) != strings.ToLower(token) { - t.Error("token mismatch") - } - if storeArgs.NodeID.Hex() != strings.ToLower(nodeID) { - t.Error("node id mismatch") - } - if !storeArgs.SelfStore { - t.Error("selfStore mismatch") - } - - reencoded, err := bencode.EncodeBytes(storeArgs) - if err != nil { - t.Error(err) - } else if !reflect.DeepEqual(reencoded, data) { - t.Error("reencoded data does not match original") - spew.Dump(reencoded, data) - } -} - -func TestBencodeFindNodesResponse(t *testing.T) { - res := Response{ - ID: newMessageID(), - NodeID: bits.Rand(), - Contacts: []Contact{ - {ID: bits.Rand(), IP: net.IPv4(1, 2, 3, 4).To4(), Port: 5678}, - {ID: bits.Rand(), IP: net.IPv4(4, 3, 2, 1).To4(), Port: 8765}, - }, - } - - encoded, err := bencode.EncodeBytes(res) - if err != nil { - t.Fatal(err) - } - - var res2 Response - err = bencode.DecodeBytes(encoded, &res2) - if err != nil { - t.Fatal(err) - } - - compareResponses(t, res, res2) -} - -func TestBencodeFindValueResponse(t *testing.T) { - res := Response{ - ID: newMessageID(), - NodeID: bits.Rand(), - FindValueKey: bits.Rand().RawString(), - Token: "arstarstarst", - Contacts: []Contact{ - {ID: bits.Rand(), IP: net.IPv4(1, 2, 3, 4).To4(), PeerPort: 8765}, - }, - } - - encoded, err := bencode.EncodeBytes(res) - if err != nil { - t.Fatal(err) - } - - var res2 Response - err = bencode.DecodeBytes(encoded, &res2) - if err != nil { - t.Fatal(err) - } - - compareResponses(t, res, res2) -} - -func TestDecodeSomeStrings(t *testing.T) { - strs := []string{ - "6469306569306569316532303a359ec440b8236dee0fb2500ebda9c4704ae6741469326534383ade269943996b4bef3ff41176668a0577f86aba7f1ea2996edd18f9c42430802c8085331345c5f0c44a7f352e2ba8ae59693365383a66696e644e6f64656934656c34383ade269943996b4bef3ff41176668a0577f86aba7f1ea2996edd18f9c42430802c8085331345c5f0c44a7f352e2ba8ae596565", - "64313a30693165313a3132303a31f27ec6174783c6f00e4b9ebccd49c6bdce300e313a3234383a7b3785cd962a56d4d4574262b1b63cc95d062c825b38f73602c7dc297c1e6b8259cdcdb5e7edef216d514e0c31ad8637313a3364353a746f6b656e34383a071fdf9835995889920e9beb876ebe8e36e5d44f5822684b549457405e22a5bf3fe40335743b459f22c347c0e736eba434383a7bcc7f8804db7d0d40fcb9c508547e53ee4f7d4000758105ecce099fc931d9cccfbbf9a30829777afcf41f2b4b0aeb716c35343a627db2b20d05b109195e7d06a855c392fda9a05faa878e69b18cc1212c35371ba5cad6231e049a460cdc263e7f4701afad45b288f48435343a424434ae0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343a4462ba020d059ed3d31ceb3d1ffb2c025abf065a14516a8942607f9b3fad4b697ccc232766bdf471b6518a3ed716f2712171fd046c4335343a47413e2b0d05bf6244e5edacf43f65ef4cfd4b6eac380244894cc364ec23e8ededfb085999a211e20f8de146d9e081bbb42dc61d9ca035343a627db2b20d05b109195e7d06a855c392fda9a05faa878e69b18cc1212c35371ba5cad6231e049a460cdc263e7f4701afad45b288f48435343a4462ba020d059ed3d31ceb3d1ffb2c025abf065a14516a8942607f9b3fad4b697ccc232766bdf471b6518a3ed716f2712171fd046c4335343a47413e2b0d05bf6244e5edacf43f65ef4cfd4b6eac380244894cc364ec23e8ededfb085999a211e20f8de146d9e081bbb42dc61d9ca035343a627db2b20d05b109195e7d06a855c392fda9a05faa878e69b18cc1212c35371ba5cad6231e049a460cdc263e7f4701afad45b288f48435343a68fe5c3e0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343a4462ba020d059ed3d31ceb3d1ffb2c025abf065a14516a8942607f9b3fad4b697ccc232766bdf471b6518a3ed716f2712171fd046c4335343a47413e2b0d05bf6244e5edacf43f65ef4cfd4b6eac380244894cc364ec23e8ededfb085999a211e20f8de146d9e081bbb42dc61d9ca035343a67d9a7ea0d05223c42ef5979c7c8f2444311f7a8266d64d3f98e9d0b21726bc2714a6fea5426c9a46a68c49ea13b54ccc324adf0783035343a68fe5c3e0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343a47413e2b0d05bf6244e5edacf43f65ef4cfd4b6eac380244894cc364ec23e8ededfb085999a211e20f8de146d9e081bbb42dc61d9ca035343a4462ba020d059ed3d31ceb3d1ffb2c025abf065a14516a8942607f9b3fad4b697ccc232766bdf471b6518a3ed716f2712171fd046c4335343a67d9a7ea0d05223c42ef5979c7c8f2444311f7a8266d64d3f98e9d0b21726bc2714a6fea5426c9a46a68c49ea13b54ccc324adf0783035343a424434ae0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343a4ace39c80d0541ae66325db4f1fce530476942d339f3219913f0a237726e18746a65ff7b3c5558c82c274a6f1ed10bbaf7c1305ca8e635343a47413e2b0d05bf6244e5edacf43f65ef4cfd4b6eac380244894cc364ec23e8ededfb085999a211e20f8de146d9e081bbb42dc61d9ca035343a4462ba020d059ed3d31ceb3d1ffb2c025abf065a14516a8942607f9b3fad4b697ccc232766bdf471b6518a3ed716f2712171fd046c4335343a627db2b20d05b109195e7d06a855c392fda9a05faa878e69b18cc1212c35371ba5cad6231e049a460cdc263e7f4701afad45b288f48435343a424434ae0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343a4ace39c80d0541ae66325db4f1fce530476942d339f3219913f0a237726e18746a65ff7b3c5558c82c274a6f1ed10bbaf7c1305ca8e635343a47413e2b0d05bf6244e5edacf43f65ef4cfd4b6eac380244894cc364ec23e8ededfb085999a211e20f8de146d9e081bbb42dc61d9ca035343a4462ba020d059ed3d31ceb3d1ffb2c025abf065a14516a8942607f9b3fad4b697ccc232766bdf471b6518a3ed716f2712171fd046c4335343a67d9a7ea0d05223c42ef5979c7c8f2444311f7a8266d64d3f98e9d0b21726bc2714a6fea5426c9a46a68c49ea13b54ccc324adf0783035343a4ace39c80d0541ae66325db4f1fce530476942d339f3219913f0a237726e18746a65ff7b3c5558c82c274a6f1ed10bbaf7c1305ca8e635343a47413e2b0d05bf6244e5edacf43f65ef4cfd4b6eac380244894cc364ec23e8ededfb085999a211e20f8de146d9e081bbb42dc61d9ca035343a4462ba020d059ed3d31ceb3d1ffb2c025abf065a14516a8942607f9b3fad4b697ccc232766bdf471b6518a3ed716f2712171fd046c4335343a67d9a7ea0d05223c42ef5979c7c8f2444311f7a8266d64d3f98e9d0b21726bc2714a6fea5426c9a46a68c49ea13b54ccc324adf0783035343a68fe5c3e0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343a4ace39c80d0541ae66325db4f1fce530476942d339f3219913f0a237726e18746a65ff7b3c5558c82c274a6f1ed10bbaf7c1305ca8e635343a47413e2b0d05bf6244e5edacf43f65ef4cfd4b6eac380244894cc364ec23e8ededfb085999a211e20f8de146d9e081bbb42dc61d9ca035343a68fe5c3e0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343a4ace39c80d0541ae66325db4f1fce530476942d339f3219913f0a237726e18746a65ff7b3c5558c82c274a6f1ed10bbaf7c1305ca8e635343a47413e2b0d05bf6244e5edacf43f65ef4cfd4b6eac380244894cc364ec23e8ededfb085999a211e20f8de146d9e081bbb42dc61d9ca035343a4462ba020d059ed3d31ceb3d1ffb2c025abf065a14516a8942607f9b3fad4b697ccc232766bdf471b6518a3ed716f2712171fd046c4335343a67d9a7ea0d05223c42ef5979c7c8f2444311f7a8266d64d3f98e9d0b21726bc2714a6fea5426c9a46a68c49ea13b54ccc324adf0783035343a68fe5c3e0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343a4ace39c80d0541ae66325db4f1fce530476942d339f3219913f0a237726e18746a65ff7b3c5558c82c274a6f1ed10bbaf7c1305ca8e635343a47413e2b0d05bf6244e5edacf43f65ef4cfd4b6eac380244894cc364ec23e8ededfb085999a211e20f8de146d9e081bbb42dc61d9ca035343a4462ba020d059ed3d31ceb3d1ffb2c025abf065a14516a8942607f9b3fad4b697ccc232766bdf471b6518a3ed716f2712171fd046c4335343a67d9a7ea0d05223c42ef5979c7c8f2444311f7a8266d64d3f98e9d0b21726bc2714a6fea5426c9a46a68c49ea13b54ccc324adf0783035343a68fe5c3e0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343a4ace39c80d0541ae66325db4f1fce530476942d339f3219913f0a237726e18746a65ff7b3c5558c82c274a6f1ed10bbaf7c1305ca8e635343a47413e2b0d05bf6244e5edacf43f65ef4cfd4b6eac380244894cc364ec23e8ededfb085999a211e20f8de146d9e081bbb42dc61d9ca035343a4462ba020d059ed3d31ceb3d1ffb2c025abf065a14516a8942607f9b3fad4b697ccc232766bdf471b6518a3ed716f2712171fd046c4335343a67d9a7ea0d05223c42ef5979c7c8f2444311f7a8266d64d3f98e9d0b21726bc2714a6fea5426c9a46a68c49ea13b54ccc324adf0783035343a490ed98d0d05722bfafc5574fef0b2897737c91ac9e0ba0c8dadf3f8d51abb9cc46d485cad44a2d8d67e729fcf20a9dafdef2176026935343a490ed98d0d05722bfafc5574fef0b2897737c91ac9e0ba0c8dadf3f8d51abb9cc46d485cad44a2d8d67e729fcf20a9dafdef2176026935343a490ed98d0d05722bfafc5574fef0b2897737c91ac9e0ba0c8dadf3f8d51abb9cc46d485cad44a2d8d67e729fcf20a9dafdef2176026935343a424434ae0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343a4ace39c80d0541ae66325db4f1fce530476942d339f3219913f0a237726e18746a65ff7b3c5558c82c274a6f1ed10bbaf7c1305ca8e635343a47413e2b0d05bf6244e5edacf43f65ef4cfd4b6eac380244894cc364ec23e8ededfb085999a211e20f8de146d9e081bbb42dc61d9ca035343a4462ba020d059ed3d31ceb3d1ffb2c025abf065a14516a8942607f9b3fad4b697ccc232766bdf471b6518a3ed716f2712171fd046c4335343a67d9a7ea0d05223c42ef5979c7c8f2444311f7a8266d64d3f98e9d0b21726bc2714a6fea5426c9a46a68c49ea13b54ccc324adf0783035343a490ed98d0d05722bfafc5574fef0b2897737c91ac9e0ba0c8dadf3f8d51abb9cc46d485cad44a2d8d67e729fcf20a9dafdef2176026935343a424434ae0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343a4ace39c80d0541ae66325db4f1fce530476942d339f3219913f0a237726e18746a65ff7b3c5558c82c274a6f1ed10bbaf7c1305ca8e635343a47413e2b0d05bf6244e5edacf43f65ef4cfd4b6eac380244894cc364ec23e8ededfb085999a211e20f8de146d9e081bbb42dc61d9ca035343a4462ba020d059ed3d31ceb3d1ffb2c025abf065a14516a8942607f9b3fad4b697ccc232766bdf471b6518a3ed716f2712171fd046c4335343a67d9a7ea0d05223c42ef5979c7c8f2444311f7a8266d64d3f98e9d0b21726bc2714a6fea5426c9a46a68c49ea13b54ccc324adf0783035343a4ace39c80d0541ae66325db4f1fce530476942d339f3219913f0a237726e18746a65ff7b3c5558c82c274a6f1ed10bbaf7c1305ca8e635343a424434ae0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343a4ace39c80d0541ae66325db4f1fce530476942d339f3219913f0a237726e18746a65ff7b3c5558c82c274a6f1ed10bbaf7c1305ca8e635343a490ed98d0d05722bfafc5574fef0b2897737c91ac9e0ba0c8dadf3f8d51abb9cc46d485cad44a2d8d67e729fcf20a9dafdef2176026935343a68fe5c3e0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343a4ace39c80d0541ae66325db4f1fce530476942d339f3219913f0a237726e18746a65ff7b3c5558c82c274a6f1ed10bbaf7c1305ca8e635343a490ed98d0d05722bfafc5574fef0b2897737c91ac9e0ba0c8dadf3f8d51abb9cc46d485cad44a2d8d67e729fcf20a9dafdef2176026935343a68fe5c3e0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343a4ace39c80d0541ae66325db4f1fce530476942d339f3219913f0a237726e18746a65ff7b3c5558c82c274a6f1ed10bbaf7c1305ca8e635343a490ed98d0d05722bfafc5574fef0b2897737c91ac9e0ba0c8dadf3f8d51abb9cc46d485cad44a2d8d67e729fcf20a9dafdef2176026935343a68fe5c3e0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343a68fe5c3e0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343a4ace39c80d0541ae66325db4f1fce530476942d339f3219913f0a237726e18746a65ff7b3c5558c82c274a6f1ed10bbaf7c1305ca8e635343abcbae8200d050ffa2a9336bf260ee376194faed30de40e73108beb4158fb6f78da823f29c97b497c45b40872ead7230736deba92bbaf35343a4462ba020d059ed3d31ceb3d1ffb2c025abf065a14516a8942607f9b3fad4b697ccc232766bdf471b6518a3ed716f2712171fd046c4335343a68fe5c3d0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343abcbae8200d050ffa2a9336bf260ee376194faed30de40e73108beb4158fb6f78da823f29c97b497c45b40872ead7230736deba92bbaf35343a4462ba020d059ed3d31ceb3d1ffb2c025abf065a14516a8942607f9b3fad4b697ccc232766bdf471b6518a3ed716f2712171fd046c4335343a68fe5c3d0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343a4ace39c80d0541ae66325db4f1fce530476942d339f3219913f0a237726e18746a65ff7b3c5558c82c274a6f1ed10bbaf7c1305ca8e635343a627db2b20d05b109195e7d06a855c392fda9a05faa878e69b18cc1212c35371ba5cad6231e049a460cdc263e7f4701afad45b288f48435343a4462ba020d059ed3d31ceb3d1ffb2c025abf065a14516a8942607f9b3fad4b697ccc232766bdf471b6518a3ed716f2712171fd046c4335343a68fe5c3d0d05bfd6e1b98cc921b441fa8b560ac29038c37ec4907ae023617bf2bbc54abd3403226daf479798edcce69743ea6699e6ff35343a4ace39c80d0541ae66325db4f1fce530476942d339f3219913f0a237726e18746a65ff7b3c5558c82c274a6f1ed10bbaf7c1305ca8e6656565", - "64313a30693165313a3132303aa19e41f1d887db705fbf0a58f120773069d6ff11313a3234383a6911c21c3b5ea6536f4fb170c87fdc8bf4201124c5fe5eeb5f0054ff48e899a1d6e089a30a12ba8683ebf79691d71439313a3364383a636f6e74616374736c6c34383a6dd3dedeec334bae70a3c5c1b58fef2d4a501af320a332cdd5db4b71945c0a90d11aa2013e8d0216258a643f42d9562631323a34362e32382e3230342e3738693434343465656c34383a7ec0edf204d940d21c17e1c979df1c94610711d7773ceda72a4aa925c5f7799bbb741caa8d6d877aa2776399f77c08a031333a36392e3131382e34332e313234693434343465656c34383a6ec15cd8b95718d010bdf9739fda1af9ded7ac8be7da5cced6dc7a08470c8109accc5bfb973e5c1dd711349c62a8a3c331323a34362e32382e3230342e3738693434343465656c34383a6d2603a690712d5a3d5addb228d31a622f798c64ab2d3576d2c3ab3c5a64cb863c05545f37aa384ce83003416ca5cea431323a34362e32382e3230342e3738693434343465656c34383a6c1d92202a7e74ec85dd4e3e1699303174c4b6460b171637bba0a1c068d72f389035e1ba8bbe70f6621c36d70d4d045031323a34362e32382e3230342e3738693434343465656c34383a6dac30fbe94c006515cffe4898bc534a105fd0403bfc3c8692c2751b7946949dbc9e0c9570477cf8f817d1efc9a0e02531343a31382e3232312e3139342e313933693434343465656c34383a6f2ee379c662ea9f6db86beed6023be300cd23b9f9c4610a195dcb0f258392ec77188854ea3a8c0fffe67844849eb6ca31333a32342e3131362e39302e323238693434343465656c34383a6c55b2dbb89010de9db88e0ad3510a79fe60983b394a9e66b0efe139a455973cdc4415beff82cbdfb63d98caad648ab031333a38382e3132392e3234352e33396934343434656565353a746f6b656e34383a51844b0d1e8a613c4ad783c03b323063d3a5ff063a640368d7754bcae277c22b2b06b46c3e5466c30acb773f77b686476565", - "64313a30693165313a3132303af693334af099a987a4b55af2727472b51c1990db313a3234383ab6928ff25778a7bbb5d258d3b3a06e26db1654f3d2efce8c26681d43f7237cdf2e359a4d309c4473d5d89ec99fb4f573313a3364353a746f6b656e34383a61a45a40080ea118361f919ebf09cdc9d2c63f476e7bc4d193463f52b91dc4b0db4ed1004e32d4fc273645421e58479034383abe463e24af015c0d1ba496b4b1911aa98c8b42119295bbcc5c36829a2e2ff8f149743cbbc0af2c39669cb0750fd778576c35343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e9535343a239911670d05234aa57f90985a97e6e67a5131a4f8fe7dfccaacb4707734294b8ad774c92eb424671aa533e76c3083da796b4db30e95656565", - "6469306569316569316532303a3e0929c88abb8fe1d718025efc7f4a3cd85de16269326534383a21b2e2d2996b4bef3ff41176668a0577f86aba7f1ea2996edd18f9c42430802c8085331345c5f0c44a7f352e2ba8ae596933656c6565", - } - - for i, str := range strs { - raw, err := hex.DecodeString(str) - if err != nil { - t.Errorf("error hex-decoding string %d: %s", i, err) - continue - } - - var decoded interface{} - err = bencode.DecodeBytes(raw, &decoded) - if err != nil { - t.Errorf("error bencode-decoding string %d: %s", i, err) - continue - } - // - //t.Error("TODO") - //continue - // - //spew.Dump(decoded) - } -} - -func TestDecodeFindNodeResponseWithNoNodes(t *testing.T) { - raw, err := hex.DecodeString("6469306569316569316532303a3e0929c88abb8fe1d718025efc7f4a3cd85de16269326534383a21b2e2d2996b4bef3ff41176668a0577f86aba7f1ea2996edd18f9c42430802c8085331345c5f0c44a7f352e2ba8ae596933656c6565") - if err != nil { - t.Fatal(err) - } - - response := Response{} - err = bencode.DecodeBytes(raw, &response) - //spew.Dump(response) - if err != nil { - t.Fatal(err) - } -} - -func TestDecodeRequestWithProtocolVersion(t *testing.T) { - raw, err := hex.DecodeString("6469306569306569316532303a65e1b9afce87c44abc40b4bb466890d2797f0dd269326534383a1baf3dbba8746c7a739f35465e268ace823622c5e8ec1dd7d5d27af5795cfbc54f22a32fbd05d420f241266b3dd16831693365343a70696e676934656c6431353a70726f746f636f6c56657273696f6e693165656565") - if err != nil { - t.Fatal(err) - } - - req := Request{} - err = bencode.DecodeBytes(raw, &req) - if err != nil { - t.Fatal(err) - } - - if req.ProtocolVersion != 1 { - t.Error("protocol version was not detected correctly") - } -} - -func TestDecodeResponseWithProtocolVersion(t *testing.T) { - raw, err := hex.DecodeString("6469306569316569316532303a2b96f5de8be1e86dc2332a50eb313c97848064db69326534383a8b8eb692658ea3d7e7828e80a3133d524c6f82aaff370efa759d5b87821035a32de06724cb099f01a819695f829dff7f6933656431353a70726f746f636f6c56657273696f6e693165353a746f6b656e34383af2368fe4fd06ede6631ad8b153f3b5d8db724f8d520f4291e992e206dd02a216fb7dfd9b81686f11b626e3840df65fb434383a89c5c3f9794b0b24a03406e3b74361edb9ae70828e4c133512fc75db0a2d312673cdd4e30eed37892a46692d2fe439f36c35343a12dd65af0d058cd7d10d122fbe2eb5ae31062b7480011be588f20cfe6807b1939c42eea639059fa6365bfccb56ef8c9e574f49ba035c656565") - if err != nil { - t.Fatal(err) - } - - res := Response{} - err = bencode.DecodeBytes(raw, &res) - if err != nil { - t.Fatal(err) - } - - if res.ProtocolVersion != 1 { - t.Error("protocol version was not detected correctly") - } -} - -func compareResponses(t *testing.T, res, res2 Response) { - if res.ID != res2.ID { - t.Errorf("expected ID %s, got %s", res.ID, res2.ID) - } - if !res.NodeID.Equals(res2.NodeID) { - t.Errorf("expected NodeID %s, got %s", res.NodeID.Hex(), res2.NodeID.Hex()) - } - if res.Data != res2.Data { - t.Errorf("expected Data %s, got %s", res.Data, res2.Data) - } - if res.FindValueKey != res2.FindValueKey { - t.Errorf("expected FindValueKey %s, got %s", res.FindValueKey, res2.FindValueKey) - } - if res.Token != res2.Token { - t.Errorf("expected Token %s, got %s", res.Token, res2.Token) - } - if !reflect.DeepEqual(res.Contacts, res2.Contacts) { - t.Errorf("expected FindNodeData %s, got %s", spew.Sdump(res.Contacts), spew.Sdump(res2.Contacts)) - } -} diff --git a/dht/node.go b/dht/node.go deleted file mode 100644 index 7024576..0000000 --- a/dht/node.go +++ /dev/null @@ -1,474 +0,0 @@ -package dht - -import ( - "encoding/hex" - "net" - "strings" - "sync" - "time" - - "github.com/lbryio/errors.go" - "github.com/lbryio/lbry.go/stop" - "github.com/lbryio/lbry.go/util" - "github.com/lbryio/reflector.go/dht/bits" - - "github.com/davecgh/go-spew/spew" - "github.com/lyoshenka/bencode" -) - -// packet represents the information receive from udp. -type packet struct { - data []byte - raddr *net.UDPAddr -} - -// UDPConn allows using a mocked connection to test sending/receiving data -// TODO: stop mocking this and use the real thing -type UDPConn interface { - ReadFromUDP([]byte) (int, *net.UDPAddr, error) - WriteToUDP([]byte, *net.UDPAddr) (int, error) - SetReadDeadline(time.Time) error - SetWriteDeadline(time.Time) error - Close() error -} - -// RequestHandlerFunc is exported handler for requests. -type RequestHandlerFunc func(addr *net.UDPAddr, request Request) - -// Node is a type representation of a node on the network. -type Node struct { - // the node's id - id bits.Bitmap - // UDP connection for sending and receiving data - conn UDPConn - // true if we've closed the connection on purpose - connClosed bool - // token manager - tokens *tokenManager - - // map of outstanding transactions + mutex - txLock *sync.RWMutex - transactions map[messageID]*transaction - - // routing table - rt *routingTable - // data store - store *contactStore - - // overrides for request handlers - requestHandler RequestHandlerFunc - - // stop the node neatly and clean up after itself - grp *stop.Group -} - -// NewNode returns an initialized Node's pointer. -func NewNode(id bits.Bitmap) *Node { - return &Node{ - id: id, - rt: newRoutingTable(id), - store: newStore(), - - txLock: &sync.RWMutex{}, - transactions: make(map[messageID]*transaction), - - grp: stop.New(), - tokens: &tokenManager{}, - } -} - -// Connect connects to the given connection and starts any background threads necessary -func (n *Node) Connect(conn UDPConn) error { - n.conn = conn - - n.tokens.Start(tokenSecretRotationInterval) - - go func() { - // stop tokens and close the connection when we're shutting down - <-n.grp.Ch() - n.tokens.Stop() - n.connClosed = true - err := n.conn.Close() - if err != nil { - log.Error("error closing node connection on shutdown - ", err) - } - }() - - packets := make(chan packet) - - n.grp.Add(1) - go func() { - defer n.grp.Done() - - buf := make([]byte, udpMaxMessageLength) - - for { - bytesRead, raddr, err := n.conn.ReadFromUDP(buf) - if err != nil { - if n.connClosed { - return - } - log.Errorf("udp read error: %v", err) - continue - } else if raddr == nil { - log.Errorf("udp read with no raddr") - continue - } - - data := make([]byte, bytesRead) - copy(data, buf[:bytesRead]) // slices use the same underlying array, so we need a new one for each packet - - select { // needs select here because packet consumer can quit and the packets channel gets filled up and blocks - case packets <- packet{data: data, raddr: raddr}: - case <-n.grp.Ch(): - return - } - } - }() - - n.grp.Add(1) - go func() { - defer n.grp.Done() - - var pkt packet - - for { - select { - case pkt = <-packets: - n.handlePacket(pkt) - case <-n.grp.Ch(): - return - } - } - }() - - // TODO: turn this back on when you're sure it works right - n.grp.Add(1) - go func() { - defer n.grp.Done() - n.startRoutingTableGrooming() - }() - - return nil -} - -// Shutdown shuts down the node -func (n *Node) Shutdown() { - log.Debugf("[%s] node shutting down", n.id.HexShort()) - n.grp.StopAndWait() - log.Debugf("[%s] node stopped", n.id.HexShort()) -} - -// handlePacket handles packets received from udp. -func (n *Node) handlePacket(pkt packet) { - //log.Debugf("[%s] Received message from %s (%d bytes) %s", n.id.HexShort(), pkt.raddr.String(), len(pkt.data), hex.EncodeToString(pkt.data)) - - if !util.InSlice(string(pkt.data[0:5]), []string{"d1:0i", "di0ei"}) { - log.Errorf("[%s] data is not a well-formatted dict: (%d bytes) %s", n.id.HexShort(), len(pkt.data), hex.EncodeToString(pkt.data)) - return - } - - // the following is a bit of a hack, but it lets us avoid decoding every message twice - // it depends on the data being a dict with 0 as the first key (so it starts with "d1:0i") and the message type as the first value - // TODO: test this more thoroughly - - switch pkt.data[5] { - case '0' + requestType: - request := Request{} - err := bencode.DecodeBytes(pkt.data, &request) - if err != nil { - log.Errorf("[%s] error decoding request from %s: %s: (%d bytes) %s", n.id.HexShort(), pkt.raddr.String(), err.Error(), len(pkt.data), hex.EncodeToString(pkt.data)) - return - } - log.Debugf("[%s] query %s: received request from %s: %s(%s)", n.id.HexShort(), request.ID.HexShort(), request.NodeID.HexShort(), request.Method, request.argsDebug()) - n.handleRequest(pkt.raddr, request) - - case '0' + responseType: - response := Response{} - err := bencode.DecodeBytes(pkt.data, &response) - if err != nil { - log.Errorf("[%s] error decoding response from %s: %s: (%d bytes) %s", n.id.HexShort(), pkt.raddr.String(), err.Error(), len(pkt.data), hex.EncodeToString(pkt.data)) - return - } - log.Debugf("[%s] query %s: received response from %s: %s", n.id.HexShort(), response.ID.HexShort(), response.NodeID.HexShort(), response.argsDebug()) - n.handleResponse(pkt.raddr, response) - - case '0' + errorType: - e := Error{} - err := bencode.DecodeBytes(pkt.data, &e) - if err != nil { - log.Errorf("[%s] error decoding error from %s: %s: (%d bytes) %s", n.id.HexShort(), pkt.raddr.String(), err.Error(), len(pkt.data), hex.EncodeToString(pkt.data)) - return - } - log.Debugf("[%s] query %s: received error from %s: %s", n.id.HexShort(), e.ID.HexShort(), e.NodeID.HexShort(), e.ExceptionType) - n.handleError(pkt.raddr, e) - - default: - log.Errorf("[%s] invalid message type: %s", n.id.HexShort(), string(pkt.data[5])) - return - } -} - -// handleRequest handles the requests received from udp. -func (n *Node) handleRequest(addr *net.UDPAddr, request Request) { - if request.NodeID.Equals(n.id) { - log.Warn("ignoring self-request") - return - } - - // if a handler is overridden, call it instead - if n.requestHandler != nil { - n.requestHandler(addr, request) - return - } - - switch request.Method { - default: - //n.sendMessage(addr, Error{ID: request.ID, NodeID: n.id, ExceptionType: "invalid-request-method"}) - log.Errorln("invalid request method") - return - case pingMethod: - err := n.sendMessage(addr, Response{ID: request.ID, NodeID: n.id, Data: pingSuccessResponse}) - if err != nil { - log.Error("error sending 'pingmethod' response message - ", err) - } - case storeMethod: - // TODO: we should be sending the IP in the request, not just using the sender's IP - // TODO: should we be using StoreArgs.NodeID or StoreArgs.Value.LbryID ??? - if n.tokens.Verify(request.StoreArgs.Value.Token, request.NodeID, addr) { - n.Store(request.StoreArgs.BlobHash, Contact{ID: request.StoreArgs.NodeID, IP: addr.IP, Port: addr.Port, PeerPort: request.StoreArgs.Value.Port}) - - err := n.sendMessage(addr, Response{ID: request.ID, NodeID: n.id, Data: storeSuccessResponse}) - if err != nil { - log.Error("error sending 'storemethod' response message - ", err) - } - } else { - err := n.sendMessage(addr, Error{ID: request.ID, NodeID: n.id, ExceptionType: "invalid-token"}) - if err != nil { - log.Error("error sending 'storemethod'response message for invalid-token - ", err) - } - } - case findNodeMethod: - if request.Arg == nil { - log.Errorln("request is missing arg") - return - } - err := n.sendMessage(addr, Response{ - ID: request.ID, - NodeID: n.id, - Contacts: n.rt.GetClosest(*request.Arg, bucketSize), - }) - if err != nil { - log.Error("error sending 'findnodemethod' response message - ", err) - } - - case findValueMethod: - if request.Arg == nil { - log.Errorln("request is missing arg") - return - } - - res := Response{ - ID: request.ID, - NodeID: n.id, - Token: n.tokens.Get(request.NodeID, addr), - } - - if contacts := n.store.Get(*request.Arg); len(contacts) > 0 { - res.FindValueKey = request.Arg.RawString() - res.Contacts = contacts - } else { - res.Contacts = n.rt.GetClosest(*request.Arg, bucketSize) - } - - err := n.sendMessage(addr, res) - if err != nil { - log.Error("error sending 'findvaluemethod' response message - ", err) - } - } - - // nodes that send us requests should not be inserted, only refreshed. - // the routing table must only contain "good" nodes, which are nodes that reply to our requests - // if a node is already good (aka in the table), its fine to refresh it - // http://www.bittorrent.org/beps/bep_0005.html#routing-table - n.rt.Fresh(Contact{ID: request.NodeID, IP: addr.IP, Port: addr.Port}) -} - -// handleResponse handles responses received from udp. -func (n *Node) handleResponse(addr *net.UDPAddr, response Response) { - tx := n.txFind(response.ID, Contact{ID: response.NodeID, IP: addr.IP, Port: addr.Port}) - if tx != nil { - select { - case tx.res <- response: - default: - //log.Errorf("[%s] query %s: response received, but tx has no listener or multiple responses to the same tx", n.id.HexShort(), response.ID.HexShort()) - } - } - - n.rt.Update(Contact{ID: response.NodeID, IP: addr.IP, Port: addr.Port}) -} - -// handleError handles errors received from udp. -func (n *Node) handleError(addr *net.UDPAddr, e Error) { - spew.Dump(e) - n.rt.Fresh(Contact{ID: e.NodeID, IP: addr.IP, Port: addr.Port}) -} - -// send sends data to a udp address -func (n *Node) sendMessage(addr *net.UDPAddr, data Message) error { - encoded, err := bencode.EncodeBytes(data) - if err != nil { - return errors.Err(err) - } - - if req, ok := data.(Request); ok { - log.Debugf("[%s] query %s: sending request to %s (%d bytes) %s(%s)", - n.id.HexShort(), req.ID.HexShort(), addr.String(), len(encoded), req.Method, req.argsDebug()) - } else if res, ok := data.(Response); ok { - log.Debugf("[%s] query %s: sending response to %s (%d bytes) %s", - n.id.HexShort(), res.ID.HexShort(), addr.String(), len(encoded), res.argsDebug()) - } else { - log.Debugf("[%s] (%d bytes) %s", n.id.HexShort(), len(encoded), spew.Sdump(data)) - } - - err = n.conn.SetWriteDeadline(time.Now().Add(5 * time.Second)) - if err != nil { - if n.connClosed { - return nil - } - log.Error("error setting write deadline - ", err) - } - - _, err = n.conn.WriteToUDP(encoded, addr) - return errors.Err(err) -} - -// transaction represents a single query to the dht. it stores the queried contact, the request, and the response channel -type transaction struct { - contact Contact - req Request - res chan Response - skipIDCheck bool -} - -// insert adds a transaction to the manager. -func (n *Node) txInsert(tx *transaction) { - n.txLock.Lock() - defer n.txLock.Unlock() - n.transactions[tx.req.ID] = tx -} - -// delete removes a transaction from the manager. -func (n *Node) txDelete(id messageID) { - n.txLock.Lock() - defer n.txLock.Unlock() - delete(n.transactions, id) -} - -// Find finds a transaction for the given id and contact -func (n *Node) txFind(id messageID, c Contact) *transaction { - n.txLock.RLock() - defer n.txLock.RUnlock() - - t, ok := n.transactions[id] - if !ok || !t.contact.Equals(c, !t.skipIDCheck) { - return nil - } - - return t -} - -// SendOptions controls the behavior of send calls -type SendOptions struct { - skipIDCheck bool -} - -// SendAsync sends a transaction and returns a channel that will eventually contain the transaction response -// The response channel is closed when the transaction is completed or times out. -func (n *Node) SendAsync(contact Contact, req Request, options ...SendOptions) <-chan *Response { - ch := make(chan *Response, 1) - - if contact.ID.Equals(n.id) { - log.Error("sending query to self") - close(ch) - return ch - } - - go func() { - defer close(ch) - - req.ID = newMessageID() - req.NodeID = n.id - tx := &transaction{ - contact: contact, - req: req, - res: make(chan Response), - } - - if len(options) > 0 && options[0].skipIDCheck { - tx.skipIDCheck = true - } - - n.txInsert(tx) - defer n.txDelete(tx.req.ID) - - for i := 0; i < udpRetry; i++ { - err := n.sendMessage(contact.Addr(), tx.req) - if err != nil { - if !strings.Contains(err.Error(), "use of closed network connection") { // this only happens on localhost. real UDP has no connections - log.Error("send error: ", err) - } - continue - } - - select { - case res := <-tx.res: - ch <- &res - return - case <-n.grp.Ch(): - return - case <-time.After(udpTimeout): - } - } - - // notify routing table about a failure to respond - n.rt.Fail(tx.contact) - }() - - return ch -} - -// Send sends a transaction and blocks until the response is available. It returns a response, or nil -// if the transaction timed out. -func (n *Node) Send(contact Contact, req Request, options ...SendOptions) *Response { - return <-n.SendAsync(contact, req, options...) -} - -// CountActiveTransactions returns the number of transactions in the manager -func (n *Node) CountActiveTransactions() int { - n.txLock.Lock() - defer n.txLock.Unlock() - return len(n.transactions) -} - -func (n *Node) startRoutingTableGrooming() { - refreshTicker := time.NewTicker(tRefresh / 5) // how often to check for buckets that need to be refreshed - for { - select { - case <-refreshTicker.C: - RoutingTableRefresh(n, tRefresh, n.grp.Child()) - case <-n.grp.Ch(): - return - } - } -} - -// Store stores a node contact in the node's contact store. -func (n *Node) Store(hash bits.Bitmap, c Contact) { - n.store.Upsert(hash, c) -} - -//AddKnownNode adds a known-good node to the routing table -func (n *Node) AddKnownNode(c Contact) { - n.rt.Update(c) -} diff --git a/dht/node_finder.go b/dht/node_finder.go deleted file mode 100644 index 50cb14d..0000000 --- a/dht/node_finder.go +++ /dev/null @@ -1,338 +0,0 @@ -package dht - -import ( - "sync" - "time" - - "github.com/lbryio/lbry.go/crypto" - "github.com/lbryio/lbry.go/errors" - "github.com/lbryio/lbry.go/stop" - "github.com/lbryio/reflector.go/dht/bits" - - "github.com/sirupsen/logrus" - "github.com/uber-go/atomic" -) - -// TODO: iterativeFindValue may be stopping early. if it gets a response with one peer, it should keep going because other nodes may know about more peers that have that blob -// TODO: or, it should try a tcp handshake with peers as it finds them, to make sure they are still online and have the blob - -var cfLog *logrus.Logger - -func init() { - cfLog = logrus.StandardLogger() -} - -func NodeFinderUseLogger(l *logrus.Logger) { - cfLog = l -} - -type contactFinder struct { - findValue bool // true if we're using findValue - target bits.Bitmap - node *Node - - grp *stop.Group - - findValueMutex *sync.Mutex - findValueResult []Contact - - activeContactsMutex *sync.Mutex - activeContacts []Contact - - shortlistMutex *sync.Mutex - shortlist []Contact - shortlistAdded map[bits.Bitmap]bool - - closestContactMutex *sync.RWMutex - closestContact *Contact - notGettingCloser *atomic.Bool -} - -func FindContacts(node *Node, target bits.Bitmap, findValue bool, parentGrp *stop.Group) ([]Contact, bool, error) { - cf := &contactFinder{ - node: node, - target: target, - findValue: findValue, - findValueMutex: &sync.Mutex{}, - activeContactsMutex: &sync.Mutex{}, - shortlistMutex: &sync.Mutex{}, - shortlistAdded: make(map[bits.Bitmap]bool), - grp: stop.New(parentGrp), - closestContactMutex: &sync.RWMutex{}, - notGettingCloser: atomic.NewBool(false), - } - - return cf.Find() -} - -func (cf *contactFinder) Stop() { - cf.grp.StopAndWait() -} - -func (cf *contactFinder) Find() ([]Contact, bool, error) { - if cf.findValue { - cf.debug("starting iterativeFindValue") - } else { - cf.debug("starting iterativeFindNode") - } - - cf.appendNewToShortlist(cf.node.rt.GetClosest(cf.target, alpha)) - if len(cf.shortlist) == 0 { - return nil, false, errors.Err("[%s] find %s: no contacts in routing table", cf.node.id.HexShort(), cf.target.HexShort()) - } - - go cf.cycle(false) - timeout := 5 * time.Second -CycleLoop: - for { - select { - case <-time.After(timeout): - go cf.cycle(false) - case <-cf.grp.Ch(): - break CycleLoop - } - } - - // TODO: what to do if we have less than K active contacts, shortlist is empty, but we have other contacts in our routing table whom we have not contacted. prolly contact them - - var contacts []Contact - var found bool - if cf.findValue && len(cf.findValueResult) > 0 { - contacts = cf.findValueResult - found = true - } else { - contacts = cf.activeContacts - if len(contacts) > bucketSize { - contacts = contacts[:bucketSize] - } - } - - cf.Stop() - return contacts, found, nil -} - -// cycle does a single cycle of sending alpha probes and checking results against closestNode -func (cf *contactFinder) cycle(bigCycle bool) { - cycleID := crypto.RandString(6) - if bigCycle { - cf.debug("LAUNCHING CYCLE %s, AND ITS A BIG CYCLE", cycleID) - } else { - cf.debug("LAUNCHING CYCLE %s", cycleID) - } - defer cf.debug("CYCLE %s DONE", cycleID) - - cf.closestContactMutex.RLock() - closestContact := cf.closestContact - cf.closestContactMutex.RUnlock() - - var wg sync.WaitGroup - ch := make(chan *Contact) - - limit := alpha - if bigCycle { - limit = bucketSize - } - - for i := 0; i < limit; i++ { - wg.Add(1) - go func() { - defer wg.Done() - ch <- cf.probe(cycleID) - }() - } - - go func() { - wg.Wait() - close(ch) - }() - - foundCloser := false - for { - c, more := <-ch - if !more { - break - } - if c != nil && (closestContact == nil || cf.target.Closer(c.ID, closestContact.ID)) { - if closestContact != nil { - cf.debug("|%s| best contact improved: %s -> %s", cycleID, closestContact.ID.HexShort(), c.ID.HexShort()) - } else { - cf.debug("|%s| best contact starting at %s", cycleID, c.ID.HexShort()) - } - foundCloser = true - closestContact = c - } - } - - if cf.isSearchFinished() { - cf.grp.Stop() - return - } - - if foundCloser { - cf.closestContactMutex.Lock() - // have to check again after locking in case other probes found a closer one in the meantime - if cf.closestContact == nil || cf.target.Closer(closestContact.ID, cf.closestContact.ID) { - cf.closestContact = closestContact - } - cf.closestContactMutex.Unlock() - go cf.cycle(false) - } else if !bigCycle { - cf.debug("|%s| no improvement, running big cycle", cycleID) - go cf.cycle(true) - } else { - // big cycle ran and there was no improvement, so we're done - cf.debug("|%s| big cycle ran, still no improvement", cycleID) - cf.notGettingCloser.Store(true) - } -} - -// probe sends a single probe, updates the lists, and returns the closest contact it found -func (cf *contactFinder) probe(cycleID string) *Contact { - maybeContact := cf.popFromShortlist() - if maybeContact == nil { - cf.debug("|%s| no contacts in shortlist, returning", cycleID) - return nil - } - - c := *maybeContact - - if c.ID.Equals(cf.node.id) { - return nil - } - - cf.debug("|%s| probe %s: launching", cycleID, c.ID.HexShort()) - - req := Request{Arg: &cf.target} - if cf.findValue { - req.Method = findValueMethod - } else { - req.Method = findNodeMethod - } - - var res *Response - resCh := cf.node.SendAsync(c, req) - select { - case res = <-resCh: - case <-cf.grp.Ch(): - cf.debug("|%s| probe %s: canceled", cycleID, c.ID.HexShort()) - return nil - } - - if res == nil { - cf.debug("|%s| probe %s: req canceled or timed out", cycleID, c.ID.HexShort()) - return nil - } - - if cf.findValue && res.FindValueKey != "" { - cf.debug("|%s| probe %s: got value", cycleID, c.ID.HexShort()) - cf.findValueMutex.Lock() - cf.findValueResult = res.Contacts - cf.findValueMutex.Unlock() - cf.grp.Stop() - return nil - } - - cf.debug("|%s| probe %s: got %s", cycleID, c.ID.HexShort(), res.argsDebug()) - cf.insertIntoActiveList(c) - cf.appendNewToShortlist(res.Contacts) - - cf.activeContactsMutex.Lock() - contacts := cf.activeContacts - if len(contacts) > bucketSize { - contacts = contacts[:bucketSize] - } - contactsStr := "" - for _, c := range contacts { - contactsStr += c.ID.HexShort() + ", " - } - cf.activeContactsMutex.Unlock() - - return cf.closest(res.Contacts...) -} - -// appendNewToShortlist appends any new contacts to the shortlist and sorts it by distance -// contacts that have already been added to the shortlist in the past are ignored -func (cf *contactFinder) appendNewToShortlist(contacts []Contact) { - cf.shortlistMutex.Lock() - defer cf.shortlistMutex.Unlock() - - for _, c := range contacts { - if _, ok := cf.shortlistAdded[c.ID]; !ok { - cf.shortlist = append(cf.shortlist, c) - cf.shortlistAdded[c.ID] = true - } - } - - sortByDistance(cf.shortlist, cf.target) -} - -// popFromShortlist pops the first contact off the shortlist and returns it -func (cf *contactFinder) popFromShortlist() *Contact { - cf.shortlistMutex.Lock() - defer cf.shortlistMutex.Unlock() - - if len(cf.shortlist) == 0 { - return nil - } - - first := cf.shortlist[0] - cf.shortlist = cf.shortlist[1:] - return &first -} - -// insertIntoActiveList inserts the contact into appropriate place in the list of active contacts (sorted by distance) -func (cf *contactFinder) insertIntoActiveList(contact Contact) { - cf.activeContactsMutex.Lock() - defer cf.activeContactsMutex.Unlock() - - inserted := false - for i, n := range cf.activeContacts { - if cf.target.Closer(contact.ID, n.ID) { - cf.activeContacts = append(cf.activeContacts[:i], append([]Contact{contact}, cf.activeContacts[i:]...)...) - inserted = true - break - } - } - if !inserted { - cf.activeContacts = append(cf.activeContacts, contact) - } -} - -// isSearchFinished returns true if the search is done and should be stopped -func (cf *contactFinder) isSearchFinished() bool { - if cf.findValue && len(cf.findValueResult) > 0 { - return true - } - - select { - case <-cf.grp.Ch(): - return true - default: - } - - if cf.notGettingCloser.Load() { - return true - } - - cf.activeContactsMutex.Lock() - defer cf.activeContactsMutex.Unlock() - return len(cf.activeContacts) >= bucketSize -} - -func (cf *contactFinder) debug(format string, args ...interface{}) { - args = append([]interface{}{cf.node.id.HexShort()}, append([]interface{}{cf.target.HexShort()}, args...)...) - cfLog.Debugf("[%s] find %s: "+format, args...) -} - -func (cf *contactFinder) closest(contacts ...Contact) *Contact { - if len(contacts) == 0 { - return nil - } - closest := contacts[0] - for _, c := range contacts { - if cf.target.Closer(c.ID, closest.ID) { - closest = c - } - } - return &closest -} diff --git a/dht/node_test.go b/dht/node_test.go deleted file mode 100644 index 2a167b5..0000000 --- a/dht/node_test.go +++ /dev/null @@ -1,422 +0,0 @@ -package dht - -import ( - "net" - "testing" - "time" - - "github.com/lbryio/reflector.go/dht/bits" - "github.com/lyoshenka/bencode" -) - -func TestPing(t *testing.T) { - dhtNodeID := bits.Rand() - testNodeID := bits.Rand() - - conn := newTestUDPConn("127.0.0.1:21217") - - dht := New(&Config{Address: "127.0.0.1:21216", NodeID: dhtNodeID.Hex()}) - - err := dht.connect(conn) - if err != nil { - t.Fatal(err) - } - defer dht.Shutdown() - - messageID := newMessageID() - - data, err := bencode.EncodeBytes(map[string]interface{}{ - headerTypeField: requestType, - headerMessageIDField: messageID, - headerNodeIDField: testNodeID.RawString(), - headerPayloadField: "ping", - headerArgsField: []string{}, - }) - if err != nil { - panic(err) - } - - conn.toRead <- testUDPPacket{addr: conn.addr, data: data} - timer := time.NewTimer(3 * time.Second) - - select { - case <-timer.C: - t.Error("timeout") - case resp := <-conn.writes: - var response map[string]interface{} - err := bencode.DecodeBytes(resp.data, &response) - if err != nil { - t.Fatal(err) - } - - if len(response) != 4 { - t.Errorf("expected 4 response fields, got %d", len(response)) - } - - _, ok := response[headerTypeField] - if !ok { - t.Error("missing type field") - } else { - rType, ok := response[headerTypeField].(int64) - if !ok { - t.Error("type is not an integer") - } else if rType != responseType { - t.Error("unexpected response type") - } - } - - _, ok = response[headerMessageIDField] - if !ok { - t.Error("missing message id field") - } else { - rMessageID, ok := response[headerMessageIDField].(string) - if !ok { - t.Error("message ID is not a string") - } else if rMessageID != string(messageID[:]) { - t.Error("unexpected message ID") - } - } - - _, ok = response[headerNodeIDField] - if !ok { - t.Error("missing node id field") - } else { - rNodeID, ok := response[headerNodeIDField].(string) - if !ok { - t.Error("node ID is not a string") - } else if rNodeID != dhtNodeID.RawString() { - t.Error("unexpected node ID") - } - } - - _, ok = response[headerPayloadField] - if !ok { - t.Error("missing payload field") - } else { - rNodeID, ok := response[headerPayloadField].(string) - if !ok { - t.Error("payload is not a string") - } else if rNodeID != pingSuccessResponse { - t.Error("did not pong") - } - } - } -} - -func TestStore(t *testing.T) { - dhtNodeID := bits.Rand() - testNodeID := bits.Rand() - - conn := newTestUDPConn("127.0.0.1:21217") - - dht := New(&Config{Address: "127.0.0.1:21216", NodeID: dhtNodeID.Hex()}) - - err := dht.connect(conn) - if err != nil { - t.Fatal(err) - } - defer dht.Shutdown() - - messageID := newMessageID() - blobHashToStore := bits.Rand() - - storeRequest := Request{ - ID: messageID, - NodeID: testNodeID, - Method: storeMethod, - StoreArgs: &storeArgs{ - BlobHash: blobHashToStore, - Value: storeArgsValue{ - Token: dht.node.tokens.Get(testNodeID, conn.addr), - LbryID: testNodeID, - Port: 9999, - }, - NodeID: testNodeID, - }, - } - - _ = "64 " + // start message - "313A30 693065" + // type: 0 - "313A31 3230 3A 6EB490B5788B63F0F7E6D92352024D0CBDEC2D3A" + // message id - "313A32 3438 3A 7CE1B831DEC8689E44F80F547D2DEA171F6A625E1A4FF6C6165E645F953103DABEB068A622203F859C6C64658FD3AA3B" + // node id - "313A33 35 3A 73746F7265" + // method - "313A34 6C" + // start args list - "3438 3A 3214D6C2F77FCB5E8D5FC07EDAFBA614F031CE8B2EAB49F924F8143F6DFBADE048D918710072FB98AB1B52B58F4E1468" + // block hash - "64" + // start value dict - "363A6C6272796964 3438 3A 7CE1B831DEC8689E44F80F547D2DEA171F6A625E1A4FF6C6165E645F953103DABEB068A622203F859C6C64658FD3AA3B" + // lbry id - "343A706F7274 69 33333333 65" + // port - "353A746F6B656E 3438 3A 17C2D8E1E48EF21567FE4AD5C8ED944B798D3B65AB58D0C9122AD6587D1B5FED472EA2CB12284CEFA1C21EFF302322BD" + // token - "65" + // end value dict - "3438 3A 7CE1B831DEC8689E44F80F547D2DEA171F6A625E1A4FF6C6165E645F953103DABEB068A622203F859C6C64658FD3AA3B" + // node id - "693065" + // self store (integer) - "65" + // end args list - "65" // end message - - data, err := bencode.EncodeBytes(storeRequest) - if err != nil { - t.Fatal(err) - } - - conn.toRead <- testUDPPacket{addr: conn.addr, data: data} - timer := time.NewTimer(3 * time.Second) - - var response map[string]interface{} - select { - case <-timer.C: - t.Fatal("timeout") - case resp := <-conn.writes: - err := bencode.DecodeBytes(resp.data, &response) - if err != nil { - t.Fatal(err) - } - } - - verifyResponse(t, response, messageID, dhtNodeID.RawString()) - - _, ok := response[headerPayloadField] - if !ok { - t.Error("missing payload field") - } else { - rNodeID, ok := response[headerPayloadField].(string) - if !ok { - t.Error("payload is not a string") - } else if rNodeID != storeSuccessResponse { - t.Error("did not return OK") - } - } - - if dht.node.store.CountStoredHashes() != 1 { - t.Error("dht store has wrong number of items") - } - - items := dht.node.store.Get(blobHashToStore) - if len(items) != 1 { - t.Error("list created in store, but nothing in list") - } - if !items[0].ID.Equals(testNodeID) { - t.Error("wrong value stored") - } -} - -func TestFindNode(t *testing.T) { - dhtNodeID := bits.Rand() - testNodeID := bits.Rand() - - conn := newTestUDPConn("127.0.0.1:21217") - - dht := New(&Config{Address: "127.0.0.1:21216", NodeID: dhtNodeID.Hex()}) - - err := dht.connect(conn) - if err != nil { - t.Fatal(err) - } - defer dht.Shutdown() - - nodesToInsert := 3 - var nodes []Contact - for i := 0; i < nodesToInsert; i++ { - n := Contact{ID: bits.Rand(), IP: net.ParseIP("127.0.0.1"), Port: 10000 + i} - nodes = append(nodes, n) - dht.node.rt.Update(n) - } - - messageID := newMessageID() - blobHashToFind := bits.Rand() - - request := Request{ - ID: messageID, - NodeID: testNodeID, - Method: findNodeMethod, - Arg: &blobHashToFind, - } - - data, err := bencode.EncodeBytes(request) - if err != nil { - t.Fatal(err) - } - - conn.toRead <- testUDPPacket{addr: conn.addr, data: data} - timer := time.NewTimer(3 * time.Second) - - var response map[string]interface{} - select { - case <-timer.C: - t.Fatal("timeout") - case resp := <-conn.writes: - err := bencode.DecodeBytes(resp.data, &response) - if err != nil { - t.Fatal(err) - } - } - - verifyResponse(t, response, messageID, dhtNodeID.RawString()) - - _, ok := response[headerPayloadField] - if !ok { - t.Fatal("missing payload field") - } - - contacts, ok := response[headerPayloadField].([]interface{}) - if !ok { - t.Fatal("payload is not a list") - } - - verifyContacts(t, contacts, nodes) -} - -func TestFindValueExisting(t *testing.T) { - dhtNodeID := bits.Rand() - testNodeID := bits.Rand() - - conn := newTestUDPConn("127.0.0.1:21217") - - dht := New(&Config{Address: "127.0.0.1:21216", NodeID: dhtNodeID.Hex()}) - - err := dht.connect(conn) - if err != nil { - t.Fatal(err) - } - defer dht.Shutdown() - - nodesToInsert := 3 - for i := 0; i < nodesToInsert; i++ { - n := Contact{ID: bits.Rand(), IP: net.ParseIP("127.0.0.1"), Port: 10000 + i} - dht.node.rt.Update(n) - } - - //data, _ := hex.DecodeString("64313a30693065313a3132303a7de8e57d34e316abbb5a8a8da50dcd1ad4c80e0f313a3234383a7ce1b831dec8689e44f80f547d2dea171f6a625e1a4ff6c6165e645f953103dabeb068a622203f859c6c64658fd3aa3b313a33393a66696e6456616c7565313a346c34383aa47624b8e7ee1e54df0c45e2eb858feb0b705bd2a78d8b739be31ba188f4bd6f56b371c51fecc5280d5fd26ba4168e966565") - - messageID := newMessageID() - valueToFind := bits.Rand() - - nodeToFind := Contact{ID: bits.Rand(), IP: net.ParseIP("1.2.3.4"), PeerPort: 1286} - dht.node.store.Upsert(valueToFind, nodeToFind) - dht.node.store.Upsert(valueToFind, nodeToFind) - dht.node.store.Upsert(valueToFind, nodeToFind) - - request := Request{ - ID: messageID, - NodeID: testNodeID, - Method: findValueMethod, - Arg: &valueToFind, - } - - data, err := bencode.EncodeBytes(request) - if err != nil { - t.Fatal(err) - } - - conn.toRead <- testUDPPacket{addr: conn.addr, data: data} - timer := time.NewTimer(3 * time.Second) - - var response map[string]interface{} - select { - case <-timer.C: - t.Fatal("timeout") - case resp := <-conn.writes: - err := bencode.DecodeBytes(resp.data, &response) - if err != nil { - t.Fatal(err) - } - } - - verifyResponse(t, response, messageID, dhtNodeID.RawString()) - - _, ok := response[headerPayloadField] - if !ok { - t.Fatal("missing payload field") - } - - payload, ok := response[headerPayloadField].(map[string]interface{}) - if !ok { - t.Fatal("payload is not a dictionary") - } - - compactContacts, ok := payload[valueToFind.RawString()] - if !ok { - t.Fatal("payload is missing key for search value") - } - - contacts, ok := compactContacts.([]interface{}) - if !ok { - t.Fatal("search results are not a list") - } - - verifyCompactContacts(t, contacts, []Contact{nodeToFind}) -} - -func TestFindValueFallbackToFindNode(t *testing.T) { - dhtNodeID := bits.Rand() - testNodeID := bits.Rand() - - conn := newTestUDPConn("127.0.0.1:21217") - - dht := New(&Config{Address: "127.0.0.1:21216", NodeID: dhtNodeID.Hex()}) - - err := dht.connect(conn) - if err != nil { - t.Fatal(err) - } - defer dht.Shutdown() - - nodesToInsert := 3 - var nodes []Contact - for i := 0; i < nodesToInsert; i++ { - n := Contact{ID: bits.Rand(), IP: net.ParseIP("127.0.0.1"), Port: 10000 + i} - nodes = append(nodes, n) - dht.node.rt.Update(n) - } - - messageID := newMessageID() - valueToFind := bits.Rand() - - request := Request{ - ID: messageID, - NodeID: testNodeID, - Method: findValueMethod, - Arg: &valueToFind, - } - - data, err := bencode.EncodeBytes(request) - if err != nil { - t.Fatal(err) - } - - conn.toRead <- testUDPPacket{addr: conn.addr, data: data} - timer := time.NewTimer(3 * time.Second) - - var response map[string]interface{} - select { - case <-timer.C: - t.Fatal("timeout") - case resp := <-conn.writes: - err := bencode.DecodeBytes(resp.data, &response) - if err != nil { - t.Fatal(err) - } - } - - verifyResponse(t, response, messageID, dhtNodeID.RawString()) - - _, ok := response[headerPayloadField] - if !ok { - t.Fatal("missing payload field") - } - - payload, ok := response[headerPayloadField].(map[string]interface{}) - if !ok { - t.Fatal("payload is not a dictionary") - } - - contactsList, ok := payload[contactsField] - if !ok { - t.Fatal("payload is missing 'contacts' key") - } - - contacts, ok := contactsList.([]interface{}) - if !ok { - t.Fatal("'contacts' is not a list") - } - - verifyContacts(t, contacts, nodes) -} diff --git a/dht/routing_table.go b/dht/routing_table.go deleted file mode 100644 index a60768b..0000000 --- a/dht/routing_table.go +++ /dev/null @@ -1,463 +0,0 @@ -package dht - -import ( - "encoding/json" - "fmt" - "net" - "strconv" - "strings" - "sync" - "time" - - "github.com/lbryio/lbry.go/errors" - "github.com/lbryio/lbry.go/stop" - "github.com/lbryio/reflector.go/dht/bits" -) - -// TODO: if routing table is ever empty (aka the node is isolated), it should re-bootstrap - -// TODO: use a tree with bucket splitting instead of a fixed bucket list. include jack's optimization (see link in commit mesg) -// https://github.com/lbryio/lbry/pull/1211/commits/341b27b6d21ac027671d42458826d02735aaae41 - -// peer is a contact with extra information -type peer struct { - Contact Contact - Distance bits.Bitmap - LastActivity time.Time - // LastReplied time.Time - // LastRequested time.Time - // LastFailure time.Time - // SecondLastFailure time.Time - NumFailures int - - //, - // - // -} - -func (p *peer) Touch() { - p.LastActivity = time.Now() - p.NumFailures = 0 -} - -// ActiveSince returns whether a peer has responded in the last `d` duration -// this is used to check if the peer is "good", meaning that we believe the peer will respond to our requests -func (p *peer) ActiveInLast(d time.Duration) bool { - return time.Since(p.LastActivity) < d -} - -// IsBad returns whether a peer is "bad", meaning that it has failed to respond to multiple pings in a row -func (p *peer) IsBad(maxFalures int) bool { - return p.NumFailures >= maxFalures -} - -// Fail marks a peer as having failed to respond. It returns whether or not the peer should be removed from the routing table -func (p *peer) Fail() { - p.NumFailures++ -} - -type bucket struct { - lock *sync.RWMutex - peers []peer - lastUpdate time.Time - Range bits.Range // capitalized because `range` is a keyword -} - -func newBucket(r bits.Range) *bucket { - return &bucket{ - peers: make([]peer, 0, bucketSize), - lock: &sync.RWMutex{}, - Range: r, - } -} - -// Len returns the number of peers in the bucket -func (b bucket) Len() int { - b.lock.RLock() - defer b.lock.RUnlock() - return len(b.peers) -} - -func (b bucket) Has(c Contact) bool { - b.lock.RLock() - defer b.lock.RUnlock() - for _, p := range b.peers { - if p.Contact.Equals(c, true) { - return true - } - } - return false -} - -// Contacts returns a slice of the bucket's contacts -func (b bucket) Contacts() []Contact { - b.lock.RLock() - defer b.lock.RUnlock() - contacts := make([]Contact, len(b.peers)) - for i := range b.peers { - contacts[i] = b.peers[i].Contact - } - return contacts -} - -// UpdatePeer marks a contact as having been successfully contacted. if insertIfNew and the contact is does not exist yet, it is inserted -func (b *bucket) UpdatePeer(p peer, insertIfNew bool) error { - b.lock.Lock() - defer b.lock.Unlock() - - if !b.Range.Contains(p.Distance) { - return errors.Err("this bucket range does not cover this peer") - } - - peerIndex := find(p.Contact.ID, b.peers) - if peerIndex >= 0 { - b.lastUpdate = time.Now() - b.peers[peerIndex].Touch() - moveToBack(b.peers, peerIndex) - } else if insertIfNew { - hasRoom := true - - if len(b.peers) >= bucketSize { - hasRoom = false - for i := range b.peers { - if b.peers[i].IsBad(maxPeerFails) { - // TODO: Ping contact first. Only remove if it does not respond - b.peers = append(b.peers[:i], b.peers[i+1:]...) - hasRoom = true - break - } - } - } - - if hasRoom { - b.lastUpdate = time.Now() - p.Touch() - b.peers = append(b.peers, p) - } - } - - return nil -} - -// FailContact marks a contact as having failed, and removes it if it failed too many times -func (b *bucket) FailContact(id bits.Bitmap) { - b.lock.Lock() - defer b.lock.Unlock() - i := find(id, b.peers) - if i >= 0 { - // BEP5 says not to remove the contact until the bucket is full and you try to insert - b.peers[i].Fail() - } -} - -// find returns the contact in the bucket, or nil if the bucket does not contain the contact -func find(id bits.Bitmap, peers []peer) int { - for i := range peers { - if peers[i].Contact.ID.Equals(id) { - return i - } - } - return -1 -} - -// NeedsRefresh returns true if bucket has not been updated in the last `refreshInterval`, false otherwise -func (b *bucket) NeedsRefresh(refreshInterval time.Duration) bool { - b.lock.RLock() - defer b.lock.RUnlock() - return time.Since(b.lastUpdate) > refreshInterval -} - -func (b *bucket) Split() (*bucket, *bucket) { - b.lock.Lock() - defer b.lock.Unlock() - - left := newBucket(b.Range.IntervalP(1, 2)) - right := newBucket(b.Range.IntervalP(2, 2)) - left.lastUpdate = b.lastUpdate - right.lastUpdate = b.lastUpdate - - for _, p := range b.peers { - if left.Range.Contains(p.Distance) { - left.peers = append(left.peers, p) - } else { - right.peers = append(right.peers, p) - } - } - - if len(b.peers) > 1 { - if len(left.peers) == 0 { - left, right = right.Split() - left.Range.Start = b.Range.Start - } else if len(right.peers) == 0 { - left, right = left.Split() - right.Range.End = b.Range.End - } - } - - return left, right -} - -type routingTable struct { - id bits.Bitmap - buckets []*bucket - mu *sync.RWMutex // this mutex is write-locked only when CHANGING THE NUMBER OF BUCKETS in the table -} - -func newRoutingTable(id bits.Bitmap) *routingTable { - rt := routingTable{ - id: id, - mu: &sync.RWMutex{}, - } - rt.reset() - return &rt -} - -func (rt *routingTable) reset() { - rt.mu.Lock() - defer rt.mu.Unlock() - rt.buckets = []*bucket{newBucket(bits.MaxRange())} -} - -func (rt *routingTable) BucketInfo() string { - rt.mu.RLock() - defer rt.mu.RUnlock() - - var bucketInfo []string - for i, b := range rt.buckets { - if b.Len() > 0 { - contacts := b.Contacts() - s := make([]string, len(contacts)) - for j, c := range contacts { - s[j] = c.ID.HexShort() - } - bucketInfo = append(bucketInfo, fmt.Sprintf("bucket %d: (%d) %s", i, len(contacts), strings.Join(s, ", "))) - } - } - if len(bucketInfo) == 0 { - return "buckets are empty" - } - return strings.Join(bucketInfo, "\n") -} - -// Update inserts or refreshes a contact -func (rt *routingTable) Update(c Contact) { - rt.mu.Lock() // write lock, because updates may cause bucket splits - defer rt.mu.Unlock() - - b := rt.bucketFor(c.ID) - - if rt.shouldSplit(b, c) { - left, right := b.Split() - - for i := range rt.buckets { - if rt.buckets[i].Range.Start.Equals(left.Range.Start) { - rt.buckets = append(rt.buckets[:i], append([]*bucket{left, right}, rt.buckets[i+1:]...)...) - break - } - } - - if left.Range.Contains(c.ID) { - b = left - } else { - b = right - } - } - - err := b.UpdatePeer(peer{Contact: c, Distance: rt.id.Xor(c.ID)}, true) - if err != nil { - log.Error(err) - } -} - -// Fresh refreshes a contact if its already in the routing table -func (rt *routingTable) Fresh(c Contact) { - rt.mu.RLock() - defer rt.mu.RUnlock() - err := rt.bucketFor(c.ID).UpdatePeer(peer{Contact: c, Distance: rt.id.Xor(c.ID)}, false) - if err != nil { - log.Error(err) - } -} - -// FailContact marks a contact as having failed, and removes it if it failed too many times -func (rt *routingTable) Fail(c Contact) { - rt.mu.RLock() - defer rt.mu.RUnlock() - rt.bucketFor(c.ID).FailContact(c.ID) -} - -// GetClosest returns the closest `limit` contacts from the routing table. -// This is a locking wrapper around getClosest() -func (rt *routingTable) GetClosest(target bits.Bitmap, limit int) []Contact { - rt.mu.RLock() - defer rt.mu.RUnlock() - return rt.getClosest(target, limit) -} - -// getClosest returns the closest `limit` contacts from the routing table -func (rt *routingTable) getClosest(target bits.Bitmap, limit int) []Contact { - var contacts []Contact - for _, b := range rt.buckets { - contacts = append(contacts, b.Contacts()...) - } - - sortByDistance(contacts, target) - if len(contacts) > limit { - contacts = contacts[:limit] - } - - return contacts -} - -// Count returns the number of contacts in the routing table -func (rt *routingTable) Count() int { - rt.mu.RLock() - defer rt.mu.RUnlock() - count := 0 - for _, bucket := range rt.buckets { - count += bucket.Len() - } - return count -} - -// Len returns the number of buckets in the routing table -func (rt *routingTable) Len() int { - rt.mu.RLock() - defer rt.mu.RUnlock() - return len(rt.buckets) -} - -func (rt *routingTable) bucketFor(target bits.Bitmap) *bucket { - if rt.id.Equals(target) { - panic("routing table does not have a bucket for its own id") - } - distance := target.Xor(rt.id) - for _, b := range rt.buckets { - if b.Range.Contains(distance) { - return b - } - } - panic("target is not contained in any buckets") -} - -func (rt *routingTable) shouldSplit(b *bucket, c Contact) bool { - if b.Has(c) { - return false - } - if b.Len() >= bucketSize { - if b.Range.Start.Equals(bits.Bitmap{}) { // this is the bucket covering our node id - return true - } - kClosest := rt.getClosest(rt.id, bucketSize) - kthClosest := kClosest[len(kClosest)-1] - if rt.id.Closer(c.ID, kthClosest.ID) { - return true - } - } - return false -} - -//func (rt *routingTable) printBucketInfo() { -// fmt.Printf("there are %d contacts in %d buckets\n", rt.Count(), rt.Len()) -// for i, b := range rt.buckets { -// fmt.Printf("bucket %d, %d contacts\n", i+1, len(b.peers)) -// fmt.Printf(" start : %s\n", b.Range.Start.String()) -// fmt.Printf(" stop : %s\n", b.Range.End.String()) -// fmt.Println("") -// } -//} - -func (rt *routingTable) GetIDsForRefresh(refreshInterval time.Duration) []bits.Bitmap { - var bitmaps []bits.Bitmap - for i, bucket := range rt.buckets { - if bucket.NeedsRefresh(refreshInterval) { - bitmaps = append(bitmaps, bits.Rand().Prefix(i, false)) - } - } - return bitmaps -} - -const rtContactSep = "-" - -type rtSave struct { - ID string `json:"id"` - Contacts []string `json:"contacts"` -} - -func (rt *routingTable) MarshalJSON() ([]byte, error) { - var data rtSave - data.ID = rt.id.Hex() - for _, b := range rt.buckets { - for _, c := range b.Contacts() { - data.Contacts = append(data.Contacts, strings.Join([]string{c.ID.Hex(), c.IP.String(), strconv.Itoa(c.Port)}, rtContactSep)) - } - } - return json.Marshal(data) -} - -func (rt *routingTable) UnmarshalJSON(b []byte) error { - var data rtSave - err := json.Unmarshal(b, &data) - if err != nil { - return err - } - - rt.id, err = bits.FromHex(data.ID) - if err != nil { - return errors.Prefix("decoding ID", err) - } - rt.reset() - - for _, s := range data.Contacts { - parts := strings.Split(s, rtContactSep) - if len(parts) != 3 { - return errors.Err("decoding contact %s: wrong number of parts", s) - } - var c Contact - c.ID, err = bits.FromHex(parts[0]) - if err != nil { - return errors.Err("decoding contact %s: invalid ID: %s", s, err) - } - c.IP = net.ParseIP(parts[1]) - if c.IP == nil { - return errors.Err("decoding contact %s: invalid IP", s) - } - c.Port, err = strconv.Atoi(parts[2]) - if err != nil { - return errors.Err("decoding contact %s: invalid port: %s", s, err) - } - rt.Update(c) - } - - return nil -} - -// RoutingTableRefresh refreshes any buckets that need to be refreshed -func RoutingTableRefresh(n *Node, refreshInterval time.Duration, parentGrp *stop.Group) { - done := stop.New() - - for _, id := range n.rt.GetIDsForRefresh(refreshInterval) { - done.Add(1) - go func(id bits.Bitmap) { - defer done.Done() - _, _, err := FindContacts(n, id, false, parentGrp) - if err != nil { - log.Error("error finding contact during routing table refresh - ", err) - } - }(id) - } - - done.Wait() - done.Stop() -} - -func moveToBack(peers []peer, index int) { - if index < 0 || len(peers) <= index+1 { - return - } - p := peers[index] - for i := index; i < len(peers)-1; i++ { - peers[i] = peers[i+1] - } - peers[len(peers)-1] = p -} diff --git a/dht/routing_table_test.go b/dht/routing_table_test.go deleted file mode 100644 index 7260322..0000000 --- a/dht/routing_table_test.go +++ /dev/null @@ -1,328 +0,0 @@ -package dht - -import ( - "encoding/json" - "math/big" - "net" - "strconv" - "strings" - "testing" - - "github.com/lbryio/reflector.go/dht/bits" - - "github.com/sebdah/goldie" -) - -func TestBucket_Split(t *testing.T) { - rt := newRoutingTable(bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) - if len(rt.buckets) != 1 { - t.Errorf("there should only be one bucket so far") - } - if len(rt.buckets[0].peers) != 0 { - t.Errorf("there should be no contacts yet") - } - - var tests = []struct { - name string - id bits.Bitmap - expectedBucketCount int - expectedTotalContacts int - }{ - //fill first bucket - {"b1-one", bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100"), 1, 1}, - {"b1-two", bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200"), 1, 2}, - {"b1-three", bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300"), 1, 3}, - {"b1-four", bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400"), 1, 4}, - {"b1-five", bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500"), 1, 5}, - {"b1-six", bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600"), 1, 6}, - {"b1-seven", bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700"), 1, 7}, - {"b1-eight", bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800"), 1, 8}, - - // split off second bucket and fill it - {"b2-one", bits.FromHexP("001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), 2, 9}, - {"b2-two", bits.FromHexP("002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), 2, 10}, - {"b2-three", bits.FromHexP("003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), 2, 11}, - {"b2-four", bits.FromHexP("004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), 2, 12}, - {"b2-five", bits.FromHexP("005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), 2, 13}, - {"b2-six", bits.FromHexP("006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), 2, 14}, - {"b2-seven", bits.FromHexP("007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), 2, 15}, - - // at this point there are two buckets. the first has 7 contacts, the second has 8 - - // inserts into the second bucket should be skipped - {"dont-split", bits.FromHexP("009000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), 2, 15}, - - // ... unless the ID is closer than the kth-closest contact - {"split-kth-closest", bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"), 2, 16}, - - {"b3-two", bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"), 3, 17}, - {"b3-three", bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"), 3, 18}, - } - - for i, testCase := range tests { - rt.Update(Contact{testCase.id, net.ParseIP("127.0.0.1"), 8000 + i, 0}) - - if len(rt.buckets) != testCase.expectedBucketCount { - t.Errorf("failed test case %s. there should be %d buckets, got %d", testCase.name, testCase.expectedBucketCount, len(rt.buckets)) - } - if rt.Count() != testCase.expectedTotalContacts { - t.Errorf("failed test case %s. there should be %d contacts, got %d", testCase.name, testCase.expectedTotalContacts, rt.Count()) - } - } - - var testRanges = []struct { - id bits.Bitmap - expected int - }{ - {bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"), 0}, - {bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005"), 0}, - {bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410"), 1}, - {bits.FromHexP("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0"), 1}, - {bits.FromHexP("F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800"), 2}, - {bits.FromHexP("F00000000000000000000000000000000000000000000000000F00000000000000000000000000000000000000000000"), 2}, - {bits.FromHexP("F0000000000000000000000000000000F0000000000000000000000000F0000000000000000000000000000000000000"), 2}, - } - - for _, tt := range testRanges { - bucket := bucketNumFor(rt, tt.id) - if bucket != tt.expected { - t.Errorf("bucketFor(%s, %s) => got %d, expected %d", tt.id.Hex(), rt.id.Hex(), bucket, tt.expected) - } - } -} - -func bucketNumFor(rt *routingTable, target bits.Bitmap) int { - if rt.id.Equals(target) { - panic("routing table does not have a bucket for its own id") - } - distance := target.Xor(rt.id) - for i := range rt.buckets { - if rt.buckets[i].Range.Contains(distance) { - return i - } - } - panic("target is not contained in any buckets") -} - -func TestBucket_Split_Continuous(t *testing.T) { - b := newBucket(bits.MaxRange()) - - left, right := b.Split() - - if !left.Range.Start.Equals(b.Range.Start) { - t.Errorf("left bucket start does not align with original bucket start. got %s, expected %s", left.Range.Start, b.Range.Start) - } - - if !right.Range.End.Equals(b.Range.End) { - t.Errorf("right bucket end does not align with original bucket end. got %s, expected %s", right.Range.End, b.Range.End) - } - - leftEndNext := (&big.Int{}).Add(left.Range.End.Big(), big.NewInt(1)) - if !bits.FromBigP(leftEndNext).Equals(right.Range.Start) { - t.Errorf("there's a gap between left bucket end and right bucket start. end is %s, start is %s", left.Range.End, right.Range.Start) - } -} - -func TestBucket_Split_KthClosest_DoSplit(t *testing.T) { - rt := newRoutingTable(bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) - - // add 4 low IDs - rt.Update(Contact{bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"), net.ParseIP("127.0.0.1"), 8001, 0}) - rt.Update(Contact{bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"), net.ParseIP("127.0.0.1"), 8002, 0}) - rt.Update(Contact{bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"), net.ParseIP("127.0.0.1"), 8003, 0}) - rt.Update(Contact{bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004"), net.ParseIP("127.0.0.1"), 8004, 0}) - - // add 4 high IDs - rt.Update(Contact{bits.FromHexP("800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), net.ParseIP("127.0.0.2"), 8001, 0}) - rt.Update(Contact{bits.FromHexP("900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), net.ParseIP("127.0.0.2"), 8002, 0}) - rt.Update(Contact{bits.FromHexP("a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), net.ParseIP("127.0.0.2"), 8003, 0}) - rt.Update(Contact{bits.FromHexP("b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), net.ParseIP("127.0.0.2"), 8004, 0}) - - // split the bucket and fill the high bucket - rt.Update(Contact{bits.FromHexP("c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), net.ParseIP("127.0.0.2"), 8005, 0}) - rt.Update(Contact{bits.FromHexP("d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), net.ParseIP("127.0.0.2"), 8006, 0}) - rt.Update(Contact{bits.FromHexP("e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), net.ParseIP("127.0.0.2"), 8007, 0}) - rt.Update(Contact{bits.FromHexP("f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), net.ParseIP("127.0.0.2"), 8008, 0}) - - // add a high ID. it should split because the high ID is closer than the Kth closest ID - rt.Update(Contact{bits.FromHexP("910000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), net.ParseIP("127.0.0.1"), 8009, 0}) - - if len(rt.buckets) != 3 { - t.Errorf("expected 3 buckets, got %d", len(rt.buckets)) - } - if rt.Count() != 13 { - t.Errorf("expected 13 contacts, got %d", rt.Count()) - } -} - -func TestBucket_Split_KthClosest_DontSplit(t *testing.T) { - rt := newRoutingTable(bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) - - // add 4 low IDs - rt.Update(Contact{bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"), net.ParseIP("127.0.0.1"), 8001, 0}) - rt.Update(Contact{bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002"), net.ParseIP("127.0.0.1"), 8002, 0}) - rt.Update(Contact{bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003"), net.ParseIP("127.0.0.1"), 8003, 0}) - rt.Update(Contact{bits.FromHexP("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004"), net.ParseIP("127.0.0.1"), 8004, 0}) - - // add 4 high IDs - rt.Update(Contact{bits.FromHexP("800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), net.ParseIP("127.0.0.2"), 8001, 0}) - rt.Update(Contact{bits.FromHexP("900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), net.ParseIP("127.0.0.2"), 8002, 0}) - rt.Update(Contact{bits.FromHexP("a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), net.ParseIP("127.0.0.2"), 8003, 0}) - rt.Update(Contact{bits.FromHexP("b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), net.ParseIP("127.0.0.2"), 8004, 0}) - - // split the bucket and fill the high bucket - rt.Update(Contact{bits.FromHexP("c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), net.ParseIP("127.0.0.2"), 8005, 0}) - rt.Update(Contact{bits.FromHexP("d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), net.ParseIP("127.0.0.2"), 8006, 0}) - rt.Update(Contact{bits.FromHexP("e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), net.ParseIP("127.0.0.2"), 8007, 0}) - rt.Update(Contact{bits.FromHexP("f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), net.ParseIP("127.0.0.2"), 8008, 0}) - - // add a really high ID. this should not split because its not closer than the Kth closest ID - rt.Update(Contact{bits.FromHexP("ffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), net.ParseIP("127.0.0.1"), 8009, 0}) - - if len(rt.buckets) != 2 { - t.Errorf("expected 2 buckets, got %d", len(rt.buckets)) - } - if rt.Count() != 12 { - t.Errorf("expected 12 contacts, got %d", rt.Count()) - } -} - -func TestRoutingTable_GetClosest(t *testing.T) { - n1 := bits.FromHexP("FFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") - n2 := bits.FromHexP("FFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") - n3 := bits.FromHexP("111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") - rt := newRoutingTable(n1) - rt.Update(Contact{n2, net.ParseIP("127.0.0.1"), 8001, 0}) - rt.Update(Contact{n3, net.ParseIP("127.0.0.1"), 8002, 0}) - - contacts := rt.GetClosest(bits.FromHexP("222222220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), 1) - if len(contacts) != 1 { - t.Fail() - return - } - if !contacts[0].ID.Equals(n3) { - t.Error(contacts[0]) - } - contacts = rt.GetClosest(n2, 10) - if len(contacts) != 2 { - t.Error(len(contacts)) - return - } - if !contacts[0].ID.Equals(n2) { - t.Error(contacts[0]) - } - if !contacts[1].ID.Equals(n3) { - t.Error(contacts[1]) - } -} - -func TestRoutingTable_GetClosest_Empty(t *testing.T) { - n1 := bits.FromShortHexP("1") - rt := newRoutingTable(n1) - - contacts := rt.GetClosest(bits.FromShortHexP("a"), 3) - if len(contacts) != 0 { - t.Error("there shouldn't be any contacts") - return - } -} - -func TestRoutingTable_Refresh(t *testing.T) { - t.Skip("TODO: test routing table refreshing") -} - -func TestRoutingTable_MoveToBack(t *testing.T) { - tt := map[string]struct { - data []peer - index int - expected []peer - }{ - "simpleMove": { - data: []peer{{NumFailures: 0}, {NumFailures: 1}, {NumFailures: 2}, {NumFailures: 3}}, - index: 1, - expected: []peer{{NumFailures: 0}, {NumFailures: 2}, {NumFailures: 3}, {NumFailures: 1}}, - }, - "moveFirst": { - data: []peer{{NumFailures: 0}, {NumFailures: 1}, {NumFailures: 2}, {NumFailures: 3}}, - index: 0, - expected: []peer{{NumFailures: 1}, {NumFailures: 2}, {NumFailures: 3}, {NumFailures: 0}}, - }, - "moveLast": { - data: []peer{{NumFailures: 0}, {NumFailures: 1}, {NumFailures: 2}, {NumFailures: 3}}, - index: 3, - expected: []peer{{NumFailures: 0}, {NumFailures: 1}, {NumFailures: 2}, {NumFailures: 3}}, - }, - "largeIndex": { - data: []peer{{NumFailures: 0}, {NumFailures: 1}, {NumFailures: 2}, {NumFailures: 3}}, - index: 27, - expected: []peer{{NumFailures: 0}, {NumFailures: 1}, {NumFailures: 2}, {NumFailures: 3}}, - }, - "negativeIndex": { - data: []peer{{NumFailures: 0}, {NumFailures: 1}, {NumFailures: 2}, {NumFailures: 3}}, - index: -12, - expected: []peer{{NumFailures: 0}, {NumFailures: 1}, {NumFailures: 2}, {NumFailures: 3}}, - }, - } - - for name, test := range tt { - moveToBack(test.data, test.index) - expected := make([]string, len(test.expected)) - actual := make([]string, len(test.data)) - for i := range actual { - actual[i] = strconv.Itoa(test.data[i].NumFailures) - expected[i] = strconv.Itoa(test.expected[i].NumFailures) - } - - expJoin := strings.Join(expected, ",") - actJoin := strings.Join(actual, ",") - - if actJoin != expJoin { - t.Errorf("%s failed: got %s; expected %s", name, actJoin, expJoin) - } - } -} - -func TestRoutingTable_Save(t *testing.T) { - t.Skip("fix me") - id := bits.FromHexP("1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f41") - rt := newRoutingTable(id) - - for i, b := range rt.buckets { - for j := 0; j < bucketSize; j++ { - toAdd := b.Range.Start.Add(bits.FromShortHexP(strconv.Itoa(j))) - if toAdd.Cmp(b.Range.End) <= 0 { - rt.Update(Contact{ - ID: b.Range.Start.Add(bits.FromShortHexP(strconv.Itoa(j))), - IP: net.ParseIP("1.2.3." + strconv.Itoa(j)), - Port: 1 + i*bucketSize + j, - }) - } - } - } - - data, err := json.MarshalIndent(rt, "", " ") - if err != nil { - t.Error(err) - } - - goldie.Assert(t, t.Name(), data) -} - -func TestRoutingTable_Load_ID(t *testing.T) { - t.Skip("fix me") - id := "1c8aff71b99462464d9eeac639595ab99664be3482cb91a29d87467515c7d9158fe72aa1f1582dab07d8f8b5db277f41" - data := []byte(`{"id": "` + id + `","contacts": []}`) - - rt := routingTable{} - err := json.Unmarshal(data, &rt) - if err != nil { - t.Error(err) - } - if rt.id.Hex() != id { - t.Error("id mismatch") - } -} - -func TestRoutingTable_Load_Contacts(t *testing.T) { - t.Skip("TODO") -} diff --git a/dht/rpc.go b/dht/rpc.go deleted file mode 100644 index cc27fe3..0000000 --- a/dht/rpc.go +++ /dev/null @@ -1,187 +0,0 @@ -package dht - -import ( - "context" - "net" - "net/http" - "strconv" - "sync" - - "github.com/lbryio/lbry.go/errors" - "github.com/lbryio/reflector.go/dht/bits" - - "github.com/gorilla/mux" - rpc2 "github.com/gorilla/rpc/v2" - "github.com/gorilla/rpc/v2/json" -) - -type rpcReceiver struct { - dht *DHT -} - -type RpcPingArgs struct { - Address string -} - -func (rpc *rpcReceiver) Ping(r *http.Request, args *RpcPingArgs, result *string) error { - if args.Address == "" { - return errors.Err("no address given") - } - - err := rpc.dht.Ping(args.Address) - if err != nil { - return err - } - - *result = pingSuccessResponse - return nil -} - -type RpcFindArgs struct { - Key string - NodeID string - IP string - Port int -} - -func (rpc *rpcReceiver) FindNode(r *http.Request, args *RpcFindArgs, result *[]Contact) error { - key, err := bits.FromHex(args.Key) - if err != nil { - return err - } - - toQuery, err := bits.FromHex(args.NodeID) - if err != nil { - return err - } - - c := Contact{ID: toQuery, IP: net.ParseIP(args.IP), Port: args.Port} - req := Request{Method: findNodeMethod, Arg: &key} - - nodeResponse := rpc.dht.node.Send(c, req) - if nodeResponse != nil && nodeResponse.Contacts != nil { - *result = nodeResponse.Contacts - } - return nil -} - -type RpcFindValueResult struct { - Contacts []Contact - Value string -} - -func (rpc *rpcReceiver) FindValue(r *http.Request, args *RpcFindArgs, result *RpcFindValueResult) error { - key, err := bits.FromHex(args.Key) - if err != nil { - return err - } - toQuery, err := bits.FromHex(args.NodeID) - if err != nil { - return err - } - c := Contact{ID: toQuery, IP: net.ParseIP(args.IP), Port: args.Port} - req := Request{Arg: &key, Method: findValueMethod} - - nodeResponse := rpc.dht.node.Send(c, req) - if nodeResponse != nil && nodeResponse.FindValueKey != "" { - *result = RpcFindValueResult{Value: nodeResponse.FindValueKey} - return nil - } - if nodeResponse != nil && nodeResponse.Contacts != nil { - *result = RpcFindValueResult{Contacts: nodeResponse.Contacts} - return nil - } - - return errors.Err("not sure what happened") -} - -type RpcIterativeFindValueArgs struct { - Key string -} - -type RpcIterativeFindValueResult struct { - Contacts []Contact - FoundValue bool -} - -func (rpc *rpcReceiver) IterativeFindValue(r *http.Request, args *RpcIterativeFindValueArgs, result *RpcIterativeFindValueResult) error { - key, err := bits.FromHex(args.Key) - if err != nil { - return err - } - foundContacts, found, err := FindContacts(rpc.dht.node, key, false, nil) - if err != nil { - return err - } - result.Contacts = foundContacts - result.FoundValue = found - return nil -} - -type RpcBucketResponse struct { - Start string - End string - NumContacts int - Contacts []Contact -} - -type RpcRoutingTableResponse struct { - NodeID string - NumBuckets int - Buckets []RpcBucketResponse -} - -func (rpc *rpcReceiver) GetRoutingTable(r *http.Request, args *struct{}, result *RpcRoutingTableResponse) error { - result.NodeID = rpc.dht.node.id.String() - result.NumBuckets = len(rpc.dht.node.rt.buckets) - for _, b := range rpc.dht.node.rt.buckets { - result.Buckets = append(result.Buckets, RpcBucketResponse{ - Start: b.Range.Start.String(), - End: b.Range.End.String(), - NumContacts: b.Len(), - Contacts: b.Contacts(), - }) - } - return nil -} - -func (rpc *rpcReceiver) AddKnownNode(r *http.Request, args *Contact, result *string) error { - rpc.dht.node.AddKnownNode(*args) - return nil -} - -func (dht *DHT) runRPCServer(port int) { - addr := "0.0.0.0:" + strconv.Itoa(port) - - s := rpc2.NewServer() - s.RegisterCodec(json.NewCodec(), "application/json") - s.RegisterCodec(json.NewCodec(), "application/json;charset=UTF-8") - err := s.RegisterService(&rpcReceiver{dht: dht}, "rpc") - if err != nil { - log.Error(errors.Prefix("registering rpc service", err)) - return - } - - handler := mux.NewRouter() - handler.Handle("/", s) - server := &http.Server{Addr: addr, Handler: handler} - - wg := sync.WaitGroup{} - wg.Add(1) - go func() { - defer wg.Done() - log.Printf("RPC server listening on %s", addr) - err := server.ListenAndServe() - if err != nil && err != http.ErrServerClosed { - log.Error(err) - } - }() - - <-dht.grp.Ch() - err = server.Shutdown(context.Background()) - if err != nil { - log.Error(errors.Prefix("shutting down rpc service", err)) - return - } - wg.Wait() -} diff --git a/dht/store.go b/dht/store.go deleted file mode 100644 index bc77e53..0000000 --- a/dht/store.go +++ /dev/null @@ -1,62 +0,0 @@ -package dht - -import ( - "sync" - - "github.com/lbryio/reflector.go/dht/bits" -) - -// TODO: expire stored data after tExpire time - -type contactStore struct { - // map of blob hashes to (map of node IDs to bools) - hashes map[bits.Bitmap]map[bits.Bitmap]bool - // stores the peers themselves, so they can be updated in one place - contacts map[bits.Bitmap]Contact - lock sync.RWMutex -} - -func newStore() *contactStore { - return &contactStore{ - hashes: make(map[bits.Bitmap]map[bits.Bitmap]bool), - contacts: make(map[bits.Bitmap]Contact), - } -} - -func (s *contactStore) Upsert(blobHash bits.Bitmap, contact Contact) { - s.lock.Lock() - defer s.lock.Unlock() - - if _, ok := s.hashes[blobHash]; !ok { - s.hashes[blobHash] = make(map[bits.Bitmap]bool) - } - s.hashes[blobHash][contact.ID] = true - s.contacts[contact.ID] = contact -} - -func (s *contactStore) Get(blobHash bits.Bitmap) []Contact { - s.lock.RLock() - defer s.lock.RUnlock() - - var contacts []Contact - if ids, ok := s.hashes[blobHash]; ok { - for id := range ids { - contact, ok := s.contacts[id] - if !ok { - panic("node id in IDs list, but not in nodeInfo") - } - contacts = append(contacts, contact) - } - } - return contacts -} - -func (s *contactStore) RemoveTODO(contact Contact) { - // TODO: remove peer from everywhere -} - -func (s *contactStore) CountStoredHashes() int { - s.lock.RLock() - defer s.lock.RUnlock() - return len(s.hashes) -} diff --git a/dht/testing.go b/dht/testing.go deleted file mode 100644 index 2836d4c..0000000 --- a/dht/testing.go +++ /dev/null @@ -1,312 +0,0 @@ -package dht - -import ( - "net" - "strconv" - "strings" - "testing" - "time" - - "github.com/lbryio/lbry.go/errors" - "github.com/lbryio/reflector.go/dht/bits" -) - -var testingDHTIP = "127.0.0.1" -var testingDHTFirstPort = 21000 - -// TestingCreateNetwork initializes a testable DHT network with a specific number of nodes, with bootstrap and concurrent options. -func TestingCreateNetwork(t *testing.T, numNodes int, bootstrap, concurrent bool) (*BootstrapNode, []*DHT) { - var bootstrapNode *BootstrapNode - var seeds []string - - if bootstrap { - bootstrapAddress := testingDHTIP + ":" + strconv.Itoa(testingDHTFirstPort) - seeds = []string{bootstrapAddress} - bootstrapNode = NewBootstrapNode(bits.Rand(), 0, bootstrapDefaultRefreshDuration) - listener, err := net.ListenPacket(Network, bootstrapAddress) - if err != nil { - panic(err) - } - - err = bootstrapNode.Connect(listener.(*net.UDPConn)) - if err != nil { - t.Error("error connecting bootstrap node - ", err) - } - } - - if numNodes < 1 { - return bootstrapNode, nil - } - - firstPort := testingDHTFirstPort + 1 - dhts := make([]*DHT, numNodes) - - for i := 0; i < numNodes; i++ { - c := NewStandardConfig() - c.NodeID = bits.Rand().Hex() - c.Address = testingDHTIP + ":" + strconv.Itoa(firstPort+i) - c.SeedNodes = seeds - dht := New(c) - - go func() { - err := dht.Start() - if err != nil { - t.Error("error starting dht - ", err) - } - }() - if !concurrent { - dht.WaitUntilJoined() - } - dhts[i] = dht - } - - if concurrent { - for _, d := range dhts { - d.WaitUntilJoined() - } - } - - return bootstrapNode, dhts -} - -type timeoutErr struct { - error -} - -func (t timeoutErr) Timeout() bool { - return true -} - -func (t timeoutErr) Temporary() bool { - return true -} - -// TODO: just use a normal net.Conn instead of this mock conn - -type testUDPPacket struct { - data []byte - addr *net.UDPAddr -} - -type testUDPConn struct { - addr *net.UDPAddr - toRead chan testUDPPacket - writes chan testUDPPacket - - readDeadline time.Time -} - -func newTestUDPConn(addr string) *testUDPConn { - parts := strings.Split(addr, ":") - if len(parts) != 2 { - panic("addr needs ip and port") - } - port, err := strconv.Atoi(parts[1]) - if err != nil { - panic(err) - } - return &testUDPConn{ - addr: &net.UDPAddr{IP: net.IP(parts[0]), Port: port}, - toRead: make(chan testUDPPacket), - writes: make(chan testUDPPacket), - } -} - -func (t testUDPConn) ReadFromUDP(b []byte) (int, *net.UDPAddr, error) { - var timeoutCh <-chan time.Time - if !t.readDeadline.IsZero() { - timeoutCh = time.After(time.Until(t.readDeadline)) - } - - select { - case packet, ok := <-t.toRead: - if !ok { - return 0, nil, errors.Err("conn closed") - } - n := copy(b, packet.data) - return n, packet.addr, nil - case <-timeoutCh: - return 0, nil, timeoutErr{errors.Err("timeout")} - } -} - -func (t testUDPConn) WriteToUDP(b []byte, addr *net.UDPAddr) (int, error) { - t.writes <- testUDPPacket{data: b, addr: addr} - return len(b), nil -} - -func (t *testUDPConn) SetReadDeadline(tm time.Time) error { - t.readDeadline = tm - return nil -} - -func (t *testUDPConn) SetWriteDeadline(tm time.Time) error { - return nil -} - -func (t *testUDPConn) Close() error { - close(t.toRead) - t.writes = nil - return nil -} - -func verifyResponse(t *testing.T, resp map[string]interface{}, id messageID, dhtNodeID string) { - if len(resp) != 4 { - t.Errorf("expected 4 response fields, got %d", len(resp)) - } - - _, ok := resp[headerTypeField] - if !ok { - t.Error("missing type field") - } else { - rType, ok := resp[headerTypeField].(int64) - if !ok { - t.Error("type is not an integer") - } else if rType != responseType { - t.Error("unexpected response type") - } - } - - _, ok = resp[headerMessageIDField] - if !ok { - t.Error("missing message id field") - } else { - rMessageID, ok := resp[headerMessageIDField].(string) - if !ok { - t.Error("message ID is not a string") - } else if rMessageID != string(id[:]) { - t.Error("unexpected message ID") - } - if len(rMessageID) != messageIDLength { - t.Errorf("message ID should be %d chars long", messageIDLength) - } - } - - _, ok = resp[headerNodeIDField] - if !ok { - t.Error("missing node id field") - } else { - rNodeID, ok := resp[headerNodeIDField].(string) - if !ok { - t.Error("node ID is not a string") - } else if rNodeID != dhtNodeID { - t.Error("unexpected node ID") - } - if len(rNodeID) != nodeIDLength { - t.Errorf("node ID should be %d chars long", nodeIDLength) - } - } -} - -func verifyContacts(t *testing.T, contacts []interface{}, nodes []Contact) { - if len(contacts) != len(nodes) { - t.Errorf("got %d contacts; expected %d", len(contacts), len(nodes)) - return - } - - foundNodes := make(map[string]bool) - - for _, c := range contacts { - contact, ok := c.([]interface{}) - if !ok { - t.Error("contact is not a list") - return - } - - if len(contact) != 3 { - t.Error("contact must be 3 items") - return - } - - var currNode Contact - currNodeFound := false - - id, ok := contact[0].(string) - if !ok { - t.Error("contact id is not a string") - } else { - if _, ok := foundNodes[id]; ok { - t.Errorf("contact %s appears multiple times", id) - continue - } - for _, n := range nodes { - if n.ID.RawString() == id { - currNode = n - currNodeFound = true - foundNodes[id] = true - break - } - } - if !currNodeFound { - t.Errorf("unexpected contact %s", id) - continue - } - } - - ip, ok := contact[1].(string) - if !ok { - t.Error("contact IP is not a string") - } else if !currNode.IP.Equal(net.ParseIP(ip)) { - t.Errorf("contact IP mismatch. got %s; expected %s", ip, currNode.IP.String()) - } - - port, ok := contact[2].(int64) - if !ok { - t.Error("contact port is not an int") - } else if int(port) != currNode.Port { - t.Errorf("contact port mismatch. got %d; expected %d", port, currNode.Port) - } - } -} - -func verifyCompactContacts(t *testing.T, contacts []interface{}, nodes []Contact) { - if len(contacts) != len(nodes) { - t.Errorf("got %d contacts; expected %d", len(contacts), len(nodes)) - return - } - - foundNodes := make(map[string]bool) - - for _, c := range contacts { - compact, ok := c.(string) - if !ok { - t.Error("contact is not a string") - return - } - - contact := Contact{} - err := contact.UnmarshalCompact([]byte(compact)) - if err != nil { - t.Error(err) - return - } - - var currNode Contact - currNodeFound := false - - if _, ok := foundNodes[contact.ID.Hex()]; ok { - t.Errorf("contact %s appears multiple times", contact.ID.Hex()) - continue - } - for _, n := range nodes { - if n.ID.Equals(contact.ID) { - currNode = n - currNodeFound = true - foundNodes[contact.ID.Hex()] = true - break - } - } - if !currNodeFound { - t.Errorf("unexpected contact %s", contact.ID.Hex()) - continue - } - - if !currNode.IP.Equal(contact.IP) { - t.Errorf("contact IP mismatch. got %s; expected %s", contact.IP.String(), currNode.IP.String()) - } - - if contact.Port != currNode.Port { - t.Errorf("contact port mismatch. got %d; expected %d", contact.Port, currNode.Port) - } - } -} diff --git a/dht/token_cache.go b/dht/token_cache.go deleted file mode 100644 index 7f772f8..0000000 --- a/dht/token_cache.go +++ /dev/null @@ -1,71 +0,0 @@ -package dht - -import ( - "sync" - "time" - - "github.com/lbryio/reflector.go/dht/bits" - - "github.com/lbryio/lbry.go/stop" -) - -// TODO: this should be moved out of dht and into node, and it should be completely hidden inside node. dht should not need to know about tokens - -type tokenCacheEntry struct { - token string - receivedAt time.Time -} - -type tokenCache struct { - node *Node - tokens map[string]tokenCacheEntry - expiration time.Duration - lock *sync.RWMutex -} - -func newTokenCache(node *Node, expiration time.Duration) *tokenCache { - tc := &tokenCache{} - tc.node = node - tc.tokens = make(map[string]tokenCacheEntry) - tc.expiration = expiration - tc.lock = &sync.RWMutex{} - return tc -} - -// TODO: if store fails, get new token. can happen if a node restarts but we have the token cached - -func (tc *tokenCache) Get(c Contact, hash bits.Bitmap, cancelCh stop.Chan) string { - tc.lock.RLock() - token, exists := tc.tokens[c.String()] - tc.lock.RUnlock() - - if exists && time.Since(token.receivedAt) < tc.expiration { - return token.token - } - - resCh := tc.node.SendAsync(c, Request{ - Method: findValueMethod, - Arg: &hash, - }) - - var res *Response - - select { - case res = <-resCh: - case <-cancelCh: - return "" - } - - if res == nil { - return "" - } - - tc.lock.Lock() - tc.tokens[c.String()] = tokenCacheEntry{ - token: res.Token, - receivedAt: time.Now(), - } - tc.lock.Unlock() - - return res.Token -} diff --git a/dht/token_manager.go b/dht/token_manager.go deleted file mode 100644 index 68b4169..0000000 --- a/dht/token_manager.go +++ /dev/null @@ -1,78 +0,0 @@ -package dht - -import ( - "bytes" - "crypto/rand" - "crypto/sha256" - "net" - "strconv" - "sync" - "time" - - "github.com/lbryio/lbry.go/stop" - "github.com/lbryio/reflector.go/dht/bits" -) - -type tokenManager struct { - secret []byte - prevSecret []byte - lock *sync.RWMutex - stop *stop.Group -} - -func (tm *tokenManager) Start(interval time.Duration) { - tm.secret = make([]byte, 64) - tm.prevSecret = make([]byte, 64) - tm.lock = &sync.RWMutex{} - tm.stop = stop.New() - - tm.rotateSecret() - - tm.stop.Add(1) - go func() { - defer tm.stop.Done() - tick := time.NewTicker(interval) - for { - select { - case <-tick.C: - tm.rotateSecret() - case <-tm.stop.Ch(): - return - } - } - }() -} - -func (tm *tokenManager) Stop() { - tm.stop.StopAndWait() -} - -func (tm *tokenManager) Get(nodeID bits.Bitmap, addr *net.UDPAddr) string { - return genToken(tm.secret, nodeID, addr) -} - -func (tm *tokenManager) Verify(token string, nodeID bits.Bitmap, addr *net.UDPAddr) bool { - return token == genToken(tm.secret, nodeID, addr) || token == genToken(tm.prevSecret, nodeID, addr) -} - -func genToken(secret []byte, nodeID bits.Bitmap, addr *net.UDPAddr) string { - buf := bytes.Buffer{} - buf.Write(nodeID[:]) - buf.Write(addr.IP) - buf.WriteString(strconv.Itoa(addr.Port)) - buf.Write(secret) - t := sha256.Sum256(buf.Bytes()) - return string(t[:]) -} - -func (tm *tokenManager) rotateSecret() { - tm.lock.Lock() - defer tm.lock.Unlock() - - copy(tm.prevSecret, tm.secret) - - _, err := rand.Read(tm.secret) - if err != nil { - panic(err) - } -} diff --git a/go.mod b/go.mod index 8ee5452..ed74811 100644 --- a/go.mod +++ b/go.mod @@ -1,18 +1,22 @@ module github.com/lbryio/reflector.go require ( + cloud.google.com/go v0.34.0 // indirect github.com/armon/go-metrics v0.0.0-20180713145231-3c58d8115a78 github.com/aws/aws-sdk-go v1.16.11 + github.com/btcsuite/btcd v0.0.0-20190109040709-5bda5314ca95 // indirect github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a - github.com/davecgh/go-spew v1.1.0 + github.com/btcsuite/goleveldb v1.0.0 // indirect + github.com/davecgh/go-spew v1.1.1 github.com/go-errors/errors v1.0.1 - github.com/go-ini/ini v1.38.1 + github.com/go-ini/ini v1.41.0 github.com/go-sql-driver/mysql v0.0.0-20180719071942-99ff426eb706 + github.com/golang/mock v1.2.0 // indirect github.com/golang/protobuf v1.2.0 github.com/gorilla/context v1.1.1 github.com/gorilla/mux v1.6.2 github.com/gorilla/rpc v1.1.0 - github.com/gorilla/websocket v1.2.0 + github.com/gorilla/websocket v1.4.0 github.com/hashicorp/errwrap v0.0.0-20180715044906-d6c0cd880357 github.com/hashicorp/go-immutable-radix v0.0.0-20180129170900-7f3cd4390caa github.com/hashicorp/go-msgpack v0.0.0-20150518234257-fa3f63826f7c @@ -23,28 +27,41 @@ require ( github.com/hashicorp/serf v0.0.0-20180530155958-984a73625de3 github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf github.com/inconshreveable/mousetrap v1.0.0 + github.com/jessevdk/go-flags v1.4.0 // indirect github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af github.com/johntdyer/slack-go v0.0.0-20180213144715-95fac1160b22 github.com/johntdyer/slackrus v0.0.0-20180518184837-f7aae3243a07 + github.com/kkdai/bstream v0.0.0-20181106074824-b3251f7901ec // indirect github.com/lbryio/errors.go v0.0.0-20180223142025-ad03d3cc6a5c - github.com/lbryio/lbry.go v0.0.0-20180803110248-e2c96944fc48 - github.com/lbryio/types v0.0.0-20171215152337-0a913ba650dd + github.com/lbryio/lbry.go v0.0.0-20190109223729-30c312501602 + github.com/lbryio/types v0.0.0-20181001180206-594241d24e00 github.com/lyoshenka/bencode v0.0.0-20180323155644-b7abd7672df5 github.com/miekg/dns v1.0.8 - github.com/nlopes/slack v0.3.0 + github.com/mitchellh/mapstructure v1.1.2 // indirect + github.com/nlopes/slack v0.4.0 github.com/phayes/freeport v0.0.0-20171002185219-e27662a4a9d6 + github.com/pkg/errors v0.8.1 // indirect github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 github.com/sebdah/goldie v0.0.0-20180424091453-8784dd1ab561 github.com/sergi/go-diff v1.0.0 - github.com/sirupsen/logrus v0.0.0-20180731161355-d329d24db431 - github.com/spf13/cast v1.2.0 + github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 // indirect + github.com/sirupsen/logrus v1.3.0 + github.com/spf13/cast v1.3.0 github.com/spf13/cobra v0.0.0-20180722215644-7c4570c3ebeb github.com/spf13/pflag v1.0.1 - github.com/uber-go/atomic v0.0.0-20180806045314-ca680462431f - golang.org/x/crypto v0.0.0-20180807104621-f027049dab0a - golang.org/x/net v0.0.0-20180807145015-19491d39cadb - golang.org/x/sys v0.0.0-20180807141123-0718ef2ef256 - golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2 - google.golang.org/appengine v1.1.0 + github.com/uber-go/atomic v1.3.2 + golang.org/x/crypto v0.0.0-20190103213133-ff983b9c42bc + golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1 // indirect + golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e + golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890 // indirect + golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 // indirect + golang.org/x/sys v0.0.0-20190109145017-48ac38b7c8cb + golang.org/x/time v0.0.0-20181108054448-85acf8d2951c + golang.org/x/tools v0.0.0-20190109165630-d30e00c24034 // indirect + google.golang.org/appengine v1.4.0 + google.golang.org/genproto v0.0.0-20190108161440-ae2f86662275 // indirect + gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect gopkg.in/nullbio/null.v6 v6.0.0-20161116030900-40264a2e6b79 + gopkg.in/yaml.v2 v2.2.2 // indirect + honnef.co/go/tools v0.0.0-20190109154334-5bcec433c8ea // indirect ) diff --git a/go.sum b/go.sum index d82c5d1..7e219d2 100644 --- a/go.sum +++ b/go.sum @@ -1,22 +1,51 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/armon/go-metrics v0.0.0-20180713145231-3c58d8115a78 h1:mdRSArcFLfW0VoL34LZAKSz6LkkK4jFxVx2xYavACMg= github.com/armon/go-metrics v0.0.0-20180713145231-3c58d8115a78/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aws/aws-sdk-go v0.0.0-20180806205706-c0447dbaaf19 h1:2di6C9H5QJ+D5LPazymJz8s2kRd8YkbN7knV17yH1Yw= github.com/aws/aws-sdk-go v0.0.0-20180806205706-c0447dbaaf19/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.16.11 h1:g/c7gJeVyHoXCxM2fddS85bPGVkBF8s2q8t3fyElegc= github.com/aws/aws-sdk-go v1.16.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/btcsuite/btcd v0.0.0-20180531025944-86fed781132a/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= +github.com/btcsuite/btcd v0.0.0-20190109040709-5bda5314ca95/go.mod h1:d3C0AkH6BRcvO8T0UEPu53cnw4IbV63x1bEjildYhO0= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20180524032703-d4cc87b86016/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a h1:RQMUrEILyYJEoAT34XS/kLu40vC0+po/UfxrBBA4qZE= github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= 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/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-ini/ini v1.38.1 h1:hbtfM8emWUVo9GnXSloXYyFbXxZ+tG6sbepSStoe1FY= github.com/go-ini/ini v1.38.1/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-ini/ini v1.38.2/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-ini/ini v1.41.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= github.com/go-sql-driver/mysql v0.0.0-20180719071942-99ff426eb706 h1:P3NPKb7qq581SeMCB+dU1SuCX1kQh8VoQ/4HmT2ftQY= github.com/go-sql-driver/mysql v0.0.0-20180719071942-99ff426eb706/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= +github.com/golang/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2 h1:Pgr17XVTNXAk3q/r4CpKzC5xBM/qW1uVLV+IhRZpIIk= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -24,6 +53,8 @@ github.com/gorilla/rpc v1.1.0 h1:marKfvVP0Gpd/jHlVBKCQ8RAoUPdX7K1Nuh6l1BNh7A= github.com/gorilla/rpc v1.1.0/go.mod h1:V4h9r+4sF5HnzqbwIez0fKSpANP0zlYd3qR7p36jkTQ= github.com/gorilla/websocket v1.2.0 h1:VJtLvh6VQym50czpZzx07z/kw9EgAxI3x1ZB8taTMQQ= github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +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/hashicorp/errwrap v0.0.0-20180715044906-d6c0cd880357 h1:Rem2+U35z1QtPQc6r+WolF7yXiefXqDKyk+lN2pE164= github.com/hashicorp/errwrap v0.0.0-20180715044906-d6c0cd880357/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-immutable-radix v0.0.0-20180129170900-7f3cd4390caa h1:0nA8i+6Rwqaq9xlpmVxxTwk6rxiEhX+E6Wh4vPNHiS8= @@ -40,9 +71,12 @@ github.com/hashicorp/memberlist v0.1.0 h1:qSsCiC0WYD39lbSitKNt40e30uorm2Ss/d4JGU github.com/hashicorp/memberlist v0.1.0/go.mod h1:ncdBp14cuox2iFOq3kDiquKU6fqsTBc3W6JvZwjxxsE= github.com/hashicorp/serf v0.0.0-20180530155958-984a73625de3 h1:NUr1hG6WO9sI1x8ofSimmpqfJ+rEHiHP/PLEA33rcfQ= github.com/hashicorp/serf v0.0.0-20180530155958-984a73625de3/go.mod h1:h/Ru6tmZazX7WO/GDmwdpS975F019L4t5ng5IgwbNrE= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf h1:WfD7VjIE6z8dIvMsI4/s+1qr5EL+zoIGev1BQj1eoJ8= github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf/go.mod h1:hyb9oH7vZsitZCiBt0ZvifOrB+qc8PS5IiilCIb87rg= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8 h1:12VvqtR6Aowv3l/EQUlocDHW2Cp4G9WJVH7uyH8QFJE= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= @@ -51,44 +85,132 @@ github.com/johntdyer/slack-go v0.0.0-20180213144715-95fac1160b22 h1:jKUP9TQ0c7X3 github.com/johntdyer/slack-go v0.0.0-20180213144715-95fac1160b22/go.mod h1:u0Jo4f2dNlTJeeOywkM6bLwxq6gC3pZ9rEFHn3AhTdk= github.com/johntdyer/slackrus v0.0.0-20180518184837-f7aae3243a07 h1:+kBG/8rjCa6vxJZbUjAiE4MQmBEBYc8nLEb51frnvBY= github.com/johntdyer/slackrus v0.0.0-20180518184837-f7aae3243a07/go.mod h1:j1kV/8f3jowErEq4XyeypkCdvg5EeHkf0YCKCcq5Ybo= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/kkdai/bstream v0.0.0-20181106074824-b3251f7901ec/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/lbryio/errors.go v0.0.0-20180223142025-ad03d3cc6a5c h1:BhdcWGsuKif/XoSZnqVGNqJ1iEmH0czWR5upj+AuR8M= github.com/lbryio/errors.go v0.0.0-20180223142025-ad03d3cc6a5c/go.mod h1:muH7wpUqE8hRA3OrYYosw9+Sl681BF9cwcjzE+OCNK8= github.com/lbryio/lbry.go v0.0.0-20180803110248-e2c96944fc48 h1:ojUrZuL8vqHxyhivNdpjDaIBkjzWktS9FOTTFkVG8yU= github.com/lbryio/lbry.go v0.0.0-20180803110248-e2c96944fc48/go.mod h1:jyMyYNmA1t7GTkgYs6z2kMnDFTFzlGBr+IkG9LXHk9M= +github.com/lbryio/lbry.go v0.0.0-20190109223729-30c312501602 h1:HSv40ELfMPW2GIpyWwX2JaSAaYz5XW1GNweYc89F2kc= +github.com/lbryio/lbry.go v0.0.0-20190109223729-30c312501602/go.mod h1:YEuFJD/oHNra6BFy+NfuvS84Wg6RMWJFGtiCCCc6MmQ= +github.com/lbryio/ozzo-validation v0.0.0-20170323141101-d1008ad1fd04/go.mod h1:fbG/dzobG8r95KzMwckXiLMHfFjZaBRQqC9hPs2XAQ4= github.com/lbryio/types v0.0.0-20171215152337-0a913ba650dd h1:5wQgwcaLqLMaFIPju2QHcCseSHlArxpQZ1szEGzrp6Y= github.com/lbryio/types v0.0.0-20171215152337-0a913ba650dd/go.mod h1:CG3wsDv5BiVYQd5i1Jp7wGsaVyjZTJshqXeWMVKsISE= +github.com/lbryio/types v0.0.0-20181001180206-594241d24e00 h1:1qRpd8lcyVigX+kYkwQL13gpOURyytgvxZtuIQfPPX8= +github.com/lbryio/types v0.0.0-20181001180206-594241d24e00/go.mod h1:CG3wsDv5BiVYQd5i1Jp7wGsaVyjZTJshqXeWMVKsISE= +github.com/lusis/go-slackbot v0.0.0-20180109053408-401027ccfef5/go.mod h1:c2mYKRyMb1BPkO5St0c/ps62L4S0W2NAkaTXj9qEI+0= +github.com/lusis/slack-test v0.0.0-20180109053238-3c758769bfa6/go.mod h1:sFlOUpQL1YcjhFVXhg1CG8ZASEs/Mf1oVb6H75JL/zg= github.com/lyoshenka/bencode v0.0.0-20180323155644-b7abd7672df5 h1:mG83tLXWSRdcXMWfkoumVwhcCbf3jHF9QKv/m37BkM0= github.com/lyoshenka/bencode v0.0.0-20180323155644-b7abd7672df5/go.mod h1:H0aPCWffGOaDcjkw1iB7W9DVLp6GXmfcJY/7YZCWPA4= github.com/miekg/dns v1.0.8 h1:Zi8HNpze3NeRWH1PQV6O71YcvJRQ6j0lORO6DAEmAAI= github.com/miekg/dns v1.0.8/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/mapstructure v0.0.0-20180511142126-bb74f1db0675/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/nlopes/slack v0.2.0/go.mod h1:jVI4BBK3lSktibKahxBF74txcK2vyvkza1z/+rRnVAM= github.com/nlopes/slack v0.3.0 h1:jCxvaS8wC4Bb1jnbqZMjCDkOOgy4spvQWcrw/TF0L0E= github.com/nlopes/slack v0.3.0/go.mod h1:jVI4BBK3lSktibKahxBF74txcK2vyvkza1z/+rRnVAM= +github.com/nlopes/slack v0.4.0 h1:OVnHm7lv5gGT5gkcHsZAyw++oHVFihbjWbL3UceUpiA= +github.com/nlopes/slack v0.4.0/go.mod h1:jVI4BBK3lSktibKahxBF74txcK2vyvkza1z/+rRnVAM= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/phayes/freeport v0.0.0-20171002185219-e27662a4a9d6 h1:2bae6N0SZjgzk+Zg8mzTsfmpwHXY9VBNp9UdjhaElA0= github.com/phayes/freeport v0.0.0-20171002185219-e27662a4a9d6/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= +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/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sebdah/goldie v0.0.0-20180424091453-8784dd1ab561 h1:IY+sDBJR/wRtsxq+626xJnt4Tw7/ROA9cDIR8MMhWyg= github.com/sebdah/goldie v0.0.0-20180424091453-8784dd1ab561/go.mod h1:lvjGftC8oe7XPtyrOidaMi0rp5B9+XY/ZRUynGnuaxQ= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shopspring/decimal v0.0.0-20180607144847-19e3cb6c2930/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/sirupsen/logrus v0.0.0-20180523074243-ea8897e79973/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v0.0.0-20180731161355-d329d24db431 h1:tJ2phHULXperiIq6Cl3t4MLypicinjmlM3Y+lNEipuo= github.com/sirupsen/logrus v0.0.0-20180731161355-d329d24db431/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.3.0 h1:hI/7Q+DtNZ2kINb6qt/lS+IyXnHQe9e90POfeewL/ME= +github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= github.com/spf13/cast v1.2.0 h1:HHl1DSRbEQN2i8tJmtS6ViPyHx35+p51amrdsiTCrkg= github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.0-20180722215644-7c4570c3ebeb h1:9EsYJzSlhhaP+nYmMOcptMF2VEUH52jxPzt/TX14KWM= github.com/spf13/cobra v0.0.0-20180722215644-7c4570c3ebeb/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/pflag v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +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/uber-go/atomic v0.0.0-20180806045314-ca680462431f h1:vKpCeeburRE8ZXnuj9ptRqjm7WLD0O7ug28tRJuWM54= github.com/uber-go/atomic v0.0.0-20180806045314-ca680462431f/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= +github.com/uber-go/atomic v1.3.2 h1:Azu9lPBWRNKzYXSIwRfgRuDuS0YKsK4NFhiQv98gkxo= +github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= +github.com/ybbus/jsonrpc v0.0.0-20180411222309-2a548b7d822d/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180608092829-8ac0e0d97ce4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180807104621-f027049dab0a h1:PulT0Y50PcfTWomfsD39bSQyVrjjWdIuJKfyR4nOCJw= golang.org/x/crypto v0.0.0-20180807104621-f027049dab0a/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190103213133-ff983b9c42bc h1:F5tKCVGp+MUAHhKp5MZtGqAlGX3+oCsiL1Q629FL90M= +golang.org/x/crypto v0.0.0-20190103213133-ff983b9c42bc/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180807145015-19491d39cadb h1:H5qWxL6CeEdaEGPqB5nnxJja1ULIcpuu91vIqAuGoJ0= golang.org/x/net v0.0.0-20180807145015-19491d39cadb/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180807141123-0718ef2ef256 h1:tKa4dTsBBeG8RnHO9sDPtJYNJNOc4ilC49ePrvii4To= golang.org/x/sys v0.0.0-20180807141123-0718ef2ef256/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190109145017-48ac38b7c8cb h1:1w588/yEchbPNpa9sEvOcMZYbWHedwJjg4VOAdDHWHk= +golang.org/x/sys v0.0.0-20190109145017-48ac38b7c8cb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2 h1:+DCIGbF/swA92ohVg0//6X2IVY3KZs6p9mix0ziNYJM= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190109165630-d30e00c24034/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181004005441-af9cb2a35e7f/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190108161440-ae2f86662275/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/ini.v1 v1.41.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/nullbio/null.v6 v6.0.0-20161116030900-40264a2e6b79 h1:FpCr9V8wuOei4BAen+93HtVJ+XSi+KPbaPKm0Vj5R64= gopkg.in/nullbio/null.v6 v6.0.0-20161116030900-40264a2e6b79/go.mod h1:gWkaRU7CoXpezCBWfWjm3999QqS+1pYPXGbqQCTMzo8= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190109154334-5bcec433c8ea/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/peer/server.go b/peer/server.go index 9cb69f8..031ab66 100644 --- a/peer/server.go +++ b/peer/server.go @@ -10,8 +10,8 @@ import ( "strings" "time" - "github.com/lbryio/lbry.go/errors" - "github.com/lbryio/lbry.go/stop" + "github.com/lbryio/lbry.go/extras/errors" + "github.com/lbryio/lbry.go/extras/stop" "github.com/lbryio/reflector.go/store" "github.com/davecgh/go-spew/spew" diff --git a/prism/prism.go b/prism/prism.go index cdb2d5c..2c7843a 100644 --- a/prism/prism.go +++ b/prism/prism.go @@ -5,16 +5,16 @@ import ( "strconv" "sync" + "github.com/lbryio/lbry.go/dht" + "github.com/lbryio/lbry.go/dht/bits" "github.com/lbryio/reflector.go/cluster" "github.com/lbryio/reflector.go/db" - "github.com/lbryio/reflector.go/dht" - "github.com/lbryio/reflector.go/dht/bits" "github.com/lbryio/reflector.go/peer" "github.com/lbryio/reflector.go/reflector" "github.com/lbryio/reflector.go/store" - "github.com/lbryio/lbry.go/errors" - "github.com/lbryio/lbry.go/stop" + "github.com/lbryio/lbry.go/extras/errors" + "github.com/lbryio/lbry.go/extras/stop" log "github.com/sirupsen/logrus" ) diff --git a/prism/prism_test.go b/prism/prism_test.go index 604eefe..06b8469 100644 --- a/prism/prism_test.go +++ b/prism/prism_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/davecgh/go-spew/spew" - "github.com/lbryio/reflector.go/dht/bits" + "github.com/lbryio/lbry.go/dht/bits" ) func TestAnnounceRange(t *testing.T) { diff --git a/reflector/blocklist.go b/reflector/blocklist.go index 14e60c3..927fd78 100644 --- a/reflector/blocklist.go +++ b/reflector/blocklist.go @@ -11,7 +11,7 @@ import ( "github.com/lbryio/reflector.go/store" "github.com/lbryio/reflector.go/wallet" - "github.com/lbryio/lbry.go/errors" + "github.com/lbryio/lbry.go/extras/errors" types "github.com/lbryio/types/go" "github.com/golang/protobuf/proto" diff --git a/reflector/client.go b/reflector/client.go index e651637..230995e 100644 --- a/reflector/client.go +++ b/reflector/client.go @@ -6,7 +6,7 @@ import ( "github.com/lbryio/reflector.go/stream" - "github.com/lbryio/lbry.go/errors" + "github.com/lbryio/lbry.go/extras/errors" log "github.com/sirupsen/logrus" ) diff --git a/reflector/server.go b/reflector/server.go index 1b93e81..3613a64 100644 --- a/reflector/server.go +++ b/reflector/server.go @@ -13,8 +13,8 @@ import ( "github.com/lbryio/reflector.go/store" "github.com/lbryio/reflector.go/stream" - "github.com/lbryio/lbry.go/errors" - "github.com/lbryio/lbry.go/stop" + "github.com/lbryio/lbry.go/extras/errors" + "github.com/lbryio/lbry.go/extras/stop" log "github.com/sirupsen/logrus" ) diff --git a/reflector/server_test.go b/reflector/server_test.go index c9cc221..878b750 100644 --- a/reflector/server_test.go +++ b/reflector/server_test.go @@ -9,7 +9,7 @@ import ( "testing" "time" - "github.com/lbryio/reflector.go/dht/bits" + "github.com/lbryio/lbry.go/dht/bits" "github.com/lbryio/reflector.go/store" "github.com/davecgh/go-spew/spew" diff --git a/reflector/stats.go b/reflector/stats.go index 59a3f12..095f0ca 100644 --- a/reflector/stats.go +++ b/reflector/stats.go @@ -6,8 +6,8 @@ import ( "sync" "time" - "github.com/lbryio/lbry.go/errors" - "github.com/lbryio/lbry.go/stop" + "github.com/lbryio/lbry.go/extras/errors" + "github.com/lbryio/lbry.go/extras/stop" log "github.com/sirupsen/logrus" ) diff --git a/store/dbbacked.go b/store/dbbacked.go index 38363ca..eb35777 100644 --- a/store/dbbacked.go +++ b/store/dbbacked.go @@ -6,7 +6,7 @@ import ( "github.com/lbryio/reflector.go/db" - "github.com/lbryio/lbry.go/errors" + "github.com/lbryio/lbry.go/extras/errors" log "github.com/sirupsen/logrus" ) diff --git a/store/file.go b/store/file.go index 6c49573..ed61207 100644 --- a/store/file.go +++ b/store/file.go @@ -5,7 +5,7 @@ import ( "os" "path" - "github.com/lbryio/lbry.go/errors" + "github.com/lbryio/lbry.go/extras/errors" ) // FileBlobStore is a local disk store. diff --git a/store/memory.go b/store/memory.go index f9d845a..4f9ee34 100644 --- a/store/memory.go +++ b/store/memory.go @@ -1,6 +1,6 @@ package store -import "github.com/lbryio/lbry.go/errors" +import "github.com/lbryio/lbry.go/extras/errors" // MemoryBlobStore is an in memory only blob store with no persistence. type MemoryBlobStore struct { diff --git a/store/memory_test.go b/store/memory_test.go index 5be6b3e..f72795d 100644 --- a/store/memory_test.go +++ b/store/memory_test.go @@ -4,7 +4,7 @@ import ( "bytes" "testing" - "github.com/lbryio/lbry.go/errors" + "github.com/lbryio/lbry.go/extras/errors" ) func TestMemoryBlobStore_Put(t *testing.T) { diff --git a/store/s3.go b/store/s3.go index 963ed0f..8543c49 100644 --- a/store/s3.go +++ b/store/s3.go @@ -5,7 +5,7 @@ import ( "net/http" "time" - "github.com/lbryio/lbry.go/errors" + "github.com/lbryio/lbry.go/extras/errors" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" diff --git a/store/store.go b/store/store.go index 2aa4679..39252e5 100644 --- a/store/store.go +++ b/store/store.go @@ -1,6 +1,6 @@ package store -import "github.com/lbryio/lbry.go/errors" +import "github.com/lbryio/lbry.go/extras/errors" // BlobStore is an interface with methods for consistently handling blob storage. type BlobStore interface { diff --git a/stream/blob.go b/stream/blob.go index b2c2062..ae49545 100644 --- a/stream/blob.go +++ b/stream/blob.go @@ -9,7 +9,7 @@ import ( "encoding/json" "strconv" - "github.com/lbryio/lbry.go/errors" + "github.com/lbryio/lbry.go/extras/errors" ) const MaxBlobSize = 2 * 1024 * 1024 diff --git a/stream/json.go b/stream/json.go index d78c64d..34aeeac 100644 --- a/stream/json.go +++ b/stream/json.go @@ -4,7 +4,7 @@ import ( "encoding/hex" "encoding/json" - "github.com/lbryio/lbry.go/errors" + "github.com/lbryio/lbry.go/extras/errors" ) // inspired by https://blog.gopheracademy.com/advent-2016/advanced-encoding-decoding/ diff --git a/wallet/network.go b/wallet/network.go index d98f4e6..65cb299 100644 --- a/wallet/network.go +++ b/wallet/network.go @@ -12,7 +12,7 @@ import ( "sync" "time" - "github.com/lbryio/lbry.go/stop" + "github.com/lbryio/lbry.go/extras/stop" log "github.com/sirupsen/logrus" "github.com/uber-go/atomic" ) diff --git a/wallet/transport.go b/wallet/transport.go index d817742..449dc0b 100644 --- a/wallet/transport.go +++ b/wallet/transport.go @@ -8,7 +8,7 @@ import ( "net" "time" - "github.com/lbryio/lbry.go/stop" + "github.com/lbryio/lbry.go/extras/stop" log "github.com/sirupsen/logrus" )