diff --git a/address/formatting/encoding.go b/address/formatting/encoding.go deleted file mode 100644 index 845c612..0000000 --- a/address/formatting/encoding.go +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright (C) 2019-2025, Lux Industries, Inc. All rights reserved. -// See the file LICENSE for licensing terms. - -package formatting - -import ( - "bytes" - "encoding/hex" - "errors" - "fmt" - "math" - "strings" - - "github.com/luxfi/crypto/hash" -) - -const ( - hexPrefix = "0x" - checksumLen = 4 -) - -var ( - errEncodingOverFlow = errors.New("encoding overflow") - errInvalidEncoding = errors.New("invalid encoding") - errUnsupportedEncodingInMethod = errors.New("unsupported encoding in method") - errMissingChecksum = errors.New("input string is smaller than the checksum size") - errBadChecksum = errors.New("invalid input checksum") - errMissingHexPrefix = errors.New("missing 0x prefix to hex encoding") -) - -// Encoding defines how bytes are converted to a string and vice versa -type Encoding uint8 - -const ( - // Hex specifies a hex plus 4 byte checksum encoding format - Hex Encoding = iota - // HexNC specifies a hex encoding format - HexNC - // HexC specifies a hex plus 4 byte checksum encoding format - HexC - // JSON specifies the JSON encoding format - JSON -) - -func (enc Encoding) String() string { - switch enc { - case Hex: - return "hex" - case HexNC: - return "hexnc" - case HexC: - return "hexc" - case JSON: - return "json" - default: - return errInvalidEncoding.Error() - } -} - -func (enc Encoding) valid() bool { - switch enc { - case Hex, HexNC, HexC, JSON: - return true - } - return false -} - -func (enc Encoding) MarshalJSON() ([]byte, error) { - if !enc.valid() { - return nil, errInvalidEncoding - } - return []byte(`"` + enc.String() + `"`), nil -} - -func (enc *Encoding) UnmarshalJSON(b []byte) error { - str := string(b) - if str == "null" { - return nil - } - switch strings.ToLower(str) { - case `"hex"`: - *enc = Hex - case `"hexnc"`: - *enc = HexNC - case `"hexc"`: - *enc = HexC - case `"json"`: - *enc = JSON - default: - return errInvalidEncoding - } - return nil -} - -// Encode [bytes] to a string using the given encoding format [bytes] may be -// nil, in which case it will be treated the same as an empty slice. -func Encode(encoding Encoding, bytes []byte) (string, error) { - if !encoding.valid() { - return "", errInvalidEncoding - } - - switch encoding { - case Hex, HexC: - bytesLen := len(bytes) - if bytesLen > math.MaxInt32-checksumLen { - return "", errEncodingOverFlow - } - checked := make([]byte, bytesLen+checksumLen) - copy(checked, bytes) - copy(checked[len(bytes):], hash.Checksum(bytes, checksumLen)) - bytes = checked - } - - switch encoding { - case Hex, HexNC, HexC: - return fmt.Sprintf("0x%x", bytes), nil - case JSON: - // JSON Marshal does not support []byte input and we rely on the - // router's json marshalling to marshal our interface{} into JSON - // in response. Therefore it is not supported in this call. - return "", errUnsupportedEncodingInMethod - default: - return "", errInvalidEncoding - } -} - -// Decode [str] to bytes using the given encoding -// If [str] is the empty string, returns a nil byte slice and nil error -func Decode(encoding Encoding, str string) ([]byte, error) { - switch { - case !encoding.valid(): - return nil, errInvalidEncoding - case len(str) == 0: - return nil, nil - } - - var ( - decodedBytes []byte - err error - ) - switch encoding { - case Hex, HexNC, HexC: - if !strings.HasPrefix(str, hexPrefix) { - return nil, errMissingHexPrefix - } - decodedBytes, err = hex.DecodeString(str[2:]) - case JSON: - // JSON unmarshalling requires interface and has no return values - // contrary to this method, therefore it is not supported in this call - return nil, errUnsupportedEncodingInMethod - default: - return nil, errInvalidEncoding - } - if err != nil { - return nil, err - } - - switch encoding { - case Hex, HexC: - if len(decodedBytes) < checksumLen { - return nil, errMissingChecksum - } - // Verify the checksum - rawBytes := decodedBytes[:len(decodedBytes)-checksumLen] - checksum := decodedBytes[len(decodedBytes)-checksumLen:] - if !bytes.Equal(checksum, hash.Checksum(rawBytes, checksumLen)) { - return nil, errBadChecksum - } - decodedBytes = rawBytes - } - return decodedBytes, nil -} diff --git a/address/formatting/encoding_benchmark_test.go b/address/formatting/encoding_benchmark_test.go deleted file mode 100644 index 7b2b1e0..0000000 --- a/address/formatting/encoding_benchmark_test.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (C) 2019-2025, Lux Industries, Inc. All rights reserved. -// See the file LICENSE for licensing terms. - -package formatting - -import ( - "fmt" - "math/rand" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/luxfi/constants" -) - -func BenchmarkEncodings(b *testing.B) { - benchmarks := []struct { - encoding Encoding - size int - }{ - { - encoding: Hex, - size: 1 * constants.KiB, // 1kb - }, - { - encoding: Hex, - size: 4 * constants.KiB, // 4kb - }, - { - encoding: Hex, - size: 32 * constants.KiB, // 32kb - }, - { - encoding: Hex, - size: 128 * constants.KiB, // 128kb - }, - { - encoding: Hex, - size: 256 * constants.KiB, // 256kb - }, - { - encoding: Hex, - size: 512 * constants.KiB, // 512kb - }, - { - encoding: Hex, - size: 1 * constants.MiB, // 1mb - }, - { - encoding: Hex, - size: 2 * constants.MiB, // 2mb - }, - { - encoding: Hex, - size: 4 * constants.MiB, // 4mb - }, - } - for _, benchmark := range benchmarks { - bytes := make([]byte, benchmark.size) - _, _ = rand.Read(bytes) // #nosec G404 - b.Run(fmt.Sprintf("%s-%d bytes", benchmark.encoding, benchmark.size), func(b *testing.B) { - for n := 0; n < b.N; n++ { - _, err := Encode(benchmark.encoding, bytes) - require.NoError(b, err) - } - }) - } -} diff --git a/address/formatting/encoding_test.go b/address/formatting/encoding_test.go deleted file mode 100644 index e6e69a8..0000000 --- a/address/formatting/encoding_test.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright (C) 2019-2025, Lux Industries, Inc. All rights reserved. -// See the file LICENSE for licensing terms. - -package formatting - -import ( - "encoding/hex" - "encoding/json" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestEncodingMarshalJSON(t *testing.T) { - require := require.New(t) - - enc := Hex - jsonBytes, err := enc.MarshalJSON() - require.NoError(err) - require.JSONEq(`"hex"`, string(jsonBytes)) -} - -func TestEncodingUnmarshalJSON(t *testing.T) { - require := require.New(t) - - jsonBytes := []byte(`"hex"`) - var enc Encoding - require.NoError(json.Unmarshal(jsonBytes, &enc)) - require.Equal(Hex, enc) - - var serr *json.SyntaxError - jsonBytes = []byte("") - require.ErrorAs(json.Unmarshal(jsonBytes, &enc), &serr) - - jsonBytes = []byte(`""`) - err := json.Unmarshal(jsonBytes, &enc) - require.ErrorIs(err, errInvalidEncoding) -} - -func TestEncodingString(t *testing.T) { - enc := Hex - require.Equal(t, "hex", enc.String()) -} - -// Test encoding bytes to a string and decoding back to bytes -func TestEncodeDecode(t *testing.T) { - require := require.New(t) - - type test struct { - encoding Encoding - bytes []byte - str string - } - - id := [32]byte{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} - tests := []test{ - { - Hex, - []byte{}, - "0x7852b855", - }, - { - Hex, - []byte{0}, - "0x0017afa01d", - }, - { - Hex, - []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255}, - "0x00010203040506070809ff4482539c", - }, - { - Hex, - id[:], - "0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20b7a612c9", - }, - } - - for _, test := range tests { - // Encode the bytes - strResult, err := Encode(test.encoding, test.bytes) - require.NoError(err) - // Make sure the string repr. is what we expected - require.Equal(test.str, strResult) - // Decode the string - bytesResult, err := Decode(test.encoding, strResult) - require.NoError(err) - // Make sure we got the same bytes back - require.Equal(test.bytes, bytesResult) - } -} - -// Test that encoding nil bytes works -func TestEncodeNil(t *testing.T) { - require := require.New(t) - - str, err := Encode(Hex, nil) - require.NoError(err) - require.Equal("0x7852b855", str) -} - -func TestDecodeHexInvalid(t *testing.T) { - tests := []struct { - inputStr string - expectedErr error - }{ - { - inputStr: "0", - expectedErr: errMissingHexPrefix, - }, - { - inputStr: "x", - expectedErr: errMissingHexPrefix, - }, - { - inputStr: "0xg", - expectedErr: hex.InvalidByteError('g'), - }, - { - inputStr: "0x0017afa0Zd", - expectedErr: hex.InvalidByteError('Z'), - }, - { - inputStr: "0xafafafafaf", - expectedErr: errBadChecksum, - }, - } - for _, test := range tests { - _, err := Decode(Hex, test.inputStr) - require.ErrorIs(t, err, test.expectedErr) - } -} - -func TestDecodeNil(t *testing.T) { - require := require.New(t) - result, err := Decode(Hex, "") - require.NoError(err) - require.Empty(result) -} - -func FuzzEncodeDecode(f *testing.F) { - f.Fuzz(func(t *testing.T, bytes []byte) { - require := require.New(t) - - str, err := Encode(Hex, bytes) - require.NoError(err) - - decoded, err := Decode(Hex, str) - require.NoError(err) - - require.Equal(bytes, decoded) - }) -} diff --git a/address/formatting/int_format.go b/address/formatting/int_format.go deleted file mode 100644 index 5bd8444..0000000 --- a/address/formatting/int_format.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (C) 2019-2025, Lux Industries, Inc. All rights reserved. -// See the file LICENSE for licensing terms. - -package formatting - -import ( - "fmt" - "math" -) - -func IntFormat(maxValue int) string { - log := 1 - if maxValue > 0 { - log = int(math.Ceil(math.Log10(float64(maxValue + 1)))) - } - return fmt.Sprintf("%%0%dd", log) -} diff --git a/address/formatting/int_format_test.go b/address/formatting/int_format_test.go deleted file mode 100644 index b68f3f5..0000000 --- a/address/formatting/int_format_test.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (C) 2019-2025, Lux Industries, Inc. All rights reserved. -// See the file LICENSE for licensing terms. - -package formatting - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestIntFormat(t *testing.T) { - require := require.New(t) - - require.Equal("%01d", IntFormat(0)) - require.Equal("%01d", IntFormat(9)) - require.Equal("%02d", IntFormat(10)) - require.Equal("%02d", IntFormat(99)) - require.Equal("%03d", IntFormat(100)) - require.Equal("%03d", IntFormat(999)) - require.Equal("%04d", IntFormat(1000)) - require.Equal("%04d", IntFormat(9999)) - require.Equal("%05d", IntFormat(10000)) - require.Equal("%05d", IntFormat(99999)) - require.Equal("%06d", IntFormat(100000)) - require.Equal("%06d", IntFormat(999999)) -} diff --git a/address/formatting/prefixed_stringer.go b/address/formatting/prefixed_stringer.go deleted file mode 100644 index 68df4c8..0000000 --- a/address/formatting/prefixed_stringer.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (C) 2019-2025, Lux Industries, Inc. All rights reserved. -// See the file LICENSE for licensing terms. - -package formatting - -import "fmt" - -// PrefixedStringer extends a stringer that adds a prefix -type PrefixedStringer interface { - fmt.Stringer - - PrefixedString(prefix string) string -} diff --git a/go.mod b/go.mod index c00bba4..034a736 100644 --- a/go.mod +++ b/go.mod @@ -20,9 +20,8 @@ require ( github.com/jedisct1/go-minisign v0.0.0-20241212093149-d2f9f49435c7 github.com/leanovate/gopter v0.2.11 github.com/luxfi/cache v1.1.0 - github.com/luxfi/constants v1.4.2 github.com/luxfi/gpu v0.30.0 - github.com/luxfi/ids v1.2.7 + github.com/luxfi/ids v1.2.9 github.com/luxfi/log v1.2.1 github.com/luxfi/mock v0.1.0 github.com/mr-tron/base58 v1.2.0 @@ -33,23 +32,20 @@ require ( golang.org/x/crypto v0.46.0 golang.org/x/sync v0.19.0 golang.org/x/sys v0.39.0 - lukechampine.com/blake3 v1.2.1 + lukechampine.com/blake3 v1.4.0 ) require ( github.com/bits-and-blooms/bitset v1.24.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/gorilla/rpc v1.2.1 // indirect github.com/holiman/uint256 v1.3.2 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect - github.com/luxfi/math v0.1.4 // indirect - github.com/luxfi/node v1.20.3 // indirect github.com/luxfi/utils v1.1.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/zeebo/assert v1.3.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.1 // indirect golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 // indirect - gonum.org/v1/gonum v0.16.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index f2abd0f..9583ff9 100644 --- a/go.sum +++ b/go.sum @@ -197,8 +197,6 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= -github.com/gorilla/rpc v1.2.1 h1:yC+LMV5esttgpVvNORL/xX4jvTTEUE30UZhZ5JF7K9k= -github.com/gorilla/rpc v1.2.1/go.mod h1:uNpOihAlF5xRFLuTYhfR0yfCTm0WTQSQttkMSptRfGk= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= @@ -253,20 +251,14 @@ github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzW github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= github.com/luxfi/cache v1.1.0 h1:6LUyGGZ+rrMAJBbAU6+UwkcamXj3zsboRUodIof2Ong= github.com/luxfi/cache v1.1.0/go.mod h1:9GvlEEE9rFPaaWxvVpSPwW8ZMo2+8VMNNcuPa4AwzPg= -github.com/luxfi/constants v1.4.2 h1:hxp2cITYxNCKG3xOdjnEesOoCR4GI9Lb5RQ4120ke6E= -github.com/luxfi/constants v1.4.2/go.mod h1:xk+0eA7UY1GkHrmI7yqR+9LDe4TUe3p1VfRvs6cJbNM= github.com/luxfi/gpu v0.30.0 h1:k+7EDp/WHTa0176zXet1UXTl8IcZcp1ZkS8GUJ5l2iU= github.com/luxfi/gpu v0.30.0/go.mod h1:7pFsHqra1Vrmy2aGXVEPKeKsPR+Bn+QmBXuByK3fdPA= -github.com/luxfi/ids v1.2.7 h1:3B42EbzR2cdY3veo1yOFOOIeEE+HULnCye2Ye32nXqI= -github.com/luxfi/ids v1.2.7/go.mod h1:svLsj7e6ixJVfRYaQqv9RWjBIW11Vz738+d08BVpeCg= +github.com/luxfi/ids v1.2.9 h1:+yjdhXW99drnd2Zlp1u/p8k3G23W3/1btJQ4ogHawUI= +github.com/luxfi/ids v1.2.9/go.mod h1:khJOEdOPxd22yn0jcVrnbX1ADa0GHn5Y74gvCzN5BYc= github.com/luxfi/log v1.2.1 h1:L2JM8MjGPF8rBnY+EXODS9x5OQTGSgeQ1SPFmeB+oPY= github.com/luxfi/log v1.2.1/go.mod h1:0vJzb4Hl9fvgwWDMKcbCD/SYH3bO0iSmgZMcYdfdl1o= -github.com/luxfi/math v0.1.4 h1:yPoXwHttm2M0HQ8a+SNZcN0MDz617en4+tyiQ9Iq8cA= -github.com/luxfi/math v0.1.4/go.mod h1:hGzbdMPfhX6zobJXz+Crja7AY9kHMqIL2L60kYUzyUc= github.com/luxfi/mock v0.1.0 h1:IwElfNu+T9sXvzFX6tudPDx1vqPuACRSRdxpD5lxW+o= github.com/luxfi/mock v0.1.0/go.mod h1:izF+9K0gGzFC9zERn6Po37v46eLdPB+EIsDjL3GLk+U= -github.com/luxfi/node v1.20.3 h1:T8zo9Q5hBDJ31t42t6SDHYhQcvIjfx0iIUAHQqTSYwo= -github.com/luxfi/node v1.20.3/go.mod h1:8+nlZVYI8dDBYxC4Bj7mqeL4rHrIQfoB+atVZhABtEA= github.com/luxfi/utils v1.1.0 h1:ti7HvjNwJd4ILDMERJtOAWE9mF8l+zqDVkgWnF7Agic= github.com/luxfi/utils v1.1.0/go.mod h1:ABqhBdGNig0CaDcnNYldv1byS0BTNi5IKPbJSPF1p98= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= @@ -312,8 +304,6 @@ github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0t github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sanity-io/litter v1.5.1 h1:dwnrSypP6q56o3lFxTU+t2fwQ9A+U5qrXVO4Qg9KwVU= -github.com/sanity-io/litter v1.5.1/go.mod h1:5Z71SvaYy5kcGtyglXOC9rrUi3c1E8CamFWjQsazTh0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= @@ -348,16 +338,14 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69 github.com/supranational/blst v0.3.16 h1:bTDadT+3fK497EvLdWRQEjiGnUtzJ7jjIUMF0jqwYhE= github.com/supranational/blst v0.3.16/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/thepudds/fzgen v0.4.3 h1:srUP/34BulQaEwPP/uHZkdjUcUjIzL7Jkf4CBVryiP8= -github.com/thepudds/fzgen v0.4.3/go.mod h1:BhhwtRhzgvLWAjjcHDJ9pEiLD2Z9hrVIFjBCHJ//zJ4= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= -github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/blake3 v0.2.4 h1:KYQPkhpRtcqh0ssGYcKLG1JYvddkEA8QwCM/yBqhaZI= github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCRUjcE= github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= @@ -636,8 +624,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -769,8 +755,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= -lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= +lukechampine.com/blake3 v1.4.0 h1:xDbKOZCVbnZsfzM6mHSYcGRHZ3YrLDzqz8XnV4uaD5w= +lukechampine.com/blake3 v1.4.0/go.mod h1:MQJNQCTnR+kwOP/JEZSxj3MaQjp80FOFSNMMHXcSeX0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=