From 9f216fd4816c9f5ff70effe24ef381a9b63b77a3 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Wed, 29 Jul 2020 16:18:42 -0400 Subject: [PATCH 001/128] WIP on BaseAccount protobuf pub_key --- go.sum | 5 -- proto/cosmos/auth/auth.proto | 3 +- proto/ibc/transfer/genesis.proto | 2 - x/auth/types/account.go | 13 ---- x/auth/types/auth.pb.go | 120 ++++++++++++++++------------- x/ibc-transfer/types/genesis.pb.go | 24 +++--- x/staking/types/staking.pb.go | 11 ++- 7 files changed, 83 insertions(+), 95 deletions(-) diff --git a/go.sum b/go.sum index b3d075b7647d..a79943ce319c 100644 --- a/go.sum +++ b/go.sum @@ -168,8 +168,6 @@ github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4er github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -646,7 +644,6 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20u golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 h1:ogLJMz+qpzav7lGMh10LMvAkM/fAoGlaiiHYiFYdm80= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= @@ -772,7 +769,5 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= 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= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/proto/cosmos/auth/auth.proto b/proto/cosmos/auth/auth.proto index ad748b560a5b..e23a20fe33ae 100644 --- a/proto/cosmos/auth/auth.proto +++ b/proto/cosmos/auth/auth.proto @@ -3,6 +3,7 @@ package cosmos.auth; import "cosmos_proto/cosmos.proto"; import "gogoproto/gogo.proto"; +import "cosmos/crypto/crypto.proto"; option go_package = "github.com/cosmos/cosmos-sdk/x/auth/types"; @@ -15,7 +16,7 @@ message BaseAccount { option (cosmos_proto.implements_interface) = "AccountI"; bytes address = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress"]; - bytes pub_key = 2 [(gogoproto.jsontag) = "public_key,omitempty", (gogoproto.moretags) = "yaml:\"public_key\""]; + cosmos.crypto.PublicKey pub_key = 2 [(gogoproto.jsontag) = "public_key,omitempty", (gogoproto.moretags) = "yaml:\"public_key\""]; uint64 account_number = 3 [(gogoproto.moretags) = "yaml:\"account_number\""]; uint64 sequence = 4; } diff --git a/proto/ibc/transfer/genesis.proto b/proto/ibc/transfer/genesis.proto index b8e7b665d18e..e83d7af0f481 100644 --- a/proto/ibc/transfer/genesis.proto +++ b/proto/ibc/transfer/genesis.proto @@ -4,8 +4,6 @@ package ibc.transfer; option go_package = "github.com/cosmos/cosmos-sdk/x/ibc-transfer/types"; import "gogoproto/gogo.proto"; -import "cosmos/cosmos.proto"; -import "ibc/transfer/transfer.proto"; // GenesisState is currently only used to ensure that the InitGenesis gets run // by the module manager diff --git a/x/auth/types/account.go b/x/auth/types/account.go index 1e85ac8f2049..98cd96b4449f 100644 --- a/x/auth/types/account.go +++ b/x/auth/types/account.go @@ -62,23 +62,10 @@ func (acc *BaseAccount) SetAddress(addr sdk.AccAddress) error { // GetPubKey - Implements sdk.AccountI. func (acc BaseAccount) GetPubKey() (pk crypto.PubKey) { - if len(acc.PubKey) == 0 { - return nil - } - - amino.MustUnmarshalBinaryBare(acc.PubKey, &pk) - return pk } // SetPubKey - Implements sdk.AccountI. func (acc *BaseAccount) SetPubKey(pubKey crypto.PubKey) error { - if pubKey == nil { - acc.PubKey = nil - } else { - acc.PubKey = pubKey.Bytes() - } - - return nil } // GetAccountNumber - Implements AccountI diff --git a/x/auth/types/auth.pb.go b/x/auth/types/auth.pb.go index cc56b31a299b..c23e6ae8b722 100644 --- a/x/auth/types/auth.pb.go +++ b/x/auth/types/auth.pb.go @@ -5,6 +5,7 @@ package types import ( fmt "fmt" + types "github.com/cosmos/cosmos-sdk/crypto/types" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" @@ -30,7 +31,7 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // type for additional functionality (e.g. vesting). type BaseAccount struct { Address github_com_cosmos_cosmos_sdk_types.AccAddress `protobuf:"bytes,1,opt,name=address,proto3,casttype=github.com/cosmos/cosmos-sdk/types.AccAddress" json:"address,omitempty"` - PubKey []byte `protobuf:"bytes,2,opt,name=pub_key,json=pubKey,proto3" json:"public_key,omitempty" yaml:"public_key"` + PubKey *types.PublicKey `protobuf:"bytes,2,opt,name=pub_key,json=pubKey,proto3" json:"public_key,omitempty" yaml:"public_key"` AccountNumber uint64 `protobuf:"varint,3,opt,name=account_number,json=accountNumber,proto3" json:"account_number,omitempty" yaml:"account_number"` Sequence uint64 `protobuf:"varint,4,opt,name=sequence,proto3" json:"sequence,omitempty"` } @@ -191,48 +192,50 @@ func init() { func init() { proto.RegisterFile("cosmos/auth/auth.proto", fileDescriptor_ec2401f40a84da7e) } var fileDescriptor_ec2401f40a84da7e = []byte{ - // 650 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0x4f, 0x4f, 0xdb, 0x4e, - 0x10, 0x8d, 0x49, 0x7e, 0xfc, 0xd9, 0x00, 0x12, 0x26, 0x80, 0xc9, 0xaf, 0xf2, 0x46, 0x3e, 0x51, - 0xa9, 0x09, 0x82, 0x8a, 0x4a, 0xe4, 0x50, 0x15, 0xd3, 0x56, 0x42, 0x14, 0x84, 0x16, 0xa9, 0xaa, - 0x7a, 0xb1, 0xd6, 0xce, 0x36, 0x58, 0x64, 0xb3, 0xc6, 0xbb, 0xae, 0x62, 0x3e, 0x41, 0x8f, 0x3d, - 0x55, 0x3d, 0xf2, 0x21, 0x7a, 0xeb, 0x17, 0xe8, 0x11, 0xf5, 0xd4, 0x93, 0x5b, 0x85, 0x4b, 0xd5, - 0xa3, 0x8f, 0x3d, 0x55, 0xde, 0x35, 0xc1, 0x41, 0xb4, 0x97, 0x64, 0xe7, 0xcd, 0xbc, 0x37, 0xe3, - 0x37, 0xda, 0x05, 0xcb, 0x1e, 0xe3, 0x94, 0xf1, 0x75, 0x1c, 0x89, 0x13, 0xf9, 0xd3, 0x0a, 0x42, - 0x26, 0x98, 0x5e, 0x55, 0x78, 0x2b, 0x83, 0xea, 0xab, 0x2a, 0x70, 0x64, 0x6a, 0x3d, 0xcf, 0xc8, - 0xa0, 0x5e, 0xeb, 0xb2, 0x2e, 0x53, 0x78, 0x76, 0x52, 0xa8, 0xf5, 0x61, 0x02, 0x54, 0x6d, 0xcc, - 0xc9, 0x8e, 0xe7, 0xb1, 0xa8, 0x2f, 0xf4, 0x7d, 0x30, 0x85, 0x3b, 0x9d, 0x90, 0x70, 0x6e, 0x68, - 0x0d, 0x6d, 0x6d, 0xd6, 0xde, 0xf8, 0x9d, 0xc0, 0x66, 0xd7, 0x17, 0x27, 0x91, 0xdb, 0xf2, 0x18, - 0xcd, 0x35, 0xf3, 0xbf, 0x26, 0xef, 0x9c, 0xae, 0x8b, 0x38, 0x20, 0xbc, 0xb5, 0xe3, 0x79, 0x3b, - 0x8a, 0x88, 0xae, 0x15, 0xf4, 0xe7, 0x60, 0x2a, 0x88, 0x5c, 0xe7, 0x94, 0xc4, 0xc6, 0x84, 0x14, - 0x6b, 0xfe, 0x4a, 0x60, 0x2d, 0x88, 0xdc, 0x9e, 0xef, 0x65, 0xe8, 0x03, 0x46, 0x7d, 0x41, 0x68, - 0x20, 0xe2, 0x34, 0x81, 0x0b, 0x31, 0xa6, 0xbd, 0xb6, 0x75, 0x93, 0xb5, 0xd0, 0x64, 0x10, 0xb9, - 0xfb, 0x24, 0xd6, 0x9f, 0x80, 0x79, 0xac, 0xe6, 0x73, 0xfa, 0x11, 0x75, 0x49, 0x68, 0x94, 0x1b, - 0xda, 0x5a, 0xc5, 0x5e, 0x4d, 0x13, 0xb8, 0xa4, 0x68, 0xe3, 0x79, 0x0b, 0xcd, 0xe5, 0xc0, 0xa1, - 0x8c, 0xf5, 0x3a, 0x98, 0xe6, 0xe4, 0x2c, 0x22, 0x7d, 0x8f, 0x18, 0x95, 0x8c, 0x8b, 0x46, 0x71, - 0xbb, 0xf6, 0xee, 0x02, 0x96, 0x3e, 0x5e, 0xc0, 0xd2, 0xd7, 0x4f, 0xcd, 0xe9, 0xdc, 0x87, 0x3d, - 0xeb, 0xb3, 0x06, 0xe6, 0x0e, 0x58, 0x27, 0xea, 0x8d, 0xac, 0x79, 0x05, 0x66, 0x5d, 0xcc, 0x89, - 0x93, 0x2b, 0x4b, 0x7f, 0xaa, 0x9b, 0x46, 0xab, 0xe0, 0x7f, 0xab, 0x60, 0xa5, 0xfd, 0xff, 0x65, - 0x02, 0xb5, 0x34, 0x81, 0x8b, 0x6a, 0xc2, 0x22, 0xd7, 0x42, 0x55, 0xb7, 0x60, 0xba, 0x0e, 0x2a, - 0x7d, 0x4c, 0x89, 0x34, 0x69, 0x06, 0xc9, 0xb3, 0xde, 0x00, 0xd5, 0x80, 0x84, 0xd4, 0xe7, 0xdc, - 0x67, 0x7d, 0x6e, 0x94, 0x1b, 0xe5, 0xb5, 0x19, 0x54, 0x84, 0xda, 0xf5, 0xc2, 0xdc, 0xf3, 0x63, - 0xa3, 0xee, 0x59, 0xdf, 0xcb, 0x60, 0xf2, 0x08, 0x87, 0x98, 0x72, 0xfd, 0x10, 0x2c, 0x52, 0x3c, - 0x70, 0x28, 0xa1, 0xcc, 0xf1, 0x4e, 0x70, 0x88, 0x3d, 0x41, 0x42, 0xb5, 0xdd, 0x8a, 0x6d, 0xa6, - 0x09, 0xac, 0xab, 0xf9, 0xee, 0x28, 0xb2, 0xd0, 0x02, 0xc5, 0x83, 0x03, 0x42, 0xd9, 0xee, 0x08, - 0xd3, 0xb7, 0xc1, 0xac, 0x18, 0x38, 0xdc, 0xef, 0x3a, 0x3d, 0x9f, 0xfa, 0x42, 0x0e, 0x5d, 0xb1, - 0x57, 0x6e, 0x3e, 0xb4, 0x98, 0xb5, 0x10, 0x10, 0x83, 0x63, 0xbf, 0xfb, 0x22, 0x0b, 0x74, 0x04, - 0x96, 0x64, 0xf2, 0x9c, 0x38, 0x1e, 0xe3, 0xc2, 0x09, 0x48, 0xe8, 0xb8, 0xb1, 0x20, 0xf9, 0x3a, - 0x1b, 0x69, 0x02, 0xef, 0x15, 0x34, 0x6e, 0x97, 0x59, 0x68, 0x21, 0x13, 0x3b, 0x27, 0xbb, 0x8c, - 0x8b, 0x23, 0x12, 0xda, 0xb1, 0x20, 0xfa, 0x19, 0x58, 0xc9, 0xba, 0xbd, 0x25, 0xa1, 0xff, 0x26, - 0x56, 0xf5, 0xa4, 0xb3, 0xb9, 0xb5, 0xb5, 0xb1, 0xad, 0x16, 0x6d, 0xb7, 0x87, 0x09, 0xac, 0x1d, - 0xfb, 0xdd, 0x97, 0xb2, 0x22, 0xa3, 0x3e, 0x7b, 0x2a, 0xf3, 0x69, 0x02, 0x4d, 0xd5, 0xed, 0x2f, - 0x02, 0x16, 0xaa, 0xf1, 0x31, 0x9e, 0x82, 0xf5, 0x18, 0xac, 0xde, 0x66, 0x70, 0xe2, 0x05, 0x9b, - 0x5b, 0x8f, 0x4e, 0x37, 0x8c, 0xff, 0x64, 0xd3, 0xc7, 0xc3, 0x04, 0x2e, 0x8f, 0x35, 0x3d, 0xbe, - 0xae, 0x48, 0x13, 0xd8, 0xb8, 0xbb, 0xed, 0x48, 0xc4, 0x42, 0xcb, 0xfc, 0x4e, 0x6e, 0x7b, 0x3a, - 0xdb, 0xf7, 0xcf, 0x0b, 0xa8, 0xd9, 0xbb, 0x5f, 0x86, 0xa6, 0x76, 0x39, 0x34, 0xb5, 0x1f, 0x43, - 0x53, 0x7b, 0x7f, 0x65, 0x96, 0x2e, 0xaf, 0xcc, 0xd2, 0xb7, 0x2b, 0xb3, 0xf4, 0xfa, 0xfe, 0x3f, - 0x6f, 0xeb, 0x40, 0x3d, 0x20, 0xf2, 0xd2, 0xba, 0x93, 0xf2, 0x11, 0x78, 0xf8, 0x27, 0x00, 0x00, - 0xff, 0xff, 0x10, 0x68, 0x06, 0x78, 0x5c, 0x04, 0x00, 0x00, + // 674 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0x3f, 0x4f, 0xdb, 0x4e, + 0x18, 0x8e, 0x49, 0x7e, 0xfc, 0xb9, 0x00, 0x12, 0x26, 0x80, 0xc9, 0xaf, 0xf2, 0x59, 0x9e, 0x52, + 0xa9, 0x49, 0x04, 0x15, 0x95, 0xc8, 0x50, 0x15, 0xd3, 0x0e, 0x88, 0x82, 0x90, 0x91, 0xaa, 0xaa, + 0x8b, 0x6b, 0x5f, 0xae, 0xc1, 0x22, 0x97, 0x33, 0xbe, 0x73, 0x15, 0xf3, 0x09, 0x3a, 0x76, 0xec, + 0xc8, 0x47, 0xe8, 0xd0, 0xad, 0x5f, 0xa0, 0x23, 0xea, 0xd4, 0xc9, 0xad, 0xc2, 0x52, 0x75, 0xf4, + 0xd8, 0xa9, 0xf2, 0x9d, 0x09, 0x0e, 0xa2, 0x5d, 0x6c, 0xbf, 0xef, 0xf3, 0x3e, 0xcf, 0xfb, 0xf8, + 0x7d, 0x75, 0x07, 0x56, 0x11, 0x65, 0x84, 0xb2, 0xb6, 0x1b, 0xf1, 0x13, 0xf1, 0x68, 0x05, 0x21, + 0xe5, 0x54, 0xad, 0xca, 0x7c, 0x2b, 0x4b, 0xd5, 0xd7, 0x65, 0xe0, 0x08, 0xa8, 0x9d, 0x23, 0x22, + 0xa8, 0xd7, 0x7a, 0xb4, 0x47, 0x65, 0x3e, 0xfb, 0xca, 0xb3, 0xf5, 0x5c, 0x15, 0x85, 0x71, 0x90, + 0x31, 0xc4, 0x4b, 0x62, 0xe6, 0xc7, 0x29, 0x50, 0xb5, 0x5c, 0x86, 0x77, 0x10, 0xa2, 0xd1, 0x80, + 0xab, 0xfb, 0x60, 0xc6, 0xed, 0x76, 0x43, 0xcc, 0x98, 0xa6, 0x18, 0x4a, 0x63, 0xde, 0xda, 0xf8, + 0x9d, 0xc0, 0x66, 0xcf, 0xe7, 0x27, 0x91, 0xd7, 0x42, 0x94, 0xb4, 0xaf, 0xb5, 0xc4, 0xab, 0xc9, + 0xba, 0xa7, 0x6d, 0x1e, 0x07, 0x98, 0xb5, 0x76, 0x10, 0xda, 0x91, 0x44, 0xfb, 0x5a, 0x41, 0x7d, + 0x0d, 0x66, 0x82, 0xc8, 0x73, 0x4e, 0x71, 0xac, 0x4d, 0x19, 0x4a, 0xa3, 0xba, 0xa9, 0xb5, 0x72, + 0xbb, 0xb9, 0x87, 0xa3, 0xc8, 0xeb, 0xfb, 0x68, 0x1f, 0xc7, 0x56, 0xf3, 0x57, 0x02, 0x6b, 0x81, + 0x08, 0xb3, 0xfa, 0x07, 0x94, 0xf8, 0x1c, 0x93, 0x80, 0xc7, 0x69, 0x02, 0x97, 0x62, 0x97, 0xf4, + 0x3b, 0xe6, 0x0d, 0x6a, 0xda, 0xd3, 0x41, 0xe4, 0xed, 0xe3, 0x58, 0x7d, 0x02, 0x16, 0x5d, 0xe9, + 0xdc, 0x19, 0x44, 0xc4, 0xc3, 0xa1, 0x56, 0x36, 0x94, 0x46, 0xc5, 0x5a, 0x4f, 0x13, 0xb8, 0x22, + 0x69, 0x93, 0xb8, 0x69, 0x2f, 0xe4, 0x89, 0x43, 0x11, 0xab, 0x75, 0x30, 0xcb, 0xf0, 0x59, 0x84, + 0x07, 0x08, 0x6b, 0x95, 0x8c, 0x6b, 0x8f, 0xe3, 0x4e, 0xed, 0xdd, 0x05, 0x2c, 0x7d, 0xb8, 0x80, + 0xa5, 0xaf, 0x9f, 0x9a, 0xb3, 0xf9, 0x84, 0xf6, 0xcc, 0xcf, 0x0a, 0x58, 0x38, 0xa0, 0xdd, 0xa8, + 0x3f, 0x1e, 0xda, 0x4b, 0x30, 0xef, 0xb9, 0x0c, 0x3b, 0xb9, 0xb2, 0x98, 0x5c, 0xe1, 0x67, 0xc5, + 0x22, 0x0b, 0x43, 0xb6, 0xfe, 0xbf, 0x4c, 0xa0, 0x92, 0x26, 0x70, 0x59, 0x3a, 0x2c, 0x72, 0x4d, + 0xbb, 0xea, 0x15, 0xd6, 0xa1, 0x82, 0xca, 0xc0, 0x25, 0x58, 0x8c, 0x6f, 0xce, 0x16, 0xdf, 0xaa, + 0x01, 0xaa, 0x01, 0x0e, 0x89, 0xcf, 0x98, 0x4f, 0x07, 0x4c, 0x2b, 0x1b, 0xe5, 0xc6, 0x9c, 0x5d, + 0x4c, 0x75, 0xea, 0x05, 0xdf, 0x8b, 0x13, 0x56, 0xf7, 0xcc, 0xef, 0x65, 0x30, 0x7d, 0xe4, 0x86, + 0x2e, 0x61, 0xea, 0x21, 0x58, 0x26, 0xee, 0xd0, 0x21, 0x98, 0x50, 0x07, 0x9d, 0xb8, 0xa1, 0x8b, + 0x38, 0x0e, 0xe5, 0xde, 0x2b, 0x96, 0x9e, 0x26, 0xb0, 0x2e, 0xfd, 0xdd, 0x51, 0x64, 0xda, 0x4b, + 0xc4, 0x1d, 0x1e, 0x60, 0x42, 0x77, 0xc7, 0x39, 0x75, 0x1b, 0xcc, 0xf3, 0xa1, 0xc3, 0xfc, 0x9e, + 0xd3, 0xf7, 0x89, 0xcf, 0x85, 0xe9, 0x8a, 0xb5, 0x76, 0xf3, 0xa3, 0x45, 0xd4, 0xb4, 0x01, 0x1f, + 0x1e, 0xfb, 0xbd, 0xe7, 0x59, 0xa0, 0xda, 0x60, 0x45, 0x80, 0xe7, 0xd8, 0x41, 0x94, 0x71, 0x27, + 0xc0, 0xa1, 0xe3, 0xc5, 0x1c, 0xe7, 0xeb, 0x34, 0xd2, 0x04, 0xde, 0x2b, 0x68, 0xdc, 0x2e, 0x33, + 0xed, 0xa5, 0x4c, 0xec, 0x1c, 0xef, 0x52, 0xc6, 0x8f, 0x70, 0x68, 0xc5, 0x1c, 0xab, 0x67, 0x60, + 0x2d, 0xeb, 0xf6, 0x16, 0x87, 0xfe, 0x9b, 0x58, 0xd6, 0xe3, 0xee, 0xe6, 0xd6, 0xd6, 0xc6, 0xb6, + 0x5c, 0xb4, 0xd5, 0x19, 0x25, 0xb0, 0x76, 0xec, 0xf7, 0x5e, 0x88, 0x8a, 0x8c, 0xfa, 0xec, 0xa9, + 0xc0, 0xd3, 0x04, 0xea, 0xb2, 0xdb, 0x5f, 0x04, 0x4c, 0xbb, 0xc6, 0x26, 0x78, 0x32, 0xad, 0xc6, + 0x60, 0xfd, 0x36, 0x83, 0x61, 0x14, 0x6c, 0x6e, 0x3d, 0x3a, 0xdd, 0xd0, 0xfe, 0x13, 0x4d, 0x1f, + 0x8f, 0x12, 0xb8, 0x3a, 0xd1, 0xf4, 0xf8, 0xba, 0x22, 0x4d, 0xa0, 0x71, 0x77, 0xdb, 0xb1, 0x88, + 0x69, 0xaf, 0xb2, 0x3b, 0xb9, 0x9d, 0xd9, 0x6c, 0xdf, 0x3f, 0x2f, 0xa0, 0x62, 0xed, 0x7e, 0x19, + 0xe9, 0xca, 0xe5, 0x48, 0x57, 0x7e, 0x8c, 0x74, 0xe5, 0xfd, 0x95, 0x5e, 0xba, 0xbc, 0xd2, 0x4b, + 0xdf, 0xae, 0xf4, 0xd2, 0xab, 0xfb, 0xff, 0x3c, 0xc7, 0x43, 0x79, 0xed, 0x88, 0xe3, 0xec, 0x4d, + 0x8b, 0xeb, 0xe1, 0xe1, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3a, 0x04, 0xd8, 0x73, 0x92, 0x04, + 0x00, 0x00, } func (this *Params) Equal(that interface{}) bool { @@ -301,10 +304,15 @@ func (m *BaseAccount) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x18 } - if len(m.PubKey) > 0 { - i -= len(m.PubKey) - copy(dAtA[i:], m.PubKey) - i = encodeVarintAuth(dAtA, i, uint64(len(m.PubKey))) + if m.PubKey != nil { + { + size, err := m.PubKey.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintAuth(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0x12 } @@ -438,8 +446,8 @@ func (m *BaseAccount) Size() (n int) { if l > 0 { n += 1 + l + sovAuth(uint64(l)) } - l = len(m.PubKey) - if l > 0 { + if m.PubKey != nil { + l = m.PubKey.Size() n += 1 + l + sovAuth(uint64(l)) } if m.AccountNumber != 0 { @@ -571,7 +579,7 @@ func (m *BaseAccount) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field PubKey", wireType) } - var byteLen int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAuth @@ -581,24 +589,26 @@ func (m *BaseAccount) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + if msglen < 0 { return ErrInvalidLengthAuth } - postIndex := iNdEx + byteLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthAuth } if postIndex > l { return io.ErrUnexpectedEOF } - m.PubKey = append(m.PubKey[:0], dAtA[iNdEx:postIndex]...) if m.PubKey == nil { - m.PubKey = []byte{} + m.PubKey = &types.PublicKey{} + } + if err := m.PubKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } iNdEx = postIndex case 3: diff --git a/x/ibc-transfer/types/genesis.pb.go b/x/ibc-transfer/types/genesis.pb.go index d032d4650cdc..cd800d16f8bd 100644 --- a/x/ibc-transfer/types/genesis.pb.go +++ b/x/ibc-transfer/types/genesis.pb.go @@ -5,7 +5,6 @@ package types import ( fmt "fmt" - _ "github.com/cosmos/cosmos-sdk/types" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" @@ -77,21 +76,20 @@ func init() { func init() { proto.RegisterFile("ibc/transfer/genesis.proto", fileDescriptor_c13b8463155e05c2) } var fileDescriptor_c13b8463155e05c2 = []byte{ - // 218 bytes of a gzipped FileDescriptorProto + // 204 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xca, 0x4c, 0x4a, 0xd6, 0x2f, 0x29, 0x4a, 0xcc, 0x2b, 0x4e, 0x4b, 0x2d, 0xd2, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0xc9, 0x4c, 0x4a, 0xd6, 0x83, 0xc9, 0x49, 0x89, - 0xa4, 0xe7, 0xa7, 0xe7, 0x83, 0x25, 0xf4, 0x41, 0x2c, 0x88, 0x1a, 0x29, 0xe1, 0xe4, 0xfc, 0xe2, - 0xdc, 0xfc, 0x62, 0x7d, 0x08, 0x05, 0x15, 0x94, 0x46, 0x31, 0x14, 0xc6, 0x80, 0x48, 0x2a, 0xb9, - 0x72, 0xf1, 0xb8, 0x43, 0xac, 0x09, 0x2e, 0x49, 0x2c, 0x49, 0x15, 0x32, 0xe5, 0x62, 0x2f, 0xc8, - 0x2f, 0x2a, 0x89, 0xcf, 0x4c, 0x91, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x74, 0x92, 0x79, 0x74, 0x4f, - 0x9e, 0x2d, 0x20, 0xbf, 0xa8, 0xc4, 0xd3, 0xe5, 0xd3, 0x3d, 0x79, 0xbe, 0xca, 0xc4, 0xdc, 0x1c, - 0x2b, 0x25, 0xa8, 0x12, 0xa5, 0x20, 0x36, 0x10, 0xcb, 0x33, 0xc5, 0xc9, 0xfb, 0xc4, 0x23, 0x39, - 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, - 0x39, 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0x0c, 0xd3, 0x33, 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, - 0xf3, 0x73, 0xf5, 0x51, 0x5c, 0xa7, 0x5b, 0x9c, 0x92, 0xad, 0x5f, 0xa1, 0x9f, 0x99, 0x94, 0xac, - 0x8b, 0x70, 0x5c, 0x65, 0x41, 0x6a, 0x71, 0x12, 0x1b, 0xd8, 0x69, 0xc6, 0x80, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x7a, 0xfc, 0xa4, 0xfa, 0x0e, 0x01, 0x00, 0x00, + 0xa4, 0xe7, 0xa7, 0xe7, 0x83, 0x25, 0xf4, 0x41, 0x2c, 0x88, 0x1a, 0x25, 0x57, 0x2e, 0x1e, 0x77, + 0x88, 0xa6, 0xe0, 0x92, 0xc4, 0x92, 0x54, 0x21, 0x53, 0x2e, 0xf6, 0x82, 0xfc, 0xa2, 0x92, 0xf8, + 0xcc, 0x14, 0x09, 0x46, 0x05, 0x46, 0x0d, 0x4e, 0x27, 0x99, 0x47, 0xf7, 0xe4, 0xd9, 0x02, 0xf2, + 0x8b, 0x4a, 0x3c, 0x5d, 0x3e, 0xdd, 0x93, 0xe7, 0xab, 0x4c, 0xcc, 0xcd, 0xb1, 0x52, 0x82, 0x2a, + 0x51, 0x0a, 0x62, 0x03, 0xb1, 0x3c, 0x53, 0x9c, 0xbc, 0x4f, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, + 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, + 0x58, 0x8e, 0x21, 0xca, 0x30, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x3f, + 0x39, 0xbf, 0x38, 0x37, 0xbf, 0x18, 0x4a, 0xe9, 0x16, 0xa7, 0x64, 0xeb, 0x57, 0xe8, 0x67, 0x26, + 0x25, 0xeb, 0xc2, 0xdd, 0x5f, 0x52, 0x59, 0x90, 0x5a, 0x9c, 0xc4, 0x06, 0x76, 0x9a, 0x31, 0x20, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x43, 0x78, 0xc7, 0xdc, 0x00, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 1d60e583f304..93226ea42ae4 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -7,12 +7,6 @@ import ( bytes "bytes" compress_gzip "compress/gzip" fmt "fmt" - io "io" - io_ioutil "io/ioutil" - math "math" - math_bits "math/bits" - time "time" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" _ "github.com/gogo/protobuf/gogoproto" @@ -23,6 +17,11 @@ import ( _ "github.com/golang/protobuf/ptypes/duration" _ "github.com/golang/protobuf/ptypes/timestamp" types1 "github.com/tendermint/tendermint/abci/types" + io "io" + io_ioutil "io/ioutil" + math "math" + math_bits "math/bits" + time "time" ) // Reference imports to suppress errors if they are not otherwise used. From 8a086a16c1240187b03be2fa0a064b7d34c4abbd Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Wed, 29 Jul 2020 18:34:21 -0400 Subject: [PATCH 002/128] WIP on BaseAccount.PubKey --- x/auth/types/account.go | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/x/auth/types/account.go b/x/auth/types/account.go index 98cd96b4449f..5150332572cf 100644 --- a/x/auth/types/account.go +++ b/x/auth/types/account.go @@ -1,12 +1,13 @@ package types import ( - "bytes" "encoding/json" "errors" "fmt" "strings" + "github.com/cosmos/cosmos-sdk/crypto/types" + "github.com/tendermint/tendermint/crypto" yaml "gopkg.in/yaml.v2" @@ -21,15 +22,14 @@ var ( ) // NewBaseAccount creates a new BaseAccount object -func NewBaseAccount(address sdk.AccAddress, pubKey crypto.PubKey, accountNumber, sequence uint64) *BaseAccount { +func NewBaseAccount(address sdk.AccAddress, pubKey *types.PublicKey, accountNumber, sequence uint64) *BaseAccount { acc := &BaseAccount{ Address: address, AccountNumber: accountNumber, Sequence: sequence, + PubKey: pubKey, } - acc.SetPubKey(pubKey) - return acc } @@ -61,11 +61,14 @@ func (acc *BaseAccount) SetAddress(addr sdk.AccAddress) error { } // GetPubKey - Implements sdk.AccountI. -func (acc BaseAccount) GetPubKey() (pk crypto.PubKey) { +func (acc BaseAccount) GetPubKey() (pk *types.PublicKey) { + return acc.PubKey } // SetPubKey - Implements sdk.AccountI. -func (acc *BaseAccount) SetPubKey(pubKey crypto.PubKey) error { +func (acc *BaseAccount) SetPubKey(pubKey *types.PublicKey) error { + acc.PubKey = pubKey + return nil } // GetAccountNumber - Implements AccountI @@ -92,11 +95,6 @@ func (acc *BaseAccount) SetSequence(seq uint64) error { // Validate checks for errors on the account fields func (acc BaseAccount) Validate() error { - if len(acc.PubKey) != 0 && acc.Address != nil && - !bytes.Equal(acc.GetPubKey().Address().Bytes(), acc.Address.Bytes()) { - return errors.New("account address and pubkey address do not match") - } - return nil } @@ -192,7 +190,7 @@ func (ma ModuleAccount) GetPermissions() []string { } // SetPubKey - Implements AccountI -func (ma ModuleAccount) SetPubKey(pubKey crypto.PubKey) error { +func (ma ModuleAccount) SetPubKey(pubKey *types.PublicKey) error { return fmt.Errorf("not supported for module accounts") } @@ -282,8 +280,8 @@ type AccountI interface { GetAddress() sdk.AccAddress SetAddress(sdk.AccAddress) error // errors if already set. - GetPubKey() crypto.PubKey // can return nil. - SetPubKey(crypto.PubKey) error + GetPubKey() *types.PublicKey // can return nil. + SetPubKey(*types.PublicKey) error GetAccountNumber() uint64 SetAccountNumber(uint64) error From 671edfb736503ebf7e9b05b6038a351f1a7809c5 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Tue, 4 Aug 2020 10:56:32 -0400 Subject: [PATCH 003/128] WIP on BaseAccount pub key --- client/context.go | 18 +-- codec/json.go | 8 +- codec/yaml.go | 29 +++++ codec/yaml_test.go | 49 ++++++++ proto/cosmos/auth/auth.proto | 4 + testutil/testdata/proto.pb.go | 205 +++++++++++++++++----------------- x/auth/types/account.go | 53 ++++----- x/auth/types/auth.pb.go | 106 ++++++++---------- 8 files changed, 271 insertions(+), 201 deletions(-) create mode 100644 codec/yaml.go create mode 100644 codec/yaml_test.go diff --git a/client/context.go b/client/context.go index 5580853e3027..8aa017e7eebb 100644 --- a/client/context.go +++ b/client/context.go @@ -1,14 +1,12 @@ package client import ( - "encoding/json" "io" "os" "github.com/pkg/errors" rpcclient "github.com/tendermint/tendermint/rpc/client" rpchttp "github.com/tendermint/tendermint/rpc/client/http" - yaml "gopkg.in/yaml.v2" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" @@ -199,22 +197,16 @@ func (ctx Context) WithInterfaceRegistry(interfaceRegistry codectypes.InterfaceR // either text or json. If text, toPrint will be YAML encoded. Otherwise, toPrint // will be JSON encoded using ctx.JSONMarshaler. An error is returned upon failure. func (ctx Context) PrintOutput(toPrint interface{}) error { - // always serialize JSON initially because proto json can't be directly YAML encoded - out, err := ctx.JSONMarshaler.MarshalJSON(toPrint) - if err != nil { - return err - } + var out []byte + var err error if ctx.OutputFormat == "text" { - // handle text format by decoding and re-encoding JSON as YAML - var j interface{} - - err = json.Unmarshal(out, &j) + out, err = codec.MarshalYAML(ctx.JSONMarshaler, toPrint) if err != nil { return err } - - out, err = yaml.Marshal(j) + } else { + out, err = ctx.JSONMarshaler.MarshalJSON(toPrint) if err != nil { return err } diff --git a/codec/json.go b/codec/json.go index cab6993cae5d..40e9d7a523ce 100644 --- a/codec/json.go +++ b/codec/json.go @@ -12,7 +12,13 @@ import ( // ProtoMarshalJSON provides an auxiliary function to return Proto3 JSON encoded // bytes of a message. func ProtoMarshalJSON(msg proto.Message) ([]byte, error) { - jm := &jsonpb.Marshaler{OrigName: true} + jm := &jsonpb.Marshaler{ + EnumsAsInts: false, + EmitDefaults: true, // emit defaults by default - this should not be used for sign bytes + Indent: "", + OrigName: true, // don't camel case names + AnyResolver: nil, + } err := types.UnpackInterfaces(msg, types.ProtoJSONPacker{JSONPBMarshaler: jm}) if err != nil { return nil, err diff --git a/codec/yaml.go b/codec/yaml.go new file mode 100644 index 000000000000..9ddec8d3080f --- /dev/null +++ b/codec/yaml.go @@ -0,0 +1,29 @@ +package codec + +import ( + "encoding/json" + + "gopkg.in/yaml.v2" +) + +func MarshalYAML(jsonMarshaler JSONMarshaler, toPrint interface{}) ([]byte, error) { + bz, err := jsonMarshaler.MarshalJSON(toPrint) + if err != nil { + return nil, err + } + + // generate YAML by decoding and re-encoding JSON as YAML + var j interface{} + + err = json.Unmarshal(bz, &j) + if err != nil { + return nil, err + } + + bz, err = yaml.Marshal(j) + if err != nil { + return nil, err + } + + return bz, nil +} diff --git a/codec/yaml_test.go b/codec/yaml_test.go new file mode 100644 index 000000000000..fc9488997cb1 --- /dev/null +++ b/codec/yaml_test.go @@ -0,0 +1,49 @@ +package codec_test + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/codec" + + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/testutil/testdata" +) + +func TestMarshalYAML(t *testing.T) { + dog := &testdata.Dog{ + Size_: "small", + Name: "Spot", + } + any, err := types.NewAnyWithValue(dog) + require.NoError(t, err) + hasAnimal := &testdata.HasAnimal{ + Animal: any, + X: 0, + } + + // proto + protoCdc := codec.NewProtoCodec(NewTestInterfaceRegistry()) + bz, err := codec.MarshalYAML(protoCdc, hasAnimal) + require.NoError(t, err) + require.Equal(t, `animal: + '@type': /testdata.Dog + name: Spot + size: small +x: "0" +`, string(bz)) + + // amino + aminoCdc := &codec.Codec{testdata.NewTestAmino()} + bz, err = codec.MarshalYAML(aminoCdc, hasAnimal) + require.NoError(t, err) + require.Equal(t, `type: testdata/HasAnimal +value: + animal: + type: testdata/Dog + value: + name: Spot + size: small +`, string(bz)) +} diff --git a/proto/cosmos/auth/auth.proto b/proto/cosmos/auth/auth.proto index e23a20fe33ae..6318cc008602 100644 --- a/proto/cosmos/auth/auth.proto +++ b/proto/cosmos/auth/auth.proto @@ -13,6 +13,10 @@ option go_package = "github.com/cosmos/cosmos-sdk/x/auth/types"; message BaseAccount { option (gogoproto.goproto_getters) = false; option (gogoproto.goproto_stringer) = false; + // NOTE: this disables the generation of the BaseAccount struct and uses a hand-written struct + // so that we can deal with PublicKey encoding. This should likely be replaced with something + // less hacky in the future. + option (gogoproto.typedecl) = false; option (cosmos_proto.implements_interface) = "AccountI"; bytes address = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress"]; diff --git a/testutil/testdata/proto.pb.go b/testutil/testdata/proto.pb.go index 5c69d0bd7d4c..0edda11fcf47 100644 --- a/testutil/testdata/proto.pb.go +++ b/testutil/testdata/proto.pb.go @@ -1608,7 +1608,7 @@ type TestVersion2 struct { // *TestVersion2_F Sum isTestVersion2_Sum `protobuf_oneof:"sum"` G *types.Any `protobuf:"bytes,8,opt,name=g,proto3" json:"g,omitempty"` - H []*TestVersion2 `protobuf:"bytes,9,rep,name=h,proto3" json:"h,omitempty"` + H []*TestVersion1 `protobuf:"bytes,9,rep,name=h,proto3" json:"h,omitempty"` // google.protobuf.Timestamp i = 10; // google.protobuf.Timestamp j = 11; // [(gogoproto.stdtime) = true]; *Customer1 `protobuf:"bytes,12,opt,name=k,proto3,embedded=k" json:"k,omitempty"` @@ -1727,7 +1727,7 @@ func (m *TestVersion2) GetG() *types.Any { return nil } -func (m *TestVersion2) GetH() []*TestVersion2 { +func (m *TestVersion2) GetH() []*TestVersion1 { if m != nil { return m.H } @@ -3150,112 +3150,111 @@ func init() { func init() { proto.RegisterFile("proto.proto", fileDescriptor_2fcc84b9998d60d8) } var fileDescriptor_2fcc84b9998d60d8 = []byte{ - // 1669 bytes of a gzipped FileDescriptorProto + // 1664 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0xcf, 0x6f, 0x23, 0x49, 0x15, 0x4e, 0xb9, 0xed, 0xc4, 0x7e, 0x31, 0x8e, 0x29, 0xc2, 0xd2, 0xe3, 0x65, 0x33, 0xa1, 0x35, 0xec, 0x98, 0xd5, 0x8e, 0x43, 0xda, 0x5e, 0x09, 0xcd, 0x01, 0xad, 0x9d, 0x49, 0x36, 0x23, 0x66, 0xb2, 0xa8, 0x67, 0x35, 0xa0, 0xbd, 0x44, 0xe5, 0xee, 0x72, 0xbb, 0x94, 0x76, 0x55, 0xe8, 0x6a, 0xcf, 0x8c, 0x39, 0xc2, 0x81, 0x2b, 0x17, 0xc4, 0x99, 0x23, 0x27, 0xb4, 0x7f, 0x05, 0x7b, 0x41, 0x9a, 0x0b, 0x12, 0x12, 0xd2, 0x08, 0xcd, 0x5c, 0xf9, 0x0b, 0x40, 0x08, 0x54, 0xdd, 0xd5, 0x3f, - 0x92, 0xb1, 0xb3, 0x4e, 0x76, 0xd9, 0x55, 0xa4, 0xbd, 0xd8, 0x55, 0xaf, 0xbf, 0xfa, 0xea, 0xd5, - 0xf7, 0xea, 0xbd, 0xae, 0x2e, 0x58, 0x3f, 0x0d, 0x45, 0x24, 0x3a, 0xf1, 0x2f, 0xae, 0x46, 0x54, - 0x46, 0x1e, 0x89, 0x48, 0x6b, 0xd3, 0x17, 0xbe, 0x88, 0x8d, 0x3b, 0xaa, 0x95, 0x3c, 0x6f, 0xdd, - 0xf0, 0x85, 0xf0, 0x03, 0xba, 0x13, 0xf7, 0x86, 0xd3, 0xd1, 0x0e, 0xe1, 0xb3, 0xe4, 0x91, 0x75, - 0x07, 0x8c, 0x7b, 0xc2, 0xc7, 0x18, 0xca, 0x92, 0xfd, 0x92, 0x9a, 0x68, 0x1b, 0xb5, 0x6b, 0x4e, - 0xdc, 0x56, 0x36, 0x4e, 0x26, 0xd4, 0x2c, 0x25, 0x36, 0xd5, 0xb6, 0xde, 0x03, 0x63, 0x8f, 0x44, - 0xd8, 0x84, 0xb5, 0x89, 0xe0, 0xec, 0x84, 0x86, 0x7a, 0x44, 0xda, 0xc5, 0x9b, 0x50, 0x09, 0xd8, - 0x13, 0x2a, 0xe3, 0x51, 0x15, 0x27, 0xe9, 0x58, 0x1f, 0x40, 0xed, 0x90, 0xc8, 0x3e, 0x67, 0x13, - 0x12, 0xe0, 0x77, 0x61, 0x95, 0xc4, 0xad, 0x78, 0xec, 0xba, 0xbd, 0xd9, 0x49, 0xdc, 0xeb, 0xa4, - 0xee, 0x75, 0xfa, 0x7c, 0xe6, 0x68, 0x0c, 0xae, 0x03, 0x7a, 0x16, 0x93, 0x19, 0x0e, 0x7a, 0x66, - 0xed, 0x41, 0xfd, 0x90, 0xc8, 0x9c, 0xab, 0x0b, 0x30, 0x26, 0xf2, 0x78, 0x09, 0xbe, 0xda, 0x38, - 0x1d, 0x64, 0x3d, 0x84, 0x8d, 0x84, 0x24, 0xe7, 0xb9, 0x0b, 0x0d, 0xc5, 0xb3, 0x24, 0x57, 0x7d, - 0x5c, 0x18, 0x6b, 0xdd, 0x86, 0xf5, 0x7d, 0x77, 0x2c, 0x1c, 0xfa, 0x8b, 0x29, 0x95, 0x89, 0x36, - 0x54, 0x4a, 0xe2, 0xd3, 0x4c, 0x9b, 0xa4, 0x6b, 0xb5, 0xa1, 0x9e, 0x00, 0xe5, 0xa9, 0xe0, 0x92, - 0x5e, 0x80, 0xfc, 0x3e, 0x6c, 0x3c, 0x22, 0xb3, 0x43, 0x1a, 0x04, 0x19, 0x6d, 0x1a, 0x0d, 0x54, - 0x88, 0x46, 0x07, 0x9a, 0x39, 0x4c, 0x93, 0xb6, 0xa0, 0xea, 0x87, 0x94, 0x46, 0x8c, 0xfb, 0x1a, - 0x9b, 0xf5, 0xad, 0x7d, 0x68, 0x7c, 0x44, 0x65, 0xa4, 0x96, 0xa0, 0x59, 0xbb, 0x00, 0x84, 0xcf, - 0x96, 0xd2, 0x8f, 0xf0, 0x99, 0x5e, 0xf0, 0x3e, 0x6c, 0x64, 0x34, 0x7a, 0x56, 0x7b, 0x4e, 0x1c, - 0xbe, 0xd5, 0x49, 0xb7, 0x65, 0x27, 0x13, 0xab, 0x18, 0x86, 0xc7, 0xb0, 0xa6, 0x68, 0x1e, 0x4a, - 0x1f, 0xff, 0x04, 0xd6, 0x24, 0xf3, 0x39, 0x0d, 0xa5, 0x89, 0xb6, 0x8d, 0x76, 0x7d, 0xb0, 0xfb, - 0xaf, 0x17, 0x37, 0xef, 0xf8, 0x2c, 0x1a, 0x4f, 0x87, 0x1d, 0x57, 0x4c, 0x76, 0x5c, 0x21, 0x27, - 0x42, 0xea, 0xbf, 0x3b, 0xd2, 0x3b, 0xd9, 0x89, 0x66, 0xa7, 0x54, 0x76, 0xfa, 0xae, 0xdb, 0xf7, - 0xbc, 0x90, 0x4a, 0xe9, 0xa4, 0x0c, 0xd6, 0x10, 0xbe, 0x39, 0x20, 0xde, 0xc3, 0x69, 0x10, 0xb1, - 0x47, 0xcc, 0xe7, 0x24, 0x9a, 0x86, 0x14, 0x6f, 0x01, 0xc8, 0xb4, 0xa3, 0x27, 0x71, 0x0a, 0x16, - 0x7c, 0x1b, 0x36, 0x26, 0x24, 0x60, 0x2e, 0x13, 0x53, 0x79, 0x3c, 0x62, 0x34, 0xf0, 0xcc, 0xca, - 0x36, 0x6a, 0xd7, 0x9d, 0x46, 0x66, 0x3e, 0x50, 0xd6, 0xbb, 0xe5, 0xe7, 0x7f, 0xb8, 0x89, 0xac, - 0x08, 0x6a, 0x7b, 0x53, 0x19, 0x89, 0x09, 0x0d, 0x77, 0x71, 0x03, 0x4a, 0xcc, 0x8b, 0x17, 0x5d, - 0x71, 0x4a, 0xcc, 0x9b, 0x97, 0x38, 0xf8, 0x07, 0xd0, 0x94, 0xd3, 0xa1, 0x74, 0x43, 0x76, 0x1a, - 0x31, 0xc1, 0x8f, 0x47, 0x94, 0x9a, 0xc6, 0x36, 0x6a, 0x97, 0x9c, 0x8d, 0xa2, 0xfd, 0x80, 0xc6, - 0xdb, 0xe2, 0x94, 0xcc, 0x26, 0x94, 0x47, 0xe6, 0x5a, 0xb2, 0x2d, 0x74, 0xd7, 0xfa, 0xa4, 0x94, - 0x4f, 0x6b, 0xbf, 0x36, 0x6d, 0x0b, 0xaa, 0x8c, 0x7b, 0x53, 0x19, 0x85, 0x33, 0x9d, 0x7d, 0x59, - 0x3f, 0x73, 0xc9, 0x28, 0xb8, 0xb4, 0x09, 0x95, 0x11, 0x7d, 0x4a, 0x43, 0xb3, 0x1c, 0xfb, 0x91, - 0x74, 0xf0, 0x9b, 0x50, 0x0d, 0xa9, 0xa4, 0xe1, 0x13, 0xea, 0x99, 0xbf, 0xaf, 0xc6, 0x79, 0x97, - 0x19, 0xf0, 0xbb, 0x50, 0x76, 0x59, 0x34, 0x33, 0x57, 0xb7, 0x51, 0xbb, 0x61, 0x9b, 0x79, 0x80, - 0x33, 0xaf, 0x3a, 0x7b, 0x2c, 0x9a, 0x39, 0x31, 0x0a, 0xdf, 0x85, 0x6f, 0x4c, 0x98, 0x74, 0x69, - 0x10, 0x10, 0x4e, 0xc5, 0x54, 0x9a, 0x70, 0xc1, 0xfe, 0x3a, 0x0b, 0xb5, 0x3e, 0x80, 0xb2, 0x62, - 0xc2, 0x55, 0x28, 0x3f, 0x20, 0x42, 0x36, 0x57, 0x70, 0x03, 0xe0, 0x81, 0x90, 0x7d, 0xee, 0xd3, - 0x80, 0xca, 0x26, 0xc2, 0x75, 0xa8, 0xfe, 0x94, 0x04, 0xa2, 0x1f, 0x44, 0xa2, 0x59, 0xc2, 0x00, - 0xab, 0x0f, 0x85, 0x74, 0xc5, 0xd3, 0xa6, 0x81, 0xd7, 0x61, 0xed, 0x88, 0xb0, 0x50, 0x0c, 0x59, - 0xb3, 0x6c, 0x75, 0xa0, 0x7a, 0x44, 0x65, 0x44, 0xbd, 0x5e, 0x7f, 0x99, 0x40, 0x59, 0x7f, 0x45, - 0xe9, 0x80, 0xee, 0x52, 0x03, 0xb0, 0x05, 0x25, 0xd2, 0x33, 0xcb, 0xdb, 0x46, 0x7b, 0xdd, 0xc6, - 0xb9, 0x22, 0xe9, 0xa4, 0x4e, 0x89, 0xf4, 0x70, 0x17, 0x2a, 0x8c, 0x7b, 0xf4, 0x99, 0x59, 0x89, - 0x61, 0x6f, 0x9d, 0x87, 0x75, 0xfb, 0x9d, 0xfb, 0xea, 0xf9, 0x3e, 0x8f, 0xc2, 0x99, 0x93, 0x60, - 0x5b, 0x0f, 0x00, 0x72, 0x23, 0x6e, 0x82, 0x71, 0x42, 0x67, 0xb1, 0x2f, 0x86, 0xa3, 0x9a, 0xb8, - 0x0d, 0x95, 0x27, 0x24, 0x98, 0x26, 0xde, 0xcc, 0x9f, 0x3b, 0x01, 0xdc, 0x2d, 0xfd, 0x08, 0x59, - 0x1f, 0xa7, 0xcb, 0xb2, 0x97, 0x5b, 0xd6, 0x3b, 0xb0, 0xca, 0x63, 0x7c, 0xbc, 0x67, 0xe6, 0xd0, - 0x77, 0xfb, 0x8e, 0x46, 0x58, 0x07, 0x29, 0xf7, 0xee, 0xeb, 0xdc, 0x39, 0xcf, 0x02, 0x37, 0xed, - 0x9c, 0xe7, 0xfd, 0x2c, 0x56, 0x83, 0xd7, 0x78, 0x9a, 0x60, 0xa8, 0x42, 0x99, 0x6c, 0x6c, 0xd5, - 0x9c, 0xb7, 0xa7, 0x2d, 0x2f, 0x0b, 0xde, 0x15, 0x19, 0x54, 0x38, 0x87, 0x8b, 0xc3, 0x39, 0x70, - 0x4a, 0xc3, 0x9e, 0xc5, 0x33, 0x2d, 0xe7, 0xce, 0xa2, 0x72, 0x5b, 0xcd, 0x82, 0x1c, 0xd5, 0x5c, - 0x42, 0xc9, 0x41, 0xaa, 0x80, 0xca, 0xc9, 0x50, 0x4c, 0x23, 0x1a, 0xe7, 0x64, 0xcd, 0x49, 0x3a, - 0xd6, 0xcf, 0x33, 0x7d, 0x07, 0x57, 0xd0, 0x37, 0x67, 0xd7, 0x0a, 0x18, 0x99, 0x02, 0xd6, 0xaf, - 0x0a, 0x15, 0xa5, 0xbb, 0xd4, 0xbe, 0x68, 0x40, 0x49, 0x8e, 0x74, 0xe9, 0x2a, 0xc9, 0x11, 0xfe, - 0x2e, 0xd4, 0xe4, 0x34, 0x74, 0xc7, 0x24, 0xf4, 0xa9, 0xae, 0x24, 0xb9, 0x01, 0x6f, 0xc3, 0xba, - 0x47, 0x65, 0xc4, 0x38, 0x51, 0xd5, 0x2d, 0x2e, 0xa9, 0x35, 0xa7, 0x68, 0xc2, 0x6f, 0x43, 0xc3, - 0x0d, 0xa9, 0xc7, 0xa2, 0x63, 0x97, 0x84, 0xde, 0x31, 0x17, 0x49, 0xd1, 0x3b, 0x5c, 0x71, 0xea, - 0x89, 0x7d, 0x8f, 0x84, 0xde, 0x91, 0xc0, 0x6f, 0x41, 0xcd, 0x1d, 0xab, 0xb7, 0x96, 0x82, 0x54, - 0x35, 0xa4, 0x9a, 0x98, 0x8e, 0x04, 0xde, 0x81, 0xaa, 0x08, 0x99, 0xcf, 0x38, 0x09, 0xcc, 0xda, - 0xf9, 0xd7, 0x4f, 0x56, 0xaa, 0x9d, 0x0c, 0x34, 0xa8, 0x65, 0x55, 0xd6, 0xfa, 0x67, 0x09, 0xea, - 0xea, 0x4d, 0xf4, 0x98, 0x86, 0x92, 0x09, 0xbe, 0x9b, 0x9c, 0x39, 0x90, 0x3e, 0x73, 0xe0, 0x5b, - 0x80, 0x88, 0x16, 0xf7, 0x8d, 0x9c, 0xb3, 0x38, 0xc0, 0x41, 0x44, 0xa1, 0x86, 0x3a, 0xc0, 0x0b, - 0x51, 0x43, 0x85, 0x72, 0xf5, 0xe6, 0x5a, 0x88, 0x72, 0xf1, 0x3b, 0x80, 0x3c, 0x5d, 0x2a, 0x16, - 0xa0, 0x06, 0xe5, 0x4f, 0x5f, 0xdc, 0x5c, 0x71, 0x90, 0x87, 0x1b, 0x80, 0x68, 0x5c, 0x8f, 0x2b, - 0x87, 0x2b, 0x0e, 0xa2, 0xf8, 0x6d, 0x40, 0xa3, 0x58, 0xc2, 0x85, 0x63, 0x15, 0x6e, 0x84, 0x2d, - 0x40, 0x7e, 0xac, 0xe3, 0xa2, 0x82, 0x8c, 0x7c, 0xe5, 0xed, 0xd8, 0xac, 0x5d, 0xec, 0xed, 0x18, - 0xdf, 0x06, 0x74, 0x62, 0xd6, 0x17, 0x6a, 0x3e, 0x28, 0x3f, 0x7f, 0x71, 0x13, 0x39, 0xe8, 0x64, - 0x50, 0x01, 0x43, 0x4e, 0x27, 0xd6, 0xaf, 0x8d, 0x33, 0x72, 0xdb, 0x97, 0x95, 0xdb, 0x5e, 0x4a, - 0x6e, 0x7b, 0x29, 0xb9, 0x6d, 0x25, 0xf7, 0xad, 0xcf, 0x92, 0xdb, 0xbe, 0x92, 0xd0, 0xf6, 0x17, - 0x28, 0xb4, 0x7d, 0x19, 0xa1, 0xf1, 0x9b, 0x50, 0xe3, 0xf4, 0xa9, 0x3e, 0xc6, 0xdc, 0xd8, 0x46, - 0xed, 0xb2, 0x53, 0xe5, 0xf4, 0x69, 0x7c, 0x80, 0x49, 0xa3, 0xf0, 0xbb, 0xb3, 0x51, 0xe8, 0x5e, - 0x36, 0x0a, 0xdd, 0xa5, 0xa2, 0xd0, 0x5d, 0x2a, 0x0a, 0xdd, 0xa5, 0xa2, 0xd0, 0xbd, 0x52, 0x14, - 0xba, 0x5f, 0xd5, 0x76, 0xc7, 0x77, 0x00, 0x73, 0xc1, 0x8f, 0xdd, 0x90, 0x45, 0xcc, 0x25, 0x81, - 0x0e, 0xc7, 0x6f, 0xe2, 0xda, 0xe5, 0x34, 0xb9, 0xe0, 0x7b, 0xfa, 0xc9, 0x99, 0xb8, 0xfc, 0xbb, - 0x04, 0xad, 0xa2, 0xfb, 0x0f, 0x04, 0xa7, 0x1f, 0x72, 0xfa, 0xe1, 0xe8, 0xb1, 0x7a, 0x95, 0x5f, - 0xd3, 0x28, 0x5d, 0x1b, 0xf5, 0xff, 0xb3, 0x0a, 0xdf, 0x39, 0xaf, 0xfe, 0x51, 0xfc, 0xb6, 0xf2, - 0xaf, 0x89, 0xf4, 0xbb, 0x79, 0x42, 0x7c, 0x6f, 0x3e, 0xaa, 0xb0, 0xa6, 0x6b, 0x92, 0x1b, 0xf8, - 0x7d, 0x58, 0x65, 0x9c, 0xd3, 0x70, 0xd7, 0x6c, 0xc4, 0xe4, 0xed, 0xcf, 0x5c, 0x59, 0xe7, 0x7e, - 0x8c, 0x77, 0xf4, 0xb8, 0x8c, 0xc1, 0x36, 0x37, 0x2e, 0xc5, 0x60, 0x6b, 0x06, 0xbb, 0xf5, 0x47, - 0x04, 0xab, 0x09, 0x69, 0xe1, 0x9c, 0x64, 0x2c, 0x3c, 0x27, 0xdd, 0x57, 0x47, 0x7e, 0x4e, 0x43, - 0x1d, 0xfd, 0xee, 0xb2, 0x1e, 0x27, 0x7f, 0xf1, 0x8f, 0x93, 0x30, 0xb4, 0x7e, 0xa8, 0x3e, 0x04, - 0x52, 0x63, 0x61, 0xf2, 0x5a, 0x3a, 0x79, 0xfc, 0x4d, 0xa6, 0x27, 0x57, 0xed, 0xd6, 0x9f, 0x52, - 0x5f, 0xed, 0xd7, 0xe0, 0x26, 0xac, 0xb9, 0x62, 0xca, 0xd3, 0x8f, 0xc4, 0x9a, 0x93, 0x76, 0xaf, - 0xea, 0xb1, 0xfd, 0x45, 0x78, 0x9c, 0xe6, 0xdf, 0x7f, 0xcf, 0xe6, 0x5f, 0xef, 0xeb, 0xfc, 0xbb, - 0x46, 0xf9, 0xd7, 0xfb, 0xdc, 0xf9, 0xd7, 0xfb, 0x92, 0xf3, 0xaf, 0xf7, 0xb9, 0xf2, 0xcf, 0x58, - 0x98, 0x7f, 0x9f, 0xfc, 0xdf, 0xf2, 0xaf, 0xb7, 0x54, 0xfe, 0xd9, 0x17, 0xe6, 0xdf, 0x66, 0xf1, - 0xe2, 0xc0, 0xd0, 0x97, 0x04, 0x69, 0x06, 0xfe, 0x05, 0x25, 0x97, 0x84, 0x7a, 0xbe, 0x83, 0x7b, - 0x57, 0xfb, 0x1c, 0xfa, 0xca, 0x3f, 0x4b, 0xd2, 0xf5, 0xfc, 0x1d, 0x9d, 0x39, 0x4f, 0x1d, 0xdc, - 0xdb, 0xfd, 0x19, 0x8b, 0xc6, 0xfb, 0xcf, 0xa2, 0x90, 0xf4, 0xf9, 0xec, 0x4b, 0x5d, 0xdb, 0xad, - 0x7c, 0x6d, 0x05, 0x5c, 0x9f, 0xcf, 0x32, 0x8f, 0x2e, 0xbd, 0xba, 0x8f, 0xa0, 0x5e, 0x1c, 0x8f, - 0xdb, 0x6a, 0x01, 0x17, 0x5c, 0xe3, 0xa6, 0x15, 0x80, 0xa8, 0x85, 0x27, 0x95, 0xd1, 0x50, 0x15, - 0xb0, 0x9e, 0x54, 0xc0, 0xb8, 0xe7, 0xda, 0x7f, 0x46, 0xb0, 0xae, 0x26, 0x7c, 0x44, 0xc3, 0x27, - 0xcc, 0xa5, 0xf8, 0x3d, 0x28, 0xef, 0xbb, 0x63, 0x81, 0xbf, 0x9d, 0xfb, 0x53, 0xb8, 0xf1, 0x6e, - 0xbd, 0x71, 0xde, 0xac, 0x2f, 0x85, 0xfb, 0x50, 0x4d, 0xaf, 0xa7, 0xf1, 0x8d, 0x1c, 0x73, 0xee, - 0x66, 0xbb, 0xd5, 0x9a, 0xf7, 0x48, 0x53, 0xfc, 0x38, 0xb9, 0x23, 0x56, 0x91, 0x32, 0xcf, 0x8a, - 0x91, 0x5f, 0x62, 0xb7, 0x6e, 0xcc, 0x79, 0x92, 0x8c, 0x1f, 0x1c, 0x7e, 0xfa, 0x72, 0x0b, 0x3d, - 0x7f, 0xb9, 0x85, 0xfe, 0xf1, 0x72, 0x0b, 0xfd, 0xf6, 0xd5, 0xd6, 0xca, 0xf3, 0x57, 0x5b, 0x2b, - 0x7f, 0x7b, 0xb5, 0xb5, 0xf2, 0x71, 0xe7, 0xe2, 0xdb, 0x65, 0x2a, 0xa3, 0x69, 0xc4, 0x82, 0x9d, - 0x94, 0x79, 0xb8, 0x1a, 0xcb, 0xd8, 0xfd, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7d, 0x45, 0xa4, - 0xce, 0x79, 0x19, 0x00, 0x00, + 0x92, 0xb1, 0xb3, 0x4e, 0x16, 0x76, 0x14, 0x89, 0x8b, 0x5d, 0xf5, 0xfa, 0xab, 0xaf, 0x5e, 0x7d, + 0xaf, 0xde, 0xeb, 0xea, 0x82, 0xf5, 0xd3, 0x50, 0x44, 0xa2, 0x13, 0xff, 0xe2, 0x6a, 0x44, 0x65, + 0xe4, 0x91, 0x88, 0xb4, 0x36, 0x7d, 0xe1, 0x8b, 0xd8, 0xb8, 0xa3, 0x5a, 0xc9, 0xf3, 0xd6, 0x0d, + 0x5f, 0x08, 0x3f, 0xa0, 0x3b, 0x71, 0x6f, 0x38, 0x1d, 0xed, 0x10, 0x3e, 0x4b, 0x1e, 0x59, 0x77, + 0xc0, 0xb8, 0x27, 0x7c, 0x8c, 0xa1, 0x2c, 0xd9, 0xcf, 0xa9, 0x89, 0xb6, 0x51, 0xbb, 0xe6, 0xc4, + 0x6d, 0x65, 0xe3, 0x64, 0x42, 0xcd, 0x52, 0x62, 0x53, 0x6d, 0xeb, 0x03, 0x30, 0xf6, 0x48, 0x84, + 0x4d, 0x58, 0x9b, 0x08, 0xce, 0x4e, 0x68, 0xa8, 0x47, 0xa4, 0x5d, 0xbc, 0x09, 0x95, 0x80, 0x3d, + 0xa1, 0x32, 0x1e, 0x55, 0x71, 0x92, 0x8e, 0xf5, 0x11, 0xd4, 0x0e, 0x89, 0xec, 0x73, 0x36, 0x21, + 0x01, 0x7e, 0x1f, 0x56, 0x49, 0xdc, 0x8a, 0xc7, 0xae, 0xdb, 0x9b, 0x9d, 0xc4, 0xbd, 0x4e, 0xea, + 0x5e, 0xa7, 0xcf, 0x67, 0x8e, 0xc6, 0xe0, 0x3a, 0xa0, 0x67, 0x31, 0x99, 0xe1, 0xa0, 0x67, 0xd6, + 0x1e, 0xd4, 0x0f, 0x89, 0xcc, 0xb9, 0xba, 0x00, 0x63, 0x22, 0x8f, 0x97, 0xe0, 0xab, 0x8d, 0xd3, + 0x41, 0xd6, 0x43, 0xd8, 0x48, 0x48, 0x72, 0x9e, 0xbb, 0xd0, 0x50, 0x3c, 0x4b, 0x72, 0xd5, 0xc7, + 0x85, 0xb1, 0xd6, 0x6d, 0x58, 0xdf, 0x77, 0xc7, 0xc2, 0xa1, 0x3f, 0x9b, 0x52, 0x99, 0x68, 0x43, + 0xa5, 0x24, 0x3e, 0xcd, 0xb4, 0x49, 0xba, 0x56, 0x1b, 0xea, 0x09, 0x50, 0x9e, 0x0a, 0x2e, 0xe9, + 0x05, 0xc8, 0xef, 0xc2, 0xc6, 0x23, 0x32, 0x3b, 0xa4, 0x41, 0x90, 0xd1, 0xa6, 0xd1, 0x40, 0x85, + 0x68, 0x74, 0xa0, 0x99, 0xc3, 0x34, 0x69, 0x0b, 0xaa, 0x7e, 0x48, 0x69, 0xc4, 0xb8, 0xaf, 0xb1, + 0x59, 0xdf, 0xda, 0x87, 0xc6, 0x27, 0x54, 0x46, 0x6a, 0x09, 0x9a, 0xb5, 0x0b, 0x40, 0xf8, 0x6c, + 0x29, 0xfd, 0x08, 0x9f, 0xe9, 0x05, 0xef, 0xc3, 0x46, 0x46, 0xa3, 0x67, 0xb5, 0xe7, 0xc4, 0xe1, + 0x1b, 0x9d, 0x74, 0x5b, 0x76, 0x32, 0xb1, 0x8a, 0x61, 0x78, 0x0c, 0x6b, 0x8a, 0xe6, 0xa1, 0xf4, + 0xf1, 0x8f, 0x60, 0x4d, 0x32, 0x9f, 0xd3, 0x50, 0x9a, 0x68, 0xdb, 0x68, 0xd7, 0x07, 0xbb, 0xff, + 0x78, 0x71, 0xf3, 0x8e, 0xcf, 0xa2, 0xf1, 0x74, 0xd8, 0x71, 0xc5, 0x64, 0xc7, 0x15, 0x72, 0x22, + 0xa4, 0xfe, 0xbb, 0x23, 0xbd, 0x93, 0x9d, 0x68, 0x76, 0x4a, 0x65, 0xa7, 0xef, 0xba, 0x7d, 0xcf, + 0x0b, 0xa9, 0x94, 0x4e, 0xca, 0x60, 0x0d, 0xe1, 0xeb, 0x03, 0xe2, 0x3d, 0x9c, 0x06, 0x11, 0x7b, + 0xc4, 0x7c, 0x4e, 0xa2, 0x69, 0x48, 0xf1, 0x16, 0x80, 0x4c, 0x3b, 0x7a, 0x12, 0xa7, 0x60, 0xc1, + 0xb7, 0x61, 0x63, 0x42, 0x02, 0xe6, 0x32, 0x31, 0x95, 0xc7, 0x23, 0x46, 0x03, 0xcf, 0xac, 0x6c, + 0xa3, 0x76, 0xdd, 0x69, 0x64, 0xe6, 0x03, 0x65, 0xbd, 0x5b, 0x7e, 0xfe, 0xbb, 0x9b, 0xc8, 0x8a, + 0xa0, 0xb6, 0x37, 0x95, 0x91, 0x98, 0xd0, 0x70, 0x17, 0x37, 0xa0, 0xc4, 0xbc, 0x78, 0xd1, 0x15, + 0xa7, 0xc4, 0xbc, 0x79, 0x89, 0x83, 0xbf, 0x07, 0x4d, 0x39, 0x1d, 0x4a, 0x37, 0x64, 0xa7, 0x11, + 0x13, 0xfc, 0x78, 0x44, 0xa9, 0x69, 0x6c, 0xa3, 0x76, 0xc9, 0xd9, 0x28, 0xda, 0x0f, 0x68, 0xbc, + 0x2d, 0x4e, 0xc9, 0x6c, 0x42, 0x79, 0x64, 0xae, 0x25, 0xdb, 0x42, 0x77, 0xad, 0xcf, 0x4a, 0xf9, + 0xb4, 0xf6, 0x6b, 0xd3, 0xb6, 0xa0, 0xca, 0xb8, 0x37, 0x95, 0x51, 0x38, 0xd3, 0xd9, 0x97, 0xf5, + 0x33, 0x97, 0x8c, 0x82, 0x4b, 0x9b, 0x50, 0x19, 0xd1, 0xa7, 0x34, 0x34, 0xcb, 0xb1, 0x1f, 0x49, + 0x07, 0xbf, 0x0d, 0xd5, 0x90, 0x4a, 0x1a, 0x3e, 0xa1, 0x9e, 0xf9, 0xdb, 0x6a, 0x9c, 0x77, 0x99, + 0x01, 0xbf, 0x0f, 0x65, 0x97, 0x45, 0x33, 0x73, 0x75, 0x1b, 0xb5, 0x1b, 0xb6, 0x99, 0x07, 0x38, + 0xf3, 0xaa, 0xb3, 0xc7, 0xa2, 0x99, 0x13, 0xa3, 0xf0, 0x5d, 0xf8, 0xda, 0x84, 0x49, 0x97, 0x06, + 0x01, 0xe1, 0x54, 0x4c, 0xa5, 0x09, 0x17, 0xec, 0xaf, 0xb3, 0x50, 0xeb, 0x23, 0x28, 0x2b, 0x26, + 0x5c, 0x85, 0xf2, 0x03, 0x22, 0x64, 0x73, 0x05, 0x37, 0x00, 0x1e, 0x08, 0xd9, 0xe7, 0x3e, 0x0d, + 0xa8, 0x6c, 0x22, 0x5c, 0x87, 0xea, 0x8f, 0x49, 0x20, 0xfa, 0x41, 0x24, 0x9a, 0x25, 0x0c, 0xb0, + 0xfa, 0x50, 0x48, 0x57, 0x3c, 0x6d, 0x1a, 0x78, 0x1d, 0xd6, 0x8e, 0x08, 0x0b, 0xc5, 0x90, 0x35, + 0xcb, 0x56, 0x07, 0xaa, 0x47, 0x54, 0x46, 0xd4, 0xeb, 0xf5, 0x97, 0x09, 0x94, 0xf5, 0x67, 0x94, + 0x0e, 0xe8, 0x2e, 0x35, 0x00, 0x5b, 0x50, 0x22, 0x3d, 0xb3, 0xbc, 0x6d, 0xb4, 0xd7, 0x6d, 0x9c, + 0x2b, 0x92, 0x4e, 0xea, 0x94, 0x48, 0x0f, 0x77, 0xa1, 0xc2, 0xb8, 0x47, 0x9f, 0x99, 0x95, 0x18, + 0xf6, 0xce, 0x79, 0x58, 0xb7, 0xdf, 0xb9, 0xaf, 0x9e, 0xef, 0xf3, 0x28, 0x9c, 0x39, 0x09, 0xb6, + 0xf5, 0x00, 0x20, 0x37, 0xe2, 0x26, 0x18, 0x27, 0x74, 0x16, 0xfb, 0x62, 0x38, 0xaa, 0x89, 0xdb, + 0x50, 0x79, 0x42, 0x82, 0x69, 0xe2, 0xcd, 0xfc, 0xb9, 0x13, 0xc0, 0xdd, 0xd2, 0x0f, 0x90, 0xf5, + 0x69, 0xba, 0x2c, 0x7b, 0xb9, 0x65, 0xbd, 0x07, 0xab, 0x3c, 0xc6, 0xc7, 0x7b, 0x66, 0x0e, 0x7d, + 0xb7, 0xef, 0x68, 0x84, 0x75, 0x90, 0x72, 0xef, 0xbe, 0xce, 0x9d, 0xf3, 0x2c, 0x70, 0xd3, 0xce, + 0x79, 0x3e, 0xcc, 0x62, 0x35, 0x78, 0x8d, 0xa7, 0x09, 0x86, 0x2a, 0x94, 0xc9, 0xc6, 0x56, 0xcd, + 0x79, 0x7b, 0xda, 0xf2, 0xb2, 0xe0, 0x5d, 0x91, 0x41, 0x85, 0x73, 0xb8, 0x38, 0x9c, 0x03, 0xa7, + 0x34, 0xec, 0x59, 0x3c, 0xd3, 0x72, 0xee, 0x2c, 0x2a, 0xb7, 0xd5, 0x2c, 0xc8, 0x51, 0xcd, 0x25, + 0x94, 0x1c, 0xa4, 0x0a, 0xa8, 0x9c, 0x0c, 0xc5, 0x34, 0xa2, 0x71, 0x4e, 0xd6, 0x9c, 0xa4, 0x63, + 0xfd, 0x34, 0xd3, 0x77, 0x70, 0x05, 0x7d, 0x73, 0x76, 0xad, 0x80, 0x91, 0x29, 0x60, 0xfd, 0xa2, + 0x50, 0x51, 0xba, 0x4b, 0xed, 0x8b, 0x06, 0x94, 0xe4, 0x48, 0x97, 0xae, 0x92, 0x1c, 0xe1, 0x6f, + 0x43, 0x4d, 0x4e, 0x43, 0x77, 0x4c, 0x42, 0x9f, 0xea, 0x4a, 0x92, 0x1b, 0xf0, 0x36, 0xac, 0x7b, + 0x54, 0x46, 0x8c, 0x13, 0x55, 0xdd, 0xe2, 0x92, 0x5a, 0x73, 0x8a, 0x26, 0xfc, 0x2e, 0x34, 0xdc, + 0x90, 0x7a, 0x2c, 0x3a, 0x76, 0x49, 0xe8, 0x1d, 0x73, 0x91, 0x14, 0xbd, 0xc3, 0x15, 0xa7, 0x9e, + 0xd8, 0xf7, 0x48, 0xe8, 0x1d, 0x09, 0xfc, 0x0e, 0xd4, 0xdc, 0xb1, 0x7a, 0x6b, 0x29, 0x48, 0x55, + 0x43, 0xaa, 0x89, 0xe9, 0x48, 0xe0, 0x1d, 0xa8, 0x8a, 0x90, 0xf9, 0x8c, 0x93, 0xc0, 0xac, 0x9d, + 0x7f, 0xfd, 0x64, 0xa5, 0xda, 0xc9, 0x40, 0x83, 0x5a, 0x56, 0x65, 0xad, 0xbf, 0x97, 0xa0, 0xae, + 0xde, 0x44, 0x8f, 0x69, 0x28, 0x99, 0xe0, 0xbb, 0xc9, 0x99, 0x03, 0xe9, 0x33, 0x07, 0xbe, 0x05, + 0x88, 0x68, 0x71, 0xdf, 0xca, 0x39, 0x8b, 0x03, 0x1c, 0x44, 0x14, 0x6a, 0xa8, 0x03, 0xbc, 0x10, + 0x35, 0x54, 0x28, 0x57, 0x6f, 0xae, 0x85, 0x28, 0x17, 0xbf, 0x07, 0xc8, 0xd3, 0xa5, 0x62, 0x01, + 0x6a, 0x50, 0xfe, 0xfc, 0xc5, 0xcd, 0x15, 0x07, 0x79, 0xb8, 0x01, 0x88, 0xc6, 0xf5, 0xb8, 0x72, + 0xb8, 0xe2, 0x20, 0x8a, 0xdf, 0x05, 0x34, 0x8a, 0x25, 0x5c, 0x38, 0x56, 0xe1, 0x46, 0xd8, 0x02, + 0xe4, 0xc7, 0x3a, 0x2e, 0x2a, 0xc8, 0xc8, 0x57, 0xde, 0x8e, 0xcd, 0xda, 0xc5, 0xde, 0x8e, 0xf1, + 0x6d, 0x40, 0x27, 0x66, 0x7d, 0xa1, 0xe6, 0x83, 0xf2, 0xf3, 0x17, 0x37, 0x91, 0x83, 0x4e, 0x06, + 0x15, 0x30, 0xe4, 0x74, 0x62, 0xfd, 0xd2, 0x38, 0x23, 0xb7, 0x7d, 0x59, 0xb9, 0xed, 0xa5, 0xe4, + 0xb6, 0x97, 0x92, 0xdb, 0x56, 0x72, 0xdf, 0xfa, 0x22, 0xb9, 0xed, 0x2b, 0x09, 0x6d, 0xbf, 0x29, + 0xa1, 0xf1, 0xdb, 0x50, 0xe3, 0xf4, 0xa9, 0x3e, 0xc6, 0xdc, 0xd8, 0x46, 0xed, 0xb2, 0x53, 0xe5, + 0xf4, 0x69, 0x7c, 0x80, 0x49, 0xa3, 0xf0, 0x9b, 0xb3, 0x51, 0xe8, 0x5e, 0x36, 0x0a, 0xdd, 0xa5, + 0xa2, 0xd0, 0x5d, 0x2a, 0x0a, 0xdd, 0xa5, 0xa2, 0xd0, 0xbd, 0x52, 0x14, 0xba, 0x6f, 0x2c, 0x0a, + 0x77, 0x00, 0x73, 0xc1, 0x8f, 0xdd, 0x90, 0x45, 0xcc, 0x25, 0x81, 0x0e, 0xc7, 0xaf, 0xe2, 0xda, + 0xe5, 0x34, 0xb9, 0xe0, 0x7b, 0xfa, 0xc9, 0x99, 0xb8, 0xfc, 0xb3, 0x04, 0xad, 0xa2, 0xfb, 0x0f, + 0x04, 0xa7, 0x1f, 0x73, 0xfa, 0xf1, 0xe8, 0xb1, 0x7a, 0x95, 0x5f, 0xd3, 0x28, 0x5d, 0x1b, 0xf5, + 0xff, 0xb5, 0x0a, 0xdf, 0x3a, 0xaf, 0xfe, 0x51, 0xfc, 0xb6, 0xf2, 0xaf, 0x89, 0xf4, 0xbb, 0x79, + 0x42, 0x7c, 0x67, 0x3e, 0xaa, 0xb0, 0xa6, 0x6b, 0x92, 0x1b, 0xf8, 0x43, 0x58, 0x65, 0x9c, 0xd3, + 0x70, 0xd7, 0x6c, 0xc4, 0xe4, 0xed, 0x2f, 0x5c, 0x59, 0xe7, 0x7e, 0x8c, 0x77, 0xf4, 0xb8, 0x8c, + 0xc1, 0x36, 0x37, 0x2e, 0xc5, 0x60, 0x6b, 0x06, 0xbb, 0xf5, 0x7b, 0x04, 0xab, 0x09, 0x69, 0xe1, + 0x9c, 0x64, 0x2c, 0x3c, 0x27, 0xdd, 0x57, 0x47, 0x7e, 0x4e, 0x43, 0x1d, 0xfd, 0xee, 0xb2, 0x1e, + 0x27, 0x7f, 0xf1, 0x8f, 0x93, 0x30, 0xb4, 0xbe, 0xaf, 0x3e, 0x04, 0x52, 0x63, 0x61, 0xf2, 0x5a, + 0x3a, 0x79, 0xfc, 0x4d, 0xa6, 0x27, 0x57, 0xed, 0xd6, 0x1f, 0x52, 0x5f, 0xed, 0xd7, 0xe0, 0x26, + 0xac, 0xb9, 0x62, 0xca, 0xd3, 0x8f, 0xc4, 0x9a, 0x93, 0x76, 0xaf, 0xea, 0xb1, 0xfd, 0xdf, 0xf0, + 0x38, 0xcd, 0xbf, 0x7f, 0x9f, 0xcd, 0xbf, 0xde, 0xff, 0xf3, 0xef, 0x1a, 0xe5, 0x5f, 0xef, 0x4b, + 0xe7, 0x5f, 0xef, 0x2b, 0xce, 0xbf, 0xde, 0x97, 0xca, 0x3f, 0x63, 0x61, 0xfe, 0x7d, 0xf6, 0x3f, + 0xcb, 0xbf, 0xde, 0x52, 0xf9, 0x67, 0x5f, 0x98, 0x7f, 0x9b, 0xc5, 0x8b, 0x03, 0x43, 0x5f, 0x12, + 0xa4, 0x19, 0xf8, 0x27, 0x94, 0x5c, 0x12, 0xea, 0xf9, 0x0e, 0xee, 0x5d, 0xed, 0x73, 0xe8, 0x8d, + 0x7f, 0x96, 0xa4, 0xeb, 0xf9, 0x2b, 0x3a, 0x73, 0x9e, 0x3a, 0xb8, 0xb7, 0xfb, 0x13, 0x16, 0x8d, + 0xf7, 0x9f, 0x45, 0x21, 0xe9, 0xf3, 0xd9, 0x57, 0xba, 0xb6, 0x5b, 0xf9, 0xda, 0x0a, 0xb8, 0x3e, + 0x9f, 0x65, 0x1e, 0x5d, 0x7a, 0x75, 0x9f, 0x40, 0xbd, 0x38, 0x1e, 0xb7, 0xd5, 0x02, 0x2e, 0xb8, + 0xc6, 0x4d, 0x2b, 0x00, 0x51, 0x0b, 0x4f, 0x2a, 0xa3, 0xa1, 0x2a, 0x60, 0x3d, 0xa9, 0x80, 0x71, + 0xcf, 0xb5, 0xff, 0x88, 0x60, 0x5d, 0x4d, 0xf8, 0x88, 0x86, 0x4f, 0x98, 0x4b, 0xf1, 0x07, 0x50, + 0xde, 0x77, 0xc7, 0x02, 0x7f, 0x33, 0xf7, 0xa7, 0x70, 0xe3, 0xdd, 0x7a, 0xeb, 0xbc, 0x59, 0x5f, + 0x0a, 0xf7, 0xa1, 0x9a, 0x5e, 0x4f, 0xe3, 0x1b, 0x39, 0xe6, 0xdc, 0xcd, 0x76, 0xab, 0x35, 0xef, + 0x91, 0xa6, 0xf8, 0x61, 0x72, 0x47, 0xac, 0x22, 0x65, 0x9e, 0x15, 0x23, 0xbf, 0xc4, 0x6e, 0xdd, + 0x98, 0xf3, 0x24, 0x19, 0x3f, 0x38, 0xfc, 0xfc, 0xe5, 0x16, 0x7a, 0xfe, 0x72, 0x0b, 0xfd, 0xed, + 0xe5, 0x16, 0xfa, 0xf5, 0xab, 0xad, 0x95, 0xe7, 0xaf, 0xb6, 0x56, 0xfe, 0xf2, 0x6a, 0x6b, 0xe5, + 0xd3, 0xce, 0xc5, 0xb7, 0xcb, 0x54, 0x46, 0xd3, 0x88, 0x05, 0x3b, 0x29, 0xf3, 0x70, 0x35, 0x96, + 0xb1, 0xfb, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x62, 0xd0, 0xa8, 0x05, 0x79, 0x19, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -10935,7 +10934,7 @@ func (m *TestVersion2) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.H = append(m.H, &TestVersion2{}) + m.H = append(m.H, &TestVersion1{}) if err := m.H[len(m.H)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } diff --git a/x/auth/types/account.go b/x/auth/types/account.go index 5150332572cf..72f513818292 100644 --- a/x/auth/types/account.go +++ b/x/auth/types/account.go @@ -6,6 +6,9 @@ import ( "fmt" "strings" + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/tendermint/tendermint/crypto" @@ -21,13 +24,27 @@ var ( _ ModuleAccountI = (*ModuleAccount)(nil) ) +// BaseAccount defines a base account type. It contains all the necessary fields +// for basic account functionality. Any custom account type should extend this +// type for additional functionality (e.g. vesting). +type BaseAccount struct { + Address sdk.AccAddress `protobuf:"bytes,1,opt,name=address,proto3,casttype=github.com/cosmos/cosmos-sdk/types.AccAddress" json:"address,omitempty"` + PubKey *types.PublicKey `protobuf:"bytes,2,opt,name=pub_key,json=pubKey,proto3" json:"public_key,omitempty" yaml:"public_key"` + AccountNumber uint64 `protobuf:"varint,3,opt,name=account_number,json=accountNumber,proto3" json:"account_number,omitempty" yaml:"account_number"` + Sequence uint64 `protobuf:"varint,4,opt,name=sequence,proto3" json:"sequence,omitempty"` + + // NOTE: this is somewhat of a hack to not have to break the AccountI.Get/SetPubKey interface methods. It should + // likely be replaced with something less hacky in the future (this involves re-enabled gogoproto.typedecl). + decodedPubKey crypto.PubKey +} + // NewBaseAccount creates a new BaseAccount object -func NewBaseAccount(address sdk.AccAddress, pubKey *types.PublicKey, accountNumber, sequence uint64) *BaseAccount { +func NewBaseAccount(address sdk.AccAddress, pubKey crypto.PubKey, accountNumber, sequence uint64) *BaseAccount { acc := &BaseAccount{ Address: address, AccountNumber: accountNumber, Sequence: sequence, - PubKey: pubKey, + decodedPubKey: pubKey, } return acc @@ -61,13 +78,13 @@ func (acc *BaseAccount) SetAddress(addr sdk.AccAddress) error { } // GetPubKey - Implements sdk.AccountI. -func (acc BaseAccount) GetPubKey() (pk *types.PublicKey) { - return acc.PubKey +func (acc BaseAccount) GetPubKey() (pk crypto.PubKey) { + panic("TODO") } // SetPubKey - Implements sdk.AccountI. -func (acc *BaseAccount) SetPubKey(pubKey *types.PublicKey) error { - acc.PubKey = pubKey +func (acc *BaseAccount) SetPubKey(pubKey crypto.PubKey) error { + panic("TODO") return nil } @@ -112,26 +129,10 @@ type baseAccountPretty struct { // MarshalYAML returns the YAML representation of an account. func (acc BaseAccount) MarshalYAML() (interface{}, error) { - alias := baseAccountPretty{ - Address: acc.Address, - AccountNumber: acc.AccountNumber, - Sequence: acc.Sequence, - } - - if acc.PubKey != nil { - pks, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, acc.GetPubKey()) - if err != nil { - return nil, err - } - - alias.PubKey = pks - } - - bz, err := yaml.Marshal(alias) + bz, err := codec.MarshalYAML(codec.NewProtoCodec(codectypes.NewInterfaceRegistry()), acc) if err != nil { return nil, err } - return string(bz), err } @@ -190,7 +191,7 @@ func (ma ModuleAccount) GetPermissions() []string { } // SetPubKey - Implements AccountI -func (ma ModuleAccount) SetPubKey(pubKey *types.PublicKey) error { +func (ma ModuleAccount) SetPubKey(pubKey crypto.PubKey) error { return fmt.Errorf("not supported for module accounts") } @@ -280,8 +281,8 @@ type AccountI interface { GetAddress() sdk.AccAddress SetAddress(sdk.AccAddress) error // errors if already set. - GetPubKey() *types.PublicKey // can return nil. - SetPubKey(*types.PublicKey) error + GetPubKey() crypto.PubKey // can return nil. + SetPubKey(crypto.PubKey) error GetAccountNumber() uint64 SetAccountNumber(uint64) error diff --git a/x/auth/types/auth.pb.go b/x/auth/types/auth.pb.go index c23e6ae8b722..a7b66ace9b08 100644 --- a/x/auth/types/auth.pb.go +++ b/x/auth/types/auth.pb.go @@ -5,14 +5,14 @@ package types import ( fmt "fmt" + io "io" + math "math" + math_bits "math/bits" + types "github.com/cosmos/cosmos-sdk/crypto/types" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" _ "github.com/regen-network/cosmos-proto" - io "io" - math "math" - math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -26,16 +26,6 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// BaseAccount defines a base account type. It contains all the necessary fields -// for basic account functionality. Any custom account type should extend this -// type for additional functionality (e.g. vesting). -type BaseAccount struct { - Address github_com_cosmos_cosmos_sdk_types.AccAddress `protobuf:"bytes,1,opt,name=address,proto3,casttype=github.com/cosmos/cosmos-sdk/types.AccAddress" json:"address,omitempty"` - PubKey *types.PublicKey `protobuf:"bytes,2,opt,name=pub_key,json=pubKey,proto3" json:"public_key,omitempty" yaml:"public_key"` - AccountNumber uint64 `protobuf:"varint,3,opt,name=account_number,json=accountNumber,proto3" json:"account_number,omitempty" yaml:"account_number"` - Sequence uint64 `protobuf:"varint,4,opt,name=sequence,proto3" json:"sequence,omitempty"` -} - func (m *BaseAccount) Reset() { *m = BaseAccount{} } func (*BaseAccount) ProtoMessage() {} func (*BaseAccount) Descriptor() ([]byte, []int) { @@ -192,50 +182,50 @@ func init() { func init() { proto.RegisterFile("cosmos/auth/auth.proto", fileDescriptor_ec2401f40a84da7e) } var fileDescriptor_ec2401f40a84da7e = []byte{ - // 674 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0x3f, 0x4f, 0xdb, 0x4e, - 0x18, 0x8e, 0x49, 0x7e, 0xfc, 0xb9, 0x00, 0x12, 0x26, 0x80, 0xc9, 0xaf, 0xf2, 0x59, 0x9e, 0x52, - 0xa9, 0x49, 0x04, 0x15, 0x95, 0xc8, 0x50, 0x15, 0xd3, 0x0e, 0x88, 0x82, 0x90, 0x91, 0xaa, 0xaa, - 0x8b, 0x6b, 0x5f, 0xae, 0xc1, 0x22, 0x97, 0x33, 0xbe, 0x73, 0x15, 0xf3, 0x09, 0x3a, 0x76, 0xec, - 0xc8, 0x47, 0xe8, 0xd0, 0xad, 0x5f, 0xa0, 0x23, 0xea, 0xd4, 0xc9, 0xad, 0xc2, 0x52, 0x75, 0xf4, - 0xd8, 0xa9, 0xf2, 0x9d, 0x09, 0x0e, 0xa2, 0x5d, 0x6c, 0xbf, 0xef, 0xf3, 0x3e, 0xcf, 0xfb, 0xf8, - 0x7d, 0x75, 0x07, 0x56, 0x11, 0x65, 0x84, 0xb2, 0xb6, 0x1b, 0xf1, 0x13, 0xf1, 0x68, 0x05, 0x21, - 0xe5, 0x54, 0xad, 0xca, 0x7c, 0x2b, 0x4b, 0xd5, 0xd7, 0x65, 0xe0, 0x08, 0xa8, 0x9d, 0x23, 0x22, - 0xa8, 0xd7, 0x7a, 0xb4, 0x47, 0x65, 0x3e, 0xfb, 0xca, 0xb3, 0xf5, 0x5c, 0x15, 0x85, 0x71, 0x90, - 0x31, 0xc4, 0x4b, 0x62, 0xe6, 0xc7, 0x29, 0x50, 0xb5, 0x5c, 0x86, 0x77, 0x10, 0xa2, 0xd1, 0x80, - 0xab, 0xfb, 0x60, 0xc6, 0xed, 0x76, 0x43, 0xcc, 0x98, 0xa6, 0x18, 0x4a, 0x63, 0xde, 0xda, 0xf8, - 0x9d, 0xc0, 0x66, 0xcf, 0xe7, 0x27, 0x91, 0xd7, 0x42, 0x94, 0xb4, 0xaf, 0xb5, 0xc4, 0xab, 0xc9, - 0xba, 0xa7, 0x6d, 0x1e, 0x07, 0x98, 0xb5, 0x76, 0x10, 0xda, 0x91, 0x44, 0xfb, 0x5a, 0x41, 0x7d, - 0x0d, 0x66, 0x82, 0xc8, 0x73, 0x4e, 0x71, 0xac, 0x4d, 0x19, 0x4a, 0xa3, 0xba, 0xa9, 0xb5, 0x72, - 0xbb, 0xb9, 0x87, 0xa3, 0xc8, 0xeb, 0xfb, 0x68, 0x1f, 0xc7, 0x56, 0xf3, 0x57, 0x02, 0x6b, 0x81, - 0x08, 0xb3, 0xfa, 0x07, 0x94, 0xf8, 0x1c, 0x93, 0x80, 0xc7, 0x69, 0x02, 0x97, 0x62, 0x97, 0xf4, - 0x3b, 0xe6, 0x0d, 0x6a, 0xda, 0xd3, 0x41, 0xe4, 0xed, 0xe3, 0x58, 0x7d, 0x02, 0x16, 0x5d, 0xe9, - 0xdc, 0x19, 0x44, 0xc4, 0xc3, 0xa1, 0x56, 0x36, 0x94, 0x46, 0xc5, 0x5a, 0x4f, 0x13, 0xb8, 0x22, - 0x69, 0x93, 0xb8, 0x69, 0x2f, 0xe4, 0x89, 0x43, 0x11, 0xab, 0x75, 0x30, 0xcb, 0xf0, 0x59, 0x84, - 0x07, 0x08, 0x6b, 0x95, 0x8c, 0x6b, 0x8f, 0xe3, 0x4e, 0xed, 0xdd, 0x05, 0x2c, 0x7d, 0xb8, 0x80, - 0xa5, 0xaf, 0x9f, 0x9a, 0xb3, 0xf9, 0x84, 0xf6, 0xcc, 0xcf, 0x0a, 0x58, 0x38, 0xa0, 0xdd, 0xa8, - 0x3f, 0x1e, 0xda, 0x4b, 0x30, 0xef, 0xb9, 0x0c, 0x3b, 0xb9, 0xb2, 0x98, 0x5c, 0xe1, 0x67, 0xc5, - 0x22, 0x0b, 0x43, 0xb6, 0xfe, 0xbf, 0x4c, 0xa0, 0x92, 0x26, 0x70, 0x59, 0x3a, 0x2c, 0x72, 0x4d, - 0xbb, 0xea, 0x15, 0xd6, 0xa1, 0x82, 0xca, 0xc0, 0x25, 0x58, 0x8c, 0x6f, 0xce, 0x16, 0xdf, 0xaa, - 0x01, 0xaa, 0x01, 0x0e, 0x89, 0xcf, 0x98, 0x4f, 0x07, 0x4c, 0x2b, 0x1b, 0xe5, 0xc6, 0x9c, 0x5d, - 0x4c, 0x75, 0xea, 0x05, 0xdf, 0x8b, 0x13, 0x56, 0xf7, 0xcc, 0xef, 0x65, 0x30, 0x7d, 0xe4, 0x86, - 0x2e, 0x61, 0xea, 0x21, 0x58, 0x26, 0xee, 0xd0, 0x21, 0x98, 0x50, 0x07, 0x9d, 0xb8, 0xa1, 0x8b, - 0x38, 0x0e, 0xe5, 0xde, 0x2b, 0x96, 0x9e, 0x26, 0xb0, 0x2e, 0xfd, 0xdd, 0x51, 0x64, 0xda, 0x4b, - 0xc4, 0x1d, 0x1e, 0x60, 0x42, 0x77, 0xc7, 0x39, 0x75, 0x1b, 0xcc, 0xf3, 0xa1, 0xc3, 0xfc, 0x9e, - 0xd3, 0xf7, 0x89, 0xcf, 0x85, 0xe9, 0x8a, 0xb5, 0x76, 0xf3, 0xa3, 0x45, 0xd4, 0xb4, 0x01, 0x1f, - 0x1e, 0xfb, 0xbd, 0xe7, 0x59, 0xa0, 0xda, 0x60, 0x45, 0x80, 0xe7, 0xd8, 0x41, 0x94, 0x71, 0x27, - 0xc0, 0xa1, 0xe3, 0xc5, 0x1c, 0xe7, 0xeb, 0x34, 0xd2, 0x04, 0xde, 0x2b, 0x68, 0xdc, 0x2e, 0x33, - 0xed, 0xa5, 0x4c, 0xec, 0x1c, 0xef, 0x52, 0xc6, 0x8f, 0x70, 0x68, 0xc5, 0x1c, 0xab, 0x67, 0x60, - 0x2d, 0xeb, 0xf6, 0x16, 0x87, 0xfe, 0x9b, 0x58, 0xd6, 0xe3, 0xee, 0xe6, 0xd6, 0xd6, 0xc6, 0xb6, - 0x5c, 0xb4, 0xd5, 0x19, 0x25, 0xb0, 0x76, 0xec, 0xf7, 0x5e, 0x88, 0x8a, 0x8c, 0xfa, 0xec, 0xa9, - 0xc0, 0xd3, 0x04, 0xea, 0xb2, 0xdb, 0x5f, 0x04, 0x4c, 0xbb, 0xc6, 0x26, 0x78, 0x32, 0xad, 0xc6, - 0x60, 0xfd, 0x36, 0x83, 0x61, 0x14, 0x6c, 0x6e, 0x3d, 0x3a, 0xdd, 0xd0, 0xfe, 0x13, 0x4d, 0x1f, - 0x8f, 0x12, 0xb8, 0x3a, 0xd1, 0xf4, 0xf8, 0xba, 0x22, 0x4d, 0xa0, 0x71, 0x77, 0xdb, 0xb1, 0x88, - 0x69, 0xaf, 0xb2, 0x3b, 0xb9, 0x9d, 0xd9, 0x6c, 0xdf, 0x3f, 0x2f, 0xa0, 0x62, 0xed, 0x7e, 0x19, - 0xe9, 0xca, 0xe5, 0x48, 0x57, 0x7e, 0x8c, 0x74, 0xe5, 0xfd, 0x95, 0x5e, 0xba, 0xbc, 0xd2, 0x4b, - 0xdf, 0xae, 0xf4, 0xd2, 0xab, 0xfb, 0xff, 0x3c, 0xc7, 0x43, 0x79, 0xed, 0x88, 0xe3, 0xec, 0x4d, - 0x8b, 0xeb, 0xe1, 0xe1, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3a, 0x04, 0xd8, 0x73, 0x92, 0x04, - 0x00, 0x00, + // 679 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0xbf, 0x6f, 0xd3, 0x40, + 0x14, 0x8e, 0x9b, 0xd0, 0x1f, 0x97, 0xb6, 0x52, 0xdd, 0xb4, 0x75, 0x03, 0xf2, 0x59, 0x9e, 0x82, + 0x44, 0x12, 0xb5, 0xa8, 0x48, 0xcd, 0x80, 0xa8, 0x0b, 0x43, 0x55, 0x5a, 0x55, 0xae, 0x84, 0x10, + 0x8b, 0xb1, 0x9d, 0x23, 0xb5, 0x9a, 0xcb, 0xb9, 0xbe, 0x33, 0x8a, 0xfb, 0x17, 0x30, 0x32, 0x32, + 0x96, 0xff, 0xa1, 0x1b, 0xff, 0x00, 0x63, 0xd5, 0x89, 0xc9, 0xa0, 0x74, 0x41, 0x4c, 0xc8, 0x23, + 0x13, 0xf2, 0x9d, 0x93, 0x3a, 0x55, 0x60, 0xb1, 0xfd, 0xde, 0xf7, 0xbe, 0xef, 0x7d, 0x7e, 0x4f, + 0x77, 0x60, 0xd5, 0x25, 0x14, 0x13, 0xda, 0xb4, 0x43, 0x76, 0xc2, 0x1f, 0x0d, 0x3f, 0x20, 0x8c, + 0xc8, 0x65, 0x91, 0x6f, 0xa4, 0xa9, 0xea, 0xba, 0x08, 0x2c, 0x0e, 0x35, 0x33, 0x84, 0x07, 0xd5, + 0x4a, 0x87, 0x74, 0x88, 0xc8, 0xa7, 0x5f, 0x59, 0xb6, 0x9a, 0xa9, 0xba, 0x41, 0xe4, 0xa7, 0x0c, + 0xfe, 0x12, 0x98, 0x7e, 0x39, 0x05, 0xca, 0x86, 0x4d, 0xd1, 0x8e, 0xeb, 0x92, 0xb0, 0xc7, 0xe4, + 0x7d, 0x30, 0x63, 0xb7, 0xdb, 0x01, 0xa2, 0x54, 0x91, 0x34, 0xa9, 0x36, 0x6f, 0x6c, 0xfc, 0x89, + 0x61, 0xbd, 0xe3, 0xb1, 0x93, 0xd0, 0x69, 0xb8, 0x04, 0x37, 0x87, 0x5a, 0xfc, 0x55, 0xa7, 0xed, + 0xd3, 0x26, 0x8b, 0x7c, 0x44, 0x1b, 0x3b, 0xae, 0xbb, 0x23, 0x88, 0xe6, 0x50, 0x41, 0x7e, 0x0b, + 0x66, 0xfc, 0xd0, 0xb1, 0x4e, 0x51, 0xa4, 0x4c, 0x69, 0x52, 0xad, 0xbc, 0xa9, 0x34, 0x32, 0xbb, + 0x99, 0x87, 0xa3, 0xd0, 0xe9, 0x7a, 0xee, 0x3e, 0x8a, 0x8c, 0xfa, 0xaf, 0x18, 0x56, 0x7c, 0x1e, + 0xa6, 0xf5, 0x8f, 0x08, 0xf6, 0x18, 0xc2, 0x3e, 0x8b, 0x92, 0x18, 0x2e, 0x45, 0x36, 0xee, 0xb6, + 0xf4, 0x5b, 0x54, 0x37, 0xa7, 0xfd, 0xd0, 0xd9, 0x47, 0x91, 0xfc, 0x0c, 0x2c, 0xda, 0xc2, 0xb9, + 0xd5, 0x0b, 0xb1, 0x83, 0x02, 0xa5, 0xa8, 0x49, 0xb5, 0x92, 0xb1, 0x9e, 0xc4, 0x70, 0x45, 0xd0, + 0xc6, 0x71, 0xdd, 0x5c, 0xc8, 0x12, 0x87, 0x3c, 0x96, 0xab, 0x60, 0x96, 0xa2, 0xb3, 0x10, 0xf5, + 0x5c, 0xa4, 0x94, 0x52, 0xae, 0x39, 0x8a, 0x5b, 0xca, 0x87, 0x0b, 0x58, 0xf8, 0x74, 0x01, 0x0b, + 0xbf, 0x3f, 0xc3, 0xc2, 0xf5, 0x65, 0x7d, 0x36, 0x9b, 0xd2, 0x9e, 0xfe, 0x45, 0x02, 0x0b, 0x07, + 0xa4, 0x1d, 0x76, 0x47, 0x83, 0x7b, 0x0d, 0xe6, 0x1d, 0x9b, 0x22, 0x2b, 0x53, 0xe7, 0xd3, 0xcb, + 0xfd, 0x30, 0x5f, 0x66, 0x6e, 0xd0, 0xc6, 0xfd, 0xab, 0x18, 0x4a, 0x49, 0x0c, 0x97, 0x85, 0xcb, + 0x3c, 0x57, 0x37, 0xcb, 0x4e, 0x6e, 0x25, 0x32, 0x28, 0xf5, 0x6c, 0x8c, 0xf8, 0x08, 0xe7, 0x4c, + 0xfe, 0x2d, 0x6b, 0xa0, 0xec, 0xa3, 0x00, 0x7b, 0x94, 0x7a, 0xa4, 0x47, 0x95, 0xa2, 0x56, 0xac, + 0xcd, 0x99, 0xf9, 0x54, 0xab, 0x3a, 0xf4, 0x7e, 0x7d, 0x59, 0x5f, 0x1c, 0xb3, 0xba, 0xa7, 0x7f, + 0x2f, 0x82, 0xe9, 0x23, 0x3b, 0xb0, 0x31, 0x95, 0x0f, 0xc1, 0x32, 0xb6, 0xfb, 0x16, 0x46, 0x98, + 0x58, 0xee, 0x89, 0x1d, 0xd8, 0x2e, 0x43, 0x81, 0xd8, 0x7d, 0xc9, 0x50, 0x93, 0x18, 0x56, 0x85, + 0xbf, 0x09, 0x45, 0xba, 0xb9, 0x84, 0xed, 0xfe, 0x01, 0xc2, 0x64, 0x77, 0x94, 0x93, 0xb7, 0xc1, + 0x3c, 0xeb, 0x5b, 0xd4, 0xeb, 0x58, 0x5d, 0x0f, 0x7b, 0x8c, 0x9b, 0x2e, 0x19, 0x6b, 0xb7, 0x3f, + 0x9a, 0x47, 0x75, 0x13, 0xb0, 0xfe, 0xb1, 0xd7, 0x79, 0x99, 0x06, 0xb2, 0x09, 0x56, 0x38, 0x78, + 0x8e, 0x2c, 0x97, 0x50, 0x66, 0xf9, 0x28, 0xb0, 0x9c, 0x88, 0xa1, 0x6c, 0xa5, 0x5a, 0x12, 0xc3, + 0x07, 0x39, 0x8d, 0xbb, 0x65, 0xba, 0xb9, 0x94, 0x8a, 0x9d, 0xa3, 0x5d, 0x42, 0xd9, 0x11, 0x0a, + 0x8c, 0x88, 0x21, 0xf9, 0x0c, 0xac, 0xa5, 0xdd, 0xde, 0xa3, 0xc0, 0x7b, 0x17, 0x89, 0x7a, 0xd4, + 0xde, 0xdc, 0xda, 0xda, 0xd8, 0x16, 0xcb, 0x36, 0x5a, 0x83, 0x18, 0x56, 0x8e, 0xbd, 0xce, 0x2b, + 0x5e, 0x91, 0x52, 0x5f, 0x3c, 0xe7, 0x78, 0x12, 0x43, 0x55, 0x74, 0xfb, 0x87, 0x80, 0x6e, 0x56, + 0xe8, 0x18, 0x4f, 0xa4, 0xe5, 0x08, 0xac, 0xdf, 0x65, 0x50, 0xe4, 0xfa, 0x9b, 0x5b, 0x4f, 0x4e, + 0x37, 0x94, 0x7b, 0xbc, 0xe9, 0xd3, 0x41, 0x0c, 0x57, 0xc7, 0x9a, 0x1e, 0x0f, 0x2b, 0x92, 0x18, + 0x6a, 0x93, 0xdb, 0x8e, 0x44, 0x74, 0x73, 0x95, 0x4e, 0xe4, 0xb6, 0x66, 0xd3, 0x7d, 0xff, 0xbc, + 0x80, 0x92, 0xb1, 0xfb, 0x75, 0xa0, 0x4a, 0x57, 0x03, 0x55, 0xfa, 0x31, 0x50, 0xa5, 0x8f, 0x37, + 0x6a, 0xe1, 0xea, 0x46, 0x2d, 0x7c, 0xbb, 0x51, 0x0b, 0x6f, 0x1e, 0xfe, 0xf7, 0x2c, 0xf7, 0xc5, + 0xd5, 0xc3, 0x8f, 0xb4, 0x33, 0xcd, 0xaf, 0x88, 0xc7, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x29, + 0x45, 0xd7, 0x21, 0x96, 0x04, 0x00, 0x00, } func (this *Params) Equal(that interface{}) bool { From 7f12c37608cf31b8dacd816818ca60185f1ef2f2 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Mon, 17 Aug 2020 11:45:07 -0400 Subject: [PATCH 004/128] Update PubKey --- proto/cosmos/auth/auth.proto | 4 +- x/auth/types/auth.pb.go | 100 +-- x/staking/types/staking.pb.go | 1213 +++++++++++++++++---------------- 3 files changed, 660 insertions(+), 657 deletions(-) diff --git a/proto/cosmos/auth/auth.proto b/proto/cosmos/auth/auth.proto index 6318cc008602..76e4f5090ca2 100644 --- a/proto/cosmos/auth/auth.proto +++ b/proto/cosmos/auth/auth.proto @@ -3,7 +3,7 @@ package cosmos.auth; import "cosmos_proto/cosmos.proto"; import "gogoproto/gogo.proto"; -import "cosmos/crypto/crypto.proto"; +import "google/protobuf/any.proto"; option go_package = "github.com/cosmos/cosmos-sdk/x/auth/types"; @@ -20,7 +20,7 @@ message BaseAccount { option (cosmos_proto.implements_interface) = "AccountI"; bytes address = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress"]; - cosmos.crypto.PublicKey pub_key = 2 [(gogoproto.jsontag) = "public_key,omitempty", (gogoproto.moretags) = "yaml:\"public_key\""]; + google.protobuf.Any pub_key = 2 [(gogoproto.jsontag) = "public_key,omitempty", (gogoproto.moretags) = "yaml:\"public_key\""]; uint64 account_number = 3 [(gogoproto.moretags) = "yaml:\"account_number\""]; uint64 sequence = 4; } diff --git a/x/auth/types/auth.pb.go b/x/auth/types/auth.pb.go index a7b66ace9b08..5aeae5a1a673 100644 --- a/x/auth/types/auth.pb.go +++ b/x/auth/types/auth.pb.go @@ -5,14 +5,14 @@ package types import ( fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - - types "github.com/cosmos/cosmos-sdk/crypto/types" + types "github.com/cosmos/cosmos-sdk/codec/types" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" _ "github.com/regen-network/cosmos-proto" + io "io" + math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -182,50 +182,50 @@ func init() { func init() { proto.RegisterFile("cosmos/auth/auth.proto", fileDescriptor_ec2401f40a84da7e) } var fileDescriptor_ec2401f40a84da7e = []byte{ - // 679 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0xbf, 0x6f, 0xd3, 0x40, - 0x14, 0x8e, 0x9b, 0xd0, 0x1f, 0x97, 0xb6, 0x52, 0xdd, 0xb4, 0x75, 0x03, 0xf2, 0x59, 0x9e, 0x82, - 0x44, 0x12, 0xb5, 0xa8, 0x48, 0xcd, 0x80, 0xa8, 0x0b, 0x43, 0x55, 0x5a, 0x55, 0xae, 0x84, 0x10, - 0x8b, 0xb1, 0x9d, 0x23, 0xb5, 0x9a, 0xcb, 0xb9, 0xbe, 0x33, 0x8a, 0xfb, 0x17, 0x30, 0x32, 0x32, - 0x96, 0xff, 0xa1, 0x1b, 0xff, 0x00, 0x63, 0xd5, 0x89, 0xc9, 0xa0, 0x74, 0x41, 0x4c, 0xc8, 0x23, - 0x13, 0xf2, 0x9d, 0x93, 0x3a, 0x55, 0x60, 0xb1, 0xfd, 0xde, 0xf7, 0xbe, 0xef, 0x7d, 0x7e, 0x4f, - 0x77, 0x60, 0xd5, 0x25, 0x14, 0x13, 0xda, 0xb4, 0x43, 0x76, 0xc2, 0x1f, 0x0d, 0x3f, 0x20, 0x8c, - 0xc8, 0x65, 0x91, 0x6f, 0xa4, 0xa9, 0xea, 0xba, 0x08, 0x2c, 0x0e, 0x35, 0x33, 0x84, 0x07, 0xd5, - 0x4a, 0x87, 0x74, 0x88, 0xc8, 0xa7, 0x5f, 0x59, 0xb6, 0x9a, 0xa9, 0xba, 0x41, 0xe4, 0xa7, 0x0c, - 0xfe, 0x12, 0x98, 0x7e, 0x39, 0x05, 0xca, 0x86, 0x4d, 0xd1, 0x8e, 0xeb, 0x92, 0xb0, 0xc7, 0xe4, - 0x7d, 0x30, 0x63, 0xb7, 0xdb, 0x01, 0xa2, 0x54, 0x91, 0x34, 0xa9, 0x36, 0x6f, 0x6c, 0xfc, 0x89, - 0x61, 0xbd, 0xe3, 0xb1, 0x93, 0xd0, 0x69, 0xb8, 0x04, 0x37, 0x87, 0x5a, 0xfc, 0x55, 0xa7, 0xed, - 0xd3, 0x26, 0x8b, 0x7c, 0x44, 0x1b, 0x3b, 0xae, 0xbb, 0x23, 0x88, 0xe6, 0x50, 0x41, 0x7e, 0x0b, - 0x66, 0xfc, 0xd0, 0xb1, 0x4e, 0x51, 0xa4, 0x4c, 0x69, 0x52, 0xad, 0xbc, 0xa9, 0x34, 0x32, 0xbb, - 0x99, 0x87, 0xa3, 0xd0, 0xe9, 0x7a, 0xee, 0x3e, 0x8a, 0x8c, 0xfa, 0xaf, 0x18, 0x56, 0x7c, 0x1e, - 0xa6, 0xf5, 0x8f, 0x08, 0xf6, 0x18, 0xc2, 0x3e, 0x8b, 0x92, 0x18, 0x2e, 0x45, 0x36, 0xee, 0xb6, - 0xf4, 0x5b, 0x54, 0x37, 0xa7, 0xfd, 0xd0, 0xd9, 0x47, 0x91, 0xfc, 0x0c, 0x2c, 0xda, 0xc2, 0xb9, - 0xd5, 0x0b, 0xb1, 0x83, 0x02, 0xa5, 0xa8, 0x49, 0xb5, 0x92, 0xb1, 0x9e, 0xc4, 0x70, 0x45, 0xd0, - 0xc6, 0x71, 0xdd, 0x5c, 0xc8, 0x12, 0x87, 0x3c, 0x96, 0xab, 0x60, 0x96, 0xa2, 0xb3, 0x10, 0xf5, - 0x5c, 0xa4, 0x94, 0x52, 0xae, 0x39, 0x8a, 0x5b, 0xca, 0x87, 0x0b, 0x58, 0xf8, 0x74, 0x01, 0x0b, - 0xbf, 0x3f, 0xc3, 0xc2, 0xf5, 0x65, 0x7d, 0x36, 0x9b, 0xd2, 0x9e, 0xfe, 0x45, 0x02, 0x0b, 0x07, - 0xa4, 0x1d, 0x76, 0x47, 0x83, 0x7b, 0x0d, 0xe6, 0x1d, 0x9b, 0x22, 0x2b, 0x53, 0xe7, 0xd3, 0xcb, - 0xfd, 0x30, 0x5f, 0x66, 0x6e, 0xd0, 0xc6, 0xfd, 0xab, 0x18, 0x4a, 0x49, 0x0c, 0x97, 0x85, 0xcb, - 0x3c, 0x57, 0x37, 0xcb, 0x4e, 0x6e, 0x25, 0x32, 0x28, 0xf5, 0x6c, 0x8c, 0xf8, 0x08, 0xe7, 0x4c, - 0xfe, 0x2d, 0x6b, 0xa0, 0xec, 0xa3, 0x00, 0x7b, 0x94, 0x7a, 0xa4, 0x47, 0x95, 0xa2, 0x56, 0xac, - 0xcd, 0x99, 0xf9, 0x54, 0xab, 0x3a, 0xf4, 0x7e, 0x7d, 0x59, 0x5f, 0x1c, 0xb3, 0xba, 0xa7, 0x7f, - 0x2f, 0x82, 0xe9, 0x23, 0x3b, 0xb0, 0x31, 0x95, 0x0f, 0xc1, 0x32, 0xb6, 0xfb, 0x16, 0x46, 0x98, - 0x58, 0xee, 0x89, 0x1d, 0xd8, 0x2e, 0x43, 0x81, 0xd8, 0x7d, 0xc9, 0x50, 0x93, 0x18, 0x56, 0x85, - 0xbf, 0x09, 0x45, 0xba, 0xb9, 0x84, 0xed, 0xfe, 0x01, 0xc2, 0x64, 0x77, 0x94, 0x93, 0xb7, 0xc1, - 0x3c, 0xeb, 0x5b, 0xd4, 0xeb, 0x58, 0x5d, 0x0f, 0x7b, 0x8c, 0x9b, 0x2e, 0x19, 0x6b, 0xb7, 0x3f, - 0x9a, 0x47, 0x75, 0x13, 0xb0, 0xfe, 0xb1, 0xd7, 0x79, 0x99, 0x06, 0xb2, 0x09, 0x56, 0x38, 0x78, - 0x8e, 0x2c, 0x97, 0x50, 0x66, 0xf9, 0x28, 0xb0, 0x9c, 0x88, 0xa1, 0x6c, 0xa5, 0x5a, 0x12, 0xc3, - 0x07, 0x39, 0x8d, 0xbb, 0x65, 0xba, 0xb9, 0x94, 0x8a, 0x9d, 0xa3, 0x5d, 0x42, 0xd9, 0x11, 0x0a, - 0x8c, 0x88, 0x21, 0xf9, 0x0c, 0xac, 0xa5, 0xdd, 0xde, 0xa3, 0xc0, 0x7b, 0x17, 0x89, 0x7a, 0xd4, - 0xde, 0xdc, 0xda, 0xda, 0xd8, 0x16, 0xcb, 0x36, 0x5a, 0x83, 0x18, 0x56, 0x8e, 0xbd, 0xce, 0x2b, - 0x5e, 0x91, 0x52, 0x5f, 0x3c, 0xe7, 0x78, 0x12, 0x43, 0x55, 0x74, 0xfb, 0x87, 0x80, 0x6e, 0x56, - 0xe8, 0x18, 0x4f, 0xa4, 0xe5, 0x08, 0xac, 0xdf, 0x65, 0x50, 0xe4, 0xfa, 0x9b, 0x5b, 0x4f, 0x4e, - 0x37, 0x94, 0x7b, 0xbc, 0xe9, 0xd3, 0x41, 0x0c, 0x57, 0xc7, 0x9a, 0x1e, 0x0f, 0x2b, 0x92, 0x18, - 0x6a, 0x93, 0xdb, 0x8e, 0x44, 0x74, 0x73, 0x95, 0x4e, 0xe4, 0xb6, 0x66, 0xd3, 0x7d, 0xff, 0xbc, - 0x80, 0x92, 0xb1, 0xfb, 0x75, 0xa0, 0x4a, 0x57, 0x03, 0x55, 0xfa, 0x31, 0x50, 0xa5, 0x8f, 0x37, - 0x6a, 0xe1, 0xea, 0x46, 0x2d, 0x7c, 0xbb, 0x51, 0x0b, 0x6f, 0x1e, 0xfe, 0xf7, 0x2c, 0xf7, 0xc5, - 0xd5, 0xc3, 0x8f, 0xb4, 0x33, 0xcd, 0xaf, 0x88, 0xc7, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x29, - 0x45, 0xd7, 0x21, 0x96, 0x04, 0x00, 0x00, + // 688 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0x4d, 0x4f, 0xdb, 0x4a, + 0x14, 0x8d, 0x49, 0x1e, 0x1f, 0x13, 0x40, 0xc2, 0x04, 0x70, 0xf2, 0x9e, 0x3c, 0x91, 0x57, 0x79, + 0x52, 0xe3, 0x88, 0x54, 0x54, 0x22, 0x8b, 0xaa, 0x31, 0xed, 0x02, 0x51, 0x10, 0x32, 0x52, 0x55, + 0x55, 0x95, 0x2c, 0xdb, 0x19, 0x8c, 0x45, 0x26, 0x63, 0x3c, 0xe3, 0x2a, 0xe6, 0x17, 0x74, 0xd9, + 0x65, 0x97, 0xf4, 0x1f, 0x74, 0xc1, 0xae, 0x7f, 0xa0, 0x4b, 0xc4, 0xaa, 0x2b, 0xb7, 0x0a, 0x9b, + 0xaa, 0xab, 0x2a, 0xcb, 0xae, 0x2a, 0xcf, 0x38, 0x21, 0x41, 0xb4, 0x1b, 0x7b, 0xee, 0x39, 0xf7, + 0xdc, 0x7b, 0x7c, 0xaf, 0xc6, 0x60, 0xdd, 0x25, 0x14, 0x13, 0xda, 0xb0, 0x23, 0x76, 0xc2, 0x1f, + 0x7a, 0x10, 0x12, 0x46, 0xe4, 0xa2, 0xc0, 0xf5, 0x14, 0xaa, 0x94, 0x45, 0x60, 0x71, 0xaa, 0x91, + 0x31, 0x3c, 0xa8, 0x94, 0x3c, 0xe2, 0x11, 0x81, 0xa7, 0xa7, 0x0c, 0x2d, 0x7b, 0x84, 0x78, 0x5d, + 0xd4, 0xe0, 0x91, 0x13, 0x1d, 0x37, 0xec, 0x5e, 0x2c, 0x28, 0xed, 0xe3, 0x0c, 0x28, 0x1a, 0x36, + 0x45, 0x6d, 0xd7, 0x25, 0x51, 0x8f, 0xc9, 0x7b, 0x60, 0xce, 0xee, 0x74, 0x42, 0x44, 0xa9, 0x22, + 0x55, 0xa5, 0xda, 0xa2, 0xb1, 0xf9, 0x2b, 0x81, 0x75, 0xcf, 0x67, 0x27, 0x91, 0xa3, 0xbb, 0x04, + 0x67, 0xed, 0xb2, 0x57, 0x9d, 0x76, 0x4e, 0x1b, 0x2c, 0x0e, 0x10, 0xd5, 0xdb, 0xae, 0xdb, 0x16, + 0x42, 0x73, 0x54, 0x41, 0x7e, 0x0d, 0xe6, 0x82, 0xc8, 0xb1, 0x4e, 0x51, 0xac, 0xcc, 0x54, 0xa5, + 0x5a, 0xb1, 0x59, 0xd2, 0x85, 0x13, 0x7d, 0xe4, 0x44, 0x6f, 0xf7, 0x62, 0xa3, 0xfe, 0x23, 0x81, + 0xa5, 0x20, 0x72, 0xba, 0xbe, 0x9b, 0xe6, 0x3e, 0x20, 0xd8, 0x67, 0x08, 0x07, 0x2c, 0x1e, 0x26, + 0x70, 0x25, 0xb6, 0x71, 0xb7, 0xa5, 0xdd, 0xb2, 0x9a, 0x39, 0x1b, 0x44, 0xce, 0x1e, 0x8a, 0xe5, + 0x27, 0x60, 0xd9, 0x16, 0xae, 0xad, 0x5e, 0x84, 0x1d, 0x14, 0x2a, 0xf9, 0xaa, 0x54, 0x2b, 0x18, + 0xe5, 0x61, 0x02, 0xd7, 0x84, 0x6c, 0x9a, 0xd7, 0xcc, 0xa5, 0x0c, 0x38, 0xe0, 0xb1, 0x5c, 0x01, + 0xf3, 0x14, 0x9d, 0x45, 0xa8, 0xe7, 0x22, 0xa5, 0x90, 0x6a, 0xcd, 0x71, 0xdc, 0x52, 0xde, 0x5e, + 0xc0, 0xdc, 0xfb, 0x0b, 0x98, 0xfb, 0xf9, 0x01, 0xe6, 0xae, 0x2f, 0xeb, 0xf3, 0xd9, 0x84, 0x76, + 0xb5, 0x4f, 0x12, 0x58, 0xda, 0x27, 0x9d, 0xa8, 0x3b, 0x1e, 0xda, 0x4b, 0xb0, 0xe8, 0xd8, 0x14, + 0x59, 0x59, 0x75, 0x3e, 0xb9, 0x62, 0x53, 0xd1, 0x27, 0x96, 0xa6, 0x4f, 0x0c, 0xd9, 0xf8, 0xf7, + 0x2a, 0x81, 0xd2, 0x30, 0x81, 0xab, 0xc2, 0xe5, 0xa4, 0x56, 0x33, 0x8b, 0xce, 0xc4, 0x3a, 0x64, + 0x50, 0xe8, 0xd9, 0x18, 0xf1, 0xf1, 0x2d, 0x98, 0xfc, 0x2c, 0x57, 0x41, 0x31, 0x40, 0x21, 0xf6, + 0x29, 0xf5, 0x49, 0x8f, 0x2a, 0xf9, 0x6a, 0xbe, 0xb6, 0x60, 0x4e, 0x42, 0xad, 0xca, 0xc8, 0xfb, + 0xf5, 0x65, 0x7d, 0x79, 0xca, 0xea, 0xae, 0xf6, 0x35, 0x0f, 0x66, 0x0f, 0xed, 0xd0, 0xc6, 0x54, + 0x3e, 0x00, 0xab, 0xd8, 0xee, 0x5b, 0x18, 0x61, 0x62, 0xb9, 0x27, 0x76, 0x68, 0xbb, 0x0c, 0x85, + 0x62, 0xef, 0x05, 0x43, 0x1d, 0x26, 0xb0, 0x22, 0xfc, 0xdd, 0x93, 0xa4, 0x99, 0x2b, 0xd8, 0xee, + 0xef, 0x23, 0x4c, 0x76, 0xc6, 0x98, 0xbc, 0x0d, 0x16, 0x59, 0xdf, 0xa2, 0xbe, 0x67, 0x75, 0x7d, + 0xec, 0x33, 0x6e, 0xba, 0x60, 0x6c, 0xdc, 0x7e, 0xe8, 0x24, 0xab, 0x99, 0x80, 0xf5, 0x8f, 0x7c, + 0xef, 0x79, 0x1a, 0xc8, 0x26, 0x58, 0xe3, 0xe4, 0x39, 0xb2, 0x5c, 0x42, 0x99, 0x15, 0xa0, 0xd0, + 0x72, 0x62, 0x86, 0xb2, 0x95, 0x56, 0x87, 0x09, 0xfc, 0x6f, 0xa2, 0xc6, 0xdd, 0x34, 0xcd, 0x5c, + 0x49, 0x8b, 0x9d, 0xa3, 0x1d, 0x42, 0xd9, 0x21, 0x0a, 0x8d, 0x98, 0x21, 0xf9, 0x0c, 0x6c, 0xa4, + 0xdd, 0xde, 0xa0, 0xd0, 0x3f, 0x8e, 0x45, 0x3e, 0xea, 0x34, 0xb7, 0xb6, 0x36, 0xb7, 0xc5, 0xb2, + 0x8d, 0xd6, 0x20, 0x81, 0xa5, 0x23, 0xdf, 0x7b, 0xc1, 0x33, 0x52, 0xe9, 0xb3, 0xa7, 0x9c, 0x1f, + 0x26, 0x50, 0x15, 0xdd, 0xfe, 0x50, 0x40, 0x33, 0x4b, 0x74, 0x4a, 0x27, 0x60, 0x39, 0x06, 0xe5, + 0xbb, 0x0a, 0x8a, 0xdc, 0xa0, 0xb9, 0xf5, 0xe8, 0x74, 0x53, 0xf9, 0x87, 0x37, 0x7d, 0x3c, 0x48, + 0xe0, 0xfa, 0x54, 0xd3, 0xa3, 0x51, 0xc6, 0x30, 0x81, 0xd5, 0xfb, 0xdb, 0x8e, 0x8b, 0x68, 0xe6, + 0x3a, 0xbd, 0x57, 0xdb, 0x9a, 0x4f, 0xf7, 0xfd, 0xfd, 0x02, 0x4a, 0xc6, 0xce, 0xe7, 0x81, 0x2a, + 0x5d, 0x0d, 0x54, 0xe9, 0xdb, 0x40, 0x95, 0xde, 0xdd, 0xa8, 0xb9, 0xab, 0x1b, 0x35, 0xf7, 0xe5, + 0x46, 0xcd, 0xbd, 0xfa, 0xff, 0xaf, 0xf7, 0xb8, 0x2f, 0xfe, 0x3a, 0xfc, 0x3a, 0x3b, 0xb3, 0xfc, + 0x86, 0x3e, 0xfc, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x57, 0x6d, 0x77, 0x2d, 0x91, 0x04, 0x00, 0x00, } func (this *Params) Equal(that interface{}) bool { @@ -595,7 +595,7 @@ func (m *BaseAccount) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.PubKey == nil { - m.PubKey = &types.PublicKey{} + m.PubKey = &types.Any{} } if err := m.PubKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 44b497096f73..93226ea42ae4 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -1569,612 +1569,615 @@ func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_ func StakingDescription() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { d := &github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet{} var gzipped = []byte{ - // 9675 bytes of a gzipped FileDescriptorSet + // 9722 bytes of a gzipped FileDescriptorSet 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x7b, 0x70, 0x24, 0xc7, - 0x79, 0x1f, 0xf6, 0x81, 0xc5, 0xee, 0xb7, 0x8b, 0xc5, 0xa2, 0x81, 0xbb, 0xc3, 0x2d, 0xc9, 0xdb, - 0xe3, 0x1c, 0x1f, 0x38, 0x3e, 0x70, 0xd4, 0x89, 0x0f, 0x71, 0x8f, 0x22, 0x85, 0x05, 0x70, 0x77, - 0x20, 0x81, 0x3b, 0x70, 0x00, 0x1c, 0x29, 0xca, 0xf6, 0x78, 0x30, 0xdb, 0x58, 0x0c, 0xb1, 0x3b, - 0xb3, 0x9c, 0x99, 0xbd, 0x03, 0x58, 0x4a, 0x15, 0x53, 0x96, 0xf5, 0x70, 0x64, 0x4b, 0x51, 0x6c, - 0x87, 0x96, 0x25, 0x99, 0x52, 0x2a, 0x91, 0xa3, 0x24, 0x7e, 0x24, 0x8a, 0x1e, 0x76, 0xfe, 0x50, - 0x55, 0x1e, 0x56, 0xaa, 0x5c, 0x29, 0x29, 0x71, 0x52, 0xae, 0x54, 0x0a, 0xb6, 0x48, 0x55, 0x59, - 0x51, 0x98, 0x44, 0xb9, 0xd0, 0x2e, 0x97, 0xf4, 0x47, 0x52, 0xfd, 0x9a, 0xd7, 0xce, 0xee, 0x0c, - 0x8e, 0x47, 0x8a, 0x2e, 0xe9, 0x2f, 0x6c, 0xf7, 0x7c, 0xdf, 0xaf, 0xbb, 0xbf, 0xfe, 0xfa, 0xfb, - 0xbe, 0xfe, 0xba, 0x67, 0x00, 0xbf, 0x79, 0x0e, 0x4e, 0xb6, 0x4c, 0xb3, 0xd5, 0xc6, 0x67, 0xba, - 0x96, 0xe9, 0x98, 0x5b, 0xbd, 0xed, 0x33, 0x4d, 0x6c, 0x6b, 0x96, 0xde, 0x75, 0x4c, 0x6b, 0x8e, - 0xd6, 0xa1, 0x09, 0x46, 0x31, 0x27, 0x28, 0xa4, 0x55, 0x98, 0x3c, 0xaf, 0xb7, 0xf1, 0xa2, 0x4b, - 0xb8, 0x8e, 0x1d, 0xf4, 0x1e, 0xc8, 0x6e, 0xeb, 0x6d, 0x3c, 0x93, 0x3a, 0x99, 0x99, 0x2d, 0x9e, - 0xbd, 0x63, 0x2e, 0xc4, 0x34, 0x17, 0xe4, 0x58, 0x23, 0xd5, 0x32, 0xe5, 0x90, 0xbe, 0x9b, 0x85, - 0xa9, 0x88, 0xa7, 0x08, 0x41, 0xd6, 0x50, 0x3b, 0x04, 0x31, 0x35, 0x5b, 0x90, 0xe9, 0x6f, 0x34, - 0x03, 0x63, 0x5d, 0x55, 0xdb, 0x55, 0x5b, 0x78, 0x26, 0x4d, 0xab, 0x45, 0x11, 0x9d, 0x00, 0x68, - 0xe2, 0x2e, 0x36, 0x9a, 0xd8, 0xd0, 0xf6, 0x67, 0x32, 0x27, 0x33, 0xb3, 0x05, 0xd9, 0x57, 0x83, - 0xee, 0x85, 0xc9, 0x6e, 0x6f, 0xab, 0xad, 0x6b, 0x8a, 0x8f, 0x0c, 0x4e, 0x66, 0x66, 0x47, 0xe5, - 0x0a, 0x7b, 0xb0, 0xe8, 0x11, 0xdf, 0x0d, 0x13, 0xd7, 0xb0, 0xba, 0xeb, 0x27, 0x2d, 0x52, 0xd2, - 0x32, 0xa9, 0xf6, 0x11, 0x2e, 0x40, 0xa9, 0x83, 0x6d, 0x5b, 0x6d, 0x61, 0xc5, 0xd9, 0xef, 0xe2, - 0x99, 0x2c, 0x1d, 0xfd, 0xc9, 0xbe, 0xd1, 0x87, 0x47, 0x5e, 0xe4, 0x5c, 0x1b, 0xfb, 0x5d, 0x8c, - 0xe6, 0xa1, 0x80, 0x8d, 0x5e, 0x87, 0x21, 0x8c, 0x0e, 0x90, 0xdf, 0x92, 0xd1, 0xeb, 0x84, 0x51, - 0xf2, 0x84, 0x8d, 0x43, 0x8c, 0xd9, 0xd8, 0xba, 0xaa, 0x6b, 0x78, 0x26, 0x47, 0x01, 0xee, 0xee, - 0x03, 0x58, 0x67, 0xcf, 0xc3, 0x18, 0x82, 0x0f, 0x2d, 0x40, 0x01, 0xef, 0x39, 0xd8, 0xb0, 0x75, - 0xd3, 0x98, 0x19, 0xa3, 0x20, 0x77, 0x46, 0xcc, 0x22, 0x6e, 0x37, 0xc3, 0x10, 0x1e, 0x1f, 0x7a, - 0x18, 0xc6, 0xcc, 0xae, 0xa3, 0x9b, 0x86, 0x3d, 0x93, 0x3f, 0x99, 0x9a, 0x2d, 0x9e, 0xbd, 0x35, - 0x52, 0x11, 0x2e, 0x33, 0x1a, 0x59, 0x10, 0xa3, 0x65, 0xa8, 0xd8, 0x66, 0xcf, 0xd2, 0xb0, 0xa2, - 0x99, 0x4d, 0xac, 0xe8, 0xc6, 0xb6, 0x39, 0x53, 0xa0, 0x00, 0xb5, 0xfe, 0x81, 0x50, 0xc2, 0x05, - 0xb3, 0x89, 0x97, 0x8d, 0x6d, 0x53, 0x2e, 0xdb, 0x81, 0x32, 0x3a, 0x0a, 0x39, 0x7b, 0xdf, 0x70, - 0xd4, 0xbd, 0x99, 0x12, 0xd5, 0x10, 0x5e, 0x92, 0xbe, 0x9e, 0x83, 0x89, 0x24, 0x2a, 0x76, 0x0e, - 0x46, 0xb7, 0xc9, 0x28, 0x67, 0xd2, 0x87, 0x91, 0x01, 0xe3, 0x09, 0x0a, 0x31, 0x77, 0x83, 0x42, - 0x9c, 0x87, 0xa2, 0x81, 0x6d, 0x07, 0x37, 0x99, 0x46, 0x64, 0x12, 0xea, 0x14, 0x30, 0xa6, 0x7e, - 0x95, 0xca, 0xde, 0x90, 0x4a, 0x3d, 0x0b, 0x13, 0x6e, 0x97, 0x14, 0x4b, 0x35, 0x5a, 0x42, 0x37, - 0xcf, 0xc4, 0xf5, 0x64, 0x6e, 0x49, 0xf0, 0xc9, 0x84, 0x4d, 0x2e, 0xe3, 0x40, 0x19, 0x2d, 0x02, - 0x98, 0x06, 0x36, 0xb7, 0x95, 0x26, 0xd6, 0xda, 0x33, 0xf9, 0x01, 0x52, 0xba, 0x4c, 0x48, 0xfa, - 0xa4, 0x64, 0xb2, 0x5a, 0xad, 0x8d, 0x1e, 0xf5, 0x54, 0x6d, 0x6c, 0x80, 0xa6, 0xac, 0xb2, 0x45, - 0xd6, 0xa7, 0x6d, 0x9b, 0x50, 0xb6, 0x30, 0xd1, 0x7b, 0xdc, 0xe4, 0x23, 0x2b, 0xd0, 0x4e, 0xcc, - 0xc5, 0x8e, 0x4c, 0xe6, 0x6c, 0x6c, 0x60, 0xe3, 0x96, 0xbf, 0x88, 0x4e, 0x81, 0x5b, 0xa1, 0x50, - 0xb5, 0x02, 0x6a, 0x85, 0x4a, 0xa2, 0xf2, 0x92, 0xda, 0xc1, 0xd5, 0x17, 0xa1, 0x1c, 0x14, 0x0f, - 0x9a, 0x86, 0x51, 0xdb, 0x51, 0x2d, 0x87, 0x6a, 0xe1, 0xa8, 0xcc, 0x0a, 0xa8, 0x02, 0x19, 0x6c, - 0x34, 0xa9, 0x95, 0x1b, 0x95, 0xc9, 0x4f, 0xf4, 0x3e, 0x6f, 0xc0, 0x19, 0x3a, 0xe0, 0xbb, 0xfa, - 0x67, 0x34, 0x80, 0x1c, 0x1e, 0x77, 0xf5, 0x11, 0x18, 0x0f, 0x0c, 0x20, 0x69, 0xd3, 0xd2, 0x07, - 0xe1, 0x48, 0x24, 0x34, 0x7a, 0x16, 0xa6, 0x7b, 0x86, 0x6e, 0x38, 0xd8, 0xea, 0x5a, 0x98, 0x68, - 0x2c, 0x6b, 0x6a, 0xe6, 0x2f, 0xc6, 0x06, 0xe8, 0xdc, 0xa6, 0x9f, 0x9a, 0xa1, 0xc8, 0x53, 0xbd, - 0xfe, 0xca, 0x7b, 0x0a, 0xf9, 0xef, 0x8d, 0x55, 0x5e, 0x7a, 0xe9, 0xa5, 0x97, 0xd2, 0xd2, 0xcb, - 0x39, 0x98, 0x8e, 0x5a, 0x33, 0x91, 0xcb, 0xf7, 0x28, 0xe4, 0x8c, 0x5e, 0x67, 0x0b, 0x5b, 0x54, - 0x48, 0xa3, 0x32, 0x2f, 0xa1, 0x79, 0x18, 0x6d, 0xab, 0x5b, 0xb8, 0x3d, 0x93, 0x3d, 0x99, 0x9a, - 0x2d, 0x9f, 0xbd, 0x37, 0xd1, 0xaa, 0x9c, 0x5b, 0x21, 0x2c, 0x32, 0xe3, 0x44, 0x8f, 0x43, 0x96, - 0x9b, 0x68, 0x82, 0x70, 0x4f, 0x32, 0x04, 0xb2, 0x96, 0x64, 0xca, 0x87, 0x6e, 0x81, 0x02, 0xf9, - 0xcb, 0x74, 0x23, 0x47, 0xfb, 0x9c, 0x27, 0x15, 0x44, 0x2f, 0x50, 0x15, 0xf2, 0x74, 0x99, 0x34, - 0xb1, 0x70, 0x6d, 0x6e, 0x99, 0x28, 0x56, 0x13, 0x6f, 0xab, 0xbd, 0xb6, 0xa3, 0x5c, 0x55, 0xdb, - 0x3d, 0x4c, 0x15, 0xbe, 0x20, 0x97, 0x78, 0xe5, 0x15, 0x52, 0x87, 0x6a, 0x50, 0x64, 0xab, 0x4a, - 0x37, 0x9a, 0x78, 0x8f, 0x5a, 0xcf, 0x51, 0x99, 0x2d, 0xb4, 0x65, 0x52, 0x43, 0x9a, 0x7f, 0xde, - 0x36, 0x0d, 0xa1, 0x9a, 0xb4, 0x09, 0x52, 0x41, 0x9b, 0x7f, 0x24, 0x6c, 0xb8, 0x6f, 0x8b, 0x1e, - 0x5e, 0x58, 0xa7, 0xa4, 0xaf, 0xa4, 0x21, 0x4b, 0xed, 0xc5, 0x04, 0x14, 0x37, 0xde, 0xbf, 0xb6, - 0xa4, 0x2c, 0x5e, 0xde, 0x6c, 0xac, 0x2c, 0x55, 0x52, 0xa8, 0x0c, 0x40, 0x2b, 0xce, 0xaf, 0x5c, - 0x9e, 0xdf, 0xa8, 0xa4, 0xdd, 0xf2, 0xf2, 0xa5, 0x8d, 0x87, 0x1f, 0xac, 0x64, 0x5c, 0x86, 0x4d, - 0x56, 0x91, 0xf5, 0x13, 0xbc, 0xfb, 0x6c, 0x65, 0x14, 0x55, 0xa0, 0xc4, 0x00, 0x96, 0x9f, 0x5d, - 0x5a, 0x7c, 0xf8, 0xc1, 0x4a, 0x2e, 0x58, 0xf3, 0xee, 0xb3, 0x95, 0x31, 0x34, 0x0e, 0x05, 0x5a, - 0xd3, 0xb8, 0x7c, 0x79, 0xa5, 0x92, 0x77, 0x31, 0xd7, 0x37, 0xe4, 0xe5, 0x4b, 0x17, 0x2a, 0x05, - 0x17, 0xf3, 0x82, 0x7c, 0x79, 0x73, 0xad, 0x02, 0x2e, 0xc2, 0xea, 0xd2, 0xfa, 0xfa, 0xfc, 0x85, - 0xa5, 0x4a, 0xd1, 0xa5, 0x68, 0xbc, 0x7f, 0x63, 0x69, 0xbd, 0x52, 0x0a, 0x74, 0xeb, 0xdd, 0x67, - 0x2b, 0xe3, 0x6e, 0x13, 0x4b, 0x97, 0x36, 0x57, 0x2b, 0x65, 0x34, 0x09, 0xe3, 0xac, 0x09, 0xd1, - 0x89, 0x89, 0x50, 0xd5, 0xc3, 0x0f, 0x56, 0x2a, 0x5e, 0x47, 0x18, 0xca, 0x64, 0xa0, 0xe2, 0xe1, - 0x07, 0x2b, 0x48, 0x5a, 0x80, 0x51, 0xaa, 0x5d, 0x08, 0x41, 0x79, 0x65, 0xbe, 0xb1, 0xb4, 0xa2, - 0x5c, 0x5e, 0xdb, 0x58, 0xbe, 0x7c, 0x69, 0x7e, 0xa5, 0x92, 0xf2, 0xea, 0xe4, 0xa5, 0xa7, 0x37, - 0x97, 0xe5, 0xa5, 0xc5, 0x4a, 0xda, 0x5f, 0xb7, 0xb6, 0x34, 0xbf, 0xb1, 0xb4, 0x58, 0xc9, 0x48, - 0x1a, 0x4c, 0x47, 0xd9, 0xc9, 0xc8, 0x95, 0xe1, 0x9b, 0xe2, 0xf4, 0x80, 0x29, 0xa6, 0x58, 0x7d, - 0x53, 0xfc, 0x5a, 0x1a, 0xa6, 0x22, 0x7c, 0x45, 0x64, 0x23, 0x4f, 0xc0, 0x28, 0x53, 0x51, 0xe6, - 0x3d, 0x4f, 0x47, 0x3a, 0x1d, 0xaa, 0xb0, 0x7d, 0x1e, 0x94, 0xf2, 0xf9, 0x23, 0x88, 0xcc, 0x80, - 0x08, 0x82, 0x40, 0xf4, 0xd9, 0xf4, 0x9f, 0xed, 0xb3, 0xe9, 0xcc, 0xed, 0x3d, 0x9c, 0xc4, 0xed, - 0xd1, 0xba, 0xc3, 0xd9, 0xf6, 0xd1, 0x08, 0xdb, 0x7e, 0x0e, 0x26, 0xfb, 0x80, 0x12, 0xdb, 0xd8, - 0x5f, 0x48, 0xc1, 0xcc, 0x20, 0xe1, 0xc4, 0x58, 0xba, 0x74, 0xc0, 0xd2, 0x9d, 0x0b, 0x4b, 0xf0, - 0xf6, 0xc1, 0x93, 0xd0, 0x37, 0xd7, 0x5f, 0x4c, 0xc1, 0xd1, 0xe8, 0x48, 0x31, 0xb2, 0x0f, 0x8f, - 0x43, 0xae, 0x83, 0x9d, 0x1d, 0x53, 0x44, 0x4b, 0x77, 0x45, 0xf8, 0x60, 0xf2, 0x38, 0x3c, 0xd9, - 0x9c, 0xcb, 0xef, 0xc4, 0x33, 0x83, 0xc2, 0x3d, 0xd6, 0x9b, 0xbe, 0x9e, 0x7e, 0x2c, 0x0d, 0x47, - 0x22, 0xc1, 0x23, 0x3b, 0x7a, 0x1b, 0x80, 0x6e, 0x74, 0x7b, 0x0e, 0x8b, 0x88, 0x98, 0x81, 0x2d, - 0xd0, 0x1a, 0x6a, 0xbc, 0x88, 0xf1, 0xec, 0x39, 0xee, 0xf3, 0x0c, 0x7d, 0x0e, 0xac, 0x8a, 0x12, - 0xbc, 0xc7, 0xeb, 0x68, 0x96, 0x76, 0xf4, 0xc4, 0x80, 0x91, 0xf6, 0x29, 0xe6, 0x03, 0x50, 0xd1, - 0xda, 0x3a, 0x36, 0x1c, 0xc5, 0x76, 0x2c, 0xac, 0x76, 0x74, 0xa3, 0x45, 0x3d, 0x48, 0xbe, 0x3e, - 0xba, 0xad, 0xb6, 0x6d, 0x2c, 0x4f, 0xb0, 0xc7, 0xeb, 0xe2, 0x29, 0xe1, 0xa0, 0x0a, 0x64, 0xf9, - 0x38, 0x72, 0x01, 0x0e, 0xf6, 0xd8, 0xe5, 0x90, 0x3e, 0x55, 0x80, 0xa2, 0x2f, 0xae, 0x46, 0xb7, - 0x43, 0xe9, 0x79, 0xf5, 0xaa, 0xaa, 0x88, 0xbd, 0x12, 0x93, 0x44, 0x91, 0xd4, 0xad, 0xf1, 0xfd, - 0xd2, 0x03, 0x30, 0x4d, 0x49, 0xcc, 0x9e, 0x83, 0x2d, 0x45, 0x6b, 0xab, 0xb6, 0x4d, 0x85, 0x96, - 0xa7, 0xa4, 0x88, 0x3c, 0xbb, 0x4c, 0x1e, 0x2d, 0x88, 0x27, 0xe8, 0x21, 0x98, 0xa2, 0x1c, 0x9d, - 0x5e, 0xdb, 0xd1, 0xbb, 0x6d, 0xac, 0x90, 0xdd, 0x9b, 0x4d, 0x3d, 0x89, 0xdb, 0xb3, 0x49, 0x42, - 0xb1, 0xca, 0x09, 0x48, 0x8f, 0x6c, 0xb4, 0x08, 0xb7, 0x51, 0xb6, 0x16, 0x36, 0xb0, 0xa5, 0x3a, - 0x58, 0xc1, 0x2f, 0xf4, 0xd4, 0xb6, 0xad, 0xa8, 0x46, 0x53, 0xd9, 0x51, 0xed, 0x9d, 0x99, 0x69, - 0x02, 0xd0, 0x48, 0xcf, 0xa4, 0xe4, 0xe3, 0x84, 0xf0, 0x02, 0xa7, 0x5b, 0xa2, 0x64, 0xf3, 0x46, - 0xf3, 0xa2, 0x6a, 0xef, 0xa0, 0x3a, 0x1c, 0xa5, 0x28, 0xb6, 0x63, 0xe9, 0x46, 0x4b, 0xd1, 0x76, - 0xb0, 0xb6, 0xab, 0xf4, 0x9c, 0xed, 0xf7, 0xcc, 0xdc, 0xe2, 0x6f, 0x9f, 0xf6, 0x70, 0x9d, 0xd2, - 0x2c, 0x10, 0x92, 0x4d, 0x67, 0xfb, 0x3d, 0x68, 0x1d, 0x4a, 0x64, 0x32, 0x3a, 0xfa, 0x8b, 0x58, - 0xd9, 0x36, 0x2d, 0xea, 0x1a, 0xcb, 0x11, 0xa6, 0xc9, 0x27, 0xc1, 0xb9, 0xcb, 0x9c, 0x61, 0xd5, - 0x6c, 0xe2, 0xfa, 0xe8, 0xfa, 0xda, 0xd2, 0xd2, 0xa2, 0x5c, 0x14, 0x28, 0xe7, 0x4d, 0x8b, 0x28, - 0x54, 0xcb, 0x74, 0x05, 0x5c, 0x64, 0x0a, 0xd5, 0x32, 0x85, 0x78, 0x1f, 0x82, 0x29, 0x4d, 0x63, - 0x63, 0xd6, 0x35, 0x85, 0xef, 0xb1, 0xec, 0x99, 0x4a, 0x40, 0x58, 0x9a, 0x76, 0x81, 0x11, 0x70, - 0x1d, 0xb7, 0xd1, 0xa3, 0x70, 0xc4, 0x13, 0x96, 0x9f, 0x71, 0xb2, 0x6f, 0x94, 0x61, 0xd6, 0x87, - 0x60, 0xaa, 0xbb, 0xdf, 0xcf, 0x88, 0x02, 0x2d, 0x76, 0xf7, 0xc3, 0x6c, 0x8f, 0xc0, 0x74, 0x77, - 0xa7, 0xdb, 0xcf, 0x77, 0x8f, 0x9f, 0x0f, 0x75, 0x77, 0xba, 0x61, 0xc6, 0x3b, 0xe9, 0x86, 0xdb, - 0xc2, 0x9a, 0xea, 0xe0, 0xe6, 0xcc, 0x31, 0x3f, 0xb9, 0xef, 0x01, 0x3a, 0x03, 0x15, 0x4d, 0x53, - 0xb0, 0xa1, 0x6e, 0xb5, 0xb1, 0xa2, 0x5a, 0xd8, 0x50, 0xed, 0x99, 0x9a, 0x9f, 0xb8, 0xac, 0x69, - 0x4b, 0xf4, 0xe9, 0x3c, 0x7d, 0x88, 0xee, 0x81, 0x49, 0x73, 0xeb, 0x79, 0x8d, 0xa9, 0xa4, 0xd2, - 0xb5, 0xf0, 0xb6, 0xbe, 0x37, 0x73, 0x07, 0x95, 0xef, 0x04, 0x79, 0x40, 0x15, 0x72, 0x8d, 0x56, - 0xa3, 0xd3, 0x50, 0xd1, 0xec, 0x1d, 0xd5, 0xea, 0x52, 0x9b, 0x6c, 0x77, 0x55, 0x0d, 0xcf, 0xdc, - 0xc9, 0x48, 0x59, 0xfd, 0x25, 0x51, 0x4d, 0x96, 0x84, 0x7d, 0x4d, 0xdf, 0x76, 0x04, 0xe2, 0xdd, - 0x6c, 0x49, 0xd0, 0x3a, 0x8e, 0x36, 0x0b, 0x15, 0x22, 0x8a, 0x40, 0xc3, 0xb3, 0x94, 0xac, 0xdc, - 0xdd, 0xe9, 0xfa, 0xdb, 0x3d, 0x05, 0xe3, 0x84, 0xd2, 0x6b, 0xf4, 0x34, 0x0b, 0xc8, 0xba, 0x3b, - 0xbe, 0x16, 0x1f, 0x84, 0xa3, 0x84, 0xa8, 0x83, 0x1d, 0xb5, 0xa9, 0x3a, 0xaa, 0x8f, 0xfa, 0x3e, - 0x4a, 0x4d, 0xe4, 0xbe, 0xca, 0x1f, 0x06, 0xfa, 0x69, 0xf5, 0xb6, 0xf6, 0x5d, 0xcd, 0xba, 0x9f, - 0xf5, 0x93, 0xd4, 0x09, 0xdd, 0x7a, 0xcb, 0x82, 0x6e, 0xa9, 0x0e, 0x25, 0xbf, 0xe2, 0xa3, 0x02, - 0x30, 0xd5, 0xaf, 0xa4, 0x48, 0x14, 0xb4, 0x70, 0x79, 0x91, 0xc4, 0x2f, 0xcf, 0x2d, 0x55, 0xd2, - 0x24, 0x8e, 0x5a, 0x59, 0xde, 0x58, 0x52, 0xe4, 0xcd, 0x4b, 0x1b, 0xcb, 0xab, 0x4b, 0x95, 0x8c, - 0x2f, 0x60, 0x7f, 0x32, 0x9b, 0xbf, 0xab, 0x72, 0xb7, 0xf4, 0xed, 0x34, 0x94, 0x83, 0x3b, 0x30, - 0xf4, 0x18, 0x1c, 0x13, 0xe9, 0x12, 0x1b, 0x3b, 0xca, 0x35, 0xdd, 0xa2, 0x2b, 0xb2, 0xa3, 0x32, - 0xef, 0xe8, 0xea, 0xc4, 0x34, 0xa7, 0x5a, 0xc7, 0xce, 0x33, 0xba, 0x45, 0xd6, 0x5b, 0x47, 0x75, - 0xd0, 0x0a, 0xd4, 0x0c, 0x53, 0xb1, 0x1d, 0xd5, 0x68, 0xaa, 0x56, 0x53, 0xf1, 0x12, 0x55, 0x8a, - 0xaa, 0x69, 0xd8, 0xb6, 0x4d, 0xe6, 0x09, 0x5d, 0x94, 0x5b, 0x0d, 0x73, 0x9d, 0x13, 0x7b, 0x2e, - 0x62, 0x9e, 0x93, 0x86, 0xf4, 0x37, 0x33, 0x48, 0x7f, 0x6f, 0x81, 0x42, 0x47, 0xed, 0x2a, 0xd8, - 0x70, 0xac, 0x7d, 0x1a, 0x77, 0xe7, 0xe5, 0x7c, 0x47, 0xed, 0x2e, 0x91, 0xf2, 0xdb, 0xb2, 0xfd, - 0x79, 0x32, 0x9b, 0xcf, 0x57, 0x0a, 0x4f, 0x66, 0xf3, 0x85, 0x0a, 0x48, 0xaf, 0x66, 0xa0, 0xe4, - 0x8f, 0xc3, 0xc9, 0xb6, 0x46, 0xa3, 0x2e, 0x2b, 0x45, 0x8d, 0xda, 0xa9, 0xa1, 0x51, 0xfb, 0xdc, - 0x02, 0xf1, 0x65, 0xf5, 0x1c, 0x8b, 0x8e, 0x65, 0xc6, 0x49, 0xe2, 0x08, 0xa2, 0x6c, 0x98, 0x45, - 0x23, 0x79, 0x99, 0x97, 0xd0, 0x05, 0xc8, 0x3d, 0x6f, 0x53, 0xec, 0x1c, 0xc5, 0xbe, 0x63, 0x38, - 0xf6, 0x93, 0xeb, 0x14, 0xbc, 0xf0, 0xe4, 0xba, 0x72, 0xe9, 0xb2, 0xbc, 0x3a, 0xbf, 0x22, 0x73, - 0x76, 0x74, 0x1c, 0xb2, 0x6d, 0xf5, 0xc5, 0xfd, 0xa0, 0xd7, 0xa3, 0x55, 0x49, 0x27, 0xe1, 0x38, - 0x64, 0xaf, 0x61, 0x75, 0x37, 0xe8, 0x6b, 0x68, 0xd5, 0x5b, 0xb8, 0x18, 0xce, 0xc0, 0x28, 0x95, - 0x17, 0x02, 0xe0, 0x12, 0xab, 0x8c, 0xa0, 0x3c, 0x64, 0x17, 0x2e, 0xcb, 0x64, 0x41, 0x54, 0xa0, - 0xc4, 0x6a, 0x95, 0xb5, 0xe5, 0xa5, 0x85, 0xa5, 0x4a, 0x5a, 0x7a, 0x08, 0x72, 0x4c, 0x08, 0x64, - 0xb1, 0xb8, 0x62, 0xa8, 0x8c, 0xf0, 0x22, 0xc7, 0x48, 0x89, 0xa7, 0x9b, 0xab, 0x8d, 0x25, 0xb9, - 0x92, 0x0e, 0x4e, 0x75, 0xb6, 0x32, 0x2a, 0xd9, 0x50, 0xf2, 0x07, 0xe2, 0x6f, 0xcf, 0x26, 0xfb, - 0x1b, 0x29, 0x28, 0xfa, 0x02, 0x6b, 0x12, 0x11, 0xa9, 0xed, 0xb6, 0x79, 0x4d, 0x51, 0xdb, 0xba, - 0x6a, 0x73, 0xd5, 0x00, 0x5a, 0x35, 0x4f, 0x6a, 0x92, 0x4e, 0xdd, 0xdb, 0xb4, 0x44, 0x46, 0x2b, - 0x39, 0xe9, 0x73, 0x29, 0xa8, 0x84, 0x23, 0xdb, 0x50, 0x37, 0x53, 0x3f, 0xce, 0x6e, 0x4a, 0x9f, - 0x49, 0x41, 0x39, 0x18, 0xce, 0x86, 0xba, 0x77, 0xfb, 0x8f, 0xb5, 0x7b, 0x7f, 0x9e, 0x86, 0xf1, - 0x40, 0x10, 0x9b, 0xb4, 0x77, 0x2f, 0xc0, 0xa4, 0xde, 0xc4, 0x9d, 0xae, 0xe9, 0x60, 0x43, 0xdb, - 0x57, 0xda, 0xf8, 0x2a, 0x6e, 0xcf, 0x48, 0xd4, 0x68, 0x9c, 0x19, 0x1e, 0x26, 0xcf, 0x2d, 0x7b, - 0x7c, 0x2b, 0x84, 0xad, 0x3e, 0xb5, 0xbc, 0xb8, 0xb4, 0xba, 0x76, 0x79, 0x63, 0xe9, 0xd2, 0xc2, - 0xfb, 0x95, 0xcd, 0x4b, 0x4f, 0x5d, 0xba, 0xfc, 0xcc, 0x25, 0xb9, 0xa2, 0x87, 0xc8, 0xde, 0xc2, - 0x65, 0xbf, 0x06, 0x95, 0x70, 0xa7, 0xd0, 0x31, 0x88, 0xea, 0x56, 0x65, 0x04, 0x4d, 0xc1, 0xc4, - 0xa5, 0xcb, 0xca, 0xfa, 0xf2, 0xe2, 0x92, 0xb2, 0x74, 0xfe, 0xfc, 0xd2, 0xc2, 0xc6, 0x3a, 0x4b, - 0x7c, 0xb8, 0xd4, 0x1b, 0x81, 0x05, 0x2e, 0x7d, 0x3a, 0x03, 0x53, 0x11, 0x3d, 0x41, 0xf3, 0x7c, - 0xcb, 0xc2, 0x76, 0x51, 0xf7, 0x27, 0xe9, 0xfd, 0x1c, 0x89, 0x19, 0xd6, 0x54, 0xcb, 0xe1, 0x3b, - 0x9c, 0xd3, 0x40, 0xa4, 0x64, 0x38, 0xfa, 0xb6, 0x8e, 0x2d, 0x9e, 0x27, 0x62, 0xfb, 0x98, 0x09, - 0xaf, 0x9e, 0xa5, 0x8a, 0xee, 0x03, 0xd4, 0x35, 0x6d, 0xdd, 0xd1, 0xaf, 0x62, 0x45, 0x37, 0x44, - 0x52, 0x89, 0xec, 0x6b, 0xb2, 0x72, 0x45, 0x3c, 0x59, 0x36, 0x1c, 0x97, 0xda, 0xc0, 0x2d, 0x35, - 0x44, 0x4d, 0x8c, 0x79, 0x46, 0xae, 0x88, 0x27, 0x2e, 0xf5, 0xed, 0x50, 0x6a, 0x9a, 0x3d, 0x12, - 0xec, 0x31, 0x3a, 0xe2, 0x3b, 0x52, 0x72, 0x91, 0xd5, 0xb9, 0x24, 0x3c, 0x8c, 0xf7, 0xb2, 0x59, - 0x25, 0xb9, 0xc8, 0xea, 0x18, 0xc9, 0xdd, 0x30, 0xa1, 0xb6, 0x5a, 0x16, 0x01, 0x17, 0x40, 0x6c, - 0x63, 0x52, 0x76, 0xab, 0x29, 0x61, 0xf5, 0x49, 0xc8, 0x0b, 0x39, 0x10, 0x57, 0x4d, 0x24, 0xa1, - 0x74, 0xd9, 0x6e, 0x3b, 0x3d, 0x5b, 0x90, 0xf3, 0x86, 0x78, 0x78, 0x3b, 0x94, 0x74, 0x5b, 0xf1, - 0x92, 0xf3, 0xe9, 0x93, 0xe9, 0xd9, 0xbc, 0x5c, 0xd4, 0x6d, 0x37, 0xb1, 0x29, 0x7d, 0x31, 0x0d, - 0xe5, 0xe0, 0xe1, 0x02, 0x5a, 0x84, 0x7c, 0xdb, 0xd4, 0x54, 0xaa, 0x5a, 0xec, 0x64, 0x6b, 0x36, - 0xe6, 0x3c, 0x62, 0x6e, 0x85, 0xd3, 0xcb, 0x2e, 0x67, 0xf5, 0x3f, 0xa4, 0x20, 0x2f, 0xaa, 0xd1, - 0x51, 0xc8, 0x76, 0x55, 0x67, 0x87, 0xc2, 0x8d, 0x36, 0xd2, 0x95, 0x94, 0x4c, 0xcb, 0xa4, 0xde, - 0xee, 0xaa, 0x06, 0x55, 0x01, 0x5e, 0x4f, 0xca, 0x64, 0x5e, 0xdb, 0x58, 0x6d, 0xd2, 0x5d, 0x8f, - 0xd9, 0xe9, 0x60, 0xc3, 0xb1, 0xc5, 0xbc, 0xf2, 0xfa, 0x05, 0x5e, 0x8d, 0xee, 0x85, 0x49, 0xc7, - 0x52, 0xf5, 0x76, 0x80, 0x36, 0x4b, 0x69, 0x2b, 0xe2, 0x81, 0x4b, 0x5c, 0x87, 0xe3, 0x02, 0xb7, - 0x89, 0x1d, 0x55, 0xdb, 0xc1, 0x4d, 0x8f, 0x29, 0x47, 0xb3, 0x1b, 0xc7, 0x38, 0xc1, 0x22, 0x7f, - 0x2e, 0x78, 0xa5, 0x6f, 0xa7, 0x60, 0x52, 0xec, 0xd3, 0x9a, 0xae, 0xb0, 0x56, 0x01, 0x54, 0xc3, - 0x30, 0x1d, 0xbf, 0xb8, 0xfa, 0x55, 0xb9, 0x8f, 0x6f, 0x6e, 0xde, 0x65, 0x92, 0x7d, 0x00, 0xd5, - 0x0e, 0x80, 0xf7, 0x64, 0xa0, 0xd8, 0x6a, 0x50, 0xe4, 0x27, 0x47, 0xf4, 0xf8, 0x91, 0xed, 0xec, - 0x81, 0x55, 0x91, 0x0d, 0x1d, 0x9a, 0x86, 0xd1, 0x2d, 0xdc, 0xd2, 0x0d, 0x9e, 0x0f, 0x66, 0x05, - 0x91, 0x7f, 0xc9, 0xba, 0xf9, 0x97, 0xc6, 0x27, 0x52, 0x30, 0xa5, 0x99, 0x9d, 0x70, 0x7f, 0x1b, - 0x95, 0x50, 0x7a, 0xc1, 0xbe, 0x98, 0x7a, 0xee, 0xf1, 0x96, 0xee, 0xec, 0xf4, 0xb6, 0xe6, 0x34, - 0xb3, 0x73, 0xa6, 0x65, 0xb6, 0x55, 0xa3, 0xe5, 0x9d, 0x9f, 0xd2, 0x1f, 0xda, 0xfd, 0x2d, 0x6c, - 0xdc, 0xdf, 0x32, 0x7d, 0xa7, 0xa9, 0xe7, 0xbc, 0x9f, 0x7f, 0x9d, 0x4a, 0x7d, 0x21, 0x9d, 0xb9, - 0xb0, 0xd6, 0xf8, 0x52, 0xba, 0x7a, 0x81, 0x35, 0xb7, 0x26, 0xc4, 0x23, 0xe3, 0xed, 0x36, 0xd6, - 0xc8, 0x90, 0xe1, 0xfb, 0xf7, 0xc2, 0x74, 0xcb, 0x6c, 0x99, 0x14, 0xf1, 0x0c, 0xf9, 0xc5, 0x4f, - 0x64, 0x0b, 0x6e, 0x6d, 0x35, 0xf6, 0xf8, 0xb6, 0x7e, 0x09, 0xa6, 0x38, 0xb1, 0x42, 0x8f, 0x84, - 0xd8, 0xc6, 0x06, 0x0d, 0x4d, 0xab, 0xcd, 0xfc, 0xfe, 0x77, 0xa9, 0x43, 0x97, 0x27, 0x39, 0x2b, - 0x79, 0xc6, 0xf6, 0x3e, 0x75, 0x19, 0x8e, 0x04, 0xf0, 0xd8, 0xb2, 0xc5, 0x56, 0x0c, 0xe2, 0xbf, - 0xe5, 0x88, 0x53, 0x3e, 0xc4, 0x75, 0xce, 0x5a, 0x5f, 0x80, 0xf1, 0xc3, 0x60, 0xfd, 0x3b, 0x8e, - 0x55, 0xc2, 0x7e, 0x90, 0x0b, 0x30, 0x41, 0x41, 0xb4, 0x9e, 0xed, 0x98, 0x1d, 0x6a, 0x13, 0x87, - 0xc3, 0xfc, 0xd1, 0x77, 0xd9, 0x3a, 0x2a, 0x13, 0xb6, 0x05, 0x97, 0xab, 0x5e, 0x07, 0x7a, 0x0a, - 0xd6, 0xc4, 0x5a, 0x3b, 0x06, 0xe1, 0x9b, 0xbc, 0x23, 0x2e, 0x7d, 0xfd, 0x0a, 0x4c, 0x93, 0xdf, - 0xd4, 0x64, 0xf9, 0x7b, 0x12, 0x9f, 0x83, 0x9b, 0xf9, 0xf6, 0x2f, 0xb0, 0xa5, 0x3a, 0xe5, 0x02, - 0xf8, 0xfa, 0xe4, 0x9b, 0xc5, 0x16, 0x76, 0x1c, 0x6c, 0xd9, 0x8a, 0xda, 0x8e, 0xea, 0x9e, 0x2f, - 0x89, 0x31, 0xf3, 0x1b, 0xaf, 0x07, 0x67, 0xf1, 0x02, 0xe3, 0x9c, 0x6f, 0xb7, 0xeb, 0x9b, 0x70, - 0x2c, 0x42, 0x2b, 0x12, 0x60, 0x7e, 0x9a, 0x63, 0x4e, 0xf7, 0x69, 0x06, 0x81, 0x5d, 0x03, 0x51, - 0xef, 0xce, 0x65, 0x02, 0xcc, 0xdf, 0xe4, 0x98, 0x88, 0xf3, 0x8a, 0x29, 0x25, 0x88, 0x4f, 0xc2, - 0xe4, 0x55, 0x6c, 0x6d, 0x99, 0x36, 0x4f, 0x1c, 0x25, 0x80, 0xfb, 0x0c, 0x87, 0x9b, 0xe0, 0x8c, - 0x34, 0x93, 0x44, 0xb0, 0x1e, 0x85, 0xfc, 0xb6, 0xaa, 0xe1, 0x04, 0x10, 0x9f, 0xe5, 0x10, 0x63, - 0x84, 0x9e, 0xb0, 0xce, 0x43, 0xa9, 0x65, 0x72, 0xaf, 0x15, 0xcf, 0xfe, 0x39, 0xce, 0x5e, 0x14, - 0x3c, 0x1c, 0xa2, 0x6b, 0x76, 0x7b, 0x6d, 0xe2, 0xd2, 0xe2, 0x21, 0x7e, 0x4b, 0x40, 0x08, 0x1e, - 0x0e, 0x71, 0x08, 0xb1, 0xbe, 0x22, 0x20, 0x6c, 0x9f, 0x3c, 0x9f, 0x80, 0xa2, 0x69, 0xb4, 0xf7, - 0x4d, 0x23, 0x49, 0x27, 0x3e, 0xcf, 0x11, 0x80, 0xb3, 0x10, 0x80, 0x73, 0x50, 0x48, 0x3a, 0x11, - 0xff, 0xf0, 0x75, 0xb1, 0x3c, 0xc4, 0x0c, 0x5c, 0x80, 0x09, 0x61, 0xa0, 0x74, 0xd3, 0x48, 0x00, - 0xf1, 0x8f, 0x38, 0x44, 0xd9, 0xc7, 0xc6, 0x87, 0xe1, 0x60, 0xdb, 0x69, 0xe1, 0x24, 0x20, 0x5f, - 0x14, 0xc3, 0xe0, 0x2c, 0x5c, 0x94, 0x5b, 0xd8, 0xd0, 0x76, 0x92, 0x21, 0xfc, 0xb6, 0x10, 0xa5, - 0xe0, 0x21, 0x10, 0x0b, 0x30, 0xde, 0x51, 0x2d, 0x7b, 0x47, 0x6d, 0x27, 0x9a, 0x8e, 0x7f, 0xcc, - 0x31, 0x4a, 0x2e, 0x13, 0x97, 0x48, 0xcf, 0x38, 0x0c, 0xcc, 0x97, 0x84, 0x44, 0x7c, 0x6c, 0x7c, - 0xe9, 0xd9, 0x0e, 0xcd, 0xb2, 0x1d, 0x06, 0xed, 0x9f, 0x88, 0xa5, 0xc7, 0x78, 0x57, 0xfd, 0x88, - 0xe7, 0xa0, 0x60, 0xeb, 0x2f, 0x26, 0x82, 0xf9, 0xa7, 0x62, 0xa6, 0x29, 0x03, 0x61, 0x7e, 0x3f, - 0x1c, 0x8f, 0x74, 0x13, 0x09, 0xc0, 0xfe, 0x19, 0x07, 0x3b, 0x1a, 0xe1, 0x2a, 0xb8, 0x49, 0x38, - 0x2c, 0xe4, 0xef, 0x08, 0x93, 0x80, 0x43, 0x58, 0x6b, 0x64, 0x1f, 0x61, 0xab, 0xdb, 0x87, 0x93, - 0xda, 0xef, 0x0a, 0xa9, 0x31, 0xde, 0x80, 0xd4, 0x36, 0xe0, 0x28, 0x47, 0x3c, 0xdc, 0xbc, 0xfe, - 0x9e, 0x30, 0xac, 0x8c, 0x7b, 0x33, 0x38, 0xbb, 0x1f, 0x80, 0xaa, 0x2b, 0x4e, 0x11, 0xb0, 0xda, - 0x4a, 0x47, 0xed, 0x26, 0x40, 0xfe, 0x7d, 0x8e, 0x2c, 0x2c, 0xbe, 0x1b, 0xf1, 0xda, 0xab, 0x6a, - 0x97, 0x80, 0x3f, 0x0b, 0x33, 0x02, 0xbc, 0x67, 0x58, 0x58, 0x33, 0x5b, 0x86, 0xfe, 0x22, 0x6e, - 0x26, 0x80, 0xfe, 0xe7, 0xa1, 0xa9, 0xda, 0xf4, 0xb1, 0x13, 0xe4, 0x65, 0xa8, 0xb8, 0xb1, 0x8a, - 0xa2, 0x77, 0xba, 0xa6, 0xe5, 0xc4, 0x20, 0xfe, 0x0b, 0x31, 0x53, 0x2e, 0xdf, 0x32, 0x65, 0xab, - 0x2f, 0x41, 0x99, 0x16, 0x93, 0xaa, 0xe4, 0x97, 0x39, 0xd0, 0xb8, 0xc7, 0xc5, 0x0d, 0x87, 0x66, - 0x76, 0xba, 0xaa, 0x95, 0xc4, 0xfe, 0xfd, 0x4b, 0x61, 0x38, 0x38, 0x0b, 0x37, 0x1c, 0xce, 0x7e, - 0x17, 0x13, 0x6f, 0x9f, 0x00, 0xe1, 0x2b, 0xc2, 0x70, 0x08, 0x1e, 0x0e, 0x21, 0x02, 0x86, 0x04, - 0x10, 0x5f, 0x15, 0x10, 0x82, 0x87, 0x40, 0x3c, 0xed, 0x39, 0x5a, 0x0b, 0xb7, 0x74, 0xdb, 0xb1, - 0x58, 0x98, 0x3c, 0x1c, 0xea, 0x6b, 0xaf, 0x07, 0x83, 0x30, 0xd9, 0xc7, 0x4a, 0x2c, 0x11, 0x4f, - 0xbb, 0xd2, 0x5d, 0x54, 0x7c, 0xc7, 0xbe, 0x2e, 0x2c, 0x91, 0x8f, 0x8d, 0xf4, 0xcd, 0x17, 0x21, - 0x12, 0xb1, 0x6b, 0x64, 0xef, 0x90, 0x00, 0xee, 0x0f, 0x42, 0x9d, 0x5b, 0x17, 0xbc, 0x04, 0xd3, - 0x17, 0xff, 0xf4, 0x8c, 0x5d, 0xbc, 0x9f, 0x48, 0x3b, 0xff, 0x30, 0x14, 0xff, 0x6c, 0x32, 0x4e, - 0x66, 0x43, 0x26, 0x42, 0xf1, 0x14, 0x8a, 0xbb, 0x3f, 0x34, 0xf3, 0xb7, 0xdf, 0xe0, 0xe3, 0x0d, - 0x86, 0x53, 0xf5, 0x15, 0xa2, 0xe4, 0xc1, 0xa0, 0x27, 0x1e, 0xec, 0x17, 0xde, 0x70, 0xf5, 0x3c, - 0x10, 0xf3, 0xd4, 0xcf, 0xc3, 0x78, 0x20, 0xe0, 0x89, 0x87, 0xfa, 0x10, 0x87, 0x2a, 0xf9, 0xe3, - 0x9d, 0xfa, 0x43, 0x90, 0x25, 0xc1, 0x4b, 0x3c, 0xfb, 0x2f, 0x72, 0x76, 0x4a, 0x5e, 0x7f, 0x2f, - 0xe4, 0x45, 0xd0, 0x12, 0xcf, 0xfa, 0x61, 0xce, 0xea, 0xb2, 0x10, 0x76, 0x11, 0xb0, 0xc4, 0xb3, - 0x7f, 0x44, 0xb0, 0x0b, 0x16, 0xc2, 0x9e, 0x5c, 0x84, 0xdf, 0xf8, 0x3b, 0x59, 0xee, 0x74, 0x84, - 0xec, 0xce, 0xc1, 0x18, 0x8f, 0x54, 0xe2, 0xb9, 0x3f, 0xc6, 0x1b, 0x17, 0x1c, 0xf5, 0x47, 0x60, - 0x34, 0xa1, 0xc0, 0x7f, 0x99, 0xb3, 0x32, 0xfa, 0xfa, 0x02, 0x14, 0x7d, 0xd1, 0x49, 0x3c, 0xfb, - 0xaf, 0x70, 0x76, 0x3f, 0x17, 0xe9, 0x3a, 0x8f, 0x4e, 0xe2, 0x01, 0x3e, 0x21, 0xba, 0xce, 0x39, - 0x88, 0xd8, 0x44, 0x60, 0x12, 0xcf, 0xfd, 0x49, 0x21, 0x75, 0xc1, 0x52, 0x7f, 0x02, 0x0a, 0xae, - 0xb3, 0x89, 0xe7, 0xff, 0xbb, 0x9c, 0xdf, 0xe3, 0x21, 0x12, 0xf0, 0x39, 0xbb, 0x78, 0x88, 0x4f, - 0x09, 0x09, 0xf8, 0xb8, 0xc8, 0x32, 0x0a, 0x07, 0x30, 0xf1, 0x48, 0x7f, 0x4f, 0x2c, 0xa3, 0x50, - 0xfc, 0x42, 0x66, 0x93, 0xda, 0xfc, 0x78, 0x88, 0x5f, 0x15, 0xb3, 0x49, 0xe9, 0x49, 0x37, 0xc2, - 0x11, 0x41, 0x3c, 0xc6, 0xdf, 0x17, 0xdd, 0x08, 0x05, 0x04, 0xf5, 0x35, 0x40, 0xfd, 0xd1, 0x40, - 0x3c, 0xde, 0xcb, 0x1c, 0x6f, 0xb2, 0x2f, 0x18, 0xa8, 0x3f, 0x03, 0x47, 0xa3, 0x23, 0x81, 0x78, - 0xd4, 0xdf, 0x78, 0x23, 0xb4, 0x77, 0xf3, 0x07, 0x02, 0xf5, 0x0d, 0xcf, 0xa5, 0xf8, 0xa3, 0x80, - 0x78, 0xd8, 0x4f, 0xbf, 0x11, 0x34, 0xdc, 0xfe, 0x20, 0xa0, 0x3e, 0x0f, 0xe0, 0x39, 0xe0, 0x78, - 0xac, 0xcf, 0x70, 0x2c, 0x1f, 0x13, 0x59, 0x1a, 0xdc, 0xff, 0xc6, 0xf3, 0x7f, 0x56, 0x2c, 0x0d, - 0xce, 0x41, 0x96, 0x86, 0x70, 0xbd, 0xf1, 0xdc, 0x9f, 0x13, 0x4b, 0x43, 0xb0, 0x10, 0xcd, 0xf6, - 0x79, 0xb7, 0x78, 0x84, 0xcf, 0x0b, 0xcd, 0xf6, 0x71, 0xd5, 0x2f, 0xc1, 0x64, 0x9f, 0x43, 0x8c, - 0x87, 0xfa, 0x02, 0x87, 0xaa, 0x84, 0xfd, 0xa1, 0xdf, 0x79, 0x71, 0x67, 0x18, 0x8f, 0xf6, 0x0f, - 0x42, 0xce, 0x8b, 0xfb, 0xc2, 0xfa, 0x39, 0xc8, 0x1b, 0xbd, 0x76, 0x9b, 0x2c, 0x1e, 0x34, 0xfc, - 0xce, 0xdf, 0xcc, 0x7f, 0xff, 0x11, 0x97, 0x8e, 0x60, 0xa8, 0x3f, 0x04, 0xa3, 0xb8, 0xb3, 0x85, - 0x9b, 0x71, 0x9c, 0xdf, 0xff, 0x91, 0x30, 0x98, 0x84, 0xba, 0xfe, 0x04, 0x00, 0x4b, 0x8d, 0xd0, - 0xe3, 0xc1, 0x18, 0xde, 0xff, 0xf1, 0x23, 0x7e, 0x1b, 0xc7, 0x63, 0xf1, 0x00, 0xd8, 0xdd, 0x9e, - 0xe1, 0x00, 0xaf, 0x07, 0x01, 0xe8, 0x8c, 0x3c, 0x0a, 0x63, 0xcf, 0xdb, 0xa6, 0xe1, 0xa8, 0xad, - 0x38, 0xee, 0xff, 0xc9, 0xb9, 0x05, 0x3d, 0x11, 0x58, 0xc7, 0xb4, 0xb0, 0xa3, 0xb6, 0xec, 0x38, - 0xde, 0xff, 0xc5, 0x79, 0x5d, 0x06, 0xc2, 0xac, 0xa9, 0xb6, 0x93, 0x64, 0xdc, 0xff, 0x5b, 0x30, - 0x0b, 0x06, 0xd2, 0x69, 0xf2, 0x7b, 0x17, 0xef, 0xc7, 0xf1, 0xfe, 0x40, 0x74, 0x9a, 0xd3, 0xd7, - 0xdf, 0x0b, 0x05, 0xf2, 0x93, 0x5d, 0xb1, 0x8b, 0x61, 0xfe, 0x3f, 0x9c, 0xd9, 0xe3, 0x20, 0x2d, - 0xdb, 0x4e, 0xd3, 0xd1, 0xe3, 0x85, 0x7d, 0x9d, 0xcf, 0xb4, 0xa0, 0xaf, 0xcf, 0x43, 0xd1, 0x76, - 0x9a, 0xcd, 0x1e, 0x8f, 0x4f, 0x63, 0xd8, 0xff, 0xef, 0x8f, 0xdc, 0x94, 0x85, 0xcb, 0x43, 0x66, - 0xfb, 0xda, 0xae, 0xd3, 0x35, 0xe9, 0x11, 0x48, 0x1c, 0xc2, 0x1b, 0x1c, 0xc1, 0xc7, 0x52, 0x5f, - 0x80, 0x12, 0x19, 0x8b, 0x85, 0xbb, 0x98, 0x9e, 0x57, 0xc5, 0x40, 0xfc, 0x25, 0x17, 0x40, 0x80, - 0xa9, 0xf1, 0xb3, 0xdf, 0x7c, 0xf5, 0x44, 0xea, 0x5b, 0xaf, 0x9e, 0x48, 0xfd, 0xf9, 0xab, 0x27, - 0x52, 0x9f, 0x7c, 0xed, 0xc4, 0xc8, 0xb7, 0x5e, 0x3b, 0x31, 0xf2, 0xa7, 0xaf, 0x9d, 0x18, 0x89, - 0x4e, 0x1b, 0xc3, 0x05, 0xf3, 0x82, 0xc9, 0x12, 0xc6, 0xcf, 0x49, 0x81, 0x74, 0x71, 0xcb, 0xf4, - 0xb2, 0xb5, 0xee, 0x26, 0x07, 0xfe, 0x20, 0x0d, 0x77, 0xd2, 0xeb, 0xbe, 0x56, 0x47, 0x37, 0x9c, - 0x33, 0x9a, 0xb5, 0xdf, 0x75, 0xcc, 0x33, 0x1d, 0x6c, 0xed, 0xb6, 0x31, 0xff, 0xc3, 0xb3, 0xbf, - 0x33, 0x1e, 0xd9, 0x1c, 0x23, 0x9b, 0x63, 0xcf, 0xab, 0x91, 0xd9, 0x62, 0x69, 0x01, 0xc6, 0xd6, - 0x2c, 0xd3, 0xdc, 0xbe, 0xdc, 0x45, 0x88, 0xdf, 0x60, 0xe6, 0x37, 0xe3, 0xa8, 0x1a, 0x56, 0x20, - 0xb3, 0x8b, 0xf7, 0x69, 0xe2, 0xbc, 0x24, 0x93, 0x9f, 0x84, 0xaa, 0xa9, 0x3a, 0x2a, 0x4d, 0x98, - 0x97, 0x64, 0xfa, 0x5b, 0x6a, 0xc0, 0x28, 0x05, 0x41, 0x8f, 0x42, 0xc6, 0xec, 0xda, 0x3c, 0xbb, - 0x7f, 0xfb, 0xdc, 0xa0, 0xbe, 0xcc, 0xf1, 0x26, 0x1b, 0xd9, 0x6f, 0x1e, 0xd4, 0x46, 0x64, 0xc2, - 0xd3, 0x58, 0xfb, 0xeb, 0xef, 0x9c, 0x48, 0xfd, 0xf6, 0xab, 0x27, 0x52, 0x83, 0x24, 0xf9, 0xdc, - 0x9c, 0x4f, 0x50, 0x3e, 0x61, 0x0c, 0x92, 0xcb, 0x56, 0x8e, 0x8e, 0xf0, 0xdd, 0xf0, 0x4b, 0x69, - 0x38, 0xe1, 0x23, 0x6a, 0xeb, 0x5b, 0xf6, 0x99, 0xdd, 0xab, 0x67, 0xc8, 0xf8, 0x6c, 0x2e, 0x35, - 0xe4, 0xeb, 0x29, 0x79, 0x3e, 0xb7, 0x7b, 0x75, 0x80, 0xbc, 0xe6, 0x20, 0xbb, 0xa6, 0xea, 0x96, - 0x10, 0x4c, 0xca, 0x13, 0xcc, 0xb4, 0x77, 0xb9, 0x95, 0xd4, 0xb1, 0x82, 0x74, 0x16, 0xf2, 0x4f, - 0x2d, 0x3f, 0xfc, 0x60, 0x12, 0x9e, 0x0c, 0xe7, 0x69, 0xc8, 0x42, 0x14, 0x5f, 0x8b, 0x10, 0xc7, - 0x37, 0x5e, 0x3b, 0x91, 0x72, 0x45, 0x32, 0x1b, 0x2b, 0x12, 0x3e, 0x5a, 0x57, 0x18, 0x9f, 0x4c, - 0x43, 0x2d, 0x7c, 0x2a, 0x40, 0x96, 0xa2, 0xed, 0xa8, 0x9d, 0xee, 0xa0, 0x77, 0xba, 0xce, 0x41, - 0x61, 0x43, 0xd0, 0xa0, 0x19, 0x18, 0xb3, 0xb1, 0x66, 0x1a, 0x4d, 0x9b, 0x8e, 0x24, 0x23, 0x8b, - 0x22, 0x19, 0x8d, 0xa1, 0x1a, 0xa6, 0xcd, 0xaf, 0x9c, 0xb2, 0x42, 0xe3, 0xd7, 0x53, 0x87, 0x5b, - 0x1b, 0x65, 0xb7, 0x29, 0xba, 0x40, 0xd6, 0x52, 0xcf, 0xdd, 0x3b, 0xec, 0x40, 0x85, 0x4e, 0xa3, - 0x37, 0x04, 0xdf, 0xe9, 0xc9, 0x89, 0xf0, 0xe9, 0xc9, 0x33, 0xb8, 0xdd, 0x7e, 0xca, 0x30, 0xaf, - 0x19, 0x1b, 0x84, 0xc7, 0x15, 0xc9, 0xc7, 0xd3, 0x70, 0xa2, 0xef, 0xa0, 0x84, 0x9b, 0x97, 0x41, - 0x12, 0xa9, 0x43, 0x7e, 0x51, 0x58, 0xad, 0xc3, 0x0a, 0xe4, 0x57, 0x0f, 0x29, 0x90, 0x71, 0xd1, - 0x92, 0x90, 0xc7, 0x3d, 0xf1, 0xf2, 0x10, 0xfd, 0xbf, 0x01, 0x71, 0x7c, 0xe8, 0x71, 0xb8, 0xdd, - 0xa7, 0x40, 0xea, 0x96, 0xa6, 0x9f, 0xe1, 0x42, 0xf6, 0xad, 0x98, 0x23, 0xbe, 0x15, 0x43, 0x48, - 0xe6, 0xe8, 0xc3, 0xe8, 0x45, 0x53, 0x4d, 0x66, 0xbb, 0xaa, 0x31, 0xab, 0xb4, 0x1a, 0xa7, 0xb8, - 0xd5, 0x98, 0x69, 0x94, 0xfe, 0x6a, 0x14, 0xc6, 0x64, 0xfc, 0x42, 0x0f, 0xdb, 0xf4, 0x95, 0x44, - 0xac, 0xed, 0x98, 0xfc, 0xb6, 0xbb, 0x34, 0x17, 0x39, 0x9e, 0x39, 0x4e, 0xbd, 0xa4, 0xed, 0x98, - 0x17, 0x47, 0x64, 0xca, 0x41, 0xdf, 0x01, 0x6b, 0xf7, 0xec, 0x1d, 0x7e, 0x29, 0xf9, 0xd4, 0x70, - 0xd6, 0xf3, 0x84, 0xf4, 0xe2, 0x88, 0xcc, 0x78, 0x48, 0xb3, 0xf4, 0xfd, 0xb5, 0x6c, 0x92, 0x66, - 0x97, 0x8d, 0x6d, 0xda, 0x2c, 0xe1, 0x40, 0x17, 0x01, 0x6c, 0xec, 0x88, 0xab, 0x0c, 0xa3, 0x94, - 0xff, 0xee, 0xe1, 0xfc, 0xeb, 0xd8, 0x61, 0x6e, 0xeb, 0xe2, 0x88, 0x5c, 0xb0, 0x45, 0x81, 0x20, - 0xe9, 0x86, 0xee, 0x28, 0xda, 0x8e, 0xaa, 0x1b, 0xf4, 0x0c, 0x3e, 0x16, 0x69, 0xd9, 0xd0, 0x9d, - 0x05, 0x42, 0x4e, 0x90, 0x74, 0x51, 0x20, 0xa2, 0x78, 0xa1, 0x87, 0xf9, 0xdd, 0xb7, 0x58, 0x51, - 0x3c, 0x4d, 0x48, 0x89, 0x28, 0x28, 0x0f, 0x7a, 0x0a, 0x8a, 0xf4, 0xb8, 0x55, 0xd9, 0x6a, 0x9b, - 0xda, 0x2e, 0x7f, 0xb3, 0x64, 0x76, 0x38, 0x44, 0x83, 0x30, 0x34, 0x08, 0xfd, 0xc5, 0x11, 0x19, - 0xb6, 0xdc, 0x12, 0x6a, 0x40, 0x9e, 0x5d, 0xfb, 0x75, 0xf6, 0xf8, 0xbb, 0x81, 0x77, 0x0e, 0x47, - 0xa2, 0x37, 0x80, 0x37, 0xf6, 0x2e, 0x8e, 0xc8, 0x63, 0x1a, 0xfb, 0x89, 0x96, 0xa0, 0x80, 0x8d, - 0x26, 0xef, 0x4e, 0x91, 0xbf, 0x45, 0x35, 0x5c, 0x2f, 0x8c, 0xa6, 0xe8, 0x4c, 0x1e, 0xf3, 0xdf, - 0xe8, 0x71, 0xc8, 0x69, 0x66, 0xa7, 0xa3, 0x3b, 0xf4, 0x1d, 0xc3, 0xe2, 0xd9, 0x3b, 0x62, 0x3a, - 0x42, 0x69, 0x2f, 0x8e, 0xc8, 0x9c, 0x8b, 0x4c, 0x4f, 0x13, 0xb7, 0xf5, 0xab, 0xd8, 0x22, 0x83, - 0x99, 0x4a, 0x32, 0x3d, 0x8b, 0x8c, 0x9e, 0x0e, 0xa7, 0xd0, 0x14, 0x85, 0xc6, 0x18, 0x77, 0x2f, - 0xd2, 0xdd, 0x50, 0xf4, 0x69, 0x32, 0xb1, 0x58, 0x7c, 0x07, 0xc2, 0x9d, 0xbd, 0x28, 0x4a, 0x65, - 0x28, 0xf9, 0xf5, 0x56, 0xea, 0xb8, 0x8c, 0xf4, 0x10, 0x7f, 0x06, 0xc6, 0xae, 0x62, 0xcb, 0x66, - 0x27, 0xf8, 0x94, 0x91, 0x17, 0xd1, 0x29, 0x18, 0xa7, 0x72, 0x53, 0xc4, 0xf3, 0x34, 0xbd, 0x30, - 0x52, 0xa2, 0x95, 0x57, 0x38, 0x51, 0x0d, 0x8a, 0xdd, 0xb3, 0x5d, 0x97, 0x24, 0x43, 0x49, 0xa0, - 0x7b, 0xb6, 0xcb, 0x09, 0xa4, 0x3a, 0x54, 0xc2, 0xaa, 0xeb, 0xf7, 0x9a, 0x85, 0x08, 0xaf, 0x59, - 0x10, 0x9e, 0xf6, 0xf7, 0xd2, 0x2e, 0xb3, 0xab, 0xad, 0x64, 0xb9, 0x11, 0x23, 0x41, 0xb9, 0x8b, - 0x67, 0xab, 0x7d, 0xa1, 0x9d, 0xeb, 0x6b, 0x1a, 0x79, 0x12, 0x8a, 0x7c, 0xf2, 0xcf, 0x6a, 0x29, - 0x99, 0x72, 0xa0, 0xe3, 0x44, 0xa1, 0x54, 0xdd, 0x50, 0xf4, 0xa6, 0x78, 0x9b, 0x98, 0x96, 0x97, - 0x9b, 0xe8, 0x69, 0xa8, 0x68, 0xa6, 0x61, 0x63, 0xc3, 0xee, 0xd9, 0x4a, 0x57, 0xb5, 0xd4, 0x8e, - 0xf7, 0xd2, 0x5d, 0xf4, 0x34, 0x2d, 0x08, 0xf2, 0x35, 0x4a, 0x2d, 0x4f, 0x68, 0xc1, 0x0a, 0xb4, - 0x02, 0x70, 0x55, 0x6d, 0xeb, 0x4d, 0xd5, 0x31, 0x2d, 0x9b, 0xbf, 0x9c, 0x32, 0x08, 0xec, 0x8a, - 0x20, 0xdc, 0xec, 0x36, 0x55, 0x07, 0xf3, 0x20, 0xca, 0xc7, 0x8f, 0xee, 0x82, 0x09, 0xb5, 0xdb, - 0x55, 0x6c, 0x47, 0x75, 0xb0, 0xb2, 0xb5, 0xef, 0x60, 0x9b, 0xda, 0x8b, 0x92, 0x3c, 0xae, 0x76, - 0xbb, 0xeb, 0xa4, 0xb6, 0x41, 0x2a, 0xa5, 0xa6, 0x3b, 0xdb, 0x74, 0x69, 0xba, 0xb1, 0x5d, 0xca, - 0x8b, 0xed, 0x48, 0x1d, 0xbd, 0x5a, 0xc1, 0x64, 0x20, 0x6e, 0xa3, 0xe4, 0x76, 0xb0, 0xde, 0xda, - 0x71, 0xe8, 0xb0, 0x33, 0x32, 0x2f, 0x91, 0x89, 0xe9, 0x5a, 0xe6, 0x55, 0x76, 0x5b, 0x28, 0x2f, - 0xb3, 0x82, 0xf4, 0x6b, 0x69, 0x98, 0xec, 0x5b, 0xbe, 0x04, 0x97, 0x5e, 0xf0, 0xe7, 0x6d, 0x91, - 0xdf, 0xe8, 0x1c, 0xc1, 0x55, 0x9b, 0xfc, 0xa5, 0x95, 0xe2, 0xd9, 0xdb, 0x06, 0x48, 0xe0, 0x22, - 0x25, 0xe2, 0x03, 0xe7, 0x2c, 0x68, 0x13, 0x2a, 0x6d, 0xd5, 0x76, 0x14, 0xb6, 0x8a, 0xd8, 0x5b, - 0xc2, 0x99, 0xa1, 0x96, 0x60, 0x45, 0x15, 0xab, 0x8f, 0x28, 0x37, 0x87, 0x2b, 0xb7, 0x03, 0xb5, - 0xe8, 0x59, 0x98, 0xde, 0xda, 0x7f, 0x51, 0x35, 0x1c, 0xdd, 0xa0, 0x97, 0x8d, 0x82, 0x73, 0x54, - 0x1b, 0x00, 0xbd, 0x74, 0x55, 0x6f, 0x62, 0x43, 0x13, 0x93, 0x33, 0xe5, 0x42, 0xb8, 0x93, 0x67, - 0x4b, 0xcf, 0x42, 0x39, 0x68, 0x8b, 0x50, 0x19, 0xd2, 0xce, 0x1e, 0x97, 0x48, 0xda, 0xd9, 0x43, - 0x0f, 0xf3, 0x88, 0x3c, 0x4d, 0x6f, 0xcb, 0x0d, 0x72, 0x16, 0x9c, 0xdb, 0x7b, 0x97, 0x50, 0x92, - 0xdc, 0x95, 0xe0, 0x1a, 0x86, 0x30, 0xb6, 0x74, 0x1a, 0x26, 0x42, 0x46, 0xcc, 0x37, 0xad, 0x29, - 0xff, 0xb4, 0x4a, 0x13, 0x30, 0x1e, 0xb0, 0x55, 0xd2, 0x1f, 0xe7, 0x20, 0x2f, 0x63, 0xbb, 0x4b, - 0x94, 0x18, 0x5d, 0x84, 0x02, 0xde, 0xd3, 0x70, 0xd7, 0x11, 0x56, 0x61, 0x98, 0x11, 0x67, 0x3c, - 0x4b, 0x82, 0x9e, 0x98, 0x2b, 0x97, 0x19, 0x3d, 0x1a, 0x70, 0xc9, 0xa7, 0xe2, 0x40, 0xfc, 0x3e, - 0xf9, 0xb1, 0xa0, 0x4f, 0xbe, 0x23, 0x86, 0x37, 0xe4, 0x94, 0x1f, 0x0d, 0x38, 0xe5, 0xb8, 0x86, - 0x03, 0x5e, 0x79, 0x39, 0xc2, 0x2b, 0xc7, 0x0d, 0x7f, 0x80, 0x5b, 0x5e, 0x8e, 0x70, 0xcb, 0xb3, - 0xb1, 0x7d, 0x89, 0xf4, 0xcb, 0x8f, 0x05, 0xfd, 0x72, 0x9c, 0x38, 0x42, 0x8e, 0x79, 0x25, 0xca, - 0x31, 0x9f, 0x8e, 0xc1, 0x18, 0xe8, 0x99, 0x17, 0xfa, 0x3c, 0xf3, 0x5d, 0x31, 0x50, 0x11, 0xae, - 0x79, 0x39, 0xe0, 0x13, 0x21, 0x91, 0x6c, 0xa2, 0x9d, 0x22, 0x3a, 0xdf, 0xef, 0xe5, 0xef, 0x8e, - 0x53, 0xb5, 0x28, 0x37, 0xff, 0x44, 0xc8, 0xcd, 0xdf, 0x19, 0x37, 0xaa, 0x90, 0x9f, 0xf7, 0xbc, - 0xf3, 0x69, 0x62, 0x1f, 0x43, 0x2b, 0x83, 0xd8, 0x52, 0x6c, 0x59, 0xa6, 0xc5, 0x1d, 0x1f, 0x2b, - 0x48, 0xb3, 0xc4, 0x62, 0x7b, 0xfa, 0x3f, 0xc4, 0x93, 0xd3, 0x45, 0xeb, 0xd3, 0x76, 0xe9, 0x6b, - 0x29, 0x8f, 0x97, 0x5a, 0x36, 0xbf, 0xb5, 0x2f, 0x70, 0x6b, 0xef, 0x73, 0xf0, 0xe9, 0xa0, 0x83, - 0xaf, 0x41, 0x91, 0xf8, 0x94, 0x90, 0xef, 0x56, 0xbb, 0xc2, 0x77, 0xa3, 0x7b, 0x60, 0x92, 0xda, - 0x5f, 0x16, 0x06, 0x70, 0x43, 0x92, 0xa5, 0x86, 0x64, 0x82, 0x3c, 0x60, 0x12, 0x64, 0x8e, 0xe2, - 0x7e, 0x98, 0xf2, 0xd1, 0x12, 0x5c, 0xea, 0x0b, 0x98, 0x93, 0xaa, 0xb8, 0xd4, 0xf3, 0xdd, 0xee, - 0x45, 0xd5, 0xde, 0x91, 0x56, 0x3d, 0x01, 0x79, 0x71, 0x01, 0x82, 0xac, 0x66, 0x36, 0xd9, 0xb8, - 0xc7, 0x65, 0xfa, 0x9b, 0xc4, 0x0a, 0x6d, 0xb3, 0xc5, 0x6f, 0x40, 0x92, 0x9f, 0x84, 0xca, 0x5d, - 0xda, 0x05, 0xb6, 0x66, 0xa5, 0x2f, 0xa7, 0x3c, 0x3c, 0x2f, 0x54, 0x88, 0xf2, 0xea, 0xa9, 0x9b, - 0xe9, 0xd5, 0xd3, 0x6f, 0xce, 0xab, 0x4b, 0x6f, 0xa4, 0xbc, 0x29, 0x75, 0xfd, 0xf5, 0x8d, 0x89, - 0x80, 0x68, 0x17, 0x7b, 0x13, 0x9c, 0xdd, 0xd4, 0x65, 0x05, 0x11, 0x6a, 0xe5, 0x22, 0x12, 0x14, - 0x63, 0xbe, 0xa4, 0x06, 0x7a, 0x88, 0xfa, 0x79, 0x73, 0x9b, 0x9b, 0x86, 0x5a, 0x4c, 0xa2, 0x47, - 0x66, 0xd4, 0x3e, 0xff, 0x52, 0x08, 0x84, 0x0d, 0xb7, 0x42, 0x81, 0x74, 0x9d, 0xbd, 0xfe, 0x04, - 0x3c, 0xbd, 0x28, 0x2a, 0xa4, 0x26, 0xa0, 0x7e, 0x1b, 0x83, 0x2e, 0x41, 0x0e, 0x5f, 0xa5, 0xb7, - 0x51, 0x59, 0xb2, 0xe9, 0xd6, 0x81, 0x8e, 0x18, 0x1b, 0x4e, 0x63, 0x86, 0x08, 0xf3, 0xfb, 0x07, - 0xb5, 0x0a, 0xe3, 0xb9, 0xcf, 0xec, 0xe8, 0x0e, 0xee, 0x74, 0x9d, 0x7d, 0x99, 0xa3, 0x48, 0x1f, - 0x49, 0x13, 0x7f, 0x18, 0xb0, 0x3f, 0x91, 0xe2, 0x15, 0x8b, 0x26, 0xed, 0x0b, 0x91, 0x92, 0x89, - 0xfc, 0x36, 0x80, 0x96, 0x6a, 0x2b, 0xd7, 0x54, 0xc3, 0xc1, 0x4d, 0x2e, 0xf7, 0x42, 0x4b, 0xb5, - 0x9f, 0xa1, 0x15, 0x24, 0xde, 0x24, 0x8f, 0x7b, 0x36, 0x6e, 0xd2, 0x09, 0xc8, 0xc8, 0x63, 0x2d, - 0xd5, 0xde, 0xb4, 0x71, 0xd3, 0x37, 0xd6, 0xb1, 0x9b, 0x31, 0xd6, 0xa0, 0xbc, 0xf3, 0x61, 0x79, - 0x7f, 0x2c, 0xed, 0xad, 0x0e, 0x2f, 0x7c, 0xf8, 0xc9, 0x94, 0xc5, 0x67, 0xe9, 0x9e, 0x22, 0xe8, - 0x04, 0xd0, 0xfb, 0x61, 0xd2, 0x5d, 0x95, 0x4a, 0x8f, 0xae, 0x56, 0xa1, 0x85, 0x87, 0x5b, 0xdc, - 0x95, 0xab, 0xc1, 0x6a, 0x1b, 0xfd, 0x1c, 0x1c, 0x0b, 0xd9, 0x20, 0xb7, 0x81, 0xf4, 0xa1, 0x4c, - 0xd1, 0x91, 0xa0, 0x29, 0x12, 0xf8, 0x9e, 0xf4, 0x32, 0x37, 0x65, 0xd5, 0xdc, 0x41, 0x42, 0x58, - 0xbf, 0x7b, 0x8b, 0xd2, 0x09, 0xe9, 0x4f, 0x52, 0x30, 0x11, 0xea, 0x20, 0x7a, 0x0f, 0x8c, 0x32, - 0x0f, 0x9c, 0x1a, 0x9a, 0x08, 0xa1, 0x12, 0xe7, 0x63, 0x62, 0x0c, 0x68, 0x1e, 0xf2, 0x98, 0x47, - 0xd7, 0x5c, 0x28, 0x77, 0xc6, 0x04, 0xe1, 0x9c, 0xdf, 0x65, 0x43, 0x8b, 0x50, 0x70, 0x45, 0x1f, - 0xb3, 0x73, 0x73, 0x67, 0x8e, 0x83, 0x78, 0x8c, 0xd2, 0x02, 0x14, 0x7d, 0xdd, 0x63, 0xef, 0x02, - 0xee, 0xf1, 0xed, 0x16, 0x0b, 0xa0, 0xf3, 0x1d, 0x75, 0x8f, 0xee, 0xb4, 0xd0, 0x31, 0x18, 0x23, - 0x0f, 0x5b, 0xfc, 0x65, 0xa9, 0x8c, 0x9c, 0xeb, 0xa8, 0x7b, 0x17, 0x54, 0x5b, 0xfa, 0x78, 0x0a, - 0xca, 0xc1, 0x7e, 0xa2, 0x7b, 0x01, 0x11, 0x5a, 0xb5, 0x85, 0x15, 0xa3, 0xd7, 0x61, 0x3e, 0x52, - 0x20, 0x4e, 0x74, 0xd4, 0xbd, 0xf9, 0x16, 0xbe, 0xd4, 0xeb, 0xd0, 0xa6, 0x6d, 0xb4, 0x0a, 0x15, - 0x41, 0x2c, 0x92, 0x5d, 0x5c, 0x2a, 0xc7, 0xfb, 0xbf, 0x57, 0xc3, 0x09, 0xd8, 0x5e, 0xf7, 0x65, - 0xb2, 0xd7, 0x2d, 0x33, 0x3c, 0xf1, 0x44, 0x7a, 0x08, 0x26, 0x42, 0x23, 0x46, 0x12, 0x8c, 0x77, - 0x7b, 0x5b, 0xca, 0x2e, 0xde, 0xa7, 0xaf, 0xbf, 0x33, 0x55, 0x2f, 0xc8, 0xc5, 0x6e, 0x6f, 0xeb, - 0x29, 0xbc, 0x4f, 0x73, 0x87, 0x92, 0x06, 0xe5, 0xe0, 0x66, 0x8a, 0x38, 0x0e, 0xcb, 0xec, 0x19, - 0x4d, 0xf1, 0x61, 0x03, 0x5a, 0x40, 0xe7, 0x60, 0xf4, 0xaa, 0xc9, 0xb4, 0x79, 0xd8, 0xee, 0xe9, - 0x8a, 0xe9, 0x60, 0xdf, 0x96, 0x8c, 0xf1, 0x48, 0x36, 0x8c, 0x52, 0xbd, 0x8c, 0x3c, 0xa8, 0xb8, - 0x02, 0xa0, 0x3a, 0x8e, 0xa5, 0x6f, 0xf5, 0x3c, 0xf8, 0x99, 0xb9, 0xfe, 0xb4, 0xfe, 0xdc, 0x9a, - 0xaa, 0x5b, 0x8d, 0x5b, 0xb9, 0x66, 0x4f, 0x7b, 0x3c, 0x3e, 0xed, 0xf6, 0x21, 0x49, 0xaf, 0x67, - 0x21, 0xc7, 0xb6, 0x9b, 0xe8, 0xf1, 0x60, 0xf2, 0xa3, 0x78, 0xf6, 0xc4, 0xa0, 0xee, 0x33, 0x2a, - 0xde, 0x7b, 0x37, 0x82, 0xba, 0x2b, 0x9c, 0x51, 0x68, 0x14, 0x5f, 0x3d, 0xa8, 0x8d, 0xd1, 0xe8, - 0x63, 0x79, 0xd1, 0x4b, 0x2f, 0x0c, 0xda, 0x5d, 0x8b, 0x5c, 0x46, 0xf6, 0xd0, 0xb9, 0x8c, 0x8b, - 0x30, 0xee, 0x0b, 0xb7, 0xf4, 0x26, 0xdf, 0xa7, 0x9c, 0x18, 0xb6, 0xe8, 0x96, 0x17, 0x79, 0xff, - 0x8b, 0x6e, 0x38, 0xb6, 0xdc, 0x44, 0xb3, 0xc1, 0x4d, 0x36, 0x8d, 0xda, 0x58, 0xb8, 0xe0, 0xdb, - 0x37, 0xd3, 0x77, 0xf2, 0x6f, 0x81, 0x02, 0x7d, 0xb1, 0x99, 0x92, 0xb0, 0xe8, 0x21, 0x4f, 0x2a, - 0xe8, 0xc3, 0xbb, 0x61, 0xc2, 0x0b, 0x6c, 0x18, 0x49, 0x9e, 0xa1, 0x78, 0xd5, 0x94, 0xf0, 0x01, - 0x98, 0x36, 0xf0, 0x9e, 0xa3, 0x84, 0xa9, 0x0b, 0x94, 0x1a, 0x91, 0x67, 0x57, 0x82, 0x1c, 0x77, - 0x42, 0xd9, 0x33, 0xa1, 0x94, 0x16, 0x58, 0xea, 0xc3, 0xad, 0xa5, 0x64, 0xc7, 0x21, 0xef, 0x86, - 0x9d, 0x45, 0x4a, 0x30, 0xa6, 0xb2, 0x68, 0xd3, 0x0d, 0x64, 0x2d, 0x6c, 0xf7, 0xda, 0x0e, 0x07, - 0x29, 0x51, 0x1a, 0x1a, 0xc8, 0xca, 0xac, 0x9e, 0xd2, 0x9e, 0x82, 0x71, 0x61, 0x55, 0x18, 0xdd, - 0x38, 0xa5, 0x2b, 0x89, 0x4a, 0x4a, 0x74, 0x1a, 0x2a, 0x5d, 0xcb, 0xec, 0x9a, 0x36, 0xb6, 0x14, - 0xb5, 0xd9, 0xb4, 0xb0, 0x6d, 0xcf, 0x94, 0x19, 0x9e, 0xa8, 0x9f, 0x67, 0xd5, 0xd2, 0xbb, 0x60, - 0x4c, 0xc4, 0xd3, 0xd3, 0x30, 0xda, 0x70, 0x2d, 0x64, 0x56, 0x66, 0x05, 0xe2, 0x5f, 0xe7, 0xbb, - 0x5d, 0x9e, 0x5d, 0x23, 0x3f, 0xa5, 0x36, 0x8c, 0xf1, 0x09, 0x8b, 0xcc, 0xa9, 0xac, 0x42, 0xa9, - 0xab, 0x5a, 0x64, 0x18, 0xfe, 0xcc, 0xca, 0xa0, 0x1d, 0xe1, 0x9a, 0x6a, 0x39, 0xeb, 0xd8, 0x09, - 0x24, 0x58, 0x8a, 0x94, 0x9f, 0x55, 0x49, 0x8f, 0xc2, 0x78, 0x80, 0x86, 0x74, 0xd3, 0x31, 0x1d, - 0xb5, 0x2d, 0x16, 0x3a, 0x2d, 0xb8, 0x3d, 0x49, 0x7b, 0x3d, 0x91, 0xce, 0x41, 0xc1, 0x9d, 0x2b, - 0xb2, 0xd1, 0x10, 0xa2, 0x48, 0x71, 0xf1, 0xb3, 0x22, 0x4d, 0x22, 0x99, 0xd7, 0xf8, 0x27, 0x9a, - 0x32, 0x32, 0x2b, 0x48, 0xd8, 0x67, 0x98, 0x98, 0x37, 0x43, 0x8f, 0xc1, 0x18, 0x37, 0x4c, 0x7c, - 0x3d, 0x0e, 0x4a, 0x17, 0xad, 0x51, 0x4b, 0x25, 0xd2, 0x45, 0xcc, 0x6e, 0x79, 0xcd, 0xa4, 0xfd, - 0xcd, 0x7c, 0x10, 0xf2, 0xc2, 0xf8, 0x04, 0xbd, 0x04, 0x6b, 0xe1, 0x64, 0x9c, 0x97, 0xe0, 0x8d, - 0x78, 0x8c, 0x44, 0x9b, 0x6c, 0xbd, 0x65, 0xe0, 0xa6, 0xe2, 0x2d, 0x41, 0xfe, 0xc2, 0xec, 0x04, - 0x7b, 0xb0, 0x22, 0xd6, 0x97, 0xf4, 0x00, 0xe4, 0x58, 0x5f, 0x23, 0x4d, 0x5c, 0x94, 0x6b, 0xfd, - 0x6e, 0x0a, 0xf2, 0xc2, 0x7d, 0x44, 0x32, 0x05, 0x06, 0x91, 0xbe, 0xd1, 0x41, 0xdc, 0x7c, 0x93, - 0x74, 0x1f, 0x20, 0xaa, 0x29, 0xca, 0x55, 0xd3, 0xd1, 0x8d, 0x96, 0xc2, 0xe6, 0x82, 0xbf, 0x37, - 0x48, 0x9f, 0x5c, 0xa1, 0x0f, 0xd6, 0x48, 0xfd, 0x3d, 0xa7, 0xa0, 0xe8, 0xcb, 0x72, 0xa1, 0x31, - 0xc8, 0x5c, 0xc2, 0xd7, 0x2a, 0x23, 0xa8, 0x08, 0x63, 0x32, 0xa6, 0x39, 0x82, 0x4a, 0xea, 0xec, - 0xeb, 0x63, 0x30, 0x31, 0xdf, 0x58, 0x58, 0x9e, 0xef, 0x76, 0xdb, 0x3a, 0x7f, 0x9f, 0xee, 0x32, - 0x64, 0xe9, 0x3e, 0x39, 0xc1, 0xf9, 0x4e, 0x35, 0x49, 0xc2, 0x09, 0xc9, 0x30, 0x4a, 0xb7, 0xd3, - 0x28, 0xc9, 0xb1, 0x4f, 0x35, 0x51, 0x1e, 0x8a, 0x74, 0x92, 0x2a, 0x5c, 0x82, 0xd3, 0xa0, 0x6a, - 0x92, 0xe4, 0x14, 0xfa, 0x39, 0x28, 0x78, 0xfb, 0xe4, 0xa4, 0x67, 0x44, 0xd5, 0xc4, 0x69, 0x2b, - 0x82, 0xef, 0xed, 0x0c, 0x92, 0x1e, 0x4d, 0x54, 0x13, 0xe7, 0x6b, 0xd0, 0xb3, 0x30, 0x26, 0xf6, - 0x60, 0xc9, 0x4e, 0x71, 0xaa, 0x09, 0x53, 0x4a, 0x64, 0xfa, 0xd8, 0xd6, 0x39, 0xc9, 0x51, 0x55, - 0x35, 0x51, 0xde, 0x0c, 0x6d, 0x42, 0x8e, 0x07, 0xbf, 0x89, 0x4e, 0x7a, 0xaa, 0xc9, 0x12, 0x45, - 0x44, 0xc8, 0x5e, 0x72, 0x22, 0xe9, 0xf1, 0x5c, 0x35, 0x71, 0xc2, 0x10, 0xa9, 0x00, 0xbe, 0xfd, - 0x74, 0xe2, 0x73, 0xb7, 0x6a, 0xf2, 0x44, 0x20, 0xfa, 0x00, 0xe4, 0xdd, 0x5d, 0x53, 0xc2, 0x93, - 0xb4, 0x6a, 0xd2, 0x5c, 0x5c, 0x63, 0x33, 0xf1, 0x2d, 0x89, 0x7b, 0x63, 0x6f, 0x49, 0x78, 0x87, - 0xdc, 0xee, 0x31, 0xf8, 0x5f, 0xa6, 0xe0, 0x78, 0xf8, 0x38, 0x59, 0x35, 0xf6, 0x07, 0x5c, 0x08, - 0x18, 0x70, 0x5b, 0xe4, 0x31, 0xc8, 0xcc, 0x1b, 0xfb, 0x24, 0xd8, 0xa0, 0xdf, 0xf6, 0xeb, 0x59, - 0x6d, 0x91, 0xa6, 0x23, 0xe5, 0x4d, 0xab, 0x1d, 0x7d, 0x6b, 0xa4, 0x9e, 0xfd, 0xc1, 0xe7, 0x6b, - 0x23, 0x8d, 0xdd, 0x88, 0x51, 0xc5, 0xdc, 0x15, 0xc8, 0xcf, 0x1b, 0xfb, 0xe2, 0x9a, 0xc0, 0x28, - 0x1d, 0xd0, 0x61, 0x8f, 0xff, 0x5f, 0x2b, 0x11, 0x64, 0xbb, 0x63, 0xda, 0x67, 0xd8, 0x1f, 0x3e, - 0xe2, 0x1c, 0x2b, 0x0d, 0x38, 0xe1, 0x8f, 0xbf, 0x31, 0x50, 0x1d, 0x2c, 0x4d, 0xe9, 0x02, 0x64, - 0x17, 0x4c, 0x9d, 0x86, 0x3c, 0x4d, 0x6c, 0x98, 0x1d, 0x91, 0xf3, 0xa4, 0x05, 0x74, 0x0a, 0x72, - 0x6a, 0xc7, 0xec, 0x19, 0x8e, 0x88, 0x9a, 0x89, 0x2b, 0xf9, 0xaf, 0x07, 0xb5, 0xcc, 0xb2, 0xe1, - 0xc8, 0xfc, 0x51, 0x3d, 0xfb, 0xbd, 0x57, 0x6a, 0x29, 0xe9, 0x49, 0x18, 0x5b, 0xc4, 0xda, 0x8d, - 0x60, 0x2d, 0x62, 0x2d, 0x84, 0x75, 0x1a, 0xf2, 0xcb, 0x86, 0xc3, 0x3e, 0x1a, 0x76, 0x1b, 0x64, - 0x74, 0x83, 0x1d, 0x8b, 0x84, 0xda, 0x27, 0xf5, 0x84, 0x74, 0x11, 0x6b, 0x2e, 0x69, 0x13, 0x6b, - 0x61, 0x52, 0x02, 0x4f, 0xea, 0xa5, 0x06, 0x94, 0xae, 0xa8, 0x6d, 0x1e, 0xee, 0x61, 0x1b, 0xdd, - 0x07, 0x05, 0x55, 0x14, 0xe8, 0xce, 0xaa, 0xd4, 0x28, 0xff, 0xf0, 0xa0, 0x06, 0x1e, 0x91, 0xec, - 0x11, 0xd4, 0xb3, 0x2f, 0xfd, 0xb7, 0x93, 0x29, 0xc9, 0x84, 0xb1, 0x0b, 0xaa, 0x4d, 0x2d, 0xfd, - 0x83, 0x81, 0x44, 0x0a, 0x8d, 0x14, 0x1b, 0x47, 0xae, 0x1f, 0xd4, 0x26, 0xf7, 0xd5, 0x4e, 0xbb, - 0x2e, 0x79, 0xcf, 0x24, 0x7f, 0x7e, 0x65, 0xce, 0x97, 0x5f, 0xa1, 0x91, 0x64, 0x63, 0xea, 0xfa, - 0x41, 0x6d, 0xc2, 0xe3, 0x21, 0x4f, 0x24, 0x37, 0xe9, 0x22, 0x75, 0x21, 0xc7, 0x82, 0xde, 0xc8, - 0x13, 0x42, 0x9e, 0xf2, 0x49, 0x7b, 0x29, 0x9f, 0xfa, 0xa1, 0xd2, 0x0c, 0x3c, 0x2e, 0x63, 0x1c, - 0xf5, 0xec, 0x47, 0x5f, 0xa9, 0x8d, 0x48, 0x16, 0xa0, 0x75, 0xbd, 0xd3, 0x6b, 0xb3, 0x17, 0xbf, - 0xc5, 0x51, 0xd3, 0x83, 0xac, 0xdf, 0x34, 0x9d, 0xc4, 0x02, 0xb2, 0x89, 0x39, 0xae, 0xa4, 0x5c, - 0x20, 0x2c, 0xce, 0xf8, 0xd6, 0x41, 0x2d, 0x45, 0x7b, 0x4f, 0x65, 0x74, 0x17, 0xe4, 0x58, 0x28, - 0xcf, 0xe3, 0x9f, 0xb2, 0xe0, 0x61, 0x63, 0x92, 0xf9, 0x53, 0xe9, 0x71, 0x18, 0x5b, 0xb5, 0x5b, - 0x8b, 0x64, 0x48, 0xc7, 0x21, 0xdf, 0xb1, 0x5b, 0x8a, 0x2f, 0x9a, 0x1a, 0xeb, 0xd8, 0xad, 0x8d, - 0x01, 0x51, 0x18, 0x9f, 0x96, 0x77, 0x43, 0x6e, 0x63, 0x8f, 0xb2, 0x9f, 0x72, 0xa5, 0x94, 0xf1, - 0xf7, 0x91, 0xa3, 0x07, 0x98, 0x3e, 0x94, 0x01, 0xd8, 0xd8, 0x73, 0x47, 0x38, 0xe0, 0x08, 0x0e, - 0x49, 0x90, 0x73, 0xf6, 0xdc, 0x88, 0xba, 0xd0, 0x80, 0x57, 0x0f, 0x6a, 0xb9, 0x8d, 0x3d, 0xb2, - 0xbd, 0x90, 0xf9, 0x93, 0x60, 0x2a, 0x2b, 0x13, 0x4a, 0x65, 0xb9, 0x09, 0xbc, 0x6c, 0x44, 0x02, - 0x6f, 0xd4, 0x77, 0x02, 0x70, 0x0c, 0xc6, 0x2c, 0xf5, 0x9a, 0x42, 0x66, 0x94, 0x7d, 0x85, 0x34, - 0x67, 0xa9, 0xd7, 0x56, 0xcc, 0x16, 0x5a, 0x80, 0x6c, 0xdb, 0x6c, 0x89, 0xbc, 0xdb, 0x51, 0x31, - 0x28, 0x12, 0x71, 0xf1, 0xdb, 0xc4, 0x2b, 0x66, 0xab, 0x71, 0x8c, 0xc8, 0xff, 0x4b, 0x7f, 0x56, - 0x9b, 0x08, 0xd6, 0xdb, 0x32, 0x65, 0x76, 0x93, 0x81, 0xf9, 0x81, 0xc9, 0xc0, 0xc2, 0xb0, 0x64, - 0x20, 0x04, 0x93, 0x81, 0x77, 0xd0, 0x33, 0x4d, 0x76, 0x86, 0x33, 0xdd, 0x17, 0x7c, 0xce, 0x1b, - 0xfb, 0xf4, 0x14, 0xf5, 0x56, 0x28, 0xb8, 0x17, 0x85, 0xf8, 0x67, 0x9f, 0xbd, 0x0a, 0xae, 0x6f, - 0x1f, 0x4d, 0x41, 0x39, 0xd8, 0x63, 0x9a, 0xcf, 0xb1, 0x5b, 0xfc, 0x83, 0xa9, 0x2c, 0xed, 0x49, - 0x94, 0x62, 0x59, 0x64, 0xca, 0x43, 0x3a, 0x3f, 0x1f, 0xd2, 0xf9, 0x29, 0x21, 0x20, 0xf6, 0xee, - 0x0e, 0x53, 0xf5, 0x69, 0x2e, 0x9d, 0x92, 0xaf, 0xd2, 0xf6, 0x54, 0x9f, 0x6a, 0xc4, 0xcf, 0x43, - 0xd1, 0xf7, 0x34, 0x32, 0xa8, 0x7f, 0x24, 0x22, 0xd9, 0x31, 0xe9, 0x4e, 0x88, 0x78, 0x22, 0x8e, - 0x10, 0x3c, 0x52, 0x57, 0x51, 0x0b, 0x2e, 0x51, 0xd2, 0xeb, 0x15, 0x8d, 0xc5, 0x3f, 0xfd, 0xce, - 0x89, 0x91, 0x97, 0x5e, 0x3d, 0x31, 0x32, 0xf0, 0x7e, 0xa6, 0xff, 0x22, 0x6b, 0xc0, 0x83, 0xdc, - 0x6f, 0x37, 0x77, 0x43, 0xde, 0xf5, 0x63, 0xef, 0x83, 0x5b, 0x39, 0x8d, 0xed, 0xa8, 0xbb, 0xba, - 0xd1, 0x12, 0x7f, 0xb9, 0xbb, 0x29, 0xf3, 0xd1, 0xf0, 0xda, 0x1b, 0x77, 0x3b, 0x6f, 0xf6, 0xd2, - 0x58, 0x35, 0xca, 0x1b, 0x4a, 0x07, 0x59, 0x40, 0xab, 0x76, 0x6b, 0xc1, 0xc2, 0xec, 0x63, 0x23, - 0x7c, 0x9f, 0x14, 0x7c, 0xd9, 0x87, 0xdb, 0xa8, 0x5b, 0xe6, 0x82, 0x63, 0x71, 0xbf, 0x1b, 0xed, - 0xe5, 0x88, 0x02, 0xaf, 0x08, 0x2d, 0x01, 0xd0, 0xf4, 0x8a, 0x6d, 0x7b, 0xc9, 0xbc, 0x5a, 0x18, - 0x63, 0xc1, 0xa5, 0x90, 0x55, 0x07, 0xdb, 0x62, 0xae, 0x3d, 0x46, 0xf4, 0x41, 0x98, 0xea, 0xe8, - 0x86, 0x62, 0xe3, 0xf6, 0xb6, 0xd2, 0xc4, 0x6d, 0xfa, 0x29, 0x16, 0x7e, 0x70, 0x57, 0x68, 0xac, - 0x70, 0xc7, 0x74, 0x57, 0xfc, 0x9c, 0xcd, 0x2d, 0x1b, 0xce, 0xf5, 0x83, 0x5a, 0x95, 0x79, 0x87, - 0x08, 0x48, 0x49, 0x9e, 0xec, 0xe8, 0xc6, 0x3a, 0x6e, 0x6f, 0x2f, 0xba, 0x75, 0xe8, 0x45, 0x98, - 0xe4, 0x14, 0xa6, 0x97, 0xf4, 0x20, 0xb6, 0xa7, 0xd4, 0x58, 0xbd, 0x7e, 0x50, 0x9b, 0x61, 0x68, - 0x7d, 0x24, 0xd2, 0x0f, 0x0f, 0x6a, 0xf7, 0x27, 0xe8, 0xd3, 0xbc, 0xa6, 0x09, 0xf7, 0x58, 0x71, - 0x41, 0x78, 0x0d, 0x69, 0xdb, 0x4b, 0xd0, 0x8b, 0xb6, 0x47, 0xc3, 0x6d, 0xf7, 0x91, 0x24, 0x6d, - 0xdb, 0xe7, 0x9a, 0xbd, 0x0c, 0xbe, 0x68, 0xfb, 0x28, 0xe4, 0xba, 0xbd, 0x2d, 0x71, 0x8a, 0x56, - 0x90, 0x79, 0x09, 0xcd, 0xfa, 0x0f, 0xd2, 0x8a, 0x67, 0x4b, 0x62, 0x3e, 0x49, 0xac, 0xe2, 0xa6, - 0x39, 0x59, 0xec, 0x47, 0xa3, 0x8f, 0xaf, 0x65, 0xa0, 0xb2, 0x6a, 0xb7, 0x96, 0x9a, 0xba, 0x73, - 0x93, 0xd5, 0xab, 0x1b, 0x25, 0x1d, 0xea, 0xcd, 0x1a, 0x0b, 0xd7, 0x0f, 0x6a, 0x65, 0x26, 0x9d, - 0x9b, 0x29, 0x93, 0x0e, 0x4c, 0x78, 0x7a, 0xa9, 0x58, 0xaa, 0xc3, 0xdd, 0x53, 0x63, 0x31, 0xa1, - 0x06, 0x2e, 0x62, 0xed, 0xfa, 0x41, 0xed, 0x28, 0xeb, 0x59, 0x08, 0x4a, 0x92, 0xcb, 0x5a, 0x60, - 0x2d, 0xa0, 0xbd, 0x68, 0xc5, 0xa7, 0xe7, 0x4f, 0x8d, 0x8b, 0x6f, 0xa1, 0xd2, 0xf3, 0xa9, 0xfb, - 0x6a, 0x1a, 0x8a, 0xc4, 0xd5, 0xb3, 0x7a, 0x1c, 0xbd, 0x14, 0x52, 0x3f, 0xc6, 0xa5, 0x90, 0x7e, - 0x7b, 0x96, 0xc2, 0x3d, 0x6e, 0xac, 0x9d, 0x19, 0xa8, 0xf3, 0xc1, 0x90, 0xfb, 0x3f, 0x66, 0xa8, - 0x55, 0xa5, 0x3b, 0x48, 0x19, 0x37, 0xdf, 0x09, 0x02, 0xfc, 0xc5, 0x14, 0x1c, 0xf1, 0xc4, 0x63, - 0x5b, 0x5a, 0x48, 0x8a, 0x4f, 0x5f, 0x3f, 0xa8, 0xdd, 0x1a, 0x96, 0xa2, 0x8f, 0xec, 0x06, 0x24, - 0x39, 0xe5, 0x02, 0xad, 0x5b, 0x5a, 0x74, 0x3f, 0x9a, 0xb6, 0xe3, 0xf6, 0x23, 0x33, 0xb8, 0x1f, - 0x3e, 0xb2, 0x37, 0xd5, 0x8f, 0x45, 0xdb, 0xe9, 0x9f, 0xd4, 0x6c, 0xc2, 0x49, 0xfd, 0x7a, 0x1a, - 0xc6, 0x57, 0xed, 0xd6, 0xa6, 0xd1, 0xfc, 0xe9, 0x82, 0x38, 0xec, 0x82, 0xf8, 0x78, 0x0a, 0xca, - 0x17, 0x75, 0xdb, 0x31, 0x2d, 0x5d, 0x53, 0xdb, 0x74, 0x37, 0xe3, 0xdd, 0x91, 0x4c, 0x1d, 0xfe, - 0x8e, 0xe4, 0x23, 0x90, 0xbb, 0xaa, 0xb6, 0x6d, 0xec, 0xf0, 0xa0, 0xf1, 0x78, 0xd8, 0x77, 0x84, - 0x73, 0xc0, 0x9c, 0x9c, 0x77, 0xe7, 0x77, 0xd3, 0x30, 0x11, 0x0a, 0x3c, 0x50, 0x03, 0xb2, 0xd4, - 0xa2, 0xb3, 0x0d, 0xef, 0xdc, 0x21, 0xe2, 0x0a, 0xb2, 0x27, 0xa6, 0xbc, 0xe8, 0x67, 0x20, 0xdf, - 0x51, 0xf7, 0x98, 0x67, 0x60, 0xfb, 0x9b, 0xf9, 0xc3, 0xe1, 0x78, 0xbb, 0x57, 0x81, 0x23, 0xc9, - 0x63, 0x1d, 0x75, 0x8f, 0xfa, 0x83, 0x2e, 0x4c, 0x90, 0x5a, 0x6d, 0x47, 0x35, 0x5a, 0xd8, 0xef, - 0x7e, 0x2e, 0x1e, 0xba, 0x91, 0xa3, 0x5e, 0x23, 0x3e, 0x38, 0x49, 0x1e, 0xef, 0xa8, 0x7b, 0x0b, - 0xb4, 0x82, 0xb4, 0x58, 0xcf, 0xbf, 0xfc, 0x4a, 0x6d, 0x84, 0x4a, 0xec, 0xdf, 0xa7, 0x00, 0x3c, - 0x89, 0xa1, 0x0d, 0xa8, 0x84, 0xdc, 0x97, 0xb8, 0x63, 0x14, 0x1b, 0xe0, 0x79, 0x1b, 0xdb, 0x09, - 0x2d, 0x34, 0x05, 0x1f, 0x80, 0x22, 0xbb, 0x25, 0xa0, 0xd0, 0x64, 0x7c, 0x3a, 0x36, 0x19, 0x7f, - 0x82, 0x60, 0x5d, 0x3f, 0xa8, 0x21, 0x36, 0x1c, 0x1f, 0xb3, 0x44, 0x53, 0xf4, 0xc0, 0x6a, 0x08, - 0x43, 0x70, 0x2c, 0x45, 0x5f, 0x6c, 0x41, 0xef, 0x9e, 0x99, 0x86, 0xbe, 0x8b, 0x2d, 0x77, 0x8f, - 0xcc, 0x8a, 0xa8, 0x0a, 0x79, 0xf6, 0x55, 0x41, 0x67, 0x5f, 0xfc, 0xbb, 0x0a, 0x51, 0x26, 0x5c, - 0xd7, 0xf0, 0x96, 0xad, 0x8b, 0x59, 0x90, 0x45, 0x11, 0x9d, 0x87, 0x8a, 0x8d, 0xb5, 0x9e, 0xa5, - 0x3b, 0xfb, 0x8a, 0x66, 0x1a, 0x8e, 0xaa, 0x39, 0xdc, 0x69, 0xdf, 0x72, 0xfd, 0xa0, 0x76, 0x8c, - 0xf5, 0x35, 0x4c, 0x21, 0xc9, 0x13, 0xa2, 0x6a, 0x81, 0xd5, 0x90, 0x16, 0x9a, 0xd8, 0x51, 0xf5, - 0xb6, 0xcd, 0x37, 0xb6, 0xa2, 0xe8, 0x1b, 0xcb, 0xef, 0x8c, 0xf9, 0x0f, 0xa3, 0xae, 0x41, 0xc5, - 0xec, 0x62, 0x2b, 0xc2, 0x1e, 0xad, 0x78, 0x2d, 0x87, 0x29, 0x6e, 0xc0, 0x24, 0x4c, 0x08, 0x0c, - 0x61, 0x11, 0xce, 0x07, 0xee, 0x9c, 0xb1, 0xb8, 0x31, 0x1d, 0x1e, 0x72, 0x98, 0x42, 0xf2, 0x5f, - 0x34, 0x63, 0xd1, 0xe5, 0x51, 0xc8, 0x3d, 0xaf, 0xea, 0x6d, 0xf1, 0xa9, 0x55, 0x99, 0x97, 0xd0, - 0x32, 0xe4, 0x6c, 0x47, 0x75, 0x7a, 0x2c, 0xf4, 0x1e, 0x6d, 0xbc, 0x2b, 0x61, 0x9f, 0x1b, 0xa6, - 0xd1, 0x5c, 0xa7, 0x8c, 0x32, 0x07, 0x40, 0xe7, 0x21, 0xe7, 0x98, 0xbb, 0xd8, 0xe0, 0x42, 0x3d, - 0xd4, 0x4a, 0xa7, 0x89, 0x3a, 0xc6, 0x8d, 0x1c, 0xf0, 0x8c, 0xb2, 0x62, 0xef, 0xa8, 0x16, 0xb6, - 0x59, 0xa8, 0xdc, 0x58, 0x3e, 0xf4, 0x72, 0x3c, 0x16, 0xf6, 0x14, 0x0c, 0x4f, 0x92, 0x27, 0xdc, - 0xaa, 0x75, 0x5a, 0x13, 0x8e, 0x9c, 0xc7, 0x6e, 0x28, 0x72, 0x3e, 0x0f, 0x95, 0x9e, 0xb1, 0x65, - 0x1a, 0xf4, 0xb3, 0x88, 0x3c, 0x4d, 0x93, 0x3f, 0x99, 0x9a, 0xcd, 0xf8, 0x67, 0x2b, 0x4c, 0x21, - 0xc9, 0x13, 0x6e, 0x15, 0xbf, 0xfd, 0xd8, 0x84, 0xb2, 0x47, 0x45, 0x97, 0x6c, 0x21, 0x76, 0xc9, - 0xde, 0xce, 0x97, 0xec, 0x91, 0x70, 0x2b, 0xde, 0xaa, 0x1d, 0x77, 0x2b, 0x09, 0x1b, 0x7a, 0x5f, - 0x60, 0x1b, 0x09, 0xbc, 0x85, 0x81, 0x56, 0x26, 0xf9, 0x0e, 0xb2, 0xf8, 0xb6, 0xec, 0x20, 0xeb, - 0xa5, 0x8f, 0xbe, 0x52, 0x1b, 0x71, 0x17, 0xec, 0x2f, 0xa5, 0x21, 0xb7, 0x78, 0x85, 0xbe, 0x46, - 0xf9, 0x13, 0x1a, 0x3e, 0xf8, 0xac, 0xd7, 0x7b, 0x61, 0x8c, 0xc9, 0xc2, 0x46, 0x67, 0x61, 0xb4, - 0x4b, 0x7e, 0xf0, 0x5c, 0xe3, 0xd1, 0x3e, 0x95, 0xa6, 0x74, 0x62, 0x87, 0x49, 0x49, 0xa5, 0x2f, - 0x64, 0x00, 0x16, 0xaf, 0x5c, 0xd9, 0xb0, 0xf4, 0x6e, 0x1b, 0x3b, 0x3f, 0x0d, 0xaf, 0xdf, 0x39, - 0xe1, 0xb5, 0x6f, 0x8e, 0x9f, 0x82, 0xa2, 0x37, 0x47, 0x36, 0x7a, 0x0c, 0xf2, 0x0e, 0xff, 0xcd, - 0xa7, 0xba, 0xda, 0x3f, 0xd5, 0x82, 0x9c, 0x4f, 0xb7, 0xcb, 0x21, 0xfd, 0x97, 0x34, 0x40, 0x5c, - 0x72, 0xe6, 0x27, 0x20, 0x00, 0x3f, 0x0f, 0x39, 0xee, 0x71, 0x32, 0x37, 0x14, 0xad, 0x72, 0x6e, - 0xdf, 0x2c, 0x7d, 0x27, 0x0d, 0x53, 0x9b, 0xc2, 0xec, 0xfe, 0x54, 0xc2, 0xe8, 0x22, 0x8c, 0x61, - 0xc3, 0xb1, 0x74, 0x2c, 0xd2, 0xe0, 0xb3, 0x61, 0x2d, 0x8d, 0x90, 0x16, 0xfd, 0x77, 0x09, 0xe2, - 0xb6, 0x1c, 0x67, 0xf7, 0xc9, 0xf8, 0x13, 0x19, 0x98, 0x19, 0xc4, 0x85, 0x16, 0x60, 0x42, 0xb3, - 0x30, 0xad, 0x50, 0xfc, 0x27, 0x27, 0x8d, 0xaa, 0x2f, 0x63, 0x14, 0x24, 0x90, 0xe4, 0xb2, 0xa8, - 0xe1, 0x0e, 0xb9, 0x45, 0x13, 0x54, 0x64, 0xa9, 0x10, 0xaa, 0x84, 0x41, 0xb4, 0xc4, 0x3d, 0xb2, - 0x97, 0x96, 0xf2, 0x03, 0x30, 0x97, 0x5c, 0xf6, 0x6a, 0xa9, 0x4f, 0x7e, 0x01, 0x26, 0x74, 0x43, - 0x77, 0x74, 0xb5, 0xad, 0x6c, 0xa9, 0x6d, 0xd5, 0xd0, 0x6e, 0x64, 0x2b, 0xc2, 0xbc, 0x29, 0x6f, - 0x36, 0x04, 0x27, 0xc9, 0x65, 0x5e, 0xd3, 0x60, 0x15, 0x64, 0x46, 0x44, 0x53, 0xd9, 0x1b, 0x0a, - 0xdc, 0x04, 0xbb, 0x6f, 0x46, 0x7e, 0x39, 0x03, 0x93, 0x6e, 0x7e, 0xe6, 0xa7, 0x53, 0x91, 0x74, - 0x2a, 0x56, 0x01, 0x98, 0x01, 0x21, 0x9e, 0xe3, 0x06, 0x66, 0x83, 0x98, 0xa0, 0x02, 0x43, 0x58, - 0xb4, 0x1d, 0xdf, 0x7c, 0xfc, 0x45, 0x06, 0x4a, 0xfe, 0xf9, 0xf8, 0xa9, 0x4b, 0x7f, 0x07, 0x65, - 0xcc, 0xe6, 0x3d, 0x93, 0x98, 0xe5, 0xdf, 0x45, 0x09, 0x99, 0xc4, 0xbe, 0xa5, 0x34, 0xd8, 0x16, - 0xfe, 0x55, 0x1a, 0x72, 0xfc, 0x5e, 0xb6, 0xd6, 0xb7, 0x8b, 0x48, 0xc5, 0xdd, 0xfb, 0x1e, 0xbe, - 0x89, 0x78, 0x39, 0x72, 0x13, 0x51, 0xee, 0xa8, 0x7b, 0x4a, 0xe0, 0x2d, 0xa6, 0xd4, 0xec, 0x78, - 0xe3, 0xb8, 0x87, 0x12, 0x7c, 0xce, 0x72, 0x21, 0xde, 0x9d, 0x5c, 0xf4, 0x08, 0x14, 0x09, 0x85, - 0xe7, 0x15, 0x08, 0xfb, 0x51, 0x2f, 0xf9, 0xe0, 0x7b, 0x28, 0xc9, 0xd0, 0x51, 0xf7, 0x96, 0x58, - 0x01, 0xad, 0x00, 0xda, 0x71, 0x53, 0x5f, 0x8a, 0x27, 0x42, 0xc2, 0x7f, 0xdb, 0xf5, 0x83, 0xda, - 0x71, 0xc6, 0xdf, 0x4f, 0x23, 0xc9, 0x93, 0x5e, 0xa5, 0x40, 0x7b, 0x10, 0x80, 0x8c, 0x4b, 0x61, - 0x77, 0x42, 0xd8, 0x16, 0xd6, 0x77, 0x51, 0xc2, 0x7b, 0x26, 0xc9, 0x05, 0x52, 0x58, 0x24, 0xbf, - 0x7d, 0x82, 0xff, 0x95, 0x14, 0x20, 0xcf, 0xf7, 0xb8, 0xe7, 0xf5, 0xef, 0xa3, 0xef, 0x25, 0x8a, - 0x9d, 0x51, 0x2a, 0x7a, 0x93, 0xe5, 0xf1, 0x89, 0x4d, 0x96, 0x6f, 0xa9, 0xde, 0xe7, 0xd9, 0xe7, - 0xf4, 0xc0, 0xac, 0x60, 0x84, 0x0d, 0xfe, 0xd7, 0x29, 0x38, 0xde, 0xa7, 0x38, 0x6e, 0xbf, 0xae, - 0x00, 0xb2, 0x7c, 0x0f, 0xf9, 0x7f, 0x28, 0x4a, 0xf1, 0xff, 0xf8, 0x97, 0x50, 0xff, 0x26, 0xad, - 0x3e, 0x1b, 0x7f, 0xf3, 0xbc, 0x09, 0xcf, 0x28, 0xa6, 0x60, 0xda, 0xdf, 0xbc, 0x3b, 0x80, 0xf3, - 0x50, 0xf2, 0xb7, 0xce, 0xbb, 0x7e, 0xeb, 0xb0, 0xae, 0xf3, 0x5e, 0x07, 0xf8, 0xd0, 0xb2, 0xb7, - 0xfa, 0xc4, 0x3f, 0x9d, 0x8c, 0x1b, 0xbd, 0x7b, 0x91, 0x2d, 0xb4, 0x0a, 0x59, 0x8f, 0xff, 0x5f, - 0x0a, 0xb2, 0x6b, 0xa6, 0xd9, 0x46, 0x26, 0x4c, 0x1a, 0xa6, 0xa3, 0x10, 0x65, 0xc1, 0x4d, 0x85, - 0xe7, 0x46, 0x58, 0x16, 0x74, 0xe1, 0x70, 0x42, 0xf9, 0xfe, 0x41, 0xad, 0x1f, 0x4a, 0x9e, 0x30, - 0x4c, 0xa7, 0x41, 0x6b, 0x36, 0x58, 0xe6, 0xe4, 0x83, 0x30, 0x1e, 0x6c, 0x8c, 0x65, 0x8a, 0x9e, - 0x39, 0x74, 0x63, 0x41, 0x98, 0xeb, 0x07, 0xb5, 0x69, 0x6f, 0x11, 0xb8, 0xd5, 0x92, 0x5c, 0xda, - 0xf2, 0xb5, 0x5e, 0xcf, 0x93, 0xd1, 0xff, 0xe0, 0x95, 0x5a, 0xaa, 0x71, 0x7e, 0xe0, 0x0d, 0x80, - 0xfb, 0x86, 0x76, 0x61, 0xcf, 0x3d, 0xea, 0x0f, 0xde, 0x05, 0xf8, 0x52, 0x1a, 0x6e, 0xe3, 0xd4, - 0xf4, 0xfd, 0xe3, 0x33, 0x5d, 0xb5, 0xa5, 0x1b, 0xfe, 0xcf, 0xef, 0x94, 0xf8, 0x94, 0xd1, 0xc7, - 0x92, 0x01, 0xc5, 0x35, 0xb5, 0x85, 0xc5, 0x87, 0x5c, 0xfa, 0xbf, 0xaa, 0x74, 0x14, 0x72, 0xe6, - 0xf6, 0x36, 0xcb, 0x72, 0xa7, 0x66, 0xb3, 0x32, 0x2f, 0xa1, 0x69, 0x18, 0x6d, 0xeb, 0x1d, 0xdd, - 0xe1, 0x2f, 0xaf, 0xb2, 0x02, 0xaa, 0x41, 0x51, 0x33, 0x7b, 0x86, 0xa3, 0xb0, 0x6b, 0xec, 0x59, - 0xf1, 0x4d, 0xdf, 0x9e, 0xe1, 0x6c, 0x90, 0x1a, 0xe9, 0x09, 0x28, 0xb1, 0xf6, 0xb8, 0x6a, 0x1e, - 0x87, 0x3c, 0x7d, 0x27, 0xc1, 0x6b, 0x75, 0x8c, 0x94, 0xf9, 0xa5, 0x72, 0x86, 0xc2, 0x1a, 0x66, - 0x85, 0x46, 0x63, 0xa0, 0xc0, 0x66, 0xe3, 0xe7, 0x8c, 0xc9, 0xc4, 0x15, 0xd6, 0xf7, 0xce, 0x40, - 0x35, 0x74, 0x71, 0x82, 0x12, 0x0c, 0xb8, 0x36, 0x31, 0x5c, 0xb0, 0x03, 0x6e, 0x55, 0x0c, 0xbd, - 0x99, 0x21, 0xed, 0xc2, 0x51, 0x7a, 0xef, 0xd5, 0xb3, 0xf1, 0x62, 0x26, 0x8e, 0xba, 0xd9, 0xc6, - 0x14, 0xff, 0xe7, 0xea, 0x2c, 0x75, 0xf8, 0x28, 0x80, 0xd7, 0xb2, 0xfb, 0x76, 0x92, 0x7f, 0x4e, - 0xe7, 0x7c, 0x13, 0x2a, 0xfb, 0x88, 0xa5, 0x5f, 0x4f, 0xc1, 0xb1, 0xbe, 0xd6, 0xf8, 0x3c, 0x3c, - 0x11, 0x78, 0xbb, 0x36, 0x95, 0xec, 0x40, 0xc3, 0xff, 0x99, 0x8c, 0x7a, 0x44, 0xbf, 0xaa, 0x51, - 0xfd, 0x62, 0x0d, 0x06, 0x3a, 0xf6, 0x02, 0x1c, 0x09, 0xf6, 0x4b, 0x08, 0xe1, 0x59, 0x28, 0x07, - 0xb7, 0x56, 0x3c, 0xee, 0x7a, 0xd7, 0xe1, 0xc3, 0x89, 0xf1, 0xc0, 0xf6, 0x4a, 0x7a, 0x26, 0x2c, - 0x78, 0x57, 0x12, 0xef, 0xed, 0x7f, 0x53, 0x21, 0x56, 0x10, 0xbe, 0x17, 0xd9, 0xbe, 0x9a, 0x82, - 0x93, 0x41, 0x64, 0xcf, 0x63, 0xd9, 0x6f, 0xf9, 0xb8, 0xde, 0x8c, 0x7a, 0xfc, 0xa7, 0x14, 0xdc, - 0x3e, 0xa4, 0xe7, 0x5c, 0x3c, 0x16, 0x4c, 0xfb, 0x5c, 0xa1, 0xc5, 0xab, 0x85, 0xca, 0x48, 0x83, - 0xdd, 0xb5, 0xeb, 0x09, 0x6e, 0xe1, 0xf7, 0xb6, 0xa6, 0xfa, 0x9f, 0xd9, 0xf2, 0x54, 0xbf, 0xfb, - 0x7a, 0x73, 0xba, 0xf5, 0x8d, 0x14, 0x9c, 0x0e, 0x8e, 0x2a, 0x62, 0xfb, 0xfb, 0xce, 0x9e, 0x98, - 0x7f, 0x93, 0x82, 0x7b, 0x92, 0x0c, 0x81, 0xcf, 0xd0, 0x73, 0x30, 0xe5, 0x05, 0xa3, 0xe1, 0x09, - 0x3a, 0x95, 0x20, 0x85, 0xc0, 0x95, 0x1a, 0xb9, 0x28, 0x37, 0x67, 0x26, 0xfe, 0x38, 0xc5, 0xd7, - 0x9c, 0x7f, 0xde, 0x5d, 0xb1, 0x07, 0xf7, 0x4f, 0x87, 0x14, 0xbb, 0x6f, 0x0f, 0x35, 0x1e, 0xd8, - 0x43, 0x45, 0x4c, 0x68, 0xfa, 0x26, 0x59, 0x90, 0x0f, 0x0b, 0x6b, 0x1a, 0x11, 0xc9, 0xee, 0xc2, - 0x54, 0xc4, 0x22, 0x71, 0x5f, 0xcf, 0x8d, 0x5f, 0x23, 0x47, 0x7f, 0x78, 0x50, 0x8b, 0x08, 0x91, - 0x65, 0xd4, 0xbf, 0x3c, 0xa4, 0xff, 0x9c, 0x82, 0x1a, 0xed, 0x48, 0xc4, 0x54, 0xfe, 0x4d, 0x16, - 0x30, 0xe6, 0x86, 0x34, 0x72, 0x58, 0x5c, 0xd0, 0xf3, 0x90, 0x63, 0x5a, 0xca, 0x65, 0x7b, 0x08, - 0xf5, 0xe6, 0x8c, 0x9e, 0xc1, 0x5e, 0x14, 0xe3, 0x8a, 0xb6, 0x0b, 0x6f, 0x91, 0xfc, 0xde, 0x84, - 0x5d, 0xf8, 0x57, 0xc2, 0x60, 0x47, 0xf7, 0x9c, 0x8b, 0xe8, 0x03, 0x6f, 0xda, 0x60, 0xf3, 0xcf, - 0x2e, 0xbd, 0x65, 0x96, 0xd9, 0xed, 0x7e, 0x8c, 0x65, 0x7e, 0xe7, 0xcd, 0x80, 0x6b, 0x99, 0x63, - 0x86, 0xf0, 0x0e, 0xb7, 0xcc, 0xd7, 0xd3, 0x70, 0x9c, 0x0e, 0xc3, 0xbf, 0x7d, 0x7b, 0x1b, 0x24, - 0xaf, 0x00, 0xb2, 0x2d, 0x4d, 0xb9, 0x59, 0xf6, 0xa3, 0x62, 0x5b, 0xda, 0x95, 0x80, 0xd3, 0x55, - 0x00, 0x35, 0x6d, 0x27, 0xdc, 0x40, 0xe6, 0x86, 0x1b, 0x68, 0xda, 0xce, 0x95, 0x21, 0x5e, 0x3d, - 0x7b, 0x18, 0xdd, 0xf9, 0xc3, 0x14, 0x54, 0xa3, 0x84, 0xce, 0x75, 0x45, 0x85, 0xa3, 0x81, 0xa4, - 0x43, 0x58, 0x5d, 0xee, 0x18, 0xb6, 0xf5, 0x0e, 0x2d, 0xdd, 0x23, 0x16, 0xbe, 0xd9, 0x8b, 0xf7, - 0x2b, 0xc2, 0xe9, 0xb8, 0x9a, 0xdf, 0xbf, 0x85, 0x79, 0x47, 0x2e, 0xd9, 0xdf, 0xea, 0x33, 0xf7, - 0xef, 0xb4, 0xdd, 0xd0, 0x9f, 0xa4, 0xe0, 0xc4, 0x80, 0x1e, 0xfe, 0x4d, 0x76, 0xe7, 0x3f, 0x3f, - 0x50, 0x61, 0x6e, 0xd6, 0xd6, 0xeb, 0x41, 0xbe, 0xa0, 0x82, 0x97, 0xfc, 0x7c, 0x1b, 0xea, 0xc8, - 0x0f, 0xf2, 0x3d, 0x0d, 0xb7, 0x44, 0x72, 0xf1, 0x3e, 0x9d, 0x85, 0xec, 0x8e, 0x6e, 0x3b, 0xee, - 0x57, 0x2a, 0x42, 0xdd, 0x09, 0x71, 0x51, 0x5a, 0x09, 0x41, 0x85, 0x42, 0xae, 0x99, 0x66, 0x9b, - 0x37, 0x2f, 0x2d, 0xc0, 0xa4, 0xaf, 0x8e, 0x83, 0xcf, 0x41, 0xb6, 0x6b, 0x9a, 0x6d, 0x0e, 0x3e, - 0x1d, 0x06, 0x27, 0xb4, 0x7c, 0x98, 0x94, 0x4e, 0x9a, 0x06, 0xc4, 0x40, 0xd8, 0xf7, 0x53, 0x38, - 0xf4, 0x47, 0x52, 0x30, 0x15, 0xa8, 0x76, 0xdf, 0xf0, 0xca, 0x05, 0x3e, 0xbd, 0xd5, 0x77, 0x9f, - 0x81, 0xd1, 0xbb, 0xef, 0xf2, 0xb3, 0x54, 0xf8, 0x9b, 0x50, 0xdd, 0xb3, 0x7f, 0x54, 0x12, 0xaf, - 0x04, 0x2b, 0x00, 0xbe, 0xbc, 0xf5, 0x5d, 0xe1, 0x96, 0xa3, 0x93, 0x1e, 0xd5, 0xbb, 0x63, 0xe9, - 0x78, 0xcc, 0x3b, 0x82, 0x7e, 0xc6, 0x7f, 0xe7, 0xec, 0xce, 0xe1, 0x7c, 0x02, 0xfe, 0xae, 0x38, - 0x32, 0x17, 0xfd, 0x6f, 0xc1, 0x74, 0xd4, 0x2e, 0x18, 0x3d, 0x30, 0x1c, 0xa1, 0x3f, 0x6e, 0xa9, - 0xbe, 0xeb, 0x10, 0x1c, 0x6e, 0xf3, 0x2f, 0xa7, 0xe0, 0xb6, 0xa1, 0x9b, 0x3d, 0xf4, 0xe8, 0x70, - 0xd8, 0x21, 0x91, 0x54, 0xb5, 0x7e, 0x23, 0xac, 0x6e, 0xd7, 0x94, 0xc0, 0xe5, 0x87, 0x68, 0x89, - 0xf6, 0xed, 0x3f, 0x06, 0x4c, 0x6c, 0x7f, 0xac, 0x29, 0x8d, 0xa0, 0x17, 0xa3, 0x2f, 0x01, 0x9c, - 0x89, 0x44, 0x18, 0xbc, 0xe5, 0xa9, 0x3e, 0x90, 0x9c, 0xc1, 0x3f, 0xed, 0x51, 0xb1, 0xf4, 0x80, - 0x69, 0x1f, 0xb2, 0x61, 0x18, 0x30, 0xed, 0xc3, 0x02, 0x75, 0x3e, 0xed, 0x43, 0x23, 0xc9, 0x01, - 0xd3, 0x9e, 0x24, 0x80, 0x1e, 0x30, 0xed, 0x89, 0x02, 0x57, 0x69, 0x04, 0xed, 0xc0, 0x78, 0x20, - 0x4e, 0x41, 0xa7, 0x23, 0xe1, 0xa2, 0x02, 0xc8, 0xea, 0x3d, 0x49, 0x48, 0xfd, 0xf3, 0x1f, 0xe1, - 0x9a, 0x07, 0xcc, 0xff, 0xe0, 0xe8, 0xa3, 0xfa, 0x40, 0x72, 0x06, 0xb7, 0xed, 0x6b, 0xee, 0xb9, - 0x94, 0x8f, 0x00, 0xcd, 0x25, 0x44, 0x12, 0x2d, 0x9f, 0x49, 0x4c, 0xef, 0x36, 0xbc, 0xdb, 0x77, - 0x35, 0x3d, 0x5a, 0x68, 0x91, 0xae, 0xad, 0x7a, 0x6f, 0x22, 0x5a, 0xb7, 0xb1, 0x55, 0x7e, 0xe8, - 0x72, 0x32, 0x92, 0xcd, 0xe7, 0xb4, 0xaa, 0xb7, 0x0f, 0xa1, 0x70, 0xe1, 0xd6, 0xdd, 0x53, 0x54, - 0x29, 0x9a, 0xdc, 0xef, 0xac, 0xaa, 0xa7, 0x86, 0xd2, 0x08, 0xd0, 0x9b, 0x7e, 0x2e, 0xf2, 0xe5, - 0x7c, 0xdf, 0x3b, 0x92, 0x2d, 0x6c, 0x60, 0x5b, 0xb7, 0x0f, 0xf5, 0x8e, 0xe4, 0xf0, 0x6c, 0xfe, - 0x87, 0x73, 0x50, 0xba, 0xc0, 0x50, 0xe9, 0x87, 0xa1, 0xd1, 0xe3, 0x09, 0x3d, 0x70, 0x99, 0x78, - 0xe0, 0x1f, 0x1e, 0xd4, 0xb8, 0x20, 0x5d, 0x5f, 0x6c, 0xf3, 0x2f, 0x44, 0xb1, 0xaf, 0xbb, 0x78, - 0x9f, 0xd8, 0x29, 0x1d, 0xea, 0x7e, 0x2f, 0xbb, 0x58, 0xc1, 0xaf, 0xd4, 0x86, 0xf1, 0x24, 0xf6, - 0xb1, 0x29, 0x7a, 0x3a, 0x43, 0xbf, 0x0f, 0x83, 0x3e, 0x95, 0x82, 0x23, 0x94, 0xca, 0x0b, 0x04, - 0x29, 0xa5, 0xb8, 0x85, 0xd4, 0x37, 0xcb, 0x2b, 0xaa, 0x6f, 0x5b, 0x44, 0x31, 0x1a, 0x75, 0x7e, - 0x38, 0x7e, 0xab, 0xaf, 0xd1, 0x30, 0x9c, 0xf4, 0xc3, 0x83, 0x1a, 0xea, 0xe7, 0x95, 0xe9, 0xd7, - 0x4c, 0x83, 0x75, 0xd1, 0xdf, 0xf4, 0x1e, 0x12, 0x1b, 0x4e, 0x72, 0x81, 0x7a, 0x31, 0x42, 0x20, - 0x3c, 0x5f, 0x83, 0xa2, 0xcf, 0xf8, 0xcc, 0x8c, 0x0e, 0xb8, 0x03, 0xe8, 0xed, 0xbb, 0x11, 0xc7, - 0xf3, 0xf9, 0x3e, 0xd9, 0x0f, 0x81, 0x7e, 0x2d, 0x05, 0x47, 0xbc, 0xbd, 0xbd, 0x1f, 0x3c, 0x97, - 0x7c, 0x77, 0x7f, 0x2e, 0x28, 0xb5, 0x48, 0x3c, 0x22, 0xb5, 0x28, 0x07, 0x29, 0x4f, 0xf7, 0xa2, - 0x1c, 0xc6, 0xb3, 0x30, 0xee, 0xdf, 0xfc, 0x79, 0x5f, 0x7a, 0x1c, 0x76, 0xf6, 0x3b, 0xcd, 0x47, - 0x1b, 0xb8, 0x07, 0x23, 0x07, 0x81, 0x50, 0x15, 0xf2, 0x78, 0xaf, 0x6b, 0x5a, 0x0e, 0x6e, 0xd2, - 0x8b, 0xdb, 0x79, 0xd9, 0x2d, 0x4b, 0xd7, 0x20, 0x62, 0x62, 0xd1, 0x53, 0xa1, 0xcf, 0x54, 0xdd, - 0xc8, 0xa6, 0xa2, 0xff, 0xcb, 0x56, 0xfe, 0x4f, 0x4e, 0xdd, 0x6c, 0xb3, 0xf1, 0xff, 0x03, 0x00, - 0x00, 0xff, 0xff, 0x93, 0x55, 0x11, 0xf3, 0xb7, 0x9b, 0x00, 0x00, + 0x79, 0x1f, 0xf6, 0x81, 0xc5, 0xee, 0xb7, 0x8b, 0xdd, 0x45, 0x03, 0x77, 0xb7, 0xb7, 0x24, 0x6f, + 0x8f, 0x73, 0x7c, 0xe0, 0xf8, 0xc0, 0x51, 0x27, 0x3e, 0xf7, 0x28, 0x52, 0x58, 0x00, 0x77, 0x07, + 0x12, 0xb8, 0x03, 0x07, 0xc0, 0x91, 0xa2, 0x6c, 0xaf, 0x07, 0xb3, 0x8d, 0xc5, 0x10, 0xbb, 0x33, + 0xcb, 0x99, 0xd9, 0x3b, 0x80, 0xa5, 0x54, 0x31, 0x65, 0x59, 0x0f, 0x47, 0xb6, 0x64, 0xc7, 0x76, + 0x64, 0x45, 0x92, 0x29, 0xa5, 0x12, 0x39, 0x4a, 0xe2, 0x47, 0xa2, 0xe8, 0x61, 0xe7, 0x0f, 0xa5, + 0x9c, 0xc4, 0x4a, 0x95, 0x2b, 0x25, 0x25, 0x4e, 0xca, 0x95, 0x4a, 0xc1, 0x16, 0xa9, 0x2a, 0x2b, + 0x0a, 0x93, 0x28, 0x17, 0xda, 0xe5, 0x92, 0xfe, 0x48, 0xaa, 0x5f, 0xf3, 0xda, 0xd9, 0x9d, 0xc1, + 0xf1, 0x48, 0xd1, 0x25, 0xfd, 0x85, 0x9d, 0x9e, 0xef, 0xfb, 0x75, 0xf7, 0xd7, 0x5f, 0x7f, 0xdf, + 0xd7, 0x5f, 0x77, 0x0f, 0xe0, 0x8b, 0x49, 0xb8, 0x4d, 0x35, 0xac, 0xae, 0x61, 0x9d, 0x79, 0xb1, + 0x8f, 0xcd, 0xfd, 0x33, 0x3d, 0xa5, 0xad, 0xe9, 0x8a, 0xad, 0x19, 0xfa, 0x5c, 0xcf, 0x34, 0x6c, + 0x03, 0x15, 0xd8, 0xeb, 0x39, 0xfa, 0x5a, 0xd2, 0x21, 0xbf, 0xa6, 0xb4, 0xb1, 0x8c, 0x5f, 0xec, + 0x63, 0xcb, 0x46, 0x65, 0x48, 0xed, 0xe2, 0xfd, 0x4a, 0xe2, 0x64, 0x62, 0xb6, 0x20, 0x93, 0x9f, + 0xe8, 0x28, 0x64, 0x8c, 0xed, 0x6d, 0x0b, 0xdb, 0x95, 0xe4, 0xc9, 0xc4, 0x6c, 0x5a, 0xe6, 0x4f, + 0x68, 0x06, 0xc6, 0x3b, 0x5a, 0x57, 0xb3, 0x2b, 0x29, 0x5a, 0xcc, 0x1e, 0x50, 0x0d, 0xf2, 0xaa, + 0xd1, 0xd7, 0xed, 0xa6, 0x6d, 0xd8, 0x4a, 0xa7, 0x92, 0x3e, 0x99, 0x98, 0xcd, 0xca, 0x40, 0x8b, + 0x36, 0x48, 0x89, 0xf4, 0x24, 0x14, 0x58, 0x7d, 0x56, 0xcf, 0xd0, 0x2d, 0x8c, 0x8e, 0x43, 0x56, + 0xc7, 0x7b, 0x76, 0xd3, 0xad, 0x75, 0x82, 0x3c, 0x3f, 0x8d, 0xf7, 0x49, 0x0d, 0x0c, 0x85, 0x55, + 0xcc, 0x1e, 0x1a, 0x8d, 0x6f, 0xbc, 0x7a, 0x22, 0xf1, 0xcd, 0x57, 0x4f, 0x24, 0xfe, 0xfc, 0xd5, + 0x13, 0x89, 0x4f, 0xbc, 0x76, 0x62, 0xec, 0x9b, 0xaf, 0x9d, 0x18, 0xfb, 0xd3, 0xd7, 0x4e, 0x8c, + 0x3d, 0x3f, 0xdb, 0xd6, 0xec, 0x9d, 0xfe, 0xd6, 0x9c, 0x6a, 0x74, 0xcf, 0x70, 0x11, 0xb0, 0x3f, + 0xf7, 0x5b, 0xad, 0xdd, 0x33, 0xf6, 0x7e, 0x0f, 0x73, 0x99, 0x6c, 0x65, 0xa8, 0x24, 0xde, 0x0d, + 0x7f, 0x78, 0x0e, 0x4e, 0xb6, 0x0d, 0xa3, 0xdd, 0xc1, 0x67, 0x68, 0xc9, 0x56, 0x7f, 0xfb, 0x4c, + 0x0b, 0x5b, 0xaa, 0xa9, 0xf5, 0x6c, 0xc3, 0xe4, 0xf2, 0x2a, 0x31, 0x8a, 0x39, 0x41, 0x21, 0xad, + 0xc2, 0xd4, 0x79, 0xad, 0x83, 0x17, 0x1d, 0xc2, 0x75, 0x6c, 0xa3, 0x47, 0x21, 0xbd, 0xad, 0x75, + 0x70, 0x25, 0x71, 0x32, 0x35, 0x9b, 0x3f, 0x7b, 0xc7, 0x5c, 0x80, 0x69, 0xce, 0xcf, 0xb1, 0x46, + 0x8a, 0x65, 0xca, 0x21, 0x7d, 0x27, 0x0d, 0xd3, 0x21, 0x6f, 0x11, 0x82, 0xb4, 0xae, 0x74, 0x31, + 0x95, 0x4a, 0x4e, 0xa6, 0xbf, 0x51, 0x05, 0x26, 0x7a, 0x8a, 0xba, 0xab, 0xb4, 0x31, 0x15, 0x4a, + 0x4e, 0x16, 0x8f, 0xe8, 0x04, 0x40, 0x0b, 0xf7, 0xb0, 0xde, 0xc2, 0xba, 0xba, 0x5f, 0x49, 0x9d, + 0x4c, 0xcd, 0xe6, 0x64, 0x4f, 0x09, 0xba, 0x17, 0xa6, 0x7a, 0xfd, 0xad, 0x8e, 0xa6, 0x36, 0x3d, + 0x64, 0x70, 0x32, 0x35, 0x3b, 0x2e, 0x97, 0xd9, 0x8b, 0x45, 0x97, 0xf8, 0x6e, 0x28, 0x5d, 0xc3, + 0xca, 0xae, 0x97, 0x34, 0x4f, 0x49, 0x8b, 0xa4, 0xd8, 0x43, 0xb8, 0x00, 0x85, 0x2e, 0xb6, 0x2c, + 0xa5, 0x8d, 0x9b, 0x44, 0xbe, 0x95, 0x34, 0xed, 0xfd, 0xc9, 0x81, 0xde, 0x07, 0x7b, 0x9e, 0xe7, + 0x5c, 0x1b, 0xfb, 0x3d, 0x8c, 0xe6, 0x21, 0x87, 0xf5, 0x7e, 0x97, 0x21, 0x8c, 0x0f, 0x91, 0xdf, + 0x92, 0xde, 0xef, 0x06, 0x51, 0xb2, 0x84, 0x8d, 0x43, 0x4c, 0x58, 0xd8, 0xbc, 0xaa, 0xa9, 0xb8, + 0x92, 0xa1, 0x00, 0x77, 0x0f, 0x00, 0xac, 0xb3, 0xf7, 0x41, 0x0c, 0xc1, 0x87, 0x16, 0x20, 0x87, + 0xf7, 0x6c, 0xac, 0x5b, 0x9a, 0xa1, 0x57, 0x26, 0x28, 0xc8, 0x9d, 0x21, 0xa3, 0x88, 0x3b, 0xad, + 0x20, 0x84, 0xcb, 0x87, 0x1e, 0x86, 0x09, 0xa3, 0x47, 0xe6, 0x9a, 0x55, 0xc9, 0x9e, 0x4c, 0xcc, + 0xe6, 0xcf, 0xde, 0x1a, 0xaa, 0x08, 0x97, 0x19, 0x8d, 0x2c, 0x88, 0xd1, 0x32, 0x94, 0x2d, 0xa3, + 0x6f, 0xaa, 0xb8, 0xa9, 0x1a, 0x2d, 0xdc, 0xd4, 0xf4, 0x6d, 0xa3, 0x92, 0xa3, 0x00, 0xb5, 0xc1, + 0x8e, 0x50, 0xc2, 0x05, 0xa3, 0x85, 0x97, 0xf5, 0x6d, 0x43, 0x2e, 0x5a, 0xbe, 0x67, 0x32, 0x5f, + 0xad, 0x7d, 0xdd, 0x56, 0xf6, 0x2a, 0x05, 0xaa, 0x21, 0xfc, 0x49, 0xfa, 0x5a, 0x06, 0x4a, 0x71, + 0x54, 0xec, 0x1c, 0x8c, 0x6f, 0x93, 0x5e, 0x56, 0x92, 0x87, 0x91, 0x01, 0xe3, 0xf1, 0x0b, 0x31, + 0x73, 0x83, 0x42, 0x9c, 0x87, 0xbc, 0x8e, 0x2d, 0x1b, 0xb7, 0x98, 0x46, 0xa4, 0x62, 0xea, 0x14, + 0x30, 0xa6, 0x41, 0x95, 0x4a, 0xdf, 0x90, 0x4a, 0x3d, 0x07, 0x25, 0xa7, 0x49, 0x4d, 0x53, 0xd1, + 0xdb, 0x42, 0x37, 0xcf, 0x44, 0xb5, 0x64, 0x6e, 0x49, 0xf0, 0xc9, 0x84, 0x4d, 0x2e, 0x62, 0xdf, + 0x33, 0x5a, 0x04, 0x30, 0x74, 0x6c, 0x6c, 0x37, 0x5b, 0x58, 0xed, 0x54, 0xb2, 0x43, 0xa4, 0x74, + 0x99, 0x90, 0x0c, 0x48, 0xc9, 0x60, 0xa5, 0x6a, 0x07, 0x3d, 0xe6, 0xaa, 0xda, 0xc4, 0x10, 0x4d, + 0x59, 0x65, 0x93, 0x6c, 0x40, 0xdb, 0x36, 0xa1, 0x68, 0x62, 0xa2, 0xf7, 0xb8, 0xc5, 0x7b, 0x96, + 0xa3, 0x8d, 0x98, 0x8b, 0xec, 0x99, 0xcc, 0xd9, 0x58, 0xc7, 0x26, 0x4d, 0xef, 0x23, 0x3a, 0x05, + 0x4e, 0x41, 0x93, 0xaa, 0x15, 0x50, 0x2b, 0x54, 0x10, 0x85, 0x97, 0x94, 0x2e, 0xae, 0xbe, 0x04, + 0x45, 0xbf, 0x78, 0x88, 0x99, 0xb7, 0x6c, 0xc5, 0xb4, 0xa9, 0x16, 0x8e, 0xcb, 0xec, 0x81, 0x38, + 0x22, 0xac, 0xb7, 0xa8, 0x95, 0x1b, 0x97, 0xc9, 0x4f, 0xf4, 0x5e, 0xb7, 0xc3, 0x29, 0xda, 0xe1, + 0xbb, 0x06, 0x47, 0xd4, 0x87, 0x1c, 0xec, 0x77, 0xf5, 0x11, 0x98, 0xf4, 0x75, 0x20, 0x6e, 0xd5, + 0xd2, 0x07, 0xe0, 0x48, 0x28, 0x34, 0x7a, 0x0e, 0x66, 0xfa, 0xba, 0xa6, 0xdb, 0xd8, 0xec, 0x99, + 0x98, 0x68, 0x2c, 0xab, 0xaa, 0xf2, 0x17, 0x13, 0x43, 0x74, 0x6e, 0xd3, 0x4b, 0xcd, 0x50, 0xe4, + 0xe9, 0xfe, 0x60, 0xe1, 0x3d, 0xb9, 0xec, 0x77, 0x27, 0xca, 0x2f, 0xbf, 0xfc, 0xf2, 0xcb, 0x49, + 0xe9, 0x5f, 0x67, 0x60, 0x26, 0x6c, 0xce, 0x84, 0x4e, 0xdf, 0xa3, 0x90, 0xd1, 0xfb, 0xdd, 0x2d, + 0x6c, 0x52, 0x21, 0x8d, 0xcb, 0xfc, 0x09, 0xcd, 0xc3, 0x78, 0x47, 0xd9, 0xc2, 0xcc, 0x25, 0x17, + 0xcf, 0xde, 0x1b, 0x6b, 0x56, 0xce, 0xad, 0x10, 0x16, 0x99, 0x71, 0xa2, 0x27, 0x20, 0xcd, 0x4d, + 0x34, 0x41, 0xb8, 0x27, 0x1e, 0x02, 0x99, 0x4b, 0x32, 0xe5, 0x43, 0xb7, 0x40, 0x8e, 0xfc, 0x65, + 0xba, 0x91, 0xa1, 0x6d, 0xce, 0x92, 0x02, 0xa2, 0x17, 0xa8, 0x0a, 0x59, 0x3a, 0x4d, 0x5a, 0x58, + 0xb8, 0x36, 0xe7, 0x99, 0x28, 0x56, 0x0b, 0x6f, 0x2b, 0xfd, 0x8e, 0xdd, 0xbc, 0xaa, 0x74, 0xfa, + 0x98, 0x2a, 0x7c, 0x4e, 0x2e, 0xf0, 0xc2, 0x2b, 0xa4, 0x8c, 0x44, 0x1e, 0x6c, 0x56, 0x69, 0x7a, + 0x0b, 0xef, 0x51, 0xeb, 0x39, 0x2e, 0xb3, 0x89, 0xb6, 0x4c, 0x4a, 0x48, 0xf5, 0x2f, 0x58, 0x86, + 0x2e, 0x54, 0x93, 0x56, 0x41, 0x0a, 0x68, 0xf5, 0x8f, 0x04, 0x0d, 0xf7, 0x6d, 0xe1, 0xdd, 0x1b, + 0x98, 0x4b, 0x77, 0x43, 0x89, 0x05, 0x13, 0x7c, 0xe8, 0x95, 0x4e, 0x65, 0x8a, 0x06, 0x3d, 0x45, + 0x56, 0x7c, 0x99, 0x97, 0x4a, 0x5f, 0x4e, 0x42, 0x9a, 0x1a, 0x96, 0x12, 0xe4, 0x37, 0xde, 0xb7, + 0xb6, 0xd4, 0x5c, 0xbc, 0xbc, 0xd9, 0x58, 0x59, 0x2a, 0x27, 0x50, 0x11, 0x80, 0x16, 0x9c, 0x5f, + 0xb9, 0x3c, 0xbf, 0x51, 0x4e, 0x3a, 0xcf, 0xcb, 0x97, 0x36, 0x1e, 0x7e, 0xb0, 0x9c, 0x72, 0x18, + 0x36, 0x59, 0x41, 0xda, 0x4b, 0xf0, 0xee, 0xb3, 0xe5, 0x71, 0x54, 0x86, 0x02, 0x03, 0x58, 0x7e, + 0x6e, 0x69, 0xf1, 0xe1, 0x07, 0xcb, 0x19, 0x7f, 0xc9, 0xbb, 0xcf, 0x96, 0x27, 0xd0, 0x24, 0xe4, + 0x68, 0x49, 0xe3, 0xf2, 0xe5, 0x95, 0x72, 0xd6, 0xc1, 0x5c, 0xdf, 0x90, 0x97, 0x2f, 0x5d, 0x28, + 0xe7, 0x1c, 0xcc, 0x0b, 0xf2, 0xe5, 0xcd, 0xb5, 0x32, 0x38, 0x08, 0xab, 0x4b, 0xeb, 0xeb, 0xf3, + 0x17, 0x96, 0xca, 0x79, 0x87, 0xa2, 0xf1, 0xbe, 0x8d, 0xa5, 0xf5, 0x72, 0xc1, 0xd7, 0xac, 0x77, + 0x9f, 0x2d, 0x4f, 0x3a, 0x55, 0x2c, 0x5d, 0xda, 0x5c, 0x2d, 0x17, 0xd1, 0x14, 0x4c, 0xb2, 0x2a, + 0x44, 0x23, 0x4a, 0x81, 0xa2, 0x87, 0x1f, 0x2c, 0x97, 0xdd, 0x86, 0x30, 0x94, 0x29, 0x5f, 0xc1, + 0xc3, 0x0f, 0x96, 0x91, 0xb4, 0x00, 0xe3, 0x54, 0x0d, 0x11, 0x82, 0xe2, 0xca, 0x7c, 0x63, 0x69, + 0xa5, 0x79, 0x79, 0x6d, 0x63, 0xf9, 0xf2, 0xa5, 0xf9, 0x95, 0x72, 0xc2, 0x2d, 0x93, 0x97, 0x9e, + 0xd9, 0x5c, 0x96, 0x97, 0x16, 0xcb, 0x49, 0x6f, 0xd9, 0xda, 0xd2, 0xfc, 0xc6, 0xd2, 0x62, 0x39, + 0x25, 0xa9, 0x30, 0x13, 0x66, 0x50, 0x43, 0xa7, 0x90, 0x47, 0x17, 0x92, 0x43, 0x74, 0x81, 0x62, + 0x05, 0x75, 0x41, 0x7a, 0x2d, 0x09, 0xd3, 0x21, 0x4e, 0x25, 0xb4, 0x92, 0x27, 0x61, 0x9c, 0xe9, + 0x32, 0x73, 0xb3, 0xa7, 0x43, 0xbd, 0x13, 0xd5, 0xec, 0x01, 0x57, 0x4b, 0xf9, 0xbc, 0xa1, 0x46, + 0x6a, 0x48, 0xa8, 0x41, 0x20, 0x06, 0x14, 0xf6, 0xa7, 0x07, 0x8c, 0x3f, 0xf3, 0x8f, 0x0f, 0xc7, + 0xf1, 0x8f, 0xb4, 0xec, 0x70, 0x4e, 0x60, 0x3c, 0xc4, 0x09, 0x9c, 0x83, 0xa9, 0x01, 0xa0, 0xd8, + 0xc6, 0xf8, 0xe7, 0x12, 0x50, 0x19, 0x26, 0x9c, 0x08, 0x93, 0x98, 0xf4, 0x99, 0xc4, 0x73, 0x41, + 0x09, 0xde, 0x3e, 0x7c, 0x10, 0x06, 0xc6, 0xfa, 0x0b, 0x09, 0x38, 0x1a, 0x1e, 0x52, 0x86, 0xb6, + 0xe1, 0x09, 0xc8, 0x74, 0xb1, 0xbd, 0x63, 0x88, 0xb0, 0xea, 0xae, 0x10, 0x67, 0x4d, 0x5e, 0x07, + 0x07, 0x9b, 0x73, 0x79, 0xbd, 0x7d, 0x6a, 0x58, 0x5c, 0xc8, 0x5a, 0x33, 0xd0, 0xd2, 0x8f, 0x26, + 0xe1, 0x48, 0x28, 0x78, 0x68, 0x43, 0x6f, 0x03, 0xd0, 0xf4, 0x5e, 0xdf, 0x66, 0xa1, 0x13, 0xb3, + 0xc4, 0x39, 0x5a, 0x42, 0x8d, 0x17, 0xb1, 0xb2, 0x7d, 0xdb, 0x79, 0x9f, 0xa2, 0xef, 0x81, 0x15, + 0x51, 0x82, 0x47, 0xdd, 0x86, 0xa6, 0x69, 0x43, 0x4f, 0x0c, 0xe9, 0xe9, 0x80, 0x62, 0x3e, 0x00, + 0x65, 0xb5, 0xa3, 0x61, 0xdd, 0x6e, 0x5a, 0xb6, 0x89, 0x95, 0xae, 0xa6, 0xb7, 0xa9, 0xab, 0xc9, + 0xd6, 0xc7, 0xb7, 0x95, 0x8e, 0x85, 0xe5, 0x12, 0x7b, 0xbd, 0x2e, 0xde, 0x12, 0x0e, 0xaa, 0x40, + 0xa6, 0x87, 0x23, 0xe3, 0xe3, 0x60, 0xaf, 0x1d, 0x0e, 0xe9, 0x97, 0x73, 0x90, 0xf7, 0x04, 0xe0, + 0xe8, 0x76, 0x28, 0xbc, 0xa0, 0x5c, 0x55, 0x9a, 0x62, 0x51, 0xc5, 0x24, 0x91, 0x27, 0x65, 0x6b, + 0x7c, 0x61, 0xf5, 0x00, 0xcc, 0x50, 0x12, 0xa3, 0x6f, 0x63, 0xb3, 0xa9, 0x76, 0x14, 0xcb, 0xa2, + 0x42, 0xcb, 0x52, 0x52, 0x44, 0xde, 0x5d, 0x26, 0xaf, 0x16, 0xc4, 0x1b, 0xf4, 0x10, 0x4c, 0x53, + 0x8e, 0x6e, 0xbf, 0x63, 0x6b, 0xbd, 0x0e, 0x6e, 0x92, 0x65, 0x9e, 0x45, 0x5d, 0x8e, 0xd3, 0xb2, + 0x29, 0x42, 0xb1, 0xca, 0x09, 0x48, 0x8b, 0x2c, 0xb4, 0x08, 0xb7, 0x51, 0xb6, 0x36, 0xd6, 0xb1, + 0xa9, 0xd8, 0xb8, 0x89, 0x5f, 0xec, 0x2b, 0x1d, 0xab, 0xa9, 0xe8, 0xad, 0xe6, 0x8e, 0x62, 0xed, + 0x54, 0x66, 0x08, 0x40, 0x23, 0x59, 0x49, 0xc8, 0xc7, 0x09, 0xe1, 0x05, 0x4e, 0xb7, 0x44, 0xc9, + 0xe6, 0xf5, 0xd6, 0x45, 0xc5, 0xda, 0x41, 0x75, 0x38, 0x4a, 0x51, 0x2c, 0xdb, 0xd4, 0xf4, 0x76, + 0x53, 0xdd, 0xc1, 0xea, 0x6e, 0xb3, 0x6f, 0x6f, 0x3f, 0x5a, 0xb9, 0xc5, 0x5b, 0x3f, 0x6d, 0xe1, + 0x3a, 0xa5, 0x59, 0x20, 0x24, 0x9b, 0xf6, 0xf6, 0xa3, 0x68, 0x1d, 0x0a, 0x64, 0x30, 0xba, 0xda, + 0x4b, 0xb8, 0xb9, 0x6d, 0x98, 0xd4, 0x87, 0x16, 0x43, 0x4c, 0x93, 0x47, 0x82, 0x73, 0x97, 0x39, + 0xc3, 0xaa, 0xd1, 0xc2, 0xf5, 0xf1, 0xf5, 0xb5, 0xa5, 0xa5, 0x45, 0x39, 0x2f, 0x50, 0xce, 0x1b, + 0x26, 0x51, 0xa8, 0xb6, 0xe1, 0x08, 0x38, 0xcf, 0x14, 0xaa, 0x6d, 0x08, 0xf1, 0x3e, 0x04, 0xd3, + 0xaa, 0xca, 0xfa, 0xac, 0xa9, 0x4d, 0xbe, 0x18, 0xb3, 0x2a, 0x65, 0x9f, 0xb0, 0x54, 0xf5, 0x02, + 0x23, 0xe0, 0x3a, 0x6e, 0xa1, 0xc7, 0xe0, 0x88, 0x2b, 0x2c, 0x2f, 0xe3, 0xd4, 0x40, 0x2f, 0x83, + 0xac, 0x0f, 0xc1, 0x74, 0x6f, 0x7f, 0x90, 0x11, 0xf9, 0x6a, 0xec, 0xed, 0x07, 0xd9, 0x1e, 0x81, + 0x99, 0xde, 0x4e, 0x6f, 0x90, 0xef, 0x1e, 0x2f, 0x1f, 0xea, 0xed, 0xf4, 0x82, 0x8c, 0x77, 0xd2, + 0x95, 0xb9, 0x89, 0x55, 0xc5, 0xc6, 0xad, 0xca, 0x31, 0x2f, 0xb9, 0xe7, 0x05, 0x9a, 0x83, 0xb2, + 0xaa, 0x36, 0xb1, 0xae, 0x6c, 0x75, 0x70, 0x53, 0x31, 0xb1, 0xae, 0x58, 0x95, 0x1a, 0x25, 0x4e, + 0xdb, 0x66, 0x1f, 0xcb, 0x45, 0x55, 0x5d, 0xa2, 0x2f, 0xe7, 0xe9, 0x3b, 0x74, 0x0f, 0x4c, 0x19, + 0x5b, 0x2f, 0xa8, 0x4c, 0x23, 0x9b, 0x3d, 0x13, 0x6f, 0x6b, 0x7b, 0x95, 0x3b, 0xa8, 0x78, 0x4b, + 0xe4, 0x05, 0xd5, 0xc7, 0x35, 0x5a, 0x8c, 0x4e, 0x43, 0x59, 0xb5, 0x76, 0x14, 0xb3, 0x47, 0x4d, + 0xb2, 0xd5, 0x53, 0x54, 0x5c, 0xb9, 0x93, 0x91, 0xb2, 0xf2, 0x4b, 0xa2, 0x98, 0xcc, 0x08, 0xeb, + 0x9a, 0xb6, 0x6d, 0x0b, 0xc4, 0xbb, 0xd9, 0x8c, 0xa0, 0x65, 0x1c, 0x6d, 0x16, 0xca, 0x44, 0x12, + 0xbe, 0x8a, 0x67, 0x29, 0x59, 0xb1, 0xb7, 0xd3, 0xf3, 0xd6, 0x7b, 0x0a, 0x26, 0x09, 0xa5, 0x5b, + 0xe9, 0x69, 0x16, 0xb8, 0xf5, 0x76, 0x3c, 0x35, 0x3e, 0x08, 0x47, 0x09, 0x51, 0x17, 0xdb, 0x4a, + 0x4b, 0xb1, 0x15, 0x0f, 0xf5, 0x7d, 0x94, 0x9a, 0x88, 0x7d, 0x95, 0xbf, 0xf4, 0xb5, 0xd3, 0xec, + 0x6f, 0xed, 0x3b, 0x8a, 0x75, 0x3f, 0x6b, 0x27, 0x29, 0x13, 0xaa, 0xf5, 0x96, 0x05, 0xe7, 0x52, + 0x1d, 0x0a, 0x5e, 0xbd, 0x47, 0x39, 0x60, 0x9a, 0x5f, 0x4e, 0x90, 0x20, 0x68, 0xe1, 0xf2, 0x22, + 0x09, 0x5f, 0x9e, 0x5f, 0x2a, 0x27, 0x49, 0x18, 0xb5, 0xb2, 0xbc, 0xb1, 0xd4, 0x94, 0x37, 0x2f, + 0x6d, 0x2c, 0xaf, 0x2e, 0x95, 0x53, 0x9e, 0xc0, 0xfe, 0xa9, 0x74, 0xf6, 0xae, 0xf2, 0xdd, 0xd2, + 0xb7, 0x92, 0x50, 0xf4, 0xaf, 0xd4, 0xd0, 0xe3, 0x70, 0x4c, 0xa4, 0x55, 0x2c, 0x6c, 0x37, 0xaf, + 0x69, 0x26, 0x9d, 0x90, 0x5d, 0x85, 0x39, 0x47, 0x47, 0x7f, 0x66, 0x38, 0xd5, 0x3a, 0xb6, 0x9f, + 0xd5, 0x4c, 0x32, 0xdd, 0xba, 0x8a, 0x8d, 0x56, 0xa0, 0xa6, 0x1b, 0x4d, 0xcb, 0x56, 0xf4, 0x96, + 0x62, 0xb6, 0x9a, 0x6e, 0x42, 0xab, 0xa9, 0xa8, 0x2a, 0xb6, 0x2c, 0x83, 0x39, 0x42, 0x07, 0xe5, + 0x56, 0xdd, 0x58, 0xe7, 0xc4, 0xae, 0x87, 0x98, 0xe7, 0xa4, 0x01, 0xf5, 0x4d, 0x0d, 0x53, 0xdf, + 0x5b, 0x20, 0xd7, 0x55, 0x7a, 0x4d, 0xac, 0xdb, 0xe6, 0x3e, 0x8d, 0xcf, 0xb3, 0x72, 0xb6, 0xab, + 0xf4, 0x96, 0xc8, 0xf3, 0xdb, 0xb2, 0x4c, 0x7a, 0x2a, 0x9d, 0xcd, 0x96, 0x73, 0x4f, 0xa5, 0xb3, + 0xb9, 0x32, 0x48, 0xaf, 0xa6, 0xa0, 0xe0, 0x8d, 0xd7, 0xc9, 0xf2, 0x47, 0xa5, 0x1e, 0x2b, 0x41, + 0x6d, 0xda, 0xa9, 0x91, 0xd1, 0xfd, 0xdc, 0x02, 0x71, 0x65, 0xf5, 0x0c, 0x0b, 0x8e, 0x65, 0xc6, + 0x49, 0xc2, 0x08, 0xa2, 0x6c, 0x98, 0x05, 0x23, 0x59, 0x99, 0x3f, 0xa1, 0x0b, 0x90, 0x79, 0xc1, + 0xa2, 0xd8, 0x19, 0x8a, 0x7d, 0xc7, 0x68, 0xec, 0xa7, 0xd6, 0x29, 0x78, 0xee, 0xa9, 0xf5, 0xe6, + 0xa5, 0xcb, 0xf2, 0xea, 0xfc, 0x8a, 0xcc, 0xd9, 0xd1, 0x71, 0x48, 0x77, 0x94, 0x97, 0xf6, 0xfd, + 0x4e, 0x8f, 0x16, 0xc5, 0x1d, 0x84, 0xe3, 0x90, 0xbe, 0x86, 0x95, 0x5d, 0xbf, 0xab, 0xa1, 0x45, + 0x6f, 0xe1, 0x64, 0x38, 0x03, 0xe3, 0x54, 0x5e, 0x08, 0x80, 0x4b, 0xac, 0x3c, 0x86, 0xb2, 0x90, + 0x5e, 0xb8, 0x2c, 0x93, 0x09, 0x51, 0x86, 0x02, 0x2b, 0x6d, 0xae, 0x2d, 0x2f, 0x2d, 0x2c, 0x95, + 0x93, 0xd2, 0x43, 0x90, 0x61, 0x42, 0x20, 0x93, 0xc5, 0x11, 0x43, 0x79, 0x8c, 0x3f, 0x72, 0x8c, + 0x84, 0x78, 0xbb, 0xb9, 0xda, 0x58, 0x92, 0xcb, 0x49, 0xff, 0x50, 0xa7, 0xcb, 0xe3, 0x92, 0x05, + 0x05, 0x6f, 0x1c, 0xfe, 0xf6, 0x2c, 0xc6, 0xbf, 0x9e, 0x80, 0xbc, 0x27, 0xae, 0x26, 0x01, 0x91, + 0xd2, 0xe9, 0x18, 0xd7, 0x9a, 0x4a, 0x47, 0x53, 0x2c, 0xae, 0x1a, 0x40, 0x8b, 0xe6, 0x49, 0x49, + 0xdc, 0xa1, 0x7b, 0x9b, 0xa6, 0xc8, 0x78, 0x39, 0x23, 0x7d, 0x36, 0x01, 0xe5, 0x60, 0x60, 0x1b, + 0x68, 0x66, 0xe2, 0x47, 0xd9, 0x4c, 0xe9, 0xd3, 0x09, 0x28, 0xfa, 0xa3, 0xd9, 0x40, 0xf3, 0x6e, + 0xff, 0x91, 0x36, 0xef, 0xcf, 0x93, 0x30, 0xe9, 0x8b, 0x61, 0xe3, 0xb6, 0xee, 0x45, 0x98, 0xd2, + 0x5a, 0xb8, 0xdb, 0x33, 0x6c, 0xac, 0xab, 0xfb, 0xcd, 0x0e, 0xbe, 0x8a, 0x3b, 0x15, 0x89, 0x1a, + 0x8d, 0x33, 0xa3, 0xa3, 0xe4, 0xb9, 0x65, 0x97, 0x6f, 0x85, 0xb0, 0xd5, 0xa7, 0x97, 0x17, 0x97, + 0x56, 0xd7, 0x2e, 0x6f, 0x2c, 0x5d, 0x5a, 0x78, 0x5f, 0x73, 0xf3, 0xd2, 0xd3, 0x97, 0x2e, 0x3f, + 0x7b, 0x49, 0x2e, 0x6b, 0x01, 0xb2, 0xb7, 0x70, 0xda, 0xaf, 0x41, 0x39, 0xd8, 0x28, 0x74, 0x0c, + 0xc2, 0x9a, 0x55, 0x1e, 0x43, 0xd3, 0x50, 0xba, 0x74, 0xb9, 0xb9, 0xbe, 0xbc, 0xb8, 0xd4, 0x5c, + 0x3a, 0x7f, 0x7e, 0x69, 0x61, 0x63, 0x9d, 0xe5, 0x3d, 0x1c, 0xea, 0x0d, 0xdf, 0x04, 0x97, 0x3e, + 0x95, 0x82, 0xe9, 0x90, 0x96, 0xa0, 0x79, 0xbe, 0x62, 0x61, 0x8b, 0xa8, 0xfb, 0xe3, 0xb4, 0x7e, + 0x8e, 0xc4, 0x0c, 0x6b, 0x8a, 0x69, 0xf3, 0x05, 0xce, 0x69, 0x20, 0x52, 0xd2, 0x6d, 0x6d, 0x5b, + 0xc3, 0x26, 0xcf, 0x27, 0xb1, 0x65, 0x4c, 0xc9, 0x2d, 0x67, 0x29, 0xa5, 0xfb, 0x00, 0xf5, 0x0c, + 0x4b, 0xb3, 0xb5, 0xab, 0xb8, 0xa9, 0xe9, 0x22, 0xf9, 0x94, 0xa6, 0xbb, 0x51, 0x65, 0xf1, 0x66, + 0x59, 0xb7, 0x1d, 0x6a, 0x1d, 0xb7, 0x95, 0x00, 0x35, 0x31, 0xe6, 0x29, 0xb9, 0x2c, 0xde, 0x38, + 0xd4, 0xb7, 0x43, 0xa1, 0x65, 0xf4, 0x49, 0xac, 0xc7, 0xe8, 0x88, 0xef, 0x48, 0xc8, 0x79, 0x56, + 0xe6, 0x90, 0xf0, 0x28, 0xde, 0xcd, 0x7a, 0x15, 0xe4, 0x3c, 0x2b, 0x63, 0x24, 0x77, 0x43, 0x49, + 0x69, 0xb7, 0x4d, 0x02, 0x2e, 0x80, 0xd8, 0xba, 0xa4, 0xe8, 0x14, 0x53, 0xc2, 0xea, 0x53, 0x90, + 0x15, 0x72, 0x20, 0xae, 0x9a, 0x48, 0xa2, 0xd9, 0x63, 0x8b, 0xed, 0xe4, 0x6c, 0x4e, 0xce, 0xea, + 0xe2, 0xe5, 0xed, 0x50, 0xd0, 0xac, 0xa6, 0x9b, 0xc4, 0x4f, 0x9e, 0x4c, 0xce, 0x66, 0xe5, 0xbc, + 0x66, 0x39, 0x09, 0x50, 0xe9, 0x0b, 0x49, 0x28, 0xfa, 0x37, 0x21, 0xd0, 0x22, 0x64, 0x3b, 0x86, + 0x4a, 0x77, 0x19, 0xf9, 0x0e, 0xd8, 0x6c, 0xc4, 0xbe, 0xc5, 0xdc, 0x0a, 0xa7, 0x97, 0x1d, 0xce, + 0xea, 0x7f, 0x48, 0x40, 0x56, 0x14, 0xa3, 0xa3, 0x90, 0xee, 0x29, 0xf6, 0x0e, 0x85, 0x1b, 0x6f, + 0x24, 0xcb, 0x09, 0x99, 0x3e, 0x93, 0x72, 0xab, 0xa7, 0xe8, 0x54, 0x05, 0x78, 0x39, 0x79, 0x26, + 0xe3, 0xda, 0xc1, 0x4a, 0x8b, 0x2e, 0x7a, 0x8c, 0x6e, 0x17, 0xeb, 0xb6, 0x25, 0xc6, 0x95, 0x97, + 0x2f, 0xf0, 0x62, 0x74, 0x2f, 0x4c, 0xd9, 0xa6, 0xa2, 0x75, 0x7c, 0xb4, 0x69, 0x4a, 0x5b, 0x16, + 0x2f, 0x1c, 0xe2, 0x3a, 0x1c, 0x17, 0xb8, 0x2d, 0x6c, 0x2b, 0xea, 0x0e, 0x6e, 0xb9, 0x4c, 0x19, + 0x9a, 0xdc, 0x38, 0xc6, 0x09, 0x16, 0xf9, 0x7b, 0xc1, 0x2b, 0x7d, 0x2b, 0x01, 0x53, 0x62, 0x99, + 0xd6, 0x72, 0x84, 0xb5, 0x0a, 0xa0, 0xe8, 0xba, 0x61, 0x7b, 0xc5, 0x35, 0xa8, 0xca, 0x03, 0x7c, + 0x73, 0xf3, 0x0e, 0x93, 0xec, 0x01, 0xa8, 0x76, 0x01, 0xdc, 0x37, 0x43, 0xc5, 0x56, 0x83, 0x3c, + 0xdf, 0x61, 0xa2, 0xdb, 0x94, 0x6c, 0x61, 0x0f, 0xac, 0x88, 0xac, 0xe7, 0xd0, 0x0c, 0x8c, 0x6f, + 0xe1, 0xb6, 0xa6, 0xf3, 0xbc, 0x31, 0x7b, 0x10, 0xe9, 0x97, 0xb4, 0x93, 0x7e, 0x69, 0x7c, 0x3c, + 0x01, 0xd3, 0xaa, 0xd1, 0x0d, 0xb6, 0xb7, 0x51, 0x0e, 0x64, 0x17, 0xac, 0x8b, 0x89, 0xe7, 0x9f, + 0xf0, 0xec, 0xc8, 0xb6, 0x8d, 0x8e, 0xa2, 0xb7, 0xdd, 0x7d, 0x56, 0xfa, 0x43, 0xbd, 0xbf, 0x8d, + 0xf5, 0xfb, 0xdb, 0x86, 0x67, 0xd7, 0xf5, 0x9c, 0xfb, 0xf3, 0xaf, 0x13, 0x89, 0xcf, 0x27, 0x53, + 0x17, 0xd6, 0x1a, 0x5f, 0x4c, 0x56, 0x2f, 0xb0, 0xea, 0xd6, 0x84, 0x78, 0x64, 0xbc, 0xdd, 0xc1, + 0x2a, 0xe9, 0x32, 0x7c, 0xef, 0x5e, 0x98, 0x69, 0x1b, 0x6d, 0x83, 0x22, 0x9e, 0x21, 0xbf, 0xf8, + 0xce, 0x6d, 0xce, 0x29, 0xad, 0x46, 0x6e, 0xf3, 0xd6, 0x2f, 0xc1, 0x34, 0x27, 0x6e, 0xd2, 0xad, + 0x23, 0xb6, 0xb0, 0x41, 0x23, 0xb3, 0x6a, 0x95, 0xdf, 0xfb, 0x0e, 0x75, 0xe8, 0xf2, 0x14, 0x67, + 0x25, 0xef, 0xd8, 0xda, 0xa7, 0x2e, 0xc3, 0x11, 0x1f, 0x1e, 0x9b, 0xb6, 0xd8, 0x8c, 0x40, 0xfc, + 0xb7, 0x1c, 0x71, 0xda, 0x83, 0xb8, 0xce, 0x59, 0xeb, 0x0b, 0x30, 0x79, 0x18, 0xac, 0x7f, 0xc7, + 0xb1, 0x0a, 0xd8, 0x0b, 0x72, 0x01, 0x4a, 0x14, 0x44, 0xed, 0x5b, 0xb6, 0xd1, 0xa5, 0x36, 0x71, + 0x34, 0xcc, 0x1f, 0x7d, 0x87, 0xcd, 0xa3, 0x22, 0x61, 0x5b, 0x70, 0xb8, 0xea, 0x75, 0xa0, 0xbb, + 0x65, 0x2d, 0xac, 0x76, 0x22, 0x10, 0xbe, 0xc1, 0x1b, 0xe2, 0xd0, 0xd7, 0xaf, 0xc0, 0x0c, 0xf9, + 0x4d, 0x4d, 0x96, 0xb7, 0x25, 0xd1, 0x29, 0xb8, 0xca, 0xb7, 0x7e, 0x8e, 0x4d, 0xd5, 0x69, 0x07, + 0xc0, 0xd3, 0x26, 0xcf, 0x28, 0xb6, 0xb1, 0x6d, 0x63, 0xd3, 0x6a, 0x2a, 0x9d, 0xb0, 0xe6, 0x79, + 0x72, 0x18, 0x95, 0xdf, 0x78, 0xdd, 0x3f, 0x8a, 0x17, 0x18, 0xe7, 0x7c, 0xa7, 0x53, 0xdf, 0x84, + 0x63, 0x21, 0x5a, 0x11, 0x03, 0xf3, 0x53, 0x1c, 0x73, 0x66, 0x40, 0x33, 0x08, 0xec, 0x1a, 0x88, + 0x72, 0x67, 0x2c, 0x63, 0x60, 0xfe, 0x7d, 0x8e, 0x89, 0x38, 0xaf, 0x18, 0x52, 0x82, 0xf8, 0x14, + 0x4c, 0x5d, 0xc5, 0xe6, 0x96, 0x61, 0xf1, 0xbc, 0x51, 0x0c, 0xb8, 0x4f, 0x73, 0xb8, 0x12, 0x67, + 0xa4, 0x89, 0x24, 0x82, 0xf5, 0x18, 0x64, 0xb7, 0x15, 0x15, 0xc7, 0x80, 0xf8, 0x0c, 0x87, 0x98, + 0x20, 0xf4, 0x84, 0x75, 0x1e, 0x0a, 0x6d, 0x83, 0x7b, 0xad, 0x68, 0xf6, 0xcf, 0x72, 0xf6, 0xbc, + 0xe0, 0xe1, 0x10, 0x3d, 0xa3, 0xd7, 0xef, 0x10, 0x97, 0x16, 0x0d, 0xf1, 0x9b, 0x02, 0x42, 0xf0, + 0x70, 0x88, 0x43, 0x88, 0xf5, 0x15, 0x01, 0x61, 0x79, 0xe4, 0xf9, 0x24, 0xe4, 0x0d, 0xbd, 0xb3, + 0x6f, 0xe8, 0x71, 0x1a, 0xf1, 0x39, 0x8e, 0x00, 0x9c, 0x85, 0x00, 0x9c, 0x83, 0x5c, 0xdc, 0x81, + 0xf8, 0x87, 0xaf, 0x8b, 0xe9, 0x21, 0x46, 0xe0, 0x02, 0x94, 0x84, 0x81, 0xd2, 0x0c, 0x3d, 0x06, + 0xc4, 0x3f, 0xe2, 0x10, 0x45, 0x0f, 0x1b, 0xef, 0x86, 0x8d, 0x2d, 0xbb, 0x8d, 0xe3, 0x80, 0x7c, + 0x41, 0x74, 0x83, 0xb3, 0x70, 0x51, 0x6e, 0x61, 0x5d, 0xdd, 0x89, 0x87, 0xf0, 0x5b, 0x42, 0x94, + 0x82, 0x87, 0x40, 0x2c, 0xc0, 0x64, 0x57, 0x31, 0xad, 0x1d, 0xa5, 0x13, 0x6b, 0x38, 0xfe, 0x31, + 0xc7, 0x28, 0x38, 0x4c, 0x5c, 0x22, 0x7d, 0xfd, 0x30, 0x30, 0x5f, 0x14, 0x12, 0xf1, 0xb0, 0xf1, + 0xa9, 0x67, 0xd9, 0x34, 0xc9, 0x76, 0x18, 0xb4, 0x7f, 0x22, 0xa6, 0x1e, 0xe3, 0x5d, 0xf5, 0x22, + 0x9e, 0x83, 0x9c, 0xa5, 0xbd, 0x14, 0x0b, 0xe6, 0x9f, 0x8a, 0x91, 0xa6, 0x0c, 0x84, 0xf9, 0x7d, + 0x70, 0x3c, 0xd4, 0x4d, 0xc4, 0x00, 0xfb, 0x67, 0x1c, 0xec, 0x68, 0x88, 0xab, 0xe0, 0x26, 0xe1, + 0xb0, 0x90, 0xbf, 0x2d, 0x4c, 0x02, 0x0e, 0x60, 0xad, 0x91, 0x75, 0x84, 0xa5, 0x6c, 0x1f, 0x4e, + 0x6a, 0xbf, 0x23, 0xa4, 0xc6, 0x78, 0x7d, 0x52, 0xdb, 0x80, 0xa3, 0x1c, 0xf1, 0x70, 0xe3, 0xfa, + 0xbb, 0xc2, 0xb0, 0x32, 0xee, 0x4d, 0xff, 0xe8, 0xbe, 0x1f, 0xaa, 0x8e, 0x38, 0x45, 0xc0, 0x6a, + 0x35, 0xbb, 0x4a, 0x2f, 0x06, 0xf2, 0xef, 0x71, 0x64, 0x61, 0xf1, 0x9d, 0x88, 0xd7, 0x5a, 0x55, + 0x7a, 0x04, 0xfc, 0x39, 0xa8, 0x08, 0xf0, 0xbe, 0x6e, 0x62, 0xd5, 0x68, 0xeb, 0xda, 0x4b, 0xb8, + 0x15, 0x03, 0xfa, 0x9f, 0x07, 0x86, 0x6a, 0xd3, 0xc3, 0x4e, 0x90, 0x97, 0xa1, 0xec, 0xc4, 0x2a, + 0x4d, 0xad, 0xdb, 0x33, 0x4c, 0x3b, 0x02, 0xf1, 0x5f, 0x88, 0x91, 0x72, 0xf8, 0x96, 0x29, 0x5b, + 0x7d, 0x09, 0xd8, 0xce, 0x73, 0x5c, 0x95, 0xfc, 0x12, 0x07, 0x9a, 0x74, 0xb9, 0xb8, 0xe1, 0x50, + 0x8d, 0x6e, 0x4f, 0x31, 0xe3, 0xd8, 0xbf, 0x7f, 0x29, 0x0c, 0x07, 0x67, 0xe1, 0x86, 0xc3, 0xde, + 0xef, 0x61, 0xe2, 0xed, 0x63, 0x20, 0x7c, 0x59, 0x18, 0x0e, 0xc1, 0xc3, 0x21, 0x44, 0xc0, 0x10, + 0x03, 0xe2, 0x2b, 0x02, 0x42, 0xf0, 0x10, 0x88, 0x67, 0x5c, 0x47, 0x6b, 0xe2, 0xb6, 0x66, 0xd9, + 0x26, 0x0b, 0x93, 0x47, 0x43, 0x7d, 0xf5, 0x75, 0x7f, 0x10, 0x26, 0x7b, 0x58, 0x89, 0x25, 0xe2, + 0x69, 0x57, 0xba, 0x8a, 0x8a, 0x6e, 0xd8, 0xd7, 0x84, 0x25, 0xf2, 0xb0, 0x91, 0xb6, 0x79, 0x22, + 0x44, 0x22, 0x76, 0x95, 0xac, 0x1d, 0x62, 0xc0, 0xfd, 0x7e, 0xa0, 0x71, 0xeb, 0x82, 0x97, 0x60, + 0x7a, 0xe2, 0x9f, 0xbe, 0xbe, 0x8b, 0xf7, 0x63, 0x69, 0xe7, 0x1f, 0x04, 0xe2, 0x9f, 0x4d, 0xc6, + 0xc9, 0x6c, 0x48, 0x29, 0x10, 0x4f, 0xa1, 0xa8, 0x73, 0x46, 0x95, 0xbf, 0xfd, 0x06, 0xef, 0xaf, + 0x3f, 0x9c, 0xaa, 0xaf, 0x10, 0x25, 0xf7, 0x07, 0x3d, 0xd1, 0x60, 0x3f, 0xf7, 0x86, 0xa3, 0xe7, + 0xbe, 0x98, 0xa7, 0x7e, 0x1e, 0x26, 0x7d, 0x01, 0x4f, 0x34, 0xd4, 0x07, 0x39, 0x54, 0xc1, 0x1b, + 0xef, 0xd4, 0x1f, 0x82, 0x34, 0x09, 0x5e, 0xa2, 0xd9, 0x7f, 0x9e, 0xb3, 0x53, 0xf2, 0xfa, 0x7b, + 0x20, 0x2b, 0x82, 0x96, 0x68, 0xd6, 0x0f, 0x71, 0x56, 0x87, 0x85, 0xb0, 0x8b, 0x80, 0x25, 0x9a, + 0xfd, 0xc3, 0x82, 0x5d, 0xb0, 0x10, 0xf6, 0xf8, 0x22, 0xfc, 0xfa, 0xdf, 0x49, 0x73, 0xa7, 0x23, + 0x64, 0x77, 0x0e, 0x26, 0x78, 0xa4, 0x12, 0xcd, 0xfd, 0x51, 0x5e, 0xb9, 0xe0, 0xa8, 0x3f, 0x02, + 0xe3, 0x31, 0x05, 0xfe, 0x8b, 0x9c, 0x95, 0xd1, 0xd7, 0x17, 0x20, 0xef, 0x89, 0x4e, 0xa2, 0xd9, + 0x7f, 0x89, 0xb3, 0x7b, 0xb9, 0x48, 0xd3, 0x79, 0x74, 0x12, 0x0d, 0xf0, 0x71, 0xd1, 0x74, 0xce, + 0x41, 0xc4, 0x26, 0x02, 0x93, 0x68, 0xee, 0x4f, 0x08, 0xa9, 0x0b, 0x96, 0xfa, 0x93, 0x90, 0x73, + 0x9c, 0x4d, 0x34, 0xff, 0x2f, 0x73, 0x7e, 0x97, 0x87, 0x48, 0xc0, 0xe3, 0xec, 0xa2, 0x21, 0x7e, + 0x45, 0x48, 0xc0, 0xc3, 0x45, 0xa6, 0x51, 0x30, 0x80, 0x89, 0x46, 0xfa, 0xbb, 0x62, 0x1a, 0x05, + 0xe2, 0x17, 0x32, 0x9a, 0xd4, 0xe6, 0x47, 0x43, 0xfc, 0xaa, 0x18, 0x4d, 0x4a, 0x4f, 0x9a, 0x11, + 0x8c, 0x08, 0xa2, 0x31, 0xfe, 0x9e, 0x68, 0x46, 0x20, 0x20, 0xa8, 0xaf, 0x01, 0x1a, 0x8c, 0x06, + 0xa2, 0xf1, 0x3e, 0xc9, 0xf1, 0xa6, 0x06, 0x82, 0x81, 0xfa, 0xb3, 0x70, 0x34, 0x3c, 0x12, 0x88, + 0x46, 0xfd, 0x8d, 0x37, 0x02, 0x6b, 0x37, 0x6f, 0x20, 0x50, 0xdf, 0x70, 0x5d, 0x8a, 0x37, 0x0a, + 0x88, 0x86, 0xfd, 0xd4, 0x1b, 0x7e, 0xc3, 0xed, 0x0d, 0x02, 0xea, 0xf3, 0x00, 0xae, 0x03, 0x8e, + 0xc6, 0xfa, 0x34, 0xc7, 0xf2, 0x30, 0x91, 0xa9, 0xc1, 0xfd, 0x6f, 0x34, 0xff, 0x67, 0xc4, 0xd4, + 0xe0, 0x1c, 0x64, 0x6a, 0x08, 0xd7, 0x1b, 0xcd, 0xfd, 0x59, 0x31, 0x35, 0x04, 0x0b, 0xd1, 0x6c, + 0x8f, 0x77, 0x8b, 0x46, 0xf8, 0x9c, 0xd0, 0x6c, 0x0f, 0x57, 0xfd, 0x12, 0x4c, 0x0d, 0x38, 0xc4, + 0x68, 0xa8, 0xcf, 0x73, 0xa8, 0x72, 0xd0, 0x1f, 0x7a, 0x9d, 0x17, 0x77, 0x86, 0xd1, 0x68, 0xff, + 0x20, 0xe0, 0xbc, 0xb8, 0x2f, 0xac, 0x9f, 0x83, 0xac, 0xde, 0xef, 0x74, 0xc8, 0xe4, 0x41, 0xa3, + 0xcf, 0x06, 0x56, 0xfe, 0xfb, 0x0f, 0xb9, 0x74, 0x04, 0x43, 0xfd, 0x21, 0x18, 0xc7, 0xdd, 0x2d, + 0xdc, 0x8a, 0xe2, 0xfc, 0xde, 0x0f, 0x85, 0xc1, 0x24, 0xd4, 0xf5, 0x27, 0x01, 0x58, 0x6a, 0x84, + 0x6e, 0x0f, 0x46, 0xf0, 0xfe, 0x8f, 0x1f, 0xf2, 0xc3, 0x38, 0x2e, 0x8b, 0x0b, 0xc0, 0x8e, 0xf6, + 0x8c, 0x06, 0x78, 0xdd, 0x0f, 0x40, 0x47, 0xe4, 0x31, 0x98, 0x78, 0xc1, 0x32, 0x74, 0x5b, 0x69, + 0x47, 0x71, 0xff, 0x4f, 0xce, 0x2d, 0xe8, 0x89, 0xc0, 0xba, 0x86, 0x89, 0x6d, 0xa5, 0x6d, 0x45, + 0xf1, 0xfe, 0x2f, 0xce, 0xeb, 0x30, 0x10, 0x66, 0x55, 0xb1, 0xec, 0x38, 0xfd, 0xfe, 0xdf, 0x82, + 0x59, 0x30, 0x90, 0x46, 0x93, 0xdf, 0xbb, 0x78, 0x3f, 0x8a, 0xf7, 0xfb, 0xa2, 0xd1, 0x9c, 0xbe, + 0xfe, 0x1e, 0xc8, 0x91, 0x9f, 0xec, 0x84, 0x5d, 0x04, 0xf3, 0xff, 0xe1, 0xcc, 0x2e, 0x07, 0xa9, + 0xd9, 0xb2, 0x5b, 0xb6, 0x16, 0x2d, 0xec, 0xeb, 0x7c, 0xa4, 0x05, 0x7d, 0x7d, 0x1e, 0xf2, 0x96, + 0xdd, 0x6a, 0xf5, 0x79, 0x7c, 0x1a, 0xc1, 0xfe, 0x7f, 0x7f, 0xe8, 0xa4, 0x2c, 0x1c, 0x1e, 0x32, + 0xda, 0xd7, 0x76, 0xed, 0x9e, 0x41, 0xb7, 0x40, 0xa2, 0x10, 0xde, 0xe0, 0x08, 0x1e, 0x96, 0xfa, + 0x02, 0x14, 0x48, 0x5f, 0x4c, 0xdc, 0xc3, 0x74, 0xbf, 0x2a, 0x02, 0xe2, 0x2f, 0xb9, 0x00, 0x7c, + 0x4c, 0x8d, 0x9f, 0x1e, 0x76, 0x3f, 0x27, 0x3c, 0x6d, 0x0c, 0x17, 0x8c, 0x0b, 0x06, 0x4b, 0x18, + 0x3f, 0x2f, 0xf9, 0xd2, 0xc5, 0x6d, 0xc3, 0xcd, 0xd6, 0x3a, 0x8b, 0x1c, 0xf8, 0xfd, 0x24, 0xdc, + 0x49, 0x8f, 0x05, 0x9b, 0x5d, 0x4d, 0xb7, 0xcf, 0xa8, 0xe6, 0x7e, 0xcf, 0x36, 0xce, 0x74, 0xb1, + 0xb9, 0xdb, 0xc1, 0xfc, 0x0f, 0xcf, 0xfe, 0x56, 0x5c, 0xb2, 0x39, 0x46, 0x36, 0xc7, 0xde, 0x57, + 0x43, 0xb3, 0xc5, 0xd2, 0x02, 0x4c, 0xac, 0x99, 0x86, 0xb1, 0x7d, 0xb9, 0x87, 0x10, 0x3f, 0xe9, + 0xcc, 0x0f, 0xc6, 0x51, 0x35, 0xe4, 0x37, 0xa3, 0x92, 0xee, 0xcd, 0x28, 0x04, 0xe9, 0x96, 0x62, + 0x2b, 0x34, 0x61, 0x5e, 0x90, 0xe9, 0x6f, 0xa9, 0x01, 0xe3, 0x14, 0x04, 0x3d, 0x06, 0x29, 0xa3, + 0x67, 0xf1, 0xec, 0xfe, 0xed, 0x73, 0xc3, 0xda, 0x32, 0xc7, 0xab, 0x6c, 0xa4, 0xbf, 0x71, 0x50, + 0x1b, 0x93, 0x09, 0x4f, 0x63, 0xed, 0xaf, 0xbf, 0x7d, 0x22, 0xf1, 0x5b, 0xaf, 0x9e, 0x48, 0x0c, + 0xbd, 0xe9, 0x34, 0xe7, 0x11, 0x94, 0x47, 0x18, 0xc3, 0xe4, 0xe2, 0xdc, 0x77, 0xfa, 0x85, 0x24, + 0x9c, 0xf0, 0x10, 0x75, 0xb4, 0x2d, 0xeb, 0xcc, 0xee, 0x55, 0x76, 0x35, 0x8a, 0x4b, 0x0d, 0x79, + 0x5a, 0x4a, 0xde, 0xcf, 0xed, 0x5e, 0x1d, 0x22, 0xaf, 0x39, 0x48, 0xaf, 0x29, 0x9a, 0x19, 0x72, + 0x65, 0x6c, 0xc6, 0x3d, 0xdb, 0x4a, 0xca, 0xd8, 0x83, 0x74, 0x16, 0xb2, 0x4f, 0x2f, 0x3f, 0xfc, + 0x60, 0x1c, 0x9e, 0x14, 0xe7, 0x69, 0xc8, 0x42, 0x14, 0x5f, 0x0d, 0x11, 0xc7, 0xd7, 0x5f, 0x3b, + 0x91, 0x08, 0xbd, 0xfc, 0x15, 0x2e, 0x12, 0xde, 0x5b, 0x47, 0x18, 0x9f, 0x48, 0x42, 0x2d, 0xb8, + 0x2b, 0x40, 0xa6, 0xa2, 0x65, 0x2b, 0xdd, 0xde, 0xb0, 0xbb, 0x5f, 0xe7, 0x20, 0xb7, 0x21, 0x68, + 0x50, 0x05, 0x26, 0x2c, 0xac, 0x1a, 0x7a, 0xcb, 0xa2, 0x3d, 0x49, 0xc9, 0xe2, 0x91, 0xf4, 0x46, + 0x57, 0x74, 0xc3, 0xe2, 0x27, 0x4e, 0xd9, 0x43, 0xe3, 0xd7, 0x13, 0x87, 0x9b, 0x1b, 0x45, 0xa7, + 0x2a, 0x3a, 0x41, 0xd6, 0x12, 0xcf, 0xdf, 0x3b, 0x6a, 0x43, 0x85, 0xdd, 0x70, 0x73, 0xba, 0xe0, + 0xd9, 0x3d, 0x39, 0x11, 0xdc, 0x3d, 0x79, 0x16, 0x77, 0x3a, 0x4f, 0xeb, 0xc6, 0x35, 0x7d, 0x83, + 0xf0, 0x38, 0x22, 0xf9, 0x58, 0x12, 0x4e, 0x0c, 0x6c, 0x94, 0x70, 0xf3, 0x32, 0x4c, 0x22, 0x75, + 0xc8, 0x2e, 0x0a, 0xab, 0x75, 0x58, 0x81, 0xfc, 0xea, 0x21, 0x05, 0x32, 0x29, 0x6a, 0x12, 0xf2, + 0xb8, 0x27, 0x5a, 0x1e, 0xa2, 0xfd, 0x37, 0x20, 0x8e, 0x0f, 0x3e, 0x01, 0xb7, 0x7b, 0x14, 0x48, + 0xd9, 0x52, 0x35, 0x7e, 0x8d, 0xd0, 0x3b, 0x63, 0x8e, 0x78, 0x66, 0x0c, 0x21, 0x99, 0xa3, 0x2f, + 0xc3, 0x27, 0x4d, 0x35, 0x9e, 0xed, 0xaa, 0x46, 0xcc, 0xd2, 0x6a, 0x94, 0xe2, 0x56, 0x23, 0x86, + 0x51, 0xfa, 0xab, 0x71, 0x98, 0x10, 0x77, 0x3e, 0x1f, 0x85, 0x34, 0x56, 0x77, 0x0c, 0x7e, 0xd8, + 0x5d, 0x9a, 0x0b, 0xed, 0xcf, 0x1c, 0xa7, 0x5e, 0x52, 0x77, 0x8c, 0x8b, 0x63, 0x32, 0xe5, 0xa0, + 0x77, 0xc5, 0x3a, 0x7d, 0x6b, 0x87, 0x9f, 0x49, 0x3e, 0x35, 0x9a, 0xf5, 0x3c, 0x21, 0xbd, 0x38, + 0x26, 0x33, 0x1e, 0x52, 0x2d, 0xbd, 0xe7, 0x96, 0x8e, 0x53, 0xed, 0xb2, 0xbe, 0x4d, 0xab, 0x25, + 0x1c, 0xe8, 0x22, 0x80, 0x85, 0x6d, 0x71, 0x94, 0x61, 0x9c, 0xf2, 0xdf, 0x3d, 0x9a, 0x7f, 0x1d, + 0xdb, 0xcc, 0x6d, 0x5d, 0x1c, 0x93, 0x73, 0x96, 0x78, 0x20, 0x48, 0x9a, 0xae, 0xd9, 0x4d, 0x75, + 0x47, 0xd1, 0x74, 0xba, 0x07, 0x1f, 0x89, 0xb4, 0xac, 0x6b, 0xf6, 0x02, 0x21, 0x27, 0x48, 0x9a, + 0x78, 0x20, 0xa2, 0xa0, 0x77, 0x4b, 0xf9, 0x65, 0xac, 0x08, 0x51, 0x3c, 0x43, 0x48, 0x89, 0x28, + 0x28, 0x0f, 0x7a, 0x1a, 0xf2, 0x74, 0xbb, 0xb5, 0xb9, 0xd5, 0x31, 0xd4, 0x5d, 0x7e, 0x03, 0x65, + 0x76, 0x34, 0x44, 0x83, 0x30, 0x34, 0x08, 0xfd, 0xc5, 0x31, 0x19, 0xb6, 0x9c, 0x27, 0xd4, 0x80, + 0x2c, 0x3b, 0xf5, 0x6b, 0xef, 0xf1, 0x3b, 0x84, 0x77, 0x8e, 0x46, 0xa2, 0x07, 0x80, 0x37, 0xf6, + 0x2e, 0x8e, 0xc9, 0x13, 0x2a, 0xfb, 0x89, 0x96, 0x20, 0x87, 0xf5, 0x16, 0x6f, 0x4e, 0x9e, 0xdf, + 0xb6, 0x1a, 0xad, 0x17, 0x7a, 0x4b, 0x34, 0x26, 0x8b, 0xf9, 0x6f, 0xf4, 0x04, 0x64, 0x54, 0xa3, + 0xdb, 0xd5, 0x6c, 0x7a, 0x17, 0x31, 0x7f, 0xf6, 0x8e, 0x88, 0x86, 0x50, 0xda, 0x8b, 0x63, 0x32, + 0xe7, 0x22, 0xc3, 0xd3, 0xc2, 0x1d, 0xed, 0x2a, 0x36, 0x49, 0x67, 0xa6, 0xe3, 0x0c, 0xcf, 0x22, + 0xa3, 0xa7, 0xdd, 0xc9, 0xb5, 0xc4, 0x43, 0x63, 0x82, 0xbb, 0x17, 0xe9, 0x6e, 0xc8, 0x7b, 0x34, + 0x99, 0x58, 0x2c, 0xbe, 0x02, 0xe1, 0xce, 0x5e, 0x3c, 0x4a, 0x45, 0x28, 0x78, 0xf5, 0x56, 0xea, + 0x3a, 0x8c, 0x74, 0x13, 0xbf, 0x02, 0x13, 0x57, 0xb1, 0x69, 0xb1, 0x1d, 0x7c, 0xca, 0xc8, 0x1f, + 0xd1, 0x29, 0x98, 0xa4, 0x72, 0x6b, 0x8a, 0xf7, 0xec, 0xfa, 0x72, 0x81, 0x16, 0x5e, 0xe1, 0x44, + 0x35, 0xc8, 0xf7, 0xce, 0xf6, 0x1c, 0x12, 0x76, 0x87, 0x1a, 0x7a, 0x67, 0x7b, 0x9c, 0x40, 0xaa, + 0x43, 0x39, 0xa8, 0xba, 0x5e, 0xaf, 0x99, 0x0b, 0xf1, 0x9a, 0x39, 0xe1, 0x69, 0x7f, 0x37, 0xe9, + 0x30, 0x3b, 0xda, 0x4a, 0xa6, 0x1b, 0x31, 0x12, 0x94, 0x3b, 0x7f, 0xb6, 0x3a, 0x10, 0xda, 0x39, + 0xbe, 0xa6, 0x91, 0x25, 0xa1, 0xc8, 0x27, 0xfe, 0xac, 0x96, 0x90, 0x29, 0x07, 0x3a, 0x4e, 0x14, + 0x4a, 0xd1, 0xf4, 0xa6, 0xd6, 0x12, 0xb7, 0x8e, 0xe9, 0xf3, 0x72, 0x0b, 0x3d, 0x03, 0x65, 0xd5, + 0xd0, 0x2d, 0xac, 0x5b, 0x7d, 0xab, 0xd9, 0x53, 0x4c, 0xa5, 0xeb, 0x5e, 0xce, 0x0b, 0x1f, 0xa6, + 0x05, 0x41, 0xbe, 0x46, 0xa9, 0xe5, 0x92, 0xea, 0x2f, 0x40, 0x2b, 0x00, 0x57, 0x95, 0x8e, 0xd6, + 0x52, 0x6c, 0xc3, 0xb4, 0xf8, 0xdd, 0x94, 0x61, 0x60, 0x57, 0x04, 0xe1, 0x66, 0xaf, 0xa5, 0xd8, + 0x98, 0x07, 0x51, 0x1e, 0x7e, 0x74, 0x17, 0x94, 0x94, 0x5e, 0xaf, 0x69, 0xd9, 0x8a, 0x8d, 0x9b, + 0x5b, 0xfb, 0x36, 0xb6, 0xa8, 0xbd, 0x28, 0xc8, 0x93, 0x4a, 0xaf, 0xb7, 0x4e, 0x4a, 0x1b, 0xa4, + 0x50, 0x6a, 0x39, 0xa3, 0x4d, 0xa7, 0xa6, 0x13, 0xdb, 0x25, 0xdc, 0xd8, 0x8e, 0x94, 0xd1, 0xa3, + 0x15, 0x4c, 0x06, 0xe2, 0x34, 0x4a, 0x66, 0x07, 0x6b, 0xed, 0x1d, 0x76, 0x0d, 0x3e, 0x25, 0xf3, + 0x27, 0x32, 0x30, 0x3d, 0xd3, 0xb8, 0x8a, 0xf9, 0x0d, 0x78, 0xf6, 0x20, 0xfd, 0x5a, 0x12, 0xa6, + 0x06, 0xa6, 0x2f, 0xc1, 0xa5, 0xe7, 0xfb, 0x79, 0x5d, 0xe4, 0x37, 0x3a, 0x47, 0x70, 0x95, 0x16, + 0xbf, 0xb3, 0x92, 0x3f, 0x7b, 0xdb, 0x10, 0x09, 0x5c, 0xa4, 0x44, 0xbc, 0xe3, 0x9c, 0x05, 0x6d, + 0x42, 0xb9, 0xa3, 0x58, 0x76, 0x93, 0xcd, 0x22, 0x76, 0x9b, 0x38, 0x35, 0xd2, 0x12, 0xac, 0x28, + 0x62, 0xf6, 0x11, 0xe5, 0xe6, 0x70, 0xc5, 0x8e, 0xaf, 0x14, 0x3d, 0x07, 0x33, 0x5b, 0xfb, 0x2f, + 0x29, 0xba, 0xad, 0xe9, 0xf4, 0xb0, 0x91, 0x7f, 0x8c, 0x6a, 0x43, 0xa0, 0x97, 0xae, 0x6a, 0x2d, + 0xac, 0xab, 0x62, 0x70, 0xa6, 0x1d, 0x08, 0x67, 0xf0, 0x2c, 0xe9, 0x39, 0x28, 0xfa, 0x6d, 0x11, + 0x2a, 0x42, 0xd2, 0xde, 0xe3, 0x12, 0x49, 0xda, 0x7b, 0xe8, 0x61, 0x1e, 0x91, 0x27, 0xe9, 0x69, + 0xb9, 0x61, 0xce, 0x82, 0x73, 0xbb, 0x77, 0x0e, 0x25, 0xc9, 0x99, 0x09, 0x8e, 0x61, 0x08, 0x62, + 0x4b, 0xa7, 0xa1, 0x14, 0x30, 0x62, 0x9e, 0x61, 0x4d, 0x78, 0x87, 0x55, 0x2a, 0xc1, 0xa4, 0xcf, + 0x56, 0x49, 0x7f, 0x9c, 0x81, 0xac, 0xf3, 0x2d, 0x83, 0x8b, 0x90, 0xc3, 0x7b, 0x2a, 0xee, 0xd9, + 0xc2, 0x2a, 0x8c, 0x32, 0xe2, 0x8c, 0x67, 0x49, 0xd0, 0x13, 0x73, 0xe5, 0x30, 0xa3, 0xc7, 0x7c, + 0x2e, 0xf9, 0x54, 0x14, 0x88, 0xd7, 0x27, 0x3f, 0xee, 0xf7, 0xc9, 0x77, 0x44, 0xf0, 0x06, 0x9c, + 0xf2, 0x63, 0x3e, 0xa7, 0x1c, 0x55, 0xb1, 0xcf, 0x2b, 0x2f, 0x87, 0x78, 0xe5, 0xa8, 0xee, 0x0f, + 0x71, 0xcb, 0xcb, 0x21, 0x6e, 0x79, 0x36, 0xb2, 0x2d, 0xa1, 0x7e, 0xf9, 0x71, 0xbf, 0x5f, 0x8e, + 0x12, 0x47, 0xc0, 0x31, 0xaf, 0x84, 0x39, 0xe6, 0xd3, 0x11, 0x18, 0x43, 0x3d, 0xf3, 0xc2, 0x80, + 0x67, 0xbe, 0x2b, 0x02, 0x2a, 0xc4, 0x35, 0x2f, 0xfb, 0x7c, 0x22, 0xc4, 0x92, 0x4d, 0xb8, 0x53, + 0x44, 0xe7, 0x07, 0xbd, 0xfc, 0xdd, 0x51, 0xaa, 0x16, 0xe6, 0xe6, 0x9f, 0x0c, 0xb8, 0xf9, 0x3b, + 0xa3, 0x7a, 0x15, 0xf0, 0xf3, 0xae, 0x77, 0x3e, 0x4d, 0xec, 0x63, 0x60, 0x66, 0x10, 0x5b, 0x8a, + 0x4d, 0xd3, 0x30, 0xb9, 0xe3, 0x63, 0x0f, 0xd2, 0x2c, 0xb1, 0xd8, 0xae, 0xfe, 0x8f, 0xf0, 0xe4, + 0x74, 0xd2, 0x7a, 0xb4, 0x5d, 0xfa, 0x6a, 0xc2, 0xe5, 0xa5, 0x96, 0xcd, 0x6b, 0xed, 0x73, 0xdc, + 0xda, 0x7b, 0x1c, 0x7c, 0xd2, 0xef, 0xe0, 0x6b, 0x90, 0x27, 0x3e, 0x25, 0xe0, 0xbb, 0x95, 0x9e, + 0xf0, 0xdd, 0xe8, 0x1e, 0x98, 0xa2, 0xf6, 0x97, 0x85, 0x01, 0xdc, 0x90, 0xa4, 0xa9, 0x21, 0x29, + 0x91, 0x17, 0x4c, 0x82, 0xcc, 0x51, 0xdc, 0x0f, 0xd3, 0x1e, 0x5a, 0x82, 0x4b, 0x7d, 0x01, 0x73, + 0x52, 0x65, 0x87, 0x7a, 0xbe, 0xd7, 0xbb, 0xa8, 0x58, 0x3b, 0xd2, 0xaa, 0x2b, 0x20, 0x37, 0x2e, + 0x40, 0x90, 0x56, 0x8d, 0x16, 0xeb, 0xf7, 0xa4, 0x4c, 0x7f, 0x93, 0x58, 0xa1, 0x63, 0xb4, 0xf9, + 0x09, 0x48, 0xf2, 0x93, 0x50, 0x39, 0x53, 0x3b, 0xc7, 0xe6, 0xac, 0xf4, 0xa5, 0x84, 0x8b, 0xe7, + 0x86, 0x0a, 0x61, 0x5e, 0x3d, 0x71, 0x33, 0xbd, 0x7a, 0xf2, 0xcd, 0x79, 0x75, 0xe9, 0x8d, 0x84, + 0x3b, 0xa4, 0x8e, 0xbf, 0xbe, 0x31, 0x11, 0x10, 0xed, 0x62, 0x37, 0xc6, 0xd9, 0x49, 0x5d, 0xf6, + 0x20, 0x42, 0xad, 0x4c, 0x48, 0x82, 0x62, 0xc2, 0x93, 0xd4, 0x40, 0x0f, 0x51, 0x3f, 0x6f, 0x6c, + 0x73, 0xd3, 0x50, 0x8b, 0x48, 0xf4, 0xc8, 0x8c, 0xda, 0xe3, 0x5f, 0x72, 0xbe, 0xb0, 0xe1, 0x56, + 0xc8, 0x91, 0xa6, 0xb3, 0xeb, 0x4f, 0xc0, 0xd3, 0x8b, 0xa2, 0x40, 0x6a, 0x01, 0x1a, 0xb4, 0x31, + 0xe8, 0x12, 0x64, 0xf0, 0x55, 0x7a, 0x1a, 0x95, 0x25, 0x9b, 0x6e, 0x1d, 0xea, 0x88, 0xb1, 0x6e, + 0x37, 0x2a, 0x44, 0x98, 0xdf, 0x3b, 0xa8, 0x95, 0x19, 0xcf, 0x7d, 0x46, 0x57, 0xb3, 0x71, 0xb7, + 0x67, 0xef, 0xcb, 0x1c, 0x45, 0xfa, 0x70, 0x92, 0xf8, 0x43, 0x9f, 0xfd, 0x09, 0x15, 0xaf, 0x98, + 0x34, 0x49, 0x4f, 0x88, 0x14, 0x4f, 0xe4, 0xb7, 0x01, 0xb4, 0x15, 0xab, 0x79, 0x4d, 0xd1, 0x6d, + 0xdc, 0xe2, 0x72, 0xcf, 0xb5, 0x15, 0xeb, 0x59, 0x5a, 0x40, 0xe2, 0x4d, 0xf2, 0xba, 0x6f, 0xe1, + 0x16, 0x1d, 0x80, 0x94, 0x3c, 0xd1, 0x56, 0xac, 0x4d, 0x0b, 0xb7, 0x3c, 0x7d, 0x9d, 0xb8, 0x19, + 0x7d, 0xf5, 0xcb, 0x3b, 0x1b, 0x94, 0xf7, 0x47, 0x93, 0xee, 0xec, 0x70, 0xc3, 0x87, 0x1f, 0x4f, + 0x59, 0x7c, 0x86, 0xae, 0x29, 0xfc, 0x4e, 0x00, 0xbd, 0x0f, 0xa6, 0x9c, 0x59, 0xd9, 0xec, 0xd3, + 0xd9, 0x2a, 0xb4, 0xf0, 0x70, 0x93, 0xbb, 0x7c, 0xd5, 0x5f, 0x6c, 0xa1, 0x9f, 0x81, 0x63, 0x01, + 0x1b, 0xe4, 0x54, 0x90, 0x3c, 0x94, 0x29, 0x3a, 0xe2, 0x37, 0x45, 0x02, 0xdf, 0x95, 0x5e, 0xea, + 0xa6, 0xcc, 0x9a, 0x3b, 0x48, 0x08, 0xeb, 0x75, 0x6f, 0x61, 0x3a, 0x21, 0xfd, 0x49, 0x02, 0x4a, + 0x81, 0x06, 0xa2, 0x47, 0x61, 0x9c, 0x79, 0xe0, 0xc4, 0xc8, 0x44, 0x08, 0x95, 0x38, 0xef, 0x13, + 0x63, 0x40, 0xf3, 0x90, 0xc5, 0x3c, 0xba, 0xe6, 0x42, 0xb9, 0x33, 0x22, 0x08, 0xe7, 0xfc, 0x0e, + 0x1b, 0x5a, 0x84, 0x9c, 0x23, 0xfa, 0x88, 0x95, 0x9b, 0x33, 0x72, 0x1c, 0xc4, 0x65, 0x94, 0x16, + 0x20, 0xef, 0x69, 0x1e, 0xbb, 0x0b, 0xb8, 0xc7, 0x97, 0x5b, 0x2c, 0x80, 0xce, 0x76, 0x95, 0x3d, + 0xba, 0xd2, 0x42, 0xc7, 0x60, 0x82, 0xbc, 0x6c, 0xf3, 0xcb, 0x52, 0x29, 0x39, 0xd3, 0x55, 0xf6, + 0x2e, 0x28, 0x96, 0xf4, 0xb1, 0x04, 0x14, 0xfd, 0xed, 0x44, 0xf7, 0x02, 0x22, 0xb4, 0x4a, 0x1b, + 0x37, 0xf5, 0x7e, 0x97, 0xf9, 0x48, 0x81, 0x58, 0xea, 0x2a, 0x7b, 0xf3, 0x6d, 0x7c, 0xa9, 0xdf, + 0xa5, 0x55, 0x5b, 0x68, 0x15, 0xca, 0x82, 0x58, 0x24, 0xbb, 0xb8, 0x54, 0x8e, 0x0f, 0x7e, 0xd7, + 0x86, 0x13, 0xb0, 0xb5, 0xee, 0x27, 0xc9, 0x5a, 0xb7, 0xc8, 0xf0, 0xc4, 0x1b, 0xe9, 0x21, 0x28, + 0x05, 0x7a, 0x8c, 0x24, 0x98, 0xec, 0xf5, 0xb7, 0x9a, 0xbb, 0x78, 0x9f, 0xde, 0x7e, 0x67, 0xaa, + 0x9e, 0x93, 0xf3, 0xbd, 0xfe, 0xd6, 0xd3, 0x78, 0x9f, 0xe6, 0x0e, 0x25, 0x15, 0x8a, 0xfe, 0xc5, + 0x14, 0x71, 0x1c, 0xa6, 0xd1, 0xd7, 0x5b, 0xe2, 0xbb, 0x06, 0xf4, 0x01, 0x9d, 0x83, 0xf1, 0xab, + 0x06, 0xd3, 0xe6, 0x51, 0xab, 0xa7, 0x2b, 0x86, 0x8d, 0x3d, 0x4b, 0x32, 0xc6, 0x23, 0x59, 0x30, + 0x4e, 0xf5, 0x32, 0x74, 0xa3, 0xe2, 0x0a, 0x80, 0x62, 0xdb, 0xa6, 0xb6, 0xd5, 0x77, 0xe1, 0x2b, + 0x73, 0x83, 0x69, 0xfd, 0xb9, 0x35, 0x45, 0x33, 0x1b, 0xb7, 0x72, 0xcd, 0x9e, 0x71, 0x79, 0x3c, + 0xda, 0xed, 0x41, 0x92, 0x5e, 0x4f, 0x43, 0x86, 0x2d, 0x37, 0xd1, 0x13, 0xfe, 0xe4, 0x47, 0xfe, + 0xec, 0x89, 0x61, 0xcd, 0x67, 0x54, 0xbc, 0xf5, 0x4e, 0x04, 0x75, 0x57, 0x30, 0xa3, 0xd0, 0xc8, + 0xbf, 0x7a, 0x50, 0x9b, 0xa0, 0xd1, 0xc7, 0xf2, 0xa2, 0x9b, 0x5e, 0x18, 0xb6, 0xba, 0x16, 0xb9, + 0x8c, 0xf4, 0xa1, 0x73, 0x19, 0x17, 0x61, 0xd2, 0x13, 0x6e, 0x69, 0x2d, 0xbe, 0x4e, 0x39, 0x31, + 0x6a, 0xd2, 0x2d, 0x2f, 0xf2, 0xf6, 0xe7, 0x9d, 0x70, 0x6c, 0xb9, 0x85, 0x66, 0xfd, 0x8b, 0x6c, + 0x1a, 0xb5, 0xb1, 0x70, 0xc1, 0xb3, 0x6e, 0xa6, 0x57, 0xf2, 0x6f, 0x81, 0x1c, 0xbd, 0xd8, 0x4c, + 0x49, 0x58, 0xf4, 0x90, 0x25, 0x05, 0xf4, 0xe5, 0xdd, 0x50, 0x72, 0x03, 0x1b, 0x46, 0x92, 0x65, + 0x28, 0x6e, 0x31, 0x25, 0x7c, 0x00, 0x66, 0xe8, 0x87, 0xf2, 0x82, 0xd4, 0x39, 0x4a, 0x8d, 0xc8, + 0xbb, 0x2b, 0x7e, 0x8e, 0x3b, 0xa1, 0xe8, 0x9a, 0x50, 0x4a, 0x0b, 0x2c, 0xf5, 0xe1, 0x94, 0x52, + 0xb2, 0xe3, 0x90, 0x75, 0xc2, 0xce, 0x3c, 0xfb, 0x02, 0x9f, 0xc2, 0xa2, 0x4d, 0x27, 0x90, 0x35, + 0xb1, 0xd5, 0xef, 0xd8, 0x1c, 0xa4, 0x40, 0x69, 0x68, 0x20, 0x2b, 0xb3, 0x72, 0x4a, 0x7b, 0x0a, + 0x26, 0x85, 0x55, 0x61, 0x74, 0x93, 0x94, 0xae, 0x20, 0x0a, 0x29, 0xd1, 0x69, 0x28, 0xf7, 0x4c, + 0xa3, 0x67, 0x58, 0xd8, 0x6c, 0x2a, 0xad, 0x96, 0x89, 0x2d, 0xab, 0x52, 0x64, 0x78, 0xa2, 0x7c, + 0x9e, 0x15, 0x4b, 0xef, 0x82, 0x09, 0x11, 0x4f, 0xcf, 0xc0, 0x78, 0xc3, 0xb1, 0x90, 0x69, 0x99, + 0x3d, 0x10, 0xff, 0x3a, 0xdf, 0xeb, 0xf1, 0xec, 0x1a, 0xf9, 0x29, 0x75, 0x60, 0x82, 0x0f, 0x58, + 0x68, 0x4e, 0x65, 0x15, 0x0a, 0x3d, 0xc5, 0x24, 0xdd, 0xf0, 0x66, 0x56, 0x86, 0xad, 0x08, 0xd7, + 0x14, 0xd3, 0x5e, 0xc7, 0xb6, 0x2f, 0xc1, 0x92, 0xa7, 0xfc, 0xac, 0x48, 0x7a, 0x0c, 0x26, 0x7d, + 0x34, 0xee, 0xf7, 0x0a, 0xf9, 0x44, 0xa7, 0x0f, 0x4e, 0x4b, 0x92, 0x6e, 0x4b, 0xa4, 0x73, 0x90, + 0x73, 0xc6, 0x8a, 0x2c, 0x34, 0x84, 0x28, 0xf8, 0x07, 0x10, 0xf9, 0x23, 0x4d, 0x22, 0x19, 0xd7, + 0xf8, 0xa7, 0x9c, 0x52, 0x32, 0x7b, 0x90, 0xb0, 0xc7, 0x30, 0x31, 0x6f, 0x86, 0x1e, 0x87, 0x09, + 0x6e, 0x98, 0xf8, 0x7c, 0x1c, 0x96, 0x2e, 0x5a, 0xa3, 0x96, 0x4a, 0xa4, 0x8b, 0x98, 0xdd, 0x72, + 0xab, 0x49, 0x7a, 0xab, 0xf9, 0x00, 0x64, 0x85, 0xf1, 0xf1, 0x7b, 0x09, 0x56, 0xc3, 0xc9, 0x28, + 0x2f, 0xc1, 0x2b, 0x71, 0x19, 0x89, 0x36, 0x59, 0x5a, 0x5b, 0xc7, 0xad, 0xa6, 0x3b, 0x05, 0xf9, + 0x85, 0xd9, 0x12, 0x7b, 0xb1, 0x22, 0xe6, 0x97, 0xf4, 0x00, 0x64, 0x58, 0x5b, 0x43, 0x4d, 0x5c, + 0x98, 0x6b, 0xfd, 0x4e, 0x02, 0xb2, 0xc2, 0x7d, 0x84, 0x32, 0xf9, 0x3a, 0x91, 0xbc, 0xd1, 0x4e, + 0xdc, 0x7c, 0x93, 0x74, 0x1f, 0x20, 0xaa, 0x29, 0xcd, 0xab, 0x86, 0xad, 0xe9, 0xed, 0x26, 0x1b, + 0x0b, 0x7e, 0x6f, 0x90, 0xbe, 0xb9, 0x42, 0x5f, 0xac, 0x91, 0xf2, 0x7b, 0x4e, 0x41, 0xde, 0x93, + 0xe5, 0x42, 0x13, 0x90, 0xba, 0x84, 0xaf, 0x95, 0xc7, 0x50, 0x1e, 0x26, 0x64, 0x4c, 0x73, 0x04, + 0xe5, 0xc4, 0xd9, 0xd7, 0x27, 0xa0, 0x34, 0xdf, 0x58, 0x58, 0x9e, 0xef, 0xf5, 0x3a, 0x1a, 0xbf, + 0x4f, 0x77, 0x19, 0xd2, 0x74, 0x9d, 0x1c, 0x63, 0x7f, 0xa7, 0x1a, 0x27, 0xe1, 0x84, 0x64, 0x18, + 0xa7, 0xcb, 0x69, 0x14, 0x67, 0xdb, 0xa7, 0x1a, 0x2b, 0x0f, 0x45, 0x1a, 0x49, 0x15, 0x2e, 0xc6, + 0x6e, 0x50, 0x35, 0x4e, 0x72, 0x0a, 0xfd, 0x0c, 0xe4, 0xdc, 0x75, 0x72, 0xdc, 0x3d, 0xa2, 0x6a, + 0xec, 0xb4, 0x15, 0xc1, 0x77, 0x57, 0x06, 0x71, 0xb7, 0x26, 0xaa, 0xb1, 0xf3, 0x35, 0xe8, 0x39, + 0x98, 0x10, 0x6b, 0xb0, 0x78, 0xbb, 0x38, 0xd5, 0x98, 0x29, 0x25, 0x32, 0x7c, 0x6c, 0xe9, 0x1c, + 0x67, 0xab, 0xaa, 0x1a, 0x2b, 0x6f, 0x86, 0x36, 0x21, 0xc3, 0x83, 0xdf, 0x58, 0x3b, 0x3d, 0xd5, + 0x78, 0x89, 0x22, 0x22, 0x64, 0x37, 0x39, 0x11, 0x77, 0x7b, 0xae, 0x1a, 0x3b, 0x61, 0x88, 0x14, + 0x00, 0xcf, 0x7a, 0x3a, 0xf6, 0xbe, 0x5b, 0x35, 0x7e, 0x22, 0x10, 0xbd, 0x1f, 0xb2, 0xce, 0xaa, + 0x29, 0xe6, 0x4e, 0x5a, 0x35, 0x6e, 0x2e, 0xae, 0xb1, 0x19, 0xfb, 0x94, 0xc4, 0xbd, 0x91, 0xa7, + 0x24, 0xdc, 0x4d, 0x6e, 0x67, 0x1b, 0xfc, 0x2f, 0x13, 0x70, 0x3c, 0xb8, 0x9d, 0xac, 0xe8, 0xfb, + 0x43, 0x0e, 0x04, 0x0c, 0x39, 0x2d, 0xf2, 0x38, 0xa4, 0xe6, 0xf5, 0x7d, 0x12, 0x6c, 0xd0, 0x6f, + 0x00, 0xf6, 0xcd, 0x8e, 0x48, 0xd3, 0x91, 0xe7, 0x4d, 0xb3, 0x13, 0x7e, 0x6a, 0xa4, 0x9e, 0xfe, + 0xfe, 0xe7, 0x6a, 0x63, 0x8d, 0xdd, 0x90, 0x5e, 0x45, 0x9c, 0x15, 0xc8, 0xce, 0xeb, 0xfb, 0xe2, + 0x98, 0xc0, 0x38, 0xed, 0xd0, 0x61, 0xb7, 0xff, 0x5f, 0x2b, 0x10, 0x64, 0xcf, 0x77, 0x84, 0x79, + 0x8f, 0x33, 0xec, 0x69, 0xc8, 0x0e, 0x7f, 0xf4, 0x89, 0x81, 0xea, 0x70, 0x69, 0x4a, 0x17, 0x20, + 0xbd, 0x60, 0x68, 0x34, 0xe4, 0x69, 0x61, 0xdd, 0xe8, 0x8a, 0x9c, 0x27, 0x7d, 0x40, 0xa7, 0x20, + 0xa3, 0x74, 0x8d, 0xbe, 0x6e, 0x8b, 0xa8, 0x99, 0xb8, 0x92, 0xff, 0x7a, 0x50, 0x4b, 0x2d, 0xeb, + 0xb6, 0xcc, 0x5f, 0xd5, 0xd3, 0xdf, 0x7d, 0xa5, 0x96, 0x90, 0x9e, 0x82, 0x89, 0x45, 0xac, 0xde, + 0x08, 0xd6, 0x22, 0x56, 0x03, 0x58, 0xa7, 0x21, 0xbb, 0xac, 0xdb, 0xec, 0x9b, 0x61, 0xb7, 0x41, + 0x4a, 0xd3, 0xd9, 0xb6, 0x48, 0xa0, 0x7e, 0x52, 0x4e, 0x48, 0x17, 0xb1, 0xea, 0x90, 0xb6, 0xb0, + 0x1a, 0x24, 0x25, 0xf0, 0xa4, 0x5c, 0x6a, 0x40, 0xe1, 0x8a, 0xd2, 0xe1, 0xe1, 0x1e, 0xb6, 0xd0, + 0x7d, 0x90, 0x53, 0xc4, 0x03, 0x5d, 0x59, 0x15, 0x1a, 0xc5, 0x1f, 0x1c, 0xd4, 0xc0, 0x25, 0x92, + 0x5d, 0x82, 0x7a, 0xfa, 0xe5, 0xff, 0x76, 0x32, 0x21, 0x19, 0x30, 0x71, 0x41, 0xb1, 0xa8, 0xa5, + 0x7f, 0xd0, 0x97, 0x48, 0xa1, 0x91, 0x62, 0xe3, 0xc8, 0xf5, 0x83, 0xda, 0xd4, 0xbe, 0xd2, 0xed, + 0xd4, 0x25, 0xf7, 0x9d, 0xe4, 0xcd, 0xaf, 0xcc, 0x79, 0xf2, 0x2b, 0x34, 0x92, 0x6c, 0x4c, 0x5f, + 0x3f, 0xa8, 0x95, 0x5c, 0x1e, 0xf2, 0x46, 0x72, 0x92, 0x2e, 0x52, 0x0f, 0x32, 0x2c, 0xe8, 0x0d, + 0xdd, 0x21, 0xe4, 0x29, 0x9f, 0xa4, 0x9b, 0xf2, 0xa9, 0x1f, 0x2a, 0xcd, 0xc0, 0xe3, 0x32, 0xc6, + 0x51, 0x4f, 0x7f, 0xe4, 0x95, 0xda, 0x98, 0x64, 0x02, 0x5a, 0xd7, 0xba, 0xfd, 0x0e, 0xbb, 0xf8, + 0x2d, 0xb6, 0x9a, 0x1e, 0x64, 0xed, 0xa6, 0xe9, 0x24, 0x16, 0x90, 0x95, 0xe6, 0xb8, 0x92, 0x72, + 0x81, 0xb0, 0x38, 0xe3, 0x9b, 0x07, 0xb5, 0x04, 0x6d, 0x3d, 0x95, 0xd1, 0x5d, 0x90, 0x61, 0xa1, + 0x3c, 0x8f, 0x7f, 0x8a, 0x82, 0x87, 0xf5, 0x49, 0xe6, 0x6f, 0xa5, 0x27, 0x60, 0x62, 0xd5, 0x6a, + 0x2f, 0x92, 0x2e, 0x1d, 0x87, 0x6c, 0xd7, 0x6a, 0x37, 0x3d, 0xd1, 0xd4, 0x44, 0xd7, 0x6a, 0x6f, + 0x0c, 0x89, 0xc2, 0xf8, 0xb0, 0xbc, 0x1b, 0x32, 0x1b, 0x7b, 0x94, 0xfd, 0x94, 0x23, 0xa5, 0x94, + 0xb7, 0x8d, 0x1c, 0xdd, 0xc7, 0xf4, 0xc1, 0x14, 0xc0, 0xc6, 0x9e, 0xd3, 0xc3, 0x21, 0x5b, 0x70, + 0x48, 0x82, 0x8c, 0xbd, 0xe7, 0x44, 0xd4, 0xb9, 0x06, 0xbc, 0x7a, 0x50, 0xcb, 0x6c, 0xec, 0x91, + 0xe5, 0x85, 0xcc, 0xdf, 0xf8, 0x53, 0x59, 0xa9, 0x40, 0x2a, 0xcb, 0x49, 0xe0, 0xa5, 0x43, 0x12, + 0x78, 0xe3, 0x9e, 0x1d, 0x80, 0x63, 0x30, 0x61, 0x2a, 0xd7, 0x9a, 0x64, 0x44, 0xd9, 0xd7, 0x4a, + 0x33, 0xa6, 0x72, 0x6d, 0xc5, 0x68, 0xa3, 0x05, 0x48, 0x77, 0x8c, 0xb6, 0xc8, 0xbb, 0x1d, 0x15, + 0x9d, 0x22, 0x11, 0x17, 0x3f, 0x4d, 0xbc, 0x62, 0xb4, 0x1b, 0xc7, 0x88, 0xfc, 0xbf, 0xf8, 0x67, + 0xb5, 0x92, 0xbf, 0xdc, 0x92, 0x29, 0xb3, 0x93, 0x0c, 0xcc, 0x0e, 0x4d, 0x06, 0xe6, 0x46, 0x25, + 0x03, 0xc1, 0x9f, 0x0c, 0xbc, 0x83, 0xee, 0x69, 0xb2, 0x3d, 0x9c, 0x99, 0x81, 0xe0, 0x73, 0x5e, + 0xdf, 0xa7, 0xbb, 0xa8, 0xb7, 0x42, 0xce, 0x39, 0x28, 0xc4, 0x3f, 0x0f, 0xed, 0x16, 0x70, 0x7d, + 0xfb, 0x48, 0x02, 0x8a, 0xfe, 0x16, 0xd3, 0x7c, 0x8e, 0xd5, 0xe6, 0x1f, 0x56, 0x65, 0x69, 0x4f, + 0xa2, 0x14, 0xcb, 0x22, 0x53, 0x1e, 0xd0, 0xf9, 0xf9, 0x80, 0xce, 0x4f, 0x0b, 0x01, 0xb1, 0xbb, + 0x3b, 0x4c, 0xd5, 0x67, 0xb8, 0x74, 0x0a, 0x9e, 0x42, 0xcb, 0x55, 0x7d, 0xaa, 0x11, 0x3f, 0x0b, + 0x79, 0xcf, 0xdb, 0xd0, 0xa0, 0xfe, 0x91, 0x90, 0x64, 0xc7, 0x94, 0x33, 0x20, 0xe2, 0x8d, 0xd8, + 0x42, 0x70, 0x49, 0x1d, 0x45, 0xcd, 0x39, 0x44, 0x71, 0x8f, 0x57, 0x34, 0x16, 0xff, 0xf4, 0xdb, + 0x27, 0xc6, 0x5e, 0x7e, 0xf5, 0xc4, 0xd8, 0xd0, 0xf3, 0x99, 0x52, 0xf4, 0x97, 0xe8, 0x1d, 0x2f, + 0xf3, 0xd1, 0xf7, 0xc2, 0xad, 0x9c, 0xc6, 0xb2, 0x95, 0x5d, 0x4d, 0x6f, 0x8b, 0xbf, 0xdc, 0xdd, + 0x14, 0x79, 0x6f, 0x78, 0xe9, 0x8d, 0xbb, 0x9d, 0x37, 0x7b, 0x68, 0xac, 0x1a, 0xe6, 0x0d, 0xa5, + 0x83, 0x34, 0xa0, 0x55, 0xab, 0xbd, 0x60, 0x62, 0xf6, 0xb1, 0x11, 0xbe, 0x4e, 0xf2, 0x5f, 0xf6, + 0xe1, 0x36, 0xea, 0x96, 0x39, 0x7f, 0x5f, 0x9c, 0xef, 0x4b, 0xbb, 0x39, 0x22, 0xdf, 0x15, 0xa1, + 0x25, 0x00, 0x9a, 0x5e, 0xb1, 0x2c, 0x37, 0x99, 0x57, 0x0b, 0x62, 0x2c, 0x38, 0x14, 0xb2, 0x62, + 0x63, 0x4b, 0x8c, 0xb5, 0xcb, 0x88, 0x3e, 0x00, 0xd3, 0x5d, 0x4d, 0x6f, 0x5a, 0xb8, 0xb3, 0xdd, + 0x6c, 0xe1, 0x0e, 0xfd, 0x14, 0x0b, 0xdf, 0xb8, 0xcb, 0x35, 0x56, 0xb8, 0x63, 0xba, 0x2b, 0x7a, + 0xcc, 0xe6, 0x96, 0x75, 0xfb, 0xfa, 0x41, 0xad, 0xca, 0xbc, 0x43, 0x08, 0xa4, 0x24, 0x4f, 0x75, + 0x35, 0x7d, 0x1d, 0x77, 0xb6, 0x17, 0x9d, 0x32, 0xf4, 0x12, 0x4c, 0x71, 0x0a, 0xc3, 0x4d, 0x7a, + 0x10, 0xdb, 0x53, 0x68, 0xac, 0x5e, 0x3f, 0xa8, 0x55, 0x18, 0xda, 0x00, 0x89, 0xf4, 0x83, 0x83, + 0xda, 0xfd, 0x31, 0xda, 0x34, 0xaf, 0xaa, 0xc2, 0x3d, 0x96, 0x1d, 0x10, 0x5e, 0x42, 0xea, 0x76, + 0x13, 0xf4, 0xa2, 0xee, 0xf1, 0x60, 0xdd, 0x03, 0x24, 0x71, 0xeb, 0xf6, 0xb8, 0x66, 0x37, 0x83, + 0x2f, 0xea, 0x3e, 0x0a, 0x99, 0x5e, 0x7f, 0x4b, 0xec, 0xa2, 0xe5, 0x64, 0xfe, 0x84, 0x66, 0xbd, + 0x1b, 0x69, 0xf9, 0xb3, 0x05, 0x31, 0x9e, 0x24, 0x56, 0x71, 0xd2, 0x9c, 0x2c, 0xf6, 0xa3, 0xd1, + 0xc7, 0x57, 0x53, 0x50, 0x5e, 0xb5, 0xda, 0x4b, 0x2d, 0xcd, 0xbe, 0xc9, 0xea, 0xd5, 0x0b, 0x93, + 0x0e, 0xf5, 0x66, 0x8d, 0x85, 0xeb, 0x07, 0xb5, 0x22, 0x93, 0xce, 0xcd, 0x94, 0x49, 0x17, 0x4a, + 0xae, 0x5e, 0x36, 0x4d, 0xc5, 0xe6, 0xee, 0xa9, 0xb1, 0x18, 0x53, 0x03, 0x17, 0xb1, 0x7a, 0xfd, + 0xa0, 0x76, 0x94, 0xb5, 0x2c, 0x00, 0x25, 0xc9, 0x45, 0xd5, 0x37, 0x17, 0xd0, 0x5e, 0xb8, 0xe2, + 0xd3, 0xfd, 0xa7, 0xc6, 0xc5, 0xb7, 0x50, 0xe9, 0xf9, 0xd0, 0x7d, 0x25, 0x09, 0x79, 0xe2, 0xea, + 0x59, 0x39, 0x0e, 0x9f, 0x0a, 0x89, 0x1f, 0xe1, 0x54, 0x48, 0xbe, 0x3d, 0x53, 0xe1, 0x1e, 0x27, + 0xd6, 0x4e, 0x0d, 0xd5, 0x79, 0x7f, 0xc8, 0xfd, 0x1f, 0x53, 0xd4, 0xaa, 0xd2, 0x15, 0xa4, 0x8c, + 0x5b, 0xef, 0x04, 0x01, 0xfe, 0x7c, 0x02, 0x8e, 0xb8, 0xe2, 0xb1, 0x4c, 0x35, 0x20, 0xc5, 0x67, + 0xae, 0x1f, 0xd4, 0x6e, 0x0d, 0x4a, 0xd1, 0x43, 0x76, 0x03, 0x92, 0x9c, 0x76, 0x80, 0xd6, 0x4d, + 0x35, 0xbc, 0x1d, 0x2d, 0xcb, 0x76, 0xda, 0x91, 0x1a, 0xde, 0x0e, 0x0f, 0xd9, 0x9b, 0x6a, 0xc7, + 0xa2, 0x65, 0x0f, 0x0e, 0x6a, 0x3a, 0xe6, 0xa0, 0x7e, 0x2d, 0x09, 0x93, 0xab, 0x56, 0x7b, 0x53, + 0x6f, 0xfd, 0x64, 0x42, 0x1c, 0x76, 0x42, 0x7c, 0x2c, 0x01, 0xc5, 0x8b, 0x9a, 0x65, 0x1b, 0xa6, + 0xa6, 0x2a, 0x1d, 0xba, 0x9a, 0x71, 0xcf, 0x48, 0x26, 0x0e, 0x7f, 0x46, 0xf2, 0x11, 0xc8, 0x5c, + 0x55, 0x3a, 0xec, 0xdf, 0x1a, 0xa5, 0xe8, 0x1e, 0x61, 0xc0, 0x77, 0x04, 0x73, 0xc0, 0x9c, 0x9c, + 0x37, 0xe7, 0x77, 0x92, 0x50, 0x0a, 0x04, 0x1e, 0xa8, 0x01, 0x69, 0x6a, 0xd1, 0xd9, 0x82, 0x77, + 0xee, 0x10, 0x71, 0x05, 0x59, 0x13, 0x53, 0x5e, 0xf4, 0x53, 0x90, 0xed, 0x2a, 0x7b, 0xcc, 0x33, + 0xb0, 0xf5, 0xcd, 0xfc, 0xe1, 0x70, 0xdc, 0xd5, 0xab, 0xc0, 0x91, 0xe4, 0x89, 0xae, 0xb2, 0x47, + 0xfd, 0x41, 0x0f, 0x4a, 0xa4, 0x54, 0xdd, 0x51, 0xf4, 0x36, 0xf6, 0xba, 0x9f, 0x8b, 0x87, 0xae, + 0xe4, 0xa8, 0x5b, 0x89, 0x07, 0x4e, 0x92, 0x27, 0xbb, 0xca, 0xde, 0x02, 0x2d, 0x20, 0x35, 0xd6, + 0xb3, 0x9f, 0x7c, 0xa5, 0x36, 0x46, 0x25, 0xf6, 0xef, 0x13, 0x00, 0xae, 0xc4, 0xd0, 0x06, 0x94, + 0x03, 0xee, 0x4b, 0x9c, 0x31, 0x8a, 0x0c, 0xf0, 0xdc, 0x85, 0x6d, 0x49, 0x0d, 0x0c, 0xc1, 0xfb, + 0x21, 0xcf, 0x4e, 0x09, 0x34, 0x69, 0x32, 0x3e, 0x19, 0x99, 0x8c, 0x3f, 0x41, 0xb0, 0xae, 0x1f, + 0xd4, 0x10, 0xeb, 0x8e, 0x87, 0x59, 0xa2, 0x29, 0x7a, 0x60, 0x25, 0x84, 0xc1, 0xdf, 0x97, 0xbc, + 0x27, 0xb6, 0xa0, 0x67, 0xcf, 0x0c, 0x5d, 0xdb, 0xc5, 0xa6, 0xb3, 0x46, 0x66, 0x8f, 0xa8, 0x0a, + 0x59, 0xf6, 0x55, 0x41, 0x7b, 0x5f, 0xfc, 0x5b, 0x0b, 0xf1, 0x4c, 0xb8, 0xae, 0xe1, 0x2d, 0x4b, + 0x13, 0xa3, 0x20, 0x8b, 0x47, 0x74, 0x1e, 0xca, 0x16, 0x56, 0xfb, 0xa6, 0x66, 0xef, 0x37, 0x55, + 0x43, 0xb7, 0x15, 0xd5, 0xe6, 0x4e, 0xfb, 0x96, 0xeb, 0x07, 0xb5, 0x63, 0xac, 0xad, 0x41, 0x0a, + 0x49, 0x2e, 0x89, 0xa2, 0x05, 0x56, 0x42, 0x6a, 0x68, 0x61, 0x5b, 0xd1, 0x3a, 0x16, 0x5f, 0xd8, + 0x8a, 0x47, 0x4f, 0x5f, 0x7e, 0x7b, 0xc2, 0xbb, 0x19, 0x75, 0x0d, 0xca, 0x46, 0x0f, 0x9b, 0x21, + 0xf6, 0x68, 0xc5, 0xad, 0x39, 0x48, 0x71, 0x03, 0x26, 0xa1, 0x24, 0x30, 0x84, 0x45, 0x38, 0xef, + 0x3b, 0x73, 0xc6, 0xe2, 0xc6, 0x64, 0xb0, 0xcb, 0x41, 0x0a, 0xc9, 0x7b, 0xd0, 0x8c, 0x45, 0x97, + 0x47, 0x21, 0xf3, 0x82, 0xa2, 0x75, 0xc4, 0xa7, 0x56, 0x65, 0xfe, 0x84, 0x96, 0x21, 0x63, 0xd9, + 0x8a, 0xdd, 0x67, 0xa1, 0xf7, 0x78, 0xe3, 0x5d, 0x31, 0xdb, 0xdc, 0x30, 0xf4, 0xd6, 0x3a, 0x65, + 0x94, 0x39, 0x00, 0x3a, 0x0f, 0x19, 0xdb, 0xd8, 0xc5, 0x3a, 0x17, 0xea, 0xa1, 0x66, 0x3a, 0x4d, + 0xd4, 0x31, 0x6e, 0x64, 0x83, 0x6b, 0x94, 0x9b, 0xd6, 0x8e, 0x62, 0x62, 0x8b, 0x85, 0xca, 0x8d, + 0xe5, 0x43, 0x4f, 0xc7, 0x63, 0x41, 0x4f, 0xc1, 0xf0, 0x24, 0xb9, 0xe4, 0x14, 0xad, 0xd3, 0x92, + 0x60, 0xe4, 0x3c, 0x71, 0x43, 0x91, 0xf3, 0x79, 0x28, 0xf7, 0xf5, 0x2d, 0x43, 0xa7, 0x9f, 0x45, + 0xe4, 0x69, 0x9a, 0xec, 0xc9, 0xc4, 0x6c, 0xca, 0x3b, 0x5a, 0x41, 0x0a, 0x49, 0x2e, 0x39, 0x45, + 0xfc, 0xf4, 0x63, 0x0b, 0x8a, 0x2e, 0x15, 0x9d, 0xb2, 0xb9, 0xc8, 0x29, 0x7b, 0x3b, 0x9f, 0xb2, + 0x47, 0x82, 0xb5, 0xb8, 0xb3, 0x76, 0xd2, 0x29, 0x24, 0x6c, 0xe8, 0xbd, 0xbe, 0x65, 0x24, 0xf0, + 0x1a, 0x86, 0x5a, 0x99, 0xf8, 0x2b, 0xc8, 0xfc, 0xdb, 0xb2, 0x82, 0xac, 0x17, 0x3e, 0xf2, 0x4a, + 0x6d, 0xcc, 0x99, 0xb0, 0xbf, 0x90, 0x84, 0xcc, 0xe2, 0x15, 0x7a, 0x8d, 0xf2, 0xc7, 0x34, 0x7c, + 0xf0, 0x58, 0xaf, 0xf7, 0xc0, 0x04, 0x93, 0x85, 0x85, 0xce, 0xc2, 0x78, 0x8f, 0xfc, 0xe0, 0xb9, + 0xc6, 0xa3, 0x03, 0x2a, 0x4d, 0xe9, 0xc4, 0x0a, 0x93, 0x92, 0x4a, 0x9f, 0x4f, 0x01, 0x2c, 0x5e, + 0xb9, 0xb2, 0x61, 0x6a, 0xbd, 0x0e, 0xb6, 0x7f, 0x12, 0x5e, 0xbf, 0x73, 0xc2, 0x6b, 0xcf, 0x18, + 0x3f, 0x0d, 0x79, 0x77, 0x8c, 0x2c, 0xf4, 0x38, 0x64, 0x6d, 0xfe, 0x9b, 0x0f, 0x75, 0x75, 0x70, + 0xa8, 0x05, 0x39, 0x1f, 0x6e, 0x87, 0x43, 0xfa, 0x2f, 0x49, 0x80, 0xa8, 0xe4, 0xcc, 0x8f, 0x41, + 0x00, 0x7e, 0x1e, 0x32, 0xdc, 0xe3, 0xa4, 0x6e, 0x28, 0x5a, 0xe5, 0xdc, 0x9e, 0x51, 0xfa, 0x76, + 0x12, 0xa6, 0x37, 0x85, 0xd9, 0xfd, 0x89, 0x84, 0xd1, 0x45, 0x98, 0xc0, 0xba, 0x6d, 0x6a, 0x58, + 0xa4, 0xc1, 0x67, 0x83, 0x5a, 0x1a, 0x22, 0x2d, 0xfa, 0xef, 0x12, 0xc4, 0x69, 0x39, 0xce, 0xee, + 0x91, 0xf1, 0xc7, 0x53, 0x50, 0x19, 0xc6, 0x85, 0x16, 0xa0, 0xa4, 0x9a, 0x98, 0x16, 0x34, 0xbd, + 0x3b, 0x27, 0x8d, 0xaa, 0x27, 0x63, 0xe4, 0x27, 0x90, 0xe4, 0xa2, 0x28, 0xe1, 0x0e, 0xb9, 0x4d, + 0x13, 0x54, 0x64, 0xaa, 0x10, 0xaa, 0x98, 0x41, 0xb4, 0xc4, 0x3d, 0xb2, 0x9b, 0x96, 0xf2, 0x02, + 0x30, 0x97, 0x5c, 0x74, 0x4b, 0xa9, 0x4f, 0x7e, 0x11, 0x4a, 0x9a, 0xae, 0xd9, 0x9a, 0xd2, 0x69, + 0x6e, 0x29, 0x1d, 0x45, 0x57, 0x6f, 0x64, 0x29, 0xc2, 0xbc, 0x29, 0xaf, 0x36, 0x00, 0x27, 0xc9, + 0x45, 0x5e, 0xd2, 0x60, 0x05, 0x64, 0x44, 0x44, 0x55, 0xe9, 0x1b, 0x0a, 0xdc, 0x04, 0xbb, 0x67, + 0x44, 0x7e, 0x31, 0x05, 0x53, 0x4e, 0x7e, 0xe6, 0x27, 0x43, 0x11, 0x77, 0x28, 0x56, 0x01, 0x98, + 0x01, 0x21, 0x9e, 0xe3, 0x06, 0x46, 0x83, 0x98, 0xa0, 0x1c, 0x43, 0x58, 0xb4, 0x6c, 0xcf, 0x78, + 0xfc, 0x45, 0x0a, 0x0a, 0xde, 0xf1, 0xf8, 0x89, 0x4b, 0x7f, 0x07, 0x65, 0xcc, 0xe6, 0x5d, 0x93, + 0x98, 0xe6, 0xdf, 0x45, 0x09, 0x98, 0xc4, 0x81, 0xa9, 0x34, 0xdc, 0x16, 0xfe, 0x55, 0x12, 0x32, + 0xfc, 0x5c, 0xb6, 0x3a, 0xb0, 0x8a, 0x48, 0x44, 0x9d, 0xfb, 0x1e, 0xbd, 0x88, 0xf8, 0x64, 0xe8, + 0x22, 0xa2, 0xd8, 0x55, 0xf6, 0x9a, 0xbe, 0x5b, 0x4c, 0x89, 0xd9, 0xc9, 0xc6, 0x71, 0x17, 0xc5, + 0xff, 0x9e, 0xe5, 0x42, 0xdc, 0x33, 0xb9, 0xe8, 0x11, 0xc8, 0x13, 0x0a, 0xd7, 0x2b, 0x10, 0xf6, + 0xa3, 0x6e, 0xf2, 0xc1, 0xf3, 0x52, 0x92, 0xa1, 0xab, 0xec, 0x2d, 0xb1, 0x07, 0xb4, 0x02, 0x68, + 0xc7, 0x49, 0x7d, 0x35, 0x5d, 0x11, 0x12, 0xfe, 0xdb, 0xae, 0x1f, 0xd4, 0x8e, 0x33, 0xfe, 0x41, + 0x1a, 0x49, 0x9e, 0x72, 0x0b, 0x05, 0xda, 0x83, 0x00, 0xa4, 0x5f, 0x4d, 0x76, 0x26, 0x84, 0x2d, + 0x61, 0x3d, 0x07, 0x25, 0xdc, 0x77, 0x92, 0x9c, 0x23, 0x0f, 0x8b, 0xe4, 0xb7, 0x47, 0xf0, 0xbf, + 0x94, 0x00, 0xe4, 0xfa, 0x1e, 0x67, 0xbf, 0xfe, 0xbd, 0xf4, 0x5e, 0xa2, 0x58, 0x19, 0x25, 0xc2, + 0x17, 0x59, 0x2e, 0x9f, 0x58, 0x64, 0x79, 0xa6, 0xea, 0x7d, 0xae, 0x7d, 0x4e, 0x0e, 0xcd, 0x0a, + 0x86, 0xd8, 0xe0, 0x3f, 0x4c, 0xc0, 0xf1, 0x01, 0xc5, 0x71, 0xda, 0x75, 0x05, 0x90, 0xe9, 0x79, + 0xc9, 0xff, 0x43, 0x51, 0x82, 0xff, 0xc3, 0xbf, 0x98, 0xfa, 0x37, 0x65, 0x0e, 0xd8, 0xf8, 0x9b, + 0xe7, 0x4d, 0x78, 0x46, 0x31, 0x01, 0x33, 0xde, 0xea, 0x9d, 0x0e, 0x9c, 0x87, 0x82, 0xb7, 0x76, + 0xde, 0xf4, 0x5b, 0x47, 0x35, 0x9d, 0xb7, 0xda, 0xc7, 0x87, 0x96, 0xdd, 0xd9, 0x27, 0xfe, 0xe7, + 0x64, 0x54, 0xef, 0x9d, 0x83, 0x6c, 0x81, 0x59, 0xc8, 0x5a, 0xfc, 0xff, 0x12, 0x90, 0x5e, 0x33, + 0x8c, 0x0e, 0x32, 0x60, 0x4a, 0x37, 0xec, 0x26, 0x51, 0x16, 0xdc, 0x6a, 0xf2, 0xdc, 0x08, 0xcb, + 0x82, 0x2e, 0x1c, 0x4e, 0x28, 0xdf, 0x3b, 0xa8, 0x0d, 0x42, 0xc9, 0x25, 0xdd, 0xb0, 0x1b, 0xb4, + 0x64, 0x83, 0x65, 0x4e, 0x3e, 0x00, 0x93, 0xfe, 0xca, 0x58, 0xa6, 0xe8, 0xd9, 0x43, 0x57, 0xe6, + 0x87, 0xb9, 0x7e, 0x50, 0x9b, 0x71, 0x27, 0x81, 0x53, 0x2c, 0xc9, 0x85, 0x2d, 0x4f, 0xed, 0xf5, + 0x2c, 0xe9, 0xfd, 0xf7, 0x5f, 0xa9, 0x25, 0x1a, 0xe7, 0x87, 0x9e, 0x00, 0xb8, 0x6f, 0x64, 0x13, + 0xf6, 0x9c, 0xad, 0x7e, 0xff, 0x59, 0x80, 0xef, 0x9e, 0x81, 0x6a, 0xe0, 0x2c, 0x00, 0xbd, 0x87, + 0x3c, 0xe4, 0x24, 0xc0, 0xe8, 0x7f, 0xf4, 0x3f, 0xe4, 0xa0, 0xc0, 0xc8, 0xc3, 0x06, 0xd2, 0x2e, + 0x1c, 0xa5, 0x47, 0x39, 0x5d, 0xb3, 0x25, 0xbe, 0x12, 0x73, 0xd4, 0x49, 0xa0, 0x25, 0xf8, 0xff, + 0x15, 0x67, 0xd9, 0xb0, 0xc7, 0x00, 0xdc, 0x9a, 0x9d, 0x0b, 0x37, 0xbc, 0xa5, 0xac, 0xf5, 0xec, + 0x1f, 0xfe, 0x53, 0x18, 0xd9, 0x43, 0x2c, 0xfd, 0x7a, 0x02, 0x8e, 0x0d, 0xd4, 0xc6, 0xb5, 0xfe, + 0x49, 0xdf, 0x85, 0xd1, 0x44, 0xbc, 0x1c, 0xbd, 0xf7, 0xcb, 0x0f, 0xf5, 0x90, 0x76, 0x55, 0xc3, + 0xda, 0xc5, 0x2a, 0xf4, 0x35, 0xec, 0x45, 0x38, 0xe2, 0x6f, 0x97, 0x10, 0xc2, 0x73, 0x50, 0xf4, + 0xaf, 0x16, 0x78, 0x28, 0xf1, 0xae, 0xc3, 0x7b, 0xc8, 0x49, 0xdf, 0x8a, 0x41, 0x7a, 0x36, 0x28, + 0x78, 0x47, 0x12, 0xef, 0x19, 0x3c, 0x7c, 0x1f, 0x29, 0x08, 0xcf, 0xdd, 0xac, 0xaf, 0x24, 0xe0, + 0xa4, 0x1f, 0xd9, 0x35, 0xc2, 0xd6, 0x5b, 0xde, 0xaf, 0x37, 0xa3, 0x1e, 0xff, 0x29, 0x01, 0xb7, + 0x8f, 0x68, 0x39, 0x17, 0x8f, 0x09, 0x33, 0x1e, 0xeb, 0x6e, 0xf2, 0x62, 0xa1, 0x32, 0xd2, 0x70, + 0x0f, 0xe4, 0x18, 0xb7, 0x5b, 0xf8, 0x51, 0xa4, 0xe9, 0xc1, 0x77, 0x96, 0x3c, 0x3d, 0x68, 0x91, + 0xdf, 0x9c, 0x6e, 0x7d, 0x3d, 0x01, 0xa7, 0xfd, 0xbd, 0x0a, 0x59, 0xd1, 0xbd, 0xb3, 0x07, 0xe6, + 0xdf, 0x24, 0xe0, 0x9e, 0x38, 0x5d, 0xe0, 0x23, 0xf4, 0x3c, 0x4c, 0xbb, 0xf1, 0x55, 0x70, 0x80, + 0x4e, 0xc5, 0x58, 0x15, 0x73, 0xa5, 0x46, 0x0e, 0xca, 0xcd, 0x19, 0x89, 0x3f, 0x4e, 0xf0, 0x39, + 0xe7, 0x1d, 0x77, 0x47, 0xec, 0xfe, 0x25, 0xc1, 0x21, 0xc5, 0xee, 0x59, 0x16, 0x4c, 0xfa, 0x96, + 0x05, 0x21, 0x03, 0x9a, 0xbc, 0x49, 0x16, 0xe4, 0x43, 0xc2, 0x9a, 0x86, 0x04, 0x67, 0xbb, 0x30, + 0x1d, 0x32, 0x49, 0x9c, 0x1b, 0xa7, 0xd1, 0x73, 0xe4, 0xe8, 0x0f, 0x0e, 0x6a, 0x21, 0x51, 0x9f, + 0x8c, 0x06, 0xa7, 0x87, 0xf4, 0x9f, 0x13, 0x50, 0xa3, 0x0d, 0x09, 0x19, 0xca, 0xbf, 0xc9, 0x02, + 0xc6, 0xdc, 0x90, 0x86, 0x76, 0x8b, 0x0b, 0x7a, 0x1e, 0x32, 0x4c, 0x4b, 0xb9, 0x6c, 0x0f, 0xa1, + 0xde, 0x9c, 0xd1, 0x35, 0xd8, 0x8b, 0xa2, 0x5f, 0xe1, 0x76, 0xe1, 0x2d, 0x92, 0xdf, 0x9b, 0xb0, + 0x0b, 0xff, 0x4a, 0x18, 0xec, 0xf0, 0x96, 0x73, 0x11, 0xbd, 0xff, 0x4d, 0x1b, 0x6c, 0xfe, 0x25, + 0xa1, 0xb7, 0xcc, 0x32, 0x3b, 0xcd, 0x8f, 0xb0, 0xcc, 0xef, 0xbc, 0x11, 0x70, 0x2c, 0x73, 0x44, + 0x17, 0xde, 0xe1, 0x96, 0xf9, 0x7a, 0x12, 0x8e, 0xd3, 0x6e, 0x78, 0x57, 0x24, 0x6f, 0x83, 0xe4, + 0x9b, 0x80, 0x2c, 0x53, 0x6d, 0xde, 0x2c, 0xfb, 0x51, 0xb6, 0x4c, 0xf5, 0x8a, 0xcf, 0xe9, 0x36, + 0x01, 0xb5, 0x2c, 0x3b, 0x58, 0x41, 0xea, 0x86, 0x2b, 0x68, 0x59, 0xf6, 0x95, 0x11, 0x5e, 0x3d, + 0x7d, 0x18, 0xdd, 0xf9, 0x83, 0x04, 0x54, 0xc3, 0x84, 0xce, 0x75, 0x45, 0x81, 0xa3, 0xbe, 0x75, + 0x74, 0x50, 0x5d, 0xee, 0x18, 0xb5, 0x9a, 0x0c, 0x4c, 0xdd, 0x23, 0x26, 0xbe, 0xd9, 0x93, 0xf7, + 0xcb, 0xc2, 0xe9, 0x38, 0x9a, 0x3f, 0xb8, 0x84, 0x79, 0x47, 0x4e, 0xd9, 0xdf, 0x1c, 0x30, 0xf7, + 0xef, 0xb4, 0xd5, 0xd0, 0x9f, 0x24, 0xe0, 0xc4, 0x90, 0x16, 0xfe, 0x4d, 0x76, 0xe7, 0x3f, 0x3b, + 0x54, 0x61, 0x6e, 0xd6, 0xd2, 0xeb, 0x41, 0x3e, 0xa1, 0xfc, 0xe7, 0xd6, 0x3c, 0x0b, 0xea, 0xd0, + 0x6f, 0xcc, 0x3d, 0x03, 0xb7, 0x84, 0x72, 0xf1, 0x36, 0x9d, 0x85, 0xf4, 0x8e, 0x66, 0xd9, 0xce, + 0x87, 0x17, 0x02, 0xcd, 0x09, 0x70, 0x51, 0x5a, 0x09, 0x41, 0x99, 0x42, 0xae, 0x19, 0x46, 0x87, + 0x57, 0x2f, 0x2d, 0xc0, 0x94, 0xa7, 0x8c, 0x83, 0xcf, 0x41, 0xba, 0x67, 0x18, 0x1d, 0x0e, 0x3e, + 0x13, 0x04, 0x27, 0xb4, 0xbc, 0x9b, 0x94, 0x4e, 0x9a, 0x01, 0xc4, 0x40, 0xd8, 0x27, 0x41, 0x38, + 0xf4, 0x87, 0x13, 0x30, 0xed, 0x2b, 0x76, 0x2e, 0x2d, 0x65, 0x7c, 0x5f, 0x93, 0x1a, 0xd8, 0xa2, + 0x67, 0xf4, 0xce, 0xf5, 0x74, 0x96, 0xdd, 0x7d, 0x13, 0xaa, 0x7b, 0xf6, 0x8f, 0x0a, 0xe2, 0x96, + 0x6b, 0x13, 0xc0, 0x93, 0x8a, 0xbd, 0x2b, 0x58, 0x73, 0x78, 0xd2, 0xa3, 0x7a, 0x77, 0x24, 0x1d, + 0x8f, 0x79, 0xc7, 0xd0, 0x4f, 0x79, 0x8f, 0x51, 0xdd, 0x39, 0x9a, 0x4f, 0xc0, 0xdf, 0x15, 0x45, + 0xe6, 0xa0, 0xff, 0x2d, 0x98, 0x09, 0x5b, 0x05, 0xa3, 0x07, 0x46, 0x23, 0x0c, 0xc6, 0x2d, 0xd5, + 0x77, 0x1d, 0x82, 0xc3, 0xa9, 0xfe, 0x93, 0x09, 0xb8, 0x6d, 0xe4, 0x62, 0x0f, 0x3d, 0x36, 0x1a, + 0x76, 0x44, 0x24, 0x55, 0xad, 0xdf, 0x08, 0xab, 0xd3, 0xb4, 0xa6, 0x6f, 0x3f, 0x3f, 0x5c, 0xa2, + 0x03, 0xeb, 0x8f, 0x21, 0x03, 0x3b, 0x18, 0x6b, 0x4a, 0x63, 0xe8, 0xa5, 0xf0, 0x7d, 0xed, 0x33, + 0xa1, 0x08, 0xc3, 0x97, 0x3c, 0xd5, 0x07, 0xe2, 0x33, 0x78, 0x87, 0x3d, 0x2c, 0x96, 0x1e, 0x32, + 0xec, 0x23, 0x16, 0x0c, 0x43, 0x86, 0x7d, 0x54, 0xa0, 0xce, 0x87, 0x7d, 0x64, 0x24, 0x39, 0x64, + 0xd8, 0xe3, 0x04, 0xd0, 0x43, 0x86, 0x3d, 0x56, 0xe0, 0x2a, 0x8d, 0xa1, 0x1d, 0x98, 0xf4, 0xc5, + 0x29, 0xe8, 0x74, 0x28, 0x5c, 0x58, 0x00, 0x59, 0xbd, 0x27, 0x0e, 0xa9, 0x77, 0xfc, 0x43, 0x5c, + 0xf3, 0x90, 0xf1, 0x1f, 0x1e, 0x7d, 0x54, 0x1f, 0x88, 0xcf, 0xe0, 0xd4, 0x7d, 0xcd, 0xd9, 0x6a, + 0xf1, 0x10, 0xa0, 0xb9, 0x98, 0x48, 0xa2, 0xe6, 0x33, 0xb1, 0xe9, 0x9d, 0x8a, 0x77, 0x07, 0x4e, + 0x5b, 0x87, 0x0b, 0x2d, 0xd4, 0xb5, 0x55, 0xef, 0x8d, 0x45, 0xeb, 0x54, 0xb6, 0xca, 0xf7, 0x11, + 0x4e, 0x86, 0xb2, 0x79, 0x9c, 0x56, 0xf5, 0xf6, 0x11, 0x14, 0x0e, 0xdc, 0xba, 0xb3, 0x31, 0x28, + 0x85, 0x93, 0x7b, 0x9d, 0x55, 0xf5, 0xd4, 0x48, 0x1a, 0x01, 0x7a, 0xd3, 0x53, 0xfd, 0x5f, 0xca, + 0x0e, 0x5c, 0xfb, 0x6b, 0x63, 0x1d, 0x5b, 0x9a, 0x75, 0xa8, 0x6b, 0x7f, 0xa3, 0xb3, 0xf9, 0x1f, + 0xca, 0x40, 0xe1, 0x02, 0x43, 0xa5, 0xdf, 0x3a, 0x46, 0x4f, 0xc4, 0xf4, 0xc0, 0x45, 0xe2, 0x81, + 0x7f, 0x70, 0x50, 0xe3, 0x82, 0x74, 0x7c, 0xb1, 0xc5, 0x3f, 0x7a, 0xc4, 0x3e, 0x58, 0xe2, 0x7e, + 0x35, 0xa6, 0x70, 0xa8, 0x23, 0xab, 0xec, 0xac, 0x00, 0x3f, 0x25, 0x1a, 0xc4, 0x93, 0xd8, 0xf7, + 0x93, 0x36, 0x48, 0x09, 0xfd, 0xe4, 0x09, 0xfa, 0x95, 0x04, 0x1c, 0xa1, 0x54, 0x6e, 0x20, 0x48, + 0x29, 0xc5, 0xc1, 0x9a, 0x81, 0x51, 0x5e, 0x51, 0x3c, 0xcb, 0x22, 0x8a, 0xd1, 0xa8, 0xf3, 0xfd, + 0xde, 0x5b, 0x3d, 0x95, 0x06, 0xe1, 0xa4, 0x1f, 0x1c, 0xd4, 0xd0, 0x20, 0xaf, 0x4c, 0x3f, 0xd0, + 0xe9, 0x2f, 0x0b, 0xff, 0x4c, 0xf5, 0x88, 0xd8, 0x70, 0x8a, 0x0b, 0xd4, 0x8d, 0x11, 0x7c, 0xe1, + 0xf9, 0x1a, 0xe4, 0x3d, 0xc6, 0xa7, 0x32, 0x3e, 0xe4, 0x58, 0x9b, 0xbb, 0xee, 0x46, 0x1c, 0xcf, + 0xe3, 0xfb, 0x64, 0x2f, 0x04, 0xfa, 0xb5, 0x04, 0x1c, 0x71, 0xd7, 0xf6, 0x5e, 0xf0, 0x4c, 0xfc, + 0xd5, 0xfd, 0x39, 0xbf, 0xd4, 0x42, 0xf1, 0x88, 0xd4, 0xc2, 0x1c, 0xa4, 0x3c, 0xd3, 0x0f, 0x73, + 0x18, 0xcf, 0xc1, 0xa4, 0x77, 0xf1, 0xe7, 0x7e, 0xbc, 0x70, 0xd4, 0x76, 0xe6, 0x0c, 0xef, 0xad, + 0xef, 0x68, 0x87, 0xec, 0x07, 0x42, 0x55, 0xc8, 0xe2, 0xbd, 0x9e, 0x61, 0xda, 0xb8, 0x45, 0xcf, + 0x22, 0x67, 0x65, 0xe7, 0x59, 0xba, 0x06, 0x21, 0x03, 0x8b, 0x9e, 0x0e, 0x7c, 0x79, 0xe9, 0x46, + 0x16, 0x15, 0x83, 0x1f, 0x6b, 0xf2, 0x7e, 0x45, 0xe9, 0x66, 0x9b, 0x8d, 0xff, 0x1f, 0x00, 0x00, + 0xff, 0xff, 0x4c, 0x9f, 0xbf, 0xb3, 0xdf, 0x9b, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) From d145ca1901497f2e4e90ad0f178e5860d6a4a370 Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Mon, 17 Aug 2020 11:52:24 -0400 Subject: [PATCH 005/128] Update Account --- go.sum | 10 --- proto/cosmos/auth/v1beta1/auth.proto | 4 - x/auth/types/account.go | 43 +++++++--- x/auth/types/auth.pb.go | 121 ++++++++++++++------------- 4 files changed, 98 insertions(+), 80 deletions(-) diff --git a/go.sum b/go.sum index 95c4fc39b085..8b0b98c6b6da 100644 --- a/go.sum +++ b/go.sum @@ -179,8 +179,6 @@ github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4er github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -237,8 +235,6 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.14.6 h1:8ERzHx8aj1Sc47mu9n/AksaKCSWrMchFtkdrS4BIj5o= -github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= github.com/grpc-ecosystem/grpc-gateway v1.14.7 h1:Nk5kuHrnWUTf/0GL1a/vchH/om9Ap2/HnVna+jYZgTY= github.com/grpc-ecosystem/grpc-gateway v1.14.7/go.mod h1:oYZKL012gGh6LMyg/xA7Q2yq6j8bu0wa+9w14EEthWU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= @@ -432,8 +428,6 @@ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt2 github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.11.1 h1:0ZISXCMRuCZcxF77aT1BXY5m74mX2vrGYl1dSwBI0Jo= -github.com/prometheus/common v0.11.1/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.12.0 h1:mj4ewtVukAfkS37JU7IXPJPr7zwLEjwgWO6nZo8ROvk= github.com/prometheus/common v0.12.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -661,7 +655,6 @@ golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 h1:ogLJMz+qpzav7lGMh10LMvAkM golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= @@ -736,7 +729,6 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0 h1:T7P4R73V3SSDPhH7WW7ATbfViLtmamH0DKrP3f9AuDI= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= @@ -785,7 +777,5 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= 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= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/proto/cosmos/auth/v1beta1/auth.proto b/proto/cosmos/auth/v1beta1/auth.proto index 41fddbe532a4..ef4af52d2539 100644 --- a/proto/cosmos/auth/v1beta1/auth.proto +++ b/proto/cosmos/auth/v1beta1/auth.proto @@ -13,10 +13,6 @@ option go_package = "github.com/cosmos/cosmos-sdk/x/auth/types"; message BaseAccount { option (gogoproto.goproto_getters) = false; option (gogoproto.goproto_stringer) = false; - // NOTE: this disables the generation of the BaseAccount struct and uses a hand-written struct - // so that we can deal with PublicKey encoding. This should likely be replaced with something - // less hacky in the future. - option (gogoproto.typedecl) = false; option (cosmos_proto.implements_interface) = "AccountI"; bytes address = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress"]; diff --git a/x/auth/types/account.go b/x/auth/types/account.go index 55072f573a6b..79c3fc28692d 100644 --- a/x/auth/types/account.go +++ b/x/auth/types/account.go @@ -1,16 +1,22 @@ package types import ( + "bytes" "encoding/json" "errors" "fmt" "strings" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/gogo/protobuf/proto" "github.com/tendermint/tendermint/crypto" yaml "gopkg.in/yaml.v2" + "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -27,7 +33,11 @@ func NewBaseAccount(address sdk.AccAddress, pubKey crypto.PubKey, accountNumber, Address: address, AccountNumber: accountNumber, Sequence: sequence, - decodedPubKey: pubKey, + } + + err := acc.SetPubKey(pubKey) + if err != nil { + panic(err) } return acc @@ -62,12 +72,27 @@ func (acc *BaseAccount) SetAddress(addr sdk.AccAddress) error { // GetPubKey - Implements sdk.AccountI. func (acc BaseAccount) GetPubKey() (pk crypto.PubKey) { - panic("TODO") + content, ok := acc.PubKey.GetCachedValue().(crypto.PubKey) + if !ok { + return nil + } + return content } // SetPubKey - Implements sdk.AccountI. func (acc *BaseAccount) SetPubKey(pubKey crypto.PubKey) error { - panic("TODO") + protoMsg, ok := pubKey.(proto.Message) + if !ok { + return sdkerrors.ErrInvalidPubKey + } + + any, err := codectypes.NewAnyWithValue(protoMsg) + if err != nil { + return nil + } + + acc.PubKey = any + return nil } @@ -95,6 +120,11 @@ func (acc *BaseAccount) SetSequence(seq uint64) error { // Validate checks for errors on the account fields func (acc BaseAccount) Validate() error { + if acc.PubKey != nil && acc.Address != nil && + !bytes.Equal(acc.GetPubKey().Address().Bytes(), acc.Address.Bytes()) { + return errors.New("account address and pubkey address do not match") + } + return nil } @@ -103,13 +133,6 @@ func (acc BaseAccount) String() string { return out.(string) } -type baseAccountPretty struct { - Address sdk.AccAddress `json:"address" yaml:"address"` - PubKey string `json:"public_key" yaml:"public_key"` - AccountNumber uint64 `json:"account_number" yaml:"account_number"` - Sequence uint64 `json:"sequence" yaml:"sequence"` -} - // MarshalYAML returns the YAML representation of an account. func (acc BaseAccount) MarshalYAML() (interface{}, error) { bz, err := codec.MarshalYAML(codec.NewProtoCodec(codectypes.NewInterfaceRegistry()), acc) diff --git a/x/auth/types/auth.pb.go b/x/auth/types/auth.pb.go index f216413a43b8..ac56b5a2ed94 100644 --- a/x/auth/types/auth.pb.go +++ b/x/auth/types/auth.pb.go @@ -5,6 +5,7 @@ package types import ( fmt "fmt" + types "github.com/cosmos/cosmos-sdk/codec/types" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" @@ -30,7 +31,7 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // type for additional functionality (e.g. vesting). type BaseAccount struct { Address github_com_cosmos_cosmos_sdk_types.AccAddress `protobuf:"bytes,1,opt,name=address,proto3,casttype=github.com/cosmos/cosmos-sdk/types.AccAddress" json:"address,omitempty"` - PubKey []byte `protobuf:"bytes,2,opt,name=pub_key,json=pubKey,proto3" json:"public_key,omitempty" yaml:"public_key"` + PubKey *types.Any `protobuf:"bytes,2,opt,name=pub_key,json=pubKey,proto3" json:"public_key,omitempty" yaml:"public_key"` AccountNumber uint64 `protobuf:"varint,3,opt,name=account_number,json=accountNumber,proto3" json:"account_number,omitempty" yaml:"account_number"` Sequence uint64 `protobuf:"varint,4,opt,name=sequence,proto3" json:"sequence,omitempty"` } @@ -191,49 +192,50 @@ func init() { func init() { proto.RegisterFile("cosmos/auth/v1beta1/auth.proto", fileDescriptor_7e1f7e915d020d2d) } var fileDescriptor_7e1f7e915d020d2d = []byte{ - // 657 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0xbf, 0x6f, 0xd3, 0x40, - 0x14, 0x8e, 0x9b, 0xd0, 0x1f, 0x97, 0xb6, 0x52, 0xdd, 0xb4, 0x4d, 0x03, 0xf2, 0x59, 0x9e, 0x8a, - 0x44, 0x12, 0xa5, 0xa8, 0x48, 0xcd, 0x80, 0xa8, 0x0b, 0x48, 0x55, 0x69, 0x55, 0xb9, 0x12, 0x03, - 0x8b, 0x39, 0x3b, 0x47, 0x6a, 0x35, 0x97, 0x73, 0x7d, 0xe7, 0x2a, 0xee, 0x5f, 0xc0, 0xc8, 0x84, - 0x18, 0xfb, 0x47, 0xf0, 0x1f, 0xb0, 0x30, 0x56, 0x4c, 0x4c, 0x06, 0xa5, 0x0b, 0x62, 0xf4, 0xc8, - 0x84, 0x7c, 0xe7, 0xa6, 0x4e, 0x15, 0x98, 0x7c, 0xef, 0x7b, 0xdf, 0xf7, 0xbd, 0xe7, 0xf7, 0x74, - 0x07, 0x34, 0x97, 0x32, 0x42, 0x59, 0x13, 0x85, 0xfc, 0xa4, 0x79, 0xde, 0x72, 0x30, 0x47, 0x2d, - 0x11, 0x34, 0xfc, 0x80, 0x72, 0xaa, 0x2e, 0xcb, 0x7c, 0x43, 0x40, 0x59, 0xbe, 0xb6, 0x2e, 0x41, - 0x5b, 0x50, 0x9a, 0x19, 0x43, 0x04, 0xb5, 0x4a, 0x97, 0x76, 0xa9, 0xc4, 0xd3, 0x93, 0x44, 0x8d, - 0x8f, 0x53, 0xa0, 0x6c, 0x22, 0x86, 0x77, 0x5c, 0x97, 0x86, 0x7d, 0xae, 0xee, 0x83, 0x19, 0xd4, - 0xe9, 0x04, 0x98, 0xb1, 0xaa, 0xa2, 0x2b, 0x1b, 0xf3, 0x66, 0xeb, 0x4f, 0x0c, 0xeb, 0x5d, 0x8f, - 0x9f, 0x84, 0x4e, 0xc3, 0xa5, 0x24, 0xf3, 0xcc, 0x3e, 0x75, 0xd6, 0x39, 0x6d, 0xf2, 0xc8, 0xc7, - 0xac, 0xb1, 0xe3, 0xba, 0x3b, 0x52, 0x68, 0xdd, 0x38, 0xa8, 0x2f, 0xc1, 0x8c, 0x1f, 0x3a, 0xf6, - 0x29, 0x8e, 0xaa, 0x53, 0xc2, 0xac, 0xfe, 0x3b, 0x86, 0x15, 0x3f, 0x74, 0x7a, 0x9e, 0x9b, 0xa2, - 0x8f, 0x28, 0xf1, 0x38, 0x26, 0x3e, 0x8f, 0x92, 0x18, 0x2e, 0x45, 0x88, 0xf4, 0xda, 0xc6, 0x6d, - 0xd6, 0xb0, 0xa6, 0xfd, 0xd0, 0xd9, 0xc7, 0x91, 0xfa, 0x0c, 0x2c, 0x22, 0xd9, 0x9f, 0xdd, 0x0f, - 0x89, 0x83, 0x83, 0x6a, 0x51, 0x57, 0x36, 0x4a, 0xe6, 0x7a, 0x12, 0xc3, 0x15, 0x29, 0x1b, 0xcf, - 0x1b, 0xd6, 0x42, 0x06, 0x1c, 0x8a, 0x58, 0xad, 0x81, 0x59, 0x86, 0xcf, 0x42, 0xdc, 0x77, 0x71, - 0xb5, 0x94, 0x6a, 0xad, 0x51, 0xdc, 0xae, 0xbc, 0xbf, 0x84, 0x85, 0x4f, 0x97, 0xb0, 0xf0, 0xed, - 0x73, 0x7d, 0x36, 0x9b, 0xc3, 0x9e, 0xf1, 0x45, 0x01, 0x0b, 0x07, 0xb4, 0x13, 0xf6, 0x46, 0xa3, - 0x79, 0x0b, 0xe6, 0x1d, 0xc4, 0xb0, 0x9d, 0x39, 0x8b, 0xf9, 0x94, 0x37, 0xf5, 0xc6, 0x84, 0x3d, - 0x34, 0x72, 0x23, 0x35, 0xef, 0x5f, 0xc5, 0x50, 0x49, 0x62, 0xb8, 0x2c, 0x3b, 0xcd, 0x7b, 0x18, - 0x56, 0xd9, 0xc9, 0x0d, 0x5f, 0x05, 0xa5, 0x3e, 0x22, 0x58, 0x0c, 0x6b, 0xce, 0x12, 0x67, 0x55, - 0x07, 0x65, 0x1f, 0x07, 0xc4, 0x63, 0xcc, 0xa3, 0x7d, 0x56, 0x2d, 0xea, 0xc5, 0x8d, 0x39, 0x2b, - 0x0f, 0xb5, 0x6b, 0xb9, 0xfe, 0x17, 0xc7, 0x5a, 0xde, 0x33, 0x7e, 0x14, 0xc1, 0xf4, 0x11, 0x0a, - 0x10, 0x61, 0xea, 0x21, 0x58, 0x26, 0x68, 0x60, 0x13, 0x4c, 0xa8, 0xed, 0x9e, 0xa0, 0x00, 0xb9, - 0x1c, 0x07, 0x72, 0xcb, 0x25, 0x53, 0x4b, 0x62, 0x58, 0x93, 0xfd, 0x4d, 0x20, 0x19, 0xd6, 0x12, - 0x41, 0x83, 0x03, 0x4c, 0xe8, 0xee, 0x08, 0x53, 0xb7, 0xc1, 0x3c, 0x1f, 0xd8, 0xcc, 0xeb, 0xda, - 0x3d, 0x8f, 0x78, 0x5c, 0x34, 0x5d, 0x32, 0xd7, 0x6e, 0x7f, 0x34, 0x9f, 0x35, 0x2c, 0xc0, 0x07, - 0xc7, 0x5e, 0xf7, 0x55, 0x1a, 0xa8, 0x16, 0x58, 0x11, 0xc9, 0x0b, 0x6c, 0xbb, 0x94, 0x71, 0xdb, - 0xc7, 0x81, 0xed, 0x44, 0x1c, 0x67, 0x6b, 0xd5, 0x93, 0x18, 0x3e, 0xc8, 0x79, 0xdc, 0xa5, 0x19, - 0xd6, 0x52, 0x6a, 0x76, 0x81, 0x77, 0x29, 0xe3, 0x47, 0x38, 0x30, 0x23, 0x8e, 0xd5, 0x33, 0xb0, - 0x96, 0x56, 0x3b, 0xc7, 0x81, 0xf7, 0x2e, 0x92, 0x7c, 0xdc, 0xd9, 0xdc, 0xda, 0x6a, 0x6d, 0xcb, - 0x85, 0x9b, 0xed, 0x61, 0x0c, 0x2b, 0xc7, 0x5e, 0xf7, 0xb5, 0x60, 0xa4, 0xd2, 0x17, 0xcf, 0x45, - 0x3e, 0x89, 0xa1, 0x26, 0xab, 0xfd, 0xc3, 0xc0, 0xb0, 0x2a, 0x6c, 0x4c, 0x27, 0x61, 0x35, 0x02, - 0xeb, 0x77, 0x15, 0x0c, 0xbb, 0xfe, 0xe6, 0xd6, 0x93, 0xd3, 0x56, 0xf5, 0x9e, 0x28, 0xfa, 0x74, - 0x18, 0xc3, 0xd5, 0xb1, 0xa2, 0xc7, 0x37, 0x8c, 0x24, 0x86, 0xfa, 0xe4, 0xb2, 0x23, 0x13, 0xc3, - 0x5a, 0x65, 0x13, 0xb5, 0xed, 0xd9, 0x74, 0xdf, 0xbf, 0x2e, 0xa1, 0x62, 0xee, 0x7e, 0x1d, 0x6a, - 0xca, 0xd5, 0x50, 0x53, 0x7e, 0x0e, 0x35, 0xe5, 0xc3, 0xb5, 0x56, 0xb8, 0xba, 0xd6, 0x0a, 0xdf, - 0xaf, 0xb5, 0xc2, 0x9b, 0x87, 0xff, 0xbd, 0xb5, 0x03, 0xf9, 0xb0, 0x88, 0xcb, 0xeb, 0x4c, 0x8b, - 0xc7, 0xe0, 0xf1, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x11, 0x68, 0xfa, 0x1e, 0x74, 0x04, 0x00, - 0x00, + // 687 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0x3f, 0x6f, 0xd3, 0x5e, + 0x14, 0x8d, 0x9b, 0xfc, 0xfa, 0xe7, 0xa5, 0xad, 0x54, 0x37, 0x6d, 0x93, 0xfc, 0x90, 0x6d, 0x79, + 0x0a, 0x12, 0x71, 0x94, 0xa0, 0x22, 0x35, 0x03, 0x22, 0x2e, 0x0c, 0x55, 0x69, 0x55, 0xb9, 0x12, + 0x03, 0x42, 0x32, 0xcf, 0xce, 0xab, 0x6b, 0x35, 0x2f, 0xcf, 0xf5, 0x7b, 0xae, 0xe2, 0x7e, 0x02, + 0x46, 0x46, 0xc6, 0x7e, 0x00, 0x46, 0xbe, 0x01, 0x0b, 0x63, 0xc5, 0xc4, 0x64, 0x50, 0xba, 0x20, + 0xc6, 0x8c, 0x4c, 0xc8, 0xef, 0xb9, 0x69, 0x52, 0x05, 0xa6, 0xbc, 0x7b, 0xce, 0xb9, 0xf7, 0x9e, + 0xdc, 0xab, 0x6b, 0xa0, 0xb8, 0x84, 0x62, 0x42, 0x1b, 0x30, 0x62, 0xa7, 0x8d, 0x8b, 0xa6, 0x83, + 0x18, 0x6c, 0xf2, 0xc0, 0x08, 0x42, 0xc2, 0x88, 0xbc, 0x2e, 0x78, 0x83, 0x43, 0x19, 0x5f, 0xad, + 0x08, 0xd0, 0xe6, 0x92, 0x46, 0xa6, 0xe0, 0x41, 0xb5, 0xe4, 0x11, 0x8f, 0x08, 0x3c, 0x7d, 0x65, + 0x68, 0xc5, 0x23, 0xc4, 0xeb, 0xa1, 0x06, 0x8f, 0x9c, 0xe8, 0xa4, 0x01, 0xfb, 0xb1, 0xa0, 0xf4, + 0x8f, 0x73, 0xa0, 0x68, 0x42, 0x8a, 0x3a, 0xae, 0x4b, 0xa2, 0x3e, 0x93, 0xf7, 0xc1, 0x02, 0xec, + 0x76, 0x43, 0x44, 0x69, 0x59, 0xd2, 0xa4, 0xda, 0xb2, 0xd9, 0xfc, 0x9d, 0xa8, 0x75, 0xcf, 0x67, + 0xa7, 0x91, 0x63, 0xb8, 0x04, 0x67, 0xed, 0xb2, 0x9f, 0x3a, 0xed, 0x9e, 0x35, 0x58, 0x1c, 0x20, + 0x6a, 0x74, 0x5c, 0xb7, 0x23, 0x12, 0xad, 0xdb, 0x0a, 0xf2, 0x1b, 0xb0, 0x10, 0x44, 0x8e, 0x7d, + 0x86, 0xe2, 0xf2, 0x9c, 0x26, 0xd5, 0x8a, 0xad, 0x92, 0x21, 0x9c, 0x18, 0xb7, 0x4e, 0x8c, 0x4e, + 0x3f, 0x36, 0xeb, 0xbf, 0x12, 0xb5, 0x14, 0x44, 0x4e, 0xcf, 0x77, 0x53, 0xed, 0x23, 0x82, 0x7d, + 0x86, 0x70, 0xc0, 0xe2, 0x51, 0xa2, 0xae, 0xc5, 0x10, 0xf7, 0xda, 0xfa, 0x1d, 0xab, 0x5b, 0xf3, + 0x41, 0xe4, 0xec, 0xa3, 0x58, 0x7e, 0x06, 0x56, 0xa1, 0x70, 0x6d, 0xf7, 0x23, 0xec, 0xa0, 0xb0, + 0x9c, 0xd7, 0xa4, 0x5a, 0xc1, 0xac, 0x8c, 0x12, 0x75, 0x43, 0xa4, 0x4d, 0xf3, 0xba, 0xb5, 0x92, + 0x01, 0x87, 0x3c, 0x96, 0xab, 0x60, 0x91, 0xa2, 0xf3, 0x08, 0xf5, 0x5d, 0x54, 0x2e, 0xa4, 0xb9, + 0xd6, 0x38, 0x6e, 0x97, 0xde, 0x5d, 0xa9, 0xb9, 0x0f, 0x57, 0x6a, 0xee, 0xeb, 0xa7, 0xfa, 0x62, + 0x36, 0x9d, 0x3d, 0xfd, 0xb3, 0x04, 0x56, 0x0e, 0x48, 0x37, 0xea, 0x8d, 0x07, 0xf6, 0x16, 0x2c, + 0x3b, 0x90, 0x22, 0x3b, 0xab, 0xcc, 0xa7, 0x56, 0x6c, 0x69, 0xc6, 0x8c, 0xc5, 0x19, 0x13, 0x83, + 0x36, 0xff, 0xbf, 0x4e, 0x54, 0x69, 0x94, 0xa8, 0xeb, 0xc2, 0xe9, 0x64, 0x0d, 0xdd, 0x2a, 0x3a, + 0x13, 0x2b, 0x91, 0x41, 0xa1, 0x0f, 0x31, 0xe2, 0x23, 0x5c, 0xb2, 0xf8, 0x5b, 0xd6, 0x40, 0x31, + 0x40, 0x21, 0xf6, 0x29, 0xf5, 0x49, 0x9f, 0x96, 0xf3, 0x5a, 0xbe, 0xb6, 0x64, 0x4d, 0x42, 0xed, + 0xea, 0x84, 0xff, 0xd5, 0x29, 0xcb, 0x7b, 0xfa, 0xf7, 0x3c, 0x98, 0x3f, 0x82, 0x21, 0xc4, 0x54, + 0x3e, 0x04, 0xeb, 0x18, 0x0e, 0x6c, 0x8c, 0x30, 0xb1, 0xdd, 0x53, 0x18, 0x42, 0x97, 0xa1, 0x50, + 0xec, 0xbe, 0x60, 0x2a, 0xa3, 0x44, 0xad, 0x0a, 0x7f, 0x33, 0x44, 0xba, 0xb5, 0x86, 0xe1, 0xe0, + 0x00, 0x61, 0xb2, 0x3b, 0xc6, 0xe4, 0x1d, 0xb0, 0xcc, 0x06, 0x36, 0xf5, 0x3d, 0xbb, 0xe7, 0x63, + 0x9f, 0x71, 0xd3, 0x05, 0x73, 0xeb, 0xee, 0x8f, 0x4e, 0xb2, 0xba, 0x05, 0xd8, 0xe0, 0xd8, 0xf7, + 0x5e, 0xa6, 0x81, 0x6c, 0x81, 0x0d, 0x4e, 0x5e, 0x22, 0xdb, 0x25, 0x94, 0xd9, 0x01, 0x0a, 0x6d, + 0x27, 0x66, 0x28, 0x5b, 0xab, 0x36, 0x4a, 0xd4, 0x07, 0x13, 0x35, 0xee, 0xcb, 0x74, 0x6b, 0x2d, + 0x2d, 0x76, 0x89, 0x76, 0x09, 0x65, 0x47, 0x28, 0x34, 0x63, 0x86, 0xe4, 0x73, 0xb0, 0x95, 0x76, + 0xbb, 0x40, 0xa1, 0x7f, 0x12, 0x0b, 0x3d, 0xea, 0xb6, 0xb6, 0xb7, 0x9b, 0x3b, 0x62, 0xe1, 0x66, + 0x7b, 0x98, 0xa8, 0xa5, 0x63, 0xdf, 0x7b, 0xc5, 0x15, 0x69, 0xea, 0x8b, 0xe7, 0x9c, 0x1f, 0x25, + 0xaa, 0x22, 0xba, 0xfd, 0xa5, 0x80, 0x6e, 0x95, 0xe8, 0x54, 0x9e, 0x80, 0xe5, 0x18, 0x54, 0xee, + 0x67, 0x50, 0xe4, 0x06, 0xad, 0xed, 0x27, 0x67, 0xcd, 0xf2, 0x7f, 0xbc, 0xe9, 0xd3, 0x61, 0xa2, + 0x6e, 0x4e, 0x35, 0x3d, 0xbe, 0x55, 0x8c, 0x12, 0x55, 0x9b, 0xdd, 0x76, 0x5c, 0x44, 0xb7, 0x36, + 0xe9, 0xcc, 0xdc, 0xf6, 0x62, 0xba, 0xef, 0x9f, 0x57, 0xaa, 0x64, 0xee, 0x7e, 0x19, 0x2a, 0xd2, + 0xf5, 0x50, 0x91, 0x7e, 0x0c, 0x15, 0xe9, 0xfd, 0x8d, 0x92, 0xbb, 0xbe, 0x51, 0x72, 0xdf, 0x6e, + 0x94, 0xdc, 0xeb, 0x87, 0xff, 0xbc, 0xe5, 0x81, 0xf8, 0x12, 0xf1, 0x93, 0x76, 0xe6, 0xf9, 0x95, + 0x3e, 0xfe, 0x13, 0x00, 0x00, 0xff, 0xff, 0x5d, 0x49, 0xdd, 0xa9, 0xa5, 0x04, 0x00, 0x00, } func (this *Params) Equal(that interface{}) bool { @@ -302,10 +304,15 @@ func (m *BaseAccount) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x18 } - if len(m.PubKey) > 0 { - i -= len(m.PubKey) - copy(dAtA[i:], m.PubKey) - i = encodeVarintAuth(dAtA, i, uint64(len(m.PubKey))) + if m.PubKey != nil { + { + size, err := m.PubKey.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintAuth(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0x12 } @@ -439,8 +446,8 @@ func (m *BaseAccount) Size() (n int) { if l > 0 { n += 1 + l + sovAuth(uint64(l)) } - l = len(m.PubKey) - if l > 0 { + if m.PubKey != nil { + l = m.PubKey.Size() n += 1 + l + sovAuth(uint64(l)) } if m.AccountNumber != 0 { @@ -572,7 +579,7 @@ func (m *BaseAccount) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field PubKey", wireType) } - var byteLen int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAuth @@ -582,24 +589,26 @@ func (m *BaseAccount) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + if msglen < 0 { return ErrInvalidLengthAuth } - postIndex := iNdEx + byteLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthAuth } if postIndex > l { return io.ErrUnexpectedEOF } - m.PubKey = append(m.PubKey[:0], dAtA[iNdEx:postIndex]...) if m.PubKey == nil { - m.PubKey = []byte{} + m.PubKey = &types.Any{} + } + if err := m.PubKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } iNdEx = postIndex case 3: From a6c6d5c5604ebff35ee0600a27a99119bd6de0bf Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Mon, 17 Aug 2020 11:54:27 -0400 Subject: [PATCH 006/128] Docs --- codec/yaml.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/codec/yaml.go b/codec/yaml.go index 9ddec8d3080f..20a9564ba48f 100644 --- a/codec/yaml.go +++ b/codec/yaml.go @@ -6,6 +6,8 @@ import ( "gopkg.in/yaml.v2" ) +// MarshalYAML marshals the provided toPrint content with the provided JSON marshaler +// by encoding JSON, decoding JSON, and then encoding YAML. func MarshalYAML(jsonMarshaler JSONMarshaler, toPrint interface{}) ([]byte, error) { bz, err := jsonMarshaler.MarshalJSON(toPrint) if err != nil { From 3a7dbd29f92c1ed688a73d0411b8ba27e3deff5e Mon Sep 17 00:00:00 2001 From: Aaron Craelius Date: Wed, 19 Aug 2020 15:19:49 -0400 Subject: [PATCH 007/128] WIP on protobuf keys --- crypto/keys/keys.go | 91 ++ crypto/keys/keys.pb.go | 1658 ++++++++++++++++++++++ crypto/types.go | 9 + go.sum | 12 - proto/cosmos/keys/keys.proto | 44 + x/auth/types/query.pb.gw.go | 88 -- x/bank/types/query.pb.gw.go | 229 --- x/distribution/types/query.pb.gw.go | 417 ------ x/evidence/types/query.pb.gw.go | 95 -- x/gov/types/query.pb.gw.go | 413 ------ x/ibc-transfer/types/query.pb.gw.go | 124 -- x/ibc/03-connection/types/query.pb.gw.go | 243 ---- x/ibc/04-channel/types/query.pb.gw.go | 690 +-------- x/mint/types/query.pb.gw.go | 99 -- x/params/types/proposal/query.pb.gw.go | 48 - x/slashing/types/query.pb.gw.go | 124 -- x/staking/types/query.pb.gw.go | 780 +--------- x/staking/types/staking.pb.go | 1122 +++++++-------- x/upgrade/types/query.pb.gw.go | 88 -- 19 files changed, 2436 insertions(+), 3938 deletions(-) create mode 100644 crypto/keys/keys.go create mode 100644 crypto/keys/keys.pb.go create mode 100644 crypto/types.go create mode 100644 proto/cosmos/keys/keys.proto diff --git a/crypto/keys/keys.go b/crypto/keys/keys.go new file mode 100644 index 000000000000..e94cc04d5f2c --- /dev/null +++ b/crypto/keys/keys.go @@ -0,0 +1,91 @@ +package keys + +import ( + "github.com/cosmos/cosmos-sdk/crypto" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" +) + +var ( + _, _, _ crypto.PubKey = &Secp256K1PubKey{}, &Ed25519PubKey{}, &Sr25519PubKey{} + _, _, _ crypto.PrivKey = &Secp256K1PrivKey{}, &Ed25519PrivKey{}, &Sr25519PrivKey{} +) + +func (m *Secp256K1PubKey) Address() crypto.Address { + return m.Key.Address() +} + +func (m *Secp256K1PubKey) Bytes() []byte { + return m.Key.Bytes() +} + +func (m *Secp256K1PubKey) VerifySignature(msg []byte, sig []byte) bool { + return m.Key.VerifySignature(msg, sig) +} + +func (m *Secp256K1PubKey) Equals(key crypto.PubKey) bool { + return m.Key.Equals(key) +} + +func (m *Secp256K1PubKey) Type() string { + return m.Key.Type() +} + +func (m *Ed25519PubKey) Address() crypto.Address { + return m.Key.Address() +} + +func (m *Ed25519PubKey) Bytes() []byte { + return m.Key.Bytes() +} + +func (m *Ed25519PubKey) VerifySignature(msg []byte, sig []byte) bool { + return m.Key.VerifySignature(msg, sig) +} + +func (m *Ed25519PubKey) Equals(key crypto.PubKey) bool { + return m.Key.Equals(key) +} + +func (m *Ed25519PubKey) Type() string { + return m.Key.Type() +} + +func (m *Sr25519PubKey) Address() crypto.Address { + return m.Key.Address() +} + +func (m *Sr25519PubKey) Bytes() []byte { + return m.Key.Bytes() +} + +func (m *Sr25519PubKey) VerifySignature(msg []byte, sig []byte) bool { + return m.Key.VerifySignature(msg, sig) +} + +func (m *Sr25519PubKey) Equals(key crypto.PubKey) bool { + return m.Key.Equals(key) +} + +func (m *Sr25519PubKey) Type() string { + return m.Key.Type() +} + +func (m *Secp256K1PrivKey) Bytes() []byte { + return m.Bytes() +} + +func (m *Secp256K1PrivKey) Sign(msg []byte) ([]byte, error) { + return m.Sign(msg) +} + +func (m *Secp256K1PrivKey) PubKey() crypto.PubKey { + return &Secp256K1PubKey{Key: m.PubKey().(secp256k1.PubKey)} +} + +func (m *Secp256K1PrivKey) Equals(key crypto.PrivKey) bool { + return m.Key.Equals(key) +} + +func (m *Secp256K1PrivKey) Type() string { + return m.Key.Type() +} diff --git a/crypto/keys/keys.pb.go b/crypto/keys/keys.pb.go new file mode 100644 index 000000000000..06ce6a8a91c2 --- /dev/null +++ b/crypto/keys/keys.pb.go @@ -0,0 +1,1658 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: cosmos/keys/keys.proto + +package keys + +import ( + fmt "fmt" + io "io" + math "math" + math_bits "math/bits" + + types "github.com/cosmos/cosmos-sdk/codec/types" + github_com_cosmos_cosmos_sdk_crypto_keys_ed25519 "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + github_com_cosmos_cosmos_sdk_crypto_keys_secp256k1 "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + github_com_cosmos_cosmos_sdk_crypto_keys_sr25519 "github.com/cosmos/cosmos-sdk/crypto/keys/sr25519" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// MultisigThresholdPubKey specifies a public key type which nests multiple public +// keys and a threshold +type MultisigThresholdPubKey struct { + K uint32 `protobuf:"varint,1,opt,name=threshold,proto3" json:"threshold,omitempty" yaml:"threshold"` + PubKeys []*types.Any `protobuf:"bytes,2,rep,name=public_keys,json=publicKeys,proto3" json:"public_keys,omitempty" yaml:"pubkeys"` +} + +func (m *MultisigThresholdPubKey) Reset() { *m = MultisigThresholdPubKey{} } +func (m *MultisigThresholdPubKey) String() string { return proto.CompactTextString(m) } +func (*MultisigThresholdPubKey) ProtoMessage() {} +func (*MultisigThresholdPubKey) Descriptor() ([]byte, []int) { + return fileDescriptor_9a7b75e504952b64, []int{0} +} +func (m *MultisigThresholdPubKey) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MultisigThresholdPubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MultisigThresholdPubKey.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MultisigThresholdPubKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_MultisigThresholdPubKey.Merge(m, src) +} +func (m *MultisigThresholdPubKey) XXX_Size() int { + return m.Size() +} +func (m *MultisigThresholdPubKey) XXX_DiscardUnknown() { + xxx_messageInfo_MultisigThresholdPubKey.DiscardUnknown(m) +} + +var xxx_messageInfo_MultisigThresholdPubKey proto.InternalMessageInfo + +func (m *MultisigThresholdPubKey) GetK() uint32 { + if m != nil { + return m.K + } + return 0 +} + +func (m *MultisigThresholdPubKey) GetPubKeys() []*types.Any { + if m != nil { + return m.PubKeys + } + return nil +} + +// LegacyAminoMultisigThresholdPubKey is a version of MultisigThresholdPubKey which uses legacy amino address rules +type LegacyAminoMultisigThresholdPubKey struct { + K uint32 `protobuf:"varint,1,opt,name=threshold,proto3" json:"threshold,omitempty" yaml:"threshold"` + PubKeys []*types.Any `protobuf:"bytes,2,rep,name=public_keys,json=publicKeys,proto3" json:"public_keys,omitempty" yaml:"pubkeys"` +} + +func (m *LegacyAminoMultisigThresholdPubKey) Reset() { *m = LegacyAminoMultisigThresholdPubKey{} } +func (m *LegacyAminoMultisigThresholdPubKey) String() string { return proto.CompactTextString(m) } +func (*LegacyAminoMultisigThresholdPubKey) ProtoMessage() {} +func (*LegacyAminoMultisigThresholdPubKey) Descriptor() ([]byte, []int) { + return fileDescriptor_9a7b75e504952b64, []int{1} +} +func (m *LegacyAminoMultisigThresholdPubKey) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *LegacyAminoMultisigThresholdPubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_LegacyAminoMultisigThresholdPubKey.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *LegacyAminoMultisigThresholdPubKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_LegacyAminoMultisigThresholdPubKey.Merge(m, src) +} +func (m *LegacyAminoMultisigThresholdPubKey) XXX_Size() int { + return m.Size() +} +func (m *LegacyAminoMultisigThresholdPubKey) XXX_DiscardUnknown() { + xxx_messageInfo_LegacyAminoMultisigThresholdPubKey.DiscardUnknown(m) +} + +var xxx_messageInfo_LegacyAminoMultisigThresholdPubKey proto.InternalMessageInfo + +func (m *LegacyAminoMultisigThresholdPubKey) GetK() uint32 { + if m != nil { + return m.K + } + return 0 +} + +func (m *LegacyAminoMultisigThresholdPubKey) GetPubKeys() []*types.Any { + if m != nil { + return m.PubKeys + } + return nil +} + +type Secp256K1PubKey struct { + Key github_com_cosmos_cosmos_sdk_crypto_keys_secp256k1.PubKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1.PubKey" json:"key,omitempty"` +} + +func (m *Secp256K1PubKey) Reset() { *m = Secp256K1PubKey{} } +func (m *Secp256K1PubKey) String() string { return proto.CompactTextString(m) } +func (*Secp256K1PubKey) ProtoMessage() {} +func (*Secp256K1PubKey) Descriptor() ([]byte, []int) { + return fileDescriptor_9a7b75e504952b64, []int{2} +} +func (m *Secp256K1PubKey) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Secp256K1PubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Secp256K1PubKey.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Secp256K1PubKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_Secp256K1PubKey.Merge(m, src) +} +func (m *Secp256K1PubKey) XXX_Size() int { + return m.Size() +} +func (m *Secp256K1PubKey) XXX_DiscardUnknown() { + xxx_messageInfo_Secp256K1PubKey.DiscardUnknown(m) +} + +var xxx_messageInfo_Secp256K1PubKey proto.InternalMessageInfo + +func (m *Secp256K1PubKey) GetKey() github_com_cosmos_cosmos_sdk_crypto_keys_secp256k1.PubKey { + if m != nil { + return m.Key + } + return nil +} + +type Secp256K1PrivKey struct { + Key github_com_cosmos_cosmos_sdk_crypto_keys_secp256k1.PrivKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1.PrivKey" json:"key,omitempty"` +} + +func (m *Secp256K1PrivKey) Reset() { *m = Secp256K1PrivKey{} } +func (m *Secp256K1PrivKey) String() string { return proto.CompactTextString(m) } +func (*Secp256K1PrivKey) ProtoMessage() {} +func (*Secp256K1PrivKey) Descriptor() ([]byte, []int) { + return fileDescriptor_9a7b75e504952b64, []int{3} +} +func (m *Secp256K1PrivKey) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Secp256K1PrivKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Secp256K1PrivKey.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Secp256K1PrivKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_Secp256K1PrivKey.Merge(m, src) +} +func (m *Secp256K1PrivKey) XXX_Size() int { + return m.Size() +} +func (m *Secp256K1PrivKey) XXX_DiscardUnknown() { + xxx_messageInfo_Secp256K1PrivKey.DiscardUnknown(m) +} + +var xxx_messageInfo_Secp256K1PrivKey proto.InternalMessageInfo + +func (m *Secp256K1PrivKey) GetKey() github_com_cosmos_cosmos_sdk_crypto_keys_secp256k1.PrivKey { + if m != nil { + return m.Key + } + return nil +} + +type Ed25519PubKey struct { + Key github_com_cosmos_cosmos_sdk_crypto_keys_ed25519.PubKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/cosmos/cosmos-sdk/crypto/keys/ed25519.PubKey" json:"key,omitempty"` +} + +func (m *Ed25519PubKey) Reset() { *m = Ed25519PubKey{} } +func (m *Ed25519PubKey) String() string { return proto.CompactTextString(m) } +func (*Ed25519PubKey) ProtoMessage() {} +func (*Ed25519PubKey) Descriptor() ([]byte, []int) { + return fileDescriptor_9a7b75e504952b64, []int{4} +} +func (m *Ed25519PubKey) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Ed25519PubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Ed25519PubKey.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Ed25519PubKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ed25519PubKey.Merge(m, src) +} +func (m *Ed25519PubKey) XXX_Size() int { + return m.Size() +} +func (m *Ed25519PubKey) XXX_DiscardUnknown() { + xxx_messageInfo_Ed25519PubKey.DiscardUnknown(m) +} + +var xxx_messageInfo_Ed25519PubKey proto.InternalMessageInfo + +func (m *Ed25519PubKey) GetKey() github_com_cosmos_cosmos_sdk_crypto_keys_ed25519.PubKey { + if m != nil { + return m.Key + } + return nil +} + +type Ed25519PrivKey struct { + Key github_com_cosmos_cosmos_sdk_crypto_keys_ed25519.PrivKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/cosmos/cosmos-sdk/crypto/keys/ed25519.PrivKey" json:"key,omitempty"` +} + +func (m *Ed25519PrivKey) Reset() { *m = Ed25519PrivKey{} } +func (m *Ed25519PrivKey) String() string { return proto.CompactTextString(m) } +func (*Ed25519PrivKey) ProtoMessage() {} +func (*Ed25519PrivKey) Descriptor() ([]byte, []int) { + return fileDescriptor_9a7b75e504952b64, []int{5} +} +func (m *Ed25519PrivKey) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Ed25519PrivKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Ed25519PrivKey.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Ed25519PrivKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ed25519PrivKey.Merge(m, src) +} +func (m *Ed25519PrivKey) XXX_Size() int { + return m.Size() +} +func (m *Ed25519PrivKey) XXX_DiscardUnknown() { + xxx_messageInfo_Ed25519PrivKey.DiscardUnknown(m) +} + +var xxx_messageInfo_Ed25519PrivKey proto.InternalMessageInfo + +func (m *Ed25519PrivKey) GetKey() github_com_cosmos_cosmos_sdk_crypto_keys_ed25519.PrivKey { + if m != nil { + return m.Key + } + return nil +} + +type Sr25519PubKey struct { + Key github_com_cosmos_cosmos_sdk_crypto_keys_sr25519.PubKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/cosmos/cosmos-sdk/crypto/keys/sr25519.PubKey" json:"key,omitempty"` +} + +func (m *Sr25519PubKey) Reset() { *m = Sr25519PubKey{} } +func (m *Sr25519PubKey) String() string { return proto.CompactTextString(m) } +func (*Sr25519PubKey) ProtoMessage() {} +func (*Sr25519PubKey) Descriptor() ([]byte, []int) { + return fileDescriptor_9a7b75e504952b64, []int{6} +} +func (m *Sr25519PubKey) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Sr25519PubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Sr25519PubKey.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Sr25519PubKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_Sr25519PubKey.Merge(m, src) +} +func (m *Sr25519PubKey) XXX_Size() int { + return m.Size() +} +func (m *Sr25519PubKey) XXX_DiscardUnknown() { + xxx_messageInfo_Sr25519PubKey.DiscardUnknown(m) +} + +var xxx_messageInfo_Sr25519PubKey proto.InternalMessageInfo + +func (m *Sr25519PubKey) GetKey() github_com_cosmos_cosmos_sdk_crypto_keys_sr25519.PubKey { + if m != nil { + return m.Key + } + return nil +} + +type Sr25519PrivKey struct { + Key github_com_cosmos_cosmos_sdk_crypto_keys_sr25519.PrivKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/cosmos/cosmos-sdk/crypto/keys/sr25519.PrivKey" json:"key,omitempty"` +} + +func (m *Sr25519PrivKey) Reset() { *m = Sr25519PrivKey{} } +func (m *Sr25519PrivKey) String() string { return proto.CompactTextString(m) } +func (*Sr25519PrivKey) ProtoMessage() {} +func (*Sr25519PrivKey) Descriptor() ([]byte, []int) { + return fileDescriptor_9a7b75e504952b64, []int{7} +} +func (m *Sr25519PrivKey) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Sr25519PrivKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Sr25519PrivKey.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Sr25519PrivKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_Sr25519PrivKey.Merge(m, src) +} +func (m *Sr25519PrivKey) XXX_Size() int { + return m.Size() +} +func (m *Sr25519PrivKey) XXX_DiscardUnknown() { + xxx_messageInfo_Sr25519PrivKey.DiscardUnknown(m) +} + +var xxx_messageInfo_Sr25519PrivKey proto.InternalMessageInfo + +func (m *Sr25519PrivKey) GetKey() github_com_cosmos_cosmos_sdk_crypto_keys_sr25519.PrivKey { + if m != nil { + return m.Key + } + return nil +} + +func init() { + proto.RegisterType((*MultisigThresholdPubKey)(nil), "cosmos.crypto.MultisigThresholdPubKey") + proto.RegisterType((*LegacyAminoMultisigThresholdPubKey)(nil), "cosmos.crypto.LegacyAminoMultisigThresholdPubKey") + proto.RegisterType((*Secp256K1PubKey)(nil), "cosmos.crypto.Secp256K1PubKey") + proto.RegisterType((*Secp256K1PrivKey)(nil), "cosmos.crypto.Secp256K1PrivKey") + proto.RegisterType((*Ed25519PubKey)(nil), "cosmos.crypto.Ed25519PubKey") + proto.RegisterType((*Ed25519PrivKey)(nil), "cosmos.crypto.Ed25519PrivKey") + proto.RegisterType((*Sr25519PubKey)(nil), "cosmos.crypto.Sr25519PubKey") + proto.RegisterType((*Sr25519PrivKey)(nil), "cosmos.crypto.Sr25519PrivKey") +} + +func init() { proto.RegisterFile("cosmos/keys/keys.proto", fileDescriptor_9a7b75e504952b64) } + +var fileDescriptor_9a7b75e504952b64 = []byte{ + // 428 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4b, 0xce, 0x2f, 0xce, + 0xcd, 0x2f, 0xd6, 0xcf, 0x4e, 0xad, 0x84, 0x10, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0xbc, + 0x10, 0x71, 0xbd, 0xe4, 0xa2, 0xca, 0x82, 0x92, 0x7c, 0x29, 0x91, 0xf4, 0xfc, 0xf4, 0x7c, 0xb0, + 0x8c, 0x3e, 0x88, 0x05, 0x51, 0x24, 0x25, 0x99, 0x9e, 0x9f, 0x9f, 0x9e, 0x93, 0xaa, 0x0f, 0xe6, + 0x25, 0x95, 0xa6, 0xe9, 0x27, 0xe6, 0x55, 0x42, 0xa4, 0x94, 0x56, 0x30, 0x72, 0x89, 0xfb, 0x96, + 0xe6, 0x94, 0x64, 0x16, 0x67, 0xa6, 0x87, 0x64, 0x14, 0xa5, 0x16, 0x67, 0xe4, 0xe7, 0xa4, 0x04, + 0x94, 0x26, 0x79, 0xa7, 0x56, 0x0a, 0x99, 0x73, 0x71, 0x96, 0xc0, 0x84, 0x24, 0x18, 0x15, 0x18, + 0x35, 0x78, 0x9d, 0x24, 0x1f, 0xdd, 0x93, 0x67, 0xf4, 0xfe, 0x74, 0x4f, 0x5e, 0xa0, 0x32, 0x31, + 0x37, 0xc7, 0x4a, 0x09, 0x2e, 0xaf, 0x14, 0x84, 0x50, 0x2b, 0x14, 0xc2, 0xc5, 0x5d, 0x50, 0x9a, + 0x94, 0x93, 0x99, 0x1c, 0x0f, 0x72, 0xa9, 0x04, 0x93, 0x02, 0xb3, 0x06, 0xb7, 0x91, 0x88, 0x1e, + 0xc4, 0x15, 0x7a, 0x30, 0x57, 0xe8, 0x39, 0xe6, 0x55, 0x3a, 0xc9, 0x3e, 0xba, 0x27, 0xcf, 0x0e, + 0xb1, 0xaf, 0xf8, 0xd3, 0x3d, 0x79, 0x3e, 0x88, 0xb1, 0x05, 0xa5, 0x49, 0x20, 0x9d, 0x4a, 0x41, + 0x5c, 0x10, 0x73, 0x40, 0xb2, 0x4a, 0x9b, 0x19, 0xb9, 0x94, 0x7c, 0x52, 0xd3, 0x13, 0x93, 0x2b, + 0x1d, 0x73, 0x33, 0xf3, 0xf2, 0x87, 0x88, 0xab, 0x93, 0xb8, 0xf8, 0x83, 0x53, 0x93, 0x0b, 0x8c, + 0x4c, 0xcd, 0xbc, 0x0d, 0xa1, 0x2e, 0xf4, 0xe7, 0x62, 0xce, 0x4e, 0xad, 0x04, 0xbb, 0x8d, 0xc7, + 0xc9, 0xf6, 0xd7, 0x3d, 0x79, 0xcb, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, + 0x7d, 0x68, 0x3c, 0x43, 0x28, 0xdd, 0xe2, 0x94, 0x6c, 0x7d, 0x48, 0xd4, 0x42, 0x62, 0xbe, 0x18, + 0x62, 0x54, 0xb6, 0xa1, 0x1e, 0xc4, 0xac, 0x20, 0x90, 0x49, 0x4a, 0x29, 0x5c, 0x02, 0x08, 0x3b, + 0x8a, 0x32, 0xcb, 0x40, 0x96, 0x04, 0x20, 0x5b, 0x62, 0xf7, 0xeb, 0x9e, 0xbc, 0x15, 0x39, 0x96, + 0x40, 0x0c, 0x83, 0xd8, 0x12, 0xc7, 0xc5, 0xeb, 0x9a, 0x62, 0x64, 0x6a, 0x6a, 0x68, 0x09, 0xf5, + 0x87, 0x2f, 0xb2, 0x15, 0xd6, 0xbf, 0xee, 0xc9, 0x9b, 0x13, 0x6d, 0x45, 0x2a, 0xc4, 0x20, 0x14, + 0x5f, 0x24, 0x70, 0xf1, 0xc1, 0xcc, 0x87, 0xfa, 0xc1, 0x0f, 0xd9, 0x02, 0x9b, 0x5f, 0xf7, 0xe4, + 0x2d, 0x48, 0xb7, 0x00, 0xcd, 0x07, 0xc1, 0x45, 0x54, 0xf2, 0x41, 0x71, 0x11, 0x56, 0x1f, 0xc0, + 0xcc, 0xa7, 0xdc, 0x07, 0x70, 0x0b, 0x90, 0x7c, 0xe0, 0xe4, 0x74, 0xe2, 0x91, 0x1c, 0xe3, 0x85, + 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, + 0x8d, 0xc7, 0x72, 0x0c, 0x51, 0x1a, 0xc4, 0x1a, 0x9c, 0xc4, 0x06, 0x4e, 0xca, 0xc6, 0x80, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xca, 0x79, 0xcb, 0x85, 0x53, 0x04, 0x00, 0x00, +} + +func (m *MultisigThresholdPubKey) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MultisigThresholdPubKey) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MultisigThresholdPubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.PubKeys) > 0 { + for iNdEx := len(m.PubKeys) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.PubKeys[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintKeys(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if m.K != 0 { + i = encodeVarintKeys(dAtA, i, uint64(m.K)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *LegacyAminoMultisigThresholdPubKey) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LegacyAminoMultisigThresholdPubKey) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *LegacyAminoMultisigThresholdPubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.PubKeys) > 0 { + for iNdEx := len(m.PubKeys) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.PubKeys[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintKeys(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if m.K != 0 { + i = encodeVarintKeys(dAtA, i, uint64(m.K)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *Secp256K1PubKey) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Secp256K1PubKey) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Secp256K1PubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Secp256K1PrivKey) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Secp256K1PrivKey) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Secp256K1PrivKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Ed25519PubKey) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Ed25519PubKey) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Ed25519PubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Ed25519PrivKey) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Ed25519PrivKey) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Ed25519PrivKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Sr25519PubKey) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Sr25519PubKey) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Sr25519PubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Sr25519PrivKey) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Sr25519PrivKey) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Sr25519PrivKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintKeys(dAtA []byte, offset int, v uint64) int { + offset -= sovKeys(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *MultisigThresholdPubKey) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.K != 0 { + n += 1 + sovKeys(uint64(m.K)) + } + if len(m.PubKeys) > 0 { + for _, e := range m.PubKeys { + l = e.Size() + n += 1 + l + sovKeys(uint64(l)) + } + } + return n +} + +func (m *LegacyAminoMultisigThresholdPubKey) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.K != 0 { + n += 1 + sovKeys(uint64(m.K)) + } + if len(m.PubKeys) > 0 { + for _, e := range m.PubKeys { + l = e.Size() + n += 1 + l + sovKeys(uint64(l)) + } + } + return n +} + +func (m *Secp256K1PubKey) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovKeys(uint64(l)) + } + return n +} + +func (m *Secp256K1PrivKey) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovKeys(uint64(l)) + } + return n +} + +func (m *Ed25519PubKey) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovKeys(uint64(l)) + } + return n +} + +func (m *Ed25519PrivKey) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovKeys(uint64(l)) + } + return n +} + +func (m *Sr25519PubKey) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovKeys(uint64(l)) + } + return n +} + +func (m *Sr25519PrivKey) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovKeys(uint64(l)) + } + return n +} + +func sovKeys(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozKeys(x uint64) (n int) { + return sovKeys(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MultisigThresholdPubKey) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MultisigThresholdPubKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MultisigThresholdPubKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field K", wireType) + } + m.K = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.K |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PubKeys", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthKeys + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthKeys + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PubKeys = append(m.PubKeys, &types.Any{}) + if err := m.PubKeys[len(m.PubKeys)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipKeys(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LegacyAminoMultisigThresholdPubKey) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LegacyAminoMultisigThresholdPubKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LegacyAminoMultisigThresholdPubKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field K", wireType) + } + m.K = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.K |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PubKeys", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthKeys + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthKeys + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PubKeys = append(m.PubKeys, &types.Any{}) + if err := m.PubKeys[len(m.PubKeys)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipKeys(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Secp256K1PubKey) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Secp256K1PubKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Secp256K1PubKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthKeys + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthKeys + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipKeys(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Secp256K1PrivKey) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Secp256K1PrivKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Secp256K1PrivKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthKeys + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthKeys + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipKeys(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ed25519PubKey) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Ed25519PubKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ed25519PubKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthKeys + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthKeys + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipKeys(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ed25519PrivKey) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Ed25519PrivKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ed25519PrivKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthKeys + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthKeys + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipKeys(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Sr25519PubKey) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Sr25519PubKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Sr25519PubKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthKeys + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthKeys + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipKeys(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Sr25519PrivKey) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Sr25519PrivKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Sr25519PrivKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthKeys + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthKeys + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipKeys(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipKeys(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKeys + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKeys + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKeys + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthKeys + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupKeys + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthKeys + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthKeys = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowKeys = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupKeys = fmt.Errorf("proto: unexpected end of group") +) diff --git a/crypto/types.go b/crypto/types.go new file mode 100644 index 000000000000..1c2141f1bd55 --- /dev/null +++ b/crypto/types.go @@ -0,0 +1,9 @@ +package crypto + +import tmcrypto "github.com/tendermint/tendermint/crypto" + +type ( + PubKey = tmcrypto.PubKey + PrivKey = tmcrypto.PrivKey + Address = tmcrypto.Address +) diff --git a/go.sum b/go.sum index 029fe6c0137e..2c3c4d78414a 100644 --- a/go.sum +++ b/go.sum @@ -101,8 +101,6 @@ github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfc github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d h1:49RLWk1j44Xu4fjHb6JFYmeUnDORVwHNkDxaQ0ctCVU= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= -github.com/cosmos/iavl v0.15.0-rc1 h1:cYMPAxu5xpGPhGYvGlpeCmgmgH7oY+kebZm2oHfh2nE= -github.com/cosmos/iavl v0.15.0-rc1/go.mod h1:qFTkoCC00sBKWCG3Ws8GAUaYR1jIOtwNZ9p8uFOu4Jo= github.com/cosmos/iavl v0.15.0-rc2 h1:4HI/LYLjWUnou8dehPD+NqEsDc8uamJOU2yHcqdTKv8= github.com/cosmos/iavl v0.15.0-rc2/go.mod h1:bXLXbwmww0kYtAYRCYNXR/k44lWaK8rIZJlCmqSK8lQ= github.com/cosmos/ledger-cosmos-go v0.11.1 h1:9JIYsGnXP613pb2vPjFeMMjBI5lEDsEaF6oYorTy6J4= @@ -181,8 +179,6 @@ github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4er github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -496,7 +492,6 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -523,11 +518,8 @@ github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RM github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk= github.com/tendermint/go-amino v0.15.1 h1:D2uk35eT4iTsvJd9jWIetzthE5C0/k2QmMFkCN+4JgQ= github.com/tendermint/go-amino v0.15.1/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= -github.com/tendermint/tendermint v0.34.0-rc2/go.mod h1:+AG8ftE2PD4uMVzGSB7c0oH9xbTlIyMeoX0M9r89x3Y= github.com/tendermint/tendermint v0.34.0-rc3 h1:d7Fsd5rdbxq4GmJ0kRfx7l7LesQM7e70f0ytWLTQ/Go= github.com/tendermint/tendermint v0.34.0-rc3/go.mod h1:BoHcEpjfpBHc1Be7RQz3AHaXFNObcDG7SNHCev6Or4g= -github.com/tendermint/tm-db v0.6.0 h1:Us30k7H1UDcdqoSPhmP8ztAW/SWV6c6OfsfeCiboTC4= -github.com/tendermint/tm-db v0.6.0/go.mod h1:xj3AWJ08kBDlCHKijnhJ7mTcDMOikT1r8Poxy2pJn7Q= github.com/tendermint/tm-db v0.6.1 h1:w3X87itMPXopcRPlFiqspEKhw4FXihPk2rnFFkP0zGk= github.com/tendermint/tm-db v0.6.1/go.mod h1:m3x9kRP4UFd7JODJL0yBAZqE7wTw+S37uAE90cTx7OA= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -733,8 +725,6 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0 h1:T7P4R73V3SSDPhH7WW7ATbfViLtmamH0DKrP3f9AuDI= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -782,7 +772,5 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= 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= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/proto/cosmos/keys/keys.proto b/proto/cosmos/keys/keys.proto new file mode 100644 index 000000000000..eb3cf7db7cf6 --- /dev/null +++ b/proto/cosmos/keys/keys.proto @@ -0,0 +1,44 @@ +syntax = "proto3"; +package cosmos.crypto; + +import "gogoproto/gogo.proto"; +import "google/protobuf/any.proto"; + +option go_package = "github.com/cosmos/cosmos-sdk/crypto/keys"; + +// MultisigThresholdPubKey specifies a public key type which nests multiple public +// keys and a threshold +message MultisigThresholdPubKey { + uint32 threshold = 1 [(gogoproto.customname) = "K", (gogoproto.moretags) = "yaml:\"threshold\""]; + repeated google.protobuf.Any public_keys = 2 [(gogoproto.customname) = "PubKeys", (gogoproto.moretags) = "yaml:\"pubkeys\""]; +} + +// LegacyAminoMultisigThresholdPubKey is a version of MultisigThresholdPubKey which uses legacy amino address rules +message LegacyAminoMultisigThresholdPubKey { + uint32 threshold = 1 [(gogoproto.customname) = "K", (gogoproto.moretags) = "yaml:\"threshold\""]; + repeated google.protobuf.Any public_keys = 2 [(gogoproto.customname) = "PubKeys", (gogoproto.moretags) = "yaml:\"pubkeys\""]; +} + +message Secp256K1PubKey { + bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1.PubKey"]; +} + +message Secp256K1PrivKey { + bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1.PrivKey"]; +} + +message Ed25519PubKey { + bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519.PubKey"]; +} + +message Ed25519PrivKey { + bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519.PrivKey"]; +} + +message Sr25519PubKey { + bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/sr25519.PubKey"]; +} + +message Sr25519PrivKey { + bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/sr25519.PrivKey"]; +} diff --git a/x/auth/types/query.pb.gw.go b/x/auth/types/query.pb.gw.go index 3b156842ddc0..adc76a0a1a91 100644 --- a/x/auth/types/query.pb.gw.go +++ b/x/auth/types/query.pb.gw.go @@ -13,7 +13,6 @@ import ( "io" "net/http" - "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -23,13 +22,11 @@ import ( "google.golang.org/grpc/status" ) -// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage func request_Query_Account_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryAccountRequest @@ -58,33 +55,6 @@ func request_Query_Account_0(ctx context.Context, marshaler runtime.Marshaler, c } -func local_request_Query_Account_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryAccountRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["address"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") - } - - protoReq.Address, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) - } - - msg, err := server.Account(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryParamsRequest var metadata runtime.ServerMetadata @@ -94,64 +64,6 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl } -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_Account_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Account_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Account_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/bank/types/query.pb.gw.go b/x/bank/types/query.pb.gw.go index ca9c1ddbfa6c..f127e7e9f4bc 100644 --- a/x/bank/types/query.pb.gw.go +++ b/x/bank/types/query.pb.gw.go @@ -13,7 +13,6 @@ import ( "io" "net/http" - "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -23,13 +22,11 @@ import ( "google.golang.org/grpc/status" ) -// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage func request_Query_Balance_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryBalanceRequest @@ -69,44 +66,6 @@ func request_Query_Balance_0(ctx context.Context, marshaler runtime.Marshaler, c } -func local_request_Query_Balance_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryBalanceRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["address"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") - } - - protoReq.Address, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) - } - - val, ok = pathParams["denom"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "denom") - } - - protoReq.Denom, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "denom", err) - } - - msg, err := server.Balance(ctx, &protoReq) - return msg, metadata, err - -} - var ( filter_Query_AllBalances_0 = &utilities.DoubleArray{Encoding: map[string]int{"address": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -145,40 +104,6 @@ func request_Query_AllBalances_0(ctx context.Context, marshaler runtime.Marshale } -func local_request_Query_AllBalances_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryAllBalancesRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["address"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") - } - - protoReq.Address, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_AllBalances_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.AllBalances(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_TotalSupply_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryTotalSupplyRequest var metadata runtime.ServerMetadata @@ -188,15 +113,6 @@ func request_Query_TotalSupply_0(ctx context.Context, marshaler runtime.Marshale } -func local_request_Query_TotalSupply_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryTotalSupplyRequest - var metadata runtime.ServerMetadata - - msg, err := server.TotalSupply(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_SupplyOf_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QuerySupplyOfRequest var metadata runtime.ServerMetadata @@ -224,33 +140,6 @@ func request_Query_SupplyOf_0(ctx context.Context, marshaler runtime.Marshaler, } -func local_request_Query_SupplyOf_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QuerySupplyOfRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["denom"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "denom") - } - - protoReq.Denom, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "denom", err) - } - - msg, err := server.SupplyOf(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryParamsRequest var metadata runtime.ServerMetadata @@ -260,124 +149,6 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl } -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_Balance_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Balance_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Balance_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_AllBalances_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_AllBalances_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_AllBalances_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_TotalSupply_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_TotalSupply_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_TotalSupply_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_SupplyOf_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_SupplyOf_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_SupplyOf_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/distribution/types/query.pb.gw.go b/x/distribution/types/query.pb.gw.go index 890e51e40d1e..1c03938041fe 100644 --- a/x/distribution/types/query.pb.gw.go +++ b/x/distribution/types/query.pb.gw.go @@ -13,7 +13,6 @@ import ( "io" "net/http" - "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -23,13 +22,11 @@ import ( "google.golang.org/grpc/status" ) -// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryParamsRequest @@ -40,15 +37,6 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl } -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_ValidatorOutstandingRewards_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryValidatorOutstandingRewardsRequest var metadata runtime.ServerMetadata @@ -76,33 +64,6 @@ func request_Query_ValidatorOutstandingRewards_0(ctx context.Context, marshaler } -func local_request_Query_ValidatorOutstandingRewards_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryValidatorOutstandingRewardsRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["validator_address"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_address") - } - - protoReq.ValidatorAddress, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_address", err) - } - - msg, err := server.ValidatorOutstandingRewards(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_ValidatorCommission_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryValidatorCommissionRequest var metadata runtime.ServerMetadata @@ -130,33 +91,6 @@ func request_Query_ValidatorCommission_0(ctx context.Context, marshaler runtime. } -func local_request_Query_ValidatorCommission_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryValidatorCommissionRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["validator_address"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_address") - } - - protoReq.ValidatorAddress, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_address", err) - } - - msg, err := server.ValidatorCommission(ctx, &protoReq) - return msg, metadata, err - -} - var ( filter_Query_ValidatorSlashes_0 = &utilities.DoubleArray{Encoding: map[string]int{"validator_address": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -195,40 +129,6 @@ func request_Query_ValidatorSlashes_0(ctx context.Context, marshaler runtime.Mar } -func local_request_Query_ValidatorSlashes_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryValidatorSlashesRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["validator_address"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_address") - } - - protoReq.ValidatorAddress, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_address", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ValidatorSlashes_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.ValidatorSlashes(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_DelegationRewards_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryDelegationRewardsRequest var metadata runtime.ServerMetadata @@ -267,44 +167,6 @@ func request_Query_DelegationRewards_0(ctx context.Context, marshaler runtime.Ma } -func local_request_Query_DelegationRewards_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDelegationRewardsRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["delegator_address"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_address") - } - - protoReq.DelegatorAddress, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_address", err) - } - - val, ok = pathParams["validator_address"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_address") - } - - protoReq.ValidatorAddress, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_address", err) - } - - msg, err := server.DelegationRewards(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_DelegationTotalRewards_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryDelegationTotalRewardsRequest var metadata runtime.ServerMetadata @@ -332,33 +194,6 @@ func request_Query_DelegationTotalRewards_0(ctx context.Context, marshaler runti } -func local_request_Query_DelegationTotalRewards_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDelegationTotalRewardsRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["delegator_address"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_address") - } - - protoReq.DelegatorAddress, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_address", err) - } - - msg, err := server.DelegationTotalRewards(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_DelegatorValidators_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryDelegatorValidatorsRequest var metadata runtime.ServerMetadata @@ -386,33 +221,6 @@ func request_Query_DelegatorValidators_0(ctx context.Context, marshaler runtime. } -func local_request_Query_DelegatorValidators_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDelegatorValidatorsRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["delegator_address"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_address") - } - - protoReq.DelegatorAddress, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_address", err) - } - - msg, err := server.DelegatorValidators(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_DelegatorWithdrawAddress_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryDelegatorWithdrawAddressRequest var metadata runtime.ServerMetadata @@ -440,33 +248,6 @@ func request_Query_DelegatorWithdrawAddress_0(ctx context.Context, marshaler run } -func local_request_Query_DelegatorWithdrawAddress_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDelegatorWithdrawAddressRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["delegator_address"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_address") - } - - protoReq.DelegatorAddress, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_address", err) - } - - msg, err := server.DelegatorWithdrawAddress(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_CommunityPool_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryCommunityPoolRequest var metadata runtime.ServerMetadata @@ -476,204 +257,6 @@ func request_Query_CommunityPool_0(ctx context.Context, marshaler runtime.Marsha } -func local_request_Query_CommunityPool_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryCommunityPoolRequest - var metadata runtime.ServerMetadata - - msg, err := server.CommunityPool(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ValidatorOutstandingRewards_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_ValidatorOutstandingRewards_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ValidatorOutstandingRewards_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ValidatorCommission_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_ValidatorCommission_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ValidatorCommission_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ValidatorSlashes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_ValidatorSlashes_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ValidatorSlashes_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_DelegationRewards_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_DelegationRewards_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_DelegationRewards_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_DelegationTotalRewards_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_DelegationTotalRewards_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_DelegationTotalRewards_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_DelegatorValidators_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_DelegatorValidators_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_DelegatorValidators_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_DelegatorWithdrawAddress_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_DelegatorWithdrawAddress_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_DelegatorWithdrawAddress_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_CommunityPool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_CommunityPool_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_CommunityPool_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/evidence/types/query.pb.gw.go b/x/evidence/types/query.pb.gw.go index e15d163524b4..5de488fd9c3f 100644 --- a/x/evidence/types/query.pb.gw.go +++ b/x/evidence/types/query.pb.gw.go @@ -13,7 +13,6 @@ import ( "io" "net/http" - "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -23,13 +22,11 @@ import ( "google.golang.org/grpc/status" ) -// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage func request_Query_Evidence_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryEvidenceRequest @@ -58,33 +55,6 @@ func request_Query_Evidence_0(ctx context.Context, marshaler runtime.Marshaler, } -func local_request_Query_Evidence_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryEvidenceRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["evidence_hash"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "evidence_hash") - } - - protoReq.EvidenceHash, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "evidence_hash", err) - } - - msg, err := server.Evidence(ctx, &protoReq) - return msg, metadata, err - -} - var ( filter_Query_AllEvidence_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -105,71 +75,6 @@ func request_Query_AllEvidence_0(ctx context.Context, marshaler runtime.Marshale } -func local_request_Query_AllEvidence_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryAllEvidenceRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_AllEvidence_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.AllEvidence(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_Evidence_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Evidence_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Evidence_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_AllEvidence_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_AllEvidence_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_AllEvidence_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/gov/types/query.pb.gw.go b/x/gov/types/query.pb.gw.go index e9fc72f302b2..073881def7ab 100644 --- a/x/gov/types/query.pb.gw.go +++ b/x/gov/types/query.pb.gw.go @@ -13,7 +13,6 @@ import ( "io" "net/http" - "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -23,13 +22,11 @@ import ( "google.golang.org/grpc/status" ) -// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage func request_Query_Proposal_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryProposalRequest @@ -58,33 +55,6 @@ func request_Query_Proposal_0(ctx context.Context, marshaler runtime.Marshaler, } -func local_request_Query_Proposal_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryProposalRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["proposal_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "proposal_id") - } - - protoReq.ProposalId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "proposal_id", err) - } - - msg, err := server.Proposal(ctx, &protoReq) - return msg, metadata, err - -} - var ( filter_Query_Proposals_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -105,22 +75,6 @@ func request_Query_Proposals_0(ctx context.Context, marshaler runtime.Marshaler, } -func local_request_Query_Proposals_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryProposalsRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Proposals_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.Proposals(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_Vote_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryVoteRequest var metadata runtime.ServerMetadata @@ -159,44 +113,6 @@ func request_Query_Vote_0(ctx context.Context, marshaler runtime.Marshaler, clie } -func local_request_Query_Vote_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryVoteRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["proposal_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "proposal_id") - } - - protoReq.ProposalId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "proposal_id", err) - } - - val, ok = pathParams["voter"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "voter") - } - - protoReq.Voter, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "voter", err) - } - - msg, err := server.Vote(ctx, &protoReq) - return msg, metadata, err - -} - var ( filter_Query_Votes_0 = &utilities.DoubleArray{Encoding: map[string]int{"proposal_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -235,40 +151,6 @@ func request_Query_Votes_0(ctx context.Context, marshaler runtime.Marshaler, cli } -func local_request_Query_Votes_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryVotesRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["proposal_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "proposal_id") - } - - protoReq.ProposalId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "proposal_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Votes_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.Votes(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryParamsRequest var metadata runtime.ServerMetadata @@ -296,33 +178,6 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl } -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["params_type"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "params_type") - } - - protoReq.ParamsType, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "params_type", err) - } - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_Deposit_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryDepositRequest var metadata runtime.ServerMetadata @@ -361,44 +216,6 @@ func request_Query_Deposit_0(ctx context.Context, marshaler runtime.Marshaler, c } -func local_request_Query_Deposit_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDepositRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["proposal_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "proposal_id") - } - - protoReq.ProposalId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "proposal_id", err) - } - - val, ok = pathParams["depositor"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "depositor") - } - - protoReq.Depositor, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "depositor", err) - } - - msg, err := server.Deposit(ctx, &protoReq) - return msg, metadata, err - -} - var ( filter_Query_Deposits_0 = &utilities.DoubleArray{Encoding: map[string]int{"proposal_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -437,40 +254,6 @@ func request_Query_Deposits_0(ctx context.Context, marshaler runtime.Marshaler, } -func local_request_Query_Deposits_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDepositsRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["proposal_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "proposal_id") - } - - protoReq.ProposalId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "proposal_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Deposits_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.Deposits(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_TallyResult_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryTallyResultRequest var metadata runtime.ServerMetadata @@ -498,202 +281,6 @@ func request_Query_TallyResult_0(ctx context.Context, marshaler runtime.Marshale } -func local_request_Query_TallyResult_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryTallyResultRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["proposal_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "proposal_id") - } - - protoReq.ProposalId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "proposal_id", err) - } - - msg, err := server.TallyResult(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_Proposal_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Proposal_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Proposal_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Proposals_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Proposals_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Proposals_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Vote_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Vote_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Vote_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Votes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Votes_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Votes_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Deposit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Deposit_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Deposit_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Deposits_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Deposits_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Deposits_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_TallyResult_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_TallyResult_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_TallyResult_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/ibc-transfer/types/query.pb.gw.go b/x/ibc-transfer/types/query.pb.gw.go index 23b91aafc162..9055c8af4154 100644 --- a/x/ibc-transfer/types/query.pb.gw.go +++ b/x/ibc-transfer/types/query.pb.gw.go @@ -13,7 +13,6 @@ import ( "io" "net/http" - "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -23,13 +22,11 @@ import ( "google.golang.org/grpc/status" ) -// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage func request_Query_DenomTrace_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryDenomTraceRequest @@ -58,33 +55,6 @@ func request_Query_DenomTrace_0(ctx context.Context, marshaler runtime.Marshaler } -func local_request_Query_DenomTrace_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDenomTraceRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["hash"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "hash") - } - - protoReq.Hash, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "hash", err) - } - - msg, err := server.DenomTrace(ctx, &protoReq) - return msg, metadata, err - -} - var ( filter_Query_DenomTraces_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -105,22 +75,6 @@ func request_Query_DenomTraces_0(ctx context.Context, marshaler runtime.Marshale } -func local_request_Query_DenomTraces_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDenomTracesRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_DenomTraces_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.DenomTraces(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryParamsRequest var metadata runtime.ServerMetadata @@ -130,84 +84,6 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl } -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_DenomTrace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_DenomTrace_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_DenomTrace_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_DenomTraces_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_DenomTraces_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_DenomTraces_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/ibc/03-connection/types/query.pb.gw.go b/x/ibc/03-connection/types/query.pb.gw.go index 7c17c2dd53ff..8711de564982 100644 --- a/x/ibc/03-connection/types/query.pb.gw.go +++ b/x/ibc/03-connection/types/query.pb.gw.go @@ -13,7 +13,6 @@ import ( "io" "net/http" - "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -23,13 +22,11 @@ import ( "google.golang.org/grpc/status" ) -// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage func request_Query_Connection_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryConnectionRequest @@ -58,33 +55,6 @@ func request_Query_Connection_0(ctx context.Context, marshaler runtime.Marshaler } -func local_request_Query_Connection_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryConnectionRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["connection_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "connection_id") - } - - protoReq.ConnectionId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "connection_id", err) - } - - msg, err := server.Connection(ctx, &protoReq) - return msg, metadata, err - -} - var ( filter_Query_Connections_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -105,22 +75,6 @@ func request_Query_Connections_0(ctx context.Context, marshaler runtime.Marshale } -func local_request_Query_Connections_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryConnectionsRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Connections_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.Connections(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_ClientConnections_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryClientConnectionsRequest var metadata runtime.ServerMetadata @@ -148,33 +102,6 @@ func request_Query_ClientConnections_0(ctx context.Context, marshaler runtime.Ma } -func local_request_Query_ClientConnections_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryClientConnectionsRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["client_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "client_id") - } - - protoReq.ClientId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "client_id", err) - } - - msg, err := server.ClientConnections(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_ConnectionClientState_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryConnectionClientStateRequest var metadata runtime.ServerMetadata @@ -202,33 +129,6 @@ func request_Query_ConnectionClientState_0(ctx context.Context, marshaler runtim } -func local_request_Query_ConnectionClientState_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryConnectionClientStateRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["connection_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "connection_id") - } - - protoReq.ConnectionId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "connection_id", err) - } - - msg, err := server.ConnectionClientState(ctx, &protoReq) - return msg, metadata, err - -} - var ( filter_Query_ConnectionConsensusState_0 = &utilities.DoubleArray{Encoding: map[string]int{"connection_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -267,149 +167,6 @@ func request_Query_ConnectionConsensusState_0(ctx context.Context, marshaler run } -func local_request_Query_ConnectionConsensusState_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryConnectionConsensusStateRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["connection_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "connection_id") - } - - protoReq.ConnectionId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "connection_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ConnectionConsensusState_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.ConnectionConsensusState(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_Connection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Connection_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Connection_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Connections_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Connections_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Connections_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ClientConnections_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_ClientConnections_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ClientConnections_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ConnectionClientState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_ConnectionClientState_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ConnectionClientState_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ConnectionConsensusState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_ConnectionConsensusState_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ConnectionConsensusState_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/ibc/04-channel/types/query.pb.gw.go b/x/ibc/04-channel/types/query.pb.gw.go index d3ee502d1656..72cee95d182a 100644 --- a/x/ibc/04-channel/types/query.pb.gw.go +++ b/x/ibc/04-channel/types/query.pb.gw.go @@ -13,7 +13,6 @@ import ( "io" "net/http" - "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -23,13 +22,11 @@ import ( "google.golang.org/grpc/status" ) -// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage func request_Query_Channel_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryChannelRequest @@ -69,44 +66,6 @@ func request_Query_Channel_0(ctx context.Context, marshaler runtime.Marshaler, c } -func local_request_Query_Channel_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryChannelRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["channel_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id") - } - - protoReq.ChannelId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err) - } - - val, ok = pathParams["port_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "port_id") - } - - protoReq.PortId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) - } - - msg, err := server.Channel(ctx, &protoReq) - return msg, metadata, err - -} - var ( filter_Query_Channels_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -127,22 +86,6 @@ func request_Query_Channels_0(ctx context.Context, marshaler runtime.Marshaler, } -func local_request_Query_Channels_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryChannelsRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Channels_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.Channels(ctx, &protoReq) - return msg, metadata, err - -} - var ( filter_Query_ConnectionChannels_0 = &utilities.DoubleArray{Encoding: map[string]int{"connection": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -181,40 +124,6 @@ func request_Query_ConnectionChannels_0(ctx context.Context, marshaler runtime.M } -func local_request_Query_ConnectionChannels_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryConnectionChannelsRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["connection"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "connection") - } - - protoReq.Connection, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "connection", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ConnectionChannels_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.ConnectionChannels(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_ChannelClientState_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryChannelClientStateRequest var metadata runtime.ServerMetadata @@ -253,44 +162,6 @@ func request_Query_ChannelClientState_0(ctx context.Context, marshaler runtime.M } -func local_request_Query_ChannelClientState_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryChannelClientStateRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["channel_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id") - } - - protoReq.ChannelId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err) - } - - val, ok = pathParams["port_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "port_id") - } - - protoReq.PortId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) - } - - msg, err := server.ChannelClientState(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_ChannelConsensusState_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryChannelConsensusStateRequest var metadata runtime.ServerMetadata @@ -340,55 +211,6 @@ func request_Query_ChannelConsensusState_0(ctx context.Context, marshaler runtim } -func local_request_Query_ChannelConsensusState_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryChannelConsensusStateRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["channel_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id") - } - - protoReq.ChannelId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err) - } - - val, ok = pathParams["port_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "port_id") - } - - protoReq.PortId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) - } - - val, ok = pathParams["height"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "height") - } - - protoReq.Height, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "height", err) - } - - msg, err := server.ChannelConsensusState(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_PacketCommitment_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryPacketCommitmentRequest var metadata runtime.ServerMetadata @@ -438,55 +260,6 @@ func request_Query_PacketCommitment_0(ctx context.Context, marshaler runtime.Mar } -func local_request_Query_PacketCommitment_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPacketCommitmentRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["channel_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id") - } - - protoReq.ChannelId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err) - } - - val, ok = pathParams["port_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "port_id") - } - - protoReq.PortId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) - } - - val, ok = pathParams["sequence"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "sequence") - } - - protoReq.Sequence, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "sequence", err) - } - - msg, err := server.PacketCommitment(ctx, &protoReq) - return msg, metadata, err - -} - var ( filter_Query_PacketCommitments_0 = &utilities.DoubleArray{Encoding: map[string]int{"channel_id": 0, "port_id": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} ) @@ -536,8 +309,8 @@ func request_Query_PacketCommitments_0(ctx context.Context, marshaler runtime.Ma } -func local_request_Query_PacketCommitments_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPacketCommitmentsRequest +func request_Query_PacketAcknowledgement_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPacketAcknowledgementRequest var metadata runtime.ServerMetadata var ( @@ -569,20 +342,24 @@ func local_request_Query_PacketCommitments_0(ctx context.Context, marshaler runt return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) } - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + val, ok = pathParams["sequence"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "sequence") } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_PacketCommitments_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + + protoReq.Sequence, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "sequence", err) } - msg, err := server.PacketCommitments(ctx, &protoReq) + msg, err := client.PacketAcknowledgement(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func request_Query_PacketAcknowledgement_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPacketAcknowledgementRequest +func request_Query_UnrelayedPackets_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryUnrelayedPacketsRequest var metadata runtime.ServerMetadata var ( @@ -614,193 +391,35 @@ func request_Query_PacketAcknowledgement_0(ctx context.Context, marshaler runtim return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) } - val, ok = pathParams["sequence"] + val, ok = pathParams["packet_commitment_sequences"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "sequence") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "packet_commitment_sequences") } - protoReq.Sequence, err = runtime.Uint64(val) + protoReq.PacketCommitmentSequences, err = runtime.Uint64Slice(val, ",") if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "sequence", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "packet_commitment_sequences", err) } - msg, err := client.PacketAcknowledgement(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + val, ok = pathParams["acknowledgements"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "acknowledgements") + } + + protoReq.Acknowledgements, err = runtime.Bool(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "acknowledgements", err) + } + + msg, err := client.UnrelayedPackets(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_Query_PacketAcknowledgement_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPacketAcknowledgementRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["channel_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id") - } - - protoReq.ChannelId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err) - } - - val, ok = pathParams["port_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "port_id") - } - - protoReq.PortId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) - } - - val, ok = pathParams["sequence"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "sequence") - } - - protoReq.Sequence, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "sequence", err) - } - - msg, err := server.PacketAcknowledgement(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_UnrelayedPackets_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryUnrelayedPacketsRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["channel_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id") - } - - protoReq.ChannelId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err) - } - - val, ok = pathParams["port_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "port_id") - } - - protoReq.PortId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) - } - - val, ok = pathParams["packet_commitment_sequences"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "packet_commitment_sequences") - } - - protoReq.PacketCommitmentSequences, err = runtime.Uint64Slice(val, ",") - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "packet_commitment_sequences", err) - } - - val, ok = pathParams["acknowledgements"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "acknowledgements") - } - - protoReq.Acknowledgements, err = runtime.Bool(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "acknowledgements", err) - } - - msg, err := client.UnrelayedPackets(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_UnrelayedPackets_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryUnrelayedPacketsRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["channel_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id") - } - - protoReq.ChannelId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err) - } - - val, ok = pathParams["port_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "port_id") - } - - protoReq.PortId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) - } - - val, ok = pathParams["packet_commitment_sequences"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "packet_commitment_sequences") - } - - protoReq.PacketCommitmentSequences, err = runtime.Uint64Slice(val, ",") - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "packet_commitment_sequences", err) - } - - val, ok = pathParams["acknowledgements"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "acknowledgements") - } - - protoReq.Acknowledgements, err = runtime.Bool(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "acknowledgements", err) - } - - msg, err := server.UnrelayedPackets(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_NextSequenceReceive_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryNextSequenceReceiveRequest +func request_Query_NextSequenceReceive_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryNextSequenceReceiveRequest var metadata runtime.ServerMetadata var ( @@ -837,253 +456,6 @@ func request_Query_NextSequenceReceive_0(ctx context.Context, marshaler runtime. } -func local_request_Query_NextSequenceReceive_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryNextSequenceReceiveRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["channel_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id") - } - - protoReq.ChannelId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err) - } - - val, ok = pathParams["port_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "port_id") - } - - protoReq.PortId, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) - } - - msg, err := server.NextSequenceReceive(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_Channel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Channel_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Channel_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Channels_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Channels_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Channels_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ConnectionChannels_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_ConnectionChannels_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ConnectionChannels_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ChannelClientState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_ChannelClientState_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ChannelClientState_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ChannelConsensusState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_ChannelConsensusState_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ChannelConsensusState_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_PacketCommitment_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_PacketCommitment_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_PacketCommitment_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_PacketCommitments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_PacketCommitments_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_PacketCommitments_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_PacketAcknowledgement_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_PacketAcknowledgement_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_PacketAcknowledgement_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_UnrelayedPackets_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_UnrelayedPackets_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_UnrelayedPackets_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_NextSequenceReceive_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_NextSequenceReceive_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_NextSequenceReceive_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/mint/types/query.pb.gw.go b/x/mint/types/query.pb.gw.go index c70c3e60b077..cda5db851384 100644 --- a/x/mint/types/query.pb.gw.go +++ b/x/mint/types/query.pb.gw.go @@ -13,7 +13,6 @@ import ( "io" "net/http" - "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -23,13 +22,11 @@ import ( "google.golang.org/grpc/status" ) -// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryParamsRequest @@ -40,15 +37,6 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl } -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_Inflation_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryInflationRequest var metadata runtime.ServerMetadata @@ -58,15 +46,6 @@ func request_Query_Inflation_0(ctx context.Context, marshaler runtime.Marshaler, } -func local_request_Query_Inflation_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryInflationRequest - var metadata runtime.ServerMetadata - - msg, err := server.Inflation(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_AnnualProvisions_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryAnnualProvisionsRequest var metadata runtime.ServerMetadata @@ -76,84 +55,6 @@ func request_Query_AnnualProvisions_0(ctx context.Context, marshaler runtime.Mar } -func local_request_Query_AnnualProvisions_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryAnnualProvisionsRequest - var metadata runtime.ServerMetadata - - msg, err := server.AnnualProvisions(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Inflation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Inflation_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Inflation_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_AnnualProvisions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_AnnualProvisions_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_AnnualProvisions_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/params/types/proposal/query.pb.gw.go b/x/params/types/proposal/query.pb.gw.go index c7fab13fca65..9cce0aaaa4bb 100644 --- a/x/params/types/proposal/query.pb.gw.go +++ b/x/params/types/proposal/query.pb.gw.go @@ -13,7 +13,6 @@ import ( "io" "net/http" - "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -23,13 +22,11 @@ import ( "google.golang.org/grpc/status" ) -// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage var ( filter_Query_Params_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} @@ -51,51 +48,6 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl } -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Params_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/slashing/types/query.pb.gw.go b/x/slashing/types/query.pb.gw.go index 5ac3296025c2..114d780e355a 100644 --- a/x/slashing/types/query.pb.gw.go +++ b/x/slashing/types/query.pb.gw.go @@ -13,7 +13,6 @@ import ( "io" "net/http" - "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -23,13 +22,11 @@ import ( "google.golang.org/grpc/status" ) -// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryParamsRequest @@ -40,15 +37,6 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl } -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_SigningInfo_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QuerySigningInfoRequest var metadata runtime.ServerMetadata @@ -76,33 +64,6 @@ func request_Query_SigningInfo_0(ctx context.Context, marshaler runtime.Marshale } -func local_request_Query_SigningInfo_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QuerySigningInfoRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["cons_address"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "cons_address") - } - - protoReq.ConsAddress, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "cons_address", err) - } - - msg, err := server.SigningInfo(ctx, &protoReq) - return msg, metadata, err - -} - var ( filter_Query_SigningInfos_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -123,91 +84,6 @@ func request_Query_SigningInfos_0(ctx context.Context, marshaler runtime.Marshal } -func local_request_Query_SigningInfos_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QuerySigningInfosRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_SigningInfos_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.SigningInfos(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_SigningInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_SigningInfo_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_SigningInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_SigningInfos_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_SigningInfos_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_SigningInfos_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/staking/types/query.pb.gw.go b/x/staking/types/query.pb.gw.go index 0c433330203b..accf4a1eb3bb 100644 --- a/x/staking/types/query.pb.gw.go +++ b/x/staking/types/query.pb.gw.go @@ -13,7 +13,6 @@ import ( "io" "net/http" - "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -23,13 +22,11 @@ import ( "google.golang.org/grpc/status" ) -// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage var ( filter_Query_Validators_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} @@ -51,22 +48,6 @@ func request_Query_Validators_0(ctx context.Context, marshaler runtime.Marshaler } -func local_request_Query_Validators_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryValidatorsRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Validators_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.Validators(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_Validator_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryValidatorRequest var metadata runtime.ServerMetadata @@ -94,33 +75,6 @@ func request_Query_Validator_0(ctx context.Context, marshaler runtime.Marshaler, } -func local_request_Query_Validator_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryValidatorRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["validator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") - } - - protoReq.ValidatorAddr, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) - } - - msg, err := server.Validator(ctx, &protoReq) - return msg, metadata, err - -} - var ( filter_Query_ValidatorDelegations_0 = &utilities.DoubleArray{Encoding: map[string]int{"validator_addr": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -159,40 +113,6 @@ func request_Query_ValidatorDelegations_0(ctx context.Context, marshaler runtime } -func local_request_Query_ValidatorDelegations_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryValidatorDelegationsRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["validator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") - } - - protoReq.ValidatorAddr, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ValidatorDelegations_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.ValidatorDelegations(ctx, &protoReq) - return msg, metadata, err - -} - var ( filter_Query_ValidatorUnbondingDelegations_0 = &utilities.DoubleArray{Encoding: map[string]int{"validator_addr": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -231,40 +151,6 @@ func request_Query_ValidatorUnbondingDelegations_0(ctx context.Context, marshale } -func local_request_Query_ValidatorUnbondingDelegations_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryValidatorUnbondingDelegationsRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["validator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") - } - - protoReq.ValidatorAddr, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ValidatorUnbondingDelegations_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.ValidatorUnbondingDelegations(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_Delegation_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryDelegationRequest var metadata runtime.ServerMetadata @@ -303,44 +189,6 @@ func request_Query_Delegation_0(ctx context.Context, marshaler runtime.Marshaler } -func local_request_Query_Delegation_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDelegationRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["validator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") - } - - protoReq.ValidatorAddr, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) - } - - val, ok = pathParams["delegator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_addr") - } - - protoReq.DelegatorAddr, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_addr", err) - } - - msg, err := server.Delegation(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_UnbondingDelegation_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryUnbondingDelegationRequest var metadata runtime.ServerMetadata @@ -379,44 +227,6 @@ func request_Query_UnbondingDelegation_0(ctx context.Context, marshaler runtime. } -func local_request_Query_UnbondingDelegation_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryUnbondingDelegationRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["validator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") - } - - protoReq.ValidatorAddr, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) - } - - val, ok = pathParams["delegator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_addr") - } - - protoReq.DelegatorAddr, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_addr", err) - } - - msg, err := server.UnbondingDelegation(ctx, &protoReq) - return msg, metadata, err - -} - var ( filter_Query_DelegatorDelegations_0 = &utilities.DoubleArray{Encoding: map[string]int{"delegator_addr": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -455,8 +265,12 @@ func request_Query_DelegatorDelegations_0(ctx context.Context, marshaler runtime } -func local_request_Query_DelegatorDelegations_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDelegatorDelegationsRequest +var ( + filter_Query_DelegatorUnbondingDelegations_0 = &utilities.DoubleArray{Encoding: map[string]int{"delegator_addr": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_Query_DelegatorUnbondingDelegations_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDelegatorUnbondingDelegationsRequest var metadata runtime.ServerMetadata var ( @@ -480,21 +294,21 @@ func local_request_Query_DelegatorDelegations_0(ctx context.Context, marshaler r if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_DelegatorDelegations_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_DelegatorUnbondingDelegations_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DelegatorDelegations(ctx, &protoReq) + msg, err := client.DelegatorUnbondingDelegations(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } var ( - filter_Query_DelegatorUnbondingDelegations_0 = &utilities.DoubleArray{Encoding: map[string]int{"delegator_addr": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + filter_Query_Redelegations_0 = &utilities.DoubleArray{Encoding: map[string]int{"delegator_addr": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) -func request_Query_DelegatorUnbondingDelegations_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDelegatorUnbondingDelegationsRequest +func request_Query_Redelegations_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryRedelegationsRequest var metadata runtime.ServerMetadata var ( @@ -518,17 +332,21 @@ func request_Query_DelegatorUnbondingDelegations_0(ctx context.Context, marshale if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_DelegatorUnbondingDelegations_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Redelegations_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DelegatorUnbondingDelegations(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.Redelegations(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_Query_DelegatorUnbondingDelegations_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDelegatorUnbondingDelegationsRequest +var ( + filter_Query_DelegatorValidators_0 = &utilities.DoubleArray{Encoding: map[string]int{"delegator_addr": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_Query_DelegatorValidators_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDelegatorValidatorsRequest var metadata runtime.ServerMetadata var ( @@ -552,21 +370,17 @@ func local_request_Query_DelegatorUnbondingDelegations_0(ctx context.Context, ma if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_DelegatorUnbondingDelegations_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_DelegatorValidators_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.DelegatorUnbondingDelegations(ctx, &protoReq) + msg, err := client.DelegatorValidators(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -var ( - filter_Query_Redelegations_0 = &utilities.DoubleArray{Encoding: map[string]int{"delegator_addr": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - -func request_Query_Redelegations_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryRedelegationsRequest +func request_Query_DelegatorValidator_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDelegatorValidatorRequest var metadata runtime.ServerMetadata var ( @@ -587,20 +401,24 @@ func request_Query_Redelegations_0(ctx context.Context, marshaler runtime.Marsha return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_addr", err) } - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + val, ok = pathParams["validator_addr"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Redelegations_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + + protoReq.ValidatorAddr, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) } - msg, err := client.Redelegations(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.DelegatorValidator(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_Query_Redelegations_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryRedelegationsRequest +func request_Query_HistoricalInfo_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryHistoricalInfoRequest var metadata runtime.ServerMetadata var ( @@ -610,233 +428,24 @@ func local_request_Query_Redelegations_0(ctx context.Context, marshaler runtime. _ = err ) - val, ok = pathParams["delegator_addr"] + val, ok = pathParams["height"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_addr") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "height") } - protoReq.DelegatorAddr, err = runtime.Bytes(val) + protoReq.Height, err = runtime.Int64(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_addr", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Redelegations_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "height", err) } - msg, err := server.Redelegations(ctx, &protoReq) + msg, err := client.HistoricalInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -var ( - filter_Query_DelegatorValidators_0 = &utilities.DoubleArray{Encoding: map[string]int{"delegator_addr": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - -func request_Query_DelegatorValidators_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDelegatorValidatorsRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["delegator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_addr") - } - - protoReq.DelegatorAddr, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_addr", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_DelegatorValidators_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.DelegatorValidators(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_DelegatorValidators_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDelegatorValidatorsRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["delegator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_addr") - } - - protoReq.DelegatorAddr, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_addr", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_DelegatorValidators_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.DelegatorValidators(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_DelegatorValidator_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDelegatorValidatorRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["delegator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_addr") - } - - protoReq.DelegatorAddr, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_addr", err) - } - - val, ok = pathParams["validator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") - } - - protoReq.ValidatorAddr, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) - } - - msg, err := client.DelegatorValidator(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_DelegatorValidator_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDelegatorValidatorRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["delegator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_addr") - } - - protoReq.DelegatorAddr, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_addr", err) - } - - val, ok = pathParams["validator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") - } - - protoReq.ValidatorAddr, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) - } - - msg, err := server.DelegatorValidator(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_HistoricalInfo_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryHistoricalInfoRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["height"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "height") - } - - protoReq.Height, err = runtime.Int64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "height", err) - } - - msg, err := client.HistoricalInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_HistoricalInfo_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryHistoricalInfoRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["height"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "height") - } - - protoReq.Height, err = runtime.Int64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "height", err) - } - - msg, err := server.HistoricalInfo(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_Pool_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPoolRequest +func request_Query_Pool_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPoolRequest var metadata runtime.ServerMetadata msg, err := client.Pool(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -844,15 +453,6 @@ func request_Query_Pool_0(ctx context.Context, marshaler runtime.Marshaler, clie } -func local_request_Query_Pool_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPoolRequest - var metadata runtime.ServerMetadata - - msg, err := server.Pool(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryParamsRequest var metadata runtime.ServerMetadata @@ -862,304 +462,6 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl } -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_Validators_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Validators_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Validators_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Validator_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Validator_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Validator_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ValidatorDelegations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_ValidatorDelegations_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ValidatorDelegations_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ValidatorUnbondingDelegations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_ValidatorUnbondingDelegations_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ValidatorUnbondingDelegations_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Delegation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Delegation_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Delegation_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_UnbondingDelegation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_UnbondingDelegation_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_UnbondingDelegation_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_DelegatorDelegations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_DelegatorDelegations_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_DelegatorDelegations_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_DelegatorUnbondingDelegations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_DelegatorUnbondingDelegations_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_DelegatorUnbondingDelegations_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Redelegations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Redelegations_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Redelegations_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_DelegatorValidators_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_DelegatorValidators_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_DelegatorValidators_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_DelegatorValidator_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_DelegatorValidator_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_DelegatorValidator_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_HistoricalInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_HistoricalInfo_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_HistoricalInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Pool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Pool_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Pool_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index c0c875fb742c..c3defbc52ff0 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -1265,569 +1265,571 @@ func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_ func StakingDescription() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { d := &github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet{} var gzipped = []byte{ - // 8985 bytes of a gzipped FileDescriptorSet + // 9010 bytes of a gzipped FileDescriptorSet 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x74, 0x1c, 0xd7, - 0x75, 0x18, 0x67, 0x3f, 0x80, 0xdd, 0xbb, 0xf8, 0x58, 0x3c, 0x80, 0xd0, 0x72, 0x49, 0x02, 0xd4, - 0x48, 0x96, 0x28, 0x4a, 0x5a, 0x48, 0x14, 0x45, 0x51, 0x4b, 0xdb, 0x32, 0x16, 0x58, 0x82, 0x20, - 0xf1, 0xa5, 0x01, 0x40, 0xc9, 0x76, 0xd2, 0x3d, 0x83, 0xd9, 0x87, 0xc5, 0x88, 0xb3, 0x33, 0xa3, - 0x99, 0x59, 0x12, 0xa0, 0xed, 0x73, 0x94, 0xf8, 0xa3, 0xb1, 0xda, 0xd4, 0xce, 0xc7, 0x69, 0x65, - 0xc7, 0x72, 0x65, 0xbb, 0xad, 0x53, 0xa7, 0x6d, 0x92, 0x3a, 0x4d, 0x9b, 0xa6, 0xa7, 0x75, 0x5a, - 0x27, 0x71, 0xda, 0xa6, 0x47, 0x3a, 0x75, 0xdb, 0x34, 0xa7, 0xa5, 0x53, 0xd9, 0xa7, 0x75, 0x5c, - 0xb7, 0x49, 0x59, 0xf5, 0x53, 0x3f, 0x92, 0xf3, 0xbe, 0xe6, 0x63, 0x3f, 0xb0, 0xbb, 0x10, 0x25, - 0x5b, 0x27, 0xfa, 0x85, 0x7d, 0xf7, 0xdd, 0x7b, 0xdf, 0xbd, 0xf7, 0xdd, 0x7b, 0xdf, 0x7d, 0x6f, - 0xde, 0x0c, 0xe0, 0xe7, 0xce, 0xc3, 0x89, 0x9a, 0x65, 0xd5, 0x0c, 0x3c, 0x63, 0x3b, 0x96, 0x67, - 0x6d, 0x35, 0xb6, 0x67, 0xaa, 0xd8, 0xd5, 0x1c, 0xdd, 0xf6, 0x2c, 0xa7, 0x40, 0x61, 0x68, 0x94, - 0x61, 0x14, 0x04, 0x86, 0xbc, 0x0c, 0x63, 0x17, 0x74, 0x03, 0xcf, 0xfb, 0x88, 0xeb, 0xd8, 0x43, - 0xe7, 0x20, 0xb1, 0xad, 0x1b, 0x38, 0x27, 0x9d, 0x88, 0x9f, 0xcc, 0x9c, 0xbe, 0xbb, 0xd0, 0x44, - 0x54, 0x88, 0x52, 0xac, 0x11, 0xb0, 0x42, 0x29, 0xe4, 0xef, 0x24, 0x60, 0xbc, 0x4d, 0x2f, 0x42, - 0x90, 0x30, 0xd5, 0x3a, 0xe1, 0x28, 0x9d, 0x4c, 0x2b, 0xf4, 0x37, 0xca, 0xc1, 0xa0, 0xad, 0x6a, - 0x57, 0xd5, 0x1a, 0xce, 0xc5, 0x28, 0x58, 0x34, 0xd1, 0x14, 0x40, 0x15, 0xdb, 0xd8, 0xac, 0x62, - 0x53, 0xdb, 0xcb, 0xc5, 0x4f, 0xc4, 0x4f, 0xa6, 0x95, 0x10, 0x04, 0xdd, 0x0f, 0x63, 0x76, 0x63, - 0xcb, 0xd0, 0xb5, 0x4a, 0x08, 0x0d, 0x4e, 0xc4, 0x4f, 0x26, 0x95, 0x2c, 0xeb, 0x98, 0x0f, 0x90, - 0xef, 0x85, 0xd1, 0xeb, 0x58, 0xbd, 0x1a, 0x46, 0xcd, 0x50, 0xd4, 0x11, 0x02, 0x0e, 0x21, 0xce, - 0xc1, 0x50, 0x1d, 0xbb, 0xae, 0x5a, 0xc3, 0x15, 0x6f, 0xcf, 0xc6, 0xb9, 0x04, 0xd5, 0xfe, 0x44, - 0x8b, 0xf6, 0xcd, 0x9a, 0x67, 0x38, 0xd5, 0xc6, 0x9e, 0x8d, 0xd1, 0x2c, 0xa4, 0xb1, 0xd9, 0xa8, - 0x33, 0x0e, 0xc9, 0x0e, 0xf6, 0x2b, 0x9b, 0x8d, 0x7a, 0x33, 0x97, 0x14, 0x21, 0xe3, 0x2c, 0x06, - 0x5d, 0xec, 0x5c, 0xd3, 0x35, 0x9c, 0x1b, 0xa0, 0x0c, 0xee, 0x6d, 0x61, 0xb0, 0xce, 0xfa, 0x9b, - 0x79, 0x08, 0x3a, 0x34, 0x07, 0x69, 0xbc, 0xeb, 0x61, 0xd3, 0xd5, 0x2d, 0x33, 0x37, 0x48, 0x99, - 0xbc, 0xab, 0xcd, 0x2c, 0x62, 0xa3, 0xda, 0xcc, 0x22, 0xa0, 0x43, 0x67, 0x61, 0xd0, 0xb2, 0x3d, - 0xdd, 0x32, 0xdd, 0x5c, 0xea, 0x84, 0x74, 0x32, 0x73, 0xfa, 0x58, 0x5b, 0x47, 0x58, 0x65, 0x38, - 0x8a, 0x40, 0x46, 0x8b, 0x90, 0x75, 0xad, 0x86, 0xa3, 0xe1, 0x8a, 0x66, 0x55, 0x71, 0x45, 0x37, - 0xb7, 0xad, 0x5c, 0x9a, 0x32, 0x98, 0x6e, 0x55, 0x84, 0x22, 0xce, 0x59, 0x55, 0xbc, 0x68, 0x6e, - 0x5b, 0xca, 0x88, 0x1b, 0x69, 0xa3, 0x49, 0x18, 0x70, 0xf7, 0x4c, 0x4f, 0xdd, 0xcd, 0x0d, 0x51, - 0x0f, 0xe1, 0x2d, 0xf9, 0xd7, 0x06, 0x60, 0xb4, 0x17, 0x17, 0x3b, 0x0f, 0xc9, 0x6d, 0xa2, 0x65, - 0x2e, 0xd6, 0x8f, 0x0d, 0x18, 0x4d, 0xd4, 0x88, 0x03, 0x07, 0x34, 0xe2, 0x2c, 0x64, 0x4c, 0xec, - 0x7a, 0xb8, 0xca, 0x3c, 0x22, 0xde, 0xa3, 0x4f, 0x01, 0x23, 0x6a, 0x75, 0xa9, 0xc4, 0x81, 0x5c, - 0xea, 0x69, 0x18, 0xf5, 0x45, 0xaa, 0x38, 0xaa, 0x59, 0x13, 0xbe, 0x39, 0xd3, 0x4d, 0x92, 0x42, - 0x59, 0xd0, 0x29, 0x84, 0x4c, 0x19, 0xc1, 0x91, 0x36, 0x9a, 0x07, 0xb0, 0x4c, 0x6c, 0x6d, 0x57, - 0xaa, 0x58, 0x33, 0x72, 0xa9, 0x0e, 0x56, 0x5a, 0x25, 0x28, 0x2d, 0x56, 0xb2, 0x18, 0x54, 0x33, - 0xd0, 0xe3, 0x81, 0xab, 0x0d, 0x76, 0xf0, 0x94, 0x65, 0x16, 0x64, 0x2d, 0xde, 0xb6, 0x09, 0x23, - 0x0e, 0x26, 0x7e, 0x8f, 0xab, 0x5c, 0xb3, 0x34, 0x15, 0xa2, 0xd0, 0x55, 0x33, 0x85, 0x93, 0x31, - 0xc5, 0x86, 0x9d, 0x70, 0x13, 0xdd, 0x05, 0x3e, 0xa0, 0x42, 0xdd, 0x0a, 0x68, 0x16, 0x1a, 0x12, - 0xc0, 0x15, 0xb5, 0x8e, 0xf3, 0x37, 0x60, 0x24, 0x6a, 0x1e, 0x34, 0x01, 0x49, 0xd7, 0x53, 0x1d, - 0x8f, 0x7a, 0x61, 0x52, 0x61, 0x0d, 0x94, 0x85, 0x38, 0x36, 0xab, 0x34, 0xcb, 0x25, 0x15, 0xf2, - 0x13, 0xbd, 0x2f, 0x50, 0x38, 0x4e, 0x15, 0xbe, 0xa7, 0x75, 0x46, 0x23, 0x9c, 0x9b, 0xf5, 0xce, - 0x3f, 0x06, 0xc3, 0x11, 0x05, 0x7a, 0x1d, 0x5a, 0xfe, 0x30, 0x1c, 0x6e, 0xcb, 0x1a, 0x3d, 0x0d, - 0x13, 0x0d, 0x53, 0x37, 0x3d, 0xec, 0xd8, 0x0e, 0x26, 0x1e, 0xcb, 0x86, 0xca, 0xfd, 0x97, 0xc1, - 0x0e, 0x3e, 0xb7, 0x19, 0xc6, 0x66, 0x5c, 0x94, 0xf1, 0x46, 0x2b, 0xf0, 0x54, 0x3a, 0xf5, 0xdd, - 0xc1, 0xec, 0x73, 0xcf, 0x3d, 0xf7, 0x5c, 0x4c, 0x7e, 0x61, 0x00, 0x26, 0xda, 0xc5, 0x4c, 0xdb, - 0xf0, 0x9d, 0x84, 0x01, 0xb3, 0x51, 0xdf, 0xc2, 0x0e, 0x35, 0x52, 0x52, 0xe1, 0x2d, 0x34, 0x0b, - 0x49, 0x43, 0xdd, 0xc2, 0x46, 0x2e, 0x71, 0x42, 0x3a, 0x39, 0x72, 0xfa, 0xfe, 0x9e, 0xa2, 0xb2, - 0xb0, 0x44, 0x48, 0x14, 0x46, 0x89, 0xde, 0x0b, 0x09, 0x9e, 0xa2, 0x09, 0x87, 0x53, 0xbd, 0x71, + 0x75, 0x18, 0x67, 0x3f, 0x80, 0xdd, 0xbb, 0xf8, 0x58, 0x3c, 0x80, 0xd0, 0x72, 0x49, 0x02, 0xd0, + 0x48, 0x96, 0x28, 0x4a, 0x5a, 0x48, 0x14, 0x45, 0x51, 0xcb, 0xd8, 0x32, 0x16, 0x58, 0x82, 0x20, + 0xf1, 0xa5, 0x01, 0x48, 0x49, 0x76, 0xd2, 0x3d, 0x83, 0xd9, 0x87, 0xc5, 0x88, 0xb3, 0x33, 0xa3, + 0x99, 0x59, 0x12, 0xa0, 0xed, 0x73, 0x94, 0xf8, 0xa3, 0xb1, 0xda, 0xd4, 0x76, 0x93, 0xd3, 0xda, + 0xae, 0xe5, 0xca, 0x76, 0x5b, 0xa7, 0x4e, 0xdb, 0x24, 0x75, 0x9a, 0x36, 0x4d, 0x4f, 0x6b, 0x37, + 0x4e, 0xe2, 0xb4, 0x4d, 0x8f, 0x74, 0xea, 0xb6, 0x69, 0x4e, 0x4b, 0xa7, 0xb2, 0x4f, 0xeb, 0xb8, + 0x6e, 0x93, 0xb2, 0xea, 0xa7, 0x7e, 0xa4, 0xe7, 0x7d, 0xcd, 0xc7, 0x7e, 0x60, 0x77, 0x21, 0x4a, + 0xb6, 0x4e, 0xf4, 0x0b, 0xfb, 0xee, 0xbb, 0xf7, 0xbe, 0x7b, 0xef, 0xbb, 0xf7, 0xbd, 0xfb, 0xee, + 0xbc, 0x19, 0xc0, 0x6f, 0x9c, 0x83, 0x99, 0x9a, 0x65, 0xd5, 0x0c, 0x3c, 0x6b, 0x3b, 0x96, 0x67, + 0x6d, 0x35, 0xb6, 0x67, 0xab, 0xd8, 0xd5, 0x1c, 0xdd, 0xf6, 0x2c, 0xa7, 0x40, 0x61, 0x68, 0x94, + 0x61, 0x14, 0x04, 0x86, 0xbc, 0x02, 0x63, 0xe7, 0x75, 0x03, 0x2f, 0xf8, 0x88, 0x1b, 0xd8, 0x43, + 0x67, 0x21, 0xb1, 0xad, 0x1b, 0x38, 0x27, 0xcd, 0xc4, 0x4f, 0x64, 0x4e, 0xdd, 0x5d, 0x68, 0x22, + 0x2a, 0x44, 0x29, 0xd6, 0x09, 0x58, 0xa1, 0x14, 0xf2, 0x77, 0x13, 0x30, 0xde, 0xa6, 0x17, 0x21, + 0x48, 0x98, 0x6a, 0x9d, 0x70, 0x94, 0x4e, 0xa4, 0x15, 0xfa, 0x1b, 0xe5, 0x60, 0xd0, 0x56, 0xb5, + 0xab, 0x6a, 0x0d, 0xe7, 0x62, 0x14, 0x2c, 0x9a, 0x68, 0x0a, 0xa0, 0x8a, 0x6d, 0x6c, 0x56, 0xb1, + 0xa9, 0xed, 0xe5, 0xe2, 0x33, 0xf1, 0x13, 0x69, 0x25, 0x04, 0x41, 0xf7, 0xc3, 0x98, 0xdd, 0xd8, + 0x32, 0x74, 0xad, 0x12, 0x42, 0x83, 0x99, 0xf8, 0x89, 0xa4, 0x92, 0x65, 0x1d, 0x0b, 0x01, 0xf2, + 0xbd, 0x30, 0x7a, 0x1d, 0xab, 0x57, 0xc3, 0xa8, 0x19, 0x8a, 0x3a, 0x42, 0xc0, 0x21, 0xc4, 0x79, + 0x18, 0xaa, 0x63, 0xd7, 0x55, 0x6b, 0xb8, 0xe2, 0xed, 0xd9, 0x38, 0x97, 0xa0, 0xda, 0xcf, 0xb4, + 0x68, 0xdf, 0xac, 0x79, 0x86, 0x53, 0x6d, 0xee, 0xd9, 0x18, 0xcd, 0x41, 0x1a, 0x9b, 0x8d, 0x3a, + 0xe3, 0x90, 0xec, 0x60, 0xbf, 0xb2, 0xd9, 0xa8, 0x37, 0x73, 0x49, 0x11, 0x32, 0xce, 0x62, 0xd0, + 0xc5, 0xce, 0x35, 0x5d, 0xc3, 0xb9, 0x01, 0xca, 0xe0, 0xde, 0x16, 0x06, 0x1b, 0xac, 0xbf, 0x99, + 0x87, 0xa0, 0x43, 0xf3, 0x90, 0xc6, 0xbb, 0x1e, 0x36, 0x5d, 0xdd, 0x32, 0x73, 0x83, 0x94, 0xc9, + 0xbb, 0xda, 0xcc, 0x22, 0x36, 0xaa, 0xcd, 0x2c, 0x02, 0x3a, 0x74, 0x06, 0x06, 0x2d, 0xdb, 0xd3, + 0x2d, 0xd3, 0xcd, 0xa5, 0x66, 0xa4, 0x13, 0x99, 0x53, 0xc7, 0xda, 0x3a, 0xc2, 0x1a, 0xc3, 0x51, + 0x04, 0x32, 0x5a, 0x82, 0xac, 0x6b, 0x35, 0x1c, 0x0d, 0x57, 0x34, 0xab, 0x8a, 0x2b, 0xba, 0xb9, + 0x6d, 0xe5, 0xd2, 0x94, 0xc1, 0x74, 0xab, 0x22, 0x14, 0x71, 0xde, 0xaa, 0xe2, 0x25, 0x73, 0xdb, + 0x52, 0x46, 0xdc, 0x48, 0x1b, 0x4d, 0xc2, 0x80, 0xbb, 0x67, 0x7a, 0xea, 0x6e, 0x6e, 0x88, 0x7a, + 0x08, 0x6f, 0xc9, 0xbf, 0x36, 0x00, 0xa3, 0xbd, 0xb8, 0xd8, 0x39, 0x48, 0x6e, 0x13, 0x2d, 0x73, + 0xb1, 0x7e, 0x6c, 0xc0, 0x68, 0xa2, 0x46, 0x1c, 0x38, 0xa0, 0x11, 0xe7, 0x20, 0x63, 0x62, 0xd7, + 0xc3, 0x55, 0xe6, 0x11, 0xf1, 0x1e, 0x7d, 0x0a, 0x18, 0x51, 0xab, 0x4b, 0x25, 0x0e, 0xe4, 0x52, + 0x4f, 0xc3, 0xa8, 0x2f, 0x52, 0xc5, 0x51, 0xcd, 0x9a, 0xf0, 0xcd, 0xd9, 0x6e, 0x92, 0x14, 0xca, + 0x82, 0x4e, 0x21, 0x64, 0xca, 0x08, 0x8e, 0xb4, 0xd1, 0x02, 0x80, 0x65, 0x62, 0x6b, 0xbb, 0x52, + 0xc5, 0x9a, 0x91, 0x4b, 0x75, 0xb0, 0xd2, 0x1a, 0x41, 0x69, 0xb1, 0x92, 0xc5, 0xa0, 0x9a, 0x81, + 0x1e, 0x0f, 0x5c, 0x6d, 0xb0, 0x83, 0xa7, 0xac, 0xb0, 0x20, 0x6b, 0xf1, 0xb6, 0xcb, 0x30, 0xe2, + 0x60, 0xe2, 0xf7, 0xb8, 0xca, 0x35, 0x4b, 0x53, 0x21, 0x0a, 0x5d, 0x35, 0x53, 0x38, 0x19, 0x53, + 0x6c, 0xd8, 0x09, 0x37, 0xd1, 0x5d, 0xe0, 0x03, 0x2a, 0xd4, 0xad, 0x80, 0xae, 0x42, 0x43, 0x02, + 0xb8, 0xaa, 0xd6, 0x71, 0xfe, 0x06, 0x8c, 0x44, 0xcd, 0x83, 0x26, 0x20, 0xe9, 0x7a, 0xaa, 0xe3, + 0x51, 0x2f, 0x4c, 0x2a, 0xac, 0x81, 0xb2, 0x10, 0xc7, 0x66, 0x95, 0xae, 0x72, 0x49, 0x85, 0xfc, + 0x44, 0xef, 0x0d, 0x14, 0x8e, 0x53, 0x85, 0xef, 0x69, 0x9d, 0xd1, 0x08, 0xe7, 0x66, 0xbd, 0xf3, + 0x8f, 0xc1, 0x70, 0x44, 0x81, 0x5e, 0x87, 0x96, 0x3f, 0x08, 0x87, 0xdb, 0xb2, 0x46, 0x4f, 0xc3, + 0x44, 0xc3, 0xd4, 0x4d, 0x0f, 0x3b, 0xb6, 0x83, 0x89, 0xc7, 0xb2, 0xa1, 0x72, 0xff, 0x79, 0xb0, + 0x83, 0xcf, 0x5d, 0x0e, 0x63, 0x33, 0x2e, 0xca, 0x78, 0xa3, 0x15, 0x78, 0x32, 0x9d, 0xfa, 0xde, + 0x60, 0xf6, 0xf9, 0xe7, 0x9f, 0x7f, 0x3e, 0x26, 0x7f, 0x7d, 0x00, 0x26, 0xda, 0xc5, 0x4c, 0xdb, + 0xf0, 0x9d, 0x84, 0x01, 0xb3, 0x51, 0xdf, 0xc2, 0x0e, 0x35, 0x52, 0x52, 0xe1, 0x2d, 0x34, 0x07, + 0x49, 0x43, 0xdd, 0xc2, 0x46, 0x2e, 0x31, 0x23, 0x9d, 0x18, 0x39, 0x75, 0x7f, 0x4f, 0x51, 0x59, + 0x58, 0x26, 0x24, 0x0a, 0xa3, 0x44, 0xef, 0x81, 0x04, 0x5f, 0xa2, 0x09, 0x87, 0x93, 0xbd, 0x71, 0x20, 0xb1, 0xa4, 0x50, 0x3a, 0x74, 0x14, 0xd2, 0xe4, 0x2f, 0xf3, 0x8d, 0x01, 0x2a, 0x73, 0x8a, - 0x00, 0x88, 0x5f, 0xa0, 0x3c, 0xa4, 0x68, 0x98, 0x54, 0xb1, 0x58, 0xda, 0xfc, 0x36, 0x71, 0xac, + 0x00, 0x88, 0x5f, 0xa0, 0x3c, 0xa4, 0x68, 0x98, 0x54, 0xb1, 0xd8, 0xda, 0xfc, 0x36, 0x71, 0xac, 0x2a, 0xde, 0x56, 0x1b, 0x86, 0x57, 0xb9, 0xa6, 0x1a, 0x0d, 0x4c, 0x1d, 0x3e, 0xad, 0x0c, 0x71, - 0xe0, 0x15, 0x02, 0x43, 0xd3, 0x90, 0x61, 0x51, 0xa5, 0x9b, 0x55, 0xbc, 0x4b, 0xb3, 0x67, 0x52, - 0x61, 0x81, 0xb6, 0x48, 0x20, 0x64, 0xf8, 0x67, 0x5c, 0xcb, 0x14, 0xae, 0x49, 0x87, 0x20, 0x00, - 0x3a, 0xfc, 0x63, 0xcd, 0x89, 0xfb, 0x78, 0x7b, 0xf5, 0x9a, 0x7d, 0x4a, 0xfe, 0xd5, 0x18, 0x24, - 0x68, 0xbe, 0x18, 0x85, 0xcc, 0xc6, 0xfb, 0xd7, 0xca, 0x95, 0xf9, 0xd5, 0xcd, 0xd2, 0x52, 0x39, - 0x2b, 0xa1, 0x11, 0x00, 0x0a, 0xb8, 0xb0, 0xb4, 0x3a, 0xbb, 0x91, 0x8d, 0xf9, 0xed, 0xc5, 0x95, - 0x8d, 0xb3, 0x67, 0xb2, 0x71, 0x9f, 0x60, 0x93, 0x01, 0x12, 0x61, 0x84, 0x47, 0x4e, 0x67, 0x93, - 0x28, 0x0b, 0x43, 0x8c, 0xc1, 0xe2, 0xd3, 0xe5, 0xf9, 0xb3, 0x67, 0xb2, 0x03, 0x51, 0xc8, 0x23, - 0xa7, 0xb3, 0x83, 0x68, 0x18, 0xd2, 0x14, 0x52, 0x5a, 0x5d, 0x5d, 0xca, 0xa6, 0x7c, 0x9e, 0xeb, - 0x1b, 0xca, 0xe2, 0xca, 0x42, 0x36, 0xed, 0xf3, 0x5c, 0x50, 0x56, 0x37, 0xd7, 0xb2, 0xe0, 0x73, - 0x58, 0x2e, 0xaf, 0xaf, 0xcf, 0x2e, 0x94, 0xb3, 0x19, 0x1f, 0xa3, 0xf4, 0xfe, 0x8d, 0xf2, 0x7a, - 0x76, 0x28, 0x22, 0xd6, 0x23, 0xa7, 0xb3, 0xc3, 0xfe, 0x10, 0xe5, 0x95, 0xcd, 0xe5, 0xec, 0x08, - 0x1a, 0x83, 0x61, 0x36, 0x84, 0x10, 0x62, 0xb4, 0x09, 0x74, 0xf6, 0x4c, 0x36, 0x1b, 0x08, 0xc2, - 0xb8, 0x8c, 0x45, 0x00, 0x67, 0xcf, 0x64, 0x91, 0x3c, 0x07, 0x49, 0xea, 0x5d, 0x08, 0xc1, 0xc8, - 0xd2, 0x6c, 0xa9, 0xbc, 0x54, 0x59, 0x5d, 0xdb, 0x58, 0x5c, 0x5d, 0x99, 0x5d, 0xca, 0x4a, 0x01, - 0x4c, 0x29, 0x3f, 0xb9, 0xb9, 0xa8, 0x94, 0xe7, 0xb3, 0xb1, 0x30, 0x6c, 0xad, 0x3c, 0xbb, 0x51, - 0x9e, 0xcf, 0xc6, 0x65, 0x0d, 0x26, 0xda, 0xe5, 0xc9, 0xb6, 0x91, 0x11, 0x9a, 0xe2, 0x58, 0x87, - 0x29, 0xa6, 0xbc, 0x5a, 0xa6, 0xf8, 0xdb, 0x31, 0x18, 0x6f, 0xb3, 0x56, 0xb4, 0x1d, 0xe4, 0x09, - 0x48, 0x32, 0x17, 0x65, 0xab, 0xe7, 0x7d, 0x6d, 0x17, 0x1d, 0xea, 0xb0, 0x2d, 0x2b, 0x28, 0xa5, - 0x0b, 0x57, 0x10, 0xf1, 0x0e, 0x15, 0x04, 0x61, 0xd1, 0x92, 0xd3, 0x7f, 0xb4, 0x25, 0xa7, 0xb3, - 0x65, 0xef, 0x6c, 0x2f, 0xcb, 0x1e, 0x85, 0xf5, 0x97, 0xdb, 0x93, 0x6d, 0x72, 0xfb, 0x79, 0x18, - 0x6b, 0x61, 0xd4, 0x73, 0x8e, 0xfd, 0xa8, 0x04, 0xb9, 0x4e, 0xc6, 0xe9, 0x92, 0xe9, 0x62, 0x91, - 0x4c, 0x77, 0xbe, 0xd9, 0x82, 0x77, 0x76, 0x9e, 0x84, 0x96, 0xb9, 0xfe, 0xb2, 0x04, 0x93, 0xed, - 0x2b, 0xc5, 0xb6, 0x32, 0xbc, 0x17, 0x06, 0xea, 0xd8, 0xdb, 0xb1, 0x44, 0xb5, 0x74, 0x4f, 0x9b, - 0x35, 0x98, 0x74, 0x37, 0x4f, 0x36, 0xa7, 0x0a, 0x2f, 0xe2, 0xf1, 0x4e, 0xe5, 0x1e, 0x93, 0xa6, - 0x45, 0xd2, 0x4f, 0xc6, 0xe0, 0x70, 0x5b, 0xe6, 0x6d, 0x05, 0x3d, 0x0e, 0xa0, 0x9b, 0x76, 0xc3, - 0x63, 0x15, 0x11, 0x4b, 0xb0, 0x69, 0x0a, 0xa1, 0xc9, 0x8b, 0x24, 0xcf, 0x86, 0xe7, 0xf7, 0xc7, - 0x69, 0x3f, 0x30, 0x10, 0x45, 0x38, 0x17, 0x08, 0x9a, 0xa0, 0x82, 0x4e, 0x75, 0xd0, 0xb4, 0xc5, - 0x31, 0x1f, 0x82, 0xac, 0x66, 0xe8, 0xd8, 0xf4, 0x2a, 0xae, 0xe7, 0x60, 0xb5, 0xae, 0x9b, 0x35, - 0xba, 0x82, 0xa4, 0x8a, 0xc9, 0x6d, 0xd5, 0x70, 0xb1, 0x32, 0xca, 0xba, 0xd7, 0x45, 0x2f, 0xa1, - 0xa0, 0x0e, 0xe4, 0x84, 0x28, 0x06, 0x22, 0x14, 0xac, 0xdb, 0xa7, 0x90, 0x7f, 0x3a, 0x0d, 0x99, - 0x50, 0x5d, 0x8d, 0xee, 0x84, 0xa1, 0x67, 0xd4, 0x6b, 0x6a, 0x45, 0xec, 0x95, 0x98, 0x25, 0x32, - 0x04, 0xb6, 0xc6, 0xf7, 0x4b, 0x0f, 0xc1, 0x04, 0x45, 0xb1, 0x1a, 0x1e, 0x76, 0x2a, 0x9a, 0xa1, - 0xba, 0x2e, 0x35, 0x5a, 0x8a, 0xa2, 0x22, 0xd2, 0xb7, 0x4a, 0xba, 0xe6, 0x44, 0x0f, 0x7a, 0x14, - 0xc6, 0x29, 0x45, 0xbd, 0x61, 0x78, 0xba, 0x6d, 0xe0, 0x0a, 0xd9, 0xbd, 0xb9, 0x74, 0x25, 0xf1, - 0x25, 0x1b, 0x23, 0x18, 0xcb, 0x1c, 0x81, 0x48, 0xe4, 0xa2, 0x79, 0x38, 0x4e, 0xc9, 0x6a, 0xd8, - 0xc4, 0x8e, 0xea, 0xe1, 0x0a, 0x7e, 0xb6, 0xa1, 0x1a, 0x6e, 0x45, 0x35, 0xab, 0x95, 0x1d, 0xd5, - 0xdd, 0xc9, 0x4d, 0x10, 0x06, 0xa5, 0x58, 0x4e, 0x52, 0x8e, 0x10, 0xc4, 0x05, 0x8e, 0x57, 0xa6, - 0x68, 0xb3, 0x66, 0xf5, 0xa2, 0xea, 0xee, 0xa0, 0x22, 0x4c, 0x52, 0x2e, 0xae, 0xe7, 0xe8, 0x66, - 0xad, 0xa2, 0xed, 0x60, 0xed, 0x6a, 0xa5, 0xe1, 0x6d, 0x9f, 0xcb, 0x1d, 0x0d, 0x8f, 0x4f, 0x25, - 0x5c, 0xa7, 0x38, 0x73, 0x04, 0x65, 0xd3, 0xdb, 0x3e, 0x87, 0xd6, 0x61, 0x88, 0x4c, 0x46, 0x5d, - 0xbf, 0x81, 0x2b, 0xdb, 0x96, 0x43, 0x97, 0xc6, 0x91, 0x36, 0xa9, 0x29, 0x64, 0xc1, 0xc2, 0x2a, - 0x27, 0x58, 0xb6, 0xaa, 0xb8, 0x98, 0x5c, 0x5f, 0x2b, 0x97, 0xe7, 0x95, 0x8c, 0xe0, 0x72, 0xc1, - 0x72, 0x88, 0x43, 0xd5, 0x2c, 0xdf, 0xc0, 0x19, 0xe6, 0x50, 0x35, 0x4b, 0x98, 0xf7, 0x51, 0x18, - 0xd7, 0x34, 0xa6, 0xb3, 0xae, 0x55, 0xf8, 0x1e, 0xcb, 0xcd, 0x65, 0x23, 0xc6, 0xd2, 0xb4, 0x05, - 0x86, 0xc0, 0x7d, 0xdc, 0x45, 0x8f, 0xc3, 0xe1, 0xc0, 0x58, 0x61, 0xc2, 0xb1, 0x16, 0x2d, 0x9b, - 0x49, 0x1f, 0x85, 0x71, 0x7b, 0xaf, 0x95, 0x10, 0x45, 0x46, 0xb4, 0xf7, 0x9a, 0xc9, 0x1e, 0x83, - 0x09, 0x7b, 0xc7, 0x6e, 0xa5, 0x3b, 0x15, 0xa6, 0x43, 0xf6, 0x8e, 0xdd, 0x4c, 0xf8, 0x2e, 0xba, - 0xe1, 0x76, 0xb0, 0xa6, 0x7a, 0xb8, 0x9a, 0xbb, 0x23, 0x8c, 0x1e, 0xea, 0x40, 0x33, 0x90, 0xd5, - 0xb4, 0x0a, 0x36, 0xd5, 0x2d, 0x03, 0x57, 0x54, 0x07, 0x9b, 0xaa, 0x9b, 0x9b, 0x0e, 0x23, 0x8f, - 0x68, 0x5a, 0x99, 0xf6, 0xce, 0xd2, 0x4e, 0x74, 0x0a, 0xc6, 0xac, 0xad, 0x67, 0x34, 0xe6, 0x92, - 0x15, 0xdb, 0xc1, 0xdb, 0xfa, 0x6e, 0xee, 0x6e, 0x6a, 0xdf, 0x51, 0xd2, 0x41, 0x1d, 0x72, 0x8d, - 0x82, 0xd1, 0x7d, 0x90, 0xd5, 0xdc, 0x1d, 0xd5, 0xb1, 0x69, 0x4e, 0x76, 0x6d, 0x55, 0xc3, 0xb9, - 0x77, 0x31, 0x54, 0x06, 0x5f, 0x11, 0x60, 0x12, 0x12, 0xee, 0x75, 0x7d, 0xdb, 0x13, 0x1c, 0xef, - 0x65, 0x21, 0x41, 0x61, 0x9c, 0xdb, 0x49, 0xc8, 0x12, 0x53, 0x44, 0x06, 0x3e, 0x49, 0xd1, 0x46, - 0xec, 0x1d, 0x3b, 0x3c, 0xee, 0x5d, 0x30, 0x4c, 0x30, 0x83, 0x41, 0xef, 0x63, 0x05, 0x99, 0xbd, - 0x13, 0x1a, 0xf1, 0x0c, 0x4c, 0x12, 0xa4, 0x3a, 0xf6, 0xd4, 0xaa, 0xea, 0xa9, 0x21, 0xec, 0x07, - 0x28, 0x36, 0xb1, 0xfb, 0x32, 0xef, 0x8c, 0xc8, 0xe9, 0x34, 0xb6, 0xf6, 0x7c, 0xcf, 0x7a, 0x90, - 0xc9, 0x49, 0x60, 0xc2, 0xb7, 0xde, 0xb4, 0xa2, 0x5b, 0x2e, 0xc2, 0x50, 0xd8, 0xf1, 0x51, 0x1a, - 0x98, 0xeb, 0x67, 0x25, 0x52, 0x05, 0xcd, 0xad, 0xce, 0x93, 0xfa, 0xe5, 0x03, 0xe5, 0x6c, 0x8c, - 0xd4, 0x51, 0x4b, 0x8b, 0x1b, 0xe5, 0x8a, 0xb2, 0xb9, 0xb2, 0xb1, 0xb8, 0x5c, 0xce, 0xc6, 0x43, - 0x05, 0xfb, 0xa5, 0x44, 0xea, 0x9e, 0xec, 0xbd, 0xf2, 0x2b, 0x31, 0x18, 0x89, 0xee, 0xc0, 0xd0, - 0xbb, 0xe1, 0x0e, 0x71, 0x5c, 0xe2, 0x62, 0xaf, 0x72, 0x5d, 0x77, 0x68, 0x44, 0xd6, 0x55, 0xb6, - 0x3a, 0xfa, 0x3e, 0x31, 0xc1, 0xb1, 0xd6, 0xb1, 0xf7, 0x94, 0xee, 0x90, 0x78, 0xab, 0xab, 0x1e, - 0x5a, 0x82, 0x69, 0xd3, 0xaa, 0xb8, 0x9e, 0x6a, 0x56, 0x55, 0xa7, 0x5a, 0x09, 0x0e, 0xaa, 0x2a, - 0xaa, 0xa6, 0x61, 0xd7, 0xb5, 0xd8, 0x4a, 0xe8, 0x73, 0x39, 0x66, 0x5a, 0xeb, 0x1c, 0x39, 0x58, - 0x22, 0x66, 0x39, 0x6a, 0x93, 0xff, 0xc6, 0x3b, 0xf9, 0xef, 0x51, 0x48, 0xd7, 0x55, 0xbb, 0x82, - 0x4d, 0xcf, 0xd9, 0xa3, 0x75, 0x77, 0x4a, 0x49, 0xd5, 0x55, 0xbb, 0x4c, 0xda, 0x6f, 0xc9, 0xf6, - 0xe7, 0x52, 0x22, 0x95, 0xca, 0xa6, 0x2f, 0x25, 0x52, 0xe9, 0x2c, 0xc8, 0xaf, 0xc6, 0x61, 0x28, - 0x5c, 0x87, 0x93, 0x6d, 0x8d, 0x46, 0x97, 0x2c, 0x89, 0x26, 0xb5, 0xbb, 0xf6, 0xad, 0xda, 0x0b, - 0x73, 0x64, 0x2d, 0x2b, 0x0e, 0xb0, 0xea, 0x58, 0x61, 0x94, 0xa4, 0x8e, 0x20, 0xce, 0x86, 0x59, - 0x35, 0x92, 0x52, 0x78, 0x0b, 0x2d, 0xc0, 0xc0, 0x33, 0x2e, 0xe5, 0x3d, 0x40, 0x79, 0xdf, 0xbd, - 0x3f, 0xef, 0x4b, 0xeb, 0x94, 0x79, 0xfa, 0xd2, 0x7a, 0x65, 0x65, 0x55, 0x59, 0x9e, 0x5d, 0x52, - 0x38, 0x39, 0x3a, 0x02, 0x09, 0x43, 0xbd, 0xb1, 0x17, 0x5d, 0xf5, 0x28, 0xa8, 0xd7, 0x49, 0x38, - 0x02, 0x89, 0xeb, 0x58, 0xbd, 0x1a, 0x5d, 0x6b, 0x28, 0xe8, 0x4d, 0x0c, 0x86, 0x19, 0x48, 0x52, - 0x7b, 0x21, 0x00, 0x6e, 0xb1, 0xec, 0x21, 0x94, 0x82, 0xc4, 0xdc, 0xaa, 0x42, 0x02, 0x22, 0x0b, - 0x43, 0x0c, 0x5a, 0x59, 0x5b, 0x2c, 0xcf, 0x95, 0xb3, 0x31, 0xf9, 0x51, 0x18, 0x60, 0x46, 0x20, - 0xc1, 0xe2, 0x9b, 0x21, 0x7b, 0x88, 0x37, 0x39, 0x0f, 0x49, 0xf4, 0x6e, 0x2e, 0x97, 0xca, 0x4a, - 0x36, 0x16, 0x9d, 0xea, 0x44, 0x36, 0x29, 0xbb, 0x30, 0x14, 0x2e, 0xc4, 0xdf, 0x9a, 0x4d, 0xf6, - 0xd7, 0x24, 0xc8, 0x84, 0x0a, 0x6b, 0x52, 0x11, 0xa9, 0x86, 0x61, 0x5d, 0xaf, 0xa8, 0x86, 0xae, - 0xba, 0xdc, 0x35, 0x80, 0x82, 0x66, 0x09, 0xa4, 0xd7, 0xa9, 0x7b, 0x8b, 0x42, 0x24, 0x99, 0x1d, - 0x90, 0x3f, 0x2f, 0x41, 0xb6, 0xb9, 0xb2, 0x6d, 0x12, 0x53, 0xfa, 0x41, 0x8a, 0x29, 0x7f, 0x4e, - 0x82, 0x91, 0x68, 0x39, 0xdb, 0x24, 0xde, 0x9d, 0x3f, 0x50, 0xf1, 0xfe, 0x20, 0x06, 0xc3, 0x91, - 0x22, 0xb6, 0x57, 0xe9, 0x9e, 0x85, 0x31, 0xbd, 0x8a, 0xeb, 0xb6, 0xe5, 0x61, 0x53, 0xdb, 0xab, - 0x18, 0xf8, 0x1a, 0x36, 0x72, 0x32, 0x4d, 0x1a, 0x33, 0xfb, 0x97, 0xc9, 0x85, 0xc5, 0x80, 0x6e, - 0x89, 0x90, 0x15, 0xc7, 0x17, 0xe7, 0xcb, 0xcb, 0x6b, 0xab, 0x1b, 0xe5, 0x95, 0xb9, 0xf7, 0x57, - 0x36, 0x57, 0x2e, 0xaf, 0xac, 0x3e, 0xb5, 0xa2, 0x64, 0xf5, 0x26, 0xb4, 0x37, 0x31, 0xec, 0xd7, - 0x20, 0xdb, 0x2c, 0x14, 0xba, 0x03, 0xda, 0x89, 0x95, 0x3d, 0x84, 0xc6, 0x61, 0x74, 0x65, 0xb5, - 0xb2, 0xbe, 0x38, 0x5f, 0xae, 0x94, 0x2f, 0x5c, 0x28, 0xcf, 0x6d, 0xac, 0xb3, 0x83, 0x0f, 0x1f, - 0x7b, 0x23, 0x12, 0xe0, 0xf2, 0x67, 0xe3, 0x30, 0xde, 0x46, 0x12, 0x34, 0xcb, 0xb7, 0x2c, 0x6c, - 0x17, 0xf5, 0x60, 0x2f, 0xd2, 0x17, 0x48, 0xcd, 0xb0, 0xa6, 0x3a, 0x1e, 0xdf, 0xe1, 0xdc, 0x07, - 0xc4, 0x4a, 0xa6, 0xa7, 0x6f, 0xeb, 0xd8, 0xe1, 0xe7, 0x44, 0x6c, 0x1f, 0x33, 0x1a, 0xc0, 0xd9, - 0x51, 0xd1, 0x03, 0x80, 0x6c, 0xcb, 0xd5, 0x3d, 0xfd, 0x1a, 0xae, 0xe8, 0xa6, 0x38, 0x54, 0x22, - 0xfb, 0x9a, 0x84, 0x92, 0x15, 0x3d, 0x8b, 0xa6, 0xe7, 0x63, 0x9b, 0xb8, 0xa6, 0x36, 0x61, 0x93, - 0x64, 0x1e, 0x57, 0xb2, 0xa2, 0xc7, 0xc7, 0xbe, 0x13, 0x86, 0xaa, 0x56, 0x83, 0x14, 0x7b, 0x0c, - 0x8f, 0xac, 0x1d, 0x92, 0x92, 0x61, 0x30, 0x1f, 0x85, 0x97, 0xf1, 0xc1, 0x69, 0xd6, 0x90, 0x92, - 0x61, 0x30, 0x86, 0x72, 0x2f, 0x8c, 0xaa, 0xb5, 0x9a, 0x43, 0x98, 0x0b, 0x46, 0x6c, 0x63, 0x32, - 0xe2, 0x83, 0x29, 0x62, 0xfe, 0x12, 0xa4, 0x84, 0x1d, 0xc8, 0x52, 0x4d, 0x2c, 0x51, 0xb1, 0xd9, - 0x6e, 0x3b, 0x76, 0x32, 0xad, 0xa4, 0x4c, 0xd1, 0x79, 0x27, 0x0c, 0xe9, 0x6e, 0x25, 0x38, 0x9c, - 0x8f, 0x9d, 0x88, 0x9d, 0x4c, 0x29, 0x19, 0xdd, 0xf5, 0x0f, 0x36, 0xe5, 0x2f, 0xc7, 0x60, 0x24, - 0xfa, 0x70, 0x01, 0xcd, 0x43, 0xca, 0xb0, 0x34, 0x95, 0xba, 0x16, 0x7b, 0xb2, 0x75, 0xb2, 0xcb, - 0xf3, 0x88, 0xc2, 0x12, 0xc7, 0x57, 0x7c, 0xca, 0xfc, 0xbf, 0x92, 0x20, 0x25, 0xc0, 0x68, 0x12, - 0x12, 0xb6, 0xea, 0xed, 0x50, 0x76, 0xc9, 0x52, 0x2c, 0x2b, 0x29, 0xb4, 0x4d, 0xe0, 0xae, 0xad, - 0x9a, 0xd4, 0x05, 0x38, 0x9c, 0xb4, 0xc9, 0xbc, 0x1a, 0x58, 0xad, 0xd2, 0x5d, 0x8f, 0x55, 0xaf, - 0x63, 0xd3, 0x73, 0xc5, 0xbc, 0x72, 0xf8, 0x1c, 0x07, 0xa3, 0xfb, 0x61, 0xcc, 0x73, 0x54, 0xdd, - 0x88, 0xe0, 0x26, 0x28, 0x6e, 0x56, 0x74, 0xf8, 0xc8, 0x45, 0x38, 0x22, 0xf8, 0x56, 0xb1, 0xa7, - 0x6a, 0x3b, 0xb8, 0x1a, 0x10, 0x0d, 0xd0, 0xd3, 0x8d, 0x3b, 0x38, 0xc2, 0x3c, 0xef, 0x17, 0xb4, - 0xf2, 0x2b, 0x12, 0x8c, 0x89, 0x7d, 0x5a, 0xd5, 0x37, 0xd6, 0x32, 0x80, 0x6a, 0x9a, 0x96, 0x17, - 0x36, 0x57, 0xab, 0x2b, 0xb7, 0xd0, 0x15, 0x66, 0x7d, 0x22, 0x25, 0xc4, 0x20, 0x5f, 0x07, 0x08, - 0x7a, 0x3a, 0x9a, 0x6d, 0x1a, 0x32, 0xfc, 0xc9, 0x11, 0x7d, 0xfc, 0xc8, 0x76, 0xf6, 0xc0, 0x40, - 0x64, 0x43, 0x87, 0x26, 0x20, 0xb9, 0x85, 0x6b, 0xba, 0xc9, 0xcf, 0x83, 0x59, 0x43, 0x9c, 0xbf, - 0x24, 0xfc, 0xf3, 0x97, 0xd2, 0xa7, 0x24, 0x18, 0xd7, 0xac, 0x7a, 0xb3, 0xbc, 0xa5, 0x6c, 0xd3, - 0xf1, 0x82, 0x7b, 0x51, 0xfa, 0xc0, 0x7b, 0x6b, 0xba, 0xb7, 0xd3, 0xd8, 0x2a, 0x68, 0x56, 0x7d, - 0xa6, 0x66, 0x19, 0xaa, 0x59, 0x0b, 0x9e, 0x9f, 0xd2, 0x1f, 0xda, 0x83, 0x35, 0x6c, 0x3e, 0x58, - 0xb3, 0x42, 0x4f, 0x53, 0xcf, 0x07, 0x3f, 0xff, 0xaf, 0x24, 0x7d, 0x31, 0x16, 0x5f, 0x58, 0x2b, - 0x7d, 0x25, 0x96, 0x5f, 0x60, 0xc3, 0xad, 0x09, 0xf3, 0x28, 0x78, 0xdb, 0xc0, 0x1a, 0x51, 0x19, - 0xbe, 0x77, 0x3f, 0x4c, 0xd4, 0xac, 0x9a, 0x45, 0x39, 0xce, 0x90, 0x5f, 0xfc, 0x89, 0x6c, 0xda, - 0x87, 0xe6, 0xbb, 0x3e, 0xbe, 0x2d, 0xae, 0xc0, 0x38, 0x47, 0xae, 0xd0, 0x47, 0x42, 0x6c, 0x63, - 0x83, 0xf6, 0x3d, 0x56, 0xcb, 0xfd, 0xf2, 0x77, 0xe8, 0x82, 0xae, 0x8c, 0x71, 0x52, 0xd2, 0xc7, - 0xf6, 0x3e, 0x45, 0x05, 0x0e, 0x47, 0xf8, 0xb1, 0xb0, 0xc5, 0x4e, 0x17, 0x8e, 0xbf, 0xc9, 0x39, - 0x8e, 0x87, 0x38, 0xae, 0x73, 0xd2, 0xe2, 0x1c, 0x0c, 0xf7, 0xc3, 0xeb, 0xb7, 0x38, 0xaf, 0x21, - 0x1c, 0x66, 0xb2, 0x00, 0xa3, 0x94, 0x89, 0xd6, 0x70, 0x3d, 0xab, 0x4e, 0x73, 0xe2, 0xfe, 0x6c, - 0x7e, 0xfb, 0x3b, 0x2c, 0x8e, 0x46, 0x08, 0xd9, 0x9c, 0x4f, 0x55, 0x2c, 0x02, 0x7d, 0x0a, 0x56, - 0xc5, 0x9a, 0xd1, 0x85, 0xc3, 0x37, 0xb8, 0x20, 0x3e, 0x7e, 0xf1, 0x0a, 0x4c, 0x90, 0xdf, 0x34, - 0x65, 0x85, 0x25, 0xe9, 0x7e, 0x06, 0x97, 0x7b, 0xe5, 0xa3, 0x2c, 0x54, 0xc7, 0x7d, 0x06, 0x21, - 0x99, 0x42, 0xb3, 0x58, 0xc3, 0x9e, 0x87, 0x1d, 0xb7, 0xa2, 0x1a, 0xed, 0xc4, 0x0b, 0x1d, 0x62, - 0xe4, 0x3e, 0xf3, 0xfd, 0xe8, 0x2c, 0x2e, 0x30, 0xca, 0x59, 0xc3, 0x28, 0x6e, 0xc2, 0x1d, 0x6d, - 0xbc, 0xa2, 0x07, 0x9e, 0x9f, 0xe5, 0x3c, 0x27, 0x5a, 0x3c, 0x83, 0xb0, 0x5d, 0x03, 0x01, 0xf7, - 0xe7, 0xb2, 0x07, 0x9e, 0x3f, 0xc7, 0x79, 0x22, 0x4e, 0x2b, 0xa6, 0x94, 0x70, 0xbc, 0x04, 0x63, - 0xd7, 0xb0, 0xb3, 0x65, 0xb9, 0xfc, 0xe0, 0xa8, 0x07, 0x76, 0x9f, 0xe3, 0xec, 0x46, 0x39, 0x21, - 0x3d, 0x49, 0x22, 0xbc, 0x1e, 0x87, 0xd4, 0xb6, 0xaa, 0xe1, 0x1e, 0x58, 0xbc, 0xc8, 0x59, 0x0c, - 0x12, 0x7c, 0x42, 0x3a, 0x0b, 0x43, 0x35, 0x8b, 0xaf, 0x5a, 0xdd, 0xc9, 0x3f, 0xcf, 0xc9, 0x33, - 0x82, 0x86, 0xb3, 0xb0, 0x2d, 0xbb, 0x61, 0x90, 0x25, 0xad, 0x3b, 0x8b, 0xbf, 0x2a, 0x58, 0x08, - 0x1a, 0xce, 0xa2, 0x0f, 0xb3, 0xbe, 0x24, 0x58, 0xb8, 0x21, 0x7b, 0x3e, 0x01, 0x19, 0xcb, 0x34, - 0xf6, 0x2c, 0xb3, 0x17, 0x21, 0xbe, 0xc0, 0x39, 0x00, 0x27, 0x21, 0x0c, 0xce, 0x43, 0xba, 0xd7, - 0x89, 0xf8, 0xeb, 0xdf, 0x17, 0xe1, 0x21, 0x66, 0x60, 0x01, 0x46, 0x45, 0x82, 0xd2, 0x2d, 0xb3, - 0x07, 0x16, 0x7f, 0x83, 0xb3, 0x18, 0x09, 0x91, 0x71, 0x35, 0x3c, 0xec, 0x7a, 0x35, 0xdc, 0x0b, - 0x93, 0x2f, 0x0b, 0x35, 0x38, 0x09, 0x37, 0xe5, 0x16, 0x36, 0xb5, 0x9d, 0xde, 0x38, 0xfc, 0xbc, - 0x30, 0xa5, 0xa0, 0x21, 0x2c, 0xe6, 0x60, 0xb8, 0xae, 0x3a, 0xee, 0x8e, 0x6a, 0xf4, 0x34, 0x1d, - 0x7f, 0x93, 0xf3, 0x18, 0xf2, 0x89, 0xb8, 0x45, 0x1a, 0x66, 0x3f, 0x6c, 0xbe, 0x22, 0x2c, 0x12, - 0x22, 0xe3, 0xa1, 0xe7, 0x7a, 0xf4, 0x94, 0xad, 0x1f, 0x6e, 0xbf, 0x20, 0x42, 0x8f, 0xd1, 0x2e, - 0x87, 0x39, 0x9e, 0x87, 0xb4, 0xab, 0xdf, 0xe8, 0x89, 0xcd, 0xdf, 0x12, 0x33, 0x4d, 0x09, 0x08, - 0xf1, 0xfb, 0xe1, 0x48, 0xdb, 0x65, 0xa2, 0x07, 0x66, 0x7f, 0x9b, 0x33, 0x9b, 0x6c, 0xb3, 0x54, - 0xf0, 0x94, 0xd0, 0x2f, 0xcb, 0xbf, 0x23, 0x52, 0x02, 0x6e, 0xe2, 0xb5, 0x46, 0xf6, 0x11, 0xae, - 0xba, 0xdd, 0x9f, 0xd5, 0x7e, 0x51, 0x58, 0x8d, 0xd1, 0x46, 0xac, 0xb6, 0x01, 0x93, 0x9c, 0x63, - 0x7f, 0xf3, 0xfa, 0x4b, 0x22, 0xb1, 0x32, 0xea, 0xcd, 0xe8, 0xec, 0x7e, 0x10, 0xf2, 0xbe, 0x39, - 0x45, 0xc1, 0xea, 0x56, 0xea, 0xaa, 0xdd, 0x03, 0xe7, 0x5f, 0xe6, 0x9c, 0x45, 0xc6, 0xf7, 0x2b, - 0x5e, 0x77, 0x59, 0xb5, 0x09, 0xf3, 0xa7, 0x21, 0x27, 0x98, 0x37, 0x4c, 0x07, 0x6b, 0x56, 0xcd, - 0xd4, 0x6f, 0xe0, 0x6a, 0x0f, 0xac, 0xff, 0x6e, 0xd3, 0x54, 0x6d, 0x86, 0xc8, 0x09, 0xe7, 0x45, - 0xc8, 0xfa, 0xb5, 0x4a, 0x45, 0xaf, 0xdb, 0x96, 0xe3, 0x75, 0xe1, 0xf8, 0x55, 0x31, 0x53, 0x3e, - 0xdd, 0x22, 0x25, 0x2b, 0x96, 0x61, 0x84, 0x36, 0x7b, 0x75, 0xc9, 0x5f, 0xe1, 0x8c, 0x86, 0x03, - 0x2a, 0x9e, 0x38, 0x34, 0xab, 0x6e, 0xab, 0x4e, 0x2f, 0xf9, 0xef, 0xef, 0x89, 0xc4, 0xc1, 0x49, - 0x78, 0xe2, 0xf0, 0xf6, 0x6c, 0x4c, 0x56, 0xfb, 0x1e, 0x38, 0xfc, 0xaa, 0x48, 0x1c, 0x82, 0x86, - 0xb3, 0x10, 0x05, 0x43, 0x0f, 0x2c, 0xfe, 0xbe, 0x60, 0x21, 0x68, 0x08, 0x8b, 0x27, 0x83, 0x85, - 0xd6, 0xc1, 0x35, 0xdd, 0xf5, 0x1c, 0x56, 0x26, 0xef, 0xcf, 0xea, 0x1f, 0x7c, 0x3f, 0x5a, 0x84, - 0x29, 0x21, 0x52, 0x92, 0x89, 0xf8, 0xb1, 0x2b, 0xdd, 0x45, 0x75, 0x17, 0xec, 0xd7, 0x44, 0x26, - 0x0a, 0x91, 0x11, 0xd9, 0x42, 0x15, 0x22, 0x31, 0xbb, 0x46, 0xf6, 0x0e, 0x3d, 0xb0, 0xfb, 0x87, - 0x4d, 0xc2, 0xad, 0x0b, 0x5a, 0xc2, 0x33, 0x54, 0xff, 0x34, 0xcc, 0xab, 0x78, 0xaf, 0x27, 0xef, - 0xfc, 0xf5, 0xa6, 0xfa, 0x67, 0x93, 0x51, 0xb2, 0x1c, 0x32, 0xda, 0x54, 0x4f, 0xa1, 0x6e, 0xf7, - 0x87, 0x72, 0x3f, 0xf6, 0x1a, 0xd7, 0x37, 0x5a, 0x4e, 0x15, 0x97, 0x88, 0x93, 0x47, 0x8b, 0x9e, - 0xee, 0xcc, 0x3e, 0xfa, 0x9a, 0xef, 0xe7, 0x91, 0x9a, 0xa7, 0x78, 0x01, 0x86, 0x23, 0x05, 0x4f, - 0x77, 0x56, 0x1f, 0xe3, 0xac, 0x86, 0xc2, 0xf5, 0x4e, 0xf1, 0x51, 0x48, 0x90, 0xe2, 0xa5, 0x3b, - 0xf9, 0xc7, 0x39, 0x39, 0x45, 0x2f, 0xbe, 0x07, 0x52, 0xa2, 0x68, 0xe9, 0x4e, 0xfa, 0x09, 0x4e, - 0xea, 0x93, 0x10, 0x72, 0x51, 0xb0, 0x74, 0x27, 0xff, 0xf3, 0x82, 0x5c, 0x90, 0x10, 0xf2, 0xde, - 0x4d, 0xf8, 0xb5, 0xbf, 0x90, 0xe0, 0x8b, 0x8e, 0xb0, 0xdd, 0x79, 0x18, 0xe4, 0x95, 0x4a, 0x77, - 0xea, 0x4f, 0xf2, 0xc1, 0x05, 0x45, 0xf1, 0x31, 0x48, 0xf6, 0x68, 0xf0, 0x9f, 0xe4, 0xa4, 0x0c, - 0xbf, 0x38, 0x07, 0x99, 0x50, 0x75, 0xd2, 0x9d, 0xfc, 0x2f, 0x71, 0xf2, 0x30, 0x15, 0x11, 0x9d, - 0x57, 0x27, 0xdd, 0x19, 0x7c, 0x4a, 0x88, 0xce, 0x29, 0x88, 0xd9, 0x44, 0x61, 0xd2, 0x9d, 0xfa, - 0xd3, 0xc2, 0xea, 0x82, 0xa4, 0xf8, 0x04, 0xa4, 0xfd, 0xc5, 0xa6, 0x3b, 0xfd, 0x4f, 0x71, 0xfa, - 0x80, 0x86, 0x58, 0x20, 0xb4, 0xd8, 0x75, 0x67, 0xf1, 0xd3, 0xc2, 0x02, 0x21, 0x2a, 0x12, 0x46, - 0xcd, 0x05, 0x4c, 0x77, 0x4e, 0x3f, 0x23, 0xc2, 0xa8, 0xa9, 0x7e, 0x21, 0xb3, 0x49, 0x73, 0x7e, - 0x77, 0x16, 0x3f, 0x2b, 0x66, 0x93, 0xe2, 0x13, 0x31, 0x9a, 0x2b, 0x82, 0xee, 0x3c, 0xfe, 0x8a, - 0x10, 0xa3, 0xa9, 0x20, 0x28, 0xae, 0x01, 0x6a, 0xad, 0x06, 0xba, 0xf3, 0x7b, 0x81, 0xf3, 0x1b, - 0x6b, 0x29, 0x06, 0x8a, 0x4f, 0xc1, 0x64, 0xfb, 0x4a, 0xa0, 0x3b, 0xd7, 0xcf, 0xbc, 0xd6, 0xb4, - 0x77, 0x0b, 0x17, 0x02, 0xc5, 0x8d, 0x60, 0x49, 0x09, 0x57, 0x01, 0xdd, 0xd9, 0x7e, 0xf6, 0xb5, - 0x68, 0xe2, 0x0e, 0x17, 0x01, 0xc5, 0x59, 0x80, 0x60, 0x01, 0xee, 0xce, 0xeb, 0x73, 0x9c, 0x57, - 0x88, 0x88, 0x84, 0x06, 0x5f, 0x7f, 0xbb, 0xd3, 0xbf, 0x28, 0x42, 0x83, 0x53, 0x90, 0xd0, 0x10, - 0x4b, 0x6f, 0x77, 0xea, 0xcf, 0x8b, 0xd0, 0x10, 0x24, 0xc4, 0xb3, 0x43, 0xab, 0x5b, 0x77, 0x0e, - 0x5f, 0x10, 0x9e, 0x1d, 0xa2, 0x2a, 0xae, 0xc0, 0x58, 0xcb, 0x82, 0xd8, 0x9d, 0xd5, 0x17, 0x39, - 0xab, 0x6c, 0xf3, 0x7a, 0x18, 0x5e, 0xbc, 0xf8, 0x62, 0xd8, 0x9d, 0xdb, 0x97, 0x9a, 0x16, 0x2f, - 0xbe, 0x16, 0x16, 0xcf, 0x43, 0xca, 0x6c, 0x18, 0x06, 0x09, 0x1e, 0xb4, 0xff, 0x9d, 0xbf, 0xdc, - 0x1f, 0xbe, 0xce, 0xad, 0x23, 0x08, 0x8a, 0x8f, 0x42, 0x12, 0xd7, 0xb7, 0x70, 0xb5, 0x1b, 0xe5, - 0xf7, 0x5e, 0x17, 0x09, 0x93, 0x60, 0x17, 0x9f, 0x00, 0x60, 0x47, 0x23, 0xf4, 0xf1, 0x60, 0x17, - 0xda, 0xff, 0xfa, 0x3a, 0xbf, 0x8d, 0x13, 0x90, 0x04, 0x0c, 0xd8, 0xdd, 0x9e, 0xfd, 0x19, 0x7c, - 0x3f, 0xca, 0x80, 0xce, 0xc8, 0xe3, 0x30, 0xf8, 0x8c, 0x6b, 0x99, 0x9e, 0x5a, 0xeb, 0x46, 0xfd, - 0xdf, 0x38, 0xb5, 0xc0, 0x27, 0x06, 0xab, 0x5b, 0x0e, 0xf6, 0xd4, 0x9a, 0xdb, 0x8d, 0xf6, 0xbf, - 0x73, 0x5a, 0x9f, 0x80, 0x10, 0x6b, 0xaa, 0xeb, 0xf5, 0xa2, 0xf7, 0x1f, 0x09, 0x62, 0x41, 0x40, - 0x84, 0x26, 0xbf, 0xaf, 0xe2, 0xbd, 0x6e, 0xb4, 0x7f, 0x2c, 0x84, 0xe6, 0xf8, 0xc5, 0xf7, 0x40, - 0x9a, 0xfc, 0x64, 0x57, 0xec, 0xba, 0x10, 0xff, 0x0f, 0x4e, 0x1c, 0x50, 0x90, 0x91, 0x5d, 0xaf, - 0xea, 0xe9, 0xdd, 0x8d, 0x7d, 0x8b, 0xcf, 0xb4, 0xc0, 0x2f, 0xce, 0x42, 0xc6, 0xf5, 0xaa, 0xd5, - 0x06, 0xaf, 0x4f, 0xbb, 0x90, 0xff, 0xcf, 0xd7, 0xfd, 0x23, 0x0b, 0x9f, 0x86, 0xcc, 0xf6, 0xf5, - 0xab, 0x9e, 0x6d, 0xd1, 0x47, 0x20, 0xdd, 0x38, 0xbc, 0xc6, 0x39, 0x84, 0x48, 0x8a, 0x73, 0x30, - 0x44, 0x74, 0x71, 0xb0, 0x8d, 0xe9, 0xf3, 0xaa, 0x2e, 0x2c, 0xfe, 0x17, 0x37, 0x40, 0x84, 0xa8, - 0xf4, 0xa3, 0xdf, 0x78, 0x75, 0x4a, 0x7a, 0xf9, 0xd5, 0x29, 0xe9, 0x0f, 0x5e, 0x9d, 0x92, 0x3e, - 0xfd, 0xed, 0xa9, 0x43, 0x2f, 0x7f, 0x7b, 0xea, 0xd0, 0xef, 0x7d, 0x7b, 0xea, 0x50, 0xfb, 0x63, - 0x63, 0x58, 0xb0, 0x16, 0x2c, 0x76, 0x60, 0xfc, 0x01, 0x39, 0x72, 0x5c, 0x5c, 0xb3, 0x82, 0xd3, - 0x5a, 0x7f, 0x93, 0x03, 0x1f, 0x8b, 0xc3, 0x94, 0x66, 0xb9, 0x75, 0xcb, 0x9d, 0xd9, 0x52, 0x5d, - 0x3c, 0x73, 0xed, 0xe1, 0x2d, 0xec, 0xa9, 0x0f, 0xcf, 0x68, 0x96, 0x6e, 0xf2, 0x63, 0xdf, 0x71, - 0xd6, 0x5f, 0x20, 0xfd, 0x05, 0xde, 0x9f, 0x6f, 0x7b, 0x42, 0x2c, 0x2f, 0x40, 0x62, 0xce, 0xd2, - 0x4d, 0x34, 0x01, 0xc9, 0x2a, 0x36, 0xad, 0x3a, 0xbf, 0x01, 0xc6, 0x1a, 0xe8, 0x2e, 0x18, 0x50, - 0xeb, 0x56, 0xc3, 0xf4, 0xd8, 0x71, 0x79, 0x29, 0xf3, 0x8d, 0x9b, 0xd3, 0x87, 0x7e, 0xff, 0xe6, - 0x74, 0x7c, 0xd1, 0xf4, 0x14, 0xde, 0x55, 0x4c, 0x7c, 0xf7, 0xa5, 0x69, 0x49, 0xbe, 0x04, 0x83, - 0xf3, 0x58, 0x3b, 0x08, 0xaf, 0x79, 0xac, 0x35, 0xf1, 0xba, 0x0f, 0x52, 0x8b, 0xa6, 0xc7, 0xee, - 0xe8, 0x1d, 0x87, 0xb8, 0x6e, 0xb2, 0x5b, 0x1f, 0x4d, 0xe3, 0x13, 0x38, 0x41, 0x9d, 0xc7, 0x9a, - 0x8f, 0x5a, 0xc5, 0x5a, 0x33, 0x2a, 0x61, 0x4f, 0xe0, 0xa5, 0xf9, 0xdf, 0xfb, 0x4f, 0x53, 0x87, - 0x9e, 0x7b, 0x75, 0xea, 0x50, 0xa7, 0xf9, 0x89, 0x98, 0x9f, 0x9b, 0x98, 0xfd, 0x79, 0xd0, 0xad, - 0x5e, 0x9d, 0x21, 0xa1, 0xe5, 0x6e, 0x0d, 0x50, 0xbb, 0x3d, 0x02, 0x9f, 0x8e, 0xc1, 0x74, 0xf3, - 0x91, 0x3a, 0xf1, 0x63, 0xd7, 0x53, 0xeb, 0x76, 0xa7, 0x17, 0xa2, 0xce, 0x43, 0x7a, 0x43, 0xe0, - 0xa0, 0x1c, 0x0c, 0xba, 0x58, 0xb3, 0xcc, 0xaa, 0x4b, 0x45, 0x8e, 0x2b, 0xa2, 0x49, 0x0c, 0x68, - 0xaa, 0xa6, 0xe5, 0xf2, 0xfb, 0x9a, 0xac, 0x51, 0xfa, 0xcb, 0x52, 0x7f, 0x8e, 0x35, 0xe2, 0x0f, - 0x45, 0xcd, 0xb3, 0x26, 0x7d, 0xe0, 0xfe, 0xfd, 0x9e, 0x46, 0x50, 0xf5, 0x02, 0x15, 0x42, 0x8f, - 0x1e, 0xa6, 0x9a, 0x1f, 0x3d, 0x3c, 0x85, 0x0d, 0xe3, 0xb2, 0x69, 0x5d, 0x37, 0x37, 0x22, 0x26, - 0xf9, 0x5d, 0x09, 0x4e, 0xd0, 0x8b, 0xe8, 0x4e, 0x5d, 0x37, 0xbd, 0x19, 0x43, 0xdf, 0x72, 0x67, - 0xb6, 0x74, 0xcf, 0x65, 0x96, 0xe3, 0x36, 0x99, 0x08, 0x30, 0x0a, 0x04, 0xa3, 0x40, 0x30, 0xe4, - 0x33, 0x90, 0x2a, 0xe9, 0xde, 0xac, 0xe3, 0xa8, 0x7b, 0x08, 0x41, 0x82, 0xc0, 0xb8, 0x51, 0xe8, - 0x6f, 0x62, 0x11, 0x6c, 0xe0, 0xba, 0x4b, 0x1f, 0x7a, 0x25, 0x14, 0xd6, 0x28, 0x6d, 0x76, 0x9c, - 0xc9, 0xf3, 0x21, 0x4d, 0x43, 0x22, 0x85, 0x7e, 0xb2, 0x48, 0x68, 0x27, 0xae, 0xaf, 0xcf, 0x57, - 0x12, 0x70, 0x3c, 0x84, 0xa0, 0x39, 0x7b, 0xb6, 0x47, 0x43, 0xd2, 0xda, 0xe6, 0xca, 0x8c, 0x85, - 0x94, 0x61, 0xdd, 0x1d, 0xc2, 0x6c, 0x1b, 0x92, 0x6b, 0x84, 0x8e, 0x28, 0xe2, 0x59, 0x9e, 0x6a, - 0x70, 0xed, 0x58, 0x83, 0x40, 0xd9, 0x65, 0xfc, 0x18, 0x83, 0xea, 0xe2, 0x1e, 0xbe, 0x81, 0xd5, - 0x6d, 0x76, 0xf9, 0x31, 0x4e, 0x9f, 0x7d, 0xa6, 0x08, 0x80, 0xde, 0x73, 0x9c, 0x80, 0xa4, 0xda, - 0x60, 0x8f, 0xed, 0xe2, 0x27, 0x87, 0x14, 0xd6, 0x90, 0x2f, 0xc3, 0x20, 0x7f, 0x54, 0x80, 0xb2, - 0x10, 0xbf, 0x8a, 0xf7, 0xe8, 0x38, 0x43, 0x0a, 0xf9, 0x89, 0x0a, 0x90, 0xa4, 0xc2, 0xf3, 0x5b, - 0xdd, 0xb9, 0x42, 0x8b, 0xf4, 0x05, 0x2a, 0xa4, 0xc2, 0xd0, 0xe4, 0x4b, 0x90, 0x9a, 0xb7, 0xea, - 0xba, 0x69, 0x45, 0xb9, 0xa5, 0x19, 0x37, 0x2a, 0xb3, 0xdd, 0xe0, 0xe1, 0xac, 0xb0, 0x06, 0x9a, - 0x84, 0x01, 0x76, 0x19, 0x96, 0x3f, 0x7a, 0xe4, 0x2d, 0x79, 0x0e, 0x06, 0x29, 0xef, 0x55, 0x9b, - 0xcc, 0xaf, 0x7f, 0x11, 0x29, 0xcd, 0xdf, 0x78, 0xe0, 0xec, 0x63, 0x81, 0xb0, 0x08, 0x12, 0x55, - 0xd5, 0x53, 0xb9, 0xde, 0xf4, 0xb7, 0xfc, 0x5e, 0x48, 0x71, 0x26, 0x2e, 0x3a, 0x0d, 0x71, 0xcb, - 0x76, 0xf9, 0xc3, 0xc3, 0x7c, 0x27, 0x55, 0x56, 0xed, 0x52, 0x82, 0x24, 0x02, 0x85, 0x20, 0x97, - 0x94, 0x8e, 0xfe, 0x72, 0xae, 0x7f, 0x7f, 0x61, 0xc3, 0xf8, 0xce, 0xf2, 0x85, 0x18, 0x4c, 0x85, - 0x7a, 0xaf, 0x61, 0x87, 0xd4, 0xcb, 0x11, 0xd7, 0x47, 0x21, 0x21, 0x79, 0x7f, 0x07, 0x77, 0x79, - 0x0f, 0xc4, 0x67, 0x6d, 0x1b, 0xe5, 0x21, 0xc5, 0x1e, 0x12, 0x5a, 0xcc, 0x5f, 0x12, 0x8a, 0xdf, - 0x26, 0x7d, 0xae, 0xb5, 0xed, 0x5d, 0x57, 0x1d, 0xff, 0x35, 0x10, 0xd1, 0x96, 0x1f, 0x87, 0xf4, - 0x9c, 0x65, 0xba, 0xd8, 0x74, 0x1b, 0x34, 0x74, 0xb6, 0x0c, 0x4b, 0xbb, 0xca, 0x39, 0xb0, 0x06, - 0x31, 0xb8, 0x6a, 0xdb, 0x94, 0x32, 0xa1, 0x90, 0x9f, 0x2c, 0xf5, 0x96, 0xd6, 0x3b, 0x9a, 0xe8, - 0xf1, 0xfe, 0x4d, 0xc4, 0x95, 0xf4, 0x6d, 0xf4, 0xeb, 0x47, 0xe0, 0x58, 0x98, 0x94, 0x65, 0x9c, - 0x90, 0x85, 0xb2, 0x21, 0x0b, 0x51, 0x78, 0x7b, 0xfb, 0xe4, 0xbb, 0x65, 0xde, 0x7c, 0xd7, 0x3c, - 0x94, 0xdf, 0x3f, 0xb2, 0xf3, 0x5d, 0xe6, 0x52, 0x7e, 0x1c, 0x86, 0xd7, 0x54, 0xc7, 0x5b, 0xc7, - 0xde, 0x45, 0xac, 0x56, 0xb1, 0x13, 0x0d, 0xec, 0x61, 0x11, 0xd8, 0x08, 0x12, 0x34, 0x7a, 0x99, - 0x63, 0xd3, 0xdf, 0xf2, 0x0e, 0x24, 0xe8, 0x45, 0x03, 0x3f, 0xe8, 0x39, 0x05, 0x0b, 0x7a, 0x32, - 0x5d, 0x7b, 0x1e, 0x76, 0x39, 0x09, 0x6b, 0xa0, 0x33, 0x22, 0x74, 0xe3, 0xfb, 0x87, 0x2e, 0xf7, - 0x76, 0x1e, 0xc0, 0x06, 0x0c, 0x96, 0xc8, 0x6c, 0x2f, 0xce, 0xfb, 0x82, 0x48, 0x81, 0x20, 0x68, - 0x19, 0x46, 0x6d, 0xd5, 0xf1, 0xe8, 0x0d, 0xcb, 0x1d, 0xaa, 0x05, 0xcf, 0x0c, 0xd3, 0x85, 0xe6, - 0x79, 0x28, 0x44, 0x94, 0xe5, 0xa3, 0x0c, 0xdb, 0x61, 0xa0, 0xfc, 0x9f, 0x13, 0x30, 0xc0, 0x8d, - 0xf1, 0x1e, 0x18, 0xe4, 0x46, 0xa3, 0x03, 0x66, 0x4e, 0x1f, 0x2f, 0xb4, 0xfa, 0x7e, 0xc1, 0xf7, - 0x51, 0xce, 0x4f, 0xd0, 0xa0, 0x7b, 0x20, 0xa5, 0xed, 0xa8, 0xba, 0x59, 0xd1, 0xab, 0xa2, 0x58, - 0x78, 0xf5, 0xe6, 0xf4, 0xe0, 0x1c, 0x81, 0x2d, 0xce, 0x2b, 0x83, 0xb4, 0x73, 0xb1, 0x4a, 0x92, - 0xcd, 0x0e, 0xd6, 0x6b, 0x3b, 0x2c, 0xd9, 0xc4, 0x15, 0xde, 0x42, 0xe7, 0x20, 0x41, 0x1c, 0x82, - 0x5f, 0xc0, 0xcf, 0xb7, 0x14, 0x71, 0xfe, 0xc2, 0x58, 0x4a, 0x91, 0x81, 0x3f, 0xfd, 0xad, 0x69, - 0x49, 0xa1, 0x14, 0x68, 0x0e, 0x86, 0x0d, 0xd5, 0xf5, 0x2a, 0x34, 0x48, 0xc8, 0xf0, 0x49, 0xca, - 0xe2, 0x48, 0xab, 0x41, 0xb8, 0x61, 0xb9, 0xe8, 0x19, 0x42, 0xc5, 0x40, 0x55, 0x74, 0x12, 0xb2, - 0x94, 0x89, 0x66, 0xd5, 0xeb, 0xba, 0xc7, 0xd2, 0xf7, 0x00, 0xb5, 0xfb, 0x08, 0x81, 0xcf, 0x51, - 0x30, 0x4d, 0xe2, 0x47, 0x21, 0x4d, 0x6f, 0xfc, 0x52, 0x14, 0x76, 0xbb, 0x25, 0x45, 0x00, 0xb4, - 0xf3, 0x5e, 0x18, 0xbd, 0xa6, 0x1a, 0x7a, 0x55, 0xf5, 0x2c, 0xc7, 0x65, 0x28, 0x29, 0xc6, 0x25, - 0x00, 0x53, 0xc4, 0x87, 0x60, 0xc2, 0xc4, 0xbb, 0xf4, 0xbe, 0x4d, 0x04, 0x3b, 0x4d, 0xb1, 0x11, - 0xe9, 0xbb, 0x12, 0xa5, 0x78, 0x17, 0x8c, 0x68, 0xc2, 0xf8, 0x0c, 0x17, 0x28, 0xee, 0xb0, 0x0f, - 0xa5, 0x68, 0x47, 0x20, 0xa5, 0xda, 0x36, 0x43, 0xc8, 0x50, 0x84, 0x41, 0xd5, 0xb6, 0x69, 0xd7, - 0x29, 0x18, 0xa3, 0x3a, 0x3a, 0xd8, 0x6d, 0x18, 0x1e, 0x67, 0x32, 0x44, 0x71, 0x46, 0x49, 0x87, - 0xc2, 0xe0, 0x14, 0xf7, 0x2e, 0x18, 0xc6, 0xd7, 0xf4, 0x2a, 0x36, 0x35, 0xcc, 0xf0, 0x86, 0x29, - 0xde, 0x90, 0x00, 0x52, 0xa4, 0xfb, 0x20, 0x6b, 0x3b, 0x96, 0x6d, 0xb9, 0xd8, 0xa9, 0xa8, 0xd5, - 0xaa, 0x83, 0x5d, 0x37, 0x37, 0xc2, 0xf8, 0x09, 0xf8, 0x2c, 0x03, 0xcb, 0x0f, 0x40, 0x62, 0x5e, - 0xf5, 0x54, 0x92, 0xc3, 0xbc, 0x5d, 0xb6, 0x04, 0x0c, 0x29, 0xe4, 0x67, 0xdb, 0x70, 0xfb, 0x6e, - 0x0c, 0x12, 0x57, 0x2c, 0x0f, 0xa3, 0x47, 0x42, 0xeb, 0xce, 0x48, 0x3b, 0x1f, 0x5f, 0xd7, 0x6b, - 0x26, 0xae, 0x2e, 0xbb, 0xb5, 0xd0, 0xab, 0x78, 0x81, 0x8b, 0xc5, 0x22, 0x2e, 0x36, 0x01, 0x49, - 0xc7, 0x6a, 0x98, 0x55, 0x71, 0x59, 0x84, 0x36, 0x50, 0x19, 0x52, 0xbe, 0xe7, 0x24, 0xba, 0x79, - 0xce, 0x28, 0xf1, 0x1c, 0xe2, 0xd7, 0x1c, 0xa0, 0x0c, 0x6e, 0x71, 0x07, 0x2a, 0x41, 0xda, 0x4f, - 0x68, 0xdc, 0x03, 0x7b, 0x73, 0xe2, 0x80, 0x0c, 0xdd, 0x0f, 0x63, 0xbe, 0x3f, 0xf8, 0x06, 0x65, - 0x5e, 0x98, 0xf5, 0x3b, 0xb8, 0x45, 0x23, 0xae, 0xc6, 0x5f, 0x0b, 0x1c, 0xa4, 0x7a, 0x05, 0xae, - 0xc6, 0x5e, 0x0d, 0x3c, 0x06, 0x69, 0x57, 0xaf, 0x99, 0xaa, 0xd7, 0x70, 0x30, 0xf7, 0xc6, 0x00, - 0x20, 0xff, 0x54, 0x0c, 0x06, 0x98, 0x77, 0x87, 0xec, 0x26, 0xb5, 0xb7, 0x5b, 0xac, 0x93, 0xdd, - 0xe2, 0x07, 0xb7, 0xdb, 0x2c, 0x80, 0x2f, 0x8c, 0xcb, 0x5f, 0xeb, 0x3a, 0xda, 0xca, 0x88, 0x89, - 0xb8, 0xae, 0xd7, 0x78, 0xf0, 0x86, 0x88, 0x7c, 0x0f, 0x4a, 0x86, 0xf2, 0xe4, 0x79, 0x48, 0x6f, - 0xe9, 0x5e, 0x45, 0x25, 0xd5, 0x29, 0x35, 0x61, 0xe6, 0xf4, 0x54, 0xa1, 0x5d, 0x19, 0x5b, 0x10, - 0x35, 0xac, 0x92, 0xda, 0xe2, 0xbf, 0xe4, 0xff, 0x28, 0x91, 0xc5, 0x98, 0x0f, 0x88, 0x66, 0x61, - 0x58, 0x28, 0x5a, 0xd9, 0x36, 0xd4, 0x1a, 0x77, 0xc6, 0xe3, 0x1d, 0xb5, 0xbd, 0x60, 0xa8, 0x35, - 0x25, 0xc3, 0x15, 0x24, 0x8d, 0xf6, 0x13, 0x1b, 0xeb, 0x30, 0xb1, 0x11, 0x4f, 0x8a, 0x1f, 0xcc, - 0x93, 0x22, 0x73, 0x9e, 0x68, 0x9e, 0xf3, 0xaf, 0xc6, 0x68, 0x51, 0x66, 0x5b, 0xae, 0x6a, 0xbc, - 0x15, 0x21, 0x76, 0x14, 0xd2, 0xb6, 0x65, 0x54, 0x58, 0x0f, 0xbb, 0x95, 0x95, 0xb2, 0x2d, 0x43, - 0x69, 0xf1, 0xa3, 0xe4, 0x6d, 0x8a, 0xbf, 0x81, 0xdb, 0x60, 0xb5, 0xc1, 0x66, 0xab, 0x39, 0x30, - 0xc4, 0x4c, 0xc1, 0x17, 0xcc, 0x87, 0x88, 0x0d, 0xe8, 0x0a, 0x2c, 0xb5, 0x2e, 0xf0, 0x4c, 0x6c, - 0x86, 0xa9, 0x70, 0x3c, 0x42, 0xc1, 0xd6, 0x97, 0x76, 0xd5, 0x7c, 0xd8, 0xcf, 0x15, 0x8e, 0x27, - 0xff, 0x53, 0x09, 0xd2, 0x54, 0xd5, 0x65, 0xec, 0xa9, 0x11, 0x53, 0x49, 0x07, 0x37, 0xd5, 0x71, - 0x00, 0xc6, 0xc6, 0xd5, 0x6f, 0x60, 0x3e, 0x81, 0x69, 0x0a, 0x59, 0xd7, 0x6f, 0x60, 0x74, 0xd6, - 0xd7, 0x2b, 0xbe, 0xbf, 0x5e, 0x3c, 0x14, 0x85, 0x76, 0x77, 0xc0, 0x20, 0xfd, 0x2a, 0xc1, 0x2e, - 0xbb, 0x96, 0x18, 0xa7, 0xef, 0x2c, 0x6e, 0xec, 0xba, 0xf2, 0x33, 0x30, 0xb8, 0xb1, 0xcb, 0xb6, - 0x52, 0x47, 0x21, 0xed, 0x58, 0x16, 0x5f, 0x5f, 0x59, 0x5d, 0x93, 0x22, 0x00, 0xba, 0x9c, 0x88, - 0xed, 0x43, 0x2c, 0xd8, 0x3e, 0x04, 0xfb, 0x9f, 0x78, 0x4f, 0xfb, 0x9f, 0x53, 0xff, 0x4e, 0x82, - 0x4c, 0x28, 0x0c, 0xd1, 0xc3, 0x70, 0xb8, 0xb4, 0xb4, 0x3a, 0x77, 0xb9, 0xb2, 0x38, 0x5f, 0xb9, - 0xb0, 0x34, 0xbb, 0x10, 0x5c, 0xef, 0xcd, 0x4f, 0x3e, 0xff, 0xe2, 0x09, 0x14, 0xc2, 0xdd, 0x34, - 0xaf, 0x92, 0xfd, 0x31, 0x9a, 0x81, 0x89, 0x28, 0xc9, 0x6c, 0x69, 0xbd, 0xbc, 0xb2, 0x91, 0x95, - 0xf2, 0x87, 0x9f, 0x7f, 0xf1, 0xc4, 0x58, 0x88, 0x62, 0x76, 0xcb, 0xc5, 0xa6, 0xd7, 0x4a, 0x30, - 0xb7, 0xba, 0xbc, 0xbc, 0xb8, 0x91, 0x8d, 0xb5, 0x10, 0xf0, 0x44, 0x7b, 0x1f, 0x8c, 0x45, 0x09, - 0x56, 0x16, 0x97, 0xb2, 0xf1, 0x3c, 0x7a, 0xfe, 0xc5, 0x13, 0x23, 0x21, 0xec, 0x15, 0xdd, 0xc8, - 0xa7, 0x7e, 0xe2, 0x4b, 0x53, 0x87, 0x7e, 0xfe, 0xaf, 0x4d, 0x49, 0x44, 0xb3, 0xe1, 0x48, 0x28, - 0xa2, 0x07, 0xe0, 0x8e, 0xf5, 0xc5, 0x85, 0x95, 0xf2, 0x7c, 0x65, 0x79, 0x7d, 0xa1, 0xc2, 0xde, - 0x6b, 0xf6, 0xb5, 0x1b, 0x7d, 0xfe, 0xc5, 0x13, 0x19, 0xae, 0x52, 0x27, 0xec, 0x35, 0xa5, 0x7c, - 0x65, 0x75, 0xa3, 0x9c, 0x95, 0x18, 0xf6, 0x9a, 0x83, 0xaf, 0x59, 0x1e, 0xfb, 0x6c, 0xc9, 0x43, - 0x70, 0xa4, 0x0d, 0xb6, 0xaf, 0xd8, 0xd8, 0xf3, 0x2f, 0x9e, 0x18, 0x5e, 0x73, 0x30, 0x73, 0x53, - 0x4a, 0x51, 0x80, 0x5c, 0x2b, 0xc5, 0xea, 0xda, 0xea, 0xfa, 0xec, 0x52, 0xf6, 0x44, 0x3e, 0xfb, - 0xfc, 0x8b, 0x27, 0x86, 0x44, 0xce, 0x21, 0xf8, 0x81, 0x66, 0xa5, 0x27, 0x3b, 0xee, 0x5f, 0x1e, - 0xeb, 0x7f, 0xff, 0x12, 0x3d, 0xf1, 0xf9, 0x8b, 0x31, 0x98, 0x6a, 0xb9, 0x44, 0xc9, 0x8f, 0x1e, - 0x3b, 0x1d, 0xf8, 0x14, 0x21, 0x35, 0x2f, 0x4e, 0x34, 0xfb, 0x3d, 0xef, 0xf9, 0xd9, 0x3e, 0xcf, - 0x7b, 0x86, 0xc5, 0x48, 0xe2, 0xb8, 0xe7, 0x54, 0xf7, 0xe3, 0x1e, 0x21, 0xff, 0x01, 0x4e, 0x7b, - 0x3e, 0xfe, 0x30, 0xdc, 0xcd, 0x0f, 0xc9, 0x5c, 0x4f, 0xbd, 0xaa, 0x9b, 0x35, 0xff, 0x28, 0x92, - 0xb7, 0xb9, 0x51, 0x26, 0xf9, 0x69, 0xa4, 0x80, 0xee, 0x7b, 0x20, 0x99, 0xdf, 0x77, 0x83, 0xd8, - 0x7d, 0xe3, 0xd7, 0x65, 0x86, 0xf2, 0x5d, 0x8e, 0x4e, 0xe5, 0x4f, 0x4a, 0x30, 0x72, 0x51, 0x77, - 0x3d, 0xcb, 0xd1, 0x35, 0xd5, 0xa0, 0xb7, 0x95, 0xcf, 0xf6, 0x9a, 0x9b, 0x9b, 0x72, 0xd8, 0x13, - 0x30, 0x70, 0x4d, 0x35, 0x5c, 0xec, 0xf1, 0xcb, 0xfa, 0x77, 0x16, 0xda, 0x1b, 0xa2, 0xe0, 0x17, - 0xe7, 0x82, 0x01, 0x23, 0x93, 0x7f, 0x31, 0x06, 0xa3, 0x34, 0xca, 0x5d, 0xf6, 0x39, 0x0d, 0xb2, - 0x11, 0x2c, 0x41, 0xc2, 0x51, 0x3d, 0x7e, 0x78, 0x52, 0x2a, 0xf0, 0x43, 0xce, 0x7b, 0xba, 0x1f, - 0x5c, 0x16, 0xe6, 0xb1, 0xa6, 0x50, 0x5a, 0xf4, 0x23, 0x90, 0xaa, 0xab, 0xbb, 0x15, 0xca, 0x87, - 0x6d, 0xaf, 0x66, 0xfb, 0xe3, 0x73, 0xeb, 0xe6, 0xf4, 0xe8, 0x9e, 0x5a, 0x37, 0x8a, 0xb2, 0xe0, - 0x23, 0x2b, 0x83, 0x75, 0x75, 0x97, 0x88, 0x88, 0x6c, 0x18, 0x25, 0x50, 0x6d, 0x47, 0x35, 0x6b, - 0x98, 0x0d, 0x42, 0x8f, 0x82, 0x4a, 0x17, 0xfb, 0x1e, 0x64, 0x32, 0x18, 0x24, 0xc4, 0x4e, 0x56, - 0x86, 0xeb, 0xea, 0xee, 0x1c, 0x05, 0x90, 0x11, 0x8b, 0xa9, 0x17, 0x5e, 0x9a, 0x3e, 0x44, 0x0f, - 0x8e, 0x5f, 0x91, 0x00, 0x02, 0x8b, 0xa1, 0x1f, 0x81, 0xac, 0xe6, 0xb7, 0x28, 0xad, 0xcb, 0xe7, - 0xf0, 0xde, 0x4e, 0x73, 0xd1, 0x64, 0x6f, 0xb6, 0xb6, 0xbf, 0x7c, 0x73, 0x5a, 0x52, 0x46, 0xb5, - 0xa6, 0xa9, 0xf8, 0x20, 0x64, 0x1a, 0x76, 0x55, 0xf5, 0x70, 0x85, 0x6e, 0x36, 0x63, 0x5d, 0xeb, - 0x84, 0x29, 0xc2, 0xeb, 0xd6, 0xcd, 0x69, 0xc4, 0xd4, 0x0a, 0x11, 0xcb, 0xb4, 0x7a, 0x00, 0x06, - 0x21, 0x04, 0x21, 0x9d, 0x7e, 0x47, 0x82, 0xcc, 0x7c, 0xe8, 0xd6, 0x40, 0x0e, 0x06, 0xeb, 0x96, - 0xa9, 0x5f, 0xe5, 0xfe, 0x98, 0x56, 0x44, 0x13, 0xe5, 0x21, 0xc5, 0x5e, 0xe0, 0xf0, 0xf6, 0xc4, - 0x91, 0x90, 0x68, 0x13, 0xaa, 0xeb, 0x78, 0xcb, 0xd5, 0xc5, 0x6c, 0x28, 0xa2, 0x89, 0x2e, 0x40, - 0xd6, 0xc5, 0x5a, 0xc3, 0xd1, 0xbd, 0xbd, 0x8a, 0x66, 0x99, 0x9e, 0xaa, 0x79, 0xec, 0x55, 0x80, - 0xd2, 0xd1, 0x5b, 0x37, 0xa7, 0xef, 0x60, 0xb2, 0x36, 0x63, 0xc8, 0xca, 0xa8, 0x00, 0xcd, 0x31, - 0x08, 0x19, 0xa1, 0x8a, 0x3d, 0x55, 0x37, 0x5c, 0x5a, 0x7a, 0xa5, 0x15, 0xd1, 0x0c, 0xe9, 0xf2, - 0x8f, 0x07, 0x21, 0xed, 0x7b, 0x3b, 0xba, 0x0e, 0x59, 0xcb, 0xc6, 0x4e, 0xa4, 0x90, 0xa5, 0xeb, - 0x78, 0x69, 0x29, 0x18, 0xb9, 0x19, 0x43, 0xfe, 0xff, 0x37, 0xa7, 0x1f, 0xec, 0xc1, 0x83, 0xae, - 0xa8, 0x06, 0x2f, 0x82, 0x95, 0x51, 0xc1, 0x43, 0x54, 0xc5, 0x17, 0x88, 0x5f, 0x88, 0xed, 0xaf, - 0xdd, 0xd8, 0x12, 0x47, 0x8f, 0x11, 0x95, 0x9b, 0x31, 0x64, 0xe2, 0x01, 0x1c, 0xb4, 0x46, 0x21, - 0xa4, 0x72, 0x7d, 0x46, 0xd5, 0x0d, 0xf1, 0x56, 0x9b, 0xc2, 0x5b, 0x68, 0x11, 0x06, 0x5c, 0x4f, - 0xf5, 0x1a, 0xac, 0x78, 0x49, 0x96, 0x1e, 0xee, 0x51, 0xe6, 0x92, 0x65, 0x56, 0xd7, 0x29, 0xa1, - 0xc2, 0x19, 0xa0, 0x0b, 0x30, 0xe0, 0x59, 0x57, 0xb1, 0xc9, 0x8d, 0xda, 0x57, 0xc4, 0xd3, 0x87, - 0x34, 0x8c, 0x1a, 0x79, 0x90, 0xad, 0x62, 0x03, 0xd7, 0xa8, 0x29, 0xdd, 0x1d, 0x95, 0x6c, 0x90, - 0xe8, 0x97, 0x65, 0x4a, 0x8b, 0x7d, 0x87, 0x25, 0x37, 0x50, 0x33, 0x3f, 0x59, 0x19, 0xf5, 0x41, - 0xeb, 0x14, 0x82, 0x2e, 0x47, 0x2e, 0xbc, 0xf0, 0xcf, 0x2f, 0xdd, 0xd5, 0x29, 0xf6, 0x42, 0x5e, - 0x2e, 0x8e, 0x55, 0xc2, 0xd7, 0x65, 0x2e, 0x40, 0xb6, 0x61, 0x6e, 0x59, 0x26, 0x7d, 0x13, 0x85, - 0xef, 0x18, 0xc8, 0x16, 0x34, 0x1e, 0x9e, 0xb5, 0x66, 0x0c, 0x59, 0x19, 0xf5, 0x41, 0x17, 0xd9, - 0xbe, 0xa2, 0x0a, 0x23, 0x01, 0x16, 0x0d, 0xdd, 0x74, 0xd7, 0xd0, 0xbd, 0x93, 0x87, 0xee, 0xe1, - 0xe6, 0x51, 0x82, 0xe8, 0x1d, 0xf6, 0x81, 0x84, 0x0c, 0x5d, 0x04, 0x08, 0x12, 0x06, 0x3d, 0x5e, - 0xc9, 0x9c, 0x96, 0xbb, 0x67, 0x1d, 0xb1, 0x25, 0x0d, 0x68, 0xd1, 0x87, 0x61, 0xbc, 0xae, 0x9b, - 0x15, 0x17, 0x1b, 0xdb, 0x15, 0x6e, 0x60, 0xc2, 0x92, 0x7e, 0x49, 0xa0, 0xb4, 0xd4, 0x9f, 0x3f, - 0xdc, 0xba, 0x39, 0x9d, 0xe7, 0x49, 0xb5, 0x95, 0xa5, 0xac, 0x8c, 0xd5, 0x75, 0x73, 0x1d, 0x1b, - 0xdb, 0xf3, 0x3e, 0xac, 0x38, 0xf4, 0x13, 0x2f, 0x4d, 0x1f, 0xf2, 0x03, 0x58, 0x87, 0xa1, 0x20, - 0xb0, 0xb0, 0x8b, 0x56, 0x21, 0xad, 0x8a, 0x06, 0x3b, 0x88, 0xe9, 0xd9, 0xd9, 0x43, 0x01, 0x1a, - 0xf0, 0x60, 0xb9, 0xe2, 0xb9, 0xff, 0x70, 0x42, 0x92, 0x9f, 0x8f, 0xc1, 0xc0, 0xfc, 0x95, 0x35, - 0x55, 0x77, 0xd0, 0x0d, 0x18, 0x0b, 0x9c, 0x2d, 0x9a, 0x29, 0x96, 0x6f, 0xdd, 0x9c, 0xce, 0x35, - 0xfb, 0x63, 0x9f, 0xa9, 0x62, 0x56, 0xd3, 0x84, 0x24, 0x41, 0x90, 0x88, 0x5c, 0x71, 0xa3, 0xe3, - 0x76, 0x3b, 0x3c, 0x76, 0x0b, 0xca, 0x01, 0xd2, 0x54, 0xcb, 0xee, 0x3d, 0x94, 0x38, 0xcb, 0x30, - 0xc8, 0x6c, 0xe1, 0xa2, 0x22, 0x24, 0x6d, 0xf2, 0x83, 0x3f, 0xfa, 0x98, 0xea, 0x18, 0x4d, 0x14, - 0xdf, 0x3f, 0x10, 0x26, 0x24, 0xf2, 0x17, 0xe3, 0x00, 0xf3, 0x57, 0xae, 0x6c, 0x38, 0xba, 0x6d, - 0x60, 0xef, 0x07, 0x6a, 0xd7, 0x8f, 0x4b, 0x70, 0x38, 0xb0, 0x9a, 0xeb, 0x68, 0x4d, 0xc6, 0x7d, - 0xf2, 0xd6, 0xcd, 0xe9, 0x63, 0xcd, 0xc6, 0x0d, 0xa1, 0x1d, 0xc0, 0xc0, 0xe3, 0x3e, 0xa3, 0x75, - 0x47, 0x6b, 0x2f, 0x47, 0xd5, 0xf5, 0x7c, 0x39, 0xe2, 0x9d, 0xe5, 0x08, 0xa1, 0xbd, 0x21, 0x39, - 0xe6, 0x5d, 0xaf, 0x75, 0xae, 0xd7, 0x21, 0x13, 0xcc, 0x91, 0x8b, 0xe6, 0x21, 0xe5, 0xf1, 0xdf, - 0x7c, 0xca, 0xe5, 0xce, 0x53, 0x2e, 0xc8, 0xf8, 0xb4, 0xfb, 0x94, 0xf2, 0xbf, 0x8d, 0x01, 0x04, - 0x51, 0xfd, 0x67, 0x35, 0xa2, 0xc8, 0x72, 0xca, 0x17, 0xbf, 0xf8, 0x81, 0x0a, 0x68, 0x4e, 0x1d, - 0x9a, 0xad, 0x3f, 0x8c, 0xc1, 0xf8, 0xa6, 0xc8, 0xfc, 0xef, 0x58, 0x18, 0xad, 0xc1, 0x20, 0x36, - 0x3d, 0x47, 0xa7, 0x26, 0x26, 0xde, 0xfa, 0x50, 0x27, 0x6f, 0x6d, 0x63, 0x35, 0xfa, 0xb1, 0x0c, - 0xf1, 0x34, 0x88, 0xb3, 0x09, 0xd9, 0xfa, 0x53, 0x71, 0xc8, 0x75, 0xa2, 0x42, 0x73, 0x30, 0xaa, - 0x39, 0x98, 0x02, 0x2a, 0xe1, 0xa3, 0xe7, 0x52, 0x3e, 0xd8, 0x49, 0x34, 0x21, 0xc8, 0xca, 0x88, - 0x80, 0xf0, 0xda, 0xa0, 0x06, 0xa4, 0xcc, 0x27, 0x21, 0x43, 0xb0, 0x7a, 0xac, 0xeb, 0x65, 0x5e, - 0x1c, 0x88, 0x41, 0xa2, 0x0c, 0x58, 0x75, 0x30, 0x12, 0x40, 0x69, 0x79, 0xf0, 0x2c, 0x8c, 0xea, - 0xa6, 0xee, 0xe9, 0xaa, 0x51, 0xd9, 0x52, 0x0d, 0xd5, 0xd4, 0x0e, 0xb2, 0x4b, 0x62, 0x0b, 0x3a, - 0x1f, 0xb6, 0x89, 0x9d, 0xac, 0x8c, 0x70, 0x48, 0x89, 0x01, 0xd0, 0x45, 0x18, 0x14, 0x43, 0x25, - 0x0e, 0x54, 0x4b, 0x0a, 0xf2, 0xd0, 0x8c, 0xfc, 0x64, 0x1c, 0xc6, 0x14, 0x5c, 0x7d, 0x67, 0x2a, - 0xfa, 0x9b, 0x8a, 0x65, 0x00, 0x96, 0x48, 0xc8, 0x4a, 0x72, 0x80, 0xd9, 0x20, 0xa9, 0x28, 0xcd, - 0x38, 0xcc, 0xbb, 0x5e, 0x68, 0x3e, 0xfe, 0x28, 0x0e, 0x43, 0xe1, 0xf9, 0x78, 0x67, 0x89, 0xff, - 0xe1, 0x59, 0xe2, 0xd1, 0x62, 0x90, 0x1a, 0x13, 0xfc, 0xa3, 0x87, 0x1d, 0x52, 0x63, 0x4b, 0x48, - 0x75, 0xce, 0x89, 0xff, 0x3b, 0x06, 0x03, 0x6b, 0xaa, 0xa3, 0xd6, 0x5d, 0xa4, 0xb5, 0x6c, 0x6c, - 0xc4, 0xc1, 0x7e, 0xcb, 0xd7, 0x6a, 0xf9, 0xa1, 0x58, 0x97, 0x7d, 0xcd, 0x0b, 0x6d, 0xf6, 0x35, - 0xef, 0x83, 0x91, 0xba, 0xba, 0x1b, 0x7a, 0xd6, 0x4c, 0x27, 0x73, 0xb8, 0x74, 0x24, 0xe0, 0x12, - 0xed, 0x67, 0xc7, 0x35, 0xc1, 0x03, 0x68, 0xf4, 0x18, 0x64, 0x08, 0x46, 0xb0, 0x4a, 0x10, 0xf2, - 0xc9, 0xe0, 0x5c, 0x24, 0xd4, 0x29, 0x2b, 0x50, 0x57, 0x77, 0xcb, 0xac, 0x81, 0x96, 0x00, 0xed, - 0xf8, 0x47, 0x73, 0x95, 0xc0, 0x94, 0x84, 0xfe, 0xf8, 0xad, 0x9b, 0xd3, 0x47, 0x18, 0x7d, 0x2b, - 0x8e, 0xac, 0x8c, 0x05, 0x40, 0xc1, 0xed, 0x0c, 0x00, 0xd1, 0xab, 0xc2, 0xae, 0x2a, 0xb2, 0xdd, - 0xf5, 0xe1, 0x5b, 0x37, 0xa7, 0xc7, 0x18, 0x97, 0xa0, 0x4f, 0x56, 0xd2, 0xa4, 0x31, 0x4f, 0x7e, - 0x87, 0x0c, 0xff, 0x25, 0x09, 0x50, 0xb0, 0x06, 0x29, 0xd8, 0xb5, 0x2d, 0xd3, 0xa5, 0xfb, 0xbe, - 0xd0, 0x26, 0x4d, 0xda, 0x7f, 0xdf, 0x17, 0xd0, 0x8b, 0x7d, 0x5f, 0x28, 0x74, 0x1f, 0x0f, 0xf2, - 0x75, 0x8c, 0xcf, 0x63, 0x9b, 0x7b, 0x9d, 0x85, 0x39, 0x4b, 0x17, 0xd4, 0x6d, 0x12, 0xf4, 0xbf, - 0x90, 0xe0, 0x48, 0x8b, 0x37, 0xf9, 0xc2, 0xfe, 0x39, 0x40, 0x4e, 0xa8, 0x93, 0x7f, 0xbc, 0x8a, - 0x09, 0xdd, 0xb7, 0x73, 0x8e, 0x39, 0x2d, 0x0b, 0xc1, 0xed, 0x5b, 0x72, 0xd8, 0xc5, 0xd0, 0x7f, - 0x22, 0xc1, 0x44, 0x78, 0x78, 0x5f, 0x91, 0x15, 0x18, 0x0a, 0x8f, 0xce, 0x55, 0xb8, 0xbb, 0x17, - 0x15, 0xb8, 0xf4, 0x11, 0x7a, 0xf4, 0x64, 0x10, 0xaa, 0xec, 0xf0, 0xf6, 0xe1, 0x9e, 0xad, 0x21, - 0x64, 0x6a, 0x0e, 0x59, 0xa6, 0xc1, 0x9f, 0x48, 0x90, 0x58, 0xb3, 0x2c, 0x03, 0x59, 0x30, 0x66, - 0x5a, 0x5e, 0x85, 0x78, 0x16, 0xae, 0x56, 0xf8, 0x19, 0x0f, 0x3b, 0xd5, 0x9d, 0xeb, 0xcf, 0x48, - 0xdf, 0xbb, 0x39, 0xdd, 0xca, 0x4a, 0x19, 0x35, 0x2d, 0xaf, 0x44, 0x21, 0x1b, 0xec, 0x04, 0xe8, - 0xc3, 0x30, 0x1c, 0x1d, 0x8c, 0x9d, 0x78, 0x3d, 0xd5, 0xf7, 0x60, 0x51, 0x36, 0xb7, 0x6e, 0x4e, - 0x4f, 0x04, 0x11, 0xe3, 0x83, 0x65, 0x65, 0x68, 0x2b, 0x34, 0x7a, 0x31, 0x45, 0xb4, 0xff, 0xe3, - 0x97, 0xa6, 0xa5, 0xd2, 0x85, 0x8e, 0x4f, 0x68, 0x1e, 0xd8, 0x57, 0x84, 0x5d, 0xff, 0x31, 0x43, - 0xf4, 0xb1, 0xcc, 0x0b, 0xe3, 0x30, 0xdd, 0xe1, 0x39, 0x84, 0xb7, 0x7b, 0xa0, 0x47, 0x10, 0x5d, - 0x9e, 0x11, 0xe4, 0x7b, 0x7a, 0xec, 0x21, 0xbf, 0x9e, 0x00, 0xb4, 0xec, 0xd6, 0xe6, 0x48, 0x55, - 0x83, 0x83, 0x43, 0xcf, 0xa6, 0x23, 0x31, 0xe9, 0x0d, 0x1d, 0x89, 0x2d, 0x47, 0x0e, 0x99, 0x62, - 0xfd, 0x1d, 0x6d, 0xf7, 0x7c, 0xd2, 0x14, 0x7f, 0x4b, 0x4e, 0x9a, 0xda, 0x97, 0x2a, 0x89, 0x1f, - 0xe0, 0x8e, 0x29, 0xf9, 0xd6, 0xec, 0x98, 0x26, 0x61, 0x80, 0x9f, 0x41, 0xb3, 0x4f, 0x7d, 0xf3, - 0x16, 0x7a, 0x54, 0x7c, 0x21, 0x79, 0xb0, 0xb7, 0xec, 0xcf, 0xb0, 0x79, 0x9e, 0xf9, 0x5a, 0x1c, - 0xb2, 0xcb, 0x6e, 0xad, 0x5c, 0xd5, 0xbd, 0x37, 0xc9, 0xf7, 0xec, 0xce, 0x9b, 0xcc, 0xb9, 0x5b, - 0x37, 0xa7, 0x47, 0x98, 0xc9, 0x6e, 0xa7, 0xa1, 0xea, 0x30, 0xda, 0xf4, 0x38, 0x87, 0xbb, 0xe6, - 0xfc, 0x41, 0x9e, 0x2a, 0x35, 0xb1, 0x92, 0xe9, 0xbe, 0x20, 0x14, 0x20, 0x68, 0xb7, 0x7d, 0x34, - 0xb0, 0x85, 0xec, 0xe2, 0x9b, 0x79, 0xe6, 0xca, 0xa6, 0xf0, 0xeb, 0x31, 0xc8, 0x2c, 0xbb, 0x62, - 0x9f, 0x8b, 0xff, 0xcc, 0x9e, 0x28, 0x3c, 0xe6, 0xbf, 0x38, 0x12, 0xef, 0x2d, 0x10, 0xa2, 0x2f, - 0x93, 0x7c, 0x2b, 0x4e, 0xf3, 0x70, 0x09, 0xd7, 0x74, 0xd3, 0x5f, 0xac, 0xf1, 0x3b, 0x1b, 0xa3, - 0x1f, 0xa2, 0x8d, 0x51, 0x30, 0xc3, 0x89, 0x83, 0xcc, 0xf0, 0x6f, 0xc5, 0x60, 0x78, 0xd9, 0xad, - 0x6d, 0x9a, 0xd5, 0x77, 0x42, 0xe5, 0x8d, 0x84, 0xca, 0x6d, 0x2f, 0xcd, 0xbe, 0x1e, 0x83, 0x53, - 0xe1, 0x5a, 0xea, 0xd9, 0x06, 0x76, 0xf6, 0xfc, 0x72, 0xc9, 0x56, 0x6b, 0xba, 0x19, 0xbe, 0x3d, - 0x73, 0x24, 0x2c, 0x2c, 0xc5, 0x15, 0x22, 0xcb, 0x26, 0x64, 0xd6, 0xd4, 0x1a, 0x56, 0xf0, 0xb3, - 0x0d, 0xec, 0x7a, 0x6d, 0xde, 0x6d, 0x99, 0x84, 0x01, 0x6b, 0x7b, 0x9b, 0x5d, 0xb6, 0x90, 0x4e, - 0x26, 0x14, 0xde, 0x42, 0x13, 0x90, 0x34, 0xf4, 0xba, 0xce, 0x0c, 0x92, 0x50, 0x58, 0x03, 0x4d, - 0x43, 0x46, 0x23, 0x7a, 0x57, 0xd8, 0x95, 0xfd, 0x84, 0xf8, 0x76, 0x47, 0xc3, 0xf4, 0x36, 0x08, - 0x44, 0x7e, 0x02, 0x86, 0xd8, 0x78, 0x7c, 0x7f, 0x71, 0x04, 0x52, 0xf4, 0x8a, 0x75, 0x30, 0xea, - 0x20, 0x69, 0x5f, 0x66, 0xef, 0xc1, 0x30, 0x2e, 0x6c, 0x60, 0xd6, 0x28, 0x95, 0x3a, 0x9a, 0xf2, - 0x64, 0xf7, 0x49, 0x66, 0x86, 0xf2, 0xcd, 0xf8, 0x9b, 0x49, 0x38, 0xcc, 0xaf, 0xb5, 0xa8, 0xb6, - 0x3e, 0xb3, 0xe3, 0x79, 0xe2, 0x05, 0x33, 0xe0, 0x1b, 0x7b, 0xd5, 0xd6, 0xe5, 0x3d, 0x48, 0x5c, - 0xf4, 0x3c, 0x1b, 0x9d, 0x82, 0xa4, 0xd3, 0x30, 0xb0, 0x78, 0x58, 0x30, 0x51, 0x08, 0x70, 0x0a, - 0x04, 0x41, 0x69, 0x18, 0x58, 0x61, 0x28, 0xa8, 0x0c, 0xd3, 0xdb, 0x0d, 0xc3, 0xd8, 0xab, 0x54, - 0x31, 0xfd, 0x77, 0x4a, 0xfe, 0x7f, 0x2e, 0xc0, 0xbb, 0xb6, 0x6a, 0xfa, 0x45, 0x65, 0x4a, 0x39, - 0x46, 0xd1, 0xe6, 0x29, 0x96, 0xf8, 0xaf, 0x05, 0x65, 0x81, 0x23, 0xff, 0x7e, 0x0c, 0x52, 0x82, - 0x35, 0x7d, 0x31, 0x05, 0x1b, 0x58, 0xf3, 0x2c, 0x71, 0x41, 0xc1, 0x6f, 0x23, 0x04, 0xf1, 0x1a, - 0x9f, 0xa2, 0xf4, 0xc5, 0x43, 0x0a, 0x69, 0x10, 0x98, 0xff, 0xba, 0x10, 0x81, 0xd9, 0x0d, 0x32, - 0x6b, 0x09, 0xdb, 0x12, 0x27, 0x63, 0x17, 0x0f, 0x29, 0xb4, 0x85, 0x72, 0x30, 0x40, 0xa2, 0xcd, - 0x63, 0xdf, 0x94, 0x24, 0x70, 0xde, 0x46, 0x93, 0x90, 0xb4, 0x55, 0x4f, 0x63, 0xd7, 0xec, 0x49, - 0x07, 0x6b, 0x92, 0x78, 0x60, 0xef, 0xf2, 0x36, 0xff, 0xaf, 0x12, 0x62, 0x0c, 0xf6, 0xd1, 0x34, - 0x22, 0xf7, 0x9a, 0xea, 0x79, 0xd8, 0x31, 0x09, 0x43, 0x86, 0x4e, 0xdf, 0x41, 0xb3, 0xaa, 0x7b, - 0xfc, 0xff, 0xa7, 0xd0, 0xdf, 0xfc, 0x3f, 0x3b, 0x50, 0x7f, 0xa8, 0xd0, 0x4e, 0xf6, 0x6f, 0xa3, - 0x86, 0x04, 0xb0, 0x44, 0x90, 0xca, 0x30, 0xae, 0x56, 0xab, 0x3a, 0xf1, 0x6a, 0xd5, 0xa8, 0x6c, - 0xe9, 0xf4, 0xe0, 0xc4, 0xa5, 0xff, 0x14, 0xac, 0xd3, 0x5c, 0xa0, 0x80, 0xa0, 0xc4, 0xf1, 0x4b, - 0x69, 0x18, 0xb4, 0x99, 0x50, 0xf2, 0x79, 0x18, 0x6b, 0x91, 0x94, 0xc8, 0x77, 0x55, 0x37, 0xab, - 0xe2, 0x1d, 0x2a, 0xf2, 0x9b, 0xc0, 0xe8, 0x87, 0x0f, 0xd9, 0xd5, 0x0f, 0xfa, 0xbb, 0xf4, 0xe3, - 0x9d, 0xef, 0x90, 0x8d, 0x84, 0xee, 0x90, 0xa9, 0xb6, 0x5e, 0x4a, 0x53, 0xfe, 0xfc, 0xea, 0xd8, - 0x2c, 0xef, 0x60, 0xd7, 0xc6, 0x0a, 0x96, 0x53, 0x9b, 0xa9, 0x61, 0x53, 0xec, 0x94, 0x48, 0x97, - 0x6a, 0xeb, 0x2e, 0x75, 0xc7, 0xe0, 0x43, 0x8c, 0xee, 0xf9, 0xd0, 0x6f, 0x7a, 0xa3, 0x2c, 0xb1, - 0x30, 0xbb, 0xb6, 0xe8, 0xfb, 0xf1, 0x6f, 0xc4, 0xe0, 0x58, 0xc8, 0x8f, 0x43, 0xc8, 0xad, 0xee, - 0x9c, 0x6f, 0xef, 0xf1, 0x3d, 0x7c, 0xc6, 0xf0, 0x32, 0x24, 0x08, 0x3e, 0xea, 0xf2, 0x7f, 0x17, - 0x72, 0xbf, 0xf4, 0xcf, 0xff, 0x91, 0x4c, 0x9d, 0xa2, 0xfd, 0xac, 0x50, 0x26, 0xa5, 0x4f, 0xf4, - 0x6e, 0xbf, 0x6c, 0xf0, 0x0d, 0x4a, 0xf7, 0xf6, 0x99, 0xb1, 0xd9, 0x86, 0x9f, 0x3f, 0x0f, 0x72, - 0x87, 0xed, 0x27, 0xcb, 0x98, 0xfb, 0x6f, 0x78, 0xfb, 0x48, 0xc7, 0x9d, 0xee, 0xe7, 0xed, 0x37, - 0x83, 0x3d, 0x6e, 0x8d, 0x77, 0x61, 0xf2, 0x49, 0x32, 0x76, 0x70, 0x28, 0x28, 0x12, 0xfb, 0xa4, - 0x7f, 0x73, 0x46, 0xe2, 0xff, 0x93, 0x4d, 0x5c, 0x83, 0x81, 0x40, 0x3e, 0xbe, 0xd1, 0xbd, 0xa7, - 0xd0, 0x71, 0xbd, 0x28, 0x84, 0x16, 0x0b, 0x25, 0x44, 0x29, 0xff, 0x82, 0x04, 0x77, 0xb4, 0x0c, - 0xcd, 0x73, 0xfc, 0x02, 0x40, 0xe8, 0x54, 0x53, 0xea, 0xef, 0xce, 0x5e, 0x88, 0x94, 0x30, 0x6a, - 0x11, 0xf6, 0xde, 0xae, 0xc2, 0x32, 0x29, 0x22, 0xd2, 0x3e, 0x0b, 0x87, 0xa3, 0xc2, 0x0a, 0x33, - 0x3d, 0x0d, 0x23, 0xd1, 0x02, 0x82, 0x17, 0x37, 0x07, 0xb8, 0x7b, 0x31, 0x1c, 0x29, 0x22, 0xe4, - 0x4a, 0xf3, 0xd4, 0xf8, 0xe6, 0x29, 0x43, 0xda, 0x47, 0xe5, 0x5b, 0xc7, 0x9e, 0xad, 0x13, 0x50, - 0xca, 0x5f, 0x97, 0xe0, 0x44, 0x74, 0x84, 0x60, 0xe3, 0xe3, 0xbe, 0xe9, 0xfa, 0xdd, 0x36, 0x47, - 0xfa, 0xae, 0x04, 0x77, 0xee, 0xa3, 0x06, 0xb7, 0xd9, 0x0d, 0x98, 0x08, 0x9d, 0xae, 0x8a, 0x85, - 0x42, 0x38, 0xd7, 0xa9, 0xee, 0xc7, 0xc2, 0xfe, 0x61, 0xe2, 0x51, 0x62, 0xc7, 0xaf, 0x7c, 0x6b, - 0x7a, 0xbc, 0xb5, 0xcf, 0x55, 0xc6, 0x5b, 0x4f, 0x44, 0x6f, 0xa3, 0x17, 0xfe, 0xae, 0x04, 0xf7, - 0x45, 0x55, 0x6d, 0xf3, 0x0c, 0xf6, 0x6d, 0x34, 0x75, 0xff, 0x5e, 0x82, 0x53, 0xbd, 0xe8, 0xc3, - 0xe7, 0x70, 0x0b, 0xc6, 0x83, 0xc7, 0x22, 0xcd, 0x53, 0x78, 0x7f, 0x1f, 0x0f, 0xb7, 0x79, 0x2c, - 0x20, 0x9f, 0xdb, 0x9b, 0x30, 0x57, 0xff, 0x52, 0xe2, 0xf1, 0x1b, 0x76, 0x13, 0x7f, 0x62, 0xa2, - 0x1b, 0x9e, 0x3e, 0x27, 0x26, 0xb4, 0xe9, 0x19, 0x8e, 0x6c, 0x7a, 0xda, 0x4c, 0x79, 0xec, 0x36, - 0x65, 0xa3, 0x6b, 0x3c, 0x5b, 0xb7, 0x79, 0xce, 0xf2, 0x41, 0x18, 0x6f, 0x13, 0x5a, 0x3c, 0x31, - 0xf5, 0x11, 0x59, 0x0a, 0x6a, 0x0d, 0x1e, 0xf9, 0xdf, 0x48, 0x30, 0x4d, 0x07, 0x6e, 0x33, 0x8d, - 0x6f, 0x67, 0x7b, 0xd6, 0x79, 0xee, 0x6d, 0xab, 0x16, 0x37, 0xec, 0x22, 0x0c, 0x30, 0x0f, 0xe5, - 0xb6, 0x3c, 0x80, 0x8b, 0x73, 0x06, 0x41, 0xae, 0x9f, 0x17, 0xfa, 0xb5, 0x4f, 0x18, 0x6f, 0x92, - 0x1d, 0x6f, 0x57, 0xc2, 0x78, 0x45, 0xe4, 0xfa, 0xf6, 0x6a, 0x70, 0xbb, 0x69, 0xb7, 0x2d, 0xd7, - 0x33, 0x23, 0xbe, 0x45, 0x49, 0xdd, 0xd7, 0xa9, 0x4b, 0x52, 0xff, 0x21, 0x9f, 0x23, 0x3f, 0xa9, - 0x77, 0xd1, 0xe7, 0xed, 0x98, 0xd4, 0xff, 0x24, 0x06, 0x47, 0xa8, 0x6e, 0xe1, 0x67, 0x8d, 0x6f, - 0xc1, 0xdc, 0x54, 0x00, 0xb9, 0x8e, 0x56, 0xb9, 0x5d, 0xb9, 0x28, 0xeb, 0x3a, 0xda, 0x95, 0xc8, - 0x8a, 0x5e, 0x01, 0x54, 0x75, 0xbd, 0xe6, 0x01, 0xe2, 0x07, 0x1e, 0xa0, 0xea, 0x7a, 0x57, 0xf6, - 0x29, 0x19, 0x12, 0x07, 0xf6, 0xae, 0x97, 0x25, 0xc8, 0xb7, 0x9b, 0x01, 0xee, 0x4d, 0x3a, 0x4c, - 0x46, 0x1e, 0xa3, 0x37, 0x3b, 0xd4, 0x03, 0xbd, 0x3c, 0x3c, 0x6e, 0x0a, 0xff, 0xc3, 0x0e, 0x7e, - 0x53, 0x13, 0xc0, 0x3f, 0x13, 0x4b, 0x9c, 0x1f, 0x30, 0xad, 0xbb, 0xb1, 0x1f, 0xfe, 0xb0, 0xff, - 0x95, 0x96, 0x15, 0xe6, 0x6d, 0xb1, 0xb1, 0xfb, 0xa6, 0x04, 0x53, 0x1d, 0xc4, 0x7e, 0x3b, 0x97, - 0x17, 0x3b, 0x1d, 0x5d, 0xea, 0x76, 0xef, 0x22, 0xcf, 0xf0, 0x78, 0x8c, 0xbe, 0xaa, 0x17, 0x3a, - 0x45, 0x68, 0xf7, 0xf1, 0x01, 0xf9, 0xfd, 0x70, 0xb4, 0x2d, 0x15, 0x97, 0xad, 0x08, 0x89, 0x1d, - 0xdd, 0xf5, 0xb8, 0x58, 0xf7, 0x74, 0x12, 0xab, 0x89, 0x9a, 0xd2, 0xc8, 0x08, 0xb2, 0x94, 0xf5, - 0x9a, 0x65, 0x19, 0x5c, 0x0c, 0xf9, 0x32, 0x8c, 0x85, 0x60, 0x7c, 0x90, 0xb3, 0x90, 0xb0, 0x2d, - 0xfe, 0x3d, 0x9f, 0xcc, 0xe9, 0x63, 0x9d, 0x06, 0x21, 0x34, 0x5c, 0x6d, 0x8a, 0x2f, 0x4f, 0x00, - 0x62, 0xcc, 0xe8, 0x5d, 0x2f, 0x31, 0xc4, 0x3a, 0x8c, 0x47, 0xa0, 0x7c, 0x90, 0x77, 0xc3, 0x80, - 0x4d, 0x21, 0x7c, 0x98, 0x8e, 0x2f, 0x09, 0x30, 0x3a, 0x51, 0xb6, 0x31, 0x9a, 0xd3, 0xdf, 0x3b, - 0x0c, 0x49, 0xca, 0x15, 0x7d, 0x46, 0x02, 0x08, 0xdd, 0xdc, 0x2a, 0x74, 0x62, 0xd3, 0xfe, 0x34, - 0x27, 0x3f, 0xd3, 0x33, 0x3e, 0xaf, 0xbb, 0x4f, 0xfd, 0xf8, 0xbf, 0xfe, 0xce, 0xcf, 0xc4, 0xee, - 0x46, 0xf2, 0x4c, 0x87, 0x73, 0xa4, 0x50, 0x30, 0x7e, 0x59, 0x0a, 0xbf, 0x4b, 0xf6, 0x60, 0x6f, - 0x43, 0x09, 0xc9, 0x0a, 0xbd, 0xa2, 0x73, 0xc1, 0xce, 0x53, 0xc1, 0x1e, 0x45, 0x8f, 0x74, 0x17, - 0x6c, 0xe6, 0x43, 0xd1, 0xe8, 0xfa, 0x08, 0xfa, 0xa6, 0x04, 0x13, 0xed, 0x8e, 0x09, 0xd0, 0xb9, - 0xde, 0xa4, 0x68, 0x2d, 0xc8, 0xf2, 0x8f, 0x1f, 0x80, 0x92, 0xab, 0xb2, 0x40, 0x55, 0x99, 0x45, - 0x4f, 0x1c, 0x40, 0x95, 0x99, 0xd0, 0xea, 0x87, 0xfe, 0x9f, 0x04, 0xc7, 0xf7, 0xdd, 0x42, 0xa3, - 0xd9, 0xde, 0xa4, 0xdc, 0xa7, 0xf2, 0xcc, 0x97, 0xde, 0x08, 0x0b, 0xae, 0xf1, 0x93, 0x54, 0xe3, - 0xcb, 0x68, 0xf1, 0x20, 0x1a, 0x07, 0x65, 0x62, 0x58, 0xf7, 0xdf, 0x96, 0x22, 0xaf, 0x53, 0xec, - 0xef, 0x4e, 0x2d, 0x7b, 0xc7, 0x2e, 0x81, 0xd1, 0xba, 0x25, 0x90, 0x9f, 0xa6, 0x2a, 0x28, 0x68, - 0xed, 0x0d, 0x4e, 0xda, 0xcc, 0x87, 0xa2, 0x8b, 0xca, 0x47, 0xd0, 0xff, 0x91, 0xda, 0xbf, 0xbf, - 0xf0, 0xd8, 0xbe, 0x22, 0x76, 0xde, 0x17, 0xe7, 0xcf, 0xf5, 0x4f, 0xc8, 0x95, 0xac, 0x53, 0x25, - 0x6b, 0x08, 0xdf, 0x6e, 0x25, 0xdb, 0x4e, 0x22, 0xfa, 0x1d, 0x09, 0x26, 0xda, 0xed, 0xe8, 0xba, - 0x84, 0xe5, 0x3e, 0x7b, 0xd9, 0x2e, 0x61, 0xb9, 0xdf, 0xf6, 0x51, 0x7e, 0x37, 0x55, 0xfe, 0x2c, - 0x3a, 0xd3, 0x49, 0xf9, 0x7d, 0x67, 0x91, 0xc4, 0xe2, 0xbe, 0x3b, 0x9f, 0x2e, 0xb1, 0xd8, 0xcb, - 0x2e, 0xb0, 0x4b, 0x2c, 0xf6, 0xb4, 0xf1, 0xea, 0x1e, 0x8b, 0xbe, 0x66, 0x3d, 0x4e, 0xa3, 0x8b, - 0x7e, 0x43, 0x82, 0xe1, 0x48, 0x5d, 0x8e, 0x1e, 0xde, 0x57, 0xd0, 0x76, 0xbb, 0xa8, 0xfc, 0xe9, - 0x7e, 0x48, 0xb8, 0x2e, 0x8b, 0x54, 0x97, 0x39, 0x34, 0x7b, 0x10, 0x5d, 0x9c, 0x88, 0xc4, 0x2f, - 0x4b, 0x30, 0xde, 0xa6, 0x84, 0xed, 0x12, 0x85, 0x9d, 0x4b, 0xf7, 0xfc, 0xb9, 0xfe, 0x09, 0xb9, - 0x56, 0x17, 0xa8, 0x56, 0xef, 0x43, 0xef, 0x3d, 0x88, 0x56, 0xa1, 0xf5, 0xf9, 0x66, 0x70, 0x3f, - 0x3a, 0x34, 0x0e, 0x3a, 0xdb, 0xa7, 0x60, 0x42, 0xa1, 0xc7, 0xfa, 0xa6, 0xe3, 0xfa, 0x3c, 0x45, - 0xf5, 0x79, 0x12, 0xad, 0xbe, 0x31, 0x7d, 0x5a, 0x97, 0xf5, 0xaf, 0xb6, 0x7e, 0x2a, 0x62, 0x7f, - 0x2f, 0x6a, 0x5b, 0xac, 0xe6, 0x1f, 0xe9, 0x8b, 0x86, 0x2b, 0x75, 0x8e, 0x2a, 0x75, 0x1a, 0x3d, - 0xd4, 0x49, 0xa9, 0xd0, 0x25, 0x78, 0xdd, 0xdc, 0xb6, 0x66, 0x3e, 0xc4, 0x4a, 0xe0, 0x8f, 0xa0, - 0x1f, 0x13, 0x17, 0x90, 0x4f, 0xee, 0x3b, 0x6e, 0xa8, 0x8e, 0xcd, 0xdf, 0xd7, 0x03, 0x26, 0x97, - 0xeb, 0x6e, 0x2a, 0xd7, 0x14, 0x3a, 0xd6, 0x49, 0x2e, 0x52, 0xcb, 0xa2, 0x4f, 0x4a, 0xfe, 0x3b, - 0x0b, 0xa7, 0xf6, 0xe7, 0x1d, 0x2e, 0x76, 0xf3, 0xf7, 0xf7, 0x84, 0xcb, 0x25, 0xb9, 0x87, 0x4a, - 0x72, 0x02, 0x4d, 0x75, 0x94, 0x84, 0x95, 0xbe, 0xb7, 0xfb, 0xce, 0xcb, 0x67, 0x53, 0x1d, 0x3f, - 0x8b, 0x52, 0xc3, 0x26, 0x76, 0x75, 0xf7, 0x40, 0x77, 0x92, 0x7b, 0x7b, 0xb0, 0xfa, 0xcd, 0x24, - 0x0c, 0x2d, 0xb0, 0x51, 0xd6, 0x3d, 0xd5, 0x7b, 0x83, 0x1b, 0x01, 0xe4, 0xf2, 0x0f, 0x19, 0xd2, - 0x2b, 0x2d, 0x15, 0xdb, 0xba, 0x8e, 0xc5, 0x5e, 0x71, 0xb1, 0xef, 0xcb, 0xc0, 0xfc, 0xfd, 0xfc, - 0x66, 0x7e, 0x32, 0xfb, 0x26, 0x22, 0xbd, 0x75, 0xb3, 0x46, 0x00, 0xe8, 0x63, 0x12, 0x1c, 0xa6, - 0x58, 0x41, 0xbc, 0x51, 0x4c, 0xf1, 0x3e, 0x61, 0x47, 0x8f, 0x59, 0x52, 0x43, 0xc7, 0x3f, 0x94, - 0x57, 0xe9, 0x6e, 0xfe, 0x7a, 0xcb, 0xb1, 0xd0, 0xe0, 0xcd, 0x6c, 0x65, 0x65, 0xdc, 0x68, 0xa1, - 0x74, 0x9b, 0x0e, 0x0d, 0x12, 0x07, 0x3f, 0x34, 0xb8, 0x04, 0x99, 0x50, 0xa6, 0xcf, 0x25, 0xbb, - 0xbc, 0xc2, 0xdb, 0x7c, 0xb2, 0x18, 0x26, 0x46, 0x9f, 0x90, 0xe0, 0x70, 0xdb, 0x45, 0x90, 0xfe, - 0x1f, 0xce, 0x3e, 0x4f, 0x2e, 0x9b, 0x8c, 0xd3, 0x96, 0xaf, 0xac, 0x4c, 0x34, 0xda, 0x55, 0x13, - 0x6b, 0x30, 0x1c, 0x59, 0xc0, 0x72, 0xe2, 0xbf, 0xe9, 0xf6, 0xfe, 0xc2, 0x45, 0x94, 0x01, 0xca, - 0x43, 0x0a, 0xef, 0xda, 0x96, 0xe3, 0xe1, 0x2a, 0xbd, 0xac, 0x93, 0x52, 0xfc, 0xb6, 0x7c, 0x1d, - 0x50, 0xeb, 0xe4, 0xa2, 0xcb, 0x30, 0x18, 0xbd, 0xda, 0x77, 0x80, 0x03, 0x0c, 0xc1, 0x01, 0x4d, - 0x40, 0x32, 0xf0, 0xef, 0xb8, 0xc2, 0x1a, 0xb7, 0x3b, 0x39, 0xfc, 0x69, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x75, 0x0a, 0xea, 0x1f, 0x47, 0x91, 0x00, 0x00, + 0xe0, 0x15, 0x02, 0x43, 0xd3, 0x90, 0x61, 0x51, 0xa5, 0x9b, 0x55, 0xbc, 0x4b, 0x57, 0xcf, 0xa4, + 0xc2, 0x02, 0x6d, 0x89, 0x40, 0xc8, 0xf0, 0xcf, 0xba, 0x96, 0x29, 0x5c, 0x93, 0x0e, 0x41, 0x00, + 0x74, 0xf8, 0xc7, 0x9a, 0x17, 0xee, 0xe3, 0xed, 0xd5, 0x6b, 0x89, 0xa5, 0x7b, 0x61, 0x94, 0x62, + 0x3c, 0xc2, 0xa7, 0x5e, 0x35, 0x72, 0x63, 0x33, 0xd2, 0x89, 0x94, 0x32, 0xc2, 0xc0, 0x6b, 0x1c, + 0x2a, 0xff, 0x6a, 0x0c, 0x12, 0x74, 0x61, 0x19, 0x85, 0xcc, 0xe6, 0x33, 0xeb, 0xe5, 0xca, 0xc2, + 0xda, 0xe5, 0xd2, 0x72, 0x39, 0x2b, 0xa1, 0x11, 0x00, 0x0a, 0x38, 0xbf, 0xbc, 0x36, 0xb7, 0x99, + 0x8d, 0xf9, 0xed, 0xa5, 0xd5, 0xcd, 0x33, 0xa7, 0xb3, 0x71, 0x9f, 0xe0, 0x32, 0x03, 0x24, 0xc2, + 0x08, 0x8f, 0x9c, 0xca, 0x26, 0x51, 0x16, 0x86, 0x18, 0x83, 0xa5, 0xa7, 0xcb, 0x0b, 0x67, 0x4e, + 0x67, 0x07, 0xa2, 0x90, 0x47, 0x4e, 0x65, 0x07, 0xd1, 0x30, 0xa4, 0x29, 0xa4, 0xb4, 0xb6, 0xb6, + 0x9c, 0x4d, 0xf9, 0x3c, 0x37, 0x36, 0x95, 0xa5, 0xd5, 0xc5, 0x6c, 0xda, 0xe7, 0xb9, 0xa8, 0xac, + 0x5d, 0x5e, 0xcf, 0x82, 0xcf, 0x61, 0xa5, 0xbc, 0xb1, 0x31, 0xb7, 0x58, 0xce, 0x66, 0x7c, 0x8c, + 0xd2, 0x33, 0x9b, 0xe5, 0x8d, 0xec, 0x50, 0x44, 0xac, 0x47, 0x4e, 0x65, 0x87, 0xfd, 0x21, 0xca, + 0xab, 0x97, 0x57, 0xb2, 0x23, 0x68, 0x0c, 0x86, 0xd9, 0x10, 0x42, 0x88, 0xd1, 0x26, 0xd0, 0x99, + 0xd3, 0xd9, 0x6c, 0x20, 0x08, 0xe3, 0x32, 0x16, 0x01, 0x9c, 0x39, 0x9d, 0x45, 0xf2, 0x3c, 0x24, + 0xa9, 0x1b, 0x22, 0x04, 0x23, 0xcb, 0x73, 0xa5, 0xf2, 0x72, 0x65, 0x6d, 0x7d, 0x73, 0x69, 0x6d, + 0x75, 0x6e, 0x39, 0x2b, 0x05, 0x30, 0xa5, 0xfc, 0xe4, 0xe5, 0x25, 0xa5, 0xbc, 0x90, 0x8d, 0x85, + 0x61, 0xeb, 0xe5, 0xb9, 0xcd, 0xf2, 0x42, 0x36, 0x2e, 0x6b, 0x30, 0xd1, 0x6e, 0x41, 0x6d, 0x1b, + 0x42, 0x21, 0x5f, 0x88, 0x75, 0xf0, 0x05, 0xca, 0xab, 0xd9, 0x17, 0xe4, 0xef, 0xc4, 0x60, 0xbc, + 0xcd, 0xa6, 0xd2, 0x76, 0x90, 0x27, 0x20, 0xc9, 0x7c, 0x99, 0x6d, 0xb3, 0xf7, 0xb5, 0xdd, 0x9d, + 0xa8, 0x67, 0xb7, 0x6c, 0xb5, 0x94, 0x2e, 0x9c, 0x6a, 0xc4, 0x3b, 0xa4, 0x1a, 0x84, 0x45, 0x8b, + 0xc3, 0xfe, 0x44, 0xcb, 0xe2, 0xcf, 0xf6, 0xc7, 0x33, 0xbd, 0xec, 0x8f, 0x14, 0xd6, 0xdf, 0x26, + 0x90, 0x6c, 0xb3, 0x09, 0x9c, 0x83, 0xb1, 0x16, 0x46, 0x3d, 0x2f, 0xc6, 0x1f, 0x96, 0x20, 0xd7, + 0xc9, 0x38, 0x5d, 0x96, 0xc4, 0x58, 0x64, 0x49, 0x3c, 0xd7, 0x6c, 0xc1, 0x3b, 0x3b, 0x4f, 0x42, + 0xcb, 0x5c, 0x7f, 0x59, 0x82, 0xc9, 0xf6, 0x29, 0x65, 0x5b, 0x19, 0xde, 0x03, 0x03, 0x75, 0xec, + 0xed, 0x58, 0x22, 0xad, 0xba, 0xa7, 0xcd, 0x66, 0x4d, 0xba, 0x9b, 0x27, 0x9b, 0x53, 0x85, 0x77, + 0xfb, 0x78, 0xa7, 0xbc, 0x90, 0x49, 0xd3, 0x22, 0xe9, 0xc7, 0x63, 0x70, 0xb8, 0x2d, 0xf3, 0xb6, + 0x82, 0x1e, 0x07, 0xd0, 0x4d, 0xbb, 0xe1, 0xb1, 0xd4, 0x89, 0xad, 0xc4, 0x69, 0x0a, 0xa1, 0x8b, + 0x17, 0x59, 0x65, 0x1b, 0x9e, 0xdf, 0x1f, 0xa7, 0xfd, 0xc0, 0x40, 0x14, 0xe1, 0x6c, 0x20, 0x68, + 0x82, 0x0a, 0x3a, 0xd5, 0x41, 0xd3, 0x16, 0xc7, 0x7c, 0x08, 0xb2, 0x9a, 0xa1, 0x63, 0xd3, 0xab, + 0xb8, 0x9e, 0x83, 0xd5, 0xba, 0x6e, 0xd6, 0xe8, 0x56, 0x93, 0x2a, 0x26, 0xb7, 0x55, 0xc3, 0xc5, + 0xca, 0x28, 0xeb, 0xde, 0x10, 0xbd, 0x84, 0x82, 0x3a, 0x90, 0x13, 0xa2, 0x18, 0x88, 0x50, 0xb0, + 0x6e, 0x9f, 0x42, 0xfe, 0x54, 0x1a, 0x32, 0xa1, 0x04, 0x1c, 0xdd, 0x09, 0x43, 0xcf, 0xaa, 0xd7, + 0xd4, 0x8a, 0x38, 0x54, 0x31, 0x4b, 0x64, 0x08, 0x6c, 0x9d, 0x1f, 0xac, 0x1e, 0x82, 0x09, 0x8a, + 0x62, 0x35, 0x3c, 0xec, 0x54, 0x34, 0x43, 0x75, 0x5d, 0x6a, 0xb4, 0x14, 0x45, 0x45, 0xa4, 0x6f, + 0x8d, 0x74, 0xcd, 0x8b, 0x1e, 0xf4, 0x28, 0x8c, 0x53, 0x8a, 0x7a, 0xc3, 0xf0, 0x74, 0xdb, 0xc0, + 0x15, 0x72, 0xcc, 0x73, 0xe9, 0x96, 0xe3, 0x4b, 0x36, 0x46, 0x30, 0x56, 0x38, 0x02, 0x91, 0xc8, + 0x45, 0x0b, 0x70, 0x9c, 0x92, 0xd5, 0xb0, 0x89, 0x1d, 0xd5, 0xc3, 0x15, 0xfc, 0x5c, 0x43, 0x35, + 0xdc, 0x8a, 0x6a, 0x56, 0x2b, 0x3b, 0xaa, 0xbb, 0x93, 0x9b, 0x20, 0x0c, 0x4a, 0xb1, 0x9c, 0xa4, + 0x1c, 0x21, 0x88, 0x8b, 0x1c, 0xaf, 0x4c, 0xd1, 0xe6, 0xcc, 0xea, 0x05, 0xd5, 0xdd, 0x41, 0x45, + 0x98, 0xa4, 0x5c, 0x5c, 0xcf, 0xd1, 0xcd, 0x5a, 0x45, 0xdb, 0xc1, 0xda, 0xd5, 0x4a, 0xc3, 0xdb, + 0x3e, 0x9b, 0x3b, 0x1a, 0x1e, 0x9f, 0x4a, 0xb8, 0x41, 0x71, 0xe6, 0x09, 0xca, 0x65, 0x6f, 0xfb, + 0x2c, 0xda, 0x80, 0x21, 0x32, 0x19, 0x75, 0xfd, 0x06, 0xae, 0x6c, 0x5b, 0x0e, 0xdd, 0x43, 0x47, + 0xda, 0x2c, 0x4d, 0x21, 0x0b, 0x16, 0xd6, 0x38, 0xc1, 0x8a, 0x55, 0xc5, 0xc5, 0xe4, 0xc6, 0x7a, + 0xb9, 0xbc, 0xa0, 0x64, 0x04, 0x97, 0xf3, 0x96, 0x43, 0x1c, 0xaa, 0x66, 0xf9, 0x06, 0xce, 0x30, + 0x87, 0xaa, 0x59, 0xc2, 0xbc, 0x8f, 0xc2, 0xb8, 0xa6, 0x31, 0x9d, 0x75, 0xad, 0xc2, 0x0f, 0x63, + 0x6e, 0x2e, 0x1b, 0x31, 0x96, 0xa6, 0x2d, 0x32, 0x04, 0xee, 0xe3, 0x2e, 0x7a, 0x1c, 0x0e, 0x07, + 0xc6, 0x0a, 0x13, 0x8e, 0xb5, 0x68, 0xd9, 0x4c, 0xfa, 0x28, 0x8c, 0xdb, 0x7b, 0xad, 0x84, 0x28, + 0x32, 0xa2, 0xbd, 0xd7, 0x4c, 0xf6, 0x18, 0x4c, 0xd8, 0x3b, 0x76, 0x2b, 0xdd, 0xc9, 0x30, 0x1d, + 0xb2, 0x77, 0xec, 0x66, 0xc2, 0x77, 0xd1, 0x93, 0xb9, 0x83, 0x35, 0xd5, 0xc3, 0xd5, 0xdc, 0x1d, + 0x61, 0xf4, 0x50, 0x07, 0x2a, 0x40, 0x56, 0xd3, 0x2a, 0xd8, 0x54, 0xb7, 0x0c, 0x5c, 0x51, 0x1d, + 0x6c, 0xaa, 0x6e, 0x6e, 0x9a, 0x22, 0x27, 0x3c, 0xa7, 0x81, 0x95, 0x11, 0x4d, 0x2b, 0xd3, 0xce, + 0x39, 0xda, 0x87, 0x4e, 0xc2, 0x98, 0xb5, 0xf5, 0xac, 0xc6, 0x3c, 0xb2, 0x62, 0x3b, 0x78, 0x5b, + 0xdf, 0xcd, 0xdd, 0x4d, 0xcd, 0x3b, 0x4a, 0x3a, 0xa8, 0x3f, 0xae, 0x53, 0x30, 0xba, 0x0f, 0xb2, + 0x9a, 0xbb, 0xa3, 0x3a, 0x36, 0x5d, 0x92, 0x5d, 0x5b, 0xd5, 0x70, 0xee, 0x5d, 0x0c, 0x95, 0xc1, + 0x57, 0x05, 0x98, 0x44, 0x84, 0x7b, 0x5d, 0xdf, 0xf6, 0x04, 0xc7, 0x7b, 0x59, 0x44, 0x50, 0x18, + 0xe7, 0x76, 0x02, 0xb2, 0xc4, 0x12, 0x91, 0x81, 0x4f, 0x50, 0xb4, 0x11, 0x7b, 0xc7, 0x0e, 0x8f, + 0x7b, 0x17, 0x0c, 0x13, 0xcc, 0x60, 0xd0, 0xfb, 0x58, 0xe2, 0x66, 0xef, 0x84, 0x46, 0x3c, 0x0d, + 0x93, 0x04, 0xa9, 0x8e, 0x3d, 0xb5, 0xaa, 0x7a, 0x6a, 0x08, 0xfb, 0x01, 0x8a, 0x4d, 0xcc, 0xbe, + 0xc2, 0x3b, 0x23, 0x72, 0x3a, 0x8d, 0xad, 0x3d, 0xdf, 0xb1, 0x1e, 0x64, 0x72, 0x12, 0x98, 0x70, + 0xad, 0x37, 0x2d, 0x39, 0x97, 0x8b, 0x30, 0x14, 0xf6, 0x7b, 0x94, 0x06, 0xe6, 0xf9, 0x59, 0x89, + 0x24, 0x41, 0xf3, 0x6b, 0x0b, 0x24, 0x7d, 0x79, 0x5f, 0x39, 0x1b, 0x23, 0x69, 0xd4, 0xf2, 0xd2, + 0x66, 0xb9, 0xa2, 0x5c, 0x5e, 0xdd, 0x5c, 0x5a, 0x29, 0x67, 0xe3, 0xa1, 0xc4, 0xfe, 0x62, 0x22, + 0x75, 0x4f, 0xf6, 0x5e, 0xf9, 0x95, 0x18, 0x8c, 0x44, 0x4f, 0x6a, 0xe8, 0xc7, 0xe0, 0x0e, 0x51, + 0x56, 0x71, 0xb1, 0x57, 0xb9, 0xae, 0x3b, 0x34, 0x20, 0xeb, 0x2a, 0xdb, 0x1c, 0x7d, 0xff, 0x99, + 0xe0, 0x58, 0x1b, 0xd8, 0x7b, 0x4a, 0x77, 0x48, 0xb8, 0xd5, 0x55, 0x0f, 0x2d, 0xc3, 0xb4, 0x69, + 0x55, 0x5c, 0x4f, 0x35, 0xab, 0xaa, 0x53, 0xad, 0x04, 0x05, 0xad, 0x8a, 0xaa, 0x69, 0xd8, 0x75, + 0x2d, 0xb6, 0x11, 0xfa, 0x5c, 0x8e, 0x99, 0xd6, 0x06, 0x47, 0x0e, 0x76, 0x88, 0x39, 0x8e, 0xda, + 0xe4, 0xbe, 0xf1, 0x4e, 0xee, 0x7b, 0x14, 0xd2, 0x75, 0xd5, 0xae, 0x60, 0xd3, 0x73, 0xf6, 0x68, + 0x7e, 0x9e, 0x52, 0x52, 0x75, 0xd5, 0x2e, 0x93, 0xf6, 0x5b, 0x72, 0x4c, 0xba, 0x98, 0x48, 0xa5, + 0xb2, 0xe9, 0x8b, 0x89, 0x54, 0x3a, 0x0b, 0xf2, 0xab, 0x71, 0x18, 0x0a, 0xe7, 0xeb, 0xe4, 0xf8, + 0xa3, 0xd1, 0x1d, 0x4b, 0xa2, 0x6b, 0xda, 0x5d, 0xfb, 0x66, 0xf7, 0x85, 0x79, 0xb2, 0x95, 0x15, + 0x07, 0x58, 0x72, 0xac, 0x30, 0x4a, 0x92, 0x46, 0x10, 0x67, 0xc3, 0x2c, 0x19, 0x49, 0x29, 0xbc, + 0x85, 0x16, 0x61, 0xe0, 0x59, 0x97, 0xf2, 0x1e, 0xa0, 0xbc, 0xef, 0xde, 0x9f, 0xf7, 0xc5, 0x0d, + 0xca, 0x3c, 0x7d, 0x71, 0xa3, 0xb2, 0xba, 0xa6, 0xac, 0xcc, 0x2d, 0x2b, 0x9c, 0x1c, 0x1d, 0x81, + 0x84, 0xa1, 0xde, 0xd8, 0x8b, 0x6e, 0x7a, 0x14, 0xd4, 0xeb, 0x24, 0x1c, 0x81, 0xc4, 0x75, 0xac, + 0x5e, 0x8d, 0x6e, 0x35, 0x14, 0xf4, 0x26, 0x06, 0xc3, 0x2c, 0x24, 0xa9, 0xbd, 0x10, 0x00, 0xb7, + 0x58, 0xf6, 0x10, 0x4a, 0x41, 0x62, 0x7e, 0x4d, 0x21, 0x01, 0x91, 0x85, 0x21, 0x06, 0xad, 0xac, + 0x2f, 0x95, 0xe7, 0xcb, 0xd9, 0x98, 0xfc, 0x28, 0x0c, 0x30, 0x23, 0x90, 0x60, 0xf1, 0xcd, 0x90, + 0x3d, 0xc4, 0x9b, 0x9c, 0x87, 0x24, 0x7a, 0x2f, 0xaf, 0x94, 0xca, 0x4a, 0x36, 0x16, 0x9d, 0xea, + 0x44, 0x36, 0x29, 0xbb, 0x30, 0x14, 0xce, 0xc3, 0xdf, 0x9a, 0xc3, 0xf8, 0xd7, 0x24, 0xc8, 0x84, + 0xf2, 0x6a, 0x92, 0x10, 0xa9, 0x86, 0x61, 0x5d, 0xaf, 0xa8, 0x86, 0xae, 0xba, 0xdc, 0x35, 0x80, + 0x82, 0xe6, 0x08, 0xa4, 0xd7, 0xa9, 0x7b, 0x8b, 0x42, 0x24, 0x99, 0x1d, 0x90, 0x3f, 0x2f, 0x41, + 0xb6, 0x39, 0xb1, 0x6d, 0x12, 0x53, 0xfa, 0x61, 0x8a, 0x29, 0x7f, 0x4e, 0x82, 0x91, 0x68, 0x36, + 0xdb, 0x24, 0xde, 0x9d, 0x3f, 0x54, 0xf1, 0xfe, 0x20, 0x06, 0xc3, 0x91, 0x1c, 0xb6, 0x57, 0xe9, + 0x9e, 0x83, 0x31, 0xbd, 0x8a, 0xeb, 0xb6, 0xe5, 0x61, 0x53, 0xdb, 0xab, 0x18, 0xf8, 0x1a, 0x36, + 0x72, 0x32, 0x5d, 0x34, 0x66, 0xf7, 0xcf, 0x92, 0x0b, 0x4b, 0x01, 0xdd, 0x32, 0x21, 0x2b, 0x8e, + 0x2f, 0x2d, 0x94, 0x57, 0xd6, 0xd7, 0x36, 0xcb, 0xab, 0xf3, 0xcf, 0x54, 0x2e, 0xaf, 0x5e, 0x5a, + 0x5d, 0x7b, 0x6a, 0x55, 0xc9, 0xea, 0x4d, 0x68, 0x6f, 0x62, 0xd8, 0xaf, 0x43, 0xb6, 0x59, 0x28, + 0x74, 0x07, 0xb4, 0x13, 0x2b, 0x7b, 0x08, 0x8d, 0xc3, 0xe8, 0xea, 0x5a, 0x65, 0x63, 0x69, 0xa1, + 0x5c, 0x29, 0x9f, 0x3f, 0x5f, 0x9e, 0xdf, 0xdc, 0x60, 0x75, 0x0f, 0x1f, 0x7b, 0x33, 0x12, 0xe0, + 0xf2, 0x67, 0xe3, 0x30, 0xde, 0x46, 0x12, 0x34, 0xc7, 0x4f, 0x2c, 0xec, 0x10, 0xf5, 0x60, 0x2f, + 0xd2, 0x17, 0x48, 0xce, 0xb0, 0xae, 0x3a, 0x1e, 0x3f, 0xe0, 0xdc, 0x07, 0xc4, 0x4a, 0xa6, 0xa7, + 0x6f, 0xeb, 0xd8, 0xe1, 0xf5, 0x24, 0x76, 0x8c, 0x19, 0x0d, 0xe0, 0xac, 0xa4, 0xf4, 0x00, 0x20, + 0xdb, 0x72, 0x75, 0x4f, 0xbf, 0x86, 0x2b, 0xba, 0x29, 0x8a, 0x4f, 0xe4, 0x58, 0x93, 0x50, 0xb2, + 0xa2, 0x67, 0xc9, 0xf4, 0x7c, 0x6c, 0x13, 0xd7, 0xd4, 0x26, 0x6c, 0xb2, 0x98, 0xc7, 0x95, 0xac, + 0xe8, 0xf1, 0xb1, 0xef, 0x84, 0xa1, 0xaa, 0xd5, 0x20, 0xb9, 0x1e, 0xc3, 0x23, 0x7b, 0x87, 0xa4, + 0x64, 0x18, 0xcc, 0x47, 0xe1, 0x59, 0x7c, 0x50, 0xf5, 0x1a, 0x52, 0x32, 0x0c, 0xc6, 0x50, 0xee, + 0x85, 0x51, 0xb5, 0x56, 0x73, 0x08, 0x73, 0xc1, 0x88, 0x9d, 0x4b, 0x46, 0x7c, 0x30, 0x45, 0xcc, + 0x5f, 0x84, 0x94, 0xb0, 0x03, 0xd9, 0xaa, 0x89, 0x25, 0x2a, 0x36, 0x3b, 0x6c, 0xc7, 0x4e, 0xa4, + 0x95, 0x94, 0x29, 0x3a, 0xef, 0x84, 0x21, 0xdd, 0xad, 0x04, 0x45, 0xfc, 0xd8, 0x4c, 0xec, 0x44, + 0x4a, 0xc9, 0xe8, 0xae, 0x5f, 0x00, 0x95, 0xbf, 0x1c, 0x83, 0x91, 0xe8, 0x43, 0x08, 0xb4, 0x00, + 0x29, 0xc3, 0xd2, 0x54, 0xea, 0x5a, 0xec, 0x09, 0xd8, 0x89, 0x2e, 0xcf, 0x2d, 0x0a, 0xcb, 0x1c, + 0x5f, 0xf1, 0x29, 0xf3, 0xff, 0x52, 0x82, 0x94, 0x00, 0xa3, 0x49, 0x48, 0xd8, 0xaa, 0xb7, 0x43, + 0xd9, 0x25, 0x4b, 0xb1, 0xac, 0xa4, 0xd0, 0x36, 0x81, 0xbb, 0xb6, 0x6a, 0x52, 0x17, 0xe0, 0x70, + 0xd2, 0x26, 0xf3, 0x6a, 0x60, 0xb5, 0x4a, 0x0f, 0x3d, 0x56, 0xbd, 0x8e, 0x4d, 0xcf, 0x15, 0xf3, + 0xca, 0xe1, 0xf3, 0x1c, 0x8c, 0xee, 0x87, 0x31, 0xcf, 0x51, 0x75, 0x23, 0x82, 0x9b, 0xa0, 0xb8, + 0x59, 0xd1, 0xe1, 0x23, 0x17, 0xe1, 0x88, 0xe0, 0x5b, 0xc5, 0x9e, 0xaa, 0xed, 0xe0, 0x6a, 0x40, + 0x34, 0x40, 0x8b, 0x1b, 0x77, 0x70, 0x84, 0x05, 0xde, 0x2f, 0x68, 0xe5, 0x57, 0x24, 0x18, 0x13, + 0xc7, 0xb4, 0xaa, 0x6f, 0xac, 0x15, 0x00, 0xd5, 0x34, 0x2d, 0x2f, 0x6c, 0xae, 0x56, 0x57, 0x6e, + 0xa1, 0x2b, 0xcc, 0xf9, 0x44, 0x4a, 0x88, 0x41, 0xbe, 0x0e, 0x10, 0xf4, 0x74, 0x34, 0xdb, 0x34, + 0x64, 0xf8, 0x13, 0x26, 0xfa, 0x98, 0x92, 0x1d, 0xec, 0x81, 0x81, 0xc8, 0x79, 0x0e, 0x4d, 0x40, + 0x72, 0x0b, 0xd7, 0x74, 0x93, 0xd7, 0x8d, 0x59, 0x43, 0x94, 0x5f, 0x12, 0x7e, 0xf9, 0xa5, 0xf4, + 0x09, 0x09, 0xc6, 0x35, 0xab, 0xde, 0x2c, 0x6f, 0x29, 0xdb, 0x54, 0x5d, 0x70, 0x2f, 0x48, 0xef, + 0x7b, 0x4f, 0x4d, 0xf7, 0x76, 0x1a, 0x5b, 0x05, 0xcd, 0xaa, 0xcf, 0xd6, 0x2c, 0x43, 0x35, 0x6b, + 0xc1, 0x73, 0x56, 0xfa, 0x43, 0x7b, 0xb0, 0x86, 0xcd, 0x07, 0x6b, 0x56, 0xe8, 0xa9, 0xeb, 0xb9, + 0xe0, 0xe7, 0xff, 0x91, 0xa4, 0x2f, 0xc6, 0xe2, 0x8b, 0xeb, 0xa5, 0xaf, 0xc4, 0xf2, 0x8b, 0x6c, + 0xb8, 0x75, 0x61, 0x1e, 0x05, 0x6f, 0x1b, 0x58, 0x23, 0x2a, 0xc3, 0xf7, 0xef, 0x87, 0x89, 0x9a, + 0x55, 0xb3, 0x28, 0xc7, 0x59, 0xf2, 0x8b, 0x3f, 0xb9, 0x4d, 0xfb, 0xd0, 0x7c, 0xd7, 0xc7, 0xbc, + 0xc5, 0x55, 0x18, 0xe7, 0xc8, 0x15, 0xfa, 0xe8, 0x88, 0x1d, 0x6c, 0xd0, 0xbe, 0x55, 0xb5, 0xdc, + 0x2f, 0x7f, 0x97, 0x6e, 0xe8, 0xca, 0x18, 0x27, 0x25, 0x7d, 0xec, 0xec, 0x53, 0x54, 0xe0, 0x70, + 0x84, 0x1f, 0x0b, 0x5b, 0xec, 0x74, 0xe1, 0xf8, 0x9b, 0x9c, 0xe3, 0x78, 0x88, 0xe3, 0x06, 0x27, + 0x2d, 0xce, 0xc3, 0x70, 0x3f, 0xbc, 0x7e, 0x8b, 0xf3, 0x1a, 0xc2, 0x61, 0x26, 0x8b, 0x30, 0x4a, + 0x99, 0x68, 0x0d, 0xd7, 0xb3, 0xea, 0x74, 0x4d, 0xdc, 0x9f, 0xcd, 0x6f, 0x7f, 0x97, 0xc5, 0xd1, + 0x08, 0x21, 0x9b, 0xf7, 0xa9, 0x8a, 0x45, 0xa0, 0x4f, 0xcb, 0xaa, 0x58, 0x33, 0xba, 0x70, 0xf8, + 0x26, 0x17, 0xc4, 0xc7, 0x2f, 0x5e, 0x81, 0x09, 0xf2, 0x9b, 0x2e, 0x59, 0x61, 0x49, 0xba, 0x97, + 0xe0, 0x72, 0xaf, 0x7c, 0x98, 0x85, 0xea, 0xb8, 0xcf, 0x20, 0x24, 0x53, 0x68, 0x16, 0x6b, 0xd8, + 0xf3, 0xb0, 0xe3, 0x56, 0x54, 0xa3, 0x9d, 0x78, 0xa1, 0x1a, 0x46, 0xee, 0x33, 0x3f, 0x88, 0xce, + 0xe2, 0x22, 0xa3, 0x9c, 0x33, 0x8c, 0xe2, 0x65, 0xb8, 0xa3, 0x8d, 0x57, 0xf4, 0xc0, 0xf3, 0xb3, + 0x9c, 0xe7, 0x44, 0x8b, 0x67, 0x10, 0xb6, 0xeb, 0x20, 0xe0, 0xfe, 0x5c, 0xf6, 0xc0, 0xf3, 0xaf, + 0x70, 0x9e, 0x88, 0xd3, 0x8a, 0x29, 0x25, 0x1c, 0x2f, 0xc2, 0xd8, 0x35, 0xec, 0x6c, 0x59, 0x2e, + 0xaf, 0x1b, 0xf5, 0xc0, 0xee, 0x73, 0x9c, 0xdd, 0x28, 0x27, 0xa4, 0x85, 0x24, 0xc2, 0xeb, 0x71, + 0x48, 0x6d, 0xab, 0x1a, 0xee, 0x81, 0xc5, 0x8b, 0x9c, 0xc5, 0x20, 0xc1, 0x27, 0xa4, 0x73, 0x30, + 0x54, 0xb3, 0xf8, 0xae, 0xd5, 0x9d, 0xfc, 0xf3, 0x9c, 0x3c, 0x23, 0x68, 0x38, 0x0b, 0xdb, 0xb2, + 0x1b, 0x06, 0xd9, 0xd2, 0xba, 0xb3, 0xf8, 0xab, 0x82, 0x85, 0xa0, 0xe1, 0x2c, 0xfa, 0x30, 0xeb, + 0x4b, 0x82, 0x85, 0x1b, 0xb2, 0xe7, 0x13, 0x90, 0xb1, 0x4c, 0x63, 0xcf, 0x32, 0x7b, 0x11, 0xe2, + 0x0b, 0x9c, 0x03, 0x70, 0x12, 0xc2, 0xe0, 0x1c, 0xa4, 0x7b, 0x9d, 0x88, 0xbf, 0xfe, 0x03, 0x11, + 0x1e, 0x62, 0x06, 0x16, 0x61, 0x54, 0x2c, 0x50, 0xba, 0x65, 0xf6, 0xc0, 0xe2, 0x6f, 0x70, 0x16, + 0x23, 0x21, 0x32, 0xae, 0x86, 0x87, 0x5d, 0xaf, 0x86, 0x7b, 0x61, 0xf2, 0x65, 0xa1, 0x06, 0x27, + 0xe1, 0xa6, 0xdc, 0xc2, 0xa6, 0xb6, 0xd3, 0x1b, 0x87, 0x9f, 0x17, 0xa6, 0x14, 0x34, 0x84, 0xc5, + 0x3c, 0x0c, 0xd7, 0x55, 0xc7, 0xdd, 0x51, 0x8d, 0x9e, 0xa6, 0xe3, 0x6f, 0x72, 0x1e, 0x43, 0x3e, + 0x11, 0xb7, 0x48, 0xc3, 0xec, 0x87, 0xcd, 0x57, 0x84, 0x45, 0x42, 0x64, 0x3c, 0xf4, 0x5c, 0x8f, + 0x16, 0xd9, 0xfa, 0xe1, 0xf6, 0x0b, 0x22, 0xf4, 0x18, 0xed, 0x4a, 0x98, 0xe3, 0x39, 0x48, 0xbb, + 0xfa, 0x8d, 0x9e, 0xd8, 0xfc, 0x2d, 0x31, 0xd3, 0x94, 0x80, 0x10, 0x3f, 0x03, 0x47, 0xda, 0x6e, + 0x13, 0x3d, 0x30, 0xfb, 0xdb, 0x9c, 0xd9, 0x64, 0x9b, 0xad, 0x82, 0x2f, 0x09, 0xfd, 0xb2, 0xfc, + 0x3b, 0x62, 0x49, 0xc0, 0x4d, 0xbc, 0xd6, 0xc9, 0x39, 0xc2, 0x55, 0xb7, 0xfb, 0xb3, 0xda, 0x2f, + 0x0a, 0xab, 0x31, 0xda, 0x88, 0xd5, 0x36, 0x61, 0x92, 0x73, 0xec, 0x6f, 0x5e, 0x7f, 0x49, 0x2c, + 0xac, 0x8c, 0xfa, 0x72, 0x74, 0x76, 0xdf, 0x0f, 0x79, 0xdf, 0x9c, 0x22, 0x61, 0x75, 0x2b, 0x75, + 0xd5, 0xee, 0x81, 0xf3, 0x2f, 0x73, 0xce, 0x62, 0xc5, 0xf7, 0x33, 0x5e, 0x77, 0x45, 0xb5, 0x09, + 0xf3, 0xa7, 0x21, 0x27, 0x98, 0x37, 0x4c, 0x07, 0x6b, 0x56, 0xcd, 0xd4, 0x6f, 0xe0, 0x6a, 0x0f, + 0xac, 0xff, 0x6e, 0xd3, 0x54, 0x5d, 0x0e, 0x91, 0x13, 0xce, 0x4b, 0x90, 0xf5, 0x73, 0x95, 0x8a, + 0x5e, 0xb7, 0x2d, 0xc7, 0xeb, 0xc2, 0xf1, 0xab, 0x62, 0xa6, 0x7c, 0xba, 0x25, 0x4a, 0x56, 0x2c, + 0x03, 0x7b, 0xf2, 0xdc, 0xab, 0x4b, 0xfe, 0x0a, 0x67, 0x34, 0x1c, 0x50, 0xf1, 0x85, 0x43, 0xb3, + 0xea, 0xb6, 0xea, 0xf4, 0xb2, 0xfe, 0xfd, 0x3d, 0xb1, 0x70, 0x70, 0x12, 0xbe, 0x70, 0x78, 0x7b, + 0x36, 0x26, 0xbb, 0x7d, 0x0f, 0x1c, 0x7e, 0x55, 0x2c, 0x1c, 0x82, 0x86, 0xb3, 0x10, 0x09, 0x43, + 0x0f, 0x2c, 0xfe, 0xbe, 0x60, 0x21, 0x68, 0x08, 0x8b, 0x27, 0x83, 0x8d, 0xd6, 0xc1, 0x35, 0xdd, + 0xf5, 0x1c, 0x96, 0x26, 0xef, 0xcf, 0xea, 0x1f, 0xfc, 0x20, 0x9a, 0x84, 0x29, 0x21, 0x52, 0xb2, + 0x12, 0xf1, 0xb2, 0x2b, 0x3d, 0x45, 0x75, 0x17, 0xec, 0xd7, 0xc4, 0x4a, 0x14, 0x22, 0x23, 0xb2, + 0x85, 0x32, 0x44, 0x62, 0x76, 0x8d, 0x9c, 0x1d, 0x7a, 0x60, 0xf7, 0x0f, 0x9b, 0x84, 0xdb, 0x10, + 0xb4, 0x84, 0x67, 0x28, 0xff, 0x69, 0x98, 0x57, 0xf1, 0x5e, 0x4f, 0xde, 0xf9, 0xeb, 0x4d, 0xf9, + 0xcf, 0x65, 0x46, 0xc9, 0xd6, 0x90, 0xd1, 0xa6, 0x7c, 0x0a, 0x75, 0xbb, 0x67, 0x94, 0xfb, 0xc9, + 0xd7, 0xb8, 0xbe, 0xd1, 0x74, 0xaa, 0xb8, 0x4c, 0x9c, 0x3c, 0x9a, 0xf4, 0x74, 0x67, 0xf6, 0xe1, + 0xd7, 0x7c, 0x3f, 0x8f, 0xe4, 0x3c, 0xc5, 0xf3, 0x30, 0x1c, 0x49, 0x78, 0xba, 0xb3, 0xfa, 0x08, + 0x67, 0x35, 0x14, 0xce, 0x77, 0x8a, 0x8f, 0x42, 0x82, 0x24, 0x2f, 0xdd, 0xc9, 0x3f, 0xca, 0xc9, + 0x29, 0x7a, 0xf1, 0xdd, 0x90, 0x12, 0x49, 0x4b, 0x77, 0xd2, 0x8f, 0x71, 0x52, 0x9f, 0x84, 0x90, + 0x8b, 0x84, 0xa5, 0x3b, 0xf9, 0x9f, 0x15, 0xe4, 0x82, 0x84, 0x90, 0xf7, 0x6e, 0xc2, 0xaf, 0xfd, + 0xb9, 0x04, 0xdf, 0x74, 0x84, 0xed, 0xce, 0xc1, 0x20, 0xcf, 0x54, 0xba, 0x53, 0x7f, 0x9c, 0x0f, + 0x2e, 0x28, 0x8a, 0x8f, 0x41, 0xb2, 0x47, 0x83, 0xff, 0x0c, 0x27, 0x65, 0xf8, 0xc5, 0x79, 0xc8, + 0x84, 0xb2, 0x93, 0xee, 0xe4, 0x7f, 0x81, 0x93, 0x87, 0xa9, 0x88, 0xe8, 0x3c, 0x3b, 0xe9, 0xce, + 0xe0, 0x13, 0x42, 0x74, 0x4e, 0x41, 0xcc, 0x26, 0x12, 0x93, 0xee, 0xd4, 0x9f, 0x14, 0x56, 0x17, + 0x24, 0xc5, 0x27, 0x20, 0xed, 0x6f, 0x36, 0xdd, 0xe9, 0x3f, 0xc5, 0xe9, 0x03, 0x1a, 0x62, 0x81, + 0xd0, 0x66, 0xd7, 0x9d, 0xc5, 0x5f, 0x14, 0x16, 0x08, 0x51, 0x91, 0x30, 0x6a, 0x4e, 0x60, 0xba, + 0x73, 0xfa, 0x59, 0x11, 0x46, 0x4d, 0xf9, 0x0b, 0x99, 0x4d, 0xba, 0xe6, 0x77, 0x67, 0xf1, 0x73, + 0x62, 0x36, 0x29, 0x3e, 0x11, 0xa3, 0x39, 0x23, 0xe8, 0xce, 0xe3, 0x2f, 0x0b, 0x31, 0x9a, 0x12, + 0x82, 0xe2, 0x3a, 0xa0, 0xd6, 0x6c, 0xa0, 0x3b, 0xbf, 0x4f, 0x73, 0x7e, 0x63, 0x2d, 0xc9, 0x40, + 0xf1, 0x29, 0x98, 0x6c, 0x9f, 0x09, 0x74, 0xe7, 0xfa, 0x99, 0xd7, 0x9a, 0xce, 0x6e, 0xe1, 0x44, + 0xa0, 0xb8, 0x19, 0x6c, 0x29, 0xe1, 0x2c, 0xa0, 0x3b, 0xdb, 0xcf, 0xbe, 0x16, 0x5d, 0xb8, 0xc3, + 0x49, 0x40, 0x71, 0x0e, 0x20, 0xd8, 0x80, 0xbb, 0xf3, 0xfa, 0x1c, 0xe7, 0x15, 0x22, 0x22, 0xa1, + 0xc1, 0xf7, 0xdf, 0xee, 0xf4, 0x2f, 0x8a, 0xd0, 0xe0, 0x14, 0x24, 0x34, 0xc4, 0xd6, 0xdb, 0x9d, + 0xfa, 0xf3, 0x22, 0x34, 0x04, 0x09, 0xf1, 0xec, 0xd0, 0xee, 0xd6, 0x9d, 0xc3, 0x17, 0x84, 0x67, + 0x87, 0xa8, 0x8a, 0xab, 0x30, 0xd6, 0xb2, 0x21, 0x76, 0x67, 0xf5, 0x45, 0xce, 0x2a, 0xdb, 0xbc, + 0x1f, 0x86, 0x37, 0x2f, 0xbe, 0x19, 0x76, 0xe7, 0xf6, 0xa5, 0xa6, 0xcd, 0x8b, 0xef, 0x85, 0xc5, + 0x73, 0x90, 0x32, 0x1b, 0x86, 0x41, 0x82, 0x07, 0xed, 0x7f, 0x37, 0x30, 0xf7, 0x87, 0xaf, 0x73, + 0xeb, 0x08, 0x82, 0xe2, 0xa3, 0x90, 0xc4, 0xf5, 0x2d, 0x5c, 0xed, 0x46, 0xf9, 0xfd, 0xd7, 0xc5, + 0x82, 0x49, 0xb0, 0x8b, 0x4f, 0x00, 0xb0, 0xd2, 0x08, 0x7d, 0x3c, 0xd8, 0x85, 0xf6, 0xbf, 0xbc, + 0xce, 0x2f, 0xe3, 0x04, 0x24, 0x01, 0x03, 0x76, 0xb5, 0x67, 0x7f, 0x06, 0x3f, 0x88, 0x32, 0xa0, + 0x33, 0xf2, 0x38, 0x0c, 0x3e, 0xeb, 0x5a, 0xa6, 0xa7, 0xd6, 0xba, 0x51, 0xff, 0x57, 0x4e, 0x2d, + 0xf0, 0x89, 0xc1, 0xea, 0x96, 0x83, 0x3d, 0xb5, 0xe6, 0x76, 0xa3, 0xfd, 0x6f, 0x9c, 0xd6, 0x27, + 0x20, 0xc4, 0x9a, 0xea, 0x7a, 0xbd, 0xe8, 0xfd, 0x47, 0x82, 0x58, 0x10, 0x10, 0xa1, 0xc9, 0xef, + 0xab, 0x78, 0xaf, 0x1b, 0xed, 0x1f, 0x0b, 0xa1, 0x39, 0x7e, 0xf1, 0xdd, 0x90, 0x26, 0x3f, 0xd9, + 0x0d, 0xbb, 0x2e, 0xc4, 0xff, 0x9d, 0x13, 0x07, 0x14, 0x64, 0x64, 0xd7, 0xab, 0x7a, 0x7a, 0x77, + 0x63, 0xdf, 0xe2, 0x33, 0x2d, 0xf0, 0x8b, 0x73, 0x90, 0x71, 0xbd, 0x6a, 0xb5, 0xc1, 0xf3, 0xd3, + 0x2e, 0xe4, 0xff, 0xe3, 0x75, 0xbf, 0x64, 0xe1, 0xd3, 0x90, 0xd9, 0xbe, 0x7e, 0xd5, 0xb3, 0x2d, + 0xfa, 0x08, 0xa4, 0x1b, 0x87, 0xd7, 0x38, 0x87, 0x10, 0x49, 0x71, 0x1e, 0x86, 0x88, 0x2e, 0x0e, + 0xb6, 0x31, 0x7d, 0x5e, 0xd5, 0x85, 0xc5, 0xff, 0xe4, 0x06, 0x88, 0x10, 0x95, 0x7e, 0xe2, 0x9b, + 0xaf, 0x4e, 0x49, 0x2f, 0xbf, 0x3a, 0x25, 0xfd, 0xc1, 0xab, 0x53, 0xd2, 0x27, 0xbf, 0x33, 0x75, + 0xe8, 0xe5, 0xef, 0x4c, 0x1d, 0xfa, 0xbd, 0xef, 0x4c, 0x1d, 0x6a, 0x5f, 0x36, 0x86, 0x45, 0x6b, + 0xd1, 0x62, 0x05, 0xe3, 0xf7, 0xc9, 0x91, 0x72, 0x71, 0xcd, 0x0a, 0xaa, 0xb5, 0xfe, 0x21, 0x07, + 0x3e, 0x12, 0x87, 0x29, 0xcd, 0x72, 0xeb, 0x96, 0x3b, 0xbb, 0xa5, 0xba, 0x78, 0xf6, 0xda, 0xc3, + 0x5b, 0xd8, 0x53, 0x1f, 0x9e, 0xd5, 0x2c, 0xdd, 0xe4, 0x65, 0xdf, 0x71, 0xd6, 0x5f, 0x20, 0xfd, + 0x05, 0xde, 0x9f, 0x6f, 0x5b, 0x21, 0x96, 0x17, 0x21, 0x31, 0x6f, 0xe9, 0x26, 0x9a, 0x80, 0x64, + 0x15, 0x9b, 0x56, 0x9d, 0x5f, 0x00, 0x63, 0x0d, 0x74, 0x17, 0x0c, 0xa8, 0x75, 0xab, 0x61, 0x7a, + 0xac, 0x5c, 0x5e, 0xca, 0x7c, 0xf3, 0xe6, 0xf4, 0xa1, 0xdf, 0xbf, 0x39, 0x1d, 0x5f, 0x32, 0x3d, + 0x85, 0x77, 0x15, 0x13, 0xdf, 0x7b, 0x69, 0x5a, 0x92, 0x2f, 0xc2, 0xe0, 0x02, 0xd6, 0x0e, 0xc2, + 0x6b, 0x01, 0x6b, 0x4d, 0xbc, 0xee, 0x83, 0xd4, 0x92, 0xe9, 0xb1, 0x2b, 0x7a, 0xc7, 0x21, 0xae, + 0x9b, 0xec, 0xd6, 0x47, 0xd3, 0xf8, 0x04, 0x4e, 0x50, 0x17, 0xb0, 0xe6, 0xa3, 0x56, 0xb1, 0xd6, + 0x8c, 0x4a, 0xd8, 0x13, 0x78, 0x69, 0xe1, 0xf7, 0xfe, 0xe3, 0xd4, 0xa1, 0xe7, 0x5f, 0x9d, 0x3a, + 0xd4, 0x69, 0x7e, 0x22, 0xe6, 0xe7, 0x26, 0x66, 0x7f, 0x1e, 0x74, 0xab, 0x57, 0x67, 0x49, 0x68, + 0xb9, 0x5b, 0x03, 0xec, 0x56, 0x33, 0x7c, 0x32, 0x06, 0xd3, 0xcd, 0x25, 0x75, 0xe2, 0xc7, 0xae, + 0xa7, 0xd6, 0xed, 0x4e, 0x2f, 0x4e, 0x9d, 0x83, 0xf4, 0xa6, 0xc0, 0x41, 0x39, 0x18, 0x74, 0xb1, + 0x66, 0x99, 0x55, 0x97, 0x8a, 0x1c, 0x57, 0x44, 0x93, 0x18, 0xd0, 0x54, 0x4d, 0xcb, 0xe5, 0xd7, + 0x35, 0x59, 0xa3, 0xf4, 0x97, 0xa4, 0xfe, 0x1c, 0x6b, 0xc4, 0x1f, 0x8a, 0x9a, 0x67, 0x5d, 0x7a, + 0xdf, 0xfd, 0xfb, 0x3d, 0x8d, 0xa0, 0xea, 0x05, 0x2a, 0x84, 0x1e, 0x3d, 0x4c, 0x35, 0x3f, 0x7a, + 0x78, 0x0a, 0x1b, 0xc6, 0x25, 0xd3, 0xba, 0x6e, 0x6e, 0x46, 0x4c, 0xf2, 0xbb, 0x12, 0xcc, 0xd0, + 0x0b, 0xeb, 0x4e, 0x5d, 0x37, 0xbd, 0x59, 0x43, 0xdf, 0x72, 0x67, 0xb7, 0x74, 0xcf, 0x65, 0x96, + 0xe3, 0x36, 0x99, 0x08, 0x30, 0x0a, 0x04, 0xa3, 0x40, 0x30, 0xe4, 0xd3, 0x90, 0x2a, 0xe9, 0xde, + 0x9c, 0xe3, 0xa8, 0x7b, 0x08, 0x41, 0x82, 0xc0, 0xb8, 0x51, 0xe8, 0x6f, 0x62, 0x11, 0x6c, 0xe0, + 0xba, 0x4b, 0x1f, 0x7a, 0x25, 0x14, 0xd6, 0x28, 0x5d, 0xee, 0x38, 0x93, 0xe7, 0x42, 0x9a, 0x86, + 0x44, 0x0a, 0xfd, 0x64, 0x91, 0xd0, 0x4e, 0x5c, 0x5f, 0x9f, 0xaf, 0x24, 0xe0, 0x78, 0x08, 0x41, + 0x73, 0xf6, 0x6c, 0x8f, 0x86, 0xa4, 0xb5, 0xcd, 0x95, 0x19, 0x0b, 0x29, 0xc3, 0xba, 0x3b, 0x84, + 0xd9, 0x36, 0x24, 0xd7, 0x09, 0x1d, 0x51, 0xc4, 0xb3, 0x3c, 0xd5, 0xe0, 0xda, 0xb1, 0x06, 0x81, + 0xb2, 0x4b, 0xfb, 0x31, 0x06, 0xd5, 0xc5, 0x7d, 0x7d, 0x03, 0xab, 0xdb, 0xec, 0xee, 0x63, 0x9c, + 0x3e, 0xfb, 0x4c, 0x11, 0x00, 0xbd, 0xe6, 0x38, 0x01, 0x49, 0xb5, 0xc1, 0x1e, 0xdb, 0xc5, 0x4f, + 0x0c, 0x29, 0xac, 0x21, 0x5f, 0x82, 0x41, 0xfe, 0xa8, 0x00, 0x65, 0x21, 0x7e, 0x15, 0xef, 0xd1, + 0x71, 0x86, 0x14, 0xf2, 0x13, 0x15, 0x20, 0x49, 0x85, 0xe7, 0x97, 0xba, 0x73, 0x85, 0x16, 0xe9, + 0x0b, 0x54, 0x48, 0x85, 0xa1, 0xc9, 0x17, 0x21, 0xb5, 0x60, 0xd5, 0x75, 0xd3, 0x8a, 0x72, 0x4b, + 0x33, 0x6e, 0x54, 0x66, 0xbb, 0xc1, 0xc3, 0x59, 0x61, 0x0d, 0x34, 0x09, 0x03, 0xec, 0x2e, 0x2c, + 0x7f, 0xf4, 0xc8, 0x5b, 0xf2, 0x3c, 0x0c, 0x52, 0xde, 0x6b, 0x36, 0x99, 0x5f, 0xff, 0x22, 0x52, + 0x9a, 0xbf, 0x19, 0xc1, 0xd9, 0xc7, 0x02, 0x61, 0x11, 0x24, 0xaa, 0xaa, 0xa7, 0x72, 0xbd, 0xe9, + 0x6f, 0xf9, 0x3d, 0x90, 0xe2, 0x4c, 0x5c, 0x74, 0x0a, 0xe2, 0x96, 0xed, 0xf2, 0x87, 0x87, 0xf9, + 0x4e, 0xaa, 0xac, 0xd9, 0xa5, 0x04, 0x59, 0x08, 0x14, 0x82, 0x5c, 0x52, 0x3a, 0xfa, 0xcb, 0xd9, + 0xfe, 0xfd, 0x85, 0x0d, 0xe3, 0x3b, 0xcb, 0x17, 0x62, 0x30, 0x15, 0xea, 0xbd, 0x86, 0x1d, 0x92, + 0x2f, 0x47, 0x5c, 0x1f, 0x85, 0x84, 0xe4, 0xfd, 0x1d, 0xdc, 0xe5, 0xdd, 0x10, 0x9f, 0xb3, 0x6d, + 0x94, 0x87, 0x14, 0x7b, 0x48, 0x68, 0x31, 0x7f, 0x49, 0x28, 0x7e, 0x9b, 0xf4, 0xb9, 0xd6, 0xb6, + 0x77, 0x5d, 0x75, 0xfc, 0xd7, 0x45, 0x44, 0x5b, 0x7e, 0x1c, 0xd2, 0xf3, 0x96, 0xe9, 0x62, 0xd3, + 0x6d, 0xd0, 0xd0, 0xd9, 0x32, 0x2c, 0xed, 0x2a, 0xe7, 0xc0, 0x1a, 0xc4, 0xe0, 0xaa, 0x6d, 0x53, + 0xca, 0x84, 0x42, 0x7e, 0xb2, 0xa5, 0xb7, 0xb4, 0xd1, 0xd1, 0x44, 0x8f, 0xf7, 0x6f, 0x22, 0xae, + 0xa4, 0x6f, 0xa3, 0x5f, 0x3f, 0x02, 0xc7, 0xc2, 0xa4, 0x6c, 0xc5, 0x09, 0x59, 0x28, 0x1b, 0xb2, + 0x10, 0x85, 0xb7, 0xb7, 0x4f, 0xbe, 0xdb, 0xca, 0x9b, 0xef, 0xba, 0x0e, 0xe5, 0xf7, 0x8f, 0xec, + 0x7c, 0x97, 0xb9, 0x94, 0x1f, 0x87, 0xe1, 0x75, 0xd5, 0xf1, 0x36, 0xb0, 0x77, 0x01, 0xab, 0x55, + 0xec, 0x44, 0x03, 0x7b, 0x58, 0x04, 0x36, 0x82, 0x04, 0x8d, 0x5e, 0xe6, 0xd8, 0xf4, 0xb7, 0xbc, + 0x03, 0x09, 0x7a, 0xd1, 0xc0, 0x0f, 0x7a, 0x4e, 0xc1, 0x82, 0x9e, 0x4c, 0xd7, 0x9e, 0x87, 0x5d, + 0x4e, 0xc2, 0x1a, 0xe8, 0xb4, 0x08, 0xdd, 0xf8, 0xfe, 0xa1, 0xcb, 0xbd, 0x9d, 0x07, 0xb0, 0x01, + 0x83, 0x25, 0x32, 0xdb, 0x4b, 0x0b, 0xbe, 0x20, 0x52, 0x20, 0x08, 0x5a, 0x81, 0x51, 0x5b, 0x75, + 0x3c, 0x7a, 0xc3, 0x72, 0x87, 0x6a, 0xc1, 0x57, 0x86, 0xe9, 0x42, 0xf3, 0x3c, 0x14, 0x22, 0xca, + 0xf2, 0x51, 0x86, 0xed, 0x30, 0x50, 0xfe, 0x4f, 0x09, 0x18, 0xe0, 0xc6, 0x78, 0x37, 0x0c, 0x72, + 0xa3, 0xd1, 0x01, 0x33, 0xa7, 0x8e, 0x17, 0x5a, 0x7d, 0xbf, 0xe0, 0xfb, 0x28, 0xe7, 0x27, 0x68, + 0xd0, 0x3d, 0x90, 0xd2, 0x76, 0x54, 0xdd, 0xac, 0xe8, 0x55, 0x91, 0x2c, 0xbc, 0x7a, 0x73, 0x7a, + 0x70, 0x9e, 0xc0, 0x96, 0x16, 0x94, 0x41, 0xda, 0xb9, 0x54, 0x25, 0x8b, 0xcd, 0x0e, 0xd6, 0x6b, + 0x3b, 0x6c, 0xb1, 0x89, 0x2b, 0xbc, 0x85, 0xce, 0x42, 0x82, 0x38, 0x04, 0xbf, 0x7f, 0x9f, 0x6f, + 0x49, 0xe2, 0xfc, 0x8d, 0xb1, 0x94, 0x22, 0x03, 0x7f, 0xf2, 0xdb, 0xd3, 0x92, 0x42, 0x29, 0xd0, + 0x3c, 0x0c, 0x1b, 0xaa, 0xeb, 0x55, 0x68, 0x90, 0x90, 0xe1, 0x93, 0x94, 0xc5, 0x91, 0x56, 0x83, + 0x70, 0xc3, 0x72, 0xd1, 0x33, 0x84, 0x8a, 0x81, 0xaa, 0xe8, 0x04, 0x64, 0x29, 0x13, 0xcd, 0xaa, + 0xd7, 0x75, 0x8f, 0x2d, 0xdf, 0x03, 0xd4, 0xee, 0x23, 0x04, 0x3e, 0x4f, 0xc1, 0x74, 0x11, 0x3f, + 0x0a, 0x69, 0x7a, 0xe3, 0x97, 0xa2, 0xb0, 0xdb, 0x2d, 0x29, 0x02, 0xa0, 0x9d, 0xf7, 0xc2, 0xe8, + 0x35, 0xd5, 0xd0, 0xab, 0xaa, 0x67, 0x39, 0x2e, 0x43, 0x49, 0x31, 0x2e, 0x01, 0x98, 0x22, 0x3e, + 0x04, 0x13, 0x26, 0xde, 0xa5, 0xf7, 0x6d, 0x22, 0xd8, 0x69, 0x8a, 0x8d, 0x48, 0xdf, 0x95, 0x28, + 0xc5, 0xbb, 0x60, 0x44, 0x13, 0xc6, 0x67, 0xb8, 0x40, 0x71, 0x87, 0x7d, 0x28, 0x45, 0x3b, 0x02, + 0x29, 0xd5, 0xb6, 0x19, 0x42, 0x86, 0x22, 0x0c, 0xaa, 0xb6, 0x4d, 0xbb, 0x4e, 0xc2, 0x18, 0xd5, + 0xd1, 0xc1, 0x6e, 0xc3, 0xf0, 0x38, 0x93, 0x21, 0x8a, 0x33, 0x4a, 0x3a, 0x14, 0x06, 0xa7, 0xb8, + 0x77, 0xc1, 0x30, 0xbe, 0xa6, 0x57, 0xb1, 0xa9, 0x61, 0x86, 0x37, 0x4c, 0xf1, 0x86, 0x04, 0x90, + 0x22, 0xdd, 0x07, 0x59, 0xdb, 0xb1, 0x6c, 0xcb, 0xc5, 0x4e, 0x45, 0xad, 0x56, 0x1d, 0xec, 0xba, + 0xb9, 0x11, 0xc6, 0x4f, 0xc0, 0xe7, 0x18, 0x58, 0x7e, 0x00, 0x12, 0x0b, 0xaa, 0xa7, 0x92, 0x35, + 0xcc, 0xdb, 0x65, 0x5b, 0xc0, 0x90, 0x42, 0x7e, 0xb6, 0x0d, 0xb7, 0xef, 0xc5, 0x20, 0x71, 0xc5, + 0xf2, 0x30, 0x7a, 0x24, 0xb4, 0xef, 0x8c, 0xb4, 0xf3, 0xf1, 0x0d, 0xbd, 0x66, 0xe2, 0xea, 0x8a, + 0x5b, 0x0b, 0xbd, 0xb2, 0x17, 0xb8, 0x58, 0x2c, 0xe2, 0x62, 0x13, 0x90, 0x74, 0xac, 0x86, 0x59, + 0x15, 0x97, 0x45, 0x68, 0x03, 0x95, 0x21, 0xe5, 0x7b, 0x4e, 0xa2, 0x9b, 0xe7, 0x8c, 0x12, 0xcf, + 0x21, 0x7e, 0xcd, 0x01, 0xca, 0xe0, 0x16, 0x77, 0xa0, 0x12, 0xa4, 0xfd, 0x05, 0x8d, 0x7b, 0x60, + 0x6f, 0x4e, 0x1c, 0x90, 0xa1, 0xfb, 0x61, 0xcc, 0xf7, 0x07, 0xdf, 0xa0, 0xcc, 0x0b, 0xb3, 0x7e, + 0x07, 0xb7, 0x68, 0xc4, 0xd5, 0xf8, 0xeb, 0x83, 0x83, 0x54, 0xaf, 0xc0, 0xd5, 0xd8, 0x2b, 0x84, + 0xc7, 0x20, 0xed, 0xea, 0x35, 0x53, 0xf5, 0x1a, 0x0e, 0xe6, 0xde, 0x18, 0x00, 0xe4, 0x4f, 0xc5, + 0x60, 0x80, 0x79, 0x77, 0xc8, 0x6e, 0x52, 0x7b, 0xbb, 0xc5, 0x3a, 0xd9, 0x2d, 0x7e, 0x70, 0xbb, + 0xcd, 0x01, 0xf8, 0xc2, 0xb8, 0xfc, 0xad, 0xae, 0xa3, 0xad, 0x8c, 0x98, 0x88, 0x1b, 0x7a, 0x8d, + 0x07, 0x6f, 0x88, 0xc8, 0xf7, 0xa0, 0x64, 0x68, 0x9d, 0x3c, 0x07, 0xe9, 0x2d, 0xdd, 0xab, 0xa8, + 0x24, 0x3b, 0xa5, 0x26, 0xcc, 0x9c, 0x9a, 0x2a, 0xb4, 0x4b, 0x63, 0x0b, 0x22, 0x87, 0x55, 0x52, + 0x5b, 0xfc, 0x97, 0xfc, 0x1f, 0x24, 0xb2, 0x19, 0xf3, 0x01, 0xd1, 0x1c, 0x0c, 0x0b, 0x45, 0x2b, + 0xdb, 0x86, 0x5a, 0xe3, 0xce, 0x78, 0xbc, 0xa3, 0xb6, 0xe7, 0x0d, 0xb5, 0xa6, 0x64, 0xb8, 0x82, + 0xa4, 0xd1, 0x7e, 0x62, 0x63, 0x1d, 0x26, 0x36, 0xe2, 0x49, 0xf1, 0x83, 0x79, 0x52, 0x64, 0xce, + 0x13, 0xcd, 0x73, 0xfe, 0xd5, 0x18, 0x4d, 0xca, 0x6c, 0xcb, 0x55, 0x8d, 0xb7, 0x22, 0xc4, 0x8e, + 0x42, 0xda, 0xb6, 0x8c, 0x0a, 0xeb, 0x61, 0xb7, 0xb2, 0x52, 0xb6, 0x65, 0x28, 0x2d, 0x7e, 0x94, + 0xbc, 0x4d, 0xf1, 0x37, 0x70, 0x1b, 0xac, 0x36, 0xd8, 0x6c, 0x35, 0x07, 0x86, 0x98, 0x29, 0xf8, + 0x86, 0xf9, 0x10, 0xb1, 0x01, 0xdd, 0x81, 0xa5, 0xd6, 0x0d, 0x9e, 0x89, 0xcd, 0x30, 0x15, 0x8e, + 0x47, 0x28, 0xd8, 0xfe, 0xd2, 0x2e, 0x9b, 0x0f, 0xfb, 0xb9, 0xc2, 0xf1, 0xe4, 0x7f, 0x2a, 0x41, + 0x9a, 0xaa, 0xba, 0x82, 0x3d, 0x35, 0x62, 0x2a, 0xe9, 0xe0, 0xa6, 0x3a, 0x0e, 0xc0, 0xd8, 0xb8, + 0xfa, 0x0d, 0xcc, 0x27, 0x30, 0x4d, 0x21, 0x1b, 0xfa, 0x0d, 0x8c, 0xce, 0xf8, 0x7a, 0xc5, 0xf7, + 0xd7, 0x8b, 0x87, 0xa2, 0xd0, 0xee, 0x0e, 0x18, 0xa4, 0x5f, 0x2f, 0xd8, 0x65, 0xd7, 0x12, 0xe3, + 0xf4, 0x95, 0xc5, 0xcd, 0x5d, 0x57, 0x7e, 0x16, 0x06, 0x37, 0x77, 0xd9, 0x51, 0xea, 0x28, 0xa4, + 0x1d, 0xcb, 0xe2, 0xfb, 0x2b, 0xcb, 0x6b, 0x52, 0x04, 0x40, 0xb7, 0x13, 0x71, 0x7c, 0x88, 0x05, + 0xc7, 0x87, 0xe0, 0xfc, 0x13, 0xef, 0xe9, 0xfc, 0x73, 0xf2, 0xdf, 0x4a, 0x90, 0x09, 0x85, 0x21, + 0x7a, 0x18, 0x0e, 0x97, 0x96, 0xd7, 0xe6, 0x2f, 0x55, 0x96, 0x16, 0x2a, 0xe7, 0x97, 0xe7, 0x16, + 0x83, 0xeb, 0xbd, 0xf9, 0xc9, 0x17, 0x5e, 0x9c, 0x41, 0x21, 0xdc, 0xcb, 0xe6, 0x55, 0x72, 0x3e, + 0x46, 0xb3, 0x30, 0x11, 0x25, 0x99, 0x2b, 0x6d, 0x94, 0x57, 0x37, 0xb3, 0x52, 0xfe, 0xf0, 0x0b, + 0x2f, 0xce, 0x8c, 0x85, 0x28, 0xe6, 0xb6, 0x5c, 0x6c, 0x7a, 0xad, 0x04, 0xf3, 0x6b, 0x2b, 0x2b, + 0x4b, 0x9b, 0xd9, 0x58, 0x0b, 0x01, 0x5f, 0x68, 0xef, 0x83, 0xb1, 0x28, 0xc1, 0xea, 0xd2, 0x72, + 0x36, 0x9e, 0x47, 0x2f, 0xbc, 0x38, 0x33, 0x12, 0xc2, 0x5e, 0xd5, 0x8d, 0x7c, 0xea, 0xa7, 0xbf, + 0x34, 0x75, 0xe8, 0xe7, 0xff, 0xda, 0x94, 0x44, 0x34, 0x1b, 0x8e, 0x84, 0x22, 0x7a, 0x00, 0xee, + 0xd8, 0x58, 0x5a, 0x5c, 0x2d, 0x2f, 0x54, 0x56, 0x36, 0x16, 0x2b, 0xec, 0xb5, 0x66, 0x5f, 0xbb, + 0xd1, 0x17, 0x5e, 0x9c, 0xc9, 0x70, 0x95, 0x3a, 0x61, 0xaf, 0x2b, 0xe5, 0x2b, 0x6b, 0x9b, 0xe5, + 0xac, 0xc4, 0xb0, 0xd7, 0x1d, 0x7c, 0xcd, 0xf2, 0xd8, 0xe7, 0x4d, 0x1e, 0x82, 0x23, 0x6d, 0xb0, + 0x7d, 0xc5, 0xc6, 0x5e, 0x78, 0x71, 0x66, 0x78, 0xdd, 0xc1, 0xcc, 0x4d, 0x29, 0x45, 0x01, 0x72, + 0xad, 0x14, 0x6b, 0xeb, 0x6b, 0x1b, 0x73, 0xcb, 0xd9, 0x99, 0x7c, 0xf6, 0x85, 0x17, 0x67, 0x86, + 0xc4, 0x9a, 0x43, 0xf0, 0x03, 0xcd, 0x4a, 0x4f, 0x76, 0x3c, 0xbf, 0x3c, 0xd6, 0xff, 0xf9, 0x25, + 0x5a, 0xf1, 0xf9, 0xf3, 0x31, 0x98, 0x6a, 0xb9, 0x44, 0xc9, 0x4b, 0x8f, 0x9d, 0x0a, 0x3e, 0x45, + 0x48, 0x2d, 0x88, 0x8a, 0x66, 0xbf, 0xf5, 0x9e, 0x9f, 0xeb, 0xb3, 0xde, 0x33, 0x2c, 0x46, 0x12, + 0xe5, 0x9e, 0x93, 0xdd, 0xcb, 0x3d, 0x42, 0xfe, 0x03, 0x54, 0x7b, 0x3e, 0xfa, 0x30, 0xdc, 0xcd, + 0x8b, 0x64, 0xae, 0xa7, 0x5e, 0xd5, 0xcd, 0x9a, 0x5f, 0x8a, 0xe4, 0x6d, 0x6e, 0x94, 0x49, 0x5e, + 0x8d, 0x14, 0xd0, 0x7d, 0x0b, 0x92, 0xf9, 0x7d, 0x0f, 0x88, 0xdd, 0x0f, 0x7e, 0x5d, 0x66, 0x28, + 0xdf, 0xa5, 0x74, 0x2a, 0x7f, 0x5c, 0x82, 0x91, 0x0b, 0xba, 0xeb, 0x59, 0x8e, 0xae, 0xa9, 0x06, + 0xbd, 0xad, 0x7c, 0xa6, 0xd7, 0xb5, 0xb9, 0x69, 0x0d, 0x7b, 0x02, 0x06, 0xae, 0xa9, 0x86, 0x8b, + 0x3d, 0x7e, 0x59, 0xff, 0xce, 0x42, 0x7b, 0x43, 0x14, 0xfc, 0xe4, 0x5c, 0x30, 0x60, 0x64, 0xf2, + 0x2f, 0xc6, 0x60, 0x94, 0x46, 0xb9, 0xcb, 0x3e, 0xbb, 0x41, 0x0e, 0x82, 0x25, 0x48, 0x38, 0xaa, + 0xc7, 0x8b, 0x27, 0xa5, 0x02, 0x2f, 0x72, 0xde, 0xd3, 0xbd, 0x70, 0x59, 0x58, 0xc0, 0x9a, 0x42, + 0x69, 0xd1, 0x8f, 0x43, 0xaa, 0xae, 0xee, 0x56, 0x28, 0x1f, 0x76, 0xbc, 0x9a, 0xeb, 0x8f, 0xcf, + 0xad, 0x9b, 0xd3, 0xa3, 0x7b, 0x6a, 0xdd, 0x28, 0xca, 0x82, 0x8f, 0xac, 0x0c, 0xd6, 0xd5, 0x5d, + 0x22, 0x22, 0xb2, 0x61, 0x94, 0x40, 0xb5, 0x1d, 0xd5, 0xac, 0x61, 0x36, 0x08, 0x2d, 0x05, 0x95, + 0x2e, 0xf4, 0x3d, 0xc8, 0x64, 0x30, 0x48, 0x88, 0x9d, 0xac, 0x0c, 0xd7, 0xd5, 0xdd, 0x79, 0x0a, + 0x20, 0x23, 0x16, 0x53, 0x9f, 0x7e, 0x69, 0xfa, 0x10, 0x2d, 0x1c, 0xbf, 0x22, 0x01, 0x04, 0x16, + 0x43, 0x3f, 0x0e, 0x59, 0xcd, 0x6f, 0x51, 0x5a, 0x97, 0xcf, 0xe1, 0xbd, 0x9d, 0xe6, 0xa2, 0xc9, + 0xde, 0x6c, 0x6f, 0x7f, 0xf9, 0xe6, 0xb4, 0xa4, 0x8c, 0x6a, 0x4d, 0x53, 0xf1, 0x7e, 0xc8, 0x34, + 0xec, 0xaa, 0xea, 0xe1, 0x0a, 0x3d, 0x6c, 0xc6, 0xba, 0xe6, 0x09, 0x53, 0x84, 0xd7, 0xad, 0x9b, + 0xd3, 0x88, 0xa9, 0x15, 0x22, 0x96, 0x69, 0xf6, 0x00, 0x0c, 0x42, 0x08, 0x42, 0x3a, 0xfd, 0x8e, + 0x04, 0x99, 0x85, 0xd0, 0xad, 0x81, 0x1c, 0x0c, 0xd6, 0x2d, 0x53, 0xbf, 0xca, 0xfd, 0x31, 0xad, + 0x88, 0x26, 0xca, 0x43, 0x8a, 0xbd, 0xc0, 0xe1, 0xed, 0x89, 0x92, 0x90, 0x68, 0x13, 0xaa, 0xeb, + 0x78, 0xcb, 0xd5, 0xc5, 0x6c, 0x28, 0xa2, 0x89, 0xce, 0x43, 0xd6, 0xc5, 0x5a, 0xc3, 0xd1, 0xbd, + 0xbd, 0x8a, 0x66, 0x99, 0x9e, 0xaa, 0x79, 0xec, 0x55, 0x80, 0xd2, 0xd1, 0x5b, 0x37, 0xa7, 0xef, + 0x60, 0xb2, 0x36, 0x63, 0xc8, 0xca, 0xa8, 0x00, 0xcd, 0x33, 0x08, 0x19, 0xa1, 0x8a, 0x3d, 0x55, + 0x37, 0x5c, 0x9a, 0x7a, 0xa5, 0x15, 0xd1, 0x0c, 0xe9, 0xf2, 0x8f, 0x07, 0x21, 0xed, 0x7b, 0x3b, + 0xba, 0x0e, 0x59, 0xcb, 0xc6, 0x4e, 0x24, 0x91, 0xa5, 0xfb, 0x78, 0x69, 0x39, 0x18, 0xb9, 0x19, + 0x43, 0xfe, 0x7f, 0x37, 0xa7, 0x1f, 0xec, 0xc1, 0x83, 0xae, 0xa8, 0x06, 0x4f, 0x82, 0x95, 0x51, + 0xc1, 0x43, 0x64, 0xc5, 0xe7, 0x89, 0x5f, 0x88, 0xe3, 0xaf, 0xdd, 0xd8, 0x12, 0xa5, 0xc7, 0x88, + 0xca, 0xcd, 0x18, 0x32, 0xf1, 0x00, 0x0e, 0x5a, 0xa7, 0x10, 0x92, 0xb9, 0x3e, 0xab, 0xea, 0x86, + 0x78, 0xab, 0x4d, 0xe1, 0x2d, 0xb4, 0x04, 0x03, 0xae, 0xa7, 0x7a, 0x0d, 0x96, 0xbc, 0x24, 0x4b, + 0x0f, 0xf7, 0x28, 0x73, 0xc9, 0x32, 0xab, 0x1b, 0x94, 0x50, 0xe1, 0x0c, 0xd0, 0x79, 0x18, 0xf0, + 0xac, 0xab, 0xd8, 0xe4, 0x46, 0xed, 0x2b, 0xe2, 0xe9, 0x43, 0x1a, 0x46, 0x8d, 0x3c, 0xc8, 0x56, + 0xb1, 0x81, 0x6b, 0xd4, 0x94, 0xee, 0x8e, 0x4a, 0x0e, 0x48, 0xf4, 0x0b, 0x34, 0xa5, 0xa5, 0xbe, + 0xc3, 0x92, 0x1b, 0xa8, 0x99, 0x9f, 0xac, 0x8c, 0xfa, 0xa0, 0x0d, 0x0a, 0x41, 0x97, 0x22, 0x17, + 0x5e, 0xf8, 0x67, 0x9a, 0xee, 0xea, 0x14, 0x7b, 0x21, 0x2f, 0x17, 0x65, 0x95, 0xf0, 0x75, 0x99, + 0xf3, 0x90, 0x6d, 0x98, 0x5b, 0x96, 0x49, 0xdf, 0x44, 0xe1, 0x27, 0x06, 0x72, 0x04, 0x8d, 0x87, + 0x67, 0xad, 0x19, 0x43, 0x56, 0x46, 0x7d, 0xd0, 0x05, 0x76, 0xae, 0xa8, 0xc2, 0x48, 0x80, 0x45, + 0x43, 0x37, 0xdd, 0x35, 0x74, 0xef, 0xe4, 0xa1, 0x7b, 0xb8, 0x79, 0x94, 0x20, 0x7a, 0x87, 0x7d, + 0x20, 0x21, 0x43, 0x17, 0x00, 0x82, 0x05, 0x83, 0x96, 0x57, 0x32, 0xa7, 0xe4, 0xee, 0xab, 0x8e, + 0x38, 0x92, 0x06, 0xb4, 0xe8, 0x83, 0x30, 0x5e, 0xd7, 0xcd, 0x8a, 0x8b, 0x8d, 0xed, 0x0a, 0x37, + 0x30, 0x61, 0x49, 0x3f, 0x24, 0x50, 0x5a, 0xee, 0xcf, 0x1f, 0x6e, 0xdd, 0x9c, 0xce, 0xf3, 0x45, + 0xb5, 0x95, 0xa5, 0xac, 0x8c, 0xd5, 0x75, 0x73, 0x03, 0x1b, 0xdb, 0x0b, 0x3e, 0xac, 0x38, 0xf4, + 0xd3, 0x2f, 0x4d, 0x1f, 0xf2, 0x03, 0x58, 0x87, 0xa1, 0x20, 0xb0, 0xb0, 0x8b, 0xd6, 0x20, 0xad, + 0x8a, 0x06, 0x2b, 0xc4, 0xf4, 0xec, 0xec, 0xa1, 0x00, 0x0d, 0x78, 0xb0, 0xb5, 0xe2, 0xf9, 0x7f, + 0x3f, 0x23, 0xc9, 0x2f, 0xc4, 0x60, 0x60, 0xe1, 0xca, 0xba, 0xaa, 0x3b, 0xe8, 0x06, 0x8c, 0x05, + 0xce, 0x16, 0x5d, 0x29, 0x56, 0x6e, 0xdd, 0x9c, 0xce, 0x35, 0xfb, 0x63, 0x9f, 0x4b, 0xc5, 0x9c, + 0xa6, 0x09, 0x49, 0x82, 0x20, 0x11, 0x6b, 0xc5, 0x8d, 0x8e, 0xc7, 0xed, 0xf0, 0xd8, 0x2d, 0x28, + 0x07, 0x58, 0xa6, 0x5a, 0x4e, 0xef, 0xa1, 0x85, 0xb3, 0x0c, 0x83, 0xcc, 0x16, 0x2e, 0x2a, 0x42, + 0xd2, 0x26, 0x3f, 0xf8, 0xa3, 0x8f, 0xa9, 0x8e, 0xd1, 0x44, 0xf1, 0xfd, 0x82, 0x30, 0x21, 0x91, + 0xbf, 0x18, 0x07, 0x58, 0xb8, 0x72, 0x65, 0xd3, 0xd1, 0x6d, 0x03, 0x7b, 0x3f, 0x54, 0xbb, 0x7e, + 0x54, 0x82, 0xc3, 0x81, 0xd5, 0x5c, 0x47, 0x6b, 0x32, 0xee, 0x93, 0xb7, 0x6e, 0x4e, 0x1f, 0x6b, + 0x36, 0x6e, 0x08, 0xed, 0x00, 0x06, 0x1e, 0xf7, 0x19, 0x6d, 0x38, 0x5a, 0x7b, 0x39, 0xaa, 0xae, + 0xe7, 0xcb, 0x11, 0xef, 0x2c, 0x47, 0x08, 0xed, 0x0d, 0xc9, 0xb1, 0xe0, 0x7a, 0xad, 0x73, 0xbd, + 0x01, 0x99, 0x60, 0x8e, 0x5c, 0xb4, 0x00, 0x29, 0x8f, 0xff, 0xe6, 0x53, 0x2e, 0x77, 0x9e, 0x72, + 0x41, 0xc6, 0xa7, 0xdd, 0xa7, 0x94, 0xff, 0x4d, 0x0c, 0x20, 0x88, 0xea, 0x3f, 0xad, 0x11, 0x45, + 0xb6, 0x53, 0xbe, 0xf9, 0xc5, 0x0f, 0x94, 0x40, 0x73, 0xea, 0xd0, 0x6c, 0xfd, 0x61, 0x0c, 0xc6, + 0x2f, 0x8b, 0x95, 0xff, 0x1d, 0x0b, 0xa3, 0x75, 0x18, 0xc4, 0xa6, 0xe7, 0xe8, 0xd4, 0xc4, 0xc4, + 0x5b, 0x1f, 0xea, 0xe4, 0xad, 0x6d, 0xac, 0x46, 0x3f, 0x96, 0x21, 0x9e, 0x06, 0x71, 0x36, 0x21, + 0x5b, 0x7f, 0x22, 0x0e, 0xb9, 0x4e, 0x54, 0x68, 0x1e, 0x46, 0x35, 0x07, 0x53, 0x40, 0x25, 0x5c, + 0x7a, 0x2e, 0xe5, 0x83, 0x93, 0x44, 0x13, 0x82, 0xac, 0x8c, 0x08, 0x08, 0xcf, 0x0d, 0x6a, 0x40, + 0xd2, 0x7c, 0x12, 0x32, 0x04, 0xab, 0xc7, 0xbc, 0x5e, 0xe6, 0xc9, 0x81, 0x18, 0x24, 0xca, 0x80, + 0x65, 0x07, 0x23, 0x01, 0x94, 0xa6, 0x07, 0xcf, 0xc1, 0xa8, 0x6e, 0xea, 0x9e, 0xae, 0x1a, 0x95, + 0x2d, 0xd5, 0x50, 0x4d, 0xed, 0x20, 0xa7, 0x24, 0xb6, 0xa1, 0xf3, 0x61, 0x9b, 0xd8, 0xc9, 0xca, + 0x08, 0x87, 0x94, 0x18, 0x00, 0x5d, 0x80, 0x41, 0x31, 0x54, 0xe2, 0x40, 0xb9, 0xa4, 0x20, 0x0f, + 0xcd, 0xc8, 0xcf, 0xc4, 0x61, 0x4c, 0xc1, 0xd5, 0x77, 0xa6, 0xa2, 0xbf, 0xa9, 0x58, 0x01, 0x60, + 0x0b, 0x09, 0xd9, 0x49, 0x0e, 0x30, 0x1b, 0x64, 0x29, 0x4a, 0x33, 0x0e, 0x0b, 0xae, 0x17, 0x9a, + 0x8f, 0x3f, 0x8a, 0xc3, 0x50, 0x78, 0x3e, 0xde, 0xd9, 0xe2, 0x7f, 0x74, 0xb6, 0x78, 0xb4, 0x14, + 0x2c, 0x8d, 0x09, 0xfe, 0xcd, 0xc3, 0x0e, 0x4b, 0x63, 0x4b, 0x48, 0x75, 0x5e, 0x13, 0xff, 0x57, + 0x0c, 0x06, 0xd6, 0x55, 0x47, 0xad, 0xbb, 0x48, 0x6b, 0x39, 0xd8, 0x88, 0xc2, 0x7e, 0xcb, 0x57, + 0x6d, 0x79, 0x51, 0xac, 0xcb, 0xb9, 0xe6, 0xd3, 0x6d, 0xce, 0x35, 0xef, 0x85, 0x91, 0xba, 0xba, + 0x1b, 0x7a, 0xd6, 0x4c, 0x27, 0x73, 0xb8, 0x74, 0x24, 0xe0, 0x12, 0xed, 0x67, 0xe5, 0x9a, 0xe0, + 0x01, 0x34, 0x7a, 0x0c, 0x32, 0x04, 0x23, 0xd8, 0x25, 0x08, 0xf9, 0x64, 0x50, 0x17, 0x09, 0x75, + 0xca, 0x0a, 0xd4, 0xd5, 0xdd, 0x32, 0x6b, 0xa0, 0x65, 0x40, 0x3b, 0x7e, 0x69, 0xae, 0x12, 0x98, + 0x92, 0xd0, 0x1f, 0xbf, 0x75, 0x73, 0xfa, 0x08, 0xa3, 0x6f, 0xc5, 0x91, 0x95, 0xb1, 0x00, 0x28, + 0xb8, 0x9d, 0x06, 0x20, 0x7a, 0x55, 0xd8, 0x55, 0x45, 0x76, 0xba, 0x3e, 0x7c, 0xeb, 0xe6, 0xf4, + 0x18, 0xe3, 0x12, 0xf4, 0xc9, 0x4a, 0x9a, 0x34, 0x16, 0xc8, 0xef, 0x90, 0xe1, 0xbf, 0x24, 0x01, + 0x0a, 0xf6, 0x20, 0x05, 0xbb, 0xb6, 0x65, 0xba, 0xf4, 0xdc, 0x17, 0x3a, 0xa4, 0x49, 0xfb, 0x9f, + 0xfb, 0x02, 0x7a, 0x71, 0xee, 0x0b, 0x85, 0xee, 0xe3, 0xc1, 0x7a, 0x1d, 0xe3, 0xf3, 0xd8, 0xe6, + 0x5e, 0x67, 0x61, 0xde, 0xd2, 0x05, 0x75, 0x9b, 0x05, 0xfa, 0x9f, 0x4b, 0x70, 0xa4, 0xc5, 0x9b, + 0x7c, 0x61, 0xff, 0x0c, 0x20, 0x27, 0xd4, 0xc9, 0x3f, 0x5e, 0xc5, 0x84, 0xee, 0xdb, 0x39, 0xc7, + 0x9c, 0x96, 0x8d, 0xe0, 0xf6, 0x6d, 0x39, 0xec, 0x62, 0xe8, 0x3f, 0x91, 0x60, 0x22, 0x3c, 0xbc, + 0xaf, 0xc8, 0x2a, 0x0c, 0x85, 0x47, 0xe7, 0x2a, 0xdc, 0xdd, 0x8b, 0x0a, 0x5c, 0xfa, 0x08, 0x3d, + 0x7a, 0x32, 0x08, 0x55, 0x56, 0xbc, 0x7d, 0xb8, 0x67, 0x6b, 0x08, 0x99, 0x9a, 0x43, 0x96, 0x69, + 0xf0, 0x27, 0x12, 0x24, 0xd6, 0x2d, 0xcb, 0x40, 0x16, 0x8c, 0x99, 0x96, 0x57, 0x21, 0x9e, 0x85, + 0xab, 0x15, 0x5e, 0xe3, 0x61, 0x55, 0xdd, 0xf9, 0xfe, 0x8c, 0xf4, 0xfd, 0x9b, 0xd3, 0xad, 0xac, + 0x94, 0x51, 0xd3, 0xf2, 0x4a, 0x14, 0xb2, 0xc9, 0x2a, 0x40, 0x1f, 0x84, 0xe1, 0xe8, 0x60, 0xac, + 0xe2, 0xf5, 0x54, 0xdf, 0x83, 0x45, 0xd9, 0xdc, 0xba, 0x39, 0x3d, 0x11, 0x44, 0x8c, 0x0f, 0x96, + 0x95, 0xa1, 0xad, 0xd0, 0xe8, 0xc5, 0x14, 0xd1, 0xfe, 0x8f, 0x5f, 0x9a, 0x96, 0x4a, 0xe7, 0x3b, + 0x3e, 0xa1, 0x79, 0x60, 0x5f, 0x11, 0x76, 0xfd, 0xc7, 0x0c, 0xd1, 0xc7, 0x32, 0x9f, 0x1e, 0x87, + 0xe9, 0x0e, 0xcf, 0x21, 0xbc, 0xdd, 0x03, 0x3d, 0x82, 0xe8, 0xf2, 0x8c, 0x20, 0xdf, 0xd3, 0x63, + 0x0f, 0xf9, 0xf5, 0x04, 0xa0, 0x15, 0xb7, 0x36, 0x4f, 0xb2, 0x1a, 0x1c, 0x14, 0x3d, 0x9b, 0x4a, + 0x62, 0xd2, 0x1b, 0x2a, 0x89, 0xad, 0x44, 0x8a, 0x4c, 0xb1, 0xfe, 0x4a, 0xdb, 0x3d, 0x57, 0x9a, + 0xe2, 0x6f, 0x49, 0xa5, 0xa9, 0x7d, 0xaa, 0x92, 0xf8, 0x21, 0x9e, 0x98, 0x92, 0x6f, 0xcd, 0x89, + 0x69, 0x12, 0x06, 0x78, 0x0d, 0x9a, 0x7d, 0x12, 0x9c, 0xb7, 0xd0, 0xa3, 0xe2, 0x03, 0xc9, 0x83, + 0xbd, 0xad, 0xfe, 0x0c, 0x9b, 0xaf, 0x33, 0x5f, 0x8b, 0x43, 0x76, 0xc5, 0xad, 0x95, 0xab, 0xba, + 0xf7, 0x26, 0xf9, 0x9e, 0xdd, 0xf9, 0x90, 0x39, 0x7f, 0xeb, 0xe6, 0xf4, 0x08, 0x33, 0xd9, 0xed, + 0x34, 0x54, 0x1d, 0x46, 0x9b, 0x1e, 0xe7, 0x70, 0xd7, 0x5c, 0x38, 0xc8, 0x53, 0xa5, 0x26, 0x56, + 0x32, 0x3d, 0x17, 0x84, 0x02, 0x04, 0xed, 0xb6, 0x8f, 0x06, 0xb6, 0x91, 0x5d, 0x78, 0x33, 0x6b, + 0xae, 0x6c, 0x0a, 0xbf, 0x11, 0x83, 0xcc, 0x8a, 0x2b, 0xce, 0xb9, 0xf8, 0x4f, 0x6d, 0x45, 0xe1, + 0x31, 0xff, 0xc5, 0x91, 0x78, 0x6f, 0x81, 0x10, 0x7d, 0x99, 0xe4, 0xdb, 0x71, 0xba, 0x0e, 0x97, + 0x70, 0x4d, 0x37, 0xfd, 0xcd, 0x1a, 0xbf, 0x73, 0x30, 0xfa, 0x11, 0x3a, 0x18, 0x05, 0x33, 0x9c, + 0x38, 0xc8, 0x0c, 0xff, 0x56, 0x0c, 0x86, 0x57, 0xdc, 0xda, 0x65, 0xb3, 0xfa, 0x4e, 0xa8, 0xbc, + 0x91, 0x50, 0xb9, 0xed, 0xa9, 0xd9, 0x37, 0x62, 0x70, 0x32, 0x9c, 0x4b, 0x3d, 0xd7, 0xc0, 0xce, + 0x9e, 0x9f, 0x2e, 0xd9, 0x6a, 0x4d, 0x37, 0xc3, 0xb7, 0x67, 0x8e, 0x84, 0x85, 0xa5, 0xb8, 0x42, + 0x64, 0xd9, 0x84, 0xcc, 0xba, 0x5a, 0xc3, 0x0a, 0x7e, 0xae, 0x81, 0x5d, 0xaf, 0xcd, 0xbb, 0x2d, + 0x93, 0x30, 0x60, 0x6d, 0x6f, 0xb3, 0xcb, 0x16, 0xd2, 0x89, 0x84, 0xc2, 0x5b, 0x68, 0x02, 0x92, + 0x86, 0x5e, 0xd7, 0x99, 0x41, 0x12, 0x0a, 0x6b, 0xa0, 0x69, 0xc8, 0x68, 0x44, 0xef, 0x0a, 0xbb, + 0xb2, 0x9f, 0x10, 0xdf, 0xee, 0x68, 0x98, 0xde, 0x26, 0x81, 0xc8, 0x4f, 0xc0, 0x10, 0x1b, 0x8f, + 0x9f, 0x2f, 0x8e, 0x40, 0x8a, 0x5e, 0xb1, 0x0e, 0x46, 0x1d, 0x24, 0xed, 0x4b, 0xec, 0x3d, 0x18, + 0xc6, 0x85, 0x0d, 0xcc, 0x1a, 0xa5, 0x52, 0x47, 0x53, 0x9e, 0xe8, 0x3e, 0xc9, 0xcc, 0x50, 0xbe, + 0x19, 0x7f, 0x33, 0x09, 0x87, 0xf9, 0xb5, 0x16, 0xd5, 0xd6, 0x67, 0x77, 0x3c, 0x4f, 0xbc, 0x60, + 0x06, 0xfc, 0x60, 0xaf, 0xda, 0xba, 0xbc, 0x07, 0x89, 0x0b, 0x9e, 0x67, 0xa3, 0x93, 0x90, 0x74, + 0x1a, 0x06, 0x16, 0x0f, 0x0b, 0x26, 0x0a, 0x01, 0x4e, 0x81, 0x20, 0x28, 0x0d, 0x03, 0x2b, 0x0c, + 0x05, 0x95, 0x61, 0x7a, 0xbb, 0x61, 0x18, 0x7b, 0x95, 0x2a, 0xa6, 0xff, 0x76, 0xc9, 0xff, 0xc7, + 0x05, 0x78, 0xd7, 0x56, 0x4d, 0x3f, 0xa9, 0x4c, 0x29, 0xc7, 0x28, 0xda, 0x02, 0xc5, 0x12, 0xff, + 0xb4, 0xa0, 0x2c, 0x70, 0xe4, 0xdf, 0x8f, 0x41, 0x4a, 0xb0, 0xa6, 0x2f, 0xa6, 0x60, 0x03, 0x6b, + 0x9e, 0x25, 0x2e, 0x28, 0xf8, 0x6d, 0x84, 0x20, 0x5e, 0xe3, 0x53, 0x94, 0xbe, 0x70, 0x48, 0x21, + 0x0d, 0x02, 0xf3, 0x5f, 0x17, 0x22, 0x30, 0xbb, 0x41, 0x66, 0x2d, 0x61, 0x5b, 0xa2, 0x32, 0x76, + 0xe1, 0x90, 0x42, 0x5b, 0x28, 0x07, 0x03, 0x24, 0xda, 0x3c, 0xf6, 0x4d, 0x49, 0x02, 0xe7, 0x6d, + 0x34, 0x09, 0x49, 0x5b, 0xf5, 0x34, 0x76, 0xcd, 0x9e, 0x74, 0xb0, 0x26, 0x89, 0x07, 0xf6, 0x2e, + 0x6f, 0xf3, 0xff, 0x34, 0x21, 0xc6, 0x60, 0x1f, 0x4d, 0x23, 0x72, 0xaf, 0xab, 0x9e, 0x87, 0x1d, + 0x93, 0x30, 0x64, 0xe8, 0xf4, 0x1d, 0x34, 0xab, 0xba, 0xc7, 0xff, 0xcf, 0x0a, 0xfd, 0xcd, 0xff, + 0xb1, 0x03, 0xf5, 0x87, 0x0a, 0xed, 0x64, 0xff, 0x5e, 0x6a, 0x48, 0x00, 0x4b, 0x04, 0xa9, 0x0c, + 0xe3, 0x6a, 0xb5, 0xaa, 0xb3, 0x7f, 0x79, 0x52, 0xd9, 0xd2, 0x69, 0xe1, 0xc4, 0xa5, 0xff, 0x3c, + 0xac, 0xd3, 0x5c, 0xa0, 0x80, 0xa0, 0xc4, 0xf1, 0x4b, 0x69, 0x18, 0xb4, 0x99, 0x50, 0xf2, 0x39, + 0x18, 0x6b, 0x91, 0x94, 0xc8, 0x77, 0x55, 0x37, 0xab, 0xe2, 0x1d, 0x2a, 0xf2, 0x9b, 0xc0, 0xe8, + 0x87, 0x0f, 0xd9, 0xd5, 0x0f, 0xfa, 0xbb, 0xf4, 0x53, 0x9d, 0xef, 0x90, 0x8d, 0x84, 0xee, 0x90, + 0xa9, 0xb6, 0x5e, 0x4a, 0x53, 0xfe, 0xfc, 0xea, 0xd8, 0x1c, 0xef, 0x60, 0xd7, 0xc6, 0x0a, 0x96, + 0x53, 0x9b, 0xad, 0x61, 0x53, 0x9c, 0x94, 0x48, 0x97, 0x6a, 0xeb, 0x2e, 0x75, 0xc7, 0xe0, 0x43, + 0x8c, 0xee, 0xb9, 0xd0, 0x6f, 0x7a, 0xa3, 0x2c, 0xb1, 0x38, 0xb7, 0xbe, 0xe4, 0xfb, 0xf1, 0xd7, + 0x63, 0x70, 0x2c, 0xe4, 0xc7, 0x21, 0xe4, 0x56, 0x77, 0xce, 0xb7, 0xf7, 0xf8, 0x1e, 0x3e, 0x63, + 0x78, 0x09, 0x12, 0x04, 0x1f, 0x75, 0xf9, 0xb7, 0x0b, 0xb9, 0x5f, 0xfa, 0x67, 0xff, 0x48, 0xa6, + 0x4e, 0xd1, 0x7e, 0x56, 0x28, 0x93, 0xd2, 0xc7, 0x7a, 0xb7, 0x5f, 0x36, 0xf8, 0x06, 0xa5, 0x7b, + 0xfb, 0xcc, 0xd8, 0x6c, 0xc3, 0xcf, 0x9f, 0x03, 0xb9, 0xc3, 0xf1, 0x93, 0xad, 0x98, 0xfb, 0x1f, + 0x78, 0xfb, 0x58, 0x8e, 0x3b, 0xdd, 0xcf, 0xdb, 0x6f, 0x06, 0x7b, 0x3c, 0x1a, 0xef, 0xc2, 0xe4, + 0x93, 0x64, 0xec, 0xa0, 0x28, 0x28, 0x16, 0xf6, 0x49, 0xff, 0xe6, 0x8c, 0xc4, 0xff, 0x77, 0x9b, + 0xb8, 0x06, 0x03, 0x81, 0x7c, 0xfc, 0xa0, 0x7b, 0x4f, 0xa1, 0xe3, 0x7e, 0x51, 0x08, 0x6d, 0x16, + 0x4a, 0x88, 0x52, 0xfe, 0x05, 0x09, 0xee, 0x68, 0x19, 0x9a, 0xaf, 0xf1, 0x8b, 0x00, 0xa1, 0xaa, + 0xa6, 0xd4, 0xdf, 0x9d, 0xbd, 0x10, 0x29, 0x61, 0xd4, 0x22, 0xec, 0xbd, 0x5d, 0x85, 0x65, 0x52, + 0x44, 0xa4, 0x7d, 0x0e, 0x0e, 0x47, 0x85, 0x15, 0x66, 0x7a, 0x1a, 0x46, 0xa2, 0x09, 0x04, 0x4f, + 0x6e, 0x0e, 0x70, 0xf7, 0x62, 0x38, 0x92, 0x44, 0xc8, 0x95, 0xe6, 0xa9, 0xf1, 0xcd, 0x53, 0x86, + 0xb4, 0x8f, 0xca, 0x8f, 0x8e, 0x3d, 0x5b, 0x27, 0xa0, 0x94, 0xbf, 0x21, 0xc1, 0x4c, 0x74, 0x84, + 0xe0, 0xe0, 0xe3, 0xbe, 0xe9, 0xfa, 0xdd, 0x36, 0x47, 0xfa, 0x9e, 0x04, 0x77, 0xee, 0xa3, 0x06, + 0xb7, 0xd9, 0x0d, 0x98, 0x08, 0x55, 0x57, 0xc5, 0x46, 0x21, 0x9c, 0xeb, 0x64, 0xf7, 0xb2, 0xb0, + 0x5f, 0x4c, 0x3c, 0x4a, 0xec, 0xf8, 0x95, 0x6f, 0x4f, 0x8f, 0xb7, 0xf6, 0xb9, 0xca, 0x78, 0x6b, + 0x45, 0xf4, 0x36, 0x7a, 0xe1, 0xef, 0x4a, 0x70, 0x5f, 0x54, 0xd5, 0x36, 0xcf, 0x60, 0xdf, 0x46, + 0x53, 0xf7, 0xef, 0x24, 0x38, 0xd9, 0x8b, 0x3e, 0x7c, 0x0e, 0xb7, 0x60, 0x3c, 0x78, 0x2c, 0xd2, + 0x3c, 0x85, 0xf7, 0xf7, 0xf1, 0x70, 0x9b, 0xc7, 0x02, 0xf2, 0xb9, 0xbd, 0x09, 0x73, 0xf5, 0x2f, + 0x24, 0x1e, 0xbf, 0x61, 0x37, 0xf1, 0x27, 0x26, 0x7a, 0xe0, 0xe9, 0x73, 0x62, 0x42, 0x87, 0x9e, + 0xe1, 0xc8, 0xa1, 0xa7, 0xcd, 0x94, 0xc7, 0x6e, 0xd3, 0x6a, 0x74, 0x8d, 0xaf, 0xd6, 0x6d, 0x9e, + 0xb3, 0xbc, 0x1f, 0xc6, 0xdb, 0x84, 0x16, 0x5f, 0x98, 0xfa, 0x88, 0x2c, 0x05, 0xb5, 0x06, 0x8f, + 0xfc, 0xaf, 0x25, 0x98, 0xa6, 0x03, 0xb7, 0x99, 0xc6, 0xb7, 0xb3, 0x3d, 0xeb, 0x7c, 0xed, 0x6d, + 0xab, 0x16, 0x37, 0xec, 0x12, 0x0c, 0x30, 0x0f, 0xe5, 0xb6, 0x3c, 0x80, 0x8b, 0x73, 0x06, 0xc1, + 0x5a, 0xbf, 0x20, 0xf4, 0x6b, 0xbf, 0x60, 0xbc, 0x49, 0x76, 0xbc, 0x5d, 0x0b, 0xc6, 0x2b, 0x62, + 0xad, 0x6f, 0xaf, 0x06, 0xb7, 0x9b, 0x76, 0xdb, 0xd6, 0x7a, 0x66, 0xc4, 0xb7, 0x68, 0x51, 0xf7, + 0x75, 0xea, 0xb2, 0xa8, 0xff, 0x88, 0xcf, 0x91, 0xbf, 0xa8, 0x77, 0xd1, 0xe7, 0xed, 0xb8, 0xa8, + 0xff, 0x49, 0x0c, 0x8e, 0x50, 0xdd, 0xc2, 0xcf, 0x1a, 0xdf, 0x82, 0xb9, 0xa9, 0x00, 0x72, 0x1d, + 0xad, 0x72, 0xbb, 0xd6, 0xa2, 0xac, 0xeb, 0x68, 0x57, 0x22, 0x3b, 0x7a, 0x05, 0x50, 0xd5, 0xf5, + 0x9a, 0x07, 0x88, 0x1f, 0x78, 0x80, 0xaa, 0xeb, 0x5d, 0xd9, 0x27, 0x65, 0x48, 0x1c, 0xd8, 0xbb, + 0x5e, 0x96, 0x20, 0xdf, 0x6e, 0x06, 0xb8, 0x37, 0xe9, 0x30, 0x19, 0x79, 0x8c, 0xde, 0xec, 0x50, + 0x0f, 0xf4, 0xf2, 0xf0, 0xb8, 0x29, 0xfc, 0x0f, 0x3b, 0xf8, 0x4d, 0x5d, 0x00, 0x7e, 0x43, 0x6c, + 0x71, 0x7e, 0xc0, 0xb4, 0x9e, 0xc6, 0x7e, 0xf4, 0xc3, 0xfe, 0x57, 0x5a, 0x76, 0x98, 0xb7, 0xc5, + 0xc1, 0xee, 0x5b, 0x12, 0x4c, 0x75, 0x10, 0xfb, 0xed, 0x9c, 0x5e, 0xec, 0x74, 0x74, 0xa9, 0xdb, + 0x7d, 0x8a, 0x3c, 0xcd, 0xe3, 0x31, 0xfa, 0xaa, 0x5e, 0xa8, 0x8a, 0xd0, 0xee, 0xe3, 0x03, 0xf2, + 0x33, 0x70, 0xb4, 0x2d, 0x15, 0x97, 0xad, 0x08, 0x89, 0x1d, 0xdd, 0xf5, 0xb8, 0x58, 0xf7, 0x74, + 0x12, 0xab, 0x89, 0x9a, 0xd2, 0xc8, 0x08, 0xb2, 0x94, 0xf5, 0xba, 0x65, 0x19, 0x5c, 0x0c, 0xf9, + 0x12, 0x8c, 0x85, 0x60, 0x7c, 0x90, 0x33, 0x90, 0xb0, 0x2d, 0xfe, 0x3d, 0x9f, 0xcc, 0xa9, 0x63, + 0x9d, 0x06, 0x21, 0x34, 0x5c, 0x6d, 0x8a, 0x2f, 0x4f, 0x00, 0x62, 0xcc, 0xe8, 0x5d, 0x2f, 0x31, + 0xc4, 0x06, 0x8c, 0x47, 0xa0, 0x7c, 0x90, 0x1f, 0x83, 0x01, 0x9b, 0x42, 0xf8, 0x30, 0x1d, 0x5f, + 0x12, 0x60, 0x74, 0x22, 0x6d, 0x63, 0x34, 0xa7, 0xbe, 0x7f, 0x18, 0x92, 0x94, 0x2b, 0xfa, 0x8c, + 0x04, 0x10, 0xba, 0xb9, 0x55, 0xe8, 0xc4, 0xa6, 0x7d, 0x35, 0x27, 0x3f, 0xdb, 0x33, 0x3e, 0xcf, + 0xbb, 0x4f, 0xfe, 0xd4, 0xbf, 0xfa, 0xee, 0xcf, 0xc6, 0xee, 0x46, 0xf2, 0x6c, 0x87, 0x3a, 0x52, + 0x28, 0x18, 0xbf, 0x2c, 0x85, 0xdf, 0x25, 0x7b, 0xb0, 0xb7, 0xa1, 0x84, 0x64, 0x85, 0x5e, 0xd1, + 0xb9, 0x60, 0xe7, 0xa8, 0x60, 0x8f, 0xa2, 0x47, 0xba, 0x0b, 0x36, 0xfb, 0x81, 0x68, 0x74, 0x7d, + 0x08, 0x7d, 0x4b, 0x82, 0x89, 0x76, 0x65, 0x02, 0x74, 0xb6, 0x37, 0x29, 0x5a, 0x13, 0xb2, 0xfc, + 0xe3, 0x07, 0xa0, 0xe4, 0xaa, 0x2c, 0x52, 0x55, 0xe6, 0xd0, 0x13, 0x07, 0x50, 0x65, 0x36, 0xb4, + 0xfb, 0xa1, 0xff, 0x2b, 0xc1, 0xf1, 0x7d, 0x8f, 0xd0, 0x68, 0xae, 0x37, 0x29, 0xf7, 0xc9, 0x3c, + 0xf3, 0xa5, 0x37, 0xc2, 0x82, 0x6b, 0xfc, 0x24, 0xd5, 0xf8, 0x12, 0x5a, 0x3a, 0x88, 0xc6, 0x41, + 0x9a, 0x18, 0xd6, 0xfd, 0xb7, 0xa5, 0xc8, 0xeb, 0x14, 0xfb, 0xbb, 0x53, 0xcb, 0xd9, 0xb1, 0x4b, + 0x60, 0xb4, 0x1e, 0x09, 0xe4, 0xa7, 0xa9, 0x0a, 0x0a, 0x5a, 0x7f, 0x83, 0x93, 0x36, 0xfb, 0x81, + 0xe8, 0xa6, 0xf2, 0x21, 0xf4, 0xbf, 0xa5, 0xf6, 0xef, 0x2f, 0x3c, 0xb6, 0xaf, 0x88, 0x9d, 0xcf, + 0xc5, 0xf9, 0xb3, 0xfd, 0x13, 0x72, 0x25, 0xeb, 0x54, 0xc9, 0x1a, 0xc2, 0xb7, 0x5b, 0xc9, 0xb6, + 0x93, 0x88, 0x7e, 0x47, 0x82, 0x89, 0x76, 0x27, 0xba, 0x2e, 0x61, 0xb9, 0xcf, 0x59, 0xb6, 0x4b, + 0x58, 0xee, 0x77, 0x7c, 0x94, 0x7f, 0x8c, 0x2a, 0x7f, 0x06, 0x9d, 0xee, 0xa4, 0xfc, 0xbe, 0xb3, + 0x48, 0x62, 0x71, 0xdf, 0x93, 0x4f, 0x97, 0x58, 0xec, 0xe5, 0x14, 0xd8, 0x25, 0x16, 0x7b, 0x3a, + 0x78, 0x75, 0x8f, 0x45, 0x5f, 0xb3, 0x1e, 0xa7, 0xd1, 0x45, 0x5f, 0x97, 0x60, 0x38, 0x92, 0x97, + 0xa3, 0x87, 0xf7, 0x15, 0xb4, 0xdd, 0x29, 0x2a, 0x7f, 0xaa, 0x1f, 0x12, 0xae, 0xcb, 0x12, 0xd5, + 0x65, 0x1e, 0xcd, 0x1d, 0x44, 0x17, 0x27, 0x22, 0xf1, 0xcb, 0x12, 0x8c, 0xb7, 0x49, 0x61, 0xbb, + 0x44, 0x61, 0xe7, 0xd4, 0x3d, 0x7f, 0xb6, 0x7f, 0x42, 0xae, 0xd5, 0x79, 0xaa, 0xd5, 0x7b, 0xd1, + 0x7b, 0x0e, 0xa2, 0x55, 0x68, 0x7f, 0xbe, 0x19, 0xdc, 0x8f, 0x0e, 0x8d, 0x83, 0xce, 0xf4, 0x29, + 0x98, 0x50, 0xe8, 0xb1, 0xbe, 0xe9, 0xb8, 0x3e, 0x4f, 0x51, 0x7d, 0x9e, 0x44, 0x6b, 0x6f, 0x4c, + 0x9f, 0xd6, 0x6d, 0xfd, 0xab, 0xad, 0x9f, 0x8a, 0xd8, 0xdf, 0x8b, 0xda, 0x26, 0xab, 0xf9, 0x47, + 0xfa, 0xa2, 0xe1, 0x4a, 0x9d, 0xa5, 0x4a, 0x9d, 0x42, 0x0f, 0x75, 0x52, 0x2a, 0x74, 0x09, 0x5e, + 0x37, 0xb7, 0xad, 0xd9, 0x0f, 0xb0, 0x14, 0xf8, 0x43, 0xe8, 0x27, 0xc5, 0x05, 0xe4, 0x13, 0xfb, + 0x8e, 0x1b, 0xca, 0x63, 0xf3, 0xf7, 0xf5, 0x80, 0xc9, 0xe5, 0xba, 0x9b, 0xca, 0x35, 0x85, 0x8e, + 0x75, 0x92, 0x8b, 0xe4, 0xb2, 0xe8, 0xe3, 0x92, 0xff, 0xce, 0xc2, 0xc9, 0xfd, 0x79, 0x87, 0x93, + 0xdd, 0xfc, 0xfd, 0x3d, 0xe1, 0x72, 0x49, 0xee, 0xa1, 0x92, 0xcc, 0xa0, 0xa9, 0x8e, 0x92, 0xb0, + 0xd4, 0xf7, 0x76, 0xdf, 0x79, 0xf9, 0x6c, 0xaa, 0xe3, 0x67, 0x51, 0x6a, 0xd8, 0xc4, 0xae, 0xee, + 0x1e, 0xe8, 0x4e, 0x72, 0x6f, 0x0f, 0x56, 0xbf, 0x95, 0x84, 0xa1, 0x45, 0x36, 0xca, 0x86, 0xa7, + 0x7a, 0x6f, 0xf0, 0x20, 0x80, 0x5c, 0xfe, 0x21, 0x43, 0x7a, 0xa5, 0xa5, 0x62, 0x5b, 0xd7, 0xb1, + 0x38, 0x2b, 0x2e, 0xf5, 0x7d, 0x19, 0x98, 0xbf, 0x9f, 0xdf, 0xcc, 0x4f, 0x66, 0xdf, 0x44, 0xa4, + 0xb7, 0x6e, 0xd6, 0x09, 0x00, 0x7d, 0x44, 0x82, 0xc3, 0x14, 0x2b, 0x88, 0x37, 0x8a, 0x29, 0xde, + 0x27, 0xec, 0xe8, 0x31, 0xcb, 0x6a, 0xa8, 0xfc, 0x43, 0x79, 0x95, 0xee, 0xe6, 0xaf, 0xb7, 0x1c, + 0x0b, 0x0d, 0xde, 0xcc, 0x56, 0x56, 0xc6, 0x8d, 0x16, 0x4a, 0xb7, 0xa9, 0x68, 0x90, 0x38, 0x78, + 0xd1, 0xe0, 0x22, 0x64, 0x42, 0x2b, 0x7d, 0x2e, 0xd9, 0xe5, 0x15, 0xde, 0xe6, 0xca, 0x62, 0x98, + 0x18, 0x7d, 0x4c, 0x82, 0xc3, 0x6d, 0x37, 0x41, 0xfa, 0x7f, 0x38, 0xfb, 0xac, 0x5c, 0x36, 0x19, + 0xa7, 0x2d, 0x5f, 0x59, 0x99, 0x68, 0xb4, 0xcb, 0x26, 0xd6, 0x61, 0x38, 0xb2, 0x81, 0xe5, 0xc4, + 0x7f, 0xd3, 0xed, 0xfd, 0x85, 0x8b, 0x28, 0x03, 0x94, 0x87, 0x14, 0xde, 0xb5, 0x2d, 0xc7, 0xc3, + 0x55, 0x7a, 0x59, 0x27, 0xa5, 0xf8, 0x6d, 0xf9, 0x3a, 0xa0, 0xd6, 0xc9, 0x45, 0x97, 0x60, 0x30, + 0x7a, 0xb5, 0xef, 0x00, 0x05, 0x0c, 0xc1, 0x01, 0x4d, 0x40, 0x32, 0xf0, 0xef, 0xb8, 0xc2, 0x1a, + 0xb7, 0x7b, 0x71, 0xf8, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xce, 0x00, 0xd4, 0xd7, 0x6f, 0x91, + 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) diff --git a/x/upgrade/types/query.pb.gw.go b/x/upgrade/types/query.pb.gw.go index 6d311b577828..00965639dca6 100644 --- a/x/upgrade/types/query.pb.gw.go +++ b/x/upgrade/types/query.pb.gw.go @@ -13,7 +13,6 @@ import ( "io" "net/http" - "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -23,13 +22,11 @@ import ( "google.golang.org/grpc/status" ) -// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage func request_Query_CurrentPlan_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryCurrentPlanRequest @@ -40,15 +37,6 @@ func request_Query_CurrentPlan_0(ctx context.Context, marshaler runtime.Marshale } -func local_request_Query_CurrentPlan_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryCurrentPlanRequest - var metadata runtime.ServerMetadata - - msg, err := server.CurrentPlan(ctx, &protoReq) - return msg, metadata, err - -} - func request_Query_AppliedPlan_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryAppliedPlanRequest var metadata runtime.ServerMetadata @@ -76,82 +64,6 @@ func request_Query_AppliedPlan_0(ctx context.Context, marshaler runtime.Marshale } -func local_request_Query_AppliedPlan_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryAppliedPlanRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["name"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") - } - - protoReq.Name, err = runtime.String(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) - } - - msg, err := server.AppliedPlan(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_CurrentPlan_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_CurrentPlan_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_CurrentPlan_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_AppliedPlan_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_AppliedPlan_0(rctx, inboundMarshaler, server, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_AppliedPlan_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { From 67ea545819222ec49821a347eb12bba3ce4aa143 Mon Sep 17 00:00:00 2001 From: blushi Date: Fri, 21 Aug 2020 12:11:26 +0200 Subject: [PATCH 008/128] Use Type() and Bytes() in sr25519 pub key Equals --- crypto/keys/keys.go | 42 +++++++++++++++++++++++++++++++++++ crypto/keys/sr25519/pubkey.go | 7 +++--- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/crypto/keys/keys.go b/crypto/keys/keys.go index e94cc04d5f2c..d621a05d1b65 100644 --- a/crypto/keys/keys.go +++ b/crypto/keys/keys.go @@ -2,7 +2,9 @@ package keys import ( "github.com/cosmos/cosmos-sdk/crypto" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + "github.com/cosmos/cosmos-sdk/crypto/keys/sr25519" ) var ( @@ -89,3 +91,43 @@ func (m *Secp256K1PrivKey) Equals(key crypto.PrivKey) bool { func (m *Secp256K1PrivKey) Type() string { return m.Key.Type() } + +func (m *Sr25519PrivKey) Bytes() []byte { + return m.Bytes() +} + +func (m *Sr25519PrivKey) Sign(msg []byte) ([]byte, error) { + return m.Sign(msg) +} + +func (m *Sr25519PrivKey) PubKey() crypto.PubKey { + return &Sr25519PubKey{Key: m.PubKey().(sr25519.PubKey)} +} + +func (m *Sr25519PrivKey) Equals(key crypto.PrivKey) bool { + return m.Key.Equals(key) +} + +func (m *Sr25519PrivKey) Type() string { + return m.Key.Type() +} + +func (m *Ed25519PrivKey) Bytes() []byte { + return m.Bytes() +} + +func (m *Ed25519PrivKey) Sign(msg []byte) ([]byte, error) { + return m.Sign(msg) +} + +func (m *Ed25519PrivKey) PubKey() crypto.PubKey { + return &Ed25519PubKey{Key: m.PubKey().(ed25519.PubKey)} +} + +func (m *Ed25519PrivKey) Equals(key crypto.PrivKey) bool { + return m.Key.Equals(key) +} + +func (m *Ed25519PrivKey) Type() string { + return m.Key.Type() +} diff --git a/crypto/keys/sr25519/pubkey.go b/crypto/keys/sr25519/pubkey.go index 87805cacbad5..dafd169fb093 100644 --- a/crypto/keys/sr25519/pubkey.go +++ b/crypto/keys/sr25519/pubkey.go @@ -65,13 +65,12 @@ func (pubKey PubKey) String() string { // Equals - checks that two public keys are the same time // Runs in constant time based on length of the keys. func (pubKey PubKey) Equals(other crypto.PubKey) bool { - if otherEd, ok := other.(PubKey); ok { - return bytes.Equal(pubKey[:], otherEd[:]) + if pubKey.Type() != other.Type() { + return false } - return false + return bytes.Equal(pubKey.Bytes(), other.Bytes()) } func (pubKey PubKey) Type() string { return keyType - } From 8f3be0418feb9e59aedd8eae8e42ae3299309ba4 Mon Sep 17 00:00:00 2001 From: blushi Date: Fri, 21 Aug 2020 14:45:18 +0200 Subject: [PATCH 009/128] Add tests --- crypto/keys/keys_test.go | 45 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 crypto/keys/keys_test.go diff --git a/crypto/keys/keys_test.go b/crypto/keys/keys_test.go new file mode 100644 index 000000000000..8648e4eee59e --- /dev/null +++ b/crypto/keys/keys_test.go @@ -0,0 +1,45 @@ +package keys_test + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/crypto/keys" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/sr25519" + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/crypto" +) + +func TestSr25519Equals(t *testing.T) { + pubKey := sr25519.GenPrivKey().PubKey().(sr25519.PubKey) + pbPubKey := &keys.Sr25519PubKey{Key: pubKey} + + testCases := []struct { + msg string + other crypto.PubKey + expectEq bool + }{ + { + "different types", + ed25519.GenPrivKey().PubKey(), + false, + }, + { + "different bytes", + sr25519.GenPrivKey().PubKey(), + false, + }, + { + "equals", + pubKey, + true, + }, + } + + for _, tc := range testCases { + t.Run(tc.msg, func(t *testing.T) { + eq := pbPubKey.Equals(tc.other) + require.Equal(t, eq, tc.expectEq) + }) + } +} From 7c2d693355ac38abce755950fe0fdf7e8759de84 Mon Sep 17 00:00:00 2001 From: blushi Date: Fri, 21 Aug 2020 15:08:51 +0200 Subject: [PATCH 010/128] Add few more tests --- crypto/keys/keys_test.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/crypto/keys/keys_test.go b/crypto/keys/keys_test.go index 8648e4eee59e..e49238a8db80 100644 --- a/crypto/keys/keys_test.go +++ b/crypto/keys/keys_test.go @@ -19,6 +19,27 @@ func TestSr25519Equals(t *testing.T) { other crypto.PubKey expectEq bool }{ + { + "pb different types", + &keys.Ed25519PubKey{ + Key: ed25519.GenPrivKey().PubKey().(ed25519.PubKey), + }, + false, + }, + { + "pb different bytes", + &keys.Sr25519PubKey{ + Key: sr25519.GenPrivKey().PubKey().(sr25519.PubKey), + }, + false, + }, + { + "pb equals", + &keys.Sr25519PubKey{ + Key: pubKey, + }, + true, + }, { "different types", ed25519.GenPrivKey().PubKey(), From 7c535798ac055abfdd608548215d499a5d732760 Mon Sep 17 00:00:00 2001 From: blushi Date: Fri, 21 Aug 2020 17:22:51 +0200 Subject: [PATCH 011/128] Update other pub/priv key types Equals --- crypto/keys/ed25519/ed25519.go | 14 +- crypto/keys/keys.go | 6 +- crypto/keys/keys_test.go | 274 +++++++++++++++++++++++++++-- crypto/keys/secp256k1/secp256k1.go | 12 +- crypto/keys/sr25519/privkey.go | 6 +- 5 files changed, 280 insertions(+), 32 deletions(-) diff --git a/crypto/keys/ed25519/ed25519.go b/crypto/keys/ed25519/ed25519.go index 73574c01693e..80e7ff611f75 100644 --- a/crypto/keys/ed25519/ed25519.go +++ b/crypto/keys/ed25519/ed25519.go @@ -77,11 +77,10 @@ func (privKey PrivKey) PubKey() crypto.PubKey { // Equals - you probably don't need to use this. // Runs in constant time based on length of the keys. func (privKey PrivKey) Equals(other crypto.PrivKey) bool { - if otherEd, ok := other.(PrivKey); ok { - return subtle.ConstantTimeCompare(privKey[:], otherEd[:]) == 1 + if privKey.Type() != other.Type() { + return false } - - return false + return subtle.ConstantTimeCompare(privKey.Bytes(), other.Bytes()) == 1 } func (privKey PrivKey) Type() string { @@ -155,9 +154,8 @@ func (pubKey PubKey) Type() string { } func (pubKey PubKey) Equals(other crypto.PubKey) bool { - if otherEd, ok := other.(PubKey); ok { - return bytes.Equal(pubKey[:], otherEd[:]) + if pubKey.Type() != other.Type() { + return false } - - return false + return bytes.Equal(pubKey.Bytes(), other.Bytes()) } diff --git a/crypto/keys/keys.go b/crypto/keys/keys.go index d621a05d1b65..0bfeba417334 100644 --- a/crypto/keys/keys.go +++ b/crypto/keys/keys.go @@ -73,7 +73,7 @@ func (m *Sr25519PubKey) Type() string { } func (m *Secp256K1PrivKey) Bytes() []byte { - return m.Bytes() + return m.Key.Bytes() } func (m *Secp256K1PrivKey) Sign(msg []byte) ([]byte, error) { @@ -93,7 +93,7 @@ func (m *Secp256K1PrivKey) Type() string { } func (m *Sr25519PrivKey) Bytes() []byte { - return m.Bytes() + return m.Key.Bytes() } func (m *Sr25519PrivKey) Sign(msg []byte) ([]byte, error) { @@ -113,7 +113,7 @@ func (m *Sr25519PrivKey) Type() string { } func (m *Ed25519PrivKey) Bytes() []byte { - return m.Bytes() + return m.Key.Bytes() } func (m *Ed25519PrivKey) Sign(msg []byte) ([]byte, error) { diff --git a/crypto/keys/keys_test.go b/crypto/keys/keys_test.go index e49238a8db80..15f92fc8d210 100644 --- a/crypto/keys/keys_test.go +++ b/crypto/keys/keys_test.go @@ -5,61 +5,311 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/keys/sr25519" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto" ) -func TestSr25519Equals(t *testing.T) { - pubKey := sr25519.GenPrivKey().PubKey().(sr25519.PubKey) - pbPubKey := &keys.Sr25519PubKey{Key: pubKey} +func TestPubKeyEquals(t *testing.T) { + sr25519PubKey := sr25519.GenPrivKey().PubKey().(sr25519.PubKey) + sr25519PbPubKey := &keys.Sr25519PubKey{Key: sr25519PubKey} + + ed25519PubKey := ed25519.GenPrivKey().PubKey().(ed25519.PubKey) + ed25519PbPubKey := &keys.Ed25519PubKey{Key: ed25519PubKey} + + secp256k1PubKey := secp256k1.GenPrivKey().PubKey().(secp256k1.PubKey) + secp256k1PbPubKey := &keys.Secp256K1PubKey{Key: secp256k1PubKey} testCases := []struct { msg string + pubKey crypto.PubKey other crypto.PubKey expectEq bool }{ { - "pb different types", + "sr25519 pb different types", + sr25519PbPubKey, &keys.Ed25519PubKey{ Key: ed25519.GenPrivKey().PubKey().(ed25519.PubKey), }, false, }, { - "pb different bytes", + "sr25519 pb different bytes", + sr25519PbPubKey, &keys.Sr25519PubKey{ Key: sr25519.GenPrivKey().PubKey().(sr25519.PubKey), }, false, }, { - "pb equals", + "sr25519 pb equals", + sr25519PbPubKey, &keys.Sr25519PubKey{ - Key: pubKey, + Key: sr25519PubKey, }, true, }, { - "different types", + "sr25519 different types", + sr25519PbPubKey, ed25519.GenPrivKey().PubKey(), false, }, { - "different bytes", + "sr25519 different bytes", + sr25519PbPubKey, + sr25519.GenPrivKey().PubKey(), + false, + }, + { + "sr25519 equals", + sr25519PbPubKey, + sr25519PubKey, + true, + }, + { + "ed25519 pb different types", + ed25519PbPubKey, + &keys.Sr25519PubKey{ + Key: sr25519.GenPrivKey().PubKey().(sr25519.PubKey), + }, + false, + }, + { + "ed25519 pb different bytes", + ed25519PbPubKey, + &keys.Ed25519PubKey{ + Key: ed25519.GenPrivKey().PubKey().(ed25519.PubKey), + }, + false, + }, + { + "ed25519 pb equals", + ed25519PbPubKey, + &keys.Ed25519PubKey{ + Key: ed25519PubKey, + }, + true, + }, + { + "ed25519 different types", + ed25519PbPubKey, sr25519.GenPrivKey().PubKey(), false, }, { - "equals", - pubKey, + "ed25519 different bytes", + ed25519PbPubKey, + ed25519.GenPrivKey().PubKey(), + false, + }, + { + "ed25519 equals", + ed25519PbPubKey, + ed25519PubKey, + true, + }, + { + "secp256k1 pb different types", + secp256k1PbPubKey, + &keys.Sr25519PubKey{ + Key: sr25519.GenPrivKey().PubKey().(sr25519.PubKey), + }, + false, + }, + { + "secp256k1 pb different bytes", + secp256k1PbPubKey, + &keys.Secp256K1PubKey{ + Key: secp256k1.GenPrivKey().PubKey().(secp256k1.PubKey), + }, + false, + }, + { + "secp256k1 pb equals", + secp256k1PbPubKey, + &keys.Secp256K1PubKey{ + Key: secp256k1PubKey, + }, + true, + }, + { + "secp256k1 different types", + secp256k1PbPubKey, + sr25519.GenPrivKey().PubKey(), + false, + }, + { + "secp256k1 different bytes", + secp256k1PbPubKey, + secp256k1.GenPrivKey().PubKey(), + false, + }, + { + "secp256k1 equals", + secp256k1PbPubKey, + secp256k1PubKey, + true, + }, + } + + for _, tc := range testCases { + t.Run(tc.msg, func(t *testing.T) { + eq := tc.pubKey.Equals(tc.other) + require.Equal(t, eq, tc.expectEq) + }) + } +} + +func TestPrivKeyEquals(t *testing.T) { + sr25519PrivKey := sr25519.GenPrivKey() + sr25519PbPrivKey := &keys.Sr25519PrivKey{Key: sr25519PrivKey} + + ed25519PrivKey := ed25519.GenPrivKey() + ed25519PbPrivKey := &keys.Ed25519PrivKey{Key: ed25519PrivKey} + + secp256k1PrivKey := secp256k1.GenPrivKey() + secp256k1PbPrivKey := &keys.Secp256K1PrivKey{Key: secp256k1PrivKey} + + testCases := []struct { + msg string + privKey crypto.PrivKey + other crypto.PrivKey + expectEq bool + }{ + { + "sr25519 pb different types", + sr25519PbPrivKey, + &keys.Ed25519PrivKey{ + Key: ed25519.GenPrivKey(), + }, + false, + }, + { + "sr25519 pb different bytes", + sr25519PbPrivKey, + &keys.Sr25519PrivKey{ + Key: sr25519.GenPrivKey(), + }, + false, + }, + { + "sr25519 pb equals", + sr25519PbPrivKey, + &keys.Sr25519PrivKey{ + Key: sr25519PrivKey, + }, + true, + }, + { + "sr25519 different types", + sr25519PbPrivKey, + ed25519.GenPrivKey(), + false, + }, + { + "sr25519 different bytes", + sr25519PbPrivKey, + sr25519.GenPrivKey(), + false, + }, + { + "sr25519 equals", + sr25519PbPrivKey, + sr25519PrivKey, + true, + }, + { + "ed25519 pb different types", + ed25519PbPrivKey, + &keys.Sr25519PrivKey{ + Key: sr25519.GenPrivKey(), + }, + false, + }, + { + "ed25519 pb different bytes", + ed25519PbPrivKey, + &keys.Ed25519PrivKey{ + Key: ed25519.GenPrivKey(), + }, + false, + }, + { + "ed25519 pb equals", + ed25519PbPrivKey, + &keys.Ed25519PrivKey{ + Key: ed25519PrivKey, + }, + true, + }, + { + "ed25519 different types", + ed25519PbPrivKey, + sr25519.GenPrivKey(), + false, + }, + { + "ed25519 different bytes", + ed25519PbPrivKey, + ed25519.GenPrivKey(), + false, + }, + { + "ed25519 equals", + ed25519PbPrivKey, + ed25519PrivKey, + true, + }, + { + "secp256k1 pb different types", + secp256k1PbPrivKey, + &keys.Sr25519PrivKey{ + Key: sr25519.GenPrivKey(), + }, + false, + }, + { + "secp256k1 pb different bytes", + secp256k1PbPrivKey, + &keys.Secp256K1PrivKey{ + Key: secp256k1.GenPrivKey(), + }, + false, + }, + { + "secp256k1 pb equals", + secp256k1PbPrivKey, + &keys.Secp256K1PrivKey{ + Key: secp256k1PrivKey, + }, + true, + }, + { + "secp256k1 different types", + secp256k1PbPrivKey, + sr25519.GenPrivKey(), + false, + }, + { + "secp256k1 different bytes", + secp256k1PbPrivKey, + secp256k1.GenPrivKey(), + false, + }, + { + "secp256k1 equals", + secp256k1PbPrivKey, + secp256k1PrivKey, true, }, } for _, tc := range testCases { t.Run(tc.msg, func(t *testing.T) { - eq := pbPubKey.Equals(tc.other) + eq := tc.privKey.Equals(tc.other) require.Equal(t, eq, tc.expectEq) }) } diff --git a/crypto/keys/secp256k1/secp256k1.go b/crypto/keys/secp256k1/secp256k1.go index 68a5239463e2..7e4d71334830 100644 --- a/crypto/keys/secp256k1/secp256k1.go +++ b/crypto/keys/secp256k1/secp256k1.go @@ -39,10 +39,10 @@ func (privKey PrivKey) PubKey() crypto.PubKey { // Equals - you probably don't need to use this. // Runs in constant time based on length of the keys. func (privKey PrivKey) Equals(other crypto.PrivKey) bool { - if otherSecp, ok := other.(PrivKey); ok { - return subtle.ConstantTimeCompare(privKey[:], otherSecp[:]) == 1 + if privKey.Type() != other.Type() { + return false } - return false + return subtle.ConstantTimeCompare(privKey.Bytes(), other.Bytes()) == 1 } func (privKey PrivKey) Type() string { @@ -152,8 +152,8 @@ func (pubKey PubKey) Type() string { } func (pubKey PubKey) Equals(other crypto.PubKey) bool { - if otherSecp, ok := other.(PubKey); ok { - return bytes.Equal(pubKey[:], otherSecp[:]) + if pubKey.Type() != other.Type() { + return false } - return false + return bytes.Equal(pubKey.Bytes(), other.Bytes()) } diff --git a/crypto/keys/sr25519/privkey.go b/crypto/keys/sr25519/privkey.go index e77ca375ce30..b8e7eec7a41d 100644 --- a/crypto/keys/sr25519/privkey.go +++ b/crypto/keys/sr25519/privkey.go @@ -63,10 +63,10 @@ func (privKey PrivKey) PubKey() crypto.PubKey { // Equals - you probably don't need to use this. // Runs in constant time based on length of the keys. func (privKey PrivKey) Equals(other crypto.PrivKey) bool { - if otherEd, ok := other.(PrivKey); ok { - return subtle.ConstantTimeCompare(privKey[:], otherEd[:]) == 1 + if privKey.Type() != other.Type() { + return false } - return false + return subtle.ConstantTimeCompare(privKey.Bytes(), other.Bytes()) == 1 } func (privKey PrivKey) Type() string { From 92c73ec8cdc03594db89436a0f773ea5d03ba5bc Mon Sep 17 00:00:00 2001 From: blushi Date: Fri, 21 Aug 2020 17:26:24 +0200 Subject: [PATCH 012/128] Fix PrivKey's Sign method --- crypto/keys/keys.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crypto/keys/keys.go b/crypto/keys/keys.go index 0bfeba417334..8baac1f8bda5 100644 --- a/crypto/keys/keys.go +++ b/crypto/keys/keys.go @@ -77,7 +77,7 @@ func (m *Secp256K1PrivKey) Bytes() []byte { } func (m *Secp256K1PrivKey) Sign(msg []byte) ([]byte, error) { - return m.Sign(msg) + return m.Key.Sign(msg) } func (m *Secp256K1PrivKey) PubKey() crypto.PubKey { @@ -97,7 +97,7 @@ func (m *Sr25519PrivKey) Bytes() []byte { } func (m *Sr25519PrivKey) Sign(msg []byte) ([]byte, error) { - return m.Sign(msg) + return m.Key.Sign(msg) } func (m *Sr25519PrivKey) PubKey() crypto.PubKey { @@ -117,7 +117,7 @@ func (m *Ed25519PrivKey) Bytes() []byte { } func (m *Ed25519PrivKey) Sign(msg []byte) ([]byte, error) { - return m.Sign(msg) + return m.Key.Sign(msg) } func (m *Ed25519PrivKey) PubKey() crypto.PubKey { From d81291e147f038c199a55e2b3e43ea71ab697d53 Mon Sep 17 00:00:00 2001 From: blushi Date: Mon, 24 Aug 2020 12:29:34 +0200 Subject: [PATCH 013/128] Rename variables in tests --- crypto/keys/keys_test.go | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/crypto/keys/keys_test.go b/crypto/keys/keys_test.go index 15f92fc8d210..6491b89d562a 100644 --- a/crypto/keys/keys_test.go +++ b/crypto/keys/keys_test.go @@ -18,8 +18,8 @@ func TestPubKeyEquals(t *testing.T) { ed25519PubKey := ed25519.GenPrivKey().PubKey().(ed25519.PubKey) ed25519PbPubKey := &keys.Ed25519PubKey{Key: ed25519PubKey} - secp256k1PubKey := secp256k1.GenPrivKey().PubKey().(secp256k1.PubKey) - secp256k1PbPubKey := &keys.Secp256K1PubKey{Key: secp256k1PubKey} + secp256K1PubKey := secp256k1.GenPrivKey().PubKey().(secp256k1.PubKey) + secp256K1PbPubKey := &keys.Secp256K1PubKey{Key: secp256K1PubKey} testCases := []struct { msg string @@ -113,7 +113,7 @@ func TestPubKeyEquals(t *testing.T) { }, { "secp256k1 pb different types", - secp256k1PbPubKey, + secp256K1PbPubKey, &keys.Sr25519PubKey{ Key: sr25519.GenPrivKey().PubKey().(sr25519.PubKey), }, @@ -121,7 +121,7 @@ func TestPubKeyEquals(t *testing.T) { }, { "secp256k1 pb different bytes", - secp256k1PbPubKey, + secp256K1PbPubKey, &keys.Secp256K1PubKey{ Key: secp256k1.GenPrivKey().PubKey().(secp256k1.PubKey), }, @@ -129,28 +129,28 @@ func TestPubKeyEquals(t *testing.T) { }, { "secp256k1 pb equals", - secp256k1PbPubKey, + secp256K1PbPubKey, &keys.Secp256K1PubKey{ - Key: secp256k1PubKey, + Key: secp256K1PubKey, }, true, }, { "secp256k1 different types", - secp256k1PbPubKey, + secp256K1PbPubKey, sr25519.GenPrivKey().PubKey(), false, }, { "secp256k1 different bytes", - secp256k1PbPubKey, + secp256K1PbPubKey, secp256k1.GenPrivKey().PubKey(), false, }, { "secp256k1 equals", - secp256k1PbPubKey, - secp256k1PubKey, + secp256K1PbPubKey, + secp256K1PubKey, true, }, } @@ -170,8 +170,8 @@ func TestPrivKeyEquals(t *testing.T) { ed25519PrivKey := ed25519.GenPrivKey() ed25519PbPrivKey := &keys.Ed25519PrivKey{Key: ed25519PrivKey} - secp256k1PrivKey := secp256k1.GenPrivKey() - secp256k1PbPrivKey := &keys.Secp256K1PrivKey{Key: secp256k1PrivKey} + secp256K1PrivKey := secp256k1.GenPrivKey() + secp256K1PbPrivKey := &keys.Secp256K1PrivKey{Key: secp256K1PrivKey} testCases := []struct { msg string @@ -265,7 +265,7 @@ func TestPrivKeyEquals(t *testing.T) { }, { "secp256k1 pb different types", - secp256k1PbPrivKey, + secp256K1PbPrivKey, &keys.Sr25519PrivKey{ Key: sr25519.GenPrivKey(), }, @@ -273,7 +273,7 @@ func TestPrivKeyEquals(t *testing.T) { }, { "secp256k1 pb different bytes", - secp256k1PbPrivKey, + secp256K1PbPrivKey, &keys.Secp256K1PrivKey{ Key: secp256k1.GenPrivKey(), }, @@ -281,28 +281,28 @@ func TestPrivKeyEquals(t *testing.T) { }, { "secp256k1 pb equals", - secp256k1PbPrivKey, + secp256K1PbPrivKey, &keys.Secp256K1PrivKey{ - Key: secp256k1PrivKey, + Key: secp256K1PrivKey, }, true, }, { "secp256k1 different types", - secp256k1PbPrivKey, + secp256K1PbPrivKey, sr25519.GenPrivKey(), false, }, { "secp256k1 different bytes", - secp256k1PbPrivKey, + secp256K1PbPrivKey, secp256k1.GenPrivKey(), false, }, { "secp256k1 equals", - secp256k1PbPrivKey, - secp256k1PrivKey, + secp256K1PbPrivKey, + secp256K1PrivKey, true, }, } From 03a086d2c411118ba666c4a1b78a2dc0afded157 Mon Sep 17 00:00:00 2001 From: blushi Date: Mon, 24 Aug 2020 17:32:17 +0200 Subject: [PATCH 014/128] Fix infinite recursive calls --- crypto/keys/keys.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crypto/keys/keys.go b/crypto/keys/keys.go index 8baac1f8bda5..c0e079de5c29 100644 --- a/crypto/keys/keys.go +++ b/crypto/keys/keys.go @@ -81,7 +81,7 @@ func (m *Secp256K1PrivKey) Sign(msg []byte) ([]byte, error) { } func (m *Secp256K1PrivKey) PubKey() crypto.PubKey { - return &Secp256K1PubKey{Key: m.PubKey().(secp256k1.PubKey)} + return &Secp256K1PubKey{Key: m.Key.PubKey().(secp256k1.PubKey)} } func (m *Secp256K1PrivKey) Equals(key crypto.PrivKey) bool { @@ -101,7 +101,7 @@ func (m *Sr25519PrivKey) Sign(msg []byte) ([]byte, error) { } func (m *Sr25519PrivKey) PubKey() crypto.PubKey { - return &Sr25519PubKey{Key: m.PubKey().(sr25519.PubKey)} + return &Sr25519PubKey{Key: m.Key.PubKey().(sr25519.PubKey)} } func (m *Sr25519PrivKey) Equals(key crypto.PrivKey) bool { @@ -121,7 +121,7 @@ func (m *Ed25519PrivKey) Sign(msg []byte) ([]byte, error) { } func (m *Ed25519PrivKey) PubKey() crypto.PubKey { - return &Ed25519PubKey{Key: m.PubKey().(ed25519.PubKey)} + return &Ed25519PubKey{Key: m.Key.PubKey().(ed25519.PubKey)} } func (m *Ed25519PrivKey) Equals(key crypto.PrivKey) bool { From ad81bd47812954abc61c960d6f7e41e11bdd1c50 Mon Sep 17 00:00:00 2001 From: blushi Date: Thu, 27 Aug 2020 14:10:58 +0200 Subject: [PATCH 015/128] Use tm ed25519 keys --- crypto/keys/keys.go | 16 +- crypto/keys/keys.pb.go | 77 +- crypto/keys/keys_test.go | 11 +- proto/cosmos/keys/keys.proto | 7 +- x/auth/types/query.pb.gw.go | 88 ++ x/bank/types/query.pb.gw.go | 229 +++++ x/distribution/types/query.pb.gw.go | 417 ++++++++ x/evidence/types/query.pb.gw.go | 95 ++ x/gov/types/query.pb.gw.go | 413 ++++++++ x/ibc-transfer/types/query.pb.gw.go | 124 +++ x/ibc/03-connection/types/query.pb.gw.go | 243 +++++ x/ibc/04-channel/types/query.pb.gw.go | 690 ++++++++++++- x/mint/types/query.pb.gw.go | 99 ++ x/params/types/proposal/query.pb.gw.go | 48 + x/slashing/types/query.pb.gw.go | 124 +++ x/staking/types/query.pb.gw.go | 784 ++++++++++++++- x/staking/types/staking.pb.go | 1122 +++++++++++----------- x/upgrade/types/query.pb.gw.go | 88 ++ 18 files changed, 3996 insertions(+), 679 deletions(-) diff --git a/crypto/keys/keys.go b/crypto/keys/keys.go index c0e079de5c29..a03397800327 100644 --- a/crypto/keys/keys.go +++ b/crypto/keys/keys.go @@ -1,10 +1,14 @@ package keys import ( + "bytes" + "crypto/subtle" + "github.com/cosmos/cosmos-sdk/crypto" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + // "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/keys/sr25519" + "github.com/tendermint/tendermint/crypto/ed25519" ) var ( @@ -45,7 +49,10 @@ func (m *Ed25519PubKey) VerifySignature(msg []byte, sig []byte) bool { } func (m *Ed25519PubKey) Equals(key crypto.PubKey) bool { - return m.Key.Equals(key) + if m.Key.Type() != key.Type() { + return false + } + return bytes.Equal(m.Key.Bytes(), key.Bytes()) } func (m *Ed25519PubKey) Type() string { @@ -125,7 +132,10 @@ func (m *Ed25519PrivKey) PubKey() crypto.PubKey { } func (m *Ed25519PrivKey) Equals(key crypto.PrivKey) bool { - return m.Key.Equals(key) + if m.Key.Type() != key.Type() { + return false + } + return subtle.ConstantTimeCompare(m.Key.Bytes(), key.Bytes()) == 1 } func (m *Ed25519PrivKey) Type() string { diff --git a/crypto/keys/keys.pb.go b/crypto/keys/keys.pb.go index 06ce6a8a91c2..7d7a1ae5bab2 100644 --- a/crypto/keys/keys.pb.go +++ b/crypto/keys/keys.pb.go @@ -5,16 +5,15 @@ package keys import ( fmt "fmt" - io "io" - math "math" - math_bits "math/bits" - types "github.com/cosmos/cosmos-sdk/codec/types" - github_com_cosmos_cosmos_sdk_crypto_keys_ed25519 "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" github_com_cosmos_cosmos_sdk_crypto_keys_secp256k1 "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" github_com_cosmos_cosmos_sdk_crypto_keys_sr25519 "github.com/cosmos/cosmos-sdk/crypto/keys/sr25519" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" + github_com_tendermint_tendermint_crypto_ed25519 "github.com/tendermint/tendermint/crypto/ed25519" + io "io" + math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -224,7 +223,8 @@ func (m *Secp256K1PrivKey) GetKey() github_com_cosmos_cosmos_sdk_crypto_keys_sec } type Ed25519PubKey struct { - Key github_com_cosmos_cosmos_sdk_crypto_keys_ed25519.PubKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/cosmos/cosmos-sdk/crypto/keys/ed25519.PubKey" json:"key,omitempty"` + // bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519.PubKey"]; + Key github_com_tendermint_tendermint_crypto_ed25519.PubKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/tendermint/tendermint/crypto/ed25519.PubKey" json:"key,omitempty"` } func (m *Ed25519PubKey) Reset() { *m = Ed25519PubKey{} } @@ -260,7 +260,7 @@ func (m *Ed25519PubKey) XXX_DiscardUnknown() { var xxx_messageInfo_Ed25519PubKey proto.InternalMessageInfo -func (m *Ed25519PubKey) GetKey() github_com_cosmos_cosmos_sdk_crypto_keys_ed25519.PubKey { +func (m *Ed25519PubKey) GetKey() github_com_tendermint_tendermint_crypto_ed25519.PubKey { if m != nil { return m.Key } @@ -268,7 +268,8 @@ func (m *Ed25519PubKey) GetKey() github_com_cosmos_cosmos_sdk_crypto_keys_ed2551 } type Ed25519PrivKey struct { - Key github_com_cosmos_cosmos_sdk_crypto_keys_ed25519.PrivKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/cosmos/cosmos-sdk/crypto/keys/ed25519.PrivKey" json:"key,omitempty"` + // bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519.PrivKey"]; + Key github_com_tendermint_tendermint_crypto_ed25519.PrivKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/tendermint/tendermint/crypto/ed25519.PrivKey" json:"key,omitempty"` } func (m *Ed25519PrivKey) Reset() { *m = Ed25519PrivKey{} } @@ -304,7 +305,7 @@ func (m *Ed25519PrivKey) XXX_DiscardUnknown() { var xxx_messageInfo_Ed25519PrivKey proto.InternalMessageInfo -func (m *Ed25519PrivKey) GetKey() github_com_cosmos_cosmos_sdk_crypto_keys_ed25519.PrivKey { +func (m *Ed25519PrivKey) GetKey() github_com_tendermint_tendermint_crypto_ed25519.PrivKey { if m != nil { return m.Key } @@ -413,34 +414,36 @@ func init() { func init() { proto.RegisterFile("cosmos/keys/keys.proto", fileDescriptor_9a7b75e504952b64) } var fileDescriptor_9a7b75e504952b64 = []byte{ - // 428 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4b, 0xce, 0x2f, 0xce, - 0xcd, 0x2f, 0xd6, 0xcf, 0x4e, 0xad, 0x84, 0x10, 0x7a, 0x05, 0x45, 0xf9, 0x25, 0xf9, 0x42, 0xbc, - 0x10, 0x71, 0xbd, 0xe4, 0xa2, 0xca, 0x82, 0x92, 0x7c, 0x29, 0x91, 0xf4, 0xfc, 0xf4, 0x7c, 0xb0, - 0x8c, 0x3e, 0x88, 0x05, 0x51, 0x24, 0x25, 0x99, 0x9e, 0x9f, 0x9f, 0x9e, 0x93, 0xaa, 0x0f, 0xe6, - 0x25, 0x95, 0xa6, 0xe9, 0x27, 0xe6, 0x55, 0x42, 0xa4, 0x94, 0x56, 0x30, 0x72, 0x89, 0xfb, 0x96, - 0xe6, 0x94, 0x64, 0x16, 0x67, 0xa6, 0x87, 0x64, 0x14, 0xa5, 0x16, 0x67, 0xe4, 0xe7, 0xa4, 0x04, - 0x94, 0x26, 0x79, 0xa7, 0x56, 0x0a, 0x99, 0x73, 0x71, 0x96, 0xc0, 0x84, 0x24, 0x18, 0x15, 0x18, - 0x35, 0x78, 0x9d, 0x24, 0x1f, 0xdd, 0x93, 0x67, 0xf4, 0xfe, 0x74, 0x4f, 0x5e, 0xa0, 0x32, 0x31, - 0x37, 0xc7, 0x4a, 0x09, 0x2e, 0xaf, 0x14, 0x84, 0x50, 0x2b, 0x14, 0xc2, 0xc5, 0x5d, 0x50, 0x9a, - 0x94, 0x93, 0x99, 0x1c, 0x0f, 0x72, 0xa9, 0x04, 0x93, 0x02, 0xb3, 0x06, 0xb7, 0x91, 0x88, 0x1e, - 0xc4, 0x15, 0x7a, 0x30, 0x57, 0xe8, 0x39, 0xe6, 0x55, 0x3a, 0xc9, 0x3e, 0xba, 0x27, 0xcf, 0x0e, - 0xb1, 0xaf, 0xf8, 0xd3, 0x3d, 0x79, 0x3e, 0x88, 0xb1, 0x05, 0xa5, 0x49, 0x20, 0x9d, 0x4a, 0x41, - 0x5c, 0x10, 0x73, 0x40, 0xb2, 0x4a, 0x9b, 0x19, 0xb9, 0x94, 0x7c, 0x52, 0xd3, 0x13, 0x93, 0x2b, - 0x1d, 0x73, 0x33, 0xf3, 0xf2, 0x87, 0x88, 0xab, 0x93, 0xb8, 0xf8, 0x83, 0x53, 0x93, 0x0b, 0x8c, - 0x4c, 0xcd, 0xbc, 0x0d, 0xa1, 0x2e, 0xf4, 0xe7, 0x62, 0xce, 0x4e, 0xad, 0x04, 0xbb, 0x8d, 0xc7, - 0xc9, 0xf6, 0xd7, 0x3d, 0x79, 0xcb, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, - 0x7d, 0x68, 0x3c, 0x43, 0x28, 0xdd, 0xe2, 0x94, 0x6c, 0x7d, 0x48, 0xd4, 0x42, 0x62, 0xbe, 0x18, - 0x62, 0x54, 0xb6, 0xa1, 0x1e, 0xc4, 0xac, 0x20, 0x90, 0x49, 0x4a, 0x29, 0x5c, 0x02, 0x08, 0x3b, - 0x8a, 0x32, 0xcb, 0x40, 0x96, 0x04, 0x20, 0x5b, 0x62, 0xf7, 0xeb, 0x9e, 0xbc, 0x15, 0x39, 0x96, - 0x40, 0x0c, 0x83, 0xd8, 0x12, 0xc7, 0xc5, 0xeb, 0x9a, 0x62, 0x64, 0x6a, 0x6a, 0x68, 0x09, 0xf5, - 0x87, 0x2f, 0xb2, 0x15, 0xd6, 0xbf, 0xee, 0xc9, 0x9b, 0x13, 0x6d, 0x45, 0x2a, 0xc4, 0x20, 0x14, - 0x5f, 0x24, 0x70, 0xf1, 0xc1, 0xcc, 0x87, 0xfa, 0xc1, 0x0f, 0xd9, 0x02, 0x9b, 0x5f, 0xf7, 0xe4, - 0x2d, 0x48, 0xb7, 0x00, 0xcd, 0x07, 0xc1, 0x45, 0x54, 0xf2, 0x41, 0x71, 0x11, 0x56, 0x1f, 0xc0, - 0xcc, 0xa7, 0xdc, 0x07, 0x70, 0x0b, 0x90, 0x7c, 0xe0, 0xe4, 0x74, 0xe2, 0x91, 0x1c, 0xe3, 0x85, - 0x47, 0x72, 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, - 0x8d, 0xc7, 0x72, 0x0c, 0x51, 0x1a, 0xc4, 0x1a, 0x9c, 0xc4, 0x06, 0x4e, 0xca, 0xc6, 0x80, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xca, 0x79, 0xcb, 0x85, 0x53, 0x04, 0x00, 0x00, + // 455 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x92, 0xcb, 0x6e, 0xd3, 0x40, + 0x14, 0x86, 0x33, 0x54, 0x02, 0x31, 0xc5, 0xa1, 0x8a, 0x2a, 0x68, 0x2b, 0xe1, 0xa9, 0xbc, 0xca, + 0x06, 0x5b, 0x09, 0x4a, 0x4b, 0xc3, 0x45, 0xaa, 0x25, 0x56, 0x69, 0xa1, 0x4a, 0xbb, 0x42, 0x82, + 0x12, 0xdb, 0x83, 0x63, 0xf9, 0x32, 0x96, 0x2f, 0x48, 0xf3, 0x16, 0x3c, 0x06, 0x7b, 0x5e, 0x82, + 0x65, 0x96, 0xac, 0x46, 0xc8, 0x79, 0x83, 0x2c, 0xbd, 0x42, 0xf6, 0xb1, 0xc9, 0x20, 0x24, 0x20, + 0xec, 0xd8, 0xd8, 0xe3, 0x39, 0xe3, 0xef, 0xfb, 0x8f, 0x8f, 0xf1, 0x3d, 0x9b, 0xa5, 0x21, 0x4b, + 0x0d, 0x9f, 0x72, 0xb8, 0xe8, 0x71, 0xc2, 0x32, 0xd6, 0x53, 0x60, 0x5f, 0xb7, 0x13, 0x1e, 0x67, + 0xec, 0x60, 0xd7, 0x65, 0x2e, 0xab, 0x2b, 0x46, 0xb5, 0x82, 0x43, 0x07, 0xfb, 0x2e, 0x63, 0x6e, + 0x40, 0x8d, 0xfa, 0xc9, 0xca, 0xdf, 0x1b, 0xb3, 0x88, 0x43, 0x49, 0xfb, 0x84, 0xf0, 0xfd, 0xf3, + 0x3c, 0xc8, 0xbc, 0xd4, 0x73, 0xaf, 0xe6, 0x09, 0x4d, 0xe7, 0x2c, 0x70, 0x2e, 0x72, 0x6b, 0x42, + 0x79, 0xef, 0x18, 0xdf, 0xce, 0xda, 0xad, 0x3d, 0x74, 0x88, 0xfa, 0x8a, 0xb9, 0x5f, 0x08, 0x82, + 0x26, 0x2b, 0x41, 0x76, 0xf8, 0x2c, 0x0c, 0xc6, 0xda, 0x8f, 0xba, 0x36, 0x5d, 0x9f, 0xed, 0x5d, + 0xe1, 0xed, 0x38, 0xb7, 0x02, 0xcf, 0xbe, 0xae, 0x92, 0xee, 0xdd, 0x38, 0xdc, 0xea, 0x6f, 0x0f, + 0x77, 0x75, 0x48, 0xa1, 0xb7, 0x29, 0xf4, 0xd3, 0x88, 0x9b, 0x0f, 0x0a, 0x41, 0x6e, 0x81, 0x2f, + 0x5d, 0x09, 0xd2, 0x05, 0x6c, 0x9c, 0x5b, 0xd5, 0x9b, 0xda, 0x14, 0x03, 0xa7, 0xaa, 0x6a, 0x9f, + 0x11, 0xd6, 0xce, 0xa8, 0x3b, 0xb3, 0xf9, 0x69, 0xe8, 0x45, 0xec, 0x3f, 0x49, 0x6d, 0xe1, 0xbb, + 0x97, 0xd4, 0x8e, 0x87, 0xa3, 0xa3, 0xc9, 0xa0, 0x49, 0xf8, 0x0a, 0x6f, 0xf9, 0x94, 0xd7, 0xd9, + 0xee, 0x98, 0xcf, 0x4a, 0x41, 0x4e, 0x5c, 0x2f, 0x9b, 0xe7, 0x96, 0x6e, 0xb3, 0xd0, 0x68, 0xe6, + 0x0c, 0xb7, 0x87, 0xa9, 0xe3, 0x1b, 0x30, 0x5a, 0x98, 0x7c, 0x0a, 0x28, 0x7f, 0xa0, 0x03, 0x6b, + 0x5a, 0x91, 0x34, 0x07, 0xef, 0xac, 0x1d, 0x89, 0xf7, 0xa1, 0x92, 0x5c, 0xc8, 0x92, 0xe7, 0xa5, + 0x20, 0xe3, 0x7f, 0x91, 0x00, 0x0c, 0x2c, 0x6f, 0xb0, 0xf2, 0xc2, 0x19, 0x8e, 0x46, 0x83, 0x93, + 0xa6, 0x8f, 0x33, 0x59, 0x31, 0x2e, 0x05, 0x39, 0x92, 0x14, 0x19, 0x8d, 0x1c, 0x9a, 0x84, 0x5e, + 0x94, 0xc9, 0xcb, 0x46, 0x43, 0x81, 0xf3, 0x53, 0x13, 0xd7, 0xb8, 0xdb, 0xe2, 0x9b, 0x16, 0xce, + 0x65, 0xfe, 0x93, 0x52, 0x90, 0xe3, 0x8d, 0xf9, 0x72, 0xfe, 0xb7, 0x58, 0xb9, 0x4c, 0xe4, 0xfc, + 0xbf, 0xe5, 0xff, 0xe1, 0x13, 0x25, 0xbf, 0x36, 0xf0, 0x0e, 0x77, 0x5b, 0x7e, 0xd3, 0xc0, 0x4b, + 0x59, 0xf0, 0xb4, 0x14, 0xe4, 0xf1, 0xe6, 0x02, 0xa9, 0x03, 0xd3, 0xfc, 0x52, 0xa8, 0x68, 0x51, + 0xa8, 0xe8, 0x5b, 0xa1, 0xa2, 0x8f, 0x4b, 0xb5, 0xb3, 0x58, 0xaa, 0x9d, 0xaf, 0x4b, 0xb5, 0xf3, + 0xba, 0xff, 0xb7, 0x60, 0xeb, 0x66, 0xfd, 0x23, 0x3f, 0xfa, 0x1e, 0x00, 0x00, 0xff, 0xff, 0x87, + 0x8e, 0xee, 0xdf, 0x51, 0x04, 0x00, 0x00, } func (m *MultisigThresholdPubKey) Marshal() (dAtA []byte, err error) { diff --git a/crypto/keys/keys_test.go b/crypto/keys/keys_test.go index 6491b89d562a..1d3ad93cb223 100644 --- a/crypto/keys/keys_test.go +++ b/crypto/keys/keys_test.go @@ -4,11 +4,12 @@ import ( "testing" "github.com/cosmos/cosmos-sdk/crypto/keys" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + // "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/keys/sr25519" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto" + "github.com/tendermint/tendermint/crypto/ed25519" ) func TestPubKeyEquals(t *testing.T) { @@ -93,6 +94,14 @@ func TestPubKeyEquals(t *testing.T) { }, true, }, + { + "tm ed25519 equals pb ed25519", + ed25519PubKey, + &keys.Ed25519PubKey{ + Key: ed25519PubKey, + }, + true, + }, { "ed25519 different types", ed25519PbPubKey, diff --git a/proto/cosmos/keys/keys.proto b/proto/cosmos/keys/keys.proto index eb3cf7db7cf6..4ae5973e2a9d 100644 --- a/proto/cosmos/keys/keys.proto +++ b/proto/cosmos/keys/keys.proto @@ -28,11 +28,14 @@ message Secp256K1PrivKey { } message Ed25519PubKey { - bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519.PubKey"]; + // bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519.PubKey"]; + bytes key = 1 [(gogoproto.casttype) = "github.com/tendermint/tendermint/crypto/ed25519.PubKey"]; } message Ed25519PrivKey { - bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519.PrivKey"]; + // bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519.PrivKey"]; + bytes key = 1 [(gogoproto.casttype) = "github.com/tendermint/tendermint/crypto/ed25519.PrivKey"]; + } message Sr25519PubKey { diff --git a/x/auth/types/query.pb.gw.go b/x/auth/types/query.pb.gw.go index adc76a0a1a91..3b156842ddc0 100644 --- a/x/auth/types/query.pb.gw.go +++ b/x/auth/types/query.pb.gw.go @@ -13,6 +13,7 @@ import ( "io" "net/http" + "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -22,11 +23,13 @@ import ( "google.golang.org/grpc/status" ) +// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage func request_Query_Account_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryAccountRequest @@ -55,6 +58,33 @@ func request_Query_Account_0(ctx context.Context, marshaler runtime.Marshaler, c } +func local_request_Query_Account_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAccountRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") + } + + protoReq.Address, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) + } + + msg, err := server.Account(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryParamsRequest var metadata runtime.ServerMetadata @@ -64,6 +94,64 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl } +func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryParamsRequest + var metadata runtime.ServerMetadata + + msg, err := server.Params(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_Account_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Account_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Account_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/bank/types/query.pb.gw.go b/x/bank/types/query.pb.gw.go index f127e7e9f4bc..ca9c1ddbfa6c 100644 --- a/x/bank/types/query.pb.gw.go +++ b/x/bank/types/query.pb.gw.go @@ -13,6 +13,7 @@ import ( "io" "net/http" + "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -22,11 +23,13 @@ import ( "google.golang.org/grpc/status" ) +// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage func request_Query_Balance_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryBalanceRequest @@ -66,6 +69,44 @@ func request_Query_Balance_0(ctx context.Context, marshaler runtime.Marshaler, c } +func local_request_Query_Balance_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryBalanceRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") + } + + protoReq.Address, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) + } + + val, ok = pathParams["denom"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "denom") + } + + protoReq.Denom, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "denom", err) + } + + msg, err := server.Balance(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_AllBalances_0 = &utilities.DoubleArray{Encoding: map[string]int{"address": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -104,6 +145,40 @@ func request_Query_AllBalances_0(ctx context.Context, marshaler runtime.Marshale } +func local_request_Query_AllBalances_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAllBalancesRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "address") + } + + protoReq.Address, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "address", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_AllBalances_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.AllBalances(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_TotalSupply_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryTotalSupplyRequest var metadata runtime.ServerMetadata @@ -113,6 +188,15 @@ func request_Query_TotalSupply_0(ctx context.Context, marshaler runtime.Marshale } +func local_request_Query_TotalSupply_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryTotalSupplyRequest + var metadata runtime.ServerMetadata + + msg, err := server.TotalSupply(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_SupplyOf_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QuerySupplyOfRequest var metadata runtime.ServerMetadata @@ -140,6 +224,33 @@ func request_Query_SupplyOf_0(ctx context.Context, marshaler runtime.Marshaler, } +func local_request_Query_SupplyOf_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QuerySupplyOfRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["denom"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "denom") + } + + protoReq.Denom, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "denom", err) + } + + msg, err := server.SupplyOf(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryParamsRequest var metadata runtime.ServerMetadata @@ -149,6 +260,124 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl } +func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryParamsRequest + var metadata runtime.ServerMetadata + + msg, err := server.Params(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_Balance_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Balance_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Balance_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_AllBalances_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_AllBalances_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_AllBalances_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_TotalSupply_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_TotalSupply_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_TotalSupply_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_SupplyOf_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_SupplyOf_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_SupplyOf_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/distribution/types/query.pb.gw.go b/x/distribution/types/query.pb.gw.go index 1c03938041fe..890e51e40d1e 100644 --- a/x/distribution/types/query.pb.gw.go +++ b/x/distribution/types/query.pb.gw.go @@ -13,6 +13,7 @@ import ( "io" "net/http" + "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -22,11 +23,13 @@ import ( "google.golang.org/grpc/status" ) +// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryParamsRequest @@ -37,6 +40,15 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl } +func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryParamsRequest + var metadata runtime.ServerMetadata + + msg, err := server.Params(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_ValidatorOutstandingRewards_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryValidatorOutstandingRewardsRequest var metadata runtime.ServerMetadata @@ -64,6 +76,33 @@ func request_Query_ValidatorOutstandingRewards_0(ctx context.Context, marshaler } +func local_request_Query_ValidatorOutstandingRewards_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryValidatorOutstandingRewardsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["validator_address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_address") + } + + protoReq.ValidatorAddress, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_address", err) + } + + msg, err := server.ValidatorOutstandingRewards(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_ValidatorCommission_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryValidatorCommissionRequest var metadata runtime.ServerMetadata @@ -91,6 +130,33 @@ func request_Query_ValidatorCommission_0(ctx context.Context, marshaler runtime. } +func local_request_Query_ValidatorCommission_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryValidatorCommissionRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["validator_address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_address") + } + + protoReq.ValidatorAddress, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_address", err) + } + + msg, err := server.ValidatorCommission(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_ValidatorSlashes_0 = &utilities.DoubleArray{Encoding: map[string]int{"validator_address": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -129,6 +195,40 @@ func request_Query_ValidatorSlashes_0(ctx context.Context, marshaler runtime.Mar } +func local_request_Query_ValidatorSlashes_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryValidatorSlashesRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["validator_address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_address") + } + + protoReq.ValidatorAddress, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_address", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ValidatorSlashes_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ValidatorSlashes(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_DelegationRewards_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryDelegationRewardsRequest var metadata runtime.ServerMetadata @@ -167,6 +267,44 @@ func request_Query_DelegationRewards_0(ctx context.Context, marshaler runtime.Ma } +func local_request_Query_DelegationRewards_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDelegationRewardsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["delegator_address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_address") + } + + protoReq.DelegatorAddress, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_address", err) + } + + val, ok = pathParams["validator_address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_address") + } + + protoReq.ValidatorAddress, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_address", err) + } + + msg, err := server.DelegationRewards(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_DelegationTotalRewards_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryDelegationTotalRewardsRequest var metadata runtime.ServerMetadata @@ -194,6 +332,33 @@ func request_Query_DelegationTotalRewards_0(ctx context.Context, marshaler runti } +func local_request_Query_DelegationTotalRewards_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDelegationTotalRewardsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["delegator_address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_address") + } + + protoReq.DelegatorAddress, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_address", err) + } + + msg, err := server.DelegationTotalRewards(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_DelegatorValidators_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryDelegatorValidatorsRequest var metadata runtime.ServerMetadata @@ -221,6 +386,33 @@ func request_Query_DelegatorValidators_0(ctx context.Context, marshaler runtime. } +func local_request_Query_DelegatorValidators_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDelegatorValidatorsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["delegator_address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_address") + } + + protoReq.DelegatorAddress, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_address", err) + } + + msg, err := server.DelegatorValidators(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_DelegatorWithdrawAddress_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryDelegatorWithdrawAddressRequest var metadata runtime.ServerMetadata @@ -248,6 +440,33 @@ func request_Query_DelegatorWithdrawAddress_0(ctx context.Context, marshaler run } +func local_request_Query_DelegatorWithdrawAddress_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDelegatorWithdrawAddressRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["delegator_address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_address") + } + + protoReq.DelegatorAddress, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_address", err) + } + + msg, err := server.DelegatorWithdrawAddress(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_CommunityPool_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryCommunityPoolRequest var metadata runtime.ServerMetadata @@ -257,6 +476,204 @@ func request_Query_CommunityPool_0(ctx context.Context, marshaler runtime.Marsha } +func local_request_Query_CommunityPool_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryCommunityPoolRequest + var metadata runtime.ServerMetadata + + msg, err := server.CommunityPool(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ValidatorOutstandingRewards_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_ValidatorOutstandingRewards_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ValidatorOutstandingRewards_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ValidatorCommission_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_ValidatorCommission_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ValidatorCommission_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ValidatorSlashes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_ValidatorSlashes_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ValidatorSlashes_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_DelegationRewards_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_DelegationRewards_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DelegationRewards_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_DelegationTotalRewards_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_DelegationTotalRewards_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DelegationTotalRewards_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_DelegatorValidators_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_DelegatorValidators_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DelegatorValidators_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_DelegatorWithdrawAddress_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_DelegatorWithdrawAddress_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DelegatorWithdrawAddress_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_CommunityPool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_CommunityPool_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_CommunityPool_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/evidence/types/query.pb.gw.go b/x/evidence/types/query.pb.gw.go index 5de488fd9c3f..e15d163524b4 100644 --- a/x/evidence/types/query.pb.gw.go +++ b/x/evidence/types/query.pb.gw.go @@ -13,6 +13,7 @@ import ( "io" "net/http" + "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -22,11 +23,13 @@ import ( "google.golang.org/grpc/status" ) +// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage func request_Query_Evidence_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryEvidenceRequest @@ -55,6 +58,33 @@ func request_Query_Evidence_0(ctx context.Context, marshaler runtime.Marshaler, } +func local_request_Query_Evidence_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryEvidenceRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["evidence_hash"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "evidence_hash") + } + + protoReq.EvidenceHash, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "evidence_hash", err) + } + + msg, err := server.Evidence(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_AllEvidence_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -75,6 +105,71 @@ func request_Query_AllEvidence_0(ctx context.Context, marshaler runtime.Marshale } +func local_request_Query_AllEvidence_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAllEvidenceRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_AllEvidence_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.AllEvidence(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_Evidence_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Evidence_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Evidence_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_AllEvidence_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_AllEvidence_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_AllEvidence_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/gov/types/query.pb.gw.go b/x/gov/types/query.pb.gw.go index 073881def7ab..e9fc72f302b2 100644 --- a/x/gov/types/query.pb.gw.go +++ b/x/gov/types/query.pb.gw.go @@ -13,6 +13,7 @@ import ( "io" "net/http" + "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -22,11 +23,13 @@ import ( "google.golang.org/grpc/status" ) +// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage func request_Query_Proposal_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryProposalRequest @@ -55,6 +58,33 @@ func request_Query_Proposal_0(ctx context.Context, marshaler runtime.Marshaler, } +func local_request_Query_Proposal_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryProposalRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["proposal_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "proposal_id") + } + + protoReq.ProposalId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "proposal_id", err) + } + + msg, err := server.Proposal(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_Proposals_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -75,6 +105,22 @@ func request_Query_Proposals_0(ctx context.Context, marshaler runtime.Marshaler, } +func local_request_Query_Proposals_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryProposalsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Proposals_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Proposals(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_Vote_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryVoteRequest var metadata runtime.ServerMetadata @@ -113,6 +159,44 @@ func request_Query_Vote_0(ctx context.Context, marshaler runtime.Marshaler, clie } +func local_request_Query_Vote_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryVoteRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["proposal_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "proposal_id") + } + + protoReq.ProposalId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "proposal_id", err) + } + + val, ok = pathParams["voter"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "voter") + } + + protoReq.Voter, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "voter", err) + } + + msg, err := server.Vote(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_Votes_0 = &utilities.DoubleArray{Encoding: map[string]int{"proposal_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -151,6 +235,40 @@ func request_Query_Votes_0(ctx context.Context, marshaler runtime.Marshaler, cli } +func local_request_Query_Votes_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryVotesRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["proposal_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "proposal_id") + } + + protoReq.ProposalId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "proposal_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Votes_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Votes(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryParamsRequest var metadata runtime.ServerMetadata @@ -178,6 +296,33 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl } +func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryParamsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["params_type"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "params_type") + } + + protoReq.ParamsType, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "params_type", err) + } + + msg, err := server.Params(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_Deposit_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryDepositRequest var metadata runtime.ServerMetadata @@ -216,6 +361,44 @@ func request_Query_Deposit_0(ctx context.Context, marshaler runtime.Marshaler, c } +func local_request_Query_Deposit_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDepositRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["proposal_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "proposal_id") + } + + protoReq.ProposalId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "proposal_id", err) + } + + val, ok = pathParams["depositor"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "depositor") + } + + protoReq.Depositor, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "depositor", err) + } + + msg, err := server.Deposit(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_Deposits_0 = &utilities.DoubleArray{Encoding: map[string]int{"proposal_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -254,6 +437,40 @@ func request_Query_Deposits_0(ctx context.Context, marshaler runtime.Marshaler, } +func local_request_Query_Deposits_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDepositsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["proposal_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "proposal_id") + } + + protoReq.ProposalId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "proposal_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Deposits_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Deposits(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_TallyResult_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryTallyResultRequest var metadata runtime.ServerMetadata @@ -281,6 +498,202 @@ func request_Query_TallyResult_0(ctx context.Context, marshaler runtime.Marshale } +func local_request_Query_TallyResult_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryTallyResultRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["proposal_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "proposal_id") + } + + protoReq.ProposalId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "proposal_id", err) + } + + msg, err := server.TallyResult(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_Proposal_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Proposal_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Proposal_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Proposals_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Proposals_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Proposals_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Vote_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Vote_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Vote_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Votes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Votes_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Votes_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Deposit_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Deposit_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Deposit_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Deposits_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Deposits_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Deposits_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_TallyResult_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_TallyResult_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_TallyResult_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/ibc-transfer/types/query.pb.gw.go b/x/ibc-transfer/types/query.pb.gw.go index 9055c8af4154..23b91aafc162 100644 --- a/x/ibc-transfer/types/query.pb.gw.go +++ b/x/ibc-transfer/types/query.pb.gw.go @@ -13,6 +13,7 @@ import ( "io" "net/http" + "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -22,11 +23,13 @@ import ( "google.golang.org/grpc/status" ) +// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage func request_Query_DenomTrace_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryDenomTraceRequest @@ -55,6 +58,33 @@ func request_Query_DenomTrace_0(ctx context.Context, marshaler runtime.Marshaler } +func local_request_Query_DenomTrace_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDenomTraceRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["hash"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "hash") + } + + protoReq.Hash, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "hash", err) + } + + msg, err := server.DenomTrace(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_DenomTraces_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -75,6 +105,22 @@ func request_Query_DenomTraces_0(ctx context.Context, marshaler runtime.Marshale } +func local_request_Query_DenomTraces_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDenomTracesRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_DenomTraces_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DenomTraces(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryParamsRequest var metadata runtime.ServerMetadata @@ -84,6 +130,84 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl } +func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryParamsRequest + var metadata runtime.ServerMetadata + + msg, err := server.Params(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_DenomTrace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_DenomTrace_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DenomTrace_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_DenomTraces_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_DenomTraces_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DenomTraces_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/ibc/03-connection/types/query.pb.gw.go b/x/ibc/03-connection/types/query.pb.gw.go index 8711de564982..7c17c2dd53ff 100644 --- a/x/ibc/03-connection/types/query.pb.gw.go +++ b/x/ibc/03-connection/types/query.pb.gw.go @@ -13,6 +13,7 @@ import ( "io" "net/http" + "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -22,11 +23,13 @@ import ( "google.golang.org/grpc/status" ) +// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage func request_Query_Connection_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryConnectionRequest @@ -55,6 +58,33 @@ func request_Query_Connection_0(ctx context.Context, marshaler runtime.Marshaler } +func local_request_Query_Connection_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryConnectionRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["connection_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "connection_id") + } + + protoReq.ConnectionId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "connection_id", err) + } + + msg, err := server.Connection(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_Connections_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -75,6 +105,22 @@ func request_Query_Connections_0(ctx context.Context, marshaler runtime.Marshale } +func local_request_Query_Connections_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryConnectionsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Connections_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Connections(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_ClientConnections_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryClientConnectionsRequest var metadata runtime.ServerMetadata @@ -102,6 +148,33 @@ func request_Query_ClientConnections_0(ctx context.Context, marshaler runtime.Ma } +func local_request_Query_ClientConnections_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryClientConnectionsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["client_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "client_id") + } + + protoReq.ClientId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "client_id", err) + } + + msg, err := server.ClientConnections(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_ConnectionClientState_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryConnectionClientStateRequest var metadata runtime.ServerMetadata @@ -129,6 +202,33 @@ func request_Query_ConnectionClientState_0(ctx context.Context, marshaler runtim } +func local_request_Query_ConnectionClientState_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryConnectionClientStateRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["connection_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "connection_id") + } + + protoReq.ConnectionId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "connection_id", err) + } + + msg, err := server.ConnectionClientState(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_ConnectionConsensusState_0 = &utilities.DoubleArray{Encoding: map[string]int{"connection_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -167,6 +267,149 @@ func request_Query_ConnectionConsensusState_0(ctx context.Context, marshaler run } +func local_request_Query_ConnectionConsensusState_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryConnectionConsensusStateRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["connection_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "connection_id") + } + + protoReq.ConnectionId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "connection_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ConnectionConsensusState_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ConnectionConsensusState(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_Connection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Connection_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Connection_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Connections_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Connections_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Connections_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ClientConnections_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_ClientConnections_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ClientConnections_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ConnectionClientState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_ConnectionClientState_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ConnectionClientState_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ConnectionConsensusState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_ConnectionConsensusState_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ConnectionConsensusState_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/ibc/04-channel/types/query.pb.gw.go b/x/ibc/04-channel/types/query.pb.gw.go index 72cee95d182a..d3ee502d1656 100644 --- a/x/ibc/04-channel/types/query.pb.gw.go +++ b/x/ibc/04-channel/types/query.pb.gw.go @@ -13,6 +13,7 @@ import ( "io" "net/http" + "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -22,11 +23,13 @@ import ( "google.golang.org/grpc/status" ) +// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage func request_Query_Channel_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryChannelRequest @@ -66,6 +69,44 @@ func request_Query_Channel_0(ctx context.Context, marshaler runtime.Marshaler, c } +func local_request_Query_Channel_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryChannelRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["channel_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id") + } + + protoReq.ChannelId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err) + } + + val, ok = pathParams["port_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "port_id") + } + + protoReq.PortId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) + } + + msg, err := server.Channel(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_Channels_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -86,6 +127,22 @@ func request_Query_Channels_0(ctx context.Context, marshaler runtime.Marshaler, } +func local_request_Query_Channels_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryChannelsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Channels_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Channels(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_ConnectionChannels_0 = &utilities.DoubleArray{Encoding: map[string]int{"connection": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -124,6 +181,40 @@ func request_Query_ConnectionChannels_0(ctx context.Context, marshaler runtime.M } +func local_request_Query_ConnectionChannels_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryConnectionChannelsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["connection"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "connection") + } + + protoReq.Connection, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "connection", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ConnectionChannels_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ConnectionChannels(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_ChannelClientState_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryChannelClientStateRequest var metadata runtime.ServerMetadata @@ -162,6 +253,44 @@ func request_Query_ChannelClientState_0(ctx context.Context, marshaler runtime.M } +func local_request_Query_ChannelClientState_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryChannelClientStateRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["channel_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id") + } + + protoReq.ChannelId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err) + } + + val, ok = pathParams["port_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "port_id") + } + + protoReq.PortId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) + } + + msg, err := server.ChannelClientState(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_ChannelConsensusState_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryChannelConsensusStateRequest var metadata runtime.ServerMetadata @@ -211,6 +340,55 @@ func request_Query_ChannelConsensusState_0(ctx context.Context, marshaler runtim } +func local_request_Query_ChannelConsensusState_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryChannelConsensusStateRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["channel_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id") + } + + protoReq.ChannelId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err) + } + + val, ok = pathParams["port_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "port_id") + } + + protoReq.PortId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) + } + + val, ok = pathParams["height"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "height") + } + + protoReq.Height, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "height", err) + } + + msg, err := server.ChannelConsensusState(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_PacketCommitment_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryPacketCommitmentRequest var metadata runtime.ServerMetadata @@ -260,6 +438,55 @@ func request_Query_PacketCommitment_0(ctx context.Context, marshaler runtime.Mar } +func local_request_Query_PacketCommitment_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPacketCommitmentRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["channel_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id") + } + + protoReq.ChannelId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err) + } + + val, ok = pathParams["port_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "port_id") + } + + protoReq.PortId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) + } + + val, ok = pathParams["sequence"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "sequence") + } + + protoReq.Sequence, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "sequence", err) + } + + msg, err := server.PacketCommitment(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_PacketCommitments_0 = &utilities.DoubleArray{Encoding: map[string]int{"channel_id": 0, "port_id": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} ) @@ -309,8 +536,8 @@ func request_Query_PacketCommitments_0(ctx context.Context, marshaler runtime.Ma } -func request_Query_PacketAcknowledgement_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPacketAcknowledgementRequest +func local_request_Query_PacketCommitments_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPacketCommitmentsRequest var metadata runtime.ServerMetadata var ( @@ -342,24 +569,20 @@ func request_Query_PacketAcknowledgement_0(ctx context.Context, marshaler runtim return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) } - val, ok = pathParams["sequence"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "sequence") + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - - protoReq.Sequence, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "sequence", err) + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_PacketCommitments_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.PacketAcknowledgement(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := server.PacketCommitments(ctx, &protoReq) return msg, metadata, err } -func request_Query_UnrelayedPackets_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryUnrelayedPacketsRequest +func request_Query_PacketAcknowledgement_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPacketAcknowledgementRequest var metadata runtime.ServerMetadata var ( @@ -391,35 +614,193 @@ func request_Query_UnrelayedPackets_0(ctx context.Context, marshaler runtime.Mar return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) } - val, ok = pathParams["packet_commitment_sequences"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "packet_commitment_sequences") - } - - protoReq.PacketCommitmentSequences, err = runtime.Uint64Slice(val, ",") - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "packet_commitment_sequences", err) - } - - val, ok = pathParams["acknowledgements"] + val, ok = pathParams["sequence"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "acknowledgements") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "sequence") } - protoReq.Acknowledgements, err = runtime.Bool(val) + protoReq.Sequence, err = runtime.Uint64(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "acknowledgements", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "sequence", err) } - msg, err := client.UnrelayedPackets(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.PacketAcknowledgement(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func request_Query_NextSequenceReceive_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryNextSequenceReceiveRequest +func local_request_Query_PacketAcknowledgement_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPacketAcknowledgementRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["channel_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id") + } + + protoReq.ChannelId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err) + } + + val, ok = pathParams["port_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "port_id") + } + + protoReq.PortId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) + } + + val, ok = pathParams["sequence"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "sequence") + } + + protoReq.Sequence, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "sequence", err) + } + + msg, err := server.PacketAcknowledgement(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_UnrelayedPackets_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryUnrelayedPacketsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["channel_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id") + } + + protoReq.ChannelId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err) + } + + val, ok = pathParams["port_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "port_id") + } + + protoReq.PortId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) + } + + val, ok = pathParams["packet_commitment_sequences"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "packet_commitment_sequences") + } + + protoReq.PacketCommitmentSequences, err = runtime.Uint64Slice(val, ",") + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "packet_commitment_sequences", err) + } + + val, ok = pathParams["acknowledgements"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "acknowledgements") + } + + protoReq.Acknowledgements, err = runtime.Bool(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "acknowledgements", err) + } + + msg, err := client.UnrelayedPackets(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_UnrelayedPackets_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryUnrelayedPacketsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["channel_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id") + } + + protoReq.ChannelId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err) + } + + val, ok = pathParams["port_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "port_id") + } + + protoReq.PortId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) + } + + val, ok = pathParams["packet_commitment_sequences"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "packet_commitment_sequences") + } + + protoReq.PacketCommitmentSequences, err = runtime.Uint64Slice(val, ",") + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "packet_commitment_sequences", err) + } + + val, ok = pathParams["acknowledgements"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "acknowledgements") + } + + protoReq.Acknowledgements, err = runtime.Bool(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "acknowledgements", err) + } + + msg, err := server.UnrelayedPackets(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_NextSequenceReceive_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryNextSequenceReceiveRequest var metadata runtime.ServerMetadata var ( @@ -456,6 +837,253 @@ func request_Query_NextSequenceReceive_0(ctx context.Context, marshaler runtime. } +func local_request_Query_NextSequenceReceive_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryNextSequenceReceiveRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["channel_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_id") + } + + protoReq.ChannelId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_id", err) + } + + val, ok = pathParams["port_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "port_id") + } + + protoReq.PortId, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "port_id", err) + } + + msg, err := server.NextSequenceReceive(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_Channel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Channel_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Channel_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Channels_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Channels_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Channels_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ConnectionChannels_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_ConnectionChannels_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ConnectionChannels_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ChannelClientState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_ChannelClientState_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ChannelClientState_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ChannelConsensusState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_ChannelConsensusState_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ChannelConsensusState_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_PacketCommitment_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_PacketCommitment_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_PacketCommitment_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_PacketCommitments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_PacketCommitments_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_PacketCommitments_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_PacketAcknowledgement_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_PacketAcknowledgement_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_PacketAcknowledgement_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_UnrelayedPackets_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_UnrelayedPackets_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_UnrelayedPackets_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_NextSequenceReceive_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_NextSequenceReceive_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_NextSequenceReceive_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/mint/types/query.pb.gw.go b/x/mint/types/query.pb.gw.go index cda5db851384..c70c3e60b077 100644 --- a/x/mint/types/query.pb.gw.go +++ b/x/mint/types/query.pb.gw.go @@ -13,6 +13,7 @@ import ( "io" "net/http" + "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -22,11 +23,13 @@ import ( "google.golang.org/grpc/status" ) +// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryParamsRequest @@ -37,6 +40,15 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl } +func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryParamsRequest + var metadata runtime.ServerMetadata + + msg, err := server.Params(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_Inflation_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryInflationRequest var metadata runtime.ServerMetadata @@ -46,6 +58,15 @@ func request_Query_Inflation_0(ctx context.Context, marshaler runtime.Marshaler, } +func local_request_Query_Inflation_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryInflationRequest + var metadata runtime.ServerMetadata + + msg, err := server.Inflation(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_AnnualProvisions_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryAnnualProvisionsRequest var metadata runtime.ServerMetadata @@ -55,6 +76,84 @@ func request_Query_AnnualProvisions_0(ctx context.Context, marshaler runtime.Mar } +func local_request_Query_AnnualProvisions_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAnnualProvisionsRequest + var metadata runtime.ServerMetadata + + msg, err := server.AnnualProvisions(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Inflation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Inflation_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Inflation_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_AnnualProvisions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_AnnualProvisions_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_AnnualProvisions_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/params/types/proposal/query.pb.gw.go b/x/params/types/proposal/query.pb.gw.go index 9cce0aaaa4bb..c7fab13fca65 100644 --- a/x/params/types/proposal/query.pb.gw.go +++ b/x/params/types/proposal/query.pb.gw.go @@ -13,6 +13,7 @@ import ( "io" "net/http" + "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -22,11 +23,13 @@ import ( "google.golang.org/grpc/status" ) +// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage var ( filter_Query_Params_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} @@ -48,6 +51,51 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl } +func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryParamsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Params_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Params(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/slashing/types/query.pb.gw.go b/x/slashing/types/query.pb.gw.go index 114d780e355a..5ac3296025c2 100644 --- a/x/slashing/types/query.pb.gw.go +++ b/x/slashing/types/query.pb.gw.go @@ -13,6 +13,7 @@ import ( "io" "net/http" + "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -22,11 +23,13 @@ import ( "google.golang.org/grpc/status" ) +// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryParamsRequest @@ -37,6 +40,15 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl } +func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryParamsRequest + var metadata runtime.ServerMetadata + + msg, err := server.Params(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_SigningInfo_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QuerySigningInfoRequest var metadata runtime.ServerMetadata @@ -64,6 +76,33 @@ func request_Query_SigningInfo_0(ctx context.Context, marshaler runtime.Marshale } +func local_request_Query_SigningInfo_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QuerySigningInfoRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["cons_address"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "cons_address") + } + + protoReq.ConsAddress, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "cons_address", err) + } + + msg, err := server.SigningInfo(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_SigningInfos_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -84,6 +123,91 @@ func request_Query_SigningInfos_0(ctx context.Context, marshaler runtime.Marshal } +func local_request_Query_SigningInfos_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QuerySigningInfosRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_SigningInfos_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SigningInfos(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_SigningInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_SigningInfo_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_SigningInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_SigningInfos_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_SigningInfos_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_SigningInfos_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/staking/types/query.pb.gw.go b/x/staking/types/query.pb.gw.go index accf4a1eb3bb..0c433330203b 100644 --- a/x/staking/types/query.pb.gw.go +++ b/x/staking/types/query.pb.gw.go @@ -13,6 +13,7 @@ import ( "io" "net/http" + "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -22,11 +23,13 @@ import ( "google.golang.org/grpc/status" ) +// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage var ( filter_Query_Validators_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} @@ -48,6 +51,22 @@ func request_Query_Validators_0(ctx context.Context, marshaler runtime.Marshaler } +func local_request_Query_Validators_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryValidatorsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Validators_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Validators(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_Validator_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryValidatorRequest var metadata runtime.ServerMetadata @@ -75,6 +94,33 @@ func request_Query_Validator_0(ctx context.Context, marshaler runtime.Marshaler, } +func local_request_Query_Validator_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryValidatorRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["validator_addr"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") + } + + protoReq.ValidatorAddr, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) + } + + msg, err := server.Validator(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_ValidatorDelegations_0 = &utilities.DoubleArray{Encoding: map[string]int{"validator_addr": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -113,6 +159,40 @@ func request_Query_ValidatorDelegations_0(ctx context.Context, marshaler runtime } +func local_request_Query_ValidatorDelegations_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryValidatorDelegationsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["validator_addr"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") + } + + protoReq.ValidatorAddr, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ValidatorDelegations_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ValidatorDelegations(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_ValidatorUnbondingDelegations_0 = &utilities.DoubleArray{Encoding: map[string]int{"validator_addr": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -151,6 +231,40 @@ func request_Query_ValidatorUnbondingDelegations_0(ctx context.Context, marshale } +func local_request_Query_ValidatorUnbondingDelegations_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryValidatorUnbondingDelegationsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["validator_addr"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") + } + + protoReq.ValidatorAddr, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_ValidatorUnbondingDelegations_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ValidatorUnbondingDelegations(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_Delegation_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryDelegationRequest var metadata runtime.ServerMetadata @@ -189,6 +303,44 @@ func request_Query_Delegation_0(ctx context.Context, marshaler runtime.Marshaler } +func local_request_Query_Delegation_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDelegationRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["validator_addr"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") + } + + protoReq.ValidatorAddr, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) + } + + val, ok = pathParams["delegator_addr"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_addr") + } + + protoReq.DelegatorAddr, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_addr", err) + } + + msg, err := server.Delegation(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_UnbondingDelegation_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryUnbondingDelegationRequest var metadata runtime.ServerMetadata @@ -227,6 +379,44 @@ func request_Query_UnbondingDelegation_0(ctx context.Context, marshaler runtime. } +func local_request_Query_UnbondingDelegation_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryUnbondingDelegationRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["validator_addr"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") + } + + protoReq.ValidatorAddr, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) + } + + val, ok = pathParams["delegator_addr"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_addr") + } + + protoReq.DelegatorAddr, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_addr", err) + } + + msg, err := server.UnbondingDelegation(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_DelegatorDelegations_0 = &utilities.DoubleArray{Encoding: map[string]int{"delegator_addr": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -265,12 +455,8 @@ func request_Query_DelegatorDelegations_0(ctx context.Context, marshaler runtime } -var ( - filter_Query_DelegatorUnbondingDelegations_0 = &utilities.DoubleArray{Encoding: map[string]int{"delegator_addr": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - -func request_Query_DelegatorUnbondingDelegations_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDelegatorUnbondingDelegationsRequest +func local_request_Query_DelegatorDelegations_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDelegatorDelegationsRequest var metadata runtime.ServerMetadata var ( @@ -294,21 +480,21 @@ func request_Query_DelegatorUnbondingDelegations_0(ctx context.Context, marshale if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_DelegatorUnbondingDelegations_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_DelegatorDelegations_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DelegatorUnbondingDelegations(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := server.DelegatorDelegations(ctx, &protoReq) return msg, metadata, err } var ( - filter_Query_Redelegations_0 = &utilities.DoubleArray{Encoding: map[string]int{"delegator_addr": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + filter_Query_DelegatorUnbondingDelegations_0 = &utilities.DoubleArray{Encoding: map[string]int{"delegator_addr": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) -func request_Query_Redelegations_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryRedelegationsRequest +func request_Query_DelegatorUnbondingDelegations_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDelegatorUnbondingDelegationsRequest var metadata runtime.ServerMetadata var ( @@ -332,21 +518,17 @@ func request_Query_Redelegations_0(ctx context.Context, marshaler runtime.Marsha if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Redelegations_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_DelegatorUnbondingDelegations_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.Redelegations(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.DelegatorUnbondingDelegations(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -var ( - filter_Query_DelegatorValidators_0 = &utilities.DoubleArray{Encoding: map[string]int{"delegator_addr": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - -func request_Query_DelegatorValidators_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDelegatorValidatorsRequest +func local_request_Query_DelegatorUnbondingDelegations_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDelegatorUnbondingDelegationsRequest var metadata runtime.ServerMetadata var ( @@ -370,17 +552,21 @@ func request_Query_DelegatorValidators_0(ctx context.Context, marshaler runtime. if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_DelegatorValidators_0); err != nil { + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_DelegatorUnbondingDelegations_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DelegatorValidators(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := server.DelegatorUnbondingDelegations(ctx, &protoReq) return msg, metadata, err } -func request_Query_DelegatorValidator_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryDelegatorValidatorRequest +var ( + filter_Query_Redelegations_0 = &utilities.DoubleArray{Encoding: map[string]int{"delegator_addr": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_Query_Redelegations_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryRedelegationsRequest var metadata runtime.ServerMetadata var ( @@ -401,24 +587,20 @@ func request_Query_DelegatorValidator_0(ctx context.Context, marshaler runtime.M return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_addr", err) } - val, ok = pathParams["validator_addr"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - - protoReq.ValidatorAddr, err = runtime.Bytes(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Redelegations_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.DelegatorValidator(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.Redelegations(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func request_Query_HistoricalInfo_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryHistoricalInfoRequest +func local_request_Query_Redelegations_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryRedelegationsRequest var metadata runtime.ServerMetadata var ( @@ -428,28 +610,246 @@ func request_Query_HistoricalInfo_0(ctx context.Context, marshaler runtime.Marsh _ = err ) - val, ok = pathParams["height"] + val, ok = pathParams["delegator_addr"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "height") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_addr") } - protoReq.Height, err = runtime.Int64(val) + protoReq.DelegatorAddr, err = runtime.Bytes(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "height", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_addr", err) } - msg, err := client.HistoricalInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Redelegations_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Redelegations(ctx, &protoReq) return msg, metadata, err } -func request_Query_Pool_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPoolRequest +var ( + filter_Query_DelegatorValidators_0 = &utilities.DoubleArray{Encoding: map[string]int{"delegator_addr": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_Query_DelegatorValidators_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDelegatorValidatorsRequest var metadata runtime.ServerMetadata - msg, err := client.Pool(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["delegator_addr"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_addr") + } + + protoReq.DelegatorAddr, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_addr", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_DelegatorValidators_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DelegatorValidators(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_DelegatorValidators_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDelegatorValidatorsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["delegator_addr"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_addr") + } + + protoReq.DelegatorAddr, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_addr", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_DelegatorValidators_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DelegatorValidators(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_DelegatorValidator_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDelegatorValidatorRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["delegator_addr"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_addr") + } + + protoReq.DelegatorAddr, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_addr", err) + } + + val, ok = pathParams["validator_addr"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") + } + + protoReq.ValidatorAddr, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) + } + + msg, err := client.DelegatorValidator(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_DelegatorValidator_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryDelegatorValidatorRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["delegator_addr"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "delegator_addr") + } + + protoReq.DelegatorAddr, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "delegator_addr", err) + } + + val, ok = pathParams["validator_addr"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "validator_addr") + } + + protoReq.ValidatorAddr, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "validator_addr", err) + } + + msg, err := server.DelegatorValidator(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_HistoricalInfo_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryHistoricalInfoRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["height"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "height") + } + + protoReq.Height, err = runtime.Int64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "height", err) + } + + msg, err := client.HistoricalInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_HistoricalInfo_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryHistoricalInfoRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["height"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "height") + } + + protoReq.Height, err = runtime.Int64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "height", err) + } + + msg, err := server.HistoricalInfo(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_Pool_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPoolRequest + var metadata runtime.ServerMetadata + + msg, err := client.Pool(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_Pool_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPoolRequest + var metadata runtime.ServerMetadata + + msg, err := server.Pool(ctx, &protoReq) + return msg, metadata, err } @@ -462,6 +862,304 @@ func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, cl } +func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryParamsRequest + var metadata runtime.ServerMetadata + + msg, err := server.Params(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_Validators_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Validators_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Validators_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Validator_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Validator_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Validator_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ValidatorDelegations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_ValidatorDelegations_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ValidatorDelegations_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_ValidatorUnbondingDelegations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_ValidatorUnbondingDelegations_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ValidatorUnbondingDelegations_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Delegation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Delegation_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Delegation_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_UnbondingDelegation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_UnbondingDelegation_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_UnbondingDelegation_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_DelegatorDelegations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_DelegatorDelegations_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DelegatorDelegations_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_DelegatorUnbondingDelegations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_DelegatorUnbondingDelegations_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DelegatorUnbondingDelegations_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Redelegations_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Redelegations_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Redelegations_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_DelegatorValidators_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_DelegatorValidators_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DelegatorValidators_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_DelegatorValidator_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_DelegatorValidator_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_DelegatorValidator_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_HistoricalInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_HistoricalInfo_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_HistoricalInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Pool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Pool_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Pool_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index c3defbc52ff0..c0c875fb742c 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -1265,571 +1265,569 @@ func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_ func StakingDescription() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { d := &github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet{} var gzipped = []byte{ - // 9010 bytes of a gzipped FileDescriptorSet + // 8985 bytes of a gzipped FileDescriptorSet 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x74, 0x1c, 0xd7, - 0x75, 0x18, 0x67, 0x3f, 0x80, 0xdd, 0xbb, 0xf8, 0x58, 0x3c, 0x80, 0xd0, 0x72, 0x49, 0x02, 0xd0, - 0x48, 0x96, 0x28, 0x4a, 0x5a, 0x48, 0x14, 0x45, 0x51, 0xcb, 0xd8, 0x32, 0x16, 0x58, 0x82, 0x20, - 0xf1, 0xa5, 0x01, 0x48, 0x49, 0x76, 0xd2, 0x3d, 0x83, 0xd9, 0x87, 0xc5, 0x88, 0xb3, 0x33, 0xa3, - 0x99, 0x59, 0x12, 0xa0, 0xed, 0x73, 0x94, 0xf8, 0xa3, 0xb1, 0xda, 0xd4, 0x76, 0x93, 0xd3, 0xda, - 0xae, 0xe5, 0xca, 0x76, 0x5b, 0xa7, 0x4e, 0xdb, 0x24, 0x75, 0x9a, 0x36, 0x4d, 0x4f, 0x6b, 0x37, - 0x4e, 0xe2, 0xb4, 0x4d, 0x8f, 0x74, 0xea, 0xb6, 0x69, 0x4e, 0x4b, 0xa7, 0xb2, 0x4f, 0xeb, 0xb8, - 0x6e, 0x93, 0xb2, 0xea, 0xa7, 0x7e, 0xa4, 0xe7, 0x7d, 0xcd, 0xc7, 0x7e, 0x60, 0x77, 0x21, 0x4a, - 0xb6, 0x4e, 0xf4, 0x0b, 0xfb, 0xee, 0xbb, 0xf7, 0xbe, 0x7b, 0xef, 0xbb, 0xf7, 0xbd, 0xfb, 0xee, - 0xbc, 0x19, 0xc0, 0x6f, 0x9c, 0x83, 0x99, 0x9a, 0x65, 0xd5, 0x0c, 0x3c, 0x6b, 0x3b, 0x96, 0x67, - 0x6d, 0x35, 0xb6, 0x67, 0xab, 0xd8, 0xd5, 0x1c, 0xdd, 0xf6, 0x2c, 0xa7, 0x40, 0x61, 0x68, 0x94, - 0x61, 0x14, 0x04, 0x86, 0xbc, 0x02, 0x63, 0xe7, 0x75, 0x03, 0x2f, 0xf8, 0x88, 0x1b, 0xd8, 0x43, - 0x67, 0x21, 0xb1, 0xad, 0x1b, 0x38, 0x27, 0xcd, 0xc4, 0x4f, 0x64, 0x4e, 0xdd, 0x5d, 0x68, 0x22, - 0x2a, 0x44, 0x29, 0xd6, 0x09, 0x58, 0xa1, 0x14, 0xf2, 0x77, 0x13, 0x30, 0xde, 0xa6, 0x17, 0x21, - 0x48, 0x98, 0x6a, 0x9d, 0x70, 0x94, 0x4e, 0xa4, 0x15, 0xfa, 0x1b, 0xe5, 0x60, 0xd0, 0x56, 0xb5, - 0xab, 0x6a, 0x0d, 0xe7, 0x62, 0x14, 0x2c, 0x9a, 0x68, 0x0a, 0xa0, 0x8a, 0x6d, 0x6c, 0x56, 0xb1, - 0xa9, 0xed, 0xe5, 0xe2, 0x33, 0xf1, 0x13, 0x69, 0x25, 0x04, 0x41, 0xf7, 0xc3, 0x98, 0xdd, 0xd8, - 0x32, 0x74, 0xad, 0x12, 0x42, 0x83, 0x99, 0xf8, 0x89, 0xa4, 0x92, 0x65, 0x1d, 0x0b, 0x01, 0xf2, - 0xbd, 0x30, 0x7a, 0x1d, 0xab, 0x57, 0xc3, 0xa8, 0x19, 0x8a, 0x3a, 0x42, 0xc0, 0x21, 0xc4, 0x79, - 0x18, 0xaa, 0x63, 0xd7, 0x55, 0x6b, 0xb8, 0xe2, 0xed, 0xd9, 0x38, 0x97, 0xa0, 0xda, 0xcf, 0xb4, - 0x68, 0xdf, 0xac, 0x79, 0x86, 0x53, 0x6d, 0xee, 0xd9, 0x18, 0xcd, 0x41, 0x1a, 0x9b, 0x8d, 0x3a, - 0xe3, 0x90, 0xec, 0x60, 0xbf, 0xb2, 0xd9, 0xa8, 0x37, 0x73, 0x49, 0x11, 0x32, 0xce, 0x62, 0xd0, - 0xc5, 0xce, 0x35, 0x5d, 0xc3, 0xb9, 0x01, 0xca, 0xe0, 0xde, 0x16, 0x06, 0x1b, 0xac, 0xbf, 0x99, - 0x87, 0xa0, 0x43, 0xf3, 0x90, 0xc6, 0xbb, 0x1e, 0x36, 0x5d, 0xdd, 0x32, 0x73, 0x83, 0x94, 0xc9, - 0xbb, 0xda, 0xcc, 0x22, 0x36, 0xaa, 0xcd, 0x2c, 0x02, 0x3a, 0x74, 0x06, 0x06, 0x2d, 0xdb, 0xd3, - 0x2d, 0xd3, 0xcd, 0xa5, 0x66, 0xa4, 0x13, 0x99, 0x53, 0xc7, 0xda, 0x3a, 0xc2, 0x1a, 0xc3, 0x51, - 0x04, 0x32, 0x5a, 0x82, 0xac, 0x6b, 0x35, 0x1c, 0x0d, 0x57, 0x34, 0xab, 0x8a, 0x2b, 0xba, 0xb9, - 0x6d, 0xe5, 0xd2, 0x94, 0xc1, 0x74, 0xab, 0x22, 0x14, 0x71, 0xde, 0xaa, 0xe2, 0x25, 0x73, 0xdb, - 0x52, 0x46, 0xdc, 0x48, 0x1b, 0x4d, 0xc2, 0x80, 0xbb, 0x67, 0x7a, 0xea, 0x6e, 0x6e, 0x88, 0x7a, - 0x08, 0x6f, 0xc9, 0xbf, 0x36, 0x00, 0xa3, 0xbd, 0xb8, 0xd8, 0x39, 0x48, 0x6e, 0x13, 0x2d, 0x73, - 0xb1, 0x7e, 0x6c, 0xc0, 0x68, 0xa2, 0x46, 0x1c, 0x38, 0xa0, 0x11, 0xe7, 0x20, 0x63, 0x62, 0xd7, - 0xc3, 0x55, 0xe6, 0x11, 0xf1, 0x1e, 0x7d, 0x0a, 0x18, 0x51, 0xab, 0x4b, 0x25, 0x0e, 0xe4, 0x52, - 0x4f, 0xc3, 0xa8, 0x2f, 0x52, 0xc5, 0x51, 0xcd, 0x9a, 0xf0, 0xcd, 0xd9, 0x6e, 0x92, 0x14, 0xca, - 0x82, 0x4e, 0x21, 0x64, 0xca, 0x08, 0x8e, 0xb4, 0xd1, 0x02, 0x80, 0x65, 0x62, 0x6b, 0xbb, 0x52, - 0xc5, 0x9a, 0x91, 0x4b, 0x75, 0xb0, 0xd2, 0x1a, 0x41, 0x69, 0xb1, 0x92, 0xc5, 0xa0, 0x9a, 0x81, - 0x1e, 0x0f, 0x5c, 0x6d, 0xb0, 0x83, 0xa7, 0xac, 0xb0, 0x20, 0x6b, 0xf1, 0xb6, 0xcb, 0x30, 0xe2, - 0x60, 0xe2, 0xf7, 0xb8, 0xca, 0x35, 0x4b, 0x53, 0x21, 0x0a, 0x5d, 0x35, 0x53, 0x38, 0x19, 0x53, - 0x6c, 0xd8, 0x09, 0x37, 0xd1, 0x5d, 0xe0, 0x03, 0x2a, 0xd4, 0xad, 0x80, 0xae, 0x42, 0x43, 0x02, - 0xb8, 0xaa, 0xd6, 0x71, 0xfe, 0x06, 0x8c, 0x44, 0xcd, 0x83, 0x26, 0x20, 0xe9, 0x7a, 0xaa, 0xe3, - 0x51, 0x2f, 0x4c, 0x2a, 0xac, 0x81, 0xb2, 0x10, 0xc7, 0x66, 0x95, 0xae, 0x72, 0x49, 0x85, 0xfc, - 0x44, 0xef, 0x0d, 0x14, 0x8e, 0x53, 0x85, 0xef, 0x69, 0x9d, 0xd1, 0x08, 0xe7, 0x66, 0xbd, 0xf3, - 0x8f, 0xc1, 0x70, 0x44, 0x81, 0x5e, 0x87, 0x96, 0x3f, 0x08, 0x87, 0xdb, 0xb2, 0x46, 0x4f, 0xc3, - 0x44, 0xc3, 0xd4, 0x4d, 0x0f, 0x3b, 0xb6, 0x83, 0x89, 0xc7, 0xb2, 0xa1, 0x72, 0xff, 0x79, 0xb0, - 0x83, 0xcf, 0x5d, 0x0e, 0x63, 0x33, 0x2e, 0xca, 0x78, 0xa3, 0x15, 0x78, 0x32, 0x9d, 0xfa, 0xde, - 0x60, 0xf6, 0xf9, 0xe7, 0x9f, 0x7f, 0x3e, 0x26, 0x7f, 0x7d, 0x00, 0x26, 0xda, 0xc5, 0x4c, 0xdb, - 0xf0, 0x9d, 0x84, 0x01, 0xb3, 0x51, 0xdf, 0xc2, 0x0e, 0x35, 0x52, 0x52, 0xe1, 0x2d, 0x34, 0x07, - 0x49, 0x43, 0xdd, 0xc2, 0x46, 0x2e, 0x31, 0x23, 0x9d, 0x18, 0x39, 0x75, 0x7f, 0x4f, 0x51, 0x59, - 0x58, 0x26, 0x24, 0x0a, 0xa3, 0x44, 0xef, 0x81, 0x04, 0x5f, 0xa2, 0x09, 0x87, 0x93, 0xbd, 0x71, + 0x75, 0x18, 0x67, 0x3f, 0x80, 0xdd, 0xbb, 0xf8, 0x58, 0x3c, 0x80, 0xd0, 0x72, 0x49, 0x02, 0xd4, + 0x48, 0x96, 0x28, 0x4a, 0x5a, 0x48, 0x14, 0x45, 0x51, 0x4b, 0xdb, 0x32, 0x16, 0x58, 0x82, 0x20, + 0xf1, 0xa5, 0x01, 0x40, 0xc9, 0x76, 0xd2, 0x3d, 0x83, 0xd9, 0x87, 0xc5, 0x88, 0xb3, 0x33, 0xa3, + 0x99, 0x59, 0x12, 0xa0, 0xed, 0x73, 0x94, 0xf8, 0xa3, 0xb1, 0xda, 0xd4, 0xce, 0xc7, 0x69, 0x65, + 0xc7, 0x72, 0x65, 0xbb, 0xad, 0x53, 0xa7, 0x6d, 0x92, 0x3a, 0x4d, 0x9b, 0xa6, 0xa7, 0x75, 0x5a, + 0x27, 0x71, 0xda, 0xa6, 0x47, 0x3a, 0x75, 0xdb, 0x34, 0xa7, 0xa5, 0x53, 0xd9, 0xa7, 0x75, 0x5c, + 0xb7, 0x49, 0x59, 0xf5, 0x53, 0x3f, 0x92, 0xf3, 0xbe, 0xe6, 0x63, 0x3f, 0xb0, 0xbb, 0x10, 0x25, + 0x5b, 0x27, 0xfa, 0x85, 0x7d, 0xf7, 0xdd, 0x7b, 0xdf, 0xbd, 0xf7, 0xdd, 0x7b, 0xdf, 0x7d, 0x6f, + 0xde, 0x0c, 0xe0, 0xe7, 0xce, 0xc3, 0x89, 0x9a, 0x65, 0xd5, 0x0c, 0x3c, 0x63, 0x3b, 0x96, 0x67, + 0x6d, 0x35, 0xb6, 0x67, 0xaa, 0xd8, 0xd5, 0x1c, 0xdd, 0xf6, 0x2c, 0xa7, 0x40, 0x61, 0x68, 0x94, + 0x61, 0x14, 0x04, 0x86, 0xbc, 0x0c, 0x63, 0x17, 0x74, 0x03, 0xcf, 0xfb, 0x88, 0xeb, 0xd8, 0x43, + 0xe7, 0x20, 0xb1, 0xad, 0x1b, 0x38, 0x27, 0x9d, 0x88, 0x9f, 0xcc, 0x9c, 0xbe, 0xbb, 0xd0, 0x44, + 0x54, 0x88, 0x52, 0xac, 0x11, 0xb0, 0x42, 0x29, 0xe4, 0xef, 0x24, 0x60, 0xbc, 0x4d, 0x2f, 0x42, + 0x90, 0x30, 0xd5, 0x3a, 0xe1, 0x28, 0x9d, 0x4c, 0x2b, 0xf4, 0x37, 0xca, 0xc1, 0xa0, 0xad, 0x6a, + 0x57, 0xd5, 0x1a, 0xce, 0xc5, 0x28, 0x58, 0x34, 0xd1, 0x14, 0x40, 0x15, 0xdb, 0xd8, 0xac, 0x62, + 0x53, 0xdb, 0xcb, 0xc5, 0x4f, 0xc4, 0x4f, 0xa6, 0x95, 0x10, 0x04, 0xdd, 0x0f, 0x63, 0x76, 0x63, + 0xcb, 0xd0, 0xb5, 0x4a, 0x08, 0x0d, 0x4e, 0xc4, 0x4f, 0x26, 0x95, 0x2c, 0xeb, 0x98, 0x0f, 0x90, + 0xef, 0x85, 0xd1, 0xeb, 0x58, 0xbd, 0x1a, 0x46, 0xcd, 0x50, 0xd4, 0x11, 0x02, 0x0e, 0x21, 0xce, + 0xc1, 0x50, 0x1d, 0xbb, 0xae, 0x5a, 0xc3, 0x15, 0x6f, 0xcf, 0xc6, 0xb9, 0x04, 0xd5, 0xfe, 0x44, + 0x8b, 0xf6, 0xcd, 0x9a, 0x67, 0x38, 0xd5, 0xc6, 0x9e, 0x8d, 0xd1, 0x2c, 0xa4, 0xb1, 0xd9, 0xa8, + 0x33, 0x0e, 0xc9, 0x0e, 0xf6, 0x2b, 0x9b, 0x8d, 0x7a, 0x33, 0x97, 0x14, 0x21, 0xe3, 0x2c, 0x06, + 0x5d, 0xec, 0x5c, 0xd3, 0x35, 0x9c, 0x1b, 0xa0, 0x0c, 0xee, 0x6d, 0x61, 0xb0, 0xce, 0xfa, 0x9b, + 0x79, 0x08, 0x3a, 0x34, 0x07, 0x69, 0xbc, 0xeb, 0x61, 0xd3, 0xd5, 0x2d, 0x33, 0x37, 0x48, 0x99, + 0xbc, 0xab, 0xcd, 0x2c, 0x62, 0xa3, 0xda, 0xcc, 0x22, 0xa0, 0x43, 0x67, 0x61, 0xd0, 0xb2, 0x3d, + 0xdd, 0x32, 0xdd, 0x5c, 0xea, 0x84, 0x74, 0x32, 0x73, 0xfa, 0x58, 0x5b, 0x47, 0x58, 0x65, 0x38, + 0x8a, 0x40, 0x46, 0x8b, 0x90, 0x75, 0xad, 0x86, 0xa3, 0xe1, 0x8a, 0x66, 0x55, 0x71, 0x45, 0x37, + 0xb7, 0xad, 0x5c, 0x9a, 0x32, 0x98, 0x6e, 0x55, 0x84, 0x22, 0xce, 0x59, 0x55, 0xbc, 0x68, 0x6e, + 0x5b, 0xca, 0x88, 0x1b, 0x69, 0xa3, 0x49, 0x18, 0x70, 0xf7, 0x4c, 0x4f, 0xdd, 0xcd, 0x0d, 0x51, + 0x0f, 0xe1, 0x2d, 0xf9, 0xd7, 0x06, 0x60, 0xb4, 0x17, 0x17, 0x3b, 0x0f, 0xc9, 0x6d, 0xa2, 0x65, + 0x2e, 0xd6, 0x8f, 0x0d, 0x18, 0x4d, 0xd4, 0x88, 0x03, 0x07, 0x34, 0xe2, 0x2c, 0x64, 0x4c, 0xec, + 0x7a, 0xb8, 0xca, 0x3c, 0x22, 0xde, 0xa3, 0x4f, 0x01, 0x23, 0x6a, 0x75, 0xa9, 0xc4, 0x81, 0x5c, + 0xea, 0x69, 0x18, 0xf5, 0x45, 0xaa, 0x38, 0xaa, 0x59, 0x13, 0xbe, 0x39, 0xd3, 0x4d, 0x92, 0x42, + 0x59, 0xd0, 0x29, 0x84, 0x4c, 0x19, 0xc1, 0x91, 0x36, 0x9a, 0x07, 0xb0, 0x4c, 0x6c, 0x6d, 0x57, + 0xaa, 0x58, 0x33, 0x72, 0xa9, 0x0e, 0x56, 0x5a, 0x25, 0x28, 0x2d, 0x56, 0xb2, 0x18, 0x54, 0x33, + 0xd0, 0xe3, 0x81, 0xab, 0x0d, 0x76, 0xf0, 0x94, 0x65, 0x16, 0x64, 0x2d, 0xde, 0xb6, 0x09, 0x23, + 0x0e, 0x26, 0x7e, 0x8f, 0xab, 0x5c, 0xb3, 0x34, 0x15, 0xa2, 0xd0, 0x55, 0x33, 0x85, 0x93, 0x31, + 0xc5, 0x86, 0x9d, 0x70, 0x13, 0xdd, 0x05, 0x3e, 0xa0, 0x42, 0xdd, 0x0a, 0x68, 0x16, 0x1a, 0x12, + 0xc0, 0x15, 0xb5, 0x8e, 0xf3, 0x37, 0x60, 0x24, 0x6a, 0x1e, 0x34, 0x01, 0x49, 0xd7, 0x53, 0x1d, + 0x8f, 0x7a, 0x61, 0x52, 0x61, 0x0d, 0x94, 0x85, 0x38, 0x36, 0xab, 0x34, 0xcb, 0x25, 0x15, 0xf2, + 0x13, 0xbd, 0x2f, 0x50, 0x38, 0x4e, 0x15, 0xbe, 0xa7, 0x75, 0x46, 0x23, 0x9c, 0x9b, 0xf5, 0xce, + 0x3f, 0x06, 0xc3, 0x11, 0x05, 0x7a, 0x1d, 0x5a, 0xfe, 0x30, 0x1c, 0x6e, 0xcb, 0x1a, 0x3d, 0x0d, + 0x13, 0x0d, 0x53, 0x37, 0x3d, 0xec, 0xd8, 0x0e, 0x26, 0x1e, 0xcb, 0x86, 0xca, 0xfd, 0x97, 0xc1, + 0x0e, 0x3e, 0xb7, 0x19, 0xc6, 0x66, 0x5c, 0x94, 0xf1, 0x46, 0x2b, 0xf0, 0x54, 0x3a, 0xf5, 0xdd, + 0xc1, 0xec, 0x73, 0xcf, 0x3d, 0xf7, 0x5c, 0x4c, 0x7e, 0x61, 0x00, 0x26, 0xda, 0xc5, 0x4c, 0xdb, + 0xf0, 0x9d, 0x84, 0x01, 0xb3, 0x51, 0xdf, 0xc2, 0x0e, 0x35, 0x52, 0x52, 0xe1, 0x2d, 0x34, 0x0b, + 0x49, 0x43, 0xdd, 0xc2, 0x46, 0x2e, 0x71, 0x42, 0x3a, 0x39, 0x72, 0xfa, 0xfe, 0x9e, 0xa2, 0xb2, + 0xb0, 0x44, 0x48, 0x14, 0x46, 0x89, 0xde, 0x0b, 0x09, 0x9e, 0xa2, 0x09, 0x87, 0x53, 0xbd, 0x71, 0x20, 0xb1, 0xa4, 0x50, 0x3a, 0x74, 0x14, 0xd2, 0xe4, 0x2f, 0xf3, 0x8d, 0x01, 0x2a, 0x73, 0x8a, - 0x00, 0x88, 0x5f, 0xa0, 0x3c, 0xa4, 0x68, 0x98, 0x54, 0xb1, 0xd8, 0xda, 0xfc, 0x36, 0x71, 0xac, + 0x00, 0x88, 0x5f, 0xa0, 0x3c, 0xa4, 0x68, 0x98, 0x54, 0xb1, 0x58, 0xda, 0xfc, 0x36, 0x71, 0xac, 0x2a, 0xde, 0x56, 0x1b, 0x86, 0x57, 0xb9, 0xa6, 0x1a, 0x0d, 0x4c, 0x1d, 0x3e, 0xad, 0x0c, 0x71, - 0xe0, 0x15, 0x02, 0x43, 0xd3, 0x90, 0x61, 0x51, 0xa5, 0x9b, 0x55, 0xbc, 0x4b, 0x57, 0xcf, 0xa4, - 0xc2, 0x02, 0x6d, 0x89, 0x40, 0xc8, 0xf0, 0xcf, 0xba, 0x96, 0x29, 0x5c, 0x93, 0x0e, 0x41, 0x00, - 0x74, 0xf8, 0xc7, 0x9a, 0x17, 0xee, 0xe3, 0xed, 0xd5, 0x6b, 0x89, 0xa5, 0x7b, 0x61, 0x94, 0x62, - 0x3c, 0xc2, 0xa7, 0x5e, 0x35, 0x72, 0x63, 0x33, 0xd2, 0x89, 0x94, 0x32, 0xc2, 0xc0, 0x6b, 0x1c, - 0x2a, 0xff, 0x6a, 0x0c, 0x12, 0x74, 0x61, 0x19, 0x85, 0xcc, 0xe6, 0x33, 0xeb, 0xe5, 0xca, 0xc2, - 0xda, 0xe5, 0xd2, 0x72, 0x39, 0x2b, 0xa1, 0x11, 0x00, 0x0a, 0x38, 0xbf, 0xbc, 0x36, 0xb7, 0x99, - 0x8d, 0xf9, 0xed, 0xa5, 0xd5, 0xcd, 0x33, 0xa7, 0xb3, 0x71, 0x9f, 0xe0, 0x32, 0x03, 0x24, 0xc2, - 0x08, 0x8f, 0x9c, 0xca, 0x26, 0x51, 0x16, 0x86, 0x18, 0x83, 0xa5, 0xa7, 0xcb, 0x0b, 0x67, 0x4e, - 0x67, 0x07, 0xa2, 0x90, 0x47, 0x4e, 0x65, 0x07, 0xd1, 0x30, 0xa4, 0x29, 0xa4, 0xb4, 0xb6, 0xb6, - 0x9c, 0x4d, 0xf9, 0x3c, 0x37, 0x36, 0x95, 0xa5, 0xd5, 0xc5, 0x6c, 0xda, 0xe7, 0xb9, 0xa8, 0xac, - 0x5d, 0x5e, 0xcf, 0x82, 0xcf, 0x61, 0xa5, 0xbc, 0xb1, 0x31, 0xb7, 0x58, 0xce, 0x66, 0x7c, 0x8c, - 0xd2, 0x33, 0x9b, 0xe5, 0x8d, 0xec, 0x50, 0x44, 0xac, 0x47, 0x4e, 0x65, 0x87, 0xfd, 0x21, 0xca, - 0xab, 0x97, 0x57, 0xb2, 0x23, 0x68, 0x0c, 0x86, 0xd9, 0x10, 0x42, 0x88, 0xd1, 0x26, 0xd0, 0x99, - 0xd3, 0xd9, 0x6c, 0x20, 0x08, 0xe3, 0x32, 0x16, 0x01, 0x9c, 0x39, 0x9d, 0x45, 0xf2, 0x3c, 0x24, - 0xa9, 0x1b, 0x22, 0x04, 0x23, 0xcb, 0x73, 0xa5, 0xf2, 0x72, 0x65, 0x6d, 0x7d, 0x73, 0x69, 0x6d, - 0x75, 0x6e, 0x39, 0x2b, 0x05, 0x30, 0xa5, 0xfc, 0xe4, 0xe5, 0x25, 0xa5, 0xbc, 0x90, 0x8d, 0x85, - 0x61, 0xeb, 0xe5, 0xb9, 0xcd, 0xf2, 0x42, 0x36, 0x2e, 0x6b, 0x30, 0xd1, 0x6e, 0x41, 0x6d, 0x1b, - 0x42, 0x21, 0x5f, 0x88, 0x75, 0xf0, 0x05, 0xca, 0xab, 0xd9, 0x17, 0xe4, 0xef, 0xc4, 0x60, 0xbc, - 0xcd, 0xa6, 0xd2, 0x76, 0x90, 0x27, 0x20, 0xc9, 0x7c, 0x99, 0x6d, 0xb3, 0xf7, 0xb5, 0xdd, 0x9d, - 0xa8, 0x67, 0xb7, 0x6c, 0xb5, 0x94, 0x2e, 0x9c, 0x6a, 0xc4, 0x3b, 0xa4, 0x1a, 0x84, 0x45, 0x8b, - 0xc3, 0xfe, 0x44, 0xcb, 0xe2, 0xcf, 0xf6, 0xc7, 0x33, 0xbd, 0xec, 0x8f, 0x14, 0xd6, 0xdf, 0x26, - 0x90, 0x6c, 0xb3, 0x09, 0x9c, 0x83, 0xb1, 0x16, 0x46, 0x3d, 0x2f, 0xc6, 0x1f, 0x96, 0x20, 0xd7, - 0xc9, 0x38, 0x5d, 0x96, 0xc4, 0x58, 0x64, 0x49, 0x3c, 0xd7, 0x6c, 0xc1, 0x3b, 0x3b, 0x4f, 0x42, - 0xcb, 0x5c, 0x7f, 0x59, 0x82, 0xc9, 0xf6, 0x29, 0x65, 0x5b, 0x19, 0xde, 0x03, 0x03, 0x75, 0xec, - 0xed, 0x58, 0x22, 0xad, 0xba, 0xa7, 0xcd, 0x66, 0x4d, 0xba, 0x9b, 0x27, 0x9b, 0x53, 0x85, 0x77, - 0xfb, 0x78, 0xa7, 0xbc, 0x90, 0x49, 0xd3, 0x22, 0xe9, 0xc7, 0x63, 0x70, 0xb8, 0x2d, 0xf3, 0xb6, - 0x82, 0x1e, 0x07, 0xd0, 0x4d, 0xbb, 0xe1, 0xb1, 0xd4, 0x89, 0xad, 0xc4, 0x69, 0x0a, 0xa1, 0x8b, - 0x17, 0x59, 0x65, 0x1b, 0x9e, 0xdf, 0x1f, 0xa7, 0xfd, 0xc0, 0x40, 0x14, 0xe1, 0x6c, 0x20, 0x68, - 0x82, 0x0a, 0x3a, 0xd5, 0x41, 0xd3, 0x16, 0xc7, 0x7c, 0x08, 0xb2, 0x9a, 0xa1, 0x63, 0xd3, 0xab, - 0xb8, 0x9e, 0x83, 0xd5, 0xba, 0x6e, 0xd6, 0xe8, 0x56, 0x93, 0x2a, 0x26, 0xb7, 0x55, 0xc3, 0xc5, - 0xca, 0x28, 0xeb, 0xde, 0x10, 0xbd, 0x84, 0x82, 0x3a, 0x90, 0x13, 0xa2, 0x18, 0x88, 0x50, 0xb0, - 0x6e, 0x9f, 0x42, 0xfe, 0x54, 0x1a, 0x32, 0xa1, 0x04, 0x1c, 0xdd, 0x09, 0x43, 0xcf, 0xaa, 0xd7, - 0xd4, 0x8a, 0x38, 0x54, 0x31, 0x4b, 0x64, 0x08, 0x6c, 0x9d, 0x1f, 0xac, 0x1e, 0x82, 0x09, 0x8a, - 0x62, 0x35, 0x3c, 0xec, 0x54, 0x34, 0x43, 0x75, 0x5d, 0x6a, 0xb4, 0x14, 0x45, 0x45, 0xa4, 0x6f, - 0x8d, 0x74, 0xcd, 0x8b, 0x1e, 0xf4, 0x28, 0x8c, 0x53, 0x8a, 0x7a, 0xc3, 0xf0, 0x74, 0xdb, 0xc0, - 0x15, 0x72, 0xcc, 0x73, 0xe9, 0x96, 0xe3, 0x4b, 0x36, 0x46, 0x30, 0x56, 0x38, 0x02, 0x91, 0xc8, - 0x45, 0x0b, 0x70, 0x9c, 0x92, 0xd5, 0xb0, 0x89, 0x1d, 0xd5, 0xc3, 0x15, 0xfc, 0x5c, 0x43, 0x35, - 0xdc, 0x8a, 0x6a, 0x56, 0x2b, 0x3b, 0xaa, 0xbb, 0x93, 0x9b, 0x20, 0x0c, 0x4a, 0xb1, 0x9c, 0xa4, - 0x1c, 0x21, 0x88, 0x8b, 0x1c, 0xaf, 0x4c, 0xd1, 0xe6, 0xcc, 0xea, 0x05, 0xd5, 0xdd, 0x41, 0x45, - 0x98, 0xa4, 0x5c, 0x5c, 0xcf, 0xd1, 0xcd, 0x5a, 0x45, 0xdb, 0xc1, 0xda, 0xd5, 0x4a, 0xc3, 0xdb, - 0x3e, 0x9b, 0x3b, 0x1a, 0x1e, 0x9f, 0x4a, 0xb8, 0x41, 0x71, 0xe6, 0x09, 0xca, 0x65, 0x6f, 0xfb, - 0x2c, 0xda, 0x80, 0x21, 0x32, 0x19, 0x75, 0xfd, 0x06, 0xae, 0x6c, 0x5b, 0x0e, 0xdd, 0x43, 0x47, - 0xda, 0x2c, 0x4d, 0x21, 0x0b, 0x16, 0xd6, 0x38, 0xc1, 0x8a, 0x55, 0xc5, 0xc5, 0xe4, 0xc6, 0x7a, - 0xb9, 0xbc, 0xa0, 0x64, 0x04, 0x97, 0xf3, 0x96, 0x43, 0x1c, 0xaa, 0x66, 0xf9, 0x06, 0xce, 0x30, - 0x87, 0xaa, 0x59, 0xc2, 0xbc, 0x8f, 0xc2, 0xb8, 0xa6, 0x31, 0x9d, 0x75, 0xad, 0xc2, 0x0f, 0x63, - 0x6e, 0x2e, 0x1b, 0x31, 0x96, 0xa6, 0x2d, 0x32, 0x04, 0xee, 0xe3, 0x2e, 0x7a, 0x1c, 0x0e, 0x07, - 0xc6, 0x0a, 0x13, 0x8e, 0xb5, 0x68, 0xd9, 0x4c, 0xfa, 0x28, 0x8c, 0xdb, 0x7b, 0xad, 0x84, 0x28, - 0x32, 0xa2, 0xbd, 0xd7, 0x4c, 0xf6, 0x18, 0x4c, 0xd8, 0x3b, 0x76, 0x2b, 0xdd, 0xc9, 0x30, 0x1d, - 0xb2, 0x77, 0xec, 0x66, 0xc2, 0x77, 0xd1, 0x93, 0xb9, 0x83, 0x35, 0xd5, 0xc3, 0xd5, 0xdc, 0x1d, - 0x61, 0xf4, 0x50, 0x07, 0x2a, 0x40, 0x56, 0xd3, 0x2a, 0xd8, 0x54, 0xb7, 0x0c, 0x5c, 0x51, 0x1d, - 0x6c, 0xaa, 0x6e, 0x6e, 0x9a, 0x22, 0x27, 0x3c, 0xa7, 0x81, 0x95, 0x11, 0x4d, 0x2b, 0xd3, 0xce, - 0x39, 0xda, 0x87, 0x4e, 0xc2, 0x98, 0xb5, 0xf5, 0xac, 0xc6, 0x3c, 0xb2, 0x62, 0x3b, 0x78, 0x5b, - 0xdf, 0xcd, 0xdd, 0x4d, 0xcd, 0x3b, 0x4a, 0x3a, 0xa8, 0x3f, 0xae, 0x53, 0x30, 0xba, 0x0f, 0xb2, - 0x9a, 0xbb, 0xa3, 0x3a, 0x36, 0x5d, 0x92, 0x5d, 0x5b, 0xd5, 0x70, 0xee, 0x5d, 0x0c, 0x95, 0xc1, - 0x57, 0x05, 0x98, 0x44, 0x84, 0x7b, 0x5d, 0xdf, 0xf6, 0x04, 0xc7, 0x7b, 0x59, 0x44, 0x50, 0x18, - 0xe7, 0x76, 0x02, 0xb2, 0xc4, 0x12, 0x91, 0x81, 0x4f, 0x50, 0xb4, 0x11, 0x7b, 0xc7, 0x0e, 0x8f, - 0x7b, 0x17, 0x0c, 0x13, 0xcc, 0x60, 0xd0, 0xfb, 0x58, 0xe2, 0x66, 0xef, 0x84, 0x46, 0x3c, 0x0d, - 0x93, 0x04, 0xa9, 0x8e, 0x3d, 0xb5, 0xaa, 0x7a, 0x6a, 0x08, 0xfb, 0x01, 0x8a, 0x4d, 0xcc, 0xbe, - 0xc2, 0x3b, 0x23, 0x72, 0x3a, 0x8d, 0xad, 0x3d, 0xdf, 0xb1, 0x1e, 0x64, 0x72, 0x12, 0x98, 0x70, - 0xad, 0x37, 0x2d, 0x39, 0x97, 0x8b, 0x30, 0x14, 0xf6, 0x7b, 0x94, 0x06, 0xe6, 0xf9, 0x59, 0x89, - 0x24, 0x41, 0xf3, 0x6b, 0x0b, 0x24, 0x7d, 0x79, 0x5f, 0x39, 0x1b, 0x23, 0x69, 0xd4, 0xf2, 0xd2, - 0x66, 0xb9, 0xa2, 0x5c, 0x5e, 0xdd, 0x5c, 0x5a, 0x29, 0x67, 0xe3, 0xa1, 0xc4, 0xfe, 0x62, 0x22, - 0x75, 0x4f, 0xf6, 0x5e, 0xf9, 0x95, 0x18, 0x8c, 0x44, 0x4f, 0x6a, 0xe8, 0xc7, 0xe0, 0x0e, 0x51, - 0x56, 0x71, 0xb1, 0x57, 0xb9, 0xae, 0x3b, 0x34, 0x20, 0xeb, 0x2a, 0xdb, 0x1c, 0x7d, 0xff, 0x99, - 0xe0, 0x58, 0x1b, 0xd8, 0x7b, 0x4a, 0x77, 0x48, 0xb8, 0xd5, 0x55, 0x0f, 0x2d, 0xc3, 0xb4, 0x69, - 0x55, 0x5c, 0x4f, 0x35, 0xab, 0xaa, 0x53, 0xad, 0x04, 0x05, 0xad, 0x8a, 0xaa, 0x69, 0xd8, 0x75, - 0x2d, 0xb6, 0x11, 0xfa, 0x5c, 0x8e, 0x99, 0xd6, 0x06, 0x47, 0x0e, 0x76, 0x88, 0x39, 0x8e, 0xda, - 0xe4, 0xbe, 0xf1, 0x4e, 0xee, 0x7b, 0x14, 0xd2, 0x75, 0xd5, 0xae, 0x60, 0xd3, 0x73, 0xf6, 0x68, - 0x7e, 0x9e, 0x52, 0x52, 0x75, 0xd5, 0x2e, 0x93, 0xf6, 0x5b, 0x72, 0x4c, 0xba, 0x98, 0x48, 0xa5, - 0xb2, 0xe9, 0x8b, 0x89, 0x54, 0x3a, 0x0b, 0xf2, 0xab, 0x71, 0x18, 0x0a, 0xe7, 0xeb, 0xe4, 0xf8, - 0xa3, 0xd1, 0x1d, 0x4b, 0xa2, 0x6b, 0xda, 0x5d, 0xfb, 0x66, 0xf7, 0x85, 0x79, 0xb2, 0x95, 0x15, - 0x07, 0x58, 0x72, 0xac, 0x30, 0x4a, 0x92, 0x46, 0x10, 0x67, 0xc3, 0x2c, 0x19, 0x49, 0x29, 0xbc, - 0x85, 0x16, 0x61, 0xe0, 0x59, 0x97, 0xf2, 0x1e, 0xa0, 0xbc, 0xef, 0xde, 0x9f, 0xf7, 0xc5, 0x0d, - 0xca, 0x3c, 0x7d, 0x71, 0xa3, 0xb2, 0xba, 0xa6, 0xac, 0xcc, 0x2d, 0x2b, 0x9c, 0x1c, 0x1d, 0x81, - 0x84, 0xa1, 0xde, 0xd8, 0x8b, 0x6e, 0x7a, 0x14, 0xd4, 0xeb, 0x24, 0x1c, 0x81, 0xc4, 0x75, 0xac, - 0x5e, 0x8d, 0x6e, 0x35, 0x14, 0xf4, 0x26, 0x06, 0xc3, 0x2c, 0x24, 0xa9, 0xbd, 0x10, 0x00, 0xb7, - 0x58, 0xf6, 0x10, 0x4a, 0x41, 0x62, 0x7e, 0x4d, 0x21, 0x01, 0x91, 0x85, 0x21, 0x06, 0xad, 0xac, - 0x2f, 0x95, 0xe7, 0xcb, 0xd9, 0x98, 0xfc, 0x28, 0x0c, 0x30, 0x23, 0x90, 0x60, 0xf1, 0xcd, 0x90, - 0x3d, 0xc4, 0x9b, 0x9c, 0x87, 0x24, 0x7a, 0x2f, 0xaf, 0x94, 0xca, 0x4a, 0x36, 0x16, 0x9d, 0xea, - 0x44, 0x36, 0x29, 0xbb, 0x30, 0x14, 0xce, 0xc3, 0xdf, 0x9a, 0xc3, 0xf8, 0xd7, 0x24, 0xc8, 0x84, - 0xf2, 0x6a, 0x92, 0x10, 0xa9, 0x86, 0x61, 0x5d, 0xaf, 0xa8, 0x86, 0xae, 0xba, 0xdc, 0x35, 0x80, - 0x82, 0xe6, 0x08, 0xa4, 0xd7, 0xa9, 0x7b, 0x8b, 0x42, 0x24, 0x99, 0x1d, 0x90, 0x3f, 0x2f, 0x41, - 0xb6, 0x39, 0xb1, 0x6d, 0x12, 0x53, 0xfa, 0x61, 0x8a, 0x29, 0x7f, 0x4e, 0x82, 0x91, 0x68, 0x36, - 0xdb, 0x24, 0xde, 0x9d, 0x3f, 0x54, 0xf1, 0xfe, 0x20, 0x06, 0xc3, 0x91, 0x1c, 0xb6, 0x57, 0xe9, - 0x9e, 0x83, 0x31, 0xbd, 0x8a, 0xeb, 0xb6, 0xe5, 0x61, 0x53, 0xdb, 0xab, 0x18, 0xf8, 0x1a, 0x36, - 0x72, 0x32, 0x5d, 0x34, 0x66, 0xf7, 0xcf, 0x92, 0x0b, 0x4b, 0x01, 0xdd, 0x32, 0x21, 0x2b, 0x8e, - 0x2f, 0x2d, 0x94, 0x57, 0xd6, 0xd7, 0x36, 0xcb, 0xab, 0xf3, 0xcf, 0x54, 0x2e, 0xaf, 0x5e, 0x5a, - 0x5d, 0x7b, 0x6a, 0x55, 0xc9, 0xea, 0x4d, 0x68, 0x6f, 0x62, 0xd8, 0xaf, 0x43, 0xb6, 0x59, 0x28, - 0x74, 0x07, 0xb4, 0x13, 0x2b, 0x7b, 0x08, 0x8d, 0xc3, 0xe8, 0xea, 0x5a, 0x65, 0x63, 0x69, 0xa1, - 0x5c, 0x29, 0x9f, 0x3f, 0x5f, 0x9e, 0xdf, 0xdc, 0x60, 0x75, 0x0f, 0x1f, 0x7b, 0x33, 0x12, 0xe0, - 0xf2, 0x67, 0xe3, 0x30, 0xde, 0x46, 0x12, 0x34, 0xc7, 0x4f, 0x2c, 0xec, 0x10, 0xf5, 0x60, 0x2f, - 0xd2, 0x17, 0x48, 0xce, 0xb0, 0xae, 0x3a, 0x1e, 0x3f, 0xe0, 0xdc, 0x07, 0xc4, 0x4a, 0xa6, 0xa7, - 0x6f, 0xeb, 0xd8, 0xe1, 0xf5, 0x24, 0x76, 0x8c, 0x19, 0x0d, 0xe0, 0xac, 0xa4, 0xf4, 0x00, 0x20, - 0xdb, 0x72, 0x75, 0x4f, 0xbf, 0x86, 0x2b, 0xba, 0x29, 0x8a, 0x4f, 0xe4, 0x58, 0x93, 0x50, 0xb2, - 0xa2, 0x67, 0xc9, 0xf4, 0x7c, 0x6c, 0x13, 0xd7, 0xd4, 0x26, 0x6c, 0xb2, 0x98, 0xc7, 0x95, 0xac, - 0xe8, 0xf1, 0xb1, 0xef, 0x84, 0xa1, 0xaa, 0xd5, 0x20, 0xb9, 0x1e, 0xc3, 0x23, 0x7b, 0x87, 0xa4, - 0x64, 0x18, 0xcc, 0x47, 0xe1, 0x59, 0x7c, 0x50, 0xf5, 0x1a, 0x52, 0x32, 0x0c, 0xc6, 0x50, 0xee, - 0x85, 0x51, 0xb5, 0x56, 0x73, 0x08, 0x73, 0xc1, 0x88, 0x9d, 0x4b, 0x46, 0x7c, 0x30, 0x45, 0xcc, - 0x5f, 0x84, 0x94, 0xb0, 0x03, 0xd9, 0xaa, 0x89, 0x25, 0x2a, 0x36, 0x3b, 0x6c, 0xc7, 0x4e, 0xa4, - 0x95, 0x94, 0x29, 0x3a, 0xef, 0x84, 0x21, 0xdd, 0xad, 0x04, 0x45, 0xfc, 0xd8, 0x4c, 0xec, 0x44, - 0x4a, 0xc9, 0xe8, 0xae, 0x5f, 0x00, 0x95, 0xbf, 0x1c, 0x83, 0x91, 0xe8, 0x43, 0x08, 0xb4, 0x00, - 0x29, 0xc3, 0xd2, 0x54, 0xea, 0x5a, 0xec, 0x09, 0xd8, 0x89, 0x2e, 0xcf, 0x2d, 0x0a, 0xcb, 0x1c, - 0x5f, 0xf1, 0x29, 0xf3, 0xff, 0x52, 0x82, 0x94, 0x00, 0xa3, 0x49, 0x48, 0xd8, 0xaa, 0xb7, 0x43, - 0xd9, 0x25, 0x4b, 0xb1, 0xac, 0xa4, 0xd0, 0x36, 0x81, 0xbb, 0xb6, 0x6a, 0x52, 0x17, 0xe0, 0x70, - 0xd2, 0x26, 0xf3, 0x6a, 0x60, 0xb5, 0x4a, 0x0f, 0x3d, 0x56, 0xbd, 0x8e, 0x4d, 0xcf, 0x15, 0xf3, - 0xca, 0xe1, 0xf3, 0x1c, 0x8c, 0xee, 0x87, 0x31, 0xcf, 0x51, 0x75, 0x23, 0x82, 0x9b, 0xa0, 0xb8, - 0x59, 0xd1, 0xe1, 0x23, 0x17, 0xe1, 0x88, 0xe0, 0x5b, 0xc5, 0x9e, 0xaa, 0xed, 0xe0, 0x6a, 0x40, - 0x34, 0x40, 0x8b, 0x1b, 0x77, 0x70, 0x84, 0x05, 0xde, 0x2f, 0x68, 0xe5, 0x57, 0x24, 0x18, 0x13, - 0xc7, 0xb4, 0xaa, 0x6f, 0xac, 0x15, 0x00, 0xd5, 0x34, 0x2d, 0x2f, 0x6c, 0xae, 0x56, 0x57, 0x6e, - 0xa1, 0x2b, 0xcc, 0xf9, 0x44, 0x4a, 0x88, 0x41, 0xbe, 0x0e, 0x10, 0xf4, 0x74, 0x34, 0xdb, 0x34, - 0x64, 0xf8, 0x13, 0x26, 0xfa, 0x98, 0x92, 0x1d, 0xec, 0x81, 0x81, 0xc8, 0x79, 0x0e, 0x4d, 0x40, - 0x72, 0x0b, 0xd7, 0x74, 0x93, 0xd7, 0x8d, 0x59, 0x43, 0x94, 0x5f, 0x12, 0x7e, 0xf9, 0xa5, 0xf4, - 0x09, 0x09, 0xc6, 0x35, 0xab, 0xde, 0x2c, 0x6f, 0x29, 0xdb, 0x54, 0x5d, 0x70, 0x2f, 0x48, 0xef, - 0x7b, 0x4f, 0x4d, 0xf7, 0x76, 0x1a, 0x5b, 0x05, 0xcd, 0xaa, 0xcf, 0xd6, 0x2c, 0x43, 0x35, 0x6b, - 0xc1, 0x73, 0x56, 0xfa, 0x43, 0x7b, 0xb0, 0x86, 0xcd, 0x07, 0x6b, 0x56, 0xe8, 0xa9, 0xeb, 0xb9, - 0xe0, 0xe7, 0xff, 0x91, 0xa4, 0x2f, 0xc6, 0xe2, 0x8b, 0xeb, 0xa5, 0xaf, 0xc4, 0xf2, 0x8b, 0x6c, - 0xb8, 0x75, 0x61, 0x1e, 0x05, 0x6f, 0x1b, 0x58, 0x23, 0x2a, 0xc3, 0xf7, 0xef, 0x87, 0x89, 0x9a, - 0x55, 0xb3, 0x28, 0xc7, 0x59, 0xf2, 0x8b, 0x3f, 0xb9, 0x4d, 0xfb, 0xd0, 0x7c, 0xd7, 0xc7, 0xbc, - 0xc5, 0x55, 0x18, 0xe7, 0xc8, 0x15, 0xfa, 0xe8, 0x88, 0x1d, 0x6c, 0xd0, 0xbe, 0x55, 0xb5, 0xdc, - 0x2f, 0x7f, 0x97, 0x6e, 0xe8, 0xca, 0x18, 0x27, 0x25, 0x7d, 0xec, 0xec, 0x53, 0x54, 0xe0, 0x70, - 0x84, 0x1f, 0x0b, 0x5b, 0xec, 0x74, 0xe1, 0xf8, 0x9b, 0x9c, 0xe3, 0x78, 0x88, 0xe3, 0x06, 0x27, - 0x2d, 0xce, 0xc3, 0x70, 0x3f, 0xbc, 0x7e, 0x8b, 0xf3, 0x1a, 0xc2, 0x61, 0x26, 0x8b, 0x30, 0x4a, - 0x99, 0x68, 0x0d, 0xd7, 0xb3, 0xea, 0x74, 0x4d, 0xdc, 0x9f, 0xcd, 0x6f, 0x7f, 0x97, 0xc5, 0xd1, - 0x08, 0x21, 0x9b, 0xf7, 0xa9, 0x8a, 0x45, 0xa0, 0x4f, 0xcb, 0xaa, 0x58, 0x33, 0xba, 0x70, 0xf8, - 0x26, 0x17, 0xc4, 0xc7, 0x2f, 0x5e, 0x81, 0x09, 0xf2, 0x9b, 0x2e, 0x59, 0x61, 0x49, 0xba, 0x97, - 0xe0, 0x72, 0xaf, 0x7c, 0x98, 0x85, 0xea, 0xb8, 0xcf, 0x20, 0x24, 0x53, 0x68, 0x16, 0x6b, 0xd8, - 0xf3, 0xb0, 0xe3, 0x56, 0x54, 0xa3, 0x9d, 0x78, 0xa1, 0x1a, 0x46, 0xee, 0x33, 0x3f, 0x88, 0xce, - 0xe2, 0x22, 0xa3, 0x9c, 0x33, 0x8c, 0xe2, 0x65, 0xb8, 0xa3, 0x8d, 0x57, 0xf4, 0xc0, 0xf3, 0xb3, - 0x9c, 0xe7, 0x44, 0x8b, 0x67, 0x10, 0xb6, 0xeb, 0x20, 0xe0, 0xfe, 0x5c, 0xf6, 0xc0, 0xf3, 0xaf, - 0x70, 0x9e, 0x88, 0xd3, 0x8a, 0x29, 0x25, 0x1c, 0x2f, 0xc2, 0xd8, 0x35, 0xec, 0x6c, 0x59, 0x2e, - 0xaf, 0x1b, 0xf5, 0xc0, 0xee, 0x73, 0x9c, 0xdd, 0x28, 0x27, 0xa4, 0x85, 0x24, 0xc2, 0xeb, 0x71, - 0x48, 0x6d, 0xab, 0x1a, 0xee, 0x81, 0xc5, 0x8b, 0x9c, 0xc5, 0x20, 0xc1, 0x27, 0xa4, 0x73, 0x30, - 0x54, 0xb3, 0xf8, 0xae, 0xd5, 0x9d, 0xfc, 0xf3, 0x9c, 0x3c, 0x23, 0x68, 0x38, 0x0b, 0xdb, 0xb2, - 0x1b, 0x06, 0xd9, 0xd2, 0xba, 0xb3, 0xf8, 0xab, 0x82, 0x85, 0xa0, 0xe1, 0x2c, 0xfa, 0x30, 0xeb, - 0x4b, 0x82, 0x85, 0x1b, 0xb2, 0xe7, 0x13, 0x90, 0xb1, 0x4c, 0x63, 0xcf, 0x32, 0x7b, 0x11, 0xe2, - 0x0b, 0x9c, 0x03, 0x70, 0x12, 0xc2, 0xe0, 0x1c, 0xa4, 0x7b, 0x9d, 0x88, 0xbf, 0xfe, 0x03, 0x11, - 0x1e, 0x62, 0x06, 0x16, 0x61, 0x54, 0x2c, 0x50, 0xba, 0x65, 0xf6, 0xc0, 0xe2, 0x6f, 0x70, 0x16, - 0x23, 0x21, 0x32, 0xae, 0x86, 0x87, 0x5d, 0xaf, 0x86, 0x7b, 0x61, 0xf2, 0x65, 0xa1, 0x06, 0x27, - 0xe1, 0xa6, 0xdc, 0xc2, 0xa6, 0xb6, 0xd3, 0x1b, 0x87, 0x9f, 0x17, 0xa6, 0x14, 0x34, 0x84, 0xc5, - 0x3c, 0x0c, 0xd7, 0x55, 0xc7, 0xdd, 0x51, 0x8d, 0x9e, 0xa6, 0xe3, 0x6f, 0x72, 0x1e, 0x43, 0x3e, - 0x11, 0xb7, 0x48, 0xc3, 0xec, 0x87, 0xcd, 0x57, 0x84, 0x45, 0x42, 0x64, 0x3c, 0xf4, 0x5c, 0x8f, - 0x16, 0xd9, 0xfa, 0xe1, 0xf6, 0x0b, 0x22, 0xf4, 0x18, 0xed, 0x4a, 0x98, 0xe3, 0x39, 0x48, 0xbb, - 0xfa, 0x8d, 0x9e, 0xd8, 0xfc, 0x2d, 0x31, 0xd3, 0x94, 0x80, 0x10, 0x3f, 0x03, 0x47, 0xda, 0x6e, - 0x13, 0x3d, 0x30, 0xfb, 0xdb, 0x9c, 0xd9, 0x64, 0x9b, 0xad, 0x82, 0x2f, 0x09, 0xfd, 0xb2, 0xfc, - 0x3b, 0x62, 0x49, 0xc0, 0x4d, 0xbc, 0xd6, 0xc9, 0x39, 0xc2, 0x55, 0xb7, 0xfb, 0xb3, 0xda, 0x2f, - 0x0a, 0xab, 0x31, 0xda, 0x88, 0xd5, 0x36, 0x61, 0x92, 0x73, 0xec, 0x6f, 0x5e, 0x7f, 0x49, 0x2c, - 0xac, 0x8c, 0xfa, 0x72, 0x74, 0x76, 0xdf, 0x0f, 0x79, 0xdf, 0x9c, 0x22, 0x61, 0x75, 0x2b, 0x75, - 0xd5, 0xee, 0x81, 0xf3, 0x2f, 0x73, 0xce, 0x62, 0xc5, 0xf7, 0x33, 0x5e, 0x77, 0x45, 0xb5, 0x09, - 0xf3, 0xa7, 0x21, 0x27, 0x98, 0x37, 0x4c, 0x07, 0x6b, 0x56, 0xcd, 0xd4, 0x6f, 0xe0, 0x6a, 0x0f, - 0xac, 0xff, 0x6e, 0xd3, 0x54, 0x5d, 0x0e, 0x91, 0x13, 0xce, 0x4b, 0x90, 0xf5, 0x73, 0x95, 0x8a, - 0x5e, 0xb7, 0x2d, 0xc7, 0xeb, 0xc2, 0xf1, 0xab, 0x62, 0xa6, 0x7c, 0xba, 0x25, 0x4a, 0x56, 0x2c, - 0x03, 0x7b, 0xf2, 0xdc, 0xab, 0x4b, 0xfe, 0x0a, 0x67, 0x34, 0x1c, 0x50, 0xf1, 0x85, 0x43, 0xb3, - 0xea, 0xb6, 0xea, 0xf4, 0xb2, 0xfe, 0xfd, 0x3d, 0xb1, 0x70, 0x70, 0x12, 0xbe, 0x70, 0x78, 0x7b, - 0x36, 0x26, 0xbb, 0x7d, 0x0f, 0x1c, 0x7e, 0x55, 0x2c, 0x1c, 0x82, 0x86, 0xb3, 0x10, 0x09, 0x43, - 0x0f, 0x2c, 0xfe, 0xbe, 0x60, 0x21, 0x68, 0x08, 0x8b, 0x27, 0x83, 0x8d, 0xd6, 0xc1, 0x35, 0xdd, - 0xf5, 0x1c, 0x96, 0x26, 0xef, 0xcf, 0xea, 0x1f, 0xfc, 0x20, 0x9a, 0x84, 0x29, 0x21, 0x52, 0xb2, - 0x12, 0xf1, 0xb2, 0x2b, 0x3d, 0x45, 0x75, 0x17, 0xec, 0xd7, 0xc4, 0x4a, 0x14, 0x22, 0x23, 0xb2, - 0x85, 0x32, 0x44, 0x62, 0x76, 0x8d, 0x9c, 0x1d, 0x7a, 0x60, 0xf7, 0x0f, 0x9b, 0x84, 0xdb, 0x10, - 0xb4, 0x84, 0x67, 0x28, 0xff, 0x69, 0x98, 0x57, 0xf1, 0x5e, 0x4f, 0xde, 0xf9, 0xeb, 0x4d, 0xf9, - 0xcf, 0x65, 0x46, 0xc9, 0xd6, 0x90, 0xd1, 0xa6, 0x7c, 0x0a, 0x75, 0xbb, 0x67, 0x94, 0xfb, 0xc9, - 0xd7, 0xb8, 0xbe, 0xd1, 0x74, 0xaa, 0xb8, 0x4c, 0x9c, 0x3c, 0x9a, 0xf4, 0x74, 0x67, 0xf6, 0xe1, - 0xd7, 0x7c, 0x3f, 0x8f, 0xe4, 0x3c, 0xc5, 0xf3, 0x30, 0x1c, 0x49, 0x78, 0xba, 0xb3, 0xfa, 0x08, - 0x67, 0x35, 0x14, 0xce, 0x77, 0x8a, 0x8f, 0x42, 0x82, 0x24, 0x2f, 0xdd, 0xc9, 0x3f, 0xca, 0xc9, - 0x29, 0x7a, 0xf1, 0xdd, 0x90, 0x12, 0x49, 0x4b, 0x77, 0xd2, 0x8f, 0x71, 0x52, 0x9f, 0x84, 0x90, - 0x8b, 0x84, 0xa5, 0x3b, 0xf9, 0x9f, 0x15, 0xe4, 0x82, 0x84, 0x90, 0xf7, 0x6e, 0xc2, 0xaf, 0xfd, - 0xb9, 0x04, 0xdf, 0x74, 0x84, 0xed, 0xce, 0xc1, 0x20, 0xcf, 0x54, 0xba, 0x53, 0x7f, 0x9c, 0x0f, - 0x2e, 0x28, 0x8a, 0x8f, 0x41, 0xb2, 0x47, 0x83, 0xff, 0x0c, 0x27, 0x65, 0xf8, 0xc5, 0x79, 0xc8, - 0x84, 0xb2, 0x93, 0xee, 0xe4, 0x7f, 0x81, 0x93, 0x87, 0xa9, 0x88, 0xe8, 0x3c, 0x3b, 0xe9, 0xce, - 0xe0, 0x13, 0x42, 0x74, 0x4e, 0x41, 0xcc, 0x26, 0x12, 0x93, 0xee, 0xd4, 0x9f, 0x14, 0x56, 0x17, - 0x24, 0xc5, 0x27, 0x20, 0xed, 0x6f, 0x36, 0xdd, 0xe9, 0x3f, 0xc5, 0xe9, 0x03, 0x1a, 0x62, 0x81, - 0xd0, 0x66, 0xd7, 0x9d, 0xc5, 0x5f, 0x14, 0x16, 0x08, 0x51, 0x91, 0x30, 0x6a, 0x4e, 0x60, 0xba, - 0x73, 0xfa, 0x59, 0x11, 0x46, 0x4d, 0xf9, 0x0b, 0x99, 0x4d, 0xba, 0xe6, 0x77, 0x67, 0xf1, 0x73, - 0x62, 0x36, 0x29, 0x3e, 0x11, 0xa3, 0x39, 0x23, 0xe8, 0xce, 0xe3, 0x2f, 0x0b, 0x31, 0x9a, 0x12, - 0x82, 0xe2, 0x3a, 0xa0, 0xd6, 0x6c, 0xa0, 0x3b, 0xbf, 0x4f, 0x73, 0x7e, 0x63, 0x2d, 0xc9, 0x40, - 0xf1, 0x29, 0x98, 0x6c, 0x9f, 0x09, 0x74, 0xe7, 0xfa, 0x99, 0xd7, 0x9a, 0xce, 0x6e, 0xe1, 0x44, - 0xa0, 0xb8, 0x19, 0x6c, 0x29, 0xe1, 0x2c, 0xa0, 0x3b, 0xdb, 0xcf, 0xbe, 0x16, 0x5d, 0xb8, 0xc3, - 0x49, 0x40, 0x71, 0x0e, 0x20, 0xd8, 0x80, 0xbb, 0xf3, 0xfa, 0x1c, 0xe7, 0x15, 0x22, 0x22, 0xa1, - 0xc1, 0xf7, 0xdf, 0xee, 0xf4, 0x2f, 0x8a, 0xd0, 0xe0, 0x14, 0x24, 0x34, 0xc4, 0xd6, 0xdb, 0x9d, - 0xfa, 0xf3, 0x22, 0x34, 0x04, 0x09, 0xf1, 0xec, 0xd0, 0xee, 0xd6, 0x9d, 0xc3, 0x17, 0x84, 0x67, - 0x87, 0xa8, 0x8a, 0xab, 0x30, 0xd6, 0xb2, 0x21, 0x76, 0x67, 0xf5, 0x45, 0xce, 0x2a, 0xdb, 0xbc, - 0x1f, 0x86, 0x37, 0x2f, 0xbe, 0x19, 0x76, 0xe7, 0xf6, 0xa5, 0xa6, 0xcd, 0x8b, 0xef, 0x85, 0xc5, - 0x73, 0x90, 0x32, 0x1b, 0x86, 0x41, 0x82, 0x07, 0xed, 0x7f, 0x37, 0x30, 0xf7, 0x87, 0xaf, 0x73, - 0xeb, 0x08, 0x82, 0xe2, 0xa3, 0x90, 0xc4, 0xf5, 0x2d, 0x5c, 0xed, 0x46, 0xf9, 0xfd, 0xd7, 0xc5, - 0x82, 0x49, 0xb0, 0x8b, 0x4f, 0x00, 0xb0, 0xd2, 0x08, 0x7d, 0x3c, 0xd8, 0x85, 0xf6, 0xbf, 0xbc, - 0xce, 0x2f, 0xe3, 0x04, 0x24, 0x01, 0x03, 0x76, 0xb5, 0x67, 0x7f, 0x06, 0x3f, 0x88, 0x32, 0xa0, - 0x33, 0xf2, 0x38, 0x0c, 0x3e, 0xeb, 0x5a, 0xa6, 0xa7, 0xd6, 0xba, 0x51, 0xff, 0x57, 0x4e, 0x2d, - 0xf0, 0x89, 0xc1, 0xea, 0x96, 0x83, 0x3d, 0xb5, 0xe6, 0x76, 0xa3, 0xfd, 0x6f, 0x9c, 0xd6, 0x27, - 0x20, 0xc4, 0x9a, 0xea, 0x7a, 0xbd, 0xe8, 0xfd, 0x47, 0x82, 0x58, 0x10, 0x10, 0xa1, 0xc9, 0xef, - 0xab, 0x78, 0xaf, 0x1b, 0xed, 0x1f, 0x0b, 0xa1, 0x39, 0x7e, 0xf1, 0xdd, 0x90, 0x26, 0x3f, 0xd9, - 0x0d, 0xbb, 0x2e, 0xc4, 0xff, 0x9d, 0x13, 0x07, 0x14, 0x64, 0x64, 0xd7, 0xab, 0x7a, 0x7a, 0x77, - 0x63, 0xdf, 0xe2, 0x33, 0x2d, 0xf0, 0x8b, 0x73, 0x90, 0x71, 0xbd, 0x6a, 0xb5, 0xc1, 0xf3, 0xd3, - 0x2e, 0xe4, 0xff, 0xe3, 0x75, 0xbf, 0x64, 0xe1, 0xd3, 0x90, 0xd9, 0xbe, 0x7e, 0xd5, 0xb3, 0x2d, - 0xfa, 0x08, 0xa4, 0x1b, 0x87, 0xd7, 0x38, 0x87, 0x10, 0x49, 0x71, 0x1e, 0x86, 0x88, 0x2e, 0x0e, - 0xb6, 0x31, 0x7d, 0x5e, 0xd5, 0x85, 0xc5, 0xff, 0xe4, 0x06, 0x88, 0x10, 0x95, 0x7e, 0xe2, 0x9b, - 0xaf, 0x4e, 0x49, 0x2f, 0xbf, 0x3a, 0x25, 0xfd, 0xc1, 0xab, 0x53, 0xd2, 0x27, 0xbf, 0x33, 0x75, - 0xe8, 0xe5, 0xef, 0x4c, 0x1d, 0xfa, 0xbd, 0xef, 0x4c, 0x1d, 0x6a, 0x5f, 0x36, 0x86, 0x45, 0x6b, - 0xd1, 0x62, 0x05, 0xe3, 0xf7, 0xc9, 0x91, 0x72, 0x71, 0xcd, 0x0a, 0xaa, 0xb5, 0xfe, 0x21, 0x07, - 0x3e, 0x12, 0x87, 0x29, 0xcd, 0x72, 0xeb, 0x96, 0x3b, 0xbb, 0xa5, 0xba, 0x78, 0xf6, 0xda, 0xc3, - 0x5b, 0xd8, 0x53, 0x1f, 0x9e, 0xd5, 0x2c, 0xdd, 0xe4, 0x65, 0xdf, 0x71, 0xd6, 0x5f, 0x20, 0xfd, - 0x05, 0xde, 0x9f, 0x6f, 0x5b, 0x21, 0x96, 0x17, 0x21, 0x31, 0x6f, 0xe9, 0x26, 0x9a, 0x80, 0x64, - 0x15, 0x9b, 0x56, 0x9d, 0x5f, 0x00, 0x63, 0x0d, 0x74, 0x17, 0x0c, 0xa8, 0x75, 0xab, 0x61, 0x7a, - 0xac, 0x5c, 0x5e, 0xca, 0x7c, 0xf3, 0xe6, 0xf4, 0xa1, 0xdf, 0xbf, 0x39, 0x1d, 0x5f, 0x32, 0x3d, - 0x85, 0x77, 0x15, 0x13, 0xdf, 0x7b, 0x69, 0x5a, 0x92, 0x2f, 0xc2, 0xe0, 0x02, 0xd6, 0x0e, 0xc2, - 0x6b, 0x01, 0x6b, 0x4d, 0xbc, 0xee, 0x83, 0xd4, 0x92, 0xe9, 0xb1, 0x2b, 0x7a, 0xc7, 0x21, 0xae, - 0x9b, 0xec, 0xd6, 0x47, 0xd3, 0xf8, 0x04, 0x4e, 0x50, 0x17, 0xb0, 0xe6, 0xa3, 0x56, 0xb1, 0xd6, - 0x8c, 0x4a, 0xd8, 0x13, 0x78, 0x69, 0xe1, 0xf7, 0xfe, 0xe3, 0xd4, 0xa1, 0xe7, 0x5f, 0x9d, 0x3a, - 0xd4, 0x69, 0x7e, 0x22, 0xe6, 0xe7, 0x26, 0x66, 0x7f, 0x1e, 0x74, 0xab, 0x57, 0x67, 0x49, 0x68, - 0xb9, 0x5b, 0x03, 0xec, 0x56, 0x33, 0x7c, 0x32, 0x06, 0xd3, 0xcd, 0x25, 0x75, 0xe2, 0xc7, 0xae, - 0xa7, 0xd6, 0xed, 0x4e, 0x2f, 0x4e, 0x9d, 0x83, 0xf4, 0xa6, 0xc0, 0x41, 0x39, 0x18, 0x74, 0xb1, - 0x66, 0x99, 0x55, 0x97, 0x8a, 0x1c, 0x57, 0x44, 0x93, 0x18, 0xd0, 0x54, 0x4d, 0xcb, 0xe5, 0xd7, - 0x35, 0x59, 0xa3, 0xf4, 0x97, 0xa4, 0xfe, 0x1c, 0x6b, 0xc4, 0x1f, 0x8a, 0x9a, 0x67, 0x5d, 0x7a, - 0xdf, 0xfd, 0xfb, 0x3d, 0x8d, 0xa0, 0xea, 0x05, 0x2a, 0x84, 0x1e, 0x3d, 0x4c, 0x35, 0x3f, 0x7a, - 0x78, 0x0a, 0x1b, 0xc6, 0x25, 0xd3, 0xba, 0x6e, 0x6e, 0x46, 0x4c, 0xf2, 0xbb, 0x12, 0xcc, 0xd0, - 0x0b, 0xeb, 0x4e, 0x5d, 0x37, 0xbd, 0x59, 0x43, 0xdf, 0x72, 0x67, 0xb7, 0x74, 0xcf, 0x65, 0x96, - 0xe3, 0x36, 0x99, 0x08, 0x30, 0x0a, 0x04, 0xa3, 0x40, 0x30, 0xe4, 0xd3, 0x90, 0x2a, 0xe9, 0xde, - 0x9c, 0xe3, 0xa8, 0x7b, 0x08, 0x41, 0x82, 0xc0, 0xb8, 0x51, 0xe8, 0x6f, 0x62, 0x11, 0x6c, 0xe0, - 0xba, 0x4b, 0x1f, 0x7a, 0x25, 0x14, 0xd6, 0x28, 0x5d, 0xee, 0x38, 0x93, 0xe7, 0x42, 0x9a, 0x86, - 0x44, 0x0a, 0xfd, 0x64, 0x91, 0xd0, 0x4e, 0x5c, 0x5f, 0x9f, 0xaf, 0x24, 0xe0, 0x78, 0x08, 0x41, - 0x73, 0xf6, 0x6c, 0x8f, 0x86, 0xa4, 0xb5, 0xcd, 0x95, 0x19, 0x0b, 0x29, 0xc3, 0xba, 0x3b, 0x84, - 0xd9, 0x36, 0x24, 0xd7, 0x09, 0x1d, 0x51, 0xc4, 0xb3, 0x3c, 0xd5, 0xe0, 0xda, 0xb1, 0x06, 0x81, - 0xb2, 0x4b, 0xfb, 0x31, 0x06, 0xd5, 0xc5, 0x7d, 0x7d, 0x03, 0xab, 0xdb, 0xec, 0xee, 0x63, 0x9c, - 0x3e, 0xfb, 0x4c, 0x11, 0x00, 0xbd, 0xe6, 0x38, 0x01, 0x49, 0xb5, 0xc1, 0x1e, 0xdb, 0xc5, 0x4f, - 0x0c, 0x29, 0xac, 0x21, 0x5f, 0x82, 0x41, 0xfe, 0xa8, 0x00, 0x65, 0x21, 0x7e, 0x15, 0xef, 0xd1, - 0x71, 0x86, 0x14, 0xf2, 0x13, 0x15, 0x20, 0x49, 0x85, 0xe7, 0x97, 0xba, 0x73, 0x85, 0x16, 0xe9, - 0x0b, 0x54, 0x48, 0x85, 0xa1, 0xc9, 0x17, 0x21, 0xb5, 0x60, 0xd5, 0x75, 0xd3, 0x8a, 0x72, 0x4b, - 0x33, 0x6e, 0x54, 0x66, 0xbb, 0xc1, 0xc3, 0x59, 0x61, 0x0d, 0x34, 0x09, 0x03, 0xec, 0x2e, 0x2c, - 0x7f, 0xf4, 0xc8, 0x5b, 0xf2, 0x3c, 0x0c, 0x52, 0xde, 0x6b, 0x36, 0x99, 0x5f, 0xff, 0x22, 0x52, - 0x9a, 0xbf, 0x19, 0xc1, 0xd9, 0xc7, 0x02, 0x61, 0x11, 0x24, 0xaa, 0xaa, 0xa7, 0x72, 0xbd, 0xe9, - 0x6f, 0xf9, 0x3d, 0x90, 0xe2, 0x4c, 0x5c, 0x74, 0x0a, 0xe2, 0x96, 0xed, 0xf2, 0x87, 0x87, 0xf9, - 0x4e, 0xaa, 0xac, 0xd9, 0xa5, 0x04, 0x59, 0x08, 0x14, 0x82, 0x5c, 0x52, 0x3a, 0xfa, 0xcb, 0xd9, - 0xfe, 0xfd, 0x85, 0x0d, 0xe3, 0x3b, 0xcb, 0x17, 0x62, 0x30, 0x15, 0xea, 0xbd, 0x86, 0x1d, 0x92, - 0x2f, 0x47, 0x5c, 0x1f, 0x85, 0x84, 0xe4, 0xfd, 0x1d, 0xdc, 0xe5, 0xdd, 0x10, 0x9f, 0xb3, 0x6d, - 0x94, 0x87, 0x14, 0x7b, 0x48, 0x68, 0x31, 0x7f, 0x49, 0x28, 0x7e, 0x9b, 0xf4, 0xb9, 0xd6, 0xb6, - 0x77, 0x5d, 0x75, 0xfc, 0xd7, 0x45, 0x44, 0x5b, 0x7e, 0x1c, 0xd2, 0xf3, 0x96, 0xe9, 0x62, 0xd3, - 0x6d, 0xd0, 0xd0, 0xd9, 0x32, 0x2c, 0xed, 0x2a, 0xe7, 0xc0, 0x1a, 0xc4, 0xe0, 0xaa, 0x6d, 0x53, - 0xca, 0x84, 0x42, 0x7e, 0xb2, 0xa5, 0xb7, 0xb4, 0xd1, 0xd1, 0x44, 0x8f, 0xf7, 0x6f, 0x22, 0xae, - 0xa4, 0x6f, 0xa3, 0x5f, 0x3f, 0x02, 0xc7, 0xc2, 0xa4, 0x6c, 0xc5, 0x09, 0x59, 0x28, 0x1b, 0xb2, - 0x10, 0x85, 0xb7, 0xb7, 0x4f, 0xbe, 0xdb, 0xca, 0x9b, 0xef, 0xba, 0x0e, 0xe5, 0xf7, 0x8f, 0xec, - 0x7c, 0x97, 0xb9, 0x94, 0x1f, 0x87, 0xe1, 0x75, 0xd5, 0xf1, 0x36, 0xb0, 0x77, 0x01, 0xab, 0x55, - 0xec, 0x44, 0x03, 0x7b, 0x58, 0x04, 0x36, 0x82, 0x04, 0x8d, 0x5e, 0xe6, 0xd8, 0xf4, 0xb7, 0xbc, - 0x03, 0x09, 0x7a, 0xd1, 0xc0, 0x0f, 0x7a, 0x4e, 0xc1, 0x82, 0x9e, 0x4c, 0xd7, 0x9e, 0x87, 0x5d, - 0x4e, 0xc2, 0x1a, 0xe8, 0xb4, 0x08, 0xdd, 0xf8, 0xfe, 0xa1, 0xcb, 0xbd, 0x9d, 0x07, 0xb0, 0x01, - 0x83, 0x25, 0x32, 0xdb, 0x4b, 0x0b, 0xbe, 0x20, 0x52, 0x20, 0x08, 0x5a, 0x81, 0x51, 0x5b, 0x75, - 0x3c, 0x7a, 0xc3, 0x72, 0x87, 0x6a, 0xc1, 0x57, 0x86, 0xe9, 0x42, 0xf3, 0x3c, 0x14, 0x22, 0xca, - 0xf2, 0x51, 0x86, 0xed, 0x30, 0x50, 0xfe, 0x4f, 0x09, 0x18, 0xe0, 0xc6, 0x78, 0x37, 0x0c, 0x72, - 0xa3, 0xd1, 0x01, 0x33, 0xa7, 0x8e, 0x17, 0x5a, 0x7d, 0xbf, 0xe0, 0xfb, 0x28, 0xe7, 0x27, 0x68, - 0xd0, 0x3d, 0x90, 0xd2, 0x76, 0x54, 0xdd, 0xac, 0xe8, 0x55, 0x91, 0x2c, 0xbc, 0x7a, 0x73, 0x7a, - 0x70, 0x9e, 0xc0, 0x96, 0x16, 0x94, 0x41, 0xda, 0xb9, 0x54, 0x25, 0x8b, 0xcd, 0x0e, 0xd6, 0x6b, - 0x3b, 0x6c, 0xb1, 0x89, 0x2b, 0xbc, 0x85, 0xce, 0x42, 0x82, 0x38, 0x04, 0xbf, 0x7f, 0x9f, 0x6f, - 0x49, 0xe2, 0xfc, 0x8d, 0xb1, 0x94, 0x22, 0x03, 0x7f, 0xf2, 0xdb, 0xd3, 0x92, 0x42, 0x29, 0xd0, - 0x3c, 0x0c, 0x1b, 0xaa, 0xeb, 0x55, 0x68, 0x90, 0x90, 0xe1, 0x93, 0x94, 0xc5, 0x91, 0x56, 0x83, - 0x70, 0xc3, 0x72, 0xd1, 0x33, 0x84, 0x8a, 0x81, 0xaa, 0xe8, 0x04, 0x64, 0x29, 0x13, 0xcd, 0xaa, - 0xd7, 0x75, 0x8f, 0x2d, 0xdf, 0x03, 0xd4, 0xee, 0x23, 0x04, 0x3e, 0x4f, 0xc1, 0x74, 0x11, 0x3f, - 0x0a, 0x69, 0x7a, 0xe3, 0x97, 0xa2, 0xb0, 0xdb, 0x2d, 0x29, 0x02, 0xa0, 0x9d, 0xf7, 0xc2, 0xe8, - 0x35, 0xd5, 0xd0, 0xab, 0xaa, 0x67, 0x39, 0x2e, 0x43, 0x49, 0x31, 0x2e, 0x01, 0x98, 0x22, 0x3e, - 0x04, 0x13, 0x26, 0xde, 0xa5, 0xf7, 0x6d, 0x22, 0xd8, 0x69, 0x8a, 0x8d, 0x48, 0xdf, 0x95, 0x28, - 0xc5, 0xbb, 0x60, 0x44, 0x13, 0xc6, 0x67, 0xb8, 0x40, 0x71, 0x87, 0x7d, 0x28, 0x45, 0x3b, 0x02, - 0x29, 0xd5, 0xb6, 0x19, 0x42, 0x86, 0x22, 0x0c, 0xaa, 0xb6, 0x4d, 0xbb, 0x4e, 0xc2, 0x18, 0xd5, - 0xd1, 0xc1, 0x6e, 0xc3, 0xf0, 0x38, 0x93, 0x21, 0x8a, 0x33, 0x4a, 0x3a, 0x14, 0x06, 0xa7, 0xb8, - 0x77, 0xc1, 0x30, 0xbe, 0xa6, 0x57, 0xb1, 0xa9, 0x61, 0x86, 0x37, 0x4c, 0xf1, 0x86, 0x04, 0x90, - 0x22, 0xdd, 0x07, 0x59, 0xdb, 0xb1, 0x6c, 0xcb, 0xc5, 0x4e, 0x45, 0xad, 0x56, 0x1d, 0xec, 0xba, - 0xb9, 0x11, 0xc6, 0x4f, 0xc0, 0xe7, 0x18, 0x58, 0x7e, 0x00, 0x12, 0x0b, 0xaa, 0xa7, 0x92, 0x35, - 0xcc, 0xdb, 0x65, 0x5b, 0xc0, 0x90, 0x42, 0x7e, 0xb6, 0x0d, 0xb7, 0xef, 0xc5, 0x20, 0x71, 0xc5, - 0xf2, 0x30, 0x7a, 0x24, 0xb4, 0xef, 0x8c, 0xb4, 0xf3, 0xf1, 0x0d, 0xbd, 0x66, 0xe2, 0xea, 0x8a, - 0x5b, 0x0b, 0xbd, 0xb2, 0x17, 0xb8, 0x58, 0x2c, 0xe2, 0x62, 0x13, 0x90, 0x74, 0xac, 0x86, 0x59, - 0x15, 0x97, 0x45, 0x68, 0x03, 0x95, 0x21, 0xe5, 0x7b, 0x4e, 0xa2, 0x9b, 0xe7, 0x8c, 0x12, 0xcf, - 0x21, 0x7e, 0xcd, 0x01, 0xca, 0xe0, 0x16, 0x77, 0xa0, 0x12, 0xa4, 0xfd, 0x05, 0x8d, 0x7b, 0x60, - 0x6f, 0x4e, 0x1c, 0x90, 0xa1, 0xfb, 0x61, 0xcc, 0xf7, 0x07, 0xdf, 0xa0, 0xcc, 0x0b, 0xb3, 0x7e, - 0x07, 0xb7, 0x68, 0xc4, 0xd5, 0xf8, 0xeb, 0x83, 0x83, 0x54, 0xaf, 0xc0, 0xd5, 0xd8, 0x2b, 0x84, - 0xc7, 0x20, 0xed, 0xea, 0x35, 0x53, 0xf5, 0x1a, 0x0e, 0xe6, 0xde, 0x18, 0x00, 0xe4, 0x4f, 0xc5, - 0x60, 0x80, 0x79, 0x77, 0xc8, 0x6e, 0x52, 0x7b, 0xbb, 0xc5, 0x3a, 0xd9, 0x2d, 0x7e, 0x70, 0xbb, - 0xcd, 0x01, 0xf8, 0xc2, 0xb8, 0xfc, 0xad, 0xae, 0xa3, 0xad, 0x8c, 0x98, 0x88, 0x1b, 0x7a, 0x8d, - 0x07, 0x6f, 0x88, 0xc8, 0xf7, 0xa0, 0x64, 0x68, 0x9d, 0x3c, 0x07, 0xe9, 0x2d, 0xdd, 0xab, 0xa8, - 0x24, 0x3b, 0xa5, 0x26, 0xcc, 0x9c, 0x9a, 0x2a, 0xb4, 0x4b, 0x63, 0x0b, 0x22, 0x87, 0x55, 0x52, - 0x5b, 0xfc, 0x97, 0xfc, 0x1f, 0x24, 0xb2, 0x19, 0xf3, 0x01, 0xd1, 0x1c, 0x0c, 0x0b, 0x45, 0x2b, - 0xdb, 0x86, 0x5a, 0xe3, 0xce, 0x78, 0xbc, 0xa3, 0xb6, 0xe7, 0x0d, 0xb5, 0xa6, 0x64, 0xb8, 0x82, - 0xa4, 0xd1, 0x7e, 0x62, 0x63, 0x1d, 0x26, 0x36, 0xe2, 0x49, 0xf1, 0x83, 0x79, 0x52, 0x64, 0xce, - 0x13, 0xcd, 0x73, 0xfe, 0xd5, 0x18, 0x4d, 0xca, 0x6c, 0xcb, 0x55, 0x8d, 0xb7, 0x22, 0xc4, 0x8e, - 0x42, 0xda, 0xb6, 0x8c, 0x0a, 0xeb, 0x61, 0xb7, 0xb2, 0x52, 0xb6, 0x65, 0x28, 0x2d, 0x7e, 0x94, - 0xbc, 0x4d, 0xf1, 0x37, 0x70, 0x1b, 0xac, 0x36, 0xd8, 0x6c, 0x35, 0x07, 0x86, 0x98, 0x29, 0xf8, - 0x86, 0xf9, 0x10, 0xb1, 0x01, 0xdd, 0x81, 0xa5, 0xd6, 0x0d, 0x9e, 0x89, 0xcd, 0x30, 0x15, 0x8e, - 0x47, 0x28, 0xd8, 0xfe, 0xd2, 0x2e, 0x9b, 0x0f, 0xfb, 0xb9, 0xc2, 0xf1, 0xe4, 0x7f, 0x2a, 0x41, - 0x9a, 0xaa, 0xba, 0x82, 0x3d, 0x35, 0x62, 0x2a, 0xe9, 0xe0, 0xa6, 0x3a, 0x0e, 0xc0, 0xd8, 0xb8, - 0xfa, 0x0d, 0xcc, 0x27, 0x30, 0x4d, 0x21, 0x1b, 0xfa, 0x0d, 0x8c, 0xce, 0xf8, 0x7a, 0xc5, 0xf7, - 0xd7, 0x8b, 0x87, 0xa2, 0xd0, 0xee, 0x0e, 0x18, 0xa4, 0x5f, 0x2f, 0xd8, 0x65, 0xd7, 0x12, 0xe3, - 0xf4, 0x95, 0xc5, 0xcd, 0x5d, 0x57, 0x7e, 0x16, 0x06, 0x37, 0x77, 0xd9, 0x51, 0xea, 0x28, 0xa4, - 0x1d, 0xcb, 0xe2, 0xfb, 0x2b, 0xcb, 0x6b, 0x52, 0x04, 0x40, 0xb7, 0x13, 0x71, 0x7c, 0x88, 0x05, - 0xc7, 0x87, 0xe0, 0xfc, 0x13, 0xef, 0xe9, 0xfc, 0x73, 0xf2, 0xdf, 0x4a, 0x90, 0x09, 0x85, 0x21, - 0x7a, 0x18, 0x0e, 0x97, 0x96, 0xd7, 0xe6, 0x2f, 0x55, 0x96, 0x16, 0x2a, 0xe7, 0x97, 0xe7, 0x16, - 0x83, 0xeb, 0xbd, 0xf9, 0xc9, 0x17, 0x5e, 0x9c, 0x41, 0x21, 0xdc, 0xcb, 0xe6, 0x55, 0x72, 0x3e, - 0x46, 0xb3, 0x30, 0x11, 0x25, 0x99, 0x2b, 0x6d, 0x94, 0x57, 0x37, 0xb3, 0x52, 0xfe, 0xf0, 0x0b, - 0x2f, 0xce, 0x8c, 0x85, 0x28, 0xe6, 0xb6, 0x5c, 0x6c, 0x7a, 0xad, 0x04, 0xf3, 0x6b, 0x2b, 0x2b, - 0x4b, 0x9b, 0xd9, 0x58, 0x0b, 0x01, 0x5f, 0x68, 0xef, 0x83, 0xb1, 0x28, 0xc1, 0xea, 0xd2, 0x72, - 0x36, 0x9e, 0x47, 0x2f, 0xbc, 0x38, 0x33, 0x12, 0xc2, 0x5e, 0xd5, 0x8d, 0x7c, 0xea, 0xa7, 0xbf, - 0x34, 0x75, 0xe8, 0xe7, 0xff, 0xda, 0x94, 0x44, 0x34, 0x1b, 0x8e, 0x84, 0x22, 0x7a, 0x00, 0xee, - 0xd8, 0x58, 0x5a, 0x5c, 0x2d, 0x2f, 0x54, 0x56, 0x36, 0x16, 0x2b, 0xec, 0xb5, 0x66, 0x5f, 0xbb, - 0xd1, 0x17, 0x5e, 0x9c, 0xc9, 0x70, 0x95, 0x3a, 0x61, 0xaf, 0x2b, 0xe5, 0x2b, 0x6b, 0x9b, 0xe5, - 0xac, 0xc4, 0xb0, 0xd7, 0x1d, 0x7c, 0xcd, 0xf2, 0xd8, 0xe7, 0x4d, 0x1e, 0x82, 0x23, 0x6d, 0xb0, - 0x7d, 0xc5, 0xc6, 0x5e, 0x78, 0x71, 0x66, 0x78, 0xdd, 0xc1, 0xcc, 0x4d, 0x29, 0x45, 0x01, 0x72, - 0xad, 0x14, 0x6b, 0xeb, 0x6b, 0x1b, 0x73, 0xcb, 0xd9, 0x99, 0x7c, 0xf6, 0x85, 0x17, 0x67, 0x86, - 0xc4, 0x9a, 0x43, 0xf0, 0x03, 0xcd, 0x4a, 0x4f, 0x76, 0x3c, 0xbf, 0x3c, 0xd6, 0xff, 0xf9, 0x25, - 0x5a, 0xf1, 0xf9, 0xf3, 0x31, 0x98, 0x6a, 0xb9, 0x44, 0xc9, 0x4b, 0x8f, 0x9d, 0x0a, 0x3e, 0x45, - 0x48, 0x2d, 0x88, 0x8a, 0x66, 0xbf, 0xf5, 0x9e, 0x9f, 0xeb, 0xb3, 0xde, 0x33, 0x2c, 0x46, 0x12, - 0xe5, 0x9e, 0x93, 0xdd, 0xcb, 0x3d, 0x42, 0xfe, 0x03, 0x54, 0x7b, 0x3e, 0xfa, 0x30, 0xdc, 0xcd, - 0x8b, 0x64, 0xae, 0xa7, 0x5e, 0xd5, 0xcd, 0x9a, 0x5f, 0x8a, 0xe4, 0x6d, 0x6e, 0x94, 0x49, 0x5e, - 0x8d, 0x14, 0xd0, 0x7d, 0x0b, 0x92, 0xf9, 0x7d, 0x0f, 0x88, 0xdd, 0x0f, 0x7e, 0x5d, 0x66, 0x28, - 0xdf, 0xa5, 0x74, 0x2a, 0x7f, 0x5c, 0x82, 0x91, 0x0b, 0xba, 0xeb, 0x59, 0x8e, 0xae, 0xa9, 0x06, - 0xbd, 0xad, 0x7c, 0xa6, 0xd7, 0xb5, 0xb9, 0x69, 0x0d, 0x7b, 0x02, 0x06, 0xae, 0xa9, 0x86, 0x8b, - 0x3d, 0x7e, 0x59, 0xff, 0xce, 0x42, 0x7b, 0x43, 0x14, 0xfc, 0xe4, 0x5c, 0x30, 0x60, 0x64, 0xf2, - 0x2f, 0xc6, 0x60, 0x94, 0x46, 0xb9, 0xcb, 0x3e, 0xbb, 0x41, 0x0e, 0x82, 0x25, 0x48, 0x38, 0xaa, - 0xc7, 0x8b, 0x27, 0xa5, 0x02, 0x2f, 0x72, 0xde, 0xd3, 0xbd, 0x70, 0x59, 0x58, 0xc0, 0x9a, 0x42, - 0x69, 0xd1, 0x8f, 0x43, 0xaa, 0xae, 0xee, 0x56, 0x28, 0x1f, 0x76, 0xbc, 0x9a, 0xeb, 0x8f, 0xcf, - 0xad, 0x9b, 0xd3, 0xa3, 0x7b, 0x6a, 0xdd, 0x28, 0xca, 0x82, 0x8f, 0xac, 0x0c, 0xd6, 0xd5, 0x5d, - 0x22, 0x22, 0xb2, 0x61, 0x94, 0x40, 0xb5, 0x1d, 0xd5, 0xac, 0x61, 0x36, 0x08, 0x2d, 0x05, 0x95, - 0x2e, 0xf4, 0x3d, 0xc8, 0x64, 0x30, 0x48, 0x88, 0x9d, 0xac, 0x0c, 0xd7, 0xd5, 0xdd, 0x79, 0x0a, - 0x20, 0x23, 0x16, 0x53, 0x9f, 0x7e, 0x69, 0xfa, 0x10, 0x2d, 0x1c, 0xbf, 0x22, 0x01, 0x04, 0x16, - 0x43, 0x3f, 0x0e, 0x59, 0xcd, 0x6f, 0x51, 0x5a, 0x97, 0xcf, 0xe1, 0xbd, 0x9d, 0xe6, 0xa2, 0xc9, - 0xde, 0x6c, 0x6f, 0x7f, 0xf9, 0xe6, 0xb4, 0xa4, 0x8c, 0x6a, 0x4d, 0x53, 0xf1, 0x7e, 0xc8, 0x34, - 0xec, 0xaa, 0xea, 0xe1, 0x0a, 0x3d, 0x6c, 0xc6, 0xba, 0xe6, 0x09, 0x53, 0x84, 0xd7, 0xad, 0x9b, - 0xd3, 0x88, 0xa9, 0x15, 0x22, 0x96, 0x69, 0xf6, 0x00, 0x0c, 0x42, 0x08, 0x42, 0x3a, 0xfd, 0x8e, - 0x04, 0x99, 0x85, 0xd0, 0xad, 0x81, 0x1c, 0x0c, 0xd6, 0x2d, 0x53, 0xbf, 0xca, 0xfd, 0x31, 0xad, - 0x88, 0x26, 0xca, 0x43, 0x8a, 0xbd, 0xc0, 0xe1, 0xed, 0x89, 0x92, 0x90, 0x68, 0x13, 0xaa, 0xeb, - 0x78, 0xcb, 0xd5, 0xc5, 0x6c, 0x28, 0xa2, 0x89, 0xce, 0x43, 0xd6, 0xc5, 0x5a, 0xc3, 0xd1, 0xbd, - 0xbd, 0x8a, 0x66, 0x99, 0x9e, 0xaa, 0x79, 0xec, 0x55, 0x80, 0xd2, 0xd1, 0x5b, 0x37, 0xa7, 0xef, - 0x60, 0xb2, 0x36, 0x63, 0xc8, 0xca, 0xa8, 0x00, 0xcd, 0x33, 0x08, 0x19, 0xa1, 0x8a, 0x3d, 0x55, - 0x37, 0x5c, 0x9a, 0x7a, 0xa5, 0x15, 0xd1, 0x0c, 0xe9, 0xf2, 0x8f, 0x07, 0x21, 0xed, 0x7b, 0x3b, - 0xba, 0x0e, 0x59, 0xcb, 0xc6, 0x4e, 0x24, 0x91, 0xa5, 0xfb, 0x78, 0x69, 0x39, 0x18, 0xb9, 0x19, - 0x43, 0xfe, 0x7f, 0x37, 0xa7, 0x1f, 0xec, 0xc1, 0x83, 0xae, 0xa8, 0x06, 0x4f, 0x82, 0x95, 0x51, - 0xc1, 0x43, 0x64, 0xc5, 0xe7, 0x89, 0x5f, 0x88, 0xe3, 0xaf, 0xdd, 0xd8, 0x12, 0xa5, 0xc7, 0x88, - 0xca, 0xcd, 0x18, 0x32, 0xf1, 0x00, 0x0e, 0x5a, 0xa7, 0x10, 0x92, 0xb9, 0x3e, 0xab, 0xea, 0x86, - 0x78, 0xab, 0x4d, 0xe1, 0x2d, 0xb4, 0x04, 0x03, 0xae, 0xa7, 0x7a, 0x0d, 0x96, 0xbc, 0x24, 0x4b, - 0x0f, 0xf7, 0x28, 0x73, 0xc9, 0x32, 0xab, 0x1b, 0x94, 0x50, 0xe1, 0x0c, 0xd0, 0x79, 0x18, 0xf0, - 0xac, 0xab, 0xd8, 0xe4, 0x46, 0xed, 0x2b, 0xe2, 0xe9, 0x43, 0x1a, 0x46, 0x8d, 0x3c, 0xc8, 0x56, - 0xb1, 0x81, 0x6b, 0xd4, 0x94, 0xee, 0x8e, 0x4a, 0x0e, 0x48, 0xf4, 0x0b, 0x34, 0xa5, 0xa5, 0xbe, - 0xc3, 0x92, 0x1b, 0xa8, 0x99, 0x9f, 0xac, 0x8c, 0xfa, 0xa0, 0x0d, 0x0a, 0x41, 0x97, 0x22, 0x17, - 0x5e, 0xf8, 0x67, 0x9a, 0xee, 0xea, 0x14, 0x7b, 0x21, 0x2f, 0x17, 0x65, 0x95, 0xf0, 0x75, 0x99, - 0xf3, 0x90, 0x6d, 0x98, 0x5b, 0x96, 0x49, 0xdf, 0x44, 0xe1, 0x27, 0x06, 0x72, 0x04, 0x8d, 0x87, - 0x67, 0xad, 0x19, 0x43, 0x56, 0x46, 0x7d, 0xd0, 0x05, 0x76, 0xae, 0xa8, 0xc2, 0x48, 0x80, 0x45, - 0x43, 0x37, 0xdd, 0x35, 0x74, 0xef, 0xe4, 0xa1, 0x7b, 0xb8, 0x79, 0x94, 0x20, 0x7a, 0x87, 0x7d, - 0x20, 0x21, 0x43, 0x17, 0x00, 0x82, 0x05, 0x83, 0x96, 0x57, 0x32, 0xa7, 0xe4, 0xee, 0xab, 0x8e, - 0x38, 0x92, 0x06, 0xb4, 0xe8, 0x83, 0x30, 0x5e, 0xd7, 0xcd, 0x8a, 0x8b, 0x8d, 0xed, 0x0a, 0x37, - 0x30, 0x61, 0x49, 0x3f, 0x24, 0x50, 0x5a, 0xee, 0xcf, 0x1f, 0x6e, 0xdd, 0x9c, 0xce, 0xf3, 0x45, - 0xb5, 0x95, 0xa5, 0xac, 0x8c, 0xd5, 0x75, 0x73, 0x03, 0x1b, 0xdb, 0x0b, 0x3e, 0xac, 0x38, 0xf4, - 0xd3, 0x2f, 0x4d, 0x1f, 0xf2, 0x03, 0x58, 0x87, 0xa1, 0x20, 0xb0, 0xb0, 0x8b, 0xd6, 0x20, 0xad, - 0x8a, 0x06, 0x2b, 0xc4, 0xf4, 0xec, 0xec, 0xa1, 0x00, 0x0d, 0x78, 0xb0, 0xb5, 0xe2, 0xf9, 0x7f, - 0x3f, 0x23, 0xc9, 0x2f, 0xc4, 0x60, 0x60, 0xe1, 0xca, 0xba, 0xaa, 0x3b, 0xe8, 0x06, 0x8c, 0x05, - 0xce, 0x16, 0x5d, 0x29, 0x56, 0x6e, 0xdd, 0x9c, 0xce, 0x35, 0xfb, 0x63, 0x9f, 0x4b, 0xc5, 0x9c, - 0xa6, 0x09, 0x49, 0x82, 0x20, 0x11, 0x6b, 0xc5, 0x8d, 0x8e, 0xc7, 0xed, 0xf0, 0xd8, 0x2d, 0x28, - 0x07, 0x58, 0xa6, 0x5a, 0x4e, 0xef, 0xa1, 0x85, 0xb3, 0x0c, 0x83, 0xcc, 0x16, 0x2e, 0x2a, 0x42, - 0xd2, 0x26, 0x3f, 0xf8, 0xa3, 0x8f, 0xa9, 0x8e, 0xd1, 0x44, 0xf1, 0xfd, 0x82, 0x30, 0x21, 0x91, - 0xbf, 0x18, 0x07, 0x58, 0xb8, 0x72, 0x65, 0xd3, 0xd1, 0x6d, 0x03, 0x7b, 0x3f, 0x54, 0xbb, 0x7e, - 0x54, 0x82, 0xc3, 0x81, 0xd5, 0x5c, 0x47, 0x6b, 0x32, 0xee, 0x93, 0xb7, 0x6e, 0x4e, 0x1f, 0x6b, - 0x36, 0x6e, 0x08, 0xed, 0x00, 0x06, 0x1e, 0xf7, 0x19, 0x6d, 0x38, 0x5a, 0x7b, 0x39, 0xaa, 0xae, - 0xe7, 0xcb, 0x11, 0xef, 0x2c, 0x47, 0x08, 0xed, 0x0d, 0xc9, 0xb1, 0xe0, 0x7a, 0xad, 0x73, 0xbd, - 0x01, 0x99, 0x60, 0x8e, 0x5c, 0xb4, 0x00, 0x29, 0x8f, 0xff, 0xe6, 0x53, 0x2e, 0x77, 0x9e, 0x72, - 0x41, 0xc6, 0xa7, 0xdd, 0xa7, 0x94, 0xff, 0x4d, 0x0c, 0x20, 0x88, 0xea, 0x3f, 0xad, 0x11, 0x45, - 0xb6, 0x53, 0xbe, 0xf9, 0xc5, 0x0f, 0x94, 0x40, 0x73, 0xea, 0xd0, 0x6c, 0xfd, 0x61, 0x0c, 0xc6, - 0x2f, 0x8b, 0x95, 0xff, 0x1d, 0x0b, 0xa3, 0x75, 0x18, 0xc4, 0xa6, 0xe7, 0xe8, 0xd4, 0xc4, 0xc4, - 0x5b, 0x1f, 0xea, 0xe4, 0xad, 0x6d, 0xac, 0x46, 0x3f, 0x96, 0x21, 0x9e, 0x06, 0x71, 0x36, 0x21, - 0x5b, 0x7f, 0x22, 0x0e, 0xb9, 0x4e, 0x54, 0x68, 0x1e, 0x46, 0x35, 0x07, 0x53, 0x40, 0x25, 0x5c, - 0x7a, 0x2e, 0xe5, 0x83, 0x93, 0x44, 0x13, 0x82, 0xac, 0x8c, 0x08, 0x08, 0xcf, 0x0d, 0x6a, 0x40, - 0xd2, 0x7c, 0x12, 0x32, 0x04, 0xab, 0xc7, 0xbc, 0x5e, 0xe6, 0xc9, 0x81, 0x18, 0x24, 0xca, 0x80, - 0x65, 0x07, 0x23, 0x01, 0x94, 0xa6, 0x07, 0xcf, 0xc1, 0xa8, 0x6e, 0xea, 0x9e, 0xae, 0x1a, 0x95, - 0x2d, 0xd5, 0x50, 0x4d, 0xed, 0x20, 0xa7, 0x24, 0xb6, 0xa1, 0xf3, 0x61, 0x9b, 0xd8, 0xc9, 0xca, - 0x08, 0x87, 0x94, 0x18, 0x00, 0x5d, 0x80, 0x41, 0x31, 0x54, 0xe2, 0x40, 0xb9, 0xa4, 0x20, 0x0f, - 0xcd, 0xc8, 0xcf, 0xc4, 0x61, 0x4c, 0xc1, 0xd5, 0x77, 0xa6, 0xa2, 0xbf, 0xa9, 0x58, 0x01, 0x60, - 0x0b, 0x09, 0xd9, 0x49, 0x0e, 0x30, 0x1b, 0x64, 0x29, 0x4a, 0x33, 0x0e, 0x0b, 0xae, 0x17, 0x9a, - 0x8f, 0x3f, 0x8a, 0xc3, 0x50, 0x78, 0x3e, 0xde, 0xd9, 0xe2, 0x7f, 0x74, 0xb6, 0x78, 0xb4, 0x14, - 0x2c, 0x8d, 0x09, 0xfe, 0xcd, 0xc3, 0x0e, 0x4b, 0x63, 0x4b, 0x48, 0x75, 0x5e, 0x13, 0xff, 0x57, - 0x0c, 0x06, 0xd6, 0x55, 0x47, 0xad, 0xbb, 0x48, 0x6b, 0x39, 0xd8, 0x88, 0xc2, 0x7e, 0xcb, 0x57, - 0x6d, 0x79, 0x51, 0xac, 0xcb, 0xb9, 0xe6, 0xd3, 0x6d, 0xce, 0x35, 0xef, 0x85, 0x91, 0xba, 0xba, - 0x1b, 0x7a, 0xd6, 0x4c, 0x27, 0x73, 0xb8, 0x74, 0x24, 0xe0, 0x12, 0xed, 0x67, 0xe5, 0x9a, 0xe0, - 0x01, 0x34, 0x7a, 0x0c, 0x32, 0x04, 0x23, 0xd8, 0x25, 0x08, 0xf9, 0x64, 0x50, 0x17, 0x09, 0x75, - 0xca, 0x0a, 0xd4, 0xd5, 0xdd, 0x32, 0x6b, 0xa0, 0x65, 0x40, 0x3b, 0x7e, 0x69, 0xae, 0x12, 0x98, - 0x92, 0xd0, 0x1f, 0xbf, 0x75, 0x73, 0xfa, 0x08, 0xa3, 0x6f, 0xc5, 0x91, 0x95, 0xb1, 0x00, 0x28, - 0xb8, 0x9d, 0x06, 0x20, 0x7a, 0x55, 0xd8, 0x55, 0x45, 0x76, 0xba, 0x3e, 0x7c, 0xeb, 0xe6, 0xf4, - 0x18, 0xe3, 0x12, 0xf4, 0xc9, 0x4a, 0x9a, 0x34, 0x16, 0xc8, 0xef, 0x90, 0xe1, 0xbf, 0x24, 0x01, - 0x0a, 0xf6, 0x20, 0x05, 0xbb, 0xb6, 0x65, 0xba, 0xf4, 0xdc, 0x17, 0x3a, 0xa4, 0x49, 0xfb, 0x9f, - 0xfb, 0x02, 0x7a, 0x71, 0xee, 0x0b, 0x85, 0xee, 0xe3, 0xc1, 0x7a, 0x1d, 0xe3, 0xf3, 0xd8, 0xe6, - 0x5e, 0x67, 0x61, 0xde, 0xd2, 0x05, 0x75, 0x9b, 0x05, 0xfa, 0x9f, 0x4b, 0x70, 0xa4, 0xc5, 0x9b, - 0x7c, 0x61, 0xff, 0x0c, 0x20, 0x27, 0xd4, 0xc9, 0x3f, 0x5e, 0xc5, 0x84, 0xee, 0xdb, 0x39, 0xc7, - 0x9c, 0x96, 0x8d, 0xe0, 0xf6, 0x6d, 0x39, 0xec, 0x62, 0xe8, 0x3f, 0x91, 0x60, 0x22, 0x3c, 0xbc, - 0xaf, 0xc8, 0x2a, 0x0c, 0x85, 0x47, 0xe7, 0x2a, 0xdc, 0xdd, 0x8b, 0x0a, 0x5c, 0xfa, 0x08, 0x3d, - 0x7a, 0x32, 0x08, 0x55, 0x56, 0xbc, 0x7d, 0xb8, 0x67, 0x6b, 0x08, 0x99, 0x9a, 0x43, 0x96, 0x69, - 0xf0, 0x27, 0x12, 0x24, 0xd6, 0x2d, 0xcb, 0x40, 0x16, 0x8c, 0x99, 0x96, 0x57, 0x21, 0x9e, 0x85, - 0xab, 0x15, 0x5e, 0xe3, 0x61, 0x55, 0xdd, 0xf9, 0xfe, 0x8c, 0xf4, 0xfd, 0x9b, 0xd3, 0xad, 0xac, - 0x94, 0x51, 0xd3, 0xf2, 0x4a, 0x14, 0xb2, 0xc9, 0x2a, 0x40, 0x1f, 0x84, 0xe1, 0xe8, 0x60, 0xac, - 0xe2, 0xf5, 0x54, 0xdf, 0x83, 0x45, 0xd9, 0xdc, 0xba, 0x39, 0x3d, 0x11, 0x44, 0x8c, 0x0f, 0x96, - 0x95, 0xa1, 0xad, 0xd0, 0xe8, 0xc5, 0x14, 0xd1, 0xfe, 0x8f, 0x5f, 0x9a, 0x96, 0x4a, 0xe7, 0x3b, - 0x3e, 0xa1, 0x79, 0x60, 0x5f, 0x11, 0x76, 0xfd, 0xc7, 0x0c, 0xd1, 0xc7, 0x32, 0x9f, 0x1e, 0x87, - 0xe9, 0x0e, 0xcf, 0x21, 0xbc, 0xdd, 0x03, 0x3d, 0x82, 0xe8, 0xf2, 0x8c, 0x20, 0xdf, 0xd3, 0x63, - 0x0f, 0xf9, 0xf5, 0x04, 0xa0, 0x15, 0xb7, 0x36, 0x4f, 0xb2, 0x1a, 0x1c, 0x14, 0x3d, 0x9b, 0x4a, - 0x62, 0xd2, 0x1b, 0x2a, 0x89, 0xad, 0x44, 0x8a, 0x4c, 0xb1, 0xfe, 0x4a, 0xdb, 0x3d, 0x57, 0x9a, - 0xe2, 0x6f, 0x49, 0xa5, 0xa9, 0x7d, 0xaa, 0x92, 0xf8, 0x21, 0x9e, 0x98, 0x92, 0x6f, 0xcd, 0x89, - 0x69, 0x12, 0x06, 0x78, 0x0d, 0x9a, 0x7d, 0x12, 0x9c, 0xb7, 0xd0, 0xa3, 0xe2, 0x03, 0xc9, 0x83, - 0xbd, 0xad, 0xfe, 0x0c, 0x9b, 0xaf, 0x33, 0x5f, 0x8b, 0x43, 0x76, 0xc5, 0xad, 0x95, 0xab, 0xba, - 0xf7, 0x26, 0xf9, 0x9e, 0xdd, 0xf9, 0x90, 0x39, 0x7f, 0xeb, 0xe6, 0xf4, 0x08, 0x33, 0xd9, 0xed, - 0x34, 0x54, 0x1d, 0x46, 0x9b, 0x1e, 0xe7, 0x70, 0xd7, 0x5c, 0x38, 0xc8, 0x53, 0xa5, 0x26, 0x56, - 0x32, 0x3d, 0x17, 0x84, 0x02, 0x04, 0xed, 0xb6, 0x8f, 0x06, 0xb6, 0x91, 0x5d, 0x78, 0x33, 0x6b, - 0xae, 0x6c, 0x0a, 0xbf, 0x11, 0x83, 0xcc, 0x8a, 0x2b, 0xce, 0xb9, 0xf8, 0x4f, 0x6d, 0x45, 0xe1, - 0x31, 0xff, 0xc5, 0x91, 0x78, 0x6f, 0x81, 0x10, 0x7d, 0x99, 0xe4, 0xdb, 0x71, 0xba, 0x0e, 0x97, - 0x70, 0x4d, 0x37, 0xfd, 0xcd, 0x1a, 0xbf, 0x73, 0x30, 0xfa, 0x11, 0x3a, 0x18, 0x05, 0x33, 0x9c, - 0x38, 0xc8, 0x0c, 0xff, 0x56, 0x0c, 0x86, 0x57, 0xdc, 0xda, 0x65, 0xb3, 0xfa, 0x4e, 0xa8, 0xbc, - 0x91, 0x50, 0xb9, 0xed, 0xa9, 0xd9, 0x37, 0x62, 0x70, 0x32, 0x9c, 0x4b, 0x3d, 0xd7, 0xc0, 0xce, - 0x9e, 0x9f, 0x2e, 0xd9, 0x6a, 0x4d, 0x37, 0xc3, 0xb7, 0x67, 0x8e, 0x84, 0x85, 0xa5, 0xb8, 0x42, - 0x64, 0xd9, 0x84, 0xcc, 0xba, 0x5a, 0xc3, 0x0a, 0x7e, 0xae, 0x81, 0x5d, 0xaf, 0xcd, 0xbb, 0x2d, - 0x93, 0x30, 0x60, 0x6d, 0x6f, 0xb3, 0xcb, 0x16, 0xd2, 0x89, 0x84, 0xc2, 0x5b, 0x68, 0x02, 0x92, - 0x86, 0x5e, 0xd7, 0x99, 0x41, 0x12, 0x0a, 0x6b, 0xa0, 0x69, 0xc8, 0x68, 0x44, 0xef, 0x0a, 0xbb, - 0xb2, 0x9f, 0x10, 0xdf, 0xee, 0x68, 0x98, 0xde, 0x26, 0x81, 0xc8, 0x4f, 0xc0, 0x10, 0x1b, 0x8f, - 0x9f, 0x2f, 0x8e, 0x40, 0x8a, 0x5e, 0xb1, 0x0e, 0x46, 0x1d, 0x24, 0xed, 0x4b, 0xec, 0x3d, 0x18, - 0xc6, 0x85, 0x0d, 0xcc, 0x1a, 0xa5, 0x52, 0x47, 0x53, 0x9e, 0xe8, 0x3e, 0xc9, 0xcc, 0x50, 0xbe, - 0x19, 0x7f, 0x33, 0x09, 0x87, 0xf9, 0xb5, 0x16, 0xd5, 0xd6, 0x67, 0x77, 0x3c, 0x4f, 0xbc, 0x60, - 0x06, 0xfc, 0x60, 0xaf, 0xda, 0xba, 0xbc, 0x07, 0x89, 0x0b, 0x9e, 0x67, 0xa3, 0x93, 0x90, 0x74, - 0x1a, 0x06, 0x16, 0x0f, 0x0b, 0x26, 0x0a, 0x01, 0x4e, 0x81, 0x20, 0x28, 0x0d, 0x03, 0x2b, 0x0c, - 0x05, 0x95, 0x61, 0x7a, 0xbb, 0x61, 0x18, 0x7b, 0x95, 0x2a, 0xa6, 0xff, 0x76, 0xc9, 0xff, 0xc7, - 0x05, 0x78, 0xd7, 0x56, 0x4d, 0x3f, 0xa9, 0x4c, 0x29, 0xc7, 0x28, 0xda, 0x02, 0xc5, 0x12, 0xff, - 0xb4, 0xa0, 0x2c, 0x70, 0xe4, 0xdf, 0x8f, 0x41, 0x4a, 0xb0, 0xa6, 0x2f, 0xa6, 0x60, 0x03, 0x6b, - 0x9e, 0x25, 0x2e, 0x28, 0xf8, 0x6d, 0x84, 0x20, 0x5e, 0xe3, 0x53, 0x94, 0xbe, 0x70, 0x48, 0x21, - 0x0d, 0x02, 0xf3, 0x5f, 0x17, 0x22, 0x30, 0xbb, 0x41, 0x66, 0x2d, 0x61, 0x5b, 0xa2, 0x32, 0x76, - 0xe1, 0x90, 0x42, 0x5b, 0x28, 0x07, 0x03, 0x24, 0xda, 0x3c, 0xf6, 0x4d, 0x49, 0x02, 0xe7, 0x6d, - 0x34, 0x09, 0x49, 0x5b, 0xf5, 0x34, 0x76, 0xcd, 0x9e, 0x74, 0xb0, 0x26, 0x89, 0x07, 0xf6, 0x2e, - 0x6f, 0xf3, 0xff, 0x34, 0x21, 0xc6, 0x60, 0x1f, 0x4d, 0x23, 0x72, 0xaf, 0xab, 0x9e, 0x87, 0x1d, - 0x93, 0x30, 0x64, 0xe8, 0xf4, 0x1d, 0x34, 0xab, 0xba, 0xc7, 0xff, 0xcf, 0x0a, 0xfd, 0xcd, 0xff, - 0xb1, 0x03, 0xf5, 0x87, 0x0a, 0xed, 0x64, 0xff, 0x5e, 0x6a, 0x48, 0x00, 0x4b, 0x04, 0xa9, 0x0c, - 0xe3, 0x6a, 0xb5, 0xaa, 0xb3, 0x7f, 0x79, 0x52, 0xd9, 0xd2, 0x69, 0xe1, 0xc4, 0xa5, 0xff, 0x3c, - 0xac, 0xd3, 0x5c, 0xa0, 0x80, 0xa0, 0xc4, 0xf1, 0x4b, 0x69, 0x18, 0xb4, 0x99, 0x50, 0xf2, 0x39, - 0x18, 0x6b, 0x91, 0x94, 0xc8, 0x77, 0x55, 0x37, 0xab, 0xe2, 0x1d, 0x2a, 0xf2, 0x9b, 0xc0, 0xe8, - 0x87, 0x0f, 0xd9, 0xd5, 0x0f, 0xfa, 0xbb, 0xf4, 0x53, 0x9d, 0xef, 0x90, 0x8d, 0x84, 0xee, 0x90, - 0xa9, 0xb6, 0x5e, 0x4a, 0x53, 0xfe, 0xfc, 0xea, 0xd8, 0x1c, 0xef, 0x60, 0xd7, 0xc6, 0x0a, 0x96, - 0x53, 0x9b, 0xad, 0x61, 0x53, 0x9c, 0x94, 0x48, 0x97, 0x6a, 0xeb, 0x2e, 0x75, 0xc7, 0xe0, 0x43, - 0x8c, 0xee, 0xb9, 0xd0, 0x6f, 0x7a, 0xa3, 0x2c, 0xb1, 0x38, 0xb7, 0xbe, 0xe4, 0xfb, 0xf1, 0xd7, - 0x63, 0x70, 0x2c, 0xe4, 0xc7, 0x21, 0xe4, 0x56, 0x77, 0xce, 0xb7, 0xf7, 0xf8, 0x1e, 0x3e, 0x63, - 0x78, 0x09, 0x12, 0x04, 0x1f, 0x75, 0xf9, 0xb7, 0x0b, 0xb9, 0x5f, 0xfa, 0x67, 0xff, 0x48, 0xa6, - 0x4e, 0xd1, 0x7e, 0x56, 0x28, 0x93, 0xd2, 0xc7, 0x7a, 0xb7, 0x5f, 0x36, 0xf8, 0x06, 0xa5, 0x7b, - 0xfb, 0xcc, 0xd8, 0x6c, 0xc3, 0xcf, 0x9f, 0x03, 0xb9, 0xc3, 0xf1, 0x93, 0xad, 0x98, 0xfb, 0x1f, - 0x78, 0xfb, 0x58, 0x8e, 0x3b, 0xdd, 0xcf, 0xdb, 0x6f, 0x06, 0x7b, 0x3c, 0x1a, 0xef, 0xc2, 0xe4, - 0x93, 0x64, 0xec, 0xa0, 0x28, 0x28, 0x16, 0xf6, 0x49, 0xff, 0xe6, 0x8c, 0xc4, 0xff, 0x77, 0x9b, - 0xb8, 0x06, 0x03, 0x81, 0x7c, 0xfc, 0xa0, 0x7b, 0x4f, 0xa1, 0xe3, 0x7e, 0x51, 0x08, 0x6d, 0x16, - 0x4a, 0x88, 0x52, 0xfe, 0x05, 0x09, 0xee, 0x68, 0x19, 0x9a, 0xaf, 0xf1, 0x8b, 0x00, 0xa1, 0xaa, - 0xa6, 0xd4, 0xdf, 0x9d, 0xbd, 0x10, 0x29, 0x61, 0xd4, 0x22, 0xec, 0xbd, 0x5d, 0x85, 0x65, 0x52, - 0x44, 0xa4, 0x7d, 0x0e, 0x0e, 0x47, 0x85, 0x15, 0x66, 0x7a, 0x1a, 0x46, 0xa2, 0x09, 0x04, 0x4f, - 0x6e, 0x0e, 0x70, 0xf7, 0x62, 0x38, 0x92, 0x44, 0xc8, 0x95, 0xe6, 0xa9, 0xf1, 0xcd, 0x53, 0x86, - 0xb4, 0x8f, 0xca, 0x8f, 0x8e, 0x3d, 0x5b, 0x27, 0xa0, 0x94, 0xbf, 0x21, 0xc1, 0x4c, 0x74, 0x84, - 0xe0, 0xe0, 0xe3, 0xbe, 0xe9, 0xfa, 0xdd, 0x36, 0x47, 0xfa, 0x9e, 0x04, 0x77, 0xee, 0xa3, 0x06, - 0xb7, 0xd9, 0x0d, 0x98, 0x08, 0x55, 0x57, 0xc5, 0x46, 0x21, 0x9c, 0xeb, 0x64, 0xf7, 0xb2, 0xb0, - 0x5f, 0x4c, 0x3c, 0x4a, 0xec, 0xf8, 0x95, 0x6f, 0x4f, 0x8f, 0xb7, 0xf6, 0xb9, 0xca, 0x78, 0x6b, - 0x45, 0xf4, 0x36, 0x7a, 0xe1, 0xef, 0x4a, 0x70, 0x5f, 0x54, 0xd5, 0x36, 0xcf, 0x60, 0xdf, 0x46, - 0x53, 0xf7, 0xef, 0x24, 0x38, 0xd9, 0x8b, 0x3e, 0x7c, 0x0e, 0xb7, 0x60, 0x3c, 0x78, 0x2c, 0xd2, - 0x3c, 0x85, 0xf7, 0xf7, 0xf1, 0x70, 0x9b, 0xc7, 0x02, 0xf2, 0xb9, 0xbd, 0x09, 0x73, 0xf5, 0x2f, - 0x24, 0x1e, 0xbf, 0x61, 0x37, 0xf1, 0x27, 0x26, 0x7a, 0xe0, 0xe9, 0x73, 0x62, 0x42, 0x87, 0x9e, - 0xe1, 0xc8, 0xa1, 0xa7, 0xcd, 0x94, 0xc7, 0x6e, 0xd3, 0x6a, 0x74, 0x8d, 0xaf, 0xd6, 0x6d, 0x9e, - 0xb3, 0xbc, 0x1f, 0xc6, 0xdb, 0x84, 0x16, 0x5f, 0x98, 0xfa, 0x88, 0x2c, 0x05, 0xb5, 0x06, 0x8f, - 0xfc, 0xaf, 0x25, 0x98, 0xa6, 0x03, 0xb7, 0x99, 0xc6, 0xb7, 0xb3, 0x3d, 0xeb, 0x7c, 0xed, 0x6d, - 0xab, 0x16, 0x37, 0xec, 0x12, 0x0c, 0x30, 0x0f, 0xe5, 0xb6, 0x3c, 0x80, 0x8b, 0x73, 0x06, 0xc1, - 0x5a, 0xbf, 0x20, 0xf4, 0x6b, 0xbf, 0x60, 0xbc, 0x49, 0x76, 0xbc, 0x5d, 0x0b, 0xc6, 0x2b, 0x62, - 0xad, 0x6f, 0xaf, 0x06, 0xb7, 0x9b, 0x76, 0xdb, 0xd6, 0x7a, 0x66, 0xc4, 0xb7, 0x68, 0x51, 0xf7, - 0x75, 0xea, 0xb2, 0xa8, 0xff, 0x88, 0xcf, 0x91, 0xbf, 0xa8, 0x77, 0xd1, 0xe7, 0xed, 0xb8, 0xa8, - 0xff, 0x49, 0x0c, 0x8e, 0x50, 0xdd, 0xc2, 0xcf, 0x1a, 0xdf, 0x82, 0xb9, 0xa9, 0x00, 0x72, 0x1d, - 0xad, 0x72, 0xbb, 0xd6, 0xa2, 0xac, 0xeb, 0x68, 0x57, 0x22, 0x3b, 0x7a, 0x05, 0x50, 0xd5, 0xf5, - 0x9a, 0x07, 0x88, 0x1f, 0x78, 0x80, 0xaa, 0xeb, 0x5d, 0xd9, 0x27, 0x65, 0x48, 0x1c, 0xd8, 0xbb, - 0x5e, 0x96, 0x20, 0xdf, 0x6e, 0x06, 0xb8, 0x37, 0xe9, 0x30, 0x19, 0x79, 0x8c, 0xde, 0xec, 0x50, - 0x0f, 0xf4, 0xf2, 0xf0, 0xb8, 0x29, 0xfc, 0x0f, 0x3b, 0xf8, 0x4d, 0x5d, 0x00, 0x7e, 0x43, 0x6c, - 0x71, 0x7e, 0xc0, 0xb4, 0x9e, 0xc6, 0x7e, 0xf4, 0xc3, 0xfe, 0x57, 0x5a, 0x76, 0x98, 0xb7, 0xc5, - 0xc1, 0xee, 0x5b, 0x12, 0x4c, 0x75, 0x10, 0xfb, 0xed, 0x9c, 0x5e, 0xec, 0x74, 0x74, 0xa9, 0xdb, - 0x7d, 0x8a, 0x3c, 0xcd, 0xe3, 0x31, 0xfa, 0xaa, 0x5e, 0xa8, 0x8a, 0xd0, 0xee, 0xe3, 0x03, 0xf2, - 0x33, 0x70, 0xb4, 0x2d, 0x15, 0x97, 0xad, 0x08, 0x89, 0x1d, 0xdd, 0xf5, 0xb8, 0x58, 0xf7, 0x74, - 0x12, 0xab, 0x89, 0x9a, 0xd2, 0xc8, 0x08, 0xb2, 0x94, 0xf5, 0xba, 0x65, 0x19, 0x5c, 0x0c, 0xf9, - 0x12, 0x8c, 0x85, 0x60, 0x7c, 0x90, 0x33, 0x90, 0xb0, 0x2d, 0xfe, 0x3d, 0x9f, 0xcc, 0xa9, 0x63, - 0x9d, 0x06, 0x21, 0x34, 0x5c, 0x6d, 0x8a, 0x2f, 0x4f, 0x00, 0x62, 0xcc, 0xe8, 0x5d, 0x2f, 0x31, - 0xc4, 0x06, 0x8c, 0x47, 0xa0, 0x7c, 0x90, 0x1f, 0x83, 0x01, 0x9b, 0x42, 0xf8, 0x30, 0x1d, 0x5f, - 0x12, 0x60, 0x74, 0x22, 0x6d, 0x63, 0x34, 0xa7, 0xbe, 0x7f, 0x18, 0x92, 0x94, 0x2b, 0xfa, 0x8c, - 0x04, 0x10, 0xba, 0xb9, 0x55, 0xe8, 0xc4, 0xa6, 0x7d, 0x35, 0x27, 0x3f, 0xdb, 0x33, 0x3e, 0xcf, - 0xbb, 0x4f, 0xfe, 0xd4, 0xbf, 0xfa, 0xee, 0xcf, 0xc6, 0xee, 0x46, 0xf2, 0x6c, 0x87, 0x3a, 0x52, - 0x28, 0x18, 0xbf, 0x2c, 0x85, 0xdf, 0x25, 0x7b, 0xb0, 0xb7, 0xa1, 0x84, 0x64, 0x85, 0x5e, 0xd1, - 0xb9, 0x60, 0xe7, 0xa8, 0x60, 0x8f, 0xa2, 0x47, 0xba, 0x0b, 0x36, 0xfb, 0x81, 0x68, 0x74, 0x7d, - 0x08, 0x7d, 0x4b, 0x82, 0x89, 0x76, 0x65, 0x02, 0x74, 0xb6, 0x37, 0x29, 0x5a, 0x13, 0xb2, 0xfc, - 0xe3, 0x07, 0xa0, 0xe4, 0xaa, 0x2c, 0x52, 0x55, 0xe6, 0xd0, 0x13, 0x07, 0x50, 0x65, 0x36, 0xb4, - 0xfb, 0xa1, 0xff, 0x2b, 0xc1, 0xf1, 0x7d, 0x8f, 0xd0, 0x68, 0xae, 0x37, 0x29, 0xf7, 0xc9, 0x3c, - 0xf3, 0xa5, 0x37, 0xc2, 0x82, 0x6b, 0xfc, 0x24, 0xd5, 0xf8, 0x12, 0x5a, 0x3a, 0x88, 0xc6, 0x41, - 0x9a, 0x18, 0xd6, 0xfd, 0xb7, 0xa5, 0xc8, 0xeb, 0x14, 0xfb, 0xbb, 0x53, 0xcb, 0xd9, 0xb1, 0x4b, - 0x60, 0xb4, 0x1e, 0x09, 0xe4, 0xa7, 0xa9, 0x0a, 0x0a, 0x5a, 0x7f, 0x83, 0x93, 0x36, 0xfb, 0x81, - 0xe8, 0xa6, 0xf2, 0x21, 0xf4, 0xbf, 0xa5, 0xf6, 0xef, 0x2f, 0x3c, 0xb6, 0xaf, 0x88, 0x9d, 0xcf, - 0xc5, 0xf9, 0xb3, 0xfd, 0x13, 0x72, 0x25, 0xeb, 0x54, 0xc9, 0x1a, 0xc2, 0xb7, 0x5b, 0xc9, 0xb6, - 0x93, 0x88, 0x7e, 0x47, 0x82, 0x89, 0x76, 0x27, 0xba, 0x2e, 0x61, 0xb9, 0xcf, 0x59, 0xb6, 0x4b, - 0x58, 0xee, 0x77, 0x7c, 0x94, 0x7f, 0x8c, 0x2a, 0x7f, 0x06, 0x9d, 0xee, 0xa4, 0xfc, 0xbe, 0xb3, - 0x48, 0x62, 0x71, 0xdf, 0x93, 0x4f, 0x97, 0x58, 0xec, 0xe5, 0x14, 0xd8, 0x25, 0x16, 0x7b, 0x3a, - 0x78, 0x75, 0x8f, 0x45, 0x5f, 0xb3, 0x1e, 0xa7, 0xd1, 0x45, 0x5f, 0x97, 0x60, 0x38, 0x92, 0x97, - 0xa3, 0x87, 0xf7, 0x15, 0xb4, 0xdd, 0x29, 0x2a, 0x7f, 0xaa, 0x1f, 0x12, 0xae, 0xcb, 0x12, 0xd5, - 0x65, 0x1e, 0xcd, 0x1d, 0x44, 0x17, 0x27, 0x22, 0xf1, 0xcb, 0x12, 0x8c, 0xb7, 0x49, 0x61, 0xbb, - 0x44, 0x61, 0xe7, 0xd4, 0x3d, 0x7f, 0xb6, 0x7f, 0x42, 0xae, 0xd5, 0x79, 0xaa, 0xd5, 0x7b, 0xd1, - 0x7b, 0x0e, 0xa2, 0x55, 0x68, 0x7f, 0xbe, 0x19, 0xdc, 0x8f, 0x0e, 0x8d, 0x83, 0xce, 0xf4, 0x29, - 0x98, 0x50, 0xe8, 0xb1, 0xbe, 0xe9, 0xb8, 0x3e, 0x4f, 0x51, 0x7d, 0x9e, 0x44, 0x6b, 0x6f, 0x4c, - 0x9f, 0xd6, 0x6d, 0xfd, 0xab, 0xad, 0x9f, 0x8a, 0xd8, 0xdf, 0x8b, 0xda, 0x26, 0xab, 0xf9, 0x47, - 0xfa, 0xa2, 0xe1, 0x4a, 0x9d, 0xa5, 0x4a, 0x9d, 0x42, 0x0f, 0x75, 0x52, 0x2a, 0x74, 0x09, 0x5e, - 0x37, 0xb7, 0xad, 0xd9, 0x0f, 0xb0, 0x14, 0xf8, 0x43, 0xe8, 0x27, 0xc5, 0x05, 0xe4, 0x13, 0xfb, - 0x8e, 0x1b, 0xca, 0x63, 0xf3, 0xf7, 0xf5, 0x80, 0xc9, 0xe5, 0xba, 0x9b, 0xca, 0x35, 0x85, 0x8e, - 0x75, 0x92, 0x8b, 0xe4, 0xb2, 0xe8, 0xe3, 0x92, 0xff, 0xce, 0xc2, 0xc9, 0xfd, 0x79, 0x87, 0x93, - 0xdd, 0xfc, 0xfd, 0x3d, 0xe1, 0x72, 0x49, 0xee, 0xa1, 0x92, 0xcc, 0xa0, 0xa9, 0x8e, 0x92, 0xb0, - 0xd4, 0xf7, 0x76, 0xdf, 0x79, 0xf9, 0x6c, 0xaa, 0xe3, 0x67, 0x51, 0x6a, 0xd8, 0xc4, 0xae, 0xee, - 0x1e, 0xe8, 0x4e, 0x72, 0x6f, 0x0f, 0x56, 0xbf, 0x95, 0x84, 0xa1, 0x45, 0x36, 0xca, 0x86, 0xa7, - 0x7a, 0x6f, 0xf0, 0x20, 0x80, 0x5c, 0xfe, 0x21, 0x43, 0x7a, 0xa5, 0xa5, 0x62, 0x5b, 0xd7, 0xb1, - 0x38, 0x2b, 0x2e, 0xf5, 0x7d, 0x19, 0x98, 0xbf, 0x9f, 0xdf, 0xcc, 0x4f, 0x66, 0xdf, 0x44, 0xa4, - 0xb7, 0x6e, 0xd6, 0x09, 0x00, 0x7d, 0x44, 0x82, 0xc3, 0x14, 0x2b, 0x88, 0x37, 0x8a, 0x29, 0xde, - 0x27, 0xec, 0xe8, 0x31, 0xcb, 0x6a, 0xa8, 0xfc, 0x43, 0x79, 0x95, 0xee, 0xe6, 0xaf, 0xb7, 0x1c, - 0x0b, 0x0d, 0xde, 0xcc, 0x56, 0x56, 0xc6, 0x8d, 0x16, 0x4a, 0xb7, 0xa9, 0x68, 0x90, 0x38, 0x78, - 0xd1, 0xe0, 0x22, 0x64, 0x42, 0x2b, 0x7d, 0x2e, 0xd9, 0xe5, 0x15, 0xde, 0xe6, 0xca, 0x62, 0x98, - 0x18, 0x7d, 0x4c, 0x82, 0xc3, 0x6d, 0x37, 0x41, 0xfa, 0x7f, 0x38, 0xfb, 0xac, 0x5c, 0x36, 0x19, - 0xa7, 0x2d, 0x5f, 0x59, 0x99, 0x68, 0xb4, 0xcb, 0x26, 0xd6, 0x61, 0x38, 0xb2, 0x81, 0xe5, 0xc4, - 0x7f, 0xd3, 0xed, 0xfd, 0x85, 0x8b, 0x28, 0x03, 0x94, 0x87, 0x14, 0xde, 0xb5, 0x2d, 0xc7, 0xc3, - 0x55, 0x7a, 0x59, 0x27, 0xa5, 0xf8, 0x6d, 0xf9, 0x3a, 0xa0, 0xd6, 0xc9, 0x45, 0x97, 0x60, 0x30, - 0x7a, 0xb5, 0xef, 0x00, 0x05, 0x0c, 0xc1, 0x01, 0x4d, 0x40, 0x32, 0xf0, 0xef, 0xb8, 0xc2, 0x1a, - 0xb7, 0x7b, 0x71, 0xf8, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xce, 0x00, 0xd4, 0xd7, 0x6f, 0x91, - 0x00, 0x00, + 0xe0, 0x15, 0x02, 0x43, 0xd3, 0x90, 0x61, 0x51, 0xa5, 0x9b, 0x55, 0xbc, 0x4b, 0xb3, 0x67, 0x52, + 0x61, 0x81, 0xb6, 0x48, 0x20, 0x64, 0xf8, 0x67, 0x5c, 0xcb, 0x14, 0xae, 0x49, 0x87, 0x20, 0x00, + 0x3a, 0xfc, 0x63, 0xcd, 0x89, 0xfb, 0x78, 0x7b, 0xf5, 0x9a, 0x7d, 0x4a, 0xfe, 0xd5, 0x18, 0x24, + 0x68, 0xbe, 0x18, 0x85, 0xcc, 0xc6, 0xfb, 0xd7, 0xca, 0x95, 0xf9, 0xd5, 0xcd, 0xd2, 0x52, 0x39, + 0x2b, 0xa1, 0x11, 0x00, 0x0a, 0xb8, 0xb0, 0xb4, 0x3a, 0xbb, 0x91, 0x8d, 0xf9, 0xed, 0xc5, 0x95, + 0x8d, 0xb3, 0x67, 0xb2, 0x71, 0x9f, 0x60, 0x93, 0x01, 0x12, 0x61, 0x84, 0x47, 0x4e, 0x67, 0x93, + 0x28, 0x0b, 0x43, 0x8c, 0xc1, 0xe2, 0xd3, 0xe5, 0xf9, 0xb3, 0x67, 0xb2, 0x03, 0x51, 0xc8, 0x23, + 0xa7, 0xb3, 0x83, 0x68, 0x18, 0xd2, 0x14, 0x52, 0x5a, 0x5d, 0x5d, 0xca, 0xa6, 0x7c, 0x9e, 0xeb, + 0x1b, 0xca, 0xe2, 0xca, 0x42, 0x36, 0xed, 0xf3, 0x5c, 0x50, 0x56, 0x37, 0xd7, 0xb2, 0xe0, 0x73, + 0x58, 0x2e, 0xaf, 0xaf, 0xcf, 0x2e, 0x94, 0xb3, 0x19, 0x1f, 0xa3, 0xf4, 0xfe, 0x8d, 0xf2, 0x7a, + 0x76, 0x28, 0x22, 0xd6, 0x23, 0xa7, 0xb3, 0xc3, 0xfe, 0x10, 0xe5, 0x95, 0xcd, 0xe5, 0xec, 0x08, + 0x1a, 0x83, 0x61, 0x36, 0x84, 0x10, 0x62, 0xb4, 0x09, 0x74, 0xf6, 0x4c, 0x36, 0x1b, 0x08, 0xc2, + 0xb8, 0x8c, 0x45, 0x00, 0x67, 0xcf, 0x64, 0x91, 0x3c, 0x07, 0x49, 0xea, 0x5d, 0x08, 0xc1, 0xc8, + 0xd2, 0x6c, 0xa9, 0xbc, 0x54, 0x59, 0x5d, 0xdb, 0x58, 0x5c, 0x5d, 0x99, 0x5d, 0xca, 0x4a, 0x01, + 0x4c, 0x29, 0x3f, 0xb9, 0xb9, 0xa8, 0x94, 0xe7, 0xb3, 0xb1, 0x30, 0x6c, 0xad, 0x3c, 0xbb, 0x51, + 0x9e, 0xcf, 0xc6, 0x65, 0x0d, 0x26, 0xda, 0xe5, 0xc9, 0xb6, 0x91, 0x11, 0x9a, 0xe2, 0x58, 0x87, + 0x29, 0xa6, 0xbc, 0x5a, 0xa6, 0xf8, 0xdb, 0x31, 0x18, 0x6f, 0xb3, 0x56, 0xb4, 0x1d, 0xe4, 0x09, + 0x48, 0x32, 0x17, 0x65, 0xab, 0xe7, 0x7d, 0x6d, 0x17, 0x1d, 0xea, 0xb0, 0x2d, 0x2b, 0x28, 0xa5, + 0x0b, 0x57, 0x10, 0xf1, 0x0e, 0x15, 0x04, 0x61, 0xd1, 0x92, 0xd3, 0x7f, 0xb4, 0x25, 0xa7, 0xb3, + 0x65, 0xef, 0x6c, 0x2f, 0xcb, 0x1e, 0x85, 0xf5, 0x97, 0xdb, 0x93, 0x6d, 0x72, 0xfb, 0x79, 0x18, + 0x6b, 0x61, 0xd4, 0x73, 0x8e, 0xfd, 0xa8, 0x04, 0xb9, 0x4e, 0xc6, 0xe9, 0x92, 0xe9, 0x62, 0x91, + 0x4c, 0x77, 0xbe, 0xd9, 0x82, 0x77, 0x76, 0x9e, 0x84, 0x96, 0xb9, 0xfe, 0xb2, 0x04, 0x93, 0xed, + 0x2b, 0xc5, 0xb6, 0x32, 0xbc, 0x17, 0x06, 0xea, 0xd8, 0xdb, 0xb1, 0x44, 0xb5, 0x74, 0x4f, 0x9b, + 0x35, 0x98, 0x74, 0x37, 0x4f, 0x36, 0xa7, 0x0a, 0x2f, 0xe2, 0xf1, 0x4e, 0xe5, 0x1e, 0x93, 0xa6, + 0x45, 0xd2, 0x4f, 0xc6, 0xe0, 0x70, 0x5b, 0xe6, 0x6d, 0x05, 0x3d, 0x0e, 0xa0, 0x9b, 0x76, 0xc3, + 0x63, 0x15, 0x11, 0x4b, 0xb0, 0x69, 0x0a, 0xa1, 0xc9, 0x8b, 0x24, 0xcf, 0x86, 0xe7, 0xf7, 0xc7, + 0x69, 0x3f, 0x30, 0x10, 0x45, 0x38, 0x17, 0x08, 0x9a, 0xa0, 0x82, 0x4e, 0x75, 0xd0, 0xb4, 0xc5, + 0x31, 0x1f, 0x82, 0xac, 0x66, 0xe8, 0xd8, 0xf4, 0x2a, 0xae, 0xe7, 0x60, 0xb5, 0xae, 0x9b, 0x35, + 0xba, 0x82, 0xa4, 0x8a, 0xc9, 0x6d, 0xd5, 0x70, 0xb1, 0x32, 0xca, 0xba, 0xd7, 0x45, 0x2f, 0xa1, + 0xa0, 0x0e, 0xe4, 0x84, 0x28, 0x06, 0x22, 0x14, 0xac, 0xdb, 0xa7, 0x90, 0x7f, 0x3a, 0x0d, 0x99, + 0x50, 0x5d, 0x8d, 0xee, 0x84, 0xa1, 0x67, 0xd4, 0x6b, 0x6a, 0x45, 0xec, 0x95, 0x98, 0x25, 0x32, + 0x04, 0xb6, 0xc6, 0xf7, 0x4b, 0x0f, 0xc1, 0x04, 0x45, 0xb1, 0x1a, 0x1e, 0x76, 0x2a, 0x9a, 0xa1, + 0xba, 0x2e, 0x35, 0x5a, 0x8a, 0xa2, 0x22, 0xd2, 0xb7, 0x4a, 0xba, 0xe6, 0x44, 0x0f, 0x7a, 0x14, + 0xc6, 0x29, 0x45, 0xbd, 0x61, 0x78, 0xba, 0x6d, 0xe0, 0x0a, 0xd9, 0xbd, 0xb9, 0x74, 0x25, 0xf1, + 0x25, 0x1b, 0x23, 0x18, 0xcb, 0x1c, 0x81, 0x48, 0xe4, 0xa2, 0x79, 0x38, 0x4e, 0xc9, 0x6a, 0xd8, + 0xc4, 0x8e, 0xea, 0xe1, 0x0a, 0x7e, 0xb6, 0xa1, 0x1a, 0x6e, 0x45, 0x35, 0xab, 0x95, 0x1d, 0xd5, + 0xdd, 0xc9, 0x4d, 0x10, 0x06, 0xa5, 0x58, 0x4e, 0x52, 0x8e, 0x10, 0xc4, 0x05, 0x8e, 0x57, 0xa6, + 0x68, 0xb3, 0x66, 0xf5, 0xa2, 0xea, 0xee, 0xa0, 0x22, 0x4c, 0x52, 0x2e, 0xae, 0xe7, 0xe8, 0x66, + 0xad, 0xa2, 0xed, 0x60, 0xed, 0x6a, 0xa5, 0xe1, 0x6d, 0x9f, 0xcb, 0x1d, 0x0d, 0x8f, 0x4f, 0x25, + 0x5c, 0xa7, 0x38, 0x73, 0x04, 0x65, 0xd3, 0xdb, 0x3e, 0x87, 0xd6, 0x61, 0x88, 0x4c, 0x46, 0x5d, + 0xbf, 0x81, 0x2b, 0xdb, 0x96, 0x43, 0x97, 0xc6, 0x91, 0x36, 0xa9, 0x29, 0x64, 0xc1, 0xc2, 0x2a, + 0x27, 0x58, 0xb6, 0xaa, 0xb8, 0x98, 0x5c, 0x5f, 0x2b, 0x97, 0xe7, 0x95, 0x8c, 0xe0, 0x72, 0xc1, + 0x72, 0x88, 0x43, 0xd5, 0x2c, 0xdf, 0xc0, 0x19, 0xe6, 0x50, 0x35, 0x4b, 0x98, 0xf7, 0x51, 0x18, + 0xd7, 0x34, 0xa6, 0xb3, 0xae, 0x55, 0xf8, 0x1e, 0xcb, 0xcd, 0x65, 0x23, 0xc6, 0xd2, 0xb4, 0x05, + 0x86, 0xc0, 0x7d, 0xdc, 0x45, 0x8f, 0xc3, 0xe1, 0xc0, 0x58, 0x61, 0xc2, 0xb1, 0x16, 0x2d, 0x9b, + 0x49, 0x1f, 0x85, 0x71, 0x7b, 0xaf, 0x95, 0x10, 0x45, 0x46, 0xb4, 0xf7, 0x9a, 0xc9, 0x1e, 0x83, + 0x09, 0x7b, 0xc7, 0x6e, 0xa5, 0x3b, 0x15, 0xa6, 0x43, 0xf6, 0x8e, 0xdd, 0x4c, 0xf8, 0x2e, 0xba, + 0xe1, 0x76, 0xb0, 0xa6, 0x7a, 0xb8, 0x9a, 0xbb, 0x23, 0x8c, 0x1e, 0xea, 0x40, 0x33, 0x90, 0xd5, + 0xb4, 0x0a, 0x36, 0xd5, 0x2d, 0x03, 0x57, 0x54, 0x07, 0x9b, 0xaa, 0x9b, 0x9b, 0x0e, 0x23, 0x8f, + 0x68, 0x5a, 0x99, 0xf6, 0xce, 0xd2, 0x4e, 0x74, 0x0a, 0xc6, 0xac, 0xad, 0x67, 0x34, 0xe6, 0x92, + 0x15, 0xdb, 0xc1, 0xdb, 0xfa, 0x6e, 0xee, 0x6e, 0x6a, 0xdf, 0x51, 0xd2, 0x41, 0x1d, 0x72, 0x8d, + 0x82, 0xd1, 0x7d, 0x90, 0xd5, 0xdc, 0x1d, 0xd5, 0xb1, 0x69, 0x4e, 0x76, 0x6d, 0x55, 0xc3, 0xb9, + 0x77, 0x31, 0x54, 0x06, 0x5f, 0x11, 0x60, 0x12, 0x12, 0xee, 0x75, 0x7d, 0xdb, 0x13, 0x1c, 0xef, + 0x65, 0x21, 0x41, 0x61, 0x9c, 0xdb, 0x49, 0xc8, 0x12, 0x53, 0x44, 0x06, 0x3e, 0x49, 0xd1, 0x46, + 0xec, 0x1d, 0x3b, 0x3c, 0xee, 0x5d, 0x30, 0x4c, 0x30, 0x83, 0x41, 0xef, 0x63, 0x05, 0x99, 0xbd, + 0x13, 0x1a, 0xf1, 0x0c, 0x4c, 0x12, 0xa4, 0x3a, 0xf6, 0xd4, 0xaa, 0xea, 0xa9, 0x21, 0xec, 0x07, + 0x28, 0x36, 0xb1, 0xfb, 0x32, 0xef, 0x8c, 0xc8, 0xe9, 0x34, 0xb6, 0xf6, 0x7c, 0xcf, 0x7a, 0x90, + 0xc9, 0x49, 0x60, 0xc2, 0xb7, 0xde, 0xb4, 0xa2, 0x5b, 0x2e, 0xc2, 0x50, 0xd8, 0xf1, 0x51, 0x1a, + 0x98, 0xeb, 0x67, 0x25, 0x52, 0x05, 0xcd, 0xad, 0xce, 0x93, 0xfa, 0xe5, 0x03, 0xe5, 0x6c, 0x8c, + 0xd4, 0x51, 0x4b, 0x8b, 0x1b, 0xe5, 0x8a, 0xb2, 0xb9, 0xb2, 0xb1, 0xb8, 0x5c, 0xce, 0xc6, 0x43, + 0x05, 0xfb, 0xa5, 0x44, 0xea, 0x9e, 0xec, 0xbd, 0xf2, 0x2b, 0x31, 0x18, 0x89, 0xee, 0xc0, 0xd0, + 0xbb, 0xe1, 0x0e, 0x71, 0x5c, 0xe2, 0x62, 0xaf, 0x72, 0x5d, 0x77, 0x68, 0x44, 0xd6, 0x55, 0xb6, + 0x3a, 0xfa, 0x3e, 0x31, 0xc1, 0xb1, 0xd6, 0xb1, 0xf7, 0x94, 0xee, 0x90, 0x78, 0xab, 0xab, 0x1e, + 0x5a, 0x82, 0x69, 0xd3, 0xaa, 0xb8, 0x9e, 0x6a, 0x56, 0x55, 0xa7, 0x5a, 0x09, 0x0e, 0xaa, 0x2a, + 0xaa, 0xa6, 0x61, 0xd7, 0xb5, 0xd8, 0x4a, 0xe8, 0x73, 0x39, 0x66, 0x5a, 0xeb, 0x1c, 0x39, 0x58, + 0x22, 0x66, 0x39, 0x6a, 0x93, 0xff, 0xc6, 0x3b, 0xf9, 0xef, 0x51, 0x48, 0xd7, 0x55, 0xbb, 0x82, + 0x4d, 0xcf, 0xd9, 0xa3, 0x75, 0x77, 0x4a, 0x49, 0xd5, 0x55, 0xbb, 0x4c, 0xda, 0x6f, 0xc9, 0xf6, + 0xe7, 0x52, 0x22, 0x95, 0xca, 0xa6, 0x2f, 0x25, 0x52, 0xe9, 0x2c, 0xc8, 0xaf, 0xc6, 0x61, 0x28, + 0x5c, 0x87, 0x93, 0x6d, 0x8d, 0x46, 0x97, 0x2c, 0x89, 0x26, 0xb5, 0xbb, 0xf6, 0xad, 0xda, 0x0b, + 0x73, 0x64, 0x2d, 0x2b, 0x0e, 0xb0, 0xea, 0x58, 0x61, 0x94, 0xa4, 0x8e, 0x20, 0xce, 0x86, 0x59, + 0x35, 0x92, 0x52, 0x78, 0x0b, 0x2d, 0xc0, 0xc0, 0x33, 0x2e, 0xe5, 0x3d, 0x40, 0x79, 0xdf, 0xbd, + 0x3f, 0xef, 0x4b, 0xeb, 0x94, 0x79, 0xfa, 0xd2, 0x7a, 0x65, 0x65, 0x55, 0x59, 0x9e, 0x5d, 0x52, + 0x38, 0x39, 0x3a, 0x02, 0x09, 0x43, 0xbd, 0xb1, 0x17, 0x5d, 0xf5, 0x28, 0xa8, 0xd7, 0x49, 0x38, + 0x02, 0x89, 0xeb, 0x58, 0xbd, 0x1a, 0x5d, 0x6b, 0x28, 0xe8, 0x4d, 0x0c, 0x86, 0x19, 0x48, 0x52, + 0x7b, 0x21, 0x00, 0x6e, 0xb1, 0xec, 0x21, 0x94, 0x82, 0xc4, 0xdc, 0xaa, 0x42, 0x02, 0x22, 0x0b, + 0x43, 0x0c, 0x5a, 0x59, 0x5b, 0x2c, 0xcf, 0x95, 0xb3, 0x31, 0xf9, 0x51, 0x18, 0x60, 0x46, 0x20, + 0xc1, 0xe2, 0x9b, 0x21, 0x7b, 0x88, 0x37, 0x39, 0x0f, 0x49, 0xf4, 0x6e, 0x2e, 0x97, 0xca, 0x4a, + 0x36, 0x16, 0x9d, 0xea, 0x44, 0x36, 0x29, 0xbb, 0x30, 0x14, 0x2e, 0xc4, 0xdf, 0x9a, 0x4d, 0xf6, + 0xd7, 0x24, 0xc8, 0x84, 0x0a, 0x6b, 0x52, 0x11, 0xa9, 0x86, 0x61, 0x5d, 0xaf, 0xa8, 0x86, 0xae, + 0xba, 0xdc, 0x35, 0x80, 0x82, 0x66, 0x09, 0xa4, 0xd7, 0xa9, 0x7b, 0x8b, 0x42, 0x24, 0x99, 0x1d, + 0x90, 0x3f, 0x2f, 0x41, 0xb6, 0xb9, 0xb2, 0x6d, 0x12, 0x53, 0xfa, 0x41, 0x8a, 0x29, 0x7f, 0x4e, + 0x82, 0x91, 0x68, 0x39, 0xdb, 0x24, 0xde, 0x9d, 0x3f, 0x50, 0xf1, 0xfe, 0x20, 0x06, 0xc3, 0x91, + 0x22, 0xb6, 0x57, 0xe9, 0x9e, 0x85, 0x31, 0xbd, 0x8a, 0xeb, 0xb6, 0xe5, 0x61, 0x53, 0xdb, 0xab, + 0x18, 0xf8, 0x1a, 0x36, 0x72, 0x32, 0x4d, 0x1a, 0x33, 0xfb, 0x97, 0xc9, 0x85, 0xc5, 0x80, 0x6e, + 0x89, 0x90, 0x15, 0xc7, 0x17, 0xe7, 0xcb, 0xcb, 0x6b, 0xab, 0x1b, 0xe5, 0x95, 0xb9, 0xf7, 0x57, + 0x36, 0x57, 0x2e, 0xaf, 0xac, 0x3e, 0xb5, 0xa2, 0x64, 0xf5, 0x26, 0xb4, 0x37, 0x31, 0xec, 0xd7, + 0x20, 0xdb, 0x2c, 0x14, 0xba, 0x03, 0xda, 0x89, 0x95, 0x3d, 0x84, 0xc6, 0x61, 0x74, 0x65, 0xb5, + 0xb2, 0xbe, 0x38, 0x5f, 0xae, 0x94, 0x2f, 0x5c, 0x28, 0xcf, 0x6d, 0xac, 0xb3, 0x83, 0x0f, 0x1f, + 0x7b, 0x23, 0x12, 0xe0, 0xf2, 0x67, 0xe3, 0x30, 0xde, 0x46, 0x12, 0x34, 0xcb, 0xb7, 0x2c, 0x6c, + 0x17, 0xf5, 0x60, 0x2f, 0xd2, 0x17, 0x48, 0xcd, 0xb0, 0xa6, 0x3a, 0x1e, 0xdf, 0xe1, 0xdc, 0x07, + 0xc4, 0x4a, 0xa6, 0xa7, 0x6f, 0xeb, 0xd8, 0xe1, 0xe7, 0x44, 0x6c, 0x1f, 0x33, 0x1a, 0xc0, 0xd9, + 0x51, 0xd1, 0x03, 0x80, 0x6c, 0xcb, 0xd5, 0x3d, 0xfd, 0x1a, 0xae, 0xe8, 0xa6, 0x38, 0x54, 0x22, + 0xfb, 0x9a, 0x84, 0x92, 0x15, 0x3d, 0x8b, 0xa6, 0xe7, 0x63, 0x9b, 0xb8, 0xa6, 0x36, 0x61, 0x93, + 0x64, 0x1e, 0x57, 0xb2, 0xa2, 0xc7, 0xc7, 0xbe, 0x13, 0x86, 0xaa, 0x56, 0x83, 0x14, 0x7b, 0x0c, + 0x8f, 0xac, 0x1d, 0x92, 0x92, 0x61, 0x30, 0x1f, 0x85, 0x97, 0xf1, 0xc1, 0x69, 0xd6, 0x90, 0x92, + 0x61, 0x30, 0x86, 0x72, 0x2f, 0x8c, 0xaa, 0xb5, 0x9a, 0x43, 0x98, 0x0b, 0x46, 0x6c, 0x63, 0x32, + 0xe2, 0x83, 0x29, 0x62, 0xfe, 0x12, 0xa4, 0x84, 0x1d, 0xc8, 0x52, 0x4d, 0x2c, 0x51, 0xb1, 0xd9, + 0x6e, 0x3b, 0x76, 0x32, 0xad, 0xa4, 0x4c, 0xd1, 0x79, 0x27, 0x0c, 0xe9, 0x6e, 0x25, 0x38, 0x9c, + 0x8f, 0x9d, 0x88, 0x9d, 0x4c, 0x29, 0x19, 0xdd, 0xf5, 0x0f, 0x36, 0xe5, 0x2f, 0xc7, 0x60, 0x24, + 0xfa, 0x70, 0x01, 0xcd, 0x43, 0xca, 0xb0, 0x34, 0x95, 0xba, 0x16, 0x7b, 0xb2, 0x75, 0xb2, 0xcb, + 0xf3, 0x88, 0xc2, 0x12, 0xc7, 0x57, 0x7c, 0xca, 0xfc, 0xbf, 0x92, 0x20, 0x25, 0xc0, 0x68, 0x12, + 0x12, 0xb6, 0xea, 0xed, 0x50, 0x76, 0xc9, 0x52, 0x2c, 0x2b, 0x29, 0xb4, 0x4d, 0xe0, 0xae, 0xad, + 0x9a, 0xd4, 0x05, 0x38, 0x9c, 0xb4, 0xc9, 0xbc, 0x1a, 0x58, 0xad, 0xd2, 0x5d, 0x8f, 0x55, 0xaf, + 0x63, 0xd3, 0x73, 0xc5, 0xbc, 0x72, 0xf8, 0x1c, 0x07, 0xa3, 0xfb, 0x61, 0xcc, 0x73, 0x54, 0xdd, + 0x88, 0xe0, 0x26, 0x28, 0x6e, 0x56, 0x74, 0xf8, 0xc8, 0x45, 0x38, 0x22, 0xf8, 0x56, 0xb1, 0xa7, + 0x6a, 0x3b, 0xb8, 0x1a, 0x10, 0x0d, 0xd0, 0xd3, 0x8d, 0x3b, 0x38, 0xc2, 0x3c, 0xef, 0x17, 0xb4, + 0xf2, 0x2b, 0x12, 0x8c, 0x89, 0x7d, 0x5a, 0xd5, 0x37, 0xd6, 0x32, 0x80, 0x6a, 0x9a, 0x96, 0x17, + 0x36, 0x57, 0xab, 0x2b, 0xb7, 0xd0, 0x15, 0x66, 0x7d, 0x22, 0x25, 0xc4, 0x20, 0x5f, 0x07, 0x08, + 0x7a, 0x3a, 0x9a, 0x6d, 0x1a, 0x32, 0xfc, 0xc9, 0x11, 0x7d, 0xfc, 0xc8, 0x76, 0xf6, 0xc0, 0x40, + 0x64, 0x43, 0x87, 0x26, 0x20, 0xb9, 0x85, 0x6b, 0xba, 0xc9, 0xcf, 0x83, 0x59, 0x43, 0x9c, 0xbf, + 0x24, 0xfc, 0xf3, 0x97, 0xd2, 0xa7, 0x24, 0x18, 0xd7, 0xac, 0x7a, 0xb3, 0xbc, 0xa5, 0x6c, 0xd3, + 0xf1, 0x82, 0x7b, 0x51, 0xfa, 0xc0, 0x7b, 0x6b, 0xba, 0xb7, 0xd3, 0xd8, 0x2a, 0x68, 0x56, 0x7d, + 0xa6, 0x66, 0x19, 0xaa, 0x59, 0x0b, 0x9e, 0x9f, 0xd2, 0x1f, 0xda, 0x83, 0x35, 0x6c, 0x3e, 0x58, + 0xb3, 0x42, 0x4f, 0x53, 0xcf, 0x07, 0x3f, 0xff, 0xaf, 0x24, 0x7d, 0x31, 0x16, 0x5f, 0x58, 0x2b, + 0x7d, 0x25, 0x96, 0x5f, 0x60, 0xc3, 0xad, 0x09, 0xf3, 0x28, 0x78, 0xdb, 0xc0, 0x1a, 0x51, 0x19, + 0xbe, 0x77, 0x3f, 0x4c, 0xd4, 0xac, 0x9a, 0x45, 0x39, 0xce, 0x90, 0x5f, 0xfc, 0x89, 0x6c, 0xda, + 0x87, 0xe6, 0xbb, 0x3e, 0xbe, 0x2d, 0xae, 0xc0, 0x38, 0x47, 0xae, 0xd0, 0x47, 0x42, 0x6c, 0x63, + 0x83, 0xf6, 0x3d, 0x56, 0xcb, 0xfd, 0xf2, 0x77, 0xe8, 0x82, 0xae, 0x8c, 0x71, 0x52, 0xd2, 0xc7, + 0xf6, 0x3e, 0x45, 0x05, 0x0e, 0x47, 0xf8, 0xb1, 0xb0, 0xc5, 0x4e, 0x17, 0x8e, 0xbf, 0xc9, 0x39, + 0x8e, 0x87, 0x38, 0xae, 0x73, 0xd2, 0xe2, 0x1c, 0x0c, 0xf7, 0xc3, 0xeb, 0xb7, 0x38, 0xaf, 0x21, + 0x1c, 0x66, 0xb2, 0x00, 0xa3, 0x94, 0x89, 0xd6, 0x70, 0x3d, 0xab, 0x4e, 0x73, 0xe2, 0xfe, 0x6c, + 0x7e, 0xfb, 0x3b, 0x2c, 0x8e, 0x46, 0x08, 0xd9, 0x9c, 0x4f, 0x55, 0x2c, 0x02, 0x7d, 0x0a, 0x56, + 0xc5, 0x9a, 0xd1, 0x85, 0xc3, 0x37, 0xb8, 0x20, 0x3e, 0x7e, 0xf1, 0x0a, 0x4c, 0x90, 0xdf, 0x34, + 0x65, 0x85, 0x25, 0xe9, 0x7e, 0x06, 0x97, 0x7b, 0xe5, 0xa3, 0x2c, 0x54, 0xc7, 0x7d, 0x06, 0x21, + 0x99, 0x42, 0xb3, 0x58, 0xc3, 0x9e, 0x87, 0x1d, 0xb7, 0xa2, 0x1a, 0xed, 0xc4, 0x0b, 0x1d, 0x62, + 0xe4, 0x3e, 0xf3, 0xfd, 0xe8, 0x2c, 0x2e, 0x30, 0xca, 0x59, 0xc3, 0x28, 0x6e, 0xc2, 0x1d, 0x6d, + 0xbc, 0xa2, 0x07, 0x9e, 0x9f, 0xe5, 0x3c, 0x27, 0x5a, 0x3c, 0x83, 0xb0, 0x5d, 0x03, 0x01, 0xf7, + 0xe7, 0xb2, 0x07, 0x9e, 0x3f, 0xc7, 0x79, 0x22, 0x4e, 0x2b, 0xa6, 0x94, 0x70, 0xbc, 0x04, 0x63, + 0xd7, 0xb0, 0xb3, 0x65, 0xb9, 0xfc, 0xe0, 0xa8, 0x07, 0x76, 0x9f, 0xe3, 0xec, 0x46, 0x39, 0x21, + 0x3d, 0x49, 0x22, 0xbc, 0x1e, 0x87, 0xd4, 0xb6, 0xaa, 0xe1, 0x1e, 0x58, 0xbc, 0xc8, 0x59, 0x0c, + 0x12, 0x7c, 0x42, 0x3a, 0x0b, 0x43, 0x35, 0x8b, 0xaf, 0x5a, 0xdd, 0xc9, 0x3f, 0xcf, 0xc9, 0x33, + 0x82, 0x86, 0xb3, 0xb0, 0x2d, 0xbb, 0x61, 0x90, 0x25, 0xad, 0x3b, 0x8b, 0xbf, 0x2a, 0x58, 0x08, + 0x1a, 0xce, 0xa2, 0x0f, 0xb3, 0xbe, 0x24, 0x58, 0xb8, 0x21, 0x7b, 0x3e, 0x01, 0x19, 0xcb, 0x34, + 0xf6, 0x2c, 0xb3, 0x17, 0x21, 0xbe, 0xc0, 0x39, 0x00, 0x27, 0x21, 0x0c, 0xce, 0x43, 0xba, 0xd7, + 0x89, 0xf8, 0xeb, 0xdf, 0x17, 0xe1, 0x21, 0x66, 0x60, 0x01, 0x46, 0x45, 0x82, 0xd2, 0x2d, 0xb3, + 0x07, 0x16, 0x7f, 0x83, 0xb3, 0x18, 0x09, 0x91, 0x71, 0x35, 0x3c, 0xec, 0x7a, 0x35, 0xdc, 0x0b, + 0x93, 0x2f, 0x0b, 0x35, 0x38, 0x09, 0x37, 0xe5, 0x16, 0x36, 0xb5, 0x9d, 0xde, 0x38, 0xfc, 0xbc, + 0x30, 0xa5, 0xa0, 0x21, 0x2c, 0xe6, 0x60, 0xb8, 0xae, 0x3a, 0xee, 0x8e, 0x6a, 0xf4, 0x34, 0x1d, + 0x7f, 0x93, 0xf3, 0x18, 0xf2, 0x89, 0xb8, 0x45, 0x1a, 0x66, 0x3f, 0x6c, 0xbe, 0x22, 0x2c, 0x12, + 0x22, 0xe3, 0xa1, 0xe7, 0x7a, 0xf4, 0x94, 0xad, 0x1f, 0x6e, 0xbf, 0x20, 0x42, 0x8f, 0xd1, 0x2e, + 0x87, 0x39, 0x9e, 0x87, 0xb4, 0xab, 0xdf, 0xe8, 0x89, 0xcd, 0xdf, 0x12, 0x33, 0x4d, 0x09, 0x08, + 0xf1, 0xfb, 0xe1, 0x48, 0xdb, 0x65, 0xa2, 0x07, 0x66, 0x7f, 0x9b, 0x33, 0x9b, 0x6c, 0xb3, 0x54, + 0xf0, 0x94, 0xd0, 0x2f, 0xcb, 0xbf, 0x23, 0x52, 0x02, 0x6e, 0xe2, 0xb5, 0x46, 0xf6, 0x11, 0xae, + 0xba, 0xdd, 0x9f, 0xd5, 0x7e, 0x51, 0x58, 0x8d, 0xd1, 0x46, 0xac, 0xb6, 0x01, 0x93, 0x9c, 0x63, + 0x7f, 0xf3, 0xfa, 0x4b, 0x22, 0xb1, 0x32, 0xea, 0xcd, 0xe8, 0xec, 0x7e, 0x10, 0xf2, 0xbe, 0x39, + 0x45, 0xc1, 0xea, 0x56, 0xea, 0xaa, 0xdd, 0x03, 0xe7, 0x5f, 0xe6, 0x9c, 0x45, 0xc6, 0xf7, 0x2b, + 0x5e, 0x77, 0x59, 0xb5, 0x09, 0xf3, 0xa7, 0x21, 0x27, 0x98, 0x37, 0x4c, 0x07, 0x6b, 0x56, 0xcd, + 0xd4, 0x6f, 0xe0, 0x6a, 0x0f, 0xac, 0xff, 0x6e, 0xd3, 0x54, 0x6d, 0x86, 0xc8, 0x09, 0xe7, 0x45, + 0xc8, 0xfa, 0xb5, 0x4a, 0x45, 0xaf, 0xdb, 0x96, 0xe3, 0x75, 0xe1, 0xf8, 0x55, 0x31, 0x53, 0x3e, + 0xdd, 0x22, 0x25, 0x2b, 0x96, 0x61, 0x84, 0x36, 0x7b, 0x75, 0xc9, 0x5f, 0xe1, 0x8c, 0x86, 0x03, + 0x2a, 0x9e, 0x38, 0x34, 0xab, 0x6e, 0xab, 0x4e, 0x2f, 0xf9, 0xef, 0xef, 0x89, 0xc4, 0xc1, 0x49, + 0x78, 0xe2, 0xf0, 0xf6, 0x6c, 0x4c, 0x56, 0xfb, 0x1e, 0x38, 0xfc, 0xaa, 0x48, 0x1c, 0x82, 0x86, + 0xb3, 0x10, 0x05, 0x43, 0x0f, 0x2c, 0xfe, 0xbe, 0x60, 0x21, 0x68, 0x08, 0x8b, 0x27, 0x83, 0x85, + 0xd6, 0xc1, 0x35, 0xdd, 0xf5, 0x1c, 0x56, 0x26, 0xef, 0xcf, 0xea, 0x1f, 0x7c, 0x3f, 0x5a, 0x84, + 0x29, 0x21, 0x52, 0x92, 0x89, 0xf8, 0xb1, 0x2b, 0xdd, 0x45, 0x75, 0x17, 0xec, 0xd7, 0x44, 0x26, + 0x0a, 0x91, 0x11, 0xd9, 0x42, 0x15, 0x22, 0x31, 0xbb, 0x46, 0xf6, 0x0e, 0x3d, 0xb0, 0xfb, 0x87, + 0x4d, 0xc2, 0xad, 0x0b, 0x5a, 0xc2, 0x33, 0x54, 0xff, 0x34, 0xcc, 0xab, 0x78, 0xaf, 0x27, 0xef, + 0xfc, 0xf5, 0xa6, 0xfa, 0x67, 0x93, 0x51, 0xb2, 0x1c, 0x32, 0xda, 0x54, 0x4f, 0xa1, 0x6e, 0xf7, + 0x87, 0x72, 0x3f, 0xf6, 0x1a, 0xd7, 0x37, 0x5a, 0x4e, 0x15, 0x97, 0x88, 0x93, 0x47, 0x8b, 0x9e, + 0xee, 0xcc, 0x3e, 0xfa, 0x9a, 0xef, 0xe7, 0x91, 0x9a, 0xa7, 0x78, 0x01, 0x86, 0x23, 0x05, 0x4f, + 0x77, 0x56, 0x1f, 0xe3, 0xac, 0x86, 0xc2, 0xf5, 0x4e, 0xf1, 0x51, 0x48, 0x90, 0xe2, 0xa5, 0x3b, + 0xf9, 0xc7, 0x39, 0x39, 0x45, 0x2f, 0xbe, 0x07, 0x52, 0xa2, 0x68, 0xe9, 0x4e, 0xfa, 0x09, 0x4e, + 0xea, 0x93, 0x10, 0x72, 0x51, 0xb0, 0x74, 0x27, 0xff, 0xf3, 0x82, 0x5c, 0x90, 0x10, 0xf2, 0xde, + 0x4d, 0xf8, 0xb5, 0xbf, 0x90, 0xe0, 0x8b, 0x8e, 0xb0, 0xdd, 0x79, 0x18, 0xe4, 0x95, 0x4a, 0x77, + 0xea, 0x4f, 0xf2, 0xc1, 0x05, 0x45, 0xf1, 0x31, 0x48, 0xf6, 0x68, 0xf0, 0x9f, 0xe4, 0xa4, 0x0c, + 0xbf, 0x38, 0x07, 0x99, 0x50, 0x75, 0xd2, 0x9d, 0xfc, 0x2f, 0x71, 0xf2, 0x30, 0x15, 0x11, 0x9d, + 0x57, 0x27, 0xdd, 0x19, 0x7c, 0x4a, 0x88, 0xce, 0x29, 0x88, 0xd9, 0x44, 0x61, 0xd2, 0x9d, 0xfa, + 0xd3, 0xc2, 0xea, 0x82, 0xa4, 0xf8, 0x04, 0xa4, 0xfd, 0xc5, 0xa6, 0x3b, 0xfd, 0x4f, 0x71, 0xfa, + 0x80, 0x86, 0x58, 0x20, 0xb4, 0xd8, 0x75, 0x67, 0xf1, 0xd3, 0xc2, 0x02, 0x21, 0x2a, 0x12, 0x46, + 0xcd, 0x05, 0x4c, 0x77, 0x4e, 0x3f, 0x23, 0xc2, 0xa8, 0xa9, 0x7e, 0x21, 0xb3, 0x49, 0x73, 0x7e, + 0x77, 0x16, 0x3f, 0x2b, 0x66, 0x93, 0xe2, 0x13, 0x31, 0x9a, 0x2b, 0x82, 0xee, 0x3c, 0xfe, 0x8a, + 0x10, 0xa3, 0xa9, 0x20, 0x28, 0xae, 0x01, 0x6a, 0xad, 0x06, 0xba, 0xf3, 0x7b, 0x81, 0xf3, 0x1b, + 0x6b, 0x29, 0x06, 0x8a, 0x4f, 0xc1, 0x64, 0xfb, 0x4a, 0xa0, 0x3b, 0xd7, 0xcf, 0xbc, 0xd6, 0xb4, + 0x77, 0x0b, 0x17, 0x02, 0xc5, 0x8d, 0x60, 0x49, 0x09, 0x57, 0x01, 0xdd, 0xd9, 0x7e, 0xf6, 0xb5, + 0x68, 0xe2, 0x0e, 0x17, 0x01, 0xc5, 0x59, 0x80, 0x60, 0x01, 0xee, 0xce, 0xeb, 0x73, 0x9c, 0x57, + 0x88, 0x88, 0x84, 0x06, 0x5f, 0x7f, 0xbb, 0xd3, 0xbf, 0x28, 0x42, 0x83, 0x53, 0x90, 0xd0, 0x10, + 0x4b, 0x6f, 0x77, 0xea, 0xcf, 0x8b, 0xd0, 0x10, 0x24, 0xc4, 0xb3, 0x43, 0xab, 0x5b, 0x77, 0x0e, + 0x5f, 0x10, 0x9e, 0x1d, 0xa2, 0x2a, 0xae, 0xc0, 0x58, 0xcb, 0x82, 0xd8, 0x9d, 0xd5, 0x17, 0x39, + 0xab, 0x6c, 0xf3, 0x7a, 0x18, 0x5e, 0xbc, 0xf8, 0x62, 0xd8, 0x9d, 0xdb, 0x97, 0x9a, 0x16, 0x2f, + 0xbe, 0x16, 0x16, 0xcf, 0x43, 0xca, 0x6c, 0x18, 0x06, 0x09, 0x1e, 0xb4, 0xff, 0x9d, 0xbf, 0xdc, + 0x1f, 0xbe, 0xce, 0xad, 0x23, 0x08, 0x8a, 0x8f, 0x42, 0x12, 0xd7, 0xb7, 0x70, 0xb5, 0x1b, 0xe5, + 0xf7, 0x5e, 0x17, 0x09, 0x93, 0x60, 0x17, 0x9f, 0x00, 0x60, 0x47, 0x23, 0xf4, 0xf1, 0x60, 0x17, + 0xda, 0xff, 0xfa, 0x3a, 0xbf, 0x8d, 0x13, 0x90, 0x04, 0x0c, 0xd8, 0xdd, 0x9e, 0xfd, 0x19, 0x7c, + 0x3f, 0xca, 0x80, 0xce, 0xc8, 0xe3, 0x30, 0xf8, 0x8c, 0x6b, 0x99, 0x9e, 0x5a, 0xeb, 0x46, 0xfd, + 0xdf, 0x38, 0xb5, 0xc0, 0x27, 0x06, 0xab, 0x5b, 0x0e, 0xf6, 0xd4, 0x9a, 0xdb, 0x8d, 0xf6, 0xbf, + 0x73, 0x5a, 0x9f, 0x80, 0x10, 0x6b, 0xaa, 0xeb, 0xf5, 0xa2, 0xf7, 0x1f, 0x09, 0x62, 0x41, 0x40, + 0x84, 0x26, 0xbf, 0xaf, 0xe2, 0xbd, 0x6e, 0xb4, 0x7f, 0x2c, 0x84, 0xe6, 0xf8, 0xc5, 0xf7, 0x40, + 0x9a, 0xfc, 0x64, 0x57, 0xec, 0xba, 0x10, 0xff, 0x0f, 0x4e, 0x1c, 0x50, 0x90, 0x91, 0x5d, 0xaf, + 0xea, 0xe9, 0xdd, 0x8d, 0x7d, 0x8b, 0xcf, 0xb4, 0xc0, 0x2f, 0xce, 0x42, 0xc6, 0xf5, 0xaa, 0xd5, + 0x06, 0xaf, 0x4f, 0xbb, 0x90, 0xff, 0xcf, 0xd7, 0xfd, 0x23, 0x0b, 0x9f, 0x86, 0xcc, 0xf6, 0xf5, + 0xab, 0x9e, 0x6d, 0xd1, 0x47, 0x20, 0xdd, 0x38, 0xbc, 0xc6, 0x39, 0x84, 0x48, 0x8a, 0x73, 0x30, + 0x44, 0x74, 0x71, 0xb0, 0x8d, 0xe9, 0xf3, 0xaa, 0x2e, 0x2c, 0xfe, 0x17, 0x37, 0x40, 0x84, 0xa8, + 0xf4, 0xa3, 0xdf, 0x78, 0x75, 0x4a, 0x7a, 0xf9, 0xd5, 0x29, 0xe9, 0x0f, 0x5e, 0x9d, 0x92, 0x3e, + 0xfd, 0xed, 0xa9, 0x43, 0x2f, 0x7f, 0x7b, 0xea, 0xd0, 0xef, 0x7d, 0x7b, 0xea, 0x50, 0xfb, 0x63, + 0x63, 0x58, 0xb0, 0x16, 0x2c, 0x76, 0x60, 0xfc, 0x01, 0x39, 0x72, 0x5c, 0x5c, 0xb3, 0x82, 0xd3, + 0x5a, 0x7f, 0x93, 0x03, 0x1f, 0x8b, 0xc3, 0x94, 0x66, 0xb9, 0x75, 0xcb, 0x9d, 0xd9, 0x52, 0x5d, + 0x3c, 0x73, 0xed, 0xe1, 0x2d, 0xec, 0xa9, 0x0f, 0xcf, 0x68, 0x96, 0x6e, 0xf2, 0x63, 0xdf, 0x71, + 0xd6, 0x5f, 0x20, 0xfd, 0x05, 0xde, 0x9f, 0x6f, 0x7b, 0x42, 0x2c, 0x2f, 0x40, 0x62, 0xce, 0xd2, + 0x4d, 0x34, 0x01, 0xc9, 0x2a, 0x36, 0xad, 0x3a, 0xbf, 0x01, 0xc6, 0x1a, 0xe8, 0x2e, 0x18, 0x50, + 0xeb, 0x56, 0xc3, 0xf4, 0xd8, 0x71, 0x79, 0x29, 0xf3, 0x8d, 0x9b, 0xd3, 0x87, 0x7e, 0xff, 0xe6, + 0x74, 0x7c, 0xd1, 0xf4, 0x14, 0xde, 0x55, 0x4c, 0x7c, 0xf7, 0xa5, 0x69, 0x49, 0xbe, 0x04, 0x83, + 0xf3, 0x58, 0x3b, 0x08, 0xaf, 0x79, 0xac, 0x35, 0xf1, 0xba, 0x0f, 0x52, 0x8b, 0xa6, 0xc7, 0xee, + 0xe8, 0x1d, 0x87, 0xb8, 0x6e, 0xb2, 0x5b, 0x1f, 0x4d, 0xe3, 0x13, 0x38, 0x41, 0x9d, 0xc7, 0x9a, + 0x8f, 0x5a, 0xc5, 0x5a, 0x33, 0x2a, 0x61, 0x4f, 0xe0, 0xa5, 0xf9, 0xdf, 0xfb, 0x4f, 0x53, 0x87, + 0x9e, 0x7b, 0x75, 0xea, 0x50, 0xa7, 0xf9, 0x89, 0x98, 0x9f, 0x9b, 0x98, 0xfd, 0x79, 0xd0, 0xad, + 0x5e, 0x9d, 0x21, 0xa1, 0xe5, 0x6e, 0x0d, 0x50, 0xbb, 0x3d, 0x02, 0x9f, 0x8e, 0xc1, 0x74, 0xf3, + 0x91, 0x3a, 0xf1, 0x63, 0xd7, 0x53, 0xeb, 0x76, 0xa7, 0x17, 0xa2, 0xce, 0x43, 0x7a, 0x43, 0xe0, + 0xa0, 0x1c, 0x0c, 0xba, 0x58, 0xb3, 0xcc, 0xaa, 0x4b, 0x45, 0x8e, 0x2b, 0xa2, 0x49, 0x0c, 0x68, + 0xaa, 0xa6, 0xe5, 0xf2, 0xfb, 0x9a, 0xac, 0x51, 0xfa, 0xcb, 0x52, 0x7f, 0x8e, 0x35, 0xe2, 0x0f, + 0x45, 0xcd, 0xb3, 0x26, 0x7d, 0xe0, 0xfe, 0xfd, 0x9e, 0x46, 0x50, 0xf5, 0x02, 0x15, 0x42, 0x8f, + 0x1e, 0xa6, 0x9a, 0x1f, 0x3d, 0x3c, 0x85, 0x0d, 0xe3, 0xb2, 0x69, 0x5d, 0x37, 0x37, 0x22, 0x26, + 0xf9, 0x5d, 0x09, 0x4e, 0xd0, 0x8b, 0xe8, 0x4e, 0x5d, 0x37, 0xbd, 0x19, 0x43, 0xdf, 0x72, 0x67, + 0xb6, 0x74, 0xcf, 0x65, 0x96, 0xe3, 0x36, 0x99, 0x08, 0x30, 0x0a, 0x04, 0xa3, 0x40, 0x30, 0xe4, + 0x33, 0x90, 0x2a, 0xe9, 0xde, 0xac, 0xe3, 0xa8, 0x7b, 0x08, 0x41, 0x82, 0xc0, 0xb8, 0x51, 0xe8, + 0x6f, 0x62, 0x11, 0x6c, 0xe0, 0xba, 0x4b, 0x1f, 0x7a, 0x25, 0x14, 0xd6, 0x28, 0x6d, 0x76, 0x9c, + 0xc9, 0xf3, 0x21, 0x4d, 0x43, 0x22, 0x85, 0x7e, 0xb2, 0x48, 0x68, 0x27, 0xae, 0xaf, 0xcf, 0x57, + 0x12, 0x70, 0x3c, 0x84, 0xa0, 0x39, 0x7b, 0xb6, 0x47, 0x43, 0xd2, 0xda, 0xe6, 0xca, 0x8c, 0x85, + 0x94, 0x61, 0xdd, 0x1d, 0xc2, 0x6c, 0x1b, 0x92, 0x6b, 0x84, 0x8e, 0x28, 0xe2, 0x59, 0x9e, 0x6a, + 0x70, 0xed, 0x58, 0x83, 0x40, 0xd9, 0x65, 0xfc, 0x18, 0x83, 0xea, 0xe2, 0x1e, 0xbe, 0x81, 0xd5, + 0x6d, 0x76, 0xf9, 0x31, 0x4e, 0x9f, 0x7d, 0xa6, 0x08, 0x80, 0xde, 0x73, 0x9c, 0x80, 0xa4, 0xda, + 0x60, 0x8f, 0xed, 0xe2, 0x27, 0x87, 0x14, 0xd6, 0x90, 0x2f, 0xc3, 0x20, 0x7f, 0x54, 0x80, 0xb2, + 0x10, 0xbf, 0x8a, 0xf7, 0xe8, 0x38, 0x43, 0x0a, 0xf9, 0x89, 0x0a, 0x90, 0xa4, 0xc2, 0xf3, 0x5b, + 0xdd, 0xb9, 0x42, 0x8b, 0xf4, 0x05, 0x2a, 0xa4, 0xc2, 0xd0, 0xe4, 0x4b, 0x90, 0x9a, 0xb7, 0xea, + 0xba, 0x69, 0x45, 0xb9, 0xa5, 0x19, 0x37, 0x2a, 0xb3, 0xdd, 0xe0, 0xe1, 0xac, 0xb0, 0x06, 0x9a, + 0x84, 0x01, 0x76, 0x19, 0x96, 0x3f, 0x7a, 0xe4, 0x2d, 0x79, 0x0e, 0x06, 0x29, 0xef, 0x55, 0x9b, + 0xcc, 0xaf, 0x7f, 0x11, 0x29, 0xcd, 0xdf, 0x78, 0xe0, 0xec, 0x63, 0x81, 0xb0, 0x08, 0x12, 0x55, + 0xd5, 0x53, 0xb9, 0xde, 0xf4, 0xb7, 0xfc, 0x5e, 0x48, 0x71, 0x26, 0x2e, 0x3a, 0x0d, 0x71, 0xcb, + 0x76, 0xf9, 0xc3, 0xc3, 0x7c, 0x27, 0x55, 0x56, 0xed, 0x52, 0x82, 0x24, 0x02, 0x85, 0x20, 0x97, + 0x94, 0x8e, 0xfe, 0x72, 0xae, 0x7f, 0x7f, 0x61, 0xc3, 0xf8, 0xce, 0xf2, 0x85, 0x18, 0x4c, 0x85, + 0x7a, 0xaf, 0x61, 0x87, 0xd4, 0xcb, 0x11, 0xd7, 0x47, 0x21, 0x21, 0x79, 0x7f, 0x07, 0x77, 0x79, + 0x0f, 0xc4, 0x67, 0x6d, 0x1b, 0xe5, 0x21, 0xc5, 0x1e, 0x12, 0x5a, 0xcc, 0x5f, 0x12, 0x8a, 0xdf, + 0x26, 0x7d, 0xae, 0xb5, 0xed, 0x5d, 0x57, 0x1d, 0xff, 0x35, 0x10, 0xd1, 0x96, 0x1f, 0x87, 0xf4, + 0x9c, 0x65, 0xba, 0xd8, 0x74, 0x1b, 0x34, 0x74, 0xb6, 0x0c, 0x4b, 0xbb, 0xca, 0x39, 0xb0, 0x06, + 0x31, 0xb8, 0x6a, 0xdb, 0x94, 0x32, 0xa1, 0x90, 0x9f, 0x2c, 0xf5, 0x96, 0xd6, 0x3b, 0x9a, 0xe8, + 0xf1, 0xfe, 0x4d, 0xc4, 0x95, 0xf4, 0x6d, 0xf4, 0xeb, 0x47, 0xe0, 0x58, 0x98, 0x94, 0x65, 0x9c, + 0x90, 0x85, 0xb2, 0x21, 0x0b, 0x51, 0x78, 0x7b, 0xfb, 0xe4, 0xbb, 0x65, 0xde, 0x7c, 0xd7, 0x3c, + 0x94, 0xdf, 0x3f, 0xb2, 0xf3, 0x5d, 0xe6, 0x52, 0x7e, 0x1c, 0x86, 0xd7, 0x54, 0xc7, 0x5b, 0xc7, + 0xde, 0x45, 0xac, 0x56, 0xb1, 0x13, 0x0d, 0xec, 0x61, 0x11, 0xd8, 0x08, 0x12, 0x34, 0x7a, 0x99, + 0x63, 0xd3, 0xdf, 0xf2, 0x0e, 0x24, 0xe8, 0x45, 0x03, 0x3f, 0xe8, 0x39, 0x05, 0x0b, 0x7a, 0x32, + 0x5d, 0x7b, 0x1e, 0x76, 0x39, 0x09, 0x6b, 0xa0, 0x33, 0x22, 0x74, 0xe3, 0xfb, 0x87, 0x2e, 0xf7, + 0x76, 0x1e, 0xc0, 0x06, 0x0c, 0x96, 0xc8, 0x6c, 0x2f, 0xce, 0xfb, 0x82, 0x48, 0x81, 0x20, 0x68, + 0x19, 0x46, 0x6d, 0xd5, 0xf1, 0xe8, 0x0d, 0xcb, 0x1d, 0xaa, 0x05, 0xcf, 0x0c, 0xd3, 0x85, 0xe6, + 0x79, 0x28, 0x44, 0x94, 0xe5, 0xa3, 0x0c, 0xdb, 0x61, 0xa0, 0xfc, 0x9f, 0x13, 0x30, 0xc0, 0x8d, + 0xf1, 0x1e, 0x18, 0xe4, 0x46, 0xa3, 0x03, 0x66, 0x4e, 0x1f, 0x2f, 0xb4, 0xfa, 0x7e, 0xc1, 0xf7, + 0x51, 0xce, 0x4f, 0xd0, 0xa0, 0x7b, 0x20, 0xa5, 0xed, 0xa8, 0xba, 0x59, 0xd1, 0xab, 0xa2, 0x58, + 0x78, 0xf5, 0xe6, 0xf4, 0xe0, 0x1c, 0x81, 0x2d, 0xce, 0x2b, 0x83, 0xb4, 0x73, 0xb1, 0x4a, 0x92, + 0xcd, 0x0e, 0xd6, 0x6b, 0x3b, 0x2c, 0xd9, 0xc4, 0x15, 0xde, 0x42, 0xe7, 0x20, 0x41, 0x1c, 0x82, + 0x5f, 0xc0, 0xcf, 0xb7, 0x14, 0x71, 0xfe, 0xc2, 0x58, 0x4a, 0x91, 0x81, 0x3f, 0xfd, 0xad, 0x69, + 0x49, 0xa1, 0x14, 0x68, 0x0e, 0x86, 0x0d, 0xd5, 0xf5, 0x2a, 0x34, 0x48, 0xc8, 0xf0, 0x49, 0xca, + 0xe2, 0x48, 0xab, 0x41, 0xb8, 0x61, 0xb9, 0xe8, 0x19, 0x42, 0xc5, 0x40, 0x55, 0x74, 0x12, 0xb2, + 0x94, 0x89, 0x66, 0xd5, 0xeb, 0xba, 0xc7, 0xd2, 0xf7, 0x00, 0xb5, 0xfb, 0x08, 0x81, 0xcf, 0x51, + 0x30, 0x4d, 0xe2, 0x47, 0x21, 0x4d, 0x6f, 0xfc, 0x52, 0x14, 0x76, 0xbb, 0x25, 0x45, 0x00, 0xb4, + 0xf3, 0x5e, 0x18, 0xbd, 0xa6, 0x1a, 0x7a, 0x55, 0xf5, 0x2c, 0xc7, 0x65, 0x28, 0x29, 0xc6, 0x25, + 0x00, 0x53, 0xc4, 0x87, 0x60, 0xc2, 0xc4, 0xbb, 0xf4, 0xbe, 0x4d, 0x04, 0x3b, 0x4d, 0xb1, 0x11, + 0xe9, 0xbb, 0x12, 0xa5, 0x78, 0x17, 0x8c, 0x68, 0xc2, 0xf8, 0x0c, 0x17, 0x28, 0xee, 0xb0, 0x0f, + 0xa5, 0x68, 0x47, 0x20, 0xa5, 0xda, 0x36, 0x43, 0xc8, 0x50, 0x84, 0x41, 0xd5, 0xb6, 0x69, 0xd7, + 0x29, 0x18, 0xa3, 0x3a, 0x3a, 0xd8, 0x6d, 0x18, 0x1e, 0x67, 0x32, 0x44, 0x71, 0x46, 0x49, 0x87, + 0xc2, 0xe0, 0x14, 0xf7, 0x2e, 0x18, 0xc6, 0xd7, 0xf4, 0x2a, 0x36, 0x35, 0xcc, 0xf0, 0x86, 0x29, + 0xde, 0x90, 0x00, 0x52, 0xa4, 0xfb, 0x20, 0x6b, 0x3b, 0x96, 0x6d, 0xb9, 0xd8, 0xa9, 0xa8, 0xd5, + 0xaa, 0x83, 0x5d, 0x37, 0x37, 0xc2, 0xf8, 0x09, 0xf8, 0x2c, 0x03, 0xcb, 0x0f, 0x40, 0x62, 0x5e, + 0xf5, 0x54, 0x92, 0xc3, 0xbc, 0x5d, 0xb6, 0x04, 0x0c, 0x29, 0xe4, 0x67, 0xdb, 0x70, 0xfb, 0x6e, + 0x0c, 0x12, 0x57, 0x2c, 0x0f, 0xa3, 0x47, 0x42, 0xeb, 0xce, 0x48, 0x3b, 0x1f, 0x5f, 0xd7, 0x6b, + 0x26, 0xae, 0x2e, 0xbb, 0xb5, 0xd0, 0xab, 0x78, 0x81, 0x8b, 0xc5, 0x22, 0x2e, 0x36, 0x01, 0x49, + 0xc7, 0x6a, 0x98, 0x55, 0x71, 0x59, 0x84, 0x36, 0x50, 0x19, 0x52, 0xbe, 0xe7, 0x24, 0xba, 0x79, + 0xce, 0x28, 0xf1, 0x1c, 0xe2, 0xd7, 0x1c, 0xa0, 0x0c, 0x6e, 0x71, 0x07, 0x2a, 0x41, 0xda, 0x4f, + 0x68, 0xdc, 0x03, 0x7b, 0x73, 0xe2, 0x80, 0x0c, 0xdd, 0x0f, 0x63, 0xbe, 0x3f, 0xf8, 0x06, 0x65, + 0x5e, 0x98, 0xf5, 0x3b, 0xb8, 0x45, 0x23, 0xae, 0xc6, 0x5f, 0x0b, 0x1c, 0xa4, 0x7a, 0x05, 0xae, + 0xc6, 0x5e, 0x0d, 0x3c, 0x06, 0x69, 0x57, 0xaf, 0x99, 0xaa, 0xd7, 0x70, 0x30, 0xf7, 0xc6, 0x00, + 0x20, 0xff, 0x54, 0x0c, 0x06, 0x98, 0x77, 0x87, 0xec, 0x26, 0xb5, 0xb7, 0x5b, 0xac, 0x93, 0xdd, + 0xe2, 0x07, 0xb7, 0xdb, 0x2c, 0x80, 0x2f, 0x8c, 0xcb, 0x5f, 0xeb, 0x3a, 0xda, 0xca, 0x88, 0x89, + 0xb8, 0xae, 0xd7, 0x78, 0xf0, 0x86, 0x88, 0x7c, 0x0f, 0x4a, 0x86, 0xf2, 0xe4, 0x79, 0x48, 0x6f, + 0xe9, 0x5e, 0x45, 0x25, 0xd5, 0x29, 0x35, 0x61, 0xe6, 0xf4, 0x54, 0xa1, 0x5d, 0x19, 0x5b, 0x10, + 0x35, 0xac, 0x92, 0xda, 0xe2, 0xbf, 0xe4, 0xff, 0x28, 0x91, 0xc5, 0x98, 0x0f, 0x88, 0x66, 0x61, + 0x58, 0x28, 0x5a, 0xd9, 0x36, 0xd4, 0x1a, 0x77, 0xc6, 0xe3, 0x1d, 0xb5, 0xbd, 0x60, 0xa8, 0x35, + 0x25, 0xc3, 0x15, 0x24, 0x8d, 0xf6, 0x13, 0x1b, 0xeb, 0x30, 0xb1, 0x11, 0x4f, 0x8a, 0x1f, 0xcc, + 0x93, 0x22, 0x73, 0x9e, 0x68, 0x9e, 0xf3, 0xaf, 0xc6, 0x68, 0x51, 0x66, 0x5b, 0xae, 0x6a, 0xbc, + 0x15, 0x21, 0x76, 0x14, 0xd2, 0xb6, 0x65, 0x54, 0x58, 0x0f, 0xbb, 0x95, 0x95, 0xb2, 0x2d, 0x43, + 0x69, 0xf1, 0xa3, 0xe4, 0x6d, 0x8a, 0xbf, 0x81, 0xdb, 0x60, 0xb5, 0xc1, 0x66, 0xab, 0x39, 0x30, + 0xc4, 0x4c, 0xc1, 0x17, 0xcc, 0x87, 0x88, 0x0d, 0xe8, 0x0a, 0x2c, 0xb5, 0x2e, 0xf0, 0x4c, 0x6c, + 0x86, 0xa9, 0x70, 0x3c, 0x42, 0xc1, 0xd6, 0x97, 0x76, 0xd5, 0x7c, 0xd8, 0xcf, 0x15, 0x8e, 0x27, + 0xff, 0x53, 0x09, 0xd2, 0x54, 0xd5, 0x65, 0xec, 0xa9, 0x11, 0x53, 0x49, 0x07, 0x37, 0xd5, 0x71, + 0x00, 0xc6, 0xc6, 0xd5, 0x6f, 0x60, 0x3e, 0x81, 0x69, 0x0a, 0x59, 0xd7, 0x6f, 0x60, 0x74, 0xd6, + 0xd7, 0x2b, 0xbe, 0xbf, 0x5e, 0x3c, 0x14, 0x85, 0x76, 0x77, 0xc0, 0x20, 0xfd, 0x2a, 0xc1, 0x2e, + 0xbb, 0x96, 0x18, 0xa7, 0xef, 0x2c, 0x6e, 0xec, 0xba, 0xf2, 0x33, 0x30, 0xb8, 0xb1, 0xcb, 0xb6, + 0x52, 0x47, 0x21, 0xed, 0x58, 0x16, 0x5f, 0x5f, 0x59, 0x5d, 0x93, 0x22, 0x00, 0xba, 0x9c, 0x88, + 0xed, 0x43, 0x2c, 0xd8, 0x3e, 0x04, 0xfb, 0x9f, 0x78, 0x4f, 0xfb, 0x9f, 0x53, 0xff, 0x4e, 0x82, + 0x4c, 0x28, 0x0c, 0xd1, 0xc3, 0x70, 0xb8, 0xb4, 0xb4, 0x3a, 0x77, 0xb9, 0xb2, 0x38, 0x5f, 0xb9, + 0xb0, 0x34, 0xbb, 0x10, 0x5c, 0xef, 0xcd, 0x4f, 0x3e, 0xff, 0xe2, 0x09, 0x14, 0xc2, 0xdd, 0x34, + 0xaf, 0x92, 0xfd, 0x31, 0x9a, 0x81, 0x89, 0x28, 0xc9, 0x6c, 0x69, 0xbd, 0xbc, 0xb2, 0x91, 0x95, + 0xf2, 0x87, 0x9f, 0x7f, 0xf1, 0xc4, 0x58, 0x88, 0x62, 0x76, 0xcb, 0xc5, 0xa6, 0xd7, 0x4a, 0x30, + 0xb7, 0xba, 0xbc, 0xbc, 0xb8, 0x91, 0x8d, 0xb5, 0x10, 0xf0, 0x44, 0x7b, 0x1f, 0x8c, 0x45, 0x09, + 0x56, 0x16, 0x97, 0xb2, 0xf1, 0x3c, 0x7a, 0xfe, 0xc5, 0x13, 0x23, 0x21, 0xec, 0x15, 0xdd, 0xc8, + 0xa7, 0x7e, 0xe2, 0x4b, 0x53, 0x87, 0x7e, 0xfe, 0xaf, 0x4d, 0x49, 0x44, 0xb3, 0xe1, 0x48, 0x28, + 0xa2, 0x07, 0xe0, 0x8e, 0xf5, 0xc5, 0x85, 0x95, 0xf2, 0x7c, 0x65, 0x79, 0x7d, 0xa1, 0xc2, 0xde, + 0x6b, 0xf6, 0xb5, 0x1b, 0x7d, 0xfe, 0xc5, 0x13, 0x19, 0xae, 0x52, 0x27, 0xec, 0x35, 0xa5, 0x7c, + 0x65, 0x75, 0xa3, 0x9c, 0x95, 0x18, 0xf6, 0x9a, 0x83, 0xaf, 0x59, 0x1e, 0xfb, 0x6c, 0xc9, 0x43, + 0x70, 0xa4, 0x0d, 0xb6, 0xaf, 0xd8, 0xd8, 0xf3, 0x2f, 0x9e, 0x18, 0x5e, 0x73, 0x30, 0x73, 0x53, + 0x4a, 0x51, 0x80, 0x5c, 0x2b, 0xc5, 0xea, 0xda, 0xea, 0xfa, 0xec, 0x52, 0xf6, 0x44, 0x3e, 0xfb, + 0xfc, 0x8b, 0x27, 0x86, 0x44, 0xce, 0x21, 0xf8, 0x81, 0x66, 0xa5, 0x27, 0x3b, 0xee, 0x5f, 0x1e, + 0xeb, 0x7f, 0xff, 0x12, 0x3d, 0xf1, 0xf9, 0x8b, 0x31, 0x98, 0x6a, 0xb9, 0x44, 0xc9, 0x8f, 0x1e, + 0x3b, 0x1d, 0xf8, 0x14, 0x21, 0x35, 0x2f, 0x4e, 0x34, 0xfb, 0x3d, 0xef, 0xf9, 0xd9, 0x3e, 0xcf, + 0x7b, 0x86, 0xc5, 0x48, 0xe2, 0xb8, 0xe7, 0x54, 0xf7, 0xe3, 0x1e, 0x21, 0xff, 0x01, 0x4e, 0x7b, + 0x3e, 0xfe, 0x30, 0xdc, 0xcd, 0x0f, 0xc9, 0x5c, 0x4f, 0xbd, 0xaa, 0x9b, 0x35, 0xff, 0x28, 0x92, + 0xb7, 0xb9, 0x51, 0x26, 0xf9, 0x69, 0xa4, 0x80, 0xee, 0x7b, 0x20, 0x99, 0xdf, 0x77, 0x83, 0xd8, + 0x7d, 0xe3, 0xd7, 0x65, 0x86, 0xf2, 0x5d, 0x8e, 0x4e, 0xe5, 0x4f, 0x4a, 0x30, 0x72, 0x51, 0x77, + 0x3d, 0xcb, 0xd1, 0x35, 0xd5, 0xa0, 0xb7, 0x95, 0xcf, 0xf6, 0x9a, 0x9b, 0x9b, 0x72, 0xd8, 0x13, + 0x30, 0x70, 0x4d, 0x35, 0x5c, 0xec, 0xf1, 0xcb, 0xfa, 0x77, 0x16, 0xda, 0x1b, 0xa2, 0xe0, 0x17, + 0xe7, 0x82, 0x01, 0x23, 0x93, 0x7f, 0x31, 0x06, 0xa3, 0x34, 0xca, 0x5d, 0xf6, 0x39, 0x0d, 0xb2, + 0x11, 0x2c, 0x41, 0xc2, 0x51, 0x3d, 0x7e, 0x78, 0x52, 0x2a, 0xf0, 0x43, 0xce, 0x7b, 0xba, 0x1f, + 0x5c, 0x16, 0xe6, 0xb1, 0xa6, 0x50, 0x5a, 0xf4, 0x23, 0x90, 0xaa, 0xab, 0xbb, 0x15, 0xca, 0x87, + 0x6d, 0xaf, 0x66, 0xfb, 0xe3, 0x73, 0xeb, 0xe6, 0xf4, 0xe8, 0x9e, 0x5a, 0x37, 0x8a, 0xb2, 0xe0, + 0x23, 0x2b, 0x83, 0x75, 0x75, 0x97, 0x88, 0x88, 0x6c, 0x18, 0x25, 0x50, 0x6d, 0x47, 0x35, 0x6b, + 0x98, 0x0d, 0x42, 0x8f, 0x82, 0x4a, 0x17, 0xfb, 0x1e, 0x64, 0x32, 0x18, 0x24, 0xc4, 0x4e, 0x56, + 0x86, 0xeb, 0xea, 0xee, 0x1c, 0x05, 0x90, 0x11, 0x8b, 0xa9, 0x17, 0x5e, 0x9a, 0x3e, 0x44, 0x0f, + 0x8e, 0x5f, 0x91, 0x00, 0x02, 0x8b, 0xa1, 0x1f, 0x81, 0xac, 0xe6, 0xb7, 0x28, 0xad, 0xcb, 0xe7, + 0xf0, 0xde, 0x4e, 0x73, 0xd1, 0x64, 0x6f, 0xb6, 0xb6, 0xbf, 0x7c, 0x73, 0x5a, 0x52, 0x46, 0xb5, + 0xa6, 0xa9, 0xf8, 0x20, 0x64, 0x1a, 0x76, 0x55, 0xf5, 0x70, 0x85, 0x6e, 0x36, 0x63, 0x5d, 0xeb, + 0x84, 0x29, 0xc2, 0xeb, 0xd6, 0xcd, 0x69, 0xc4, 0xd4, 0x0a, 0x11, 0xcb, 0xb4, 0x7a, 0x00, 0x06, + 0x21, 0x04, 0x21, 0x9d, 0x7e, 0x47, 0x82, 0xcc, 0x7c, 0xe8, 0xd6, 0x40, 0x0e, 0x06, 0xeb, 0x96, + 0xa9, 0x5f, 0xe5, 0xfe, 0x98, 0x56, 0x44, 0x13, 0xe5, 0x21, 0xc5, 0x5e, 0xe0, 0xf0, 0xf6, 0xc4, + 0x91, 0x90, 0x68, 0x13, 0xaa, 0xeb, 0x78, 0xcb, 0xd5, 0xc5, 0x6c, 0x28, 0xa2, 0x89, 0x2e, 0x40, + 0xd6, 0xc5, 0x5a, 0xc3, 0xd1, 0xbd, 0xbd, 0x8a, 0x66, 0x99, 0x9e, 0xaa, 0x79, 0xec, 0x55, 0x80, + 0xd2, 0xd1, 0x5b, 0x37, 0xa7, 0xef, 0x60, 0xb2, 0x36, 0x63, 0xc8, 0xca, 0xa8, 0x00, 0xcd, 0x31, + 0x08, 0x19, 0xa1, 0x8a, 0x3d, 0x55, 0x37, 0x5c, 0x5a, 0x7a, 0xa5, 0x15, 0xd1, 0x0c, 0xe9, 0xf2, + 0x8f, 0x07, 0x21, 0xed, 0x7b, 0x3b, 0xba, 0x0e, 0x59, 0xcb, 0xc6, 0x4e, 0xa4, 0x90, 0xa5, 0xeb, + 0x78, 0x69, 0x29, 0x18, 0xb9, 0x19, 0x43, 0xfe, 0xff, 0x37, 0xa7, 0x1f, 0xec, 0xc1, 0x83, 0xae, + 0xa8, 0x06, 0x2f, 0x82, 0x95, 0x51, 0xc1, 0x43, 0x54, 0xc5, 0x17, 0x88, 0x5f, 0x88, 0xed, 0xaf, + 0xdd, 0xd8, 0x12, 0x47, 0x8f, 0x11, 0x95, 0x9b, 0x31, 0x64, 0xe2, 0x01, 0x1c, 0xb4, 0x46, 0x21, + 0xa4, 0x72, 0x7d, 0x46, 0xd5, 0x0d, 0xf1, 0x56, 0x9b, 0xc2, 0x5b, 0x68, 0x11, 0x06, 0x5c, 0x4f, + 0xf5, 0x1a, 0xac, 0x78, 0x49, 0x96, 0x1e, 0xee, 0x51, 0xe6, 0x92, 0x65, 0x56, 0xd7, 0x29, 0xa1, + 0xc2, 0x19, 0xa0, 0x0b, 0x30, 0xe0, 0x59, 0x57, 0xb1, 0xc9, 0x8d, 0xda, 0x57, 0xc4, 0xd3, 0x87, + 0x34, 0x8c, 0x1a, 0x79, 0x90, 0xad, 0x62, 0x03, 0xd7, 0xa8, 0x29, 0xdd, 0x1d, 0x95, 0x6c, 0x90, + 0xe8, 0x97, 0x65, 0x4a, 0x8b, 0x7d, 0x87, 0x25, 0x37, 0x50, 0x33, 0x3f, 0x59, 0x19, 0xf5, 0x41, + 0xeb, 0x14, 0x82, 0x2e, 0x47, 0x2e, 0xbc, 0xf0, 0xcf, 0x2f, 0xdd, 0xd5, 0x29, 0xf6, 0x42, 0x5e, + 0x2e, 0x8e, 0x55, 0xc2, 0xd7, 0x65, 0x2e, 0x40, 0xb6, 0x61, 0x6e, 0x59, 0x26, 0x7d, 0x13, 0x85, + 0xef, 0x18, 0xc8, 0x16, 0x34, 0x1e, 0x9e, 0xb5, 0x66, 0x0c, 0x59, 0x19, 0xf5, 0x41, 0x17, 0xd9, + 0xbe, 0xa2, 0x0a, 0x23, 0x01, 0x16, 0x0d, 0xdd, 0x74, 0xd7, 0xd0, 0xbd, 0x93, 0x87, 0xee, 0xe1, + 0xe6, 0x51, 0x82, 0xe8, 0x1d, 0xf6, 0x81, 0x84, 0x0c, 0x5d, 0x04, 0x08, 0x12, 0x06, 0x3d, 0x5e, + 0xc9, 0x9c, 0x96, 0xbb, 0x67, 0x1d, 0xb1, 0x25, 0x0d, 0x68, 0xd1, 0x87, 0x61, 0xbc, 0xae, 0x9b, + 0x15, 0x17, 0x1b, 0xdb, 0x15, 0x6e, 0x60, 0xc2, 0x92, 0x7e, 0x49, 0xa0, 0xb4, 0xd4, 0x9f, 0x3f, + 0xdc, 0xba, 0x39, 0x9d, 0xe7, 0x49, 0xb5, 0x95, 0xa5, 0xac, 0x8c, 0xd5, 0x75, 0x73, 0x1d, 0x1b, + 0xdb, 0xf3, 0x3e, 0xac, 0x38, 0xf4, 0x13, 0x2f, 0x4d, 0x1f, 0xf2, 0x03, 0x58, 0x87, 0xa1, 0x20, + 0xb0, 0xb0, 0x8b, 0x56, 0x21, 0xad, 0x8a, 0x06, 0x3b, 0x88, 0xe9, 0xd9, 0xd9, 0x43, 0x01, 0x1a, + 0xf0, 0x60, 0xb9, 0xe2, 0xb9, 0xff, 0x70, 0x42, 0x92, 0x9f, 0x8f, 0xc1, 0xc0, 0xfc, 0x95, 0x35, + 0x55, 0x77, 0xd0, 0x0d, 0x18, 0x0b, 0x9c, 0x2d, 0x9a, 0x29, 0x96, 0x6f, 0xdd, 0x9c, 0xce, 0x35, + 0xfb, 0x63, 0x9f, 0xa9, 0x62, 0x56, 0xd3, 0x84, 0x24, 0x41, 0x90, 0x88, 0x5c, 0x71, 0xa3, 0xe3, + 0x76, 0x3b, 0x3c, 0x76, 0x0b, 0xca, 0x01, 0xd2, 0x54, 0xcb, 0xee, 0x3d, 0x94, 0x38, 0xcb, 0x30, + 0xc8, 0x6c, 0xe1, 0xa2, 0x22, 0x24, 0x6d, 0xf2, 0x83, 0x3f, 0xfa, 0x98, 0xea, 0x18, 0x4d, 0x14, + 0xdf, 0x3f, 0x10, 0x26, 0x24, 0xf2, 0x17, 0xe3, 0x00, 0xf3, 0x57, 0xae, 0x6c, 0x38, 0xba, 0x6d, + 0x60, 0xef, 0x07, 0x6a, 0xd7, 0x8f, 0x4b, 0x70, 0x38, 0xb0, 0x9a, 0xeb, 0x68, 0x4d, 0xc6, 0x7d, + 0xf2, 0xd6, 0xcd, 0xe9, 0x63, 0xcd, 0xc6, 0x0d, 0xa1, 0x1d, 0xc0, 0xc0, 0xe3, 0x3e, 0xa3, 0x75, + 0x47, 0x6b, 0x2f, 0x47, 0xd5, 0xf5, 0x7c, 0x39, 0xe2, 0x9d, 0xe5, 0x08, 0xa1, 0xbd, 0x21, 0x39, + 0xe6, 0x5d, 0xaf, 0x75, 0xae, 0xd7, 0x21, 0x13, 0xcc, 0x91, 0x8b, 0xe6, 0x21, 0xe5, 0xf1, 0xdf, + 0x7c, 0xca, 0xe5, 0xce, 0x53, 0x2e, 0xc8, 0xf8, 0xb4, 0xfb, 0x94, 0xf2, 0xbf, 0x8d, 0x01, 0x04, + 0x51, 0xfd, 0x67, 0x35, 0xa2, 0xc8, 0x72, 0xca, 0x17, 0xbf, 0xf8, 0x81, 0x0a, 0x68, 0x4e, 0x1d, + 0x9a, 0xad, 0x3f, 0x8c, 0xc1, 0xf8, 0xa6, 0xc8, 0xfc, 0xef, 0x58, 0x18, 0xad, 0xc1, 0x20, 0x36, + 0x3d, 0x47, 0xa7, 0x26, 0x26, 0xde, 0xfa, 0x50, 0x27, 0x6f, 0x6d, 0x63, 0x35, 0xfa, 0xb1, 0x0c, + 0xf1, 0x34, 0x88, 0xb3, 0x09, 0xd9, 0xfa, 0x53, 0x71, 0xc8, 0x75, 0xa2, 0x42, 0x73, 0x30, 0xaa, + 0x39, 0x98, 0x02, 0x2a, 0xe1, 0xa3, 0xe7, 0x52, 0x3e, 0xd8, 0x49, 0x34, 0x21, 0xc8, 0xca, 0x88, + 0x80, 0xf0, 0xda, 0xa0, 0x06, 0xa4, 0xcc, 0x27, 0x21, 0x43, 0xb0, 0x7a, 0xac, 0xeb, 0x65, 0x5e, + 0x1c, 0x88, 0x41, 0xa2, 0x0c, 0x58, 0x75, 0x30, 0x12, 0x40, 0x69, 0x79, 0xf0, 0x2c, 0x8c, 0xea, + 0xa6, 0xee, 0xe9, 0xaa, 0x51, 0xd9, 0x52, 0x0d, 0xd5, 0xd4, 0x0e, 0xb2, 0x4b, 0x62, 0x0b, 0x3a, + 0x1f, 0xb6, 0x89, 0x9d, 0xac, 0x8c, 0x70, 0x48, 0x89, 0x01, 0xd0, 0x45, 0x18, 0x14, 0x43, 0x25, + 0x0e, 0x54, 0x4b, 0x0a, 0xf2, 0xd0, 0x8c, 0xfc, 0x64, 0x1c, 0xc6, 0x14, 0x5c, 0x7d, 0x67, 0x2a, + 0xfa, 0x9b, 0x8a, 0x65, 0x00, 0x96, 0x48, 0xc8, 0x4a, 0x72, 0x80, 0xd9, 0x20, 0xa9, 0x28, 0xcd, + 0x38, 0xcc, 0xbb, 0x5e, 0x68, 0x3e, 0xfe, 0x28, 0x0e, 0x43, 0xe1, 0xf9, 0x78, 0x67, 0x89, 0xff, + 0xe1, 0x59, 0xe2, 0xd1, 0x62, 0x90, 0x1a, 0x13, 0xfc, 0xa3, 0x87, 0x1d, 0x52, 0x63, 0x4b, 0x48, + 0x75, 0xce, 0x89, 0xff, 0x3b, 0x06, 0x03, 0x6b, 0xaa, 0xa3, 0xd6, 0x5d, 0xa4, 0xb5, 0x6c, 0x6c, + 0xc4, 0xc1, 0x7e, 0xcb, 0xd7, 0x6a, 0xf9, 0xa1, 0x58, 0x97, 0x7d, 0xcd, 0x0b, 0x6d, 0xf6, 0x35, + 0xef, 0x83, 0x91, 0xba, 0xba, 0x1b, 0x7a, 0xd6, 0x4c, 0x27, 0x73, 0xb8, 0x74, 0x24, 0xe0, 0x12, + 0xed, 0x67, 0xc7, 0x35, 0xc1, 0x03, 0x68, 0xf4, 0x18, 0x64, 0x08, 0x46, 0xb0, 0x4a, 0x10, 0xf2, + 0xc9, 0xe0, 0x5c, 0x24, 0xd4, 0x29, 0x2b, 0x50, 0x57, 0x77, 0xcb, 0xac, 0x81, 0x96, 0x00, 0xed, + 0xf8, 0x47, 0x73, 0x95, 0xc0, 0x94, 0x84, 0xfe, 0xf8, 0xad, 0x9b, 0xd3, 0x47, 0x18, 0x7d, 0x2b, + 0x8e, 0xac, 0x8c, 0x05, 0x40, 0xc1, 0xed, 0x0c, 0x00, 0xd1, 0xab, 0xc2, 0xae, 0x2a, 0xb2, 0xdd, + 0xf5, 0xe1, 0x5b, 0x37, 0xa7, 0xc7, 0x18, 0x97, 0xa0, 0x4f, 0x56, 0xd2, 0xa4, 0x31, 0x4f, 0x7e, + 0x87, 0x0c, 0xff, 0x25, 0x09, 0x50, 0xb0, 0x06, 0x29, 0xd8, 0xb5, 0x2d, 0xd3, 0xa5, 0xfb, 0xbe, + 0xd0, 0x26, 0x4d, 0xda, 0x7f, 0xdf, 0x17, 0xd0, 0x8b, 0x7d, 0x5f, 0x28, 0x74, 0x1f, 0x0f, 0xf2, + 0x75, 0x8c, 0xcf, 0x63, 0x9b, 0x7b, 0x9d, 0x85, 0x39, 0x4b, 0x17, 0xd4, 0x6d, 0x12, 0xf4, 0xbf, + 0x90, 0xe0, 0x48, 0x8b, 0x37, 0xf9, 0xc2, 0xfe, 0x39, 0x40, 0x4e, 0xa8, 0x93, 0x7f, 0xbc, 0x8a, + 0x09, 0xdd, 0xb7, 0x73, 0x8e, 0x39, 0x2d, 0x0b, 0xc1, 0xed, 0x5b, 0x72, 0xd8, 0xc5, 0xd0, 0x7f, + 0x22, 0xc1, 0x44, 0x78, 0x78, 0x5f, 0x91, 0x15, 0x18, 0x0a, 0x8f, 0xce, 0x55, 0xb8, 0xbb, 0x17, + 0x15, 0xb8, 0xf4, 0x11, 0x7a, 0xf4, 0x64, 0x10, 0xaa, 0xec, 0xf0, 0xf6, 0xe1, 0x9e, 0xad, 0x21, + 0x64, 0x6a, 0x0e, 0x59, 0xa6, 0xc1, 0x9f, 0x48, 0x90, 0x58, 0xb3, 0x2c, 0x03, 0x59, 0x30, 0x66, + 0x5a, 0x5e, 0x85, 0x78, 0x16, 0xae, 0x56, 0xf8, 0x19, 0x0f, 0x3b, 0xd5, 0x9d, 0xeb, 0xcf, 0x48, + 0xdf, 0xbb, 0x39, 0xdd, 0xca, 0x4a, 0x19, 0x35, 0x2d, 0xaf, 0x44, 0x21, 0x1b, 0xec, 0x04, 0xe8, + 0xc3, 0x30, 0x1c, 0x1d, 0x8c, 0x9d, 0x78, 0x3d, 0xd5, 0xf7, 0x60, 0x51, 0x36, 0xb7, 0x6e, 0x4e, + 0x4f, 0x04, 0x11, 0xe3, 0x83, 0x65, 0x65, 0x68, 0x2b, 0x34, 0x7a, 0x31, 0x45, 0xb4, 0xff, 0xe3, + 0x97, 0xa6, 0xa5, 0xd2, 0x85, 0x8e, 0x4f, 0x68, 0x1e, 0xd8, 0x57, 0x84, 0x5d, 0xff, 0x31, 0x43, + 0xf4, 0xb1, 0xcc, 0x0b, 0xe3, 0x30, 0xdd, 0xe1, 0x39, 0x84, 0xb7, 0x7b, 0xa0, 0x47, 0x10, 0x5d, + 0x9e, 0x11, 0xe4, 0x7b, 0x7a, 0xec, 0x21, 0xbf, 0x9e, 0x00, 0xb4, 0xec, 0xd6, 0xe6, 0x48, 0x55, + 0x83, 0x83, 0x43, 0xcf, 0xa6, 0x23, 0x31, 0xe9, 0x0d, 0x1d, 0x89, 0x2d, 0x47, 0x0e, 0x99, 0x62, + 0xfd, 0x1d, 0x6d, 0xf7, 0x7c, 0xd2, 0x14, 0x7f, 0x4b, 0x4e, 0x9a, 0xda, 0x97, 0x2a, 0x89, 0x1f, + 0xe0, 0x8e, 0x29, 0xf9, 0xd6, 0xec, 0x98, 0x26, 0x61, 0x80, 0x9f, 0x41, 0xb3, 0x4f, 0x7d, 0xf3, + 0x16, 0x7a, 0x54, 0x7c, 0x21, 0x79, 0xb0, 0xb7, 0xec, 0xcf, 0xb0, 0x79, 0x9e, 0xf9, 0x5a, 0x1c, + 0xb2, 0xcb, 0x6e, 0xad, 0x5c, 0xd5, 0xbd, 0x37, 0xc9, 0xf7, 0xec, 0xce, 0x9b, 0xcc, 0xb9, 0x5b, + 0x37, 0xa7, 0x47, 0x98, 0xc9, 0x6e, 0xa7, 0xa1, 0xea, 0x30, 0xda, 0xf4, 0x38, 0x87, 0xbb, 0xe6, + 0xfc, 0x41, 0x9e, 0x2a, 0x35, 0xb1, 0x92, 0xe9, 0xbe, 0x20, 0x14, 0x20, 0x68, 0xb7, 0x7d, 0x34, + 0xb0, 0x85, 0xec, 0xe2, 0x9b, 0x79, 0xe6, 0xca, 0xa6, 0xf0, 0xeb, 0x31, 0xc8, 0x2c, 0xbb, 0x62, + 0x9f, 0x8b, 0xff, 0xcc, 0x9e, 0x28, 0x3c, 0xe6, 0xbf, 0x38, 0x12, 0xef, 0x2d, 0x10, 0xa2, 0x2f, + 0x93, 0x7c, 0x2b, 0x4e, 0xf3, 0x70, 0x09, 0xd7, 0x74, 0xd3, 0x5f, 0xac, 0xf1, 0x3b, 0x1b, 0xa3, + 0x1f, 0xa2, 0x8d, 0x51, 0x30, 0xc3, 0x89, 0x83, 0xcc, 0xf0, 0x6f, 0xc5, 0x60, 0x78, 0xd9, 0xad, + 0x6d, 0x9a, 0xd5, 0x77, 0x42, 0xe5, 0x8d, 0x84, 0xca, 0x6d, 0x2f, 0xcd, 0xbe, 0x1e, 0x83, 0x53, + 0xe1, 0x5a, 0xea, 0xd9, 0x06, 0x76, 0xf6, 0xfc, 0x72, 0xc9, 0x56, 0x6b, 0xba, 0x19, 0xbe, 0x3d, + 0x73, 0x24, 0x2c, 0x2c, 0xc5, 0x15, 0x22, 0xcb, 0x26, 0x64, 0xd6, 0xd4, 0x1a, 0x56, 0xf0, 0xb3, + 0x0d, 0xec, 0x7a, 0x6d, 0xde, 0x6d, 0x99, 0x84, 0x01, 0x6b, 0x7b, 0x9b, 0x5d, 0xb6, 0x90, 0x4e, + 0x26, 0x14, 0xde, 0x42, 0x13, 0x90, 0x34, 0xf4, 0xba, 0xce, 0x0c, 0x92, 0x50, 0x58, 0x03, 0x4d, + 0x43, 0x46, 0x23, 0x7a, 0x57, 0xd8, 0x95, 0xfd, 0x84, 0xf8, 0x76, 0x47, 0xc3, 0xf4, 0x36, 0x08, + 0x44, 0x7e, 0x02, 0x86, 0xd8, 0x78, 0x7c, 0x7f, 0x71, 0x04, 0x52, 0xf4, 0x8a, 0x75, 0x30, 0xea, + 0x20, 0x69, 0x5f, 0x66, 0xef, 0xc1, 0x30, 0x2e, 0x6c, 0x60, 0xd6, 0x28, 0x95, 0x3a, 0x9a, 0xf2, + 0x64, 0xf7, 0x49, 0x66, 0x86, 0xf2, 0xcd, 0xf8, 0x9b, 0x49, 0x38, 0xcc, 0xaf, 0xb5, 0xa8, 0xb6, + 0x3e, 0xb3, 0xe3, 0x79, 0xe2, 0x05, 0x33, 0xe0, 0x1b, 0x7b, 0xd5, 0xd6, 0xe5, 0x3d, 0x48, 0x5c, + 0xf4, 0x3c, 0x1b, 0x9d, 0x82, 0xa4, 0xd3, 0x30, 0xb0, 0x78, 0x58, 0x30, 0x51, 0x08, 0x70, 0x0a, + 0x04, 0x41, 0x69, 0x18, 0x58, 0x61, 0x28, 0xa8, 0x0c, 0xd3, 0xdb, 0x0d, 0xc3, 0xd8, 0xab, 0x54, + 0x31, 0xfd, 0x77, 0x4a, 0xfe, 0x7f, 0x2e, 0xc0, 0xbb, 0xb6, 0x6a, 0xfa, 0x45, 0x65, 0x4a, 0x39, + 0x46, 0xd1, 0xe6, 0x29, 0x96, 0xf8, 0xaf, 0x05, 0x65, 0x81, 0x23, 0xff, 0x7e, 0x0c, 0x52, 0x82, + 0x35, 0x7d, 0x31, 0x05, 0x1b, 0x58, 0xf3, 0x2c, 0x71, 0x41, 0xc1, 0x6f, 0x23, 0x04, 0xf1, 0x1a, + 0x9f, 0xa2, 0xf4, 0xc5, 0x43, 0x0a, 0x69, 0x10, 0x98, 0xff, 0xba, 0x10, 0x81, 0xd9, 0x0d, 0x32, + 0x6b, 0x09, 0xdb, 0x12, 0x27, 0x63, 0x17, 0x0f, 0x29, 0xb4, 0x85, 0x72, 0x30, 0x40, 0xa2, 0xcd, + 0x63, 0xdf, 0x94, 0x24, 0x70, 0xde, 0x46, 0x93, 0x90, 0xb4, 0x55, 0x4f, 0x63, 0xd7, 0xec, 0x49, + 0x07, 0x6b, 0x92, 0x78, 0x60, 0xef, 0xf2, 0x36, 0xff, 0xaf, 0x12, 0x62, 0x0c, 0xf6, 0xd1, 0x34, + 0x22, 0xf7, 0x9a, 0xea, 0x79, 0xd8, 0x31, 0x09, 0x43, 0x86, 0x4e, 0xdf, 0x41, 0xb3, 0xaa, 0x7b, + 0xfc, 0xff, 0xa7, 0xd0, 0xdf, 0xfc, 0x3f, 0x3b, 0x50, 0x7f, 0xa8, 0xd0, 0x4e, 0xf6, 0x6f, 0xa3, + 0x86, 0x04, 0xb0, 0x44, 0x90, 0xca, 0x30, 0xae, 0x56, 0xab, 0x3a, 0xf1, 0x6a, 0xd5, 0xa8, 0x6c, + 0xe9, 0xf4, 0xe0, 0xc4, 0xa5, 0xff, 0x14, 0xac, 0xd3, 0x5c, 0xa0, 0x80, 0xa0, 0xc4, 0xf1, 0x4b, + 0x69, 0x18, 0xb4, 0x99, 0x50, 0xf2, 0x79, 0x18, 0x6b, 0x91, 0x94, 0xc8, 0x77, 0x55, 0x37, 0xab, + 0xe2, 0x1d, 0x2a, 0xf2, 0x9b, 0xc0, 0xe8, 0x87, 0x0f, 0xd9, 0xd5, 0x0f, 0xfa, 0xbb, 0xf4, 0xe3, + 0x9d, 0xef, 0x90, 0x8d, 0x84, 0xee, 0x90, 0xa9, 0xb6, 0x5e, 0x4a, 0x53, 0xfe, 0xfc, 0xea, 0xd8, + 0x2c, 0xef, 0x60, 0xd7, 0xc6, 0x0a, 0x96, 0x53, 0x9b, 0xa9, 0x61, 0x53, 0xec, 0x94, 0x48, 0x97, + 0x6a, 0xeb, 0x2e, 0x75, 0xc7, 0xe0, 0x43, 0x8c, 0xee, 0xf9, 0xd0, 0x6f, 0x7a, 0xa3, 0x2c, 0xb1, + 0x30, 0xbb, 0xb6, 0xe8, 0xfb, 0xf1, 0x6f, 0xc4, 0xe0, 0x58, 0xc8, 0x8f, 0x43, 0xc8, 0xad, 0xee, + 0x9c, 0x6f, 0xef, 0xf1, 0x3d, 0x7c, 0xc6, 0xf0, 0x32, 0x24, 0x08, 0x3e, 0xea, 0xf2, 0x7f, 0x17, + 0x72, 0xbf, 0xf4, 0xcf, 0xff, 0x91, 0x4c, 0x9d, 0xa2, 0xfd, 0xac, 0x50, 0x26, 0xa5, 0x4f, 0xf4, + 0x6e, 0xbf, 0x6c, 0xf0, 0x0d, 0x4a, 0xf7, 0xf6, 0x99, 0xb1, 0xd9, 0x86, 0x9f, 0x3f, 0x0f, 0x72, + 0x87, 0xed, 0x27, 0xcb, 0x98, 0xfb, 0x6f, 0x78, 0xfb, 0x48, 0xc7, 0x9d, 0xee, 0xe7, 0xed, 0x37, + 0x83, 0x3d, 0x6e, 0x8d, 0x77, 0x61, 0xf2, 0x49, 0x32, 0x76, 0x70, 0x28, 0x28, 0x12, 0xfb, 0xa4, + 0x7f, 0x73, 0x46, 0xe2, 0xff, 0x93, 0x4d, 0x5c, 0x83, 0x81, 0x40, 0x3e, 0xbe, 0xd1, 0xbd, 0xa7, + 0xd0, 0x71, 0xbd, 0x28, 0x84, 0x16, 0x0b, 0x25, 0x44, 0x29, 0xff, 0x82, 0x04, 0x77, 0xb4, 0x0c, + 0xcd, 0x73, 0xfc, 0x02, 0x40, 0xe8, 0x54, 0x53, 0xea, 0xef, 0xce, 0x5e, 0x88, 0x94, 0x30, 0x6a, + 0x11, 0xf6, 0xde, 0xae, 0xc2, 0x32, 0x29, 0x22, 0xd2, 0x3e, 0x0b, 0x87, 0xa3, 0xc2, 0x0a, 0x33, + 0x3d, 0x0d, 0x23, 0xd1, 0x02, 0x82, 0x17, 0x37, 0x07, 0xb8, 0x7b, 0x31, 0x1c, 0x29, 0x22, 0xe4, + 0x4a, 0xf3, 0xd4, 0xf8, 0xe6, 0x29, 0x43, 0xda, 0x47, 0xe5, 0x5b, 0xc7, 0x9e, 0xad, 0x13, 0x50, + 0xca, 0x5f, 0x97, 0xe0, 0x44, 0x74, 0x84, 0x60, 0xe3, 0xe3, 0xbe, 0xe9, 0xfa, 0xdd, 0x36, 0x47, + 0xfa, 0xae, 0x04, 0x77, 0xee, 0xa3, 0x06, 0xb7, 0xd9, 0x0d, 0x98, 0x08, 0x9d, 0xae, 0x8a, 0x85, + 0x42, 0x38, 0xd7, 0xa9, 0xee, 0xc7, 0xc2, 0xfe, 0x61, 0xe2, 0x51, 0x62, 0xc7, 0xaf, 0x7c, 0x6b, + 0x7a, 0xbc, 0xb5, 0xcf, 0x55, 0xc6, 0x5b, 0x4f, 0x44, 0x6f, 0xa3, 0x17, 0xfe, 0xae, 0x04, 0xf7, + 0x45, 0x55, 0x6d, 0xf3, 0x0c, 0xf6, 0x6d, 0x34, 0x75, 0xff, 0x5e, 0x82, 0x53, 0xbd, 0xe8, 0xc3, + 0xe7, 0x70, 0x0b, 0xc6, 0x83, 0xc7, 0x22, 0xcd, 0x53, 0x78, 0x7f, 0x1f, 0x0f, 0xb7, 0x79, 0x2c, + 0x20, 0x9f, 0xdb, 0x9b, 0x30, 0x57, 0xff, 0x52, 0xe2, 0xf1, 0x1b, 0x76, 0x13, 0x7f, 0x62, 0xa2, + 0x1b, 0x9e, 0x3e, 0x27, 0x26, 0xb4, 0xe9, 0x19, 0x8e, 0x6c, 0x7a, 0xda, 0x4c, 0x79, 0xec, 0x36, + 0x65, 0xa3, 0x6b, 0x3c, 0x5b, 0xb7, 0x79, 0xce, 0xf2, 0x41, 0x18, 0x6f, 0x13, 0x5a, 0x3c, 0x31, + 0xf5, 0x11, 0x59, 0x0a, 0x6a, 0x0d, 0x1e, 0xf9, 0xdf, 0x48, 0x30, 0x4d, 0x07, 0x6e, 0x33, 0x8d, + 0x6f, 0x67, 0x7b, 0xd6, 0x79, 0xee, 0x6d, 0xab, 0x16, 0x37, 0xec, 0x22, 0x0c, 0x30, 0x0f, 0xe5, + 0xb6, 0x3c, 0x80, 0x8b, 0x73, 0x06, 0x41, 0xae, 0x9f, 0x17, 0xfa, 0xb5, 0x4f, 0x18, 0x6f, 0x92, + 0x1d, 0x6f, 0x57, 0xc2, 0x78, 0x45, 0xe4, 0xfa, 0xf6, 0x6a, 0x70, 0xbb, 0x69, 0xb7, 0x2d, 0xd7, + 0x33, 0x23, 0xbe, 0x45, 0x49, 0xdd, 0xd7, 0xa9, 0x4b, 0x52, 0xff, 0x21, 0x9f, 0x23, 0x3f, 0xa9, + 0x77, 0xd1, 0xe7, 0xed, 0x98, 0xd4, 0xff, 0x24, 0x06, 0x47, 0xa8, 0x6e, 0xe1, 0x67, 0x8d, 0x6f, + 0xc1, 0xdc, 0x54, 0x00, 0xb9, 0x8e, 0x56, 0xb9, 0x5d, 0xb9, 0x28, 0xeb, 0x3a, 0xda, 0x95, 0xc8, + 0x8a, 0x5e, 0x01, 0x54, 0x75, 0xbd, 0xe6, 0x01, 0xe2, 0x07, 0x1e, 0xa0, 0xea, 0x7a, 0x57, 0xf6, + 0x29, 0x19, 0x12, 0x07, 0xf6, 0xae, 0x97, 0x25, 0xc8, 0xb7, 0x9b, 0x01, 0xee, 0x4d, 0x3a, 0x4c, + 0x46, 0x1e, 0xa3, 0x37, 0x3b, 0xd4, 0x03, 0xbd, 0x3c, 0x3c, 0x6e, 0x0a, 0xff, 0xc3, 0x0e, 0x7e, + 0x53, 0x13, 0xc0, 0x3f, 0x13, 0x4b, 0x9c, 0x1f, 0x30, 0xad, 0xbb, 0xb1, 0x1f, 0xfe, 0xb0, 0xff, + 0x95, 0x96, 0x15, 0xe6, 0x6d, 0xb1, 0xb1, 0xfb, 0xa6, 0x04, 0x53, 0x1d, 0xc4, 0x7e, 0x3b, 0x97, + 0x17, 0x3b, 0x1d, 0x5d, 0xea, 0x76, 0xef, 0x22, 0xcf, 0xf0, 0x78, 0x8c, 0xbe, 0xaa, 0x17, 0x3a, + 0x45, 0x68, 0xf7, 0xf1, 0x01, 0xf9, 0xfd, 0x70, 0xb4, 0x2d, 0x15, 0x97, 0xad, 0x08, 0x89, 0x1d, + 0xdd, 0xf5, 0xb8, 0x58, 0xf7, 0x74, 0x12, 0xab, 0x89, 0x9a, 0xd2, 0xc8, 0x08, 0xb2, 0x94, 0xf5, + 0x9a, 0x65, 0x19, 0x5c, 0x0c, 0xf9, 0x32, 0x8c, 0x85, 0x60, 0x7c, 0x90, 0xb3, 0x90, 0xb0, 0x2d, + 0xfe, 0x3d, 0x9f, 0xcc, 0xe9, 0x63, 0x9d, 0x06, 0x21, 0x34, 0x5c, 0x6d, 0x8a, 0x2f, 0x4f, 0x00, + 0x62, 0xcc, 0xe8, 0x5d, 0x2f, 0x31, 0xc4, 0x3a, 0x8c, 0x47, 0xa0, 0x7c, 0x90, 0x77, 0xc3, 0x80, + 0x4d, 0x21, 0x7c, 0x98, 0x8e, 0x2f, 0x09, 0x30, 0x3a, 0x51, 0xb6, 0x31, 0x9a, 0xd3, 0xdf, 0x3b, + 0x0c, 0x49, 0xca, 0x15, 0x7d, 0x46, 0x02, 0x08, 0xdd, 0xdc, 0x2a, 0x74, 0x62, 0xd3, 0xfe, 0x34, + 0x27, 0x3f, 0xd3, 0x33, 0x3e, 0xaf, 0xbb, 0x4f, 0xfd, 0xf8, 0xbf, 0xfe, 0xce, 0xcf, 0xc4, 0xee, + 0x46, 0xf2, 0x4c, 0x87, 0x73, 0xa4, 0x50, 0x30, 0x7e, 0x59, 0x0a, 0xbf, 0x4b, 0xf6, 0x60, 0x6f, + 0x43, 0x09, 0xc9, 0x0a, 0xbd, 0xa2, 0x73, 0xc1, 0xce, 0x53, 0xc1, 0x1e, 0x45, 0x8f, 0x74, 0x17, + 0x6c, 0xe6, 0x43, 0xd1, 0xe8, 0xfa, 0x08, 0xfa, 0xa6, 0x04, 0x13, 0xed, 0x8e, 0x09, 0xd0, 0xb9, + 0xde, 0xa4, 0x68, 0x2d, 0xc8, 0xf2, 0x8f, 0x1f, 0x80, 0x92, 0xab, 0xb2, 0x40, 0x55, 0x99, 0x45, + 0x4f, 0x1c, 0x40, 0x95, 0x99, 0xd0, 0xea, 0x87, 0xfe, 0x9f, 0x04, 0xc7, 0xf7, 0xdd, 0x42, 0xa3, + 0xd9, 0xde, 0xa4, 0xdc, 0xa7, 0xf2, 0xcc, 0x97, 0xde, 0x08, 0x0b, 0xae, 0xf1, 0x93, 0x54, 0xe3, + 0xcb, 0x68, 0xf1, 0x20, 0x1a, 0x07, 0x65, 0x62, 0x58, 0xf7, 0xdf, 0x96, 0x22, 0xaf, 0x53, 0xec, + 0xef, 0x4e, 0x2d, 0x7b, 0xc7, 0x2e, 0x81, 0xd1, 0xba, 0x25, 0x90, 0x9f, 0xa6, 0x2a, 0x28, 0x68, + 0xed, 0x0d, 0x4e, 0xda, 0xcc, 0x87, 0xa2, 0x8b, 0xca, 0x47, 0xd0, 0xff, 0x91, 0xda, 0xbf, 0xbf, + 0xf0, 0xd8, 0xbe, 0x22, 0x76, 0xde, 0x17, 0xe7, 0xcf, 0xf5, 0x4f, 0xc8, 0x95, 0xac, 0x53, 0x25, + 0x6b, 0x08, 0xdf, 0x6e, 0x25, 0xdb, 0x4e, 0x22, 0xfa, 0x1d, 0x09, 0x26, 0xda, 0xed, 0xe8, 0xba, + 0x84, 0xe5, 0x3e, 0x7b, 0xd9, 0x2e, 0x61, 0xb9, 0xdf, 0xf6, 0x51, 0x7e, 0x37, 0x55, 0xfe, 0x2c, + 0x3a, 0xd3, 0x49, 0xf9, 0x7d, 0x67, 0x91, 0xc4, 0xe2, 0xbe, 0x3b, 0x9f, 0x2e, 0xb1, 0xd8, 0xcb, + 0x2e, 0xb0, 0x4b, 0x2c, 0xf6, 0xb4, 0xf1, 0xea, 0x1e, 0x8b, 0xbe, 0x66, 0x3d, 0x4e, 0xa3, 0x8b, + 0x7e, 0x43, 0x82, 0xe1, 0x48, 0x5d, 0x8e, 0x1e, 0xde, 0x57, 0xd0, 0x76, 0xbb, 0xa8, 0xfc, 0xe9, + 0x7e, 0x48, 0xb8, 0x2e, 0x8b, 0x54, 0x97, 0x39, 0x34, 0x7b, 0x10, 0x5d, 0x9c, 0x88, 0xc4, 0x2f, + 0x4b, 0x30, 0xde, 0xa6, 0x84, 0xed, 0x12, 0x85, 0x9d, 0x4b, 0xf7, 0xfc, 0xb9, 0xfe, 0x09, 0xb9, + 0x56, 0x17, 0xa8, 0x56, 0xef, 0x43, 0xef, 0x3d, 0x88, 0x56, 0xa1, 0xf5, 0xf9, 0x66, 0x70, 0x3f, + 0x3a, 0x34, 0x0e, 0x3a, 0xdb, 0xa7, 0x60, 0x42, 0xa1, 0xc7, 0xfa, 0xa6, 0xe3, 0xfa, 0x3c, 0x45, + 0xf5, 0x79, 0x12, 0xad, 0xbe, 0x31, 0x7d, 0x5a, 0x97, 0xf5, 0xaf, 0xb6, 0x7e, 0x2a, 0x62, 0x7f, + 0x2f, 0x6a, 0x5b, 0xac, 0xe6, 0x1f, 0xe9, 0x8b, 0x86, 0x2b, 0x75, 0x8e, 0x2a, 0x75, 0x1a, 0x3d, + 0xd4, 0x49, 0xa9, 0xd0, 0x25, 0x78, 0xdd, 0xdc, 0xb6, 0x66, 0x3e, 0xc4, 0x4a, 0xe0, 0x8f, 0xa0, + 0x1f, 0x13, 0x17, 0x90, 0x4f, 0xee, 0x3b, 0x6e, 0xa8, 0x8e, 0xcd, 0xdf, 0xd7, 0x03, 0x26, 0x97, + 0xeb, 0x6e, 0x2a, 0xd7, 0x14, 0x3a, 0xd6, 0x49, 0x2e, 0x52, 0xcb, 0xa2, 0x4f, 0x4a, 0xfe, 0x3b, + 0x0b, 0xa7, 0xf6, 0xe7, 0x1d, 0x2e, 0x76, 0xf3, 0xf7, 0xf7, 0x84, 0xcb, 0x25, 0xb9, 0x87, 0x4a, + 0x72, 0x02, 0x4d, 0x75, 0x94, 0x84, 0x95, 0xbe, 0xb7, 0xfb, 0xce, 0xcb, 0x67, 0x53, 0x1d, 0x3f, + 0x8b, 0x52, 0xc3, 0x26, 0x76, 0x75, 0xf7, 0x40, 0x77, 0x92, 0x7b, 0x7b, 0xb0, 0xfa, 0xcd, 0x24, + 0x0c, 0x2d, 0xb0, 0x51, 0xd6, 0x3d, 0xd5, 0x7b, 0x83, 0x1b, 0x01, 0xe4, 0xf2, 0x0f, 0x19, 0xd2, + 0x2b, 0x2d, 0x15, 0xdb, 0xba, 0x8e, 0xc5, 0x5e, 0x71, 0xb1, 0xef, 0xcb, 0xc0, 0xfc, 0xfd, 0xfc, + 0x66, 0x7e, 0x32, 0xfb, 0x26, 0x22, 0xbd, 0x75, 0xb3, 0x46, 0x00, 0xe8, 0x63, 0x12, 0x1c, 0xa6, + 0x58, 0x41, 0xbc, 0x51, 0x4c, 0xf1, 0x3e, 0x61, 0x47, 0x8f, 0x59, 0x52, 0x43, 0xc7, 0x3f, 0x94, + 0x57, 0xe9, 0x6e, 0xfe, 0x7a, 0xcb, 0xb1, 0xd0, 0xe0, 0xcd, 0x6c, 0x65, 0x65, 0xdc, 0x68, 0xa1, + 0x74, 0x9b, 0x0e, 0x0d, 0x12, 0x07, 0x3f, 0x34, 0xb8, 0x04, 0x99, 0x50, 0xa6, 0xcf, 0x25, 0xbb, + 0xbc, 0xc2, 0xdb, 0x7c, 0xb2, 0x18, 0x26, 0x46, 0x9f, 0x90, 0xe0, 0x70, 0xdb, 0x45, 0x90, 0xfe, + 0x1f, 0xce, 0x3e, 0x4f, 0x2e, 0x9b, 0x8c, 0xd3, 0x96, 0xaf, 0xac, 0x4c, 0x34, 0xda, 0x55, 0x13, + 0x6b, 0x30, 0x1c, 0x59, 0xc0, 0x72, 0xe2, 0xbf, 0xe9, 0xf6, 0xfe, 0xc2, 0x45, 0x94, 0x01, 0xca, + 0x43, 0x0a, 0xef, 0xda, 0x96, 0xe3, 0xe1, 0x2a, 0xbd, 0xac, 0x93, 0x52, 0xfc, 0xb6, 0x7c, 0x1d, + 0x50, 0xeb, 0xe4, 0xa2, 0xcb, 0x30, 0x18, 0xbd, 0xda, 0x77, 0x80, 0x03, 0x0c, 0xc1, 0x01, 0x4d, + 0x40, 0x32, 0xf0, 0xef, 0xb8, 0xc2, 0x1a, 0xb7, 0x3b, 0x39, 0xfc, 0x69, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x75, 0x0a, 0xea, 0x1f, 0x47, 0x91, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) diff --git a/x/upgrade/types/query.pb.gw.go b/x/upgrade/types/query.pb.gw.go index 00965639dca6..6d311b577828 100644 --- a/x/upgrade/types/query.pb.gw.go +++ b/x/upgrade/types/query.pb.gw.go @@ -13,6 +13,7 @@ import ( "io" "net/http" + "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -22,11 +23,13 @@ import ( "google.golang.org/grpc/status" ) +// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage func request_Query_CurrentPlan_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryCurrentPlanRequest @@ -37,6 +40,15 @@ func request_Query_CurrentPlan_0(ctx context.Context, marshaler runtime.Marshale } +func local_request_Query_CurrentPlan_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryCurrentPlanRequest + var metadata runtime.ServerMetadata + + msg, err := server.CurrentPlan(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_AppliedPlan_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryAppliedPlanRequest var metadata runtime.ServerMetadata @@ -64,6 +76,82 @@ func request_Query_AppliedPlan_0(ctx context.Context, marshaler runtime.Marshale } +func local_request_Query_AppliedPlan_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryAppliedPlanRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") + } + + protoReq.Name, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) + } + + msg, err := server.AppliedPlan(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_CurrentPlan_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_CurrentPlan_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_CurrentPlan_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_AppliedPlan_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_AppliedPlan_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_AppliedPlan_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + // RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { From 9587c2b06a69e100807a01dff4753a927ca88ccd Mon Sep 17 00:00:00 2001 From: blushi Date: Thu, 27 Aug 2020 18:03:00 +0200 Subject: [PATCH 016/128] Add Sign and VerifySignature tests --- crypto/keys/keys.go | 11 ++----- crypto/keys/keys_test.go | 46 ++++++++++++++++++++++++------ crypto/keys/secp256k1/secp256k1.go | 10 ++----- crypto/keys/sr25519/privkey.go | 5 +--- crypto/keys/sr25519/pubkey.go | 5 +--- 5 files changed, 43 insertions(+), 34 deletions(-) diff --git a/crypto/keys/keys.go b/crypto/keys/keys.go index a03397800327..489ee196d00d 100644 --- a/crypto/keys/keys.go +++ b/crypto/keys/keys.go @@ -5,7 +5,6 @@ import ( "crypto/subtle" "github.com/cosmos/cosmos-sdk/crypto" - // "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/keys/sr25519" "github.com/tendermint/tendermint/crypto/ed25519" @@ -49,10 +48,7 @@ func (m *Ed25519PubKey) VerifySignature(msg []byte, sig []byte) bool { } func (m *Ed25519PubKey) Equals(key crypto.PubKey) bool { - if m.Key.Type() != key.Type() { - return false - } - return bytes.Equal(m.Key.Bytes(), key.Bytes()) + return m.Key.Type() == key.Type() && bytes.Equal(m.Key.Bytes(), key.Bytes()) } func (m *Ed25519PubKey) Type() string { @@ -132,10 +128,7 @@ func (m *Ed25519PrivKey) PubKey() crypto.PubKey { } func (m *Ed25519PrivKey) Equals(key crypto.PrivKey) bool { - if m.Key.Type() != key.Type() { - return false - } - return subtle.ConstantTimeCompare(m.Key.Bytes(), key.Bytes()) == 1 + return m.Key.Type() == key.Type() && subtle.ConstantTimeCompare(m.Key.Bytes(), key.Bytes()) == 1 } func (m *Ed25519PrivKey) Type() string { diff --git a/crypto/keys/keys_test.go b/crypto/keys/keys_test.go index 1d3ad93cb223..3f38e321aae0 100644 --- a/crypto/keys/keys_test.go +++ b/crypto/keys/keys_test.go @@ -4,9 +4,9 @@ import ( "testing" "github.com/cosmos/cosmos-sdk/crypto/keys" - // "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/keys/sr25519" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/ed25519" @@ -94,14 +94,6 @@ func TestPubKeyEquals(t *testing.T) { }, true, }, - { - "tm ed25519 equals pb ed25519", - ed25519PubKey, - &keys.Ed25519PubKey{ - Key: ed25519PubKey, - }, - true, - }, { "ed25519 different types", ed25519PbPubKey, @@ -323,3 +315,39 @@ func TestPrivKeyEquals(t *testing.T) { }) } } + +func TestSignAndVerifySignature(t *testing.T) { + testCases := []struct { + msg string + privKey crypto.PrivKey + }{ + { + "ed25519", + &keys.Ed25519PrivKey{Key: ed25519.GenPrivKey()}, + }, + { + "sr25519", + &keys.Sr25519PrivKey{Key: sr25519.GenPrivKey()}, + }, + { + "secp256k1", + &keys.Secp256K1PrivKey{Key: secp256k1.GenPrivKey()}, + }, + } + + for _, tc := range testCases { + t.Run(tc.msg, func(t *testing.T) { + pubKey := tc.privKey.PubKey() + msg := crypto.CRandBytes(128) + sig, err := tc.privKey.Sign(msg) + require.Nil(t, err) + + assert.True(t, pubKey.VerifySignature(msg, sig)) + + sig[7] ^= byte(0x01) + + assert.False(t, pubKey.VerifySignature(msg, sig)) + }) + } + +} diff --git a/crypto/keys/secp256k1/secp256k1.go b/crypto/keys/secp256k1/secp256k1.go index 7e4d71334830..f30b247b8b6f 100644 --- a/crypto/keys/secp256k1/secp256k1.go +++ b/crypto/keys/secp256k1/secp256k1.go @@ -39,10 +39,7 @@ func (privKey PrivKey) PubKey() crypto.PubKey { // Equals - you probably don't need to use this. // Runs in constant time based on length of the keys. func (privKey PrivKey) Equals(other crypto.PrivKey) bool { - if privKey.Type() != other.Type() { - return false - } - return subtle.ConstantTimeCompare(privKey.Bytes(), other.Bytes()) == 1 + return privKey.Type() == other.Type() && subtle.ConstantTimeCompare(privKey.Bytes(), other.Bytes()) == 1 } func (privKey PrivKey) Type() string { @@ -152,8 +149,5 @@ func (pubKey PubKey) Type() string { } func (pubKey PubKey) Equals(other crypto.PubKey) bool { - if pubKey.Type() != other.Type() { - return false - } - return bytes.Equal(pubKey.Bytes(), other.Bytes()) + return pubKey.Type() == other.Type() && bytes.Equal(pubKey.Bytes(), other.Bytes()) } diff --git a/crypto/keys/sr25519/privkey.go b/crypto/keys/sr25519/privkey.go index b8e7eec7a41d..f9b7f88ec44e 100644 --- a/crypto/keys/sr25519/privkey.go +++ b/crypto/keys/sr25519/privkey.go @@ -63,10 +63,7 @@ func (privKey PrivKey) PubKey() crypto.PubKey { // Equals - you probably don't need to use this. // Runs in constant time based on length of the keys. func (privKey PrivKey) Equals(other crypto.PrivKey) bool { - if privKey.Type() != other.Type() { - return false - } - return subtle.ConstantTimeCompare(privKey.Bytes(), other.Bytes()) == 1 + return privKey.Type() == other.Type() && subtle.ConstantTimeCompare(privKey.Bytes(), other.Bytes()) == 1 } func (privKey PrivKey) Type() string { diff --git a/crypto/keys/sr25519/pubkey.go b/crypto/keys/sr25519/pubkey.go index dafd169fb093..79deafd0916f 100644 --- a/crypto/keys/sr25519/pubkey.go +++ b/crypto/keys/sr25519/pubkey.go @@ -65,10 +65,7 @@ func (pubKey PubKey) String() string { // Equals - checks that two public keys are the same time // Runs in constant time based on length of the keys. func (pubKey PubKey) Equals(other crypto.PubKey) bool { - if pubKey.Type() != other.Type() { - return false - } - return bytes.Equal(pubKey.Bytes(), other.Bytes()) + return pubKey.Type() == other.Type() && bytes.Equal(pubKey.Bytes(), other.Bytes()) } func (pubKey PubKey) Type() string { From 41261d174d3e6997a4ae301b175da702630685c2 Mon Sep 17 00:00:00 2001 From: blushi Date: Mon, 31 Aug 2020 12:41:03 +0200 Subject: [PATCH 017/128] Remove ed25519 and sr25519 references --- client/grpc/reflection/reflection.pb.gw.go | 1 + client/grpc/simulate/simulate.pb.gw.go | 1 + crypto/keys/keys.go | 89 +- crypto/keys/keys.pb.go | 940 ++-------------- crypto/keys/keys_test.go | 206 +--- go.sum | 1 + proto/cosmos/keys/keys.proto | 21 +- x/auth/types/query.pb.gw.go | 1 + x/bank/types/query.pb.gw.go | 1 + x/distribution/types/query.pb.gw.go | 1 + x/evidence/types/query.pb.gw.go | 1 + x/gov/types/query.pb.gw.go | 1 + x/ibc-transfer/types/query.pb.gw.go | 1 + x/ibc/02-client/types/query.pb.gw.go | 1 + x/ibc/03-connection/types/query.pb.gw.go | 1 + x/ibc/04-channel/types/query.pb.gw.go | 1 + x/mint/types/query.pb.gw.go | 1 + x/params/types/proposal/query.pb.gw.go | 1 + x/slashing/types/query.pb.gw.go | 1 + x/staking/types/query.pb.gw.go | 1 + x/staking/types/staking.pb.go | 1127 ++++++++++---------- x/upgrade/types/query.pb.gw.go | 1 + 22 files changed, 699 insertions(+), 1701 deletions(-) diff --git a/client/grpc/reflection/reflection.pb.gw.go b/client/grpc/reflection/reflection.pb.gw.go index b3e8c464149d..ab486750e860 100644 --- a/client/grpc/reflection/reflection.pb.gw.go +++ b/client/grpc/reflection/reflection.pb.gw.go @@ -106,6 +106,7 @@ func local_request_ReflectionService_ListImplementations_0(ctx context.Context, // RegisterReflectionServiceHandlerServer registers the http handlers for service ReflectionService to "mux". // UnaryRPC :call ReflectionServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterReflectionServiceHandlerFromEndpoint instead. func RegisterReflectionServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ReflectionServiceServer) error { mux.Handle("GET", pattern_ReflectionService_ListAllInterfaces_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { diff --git a/client/grpc/simulate/simulate.pb.gw.go b/client/grpc/simulate/simulate.pb.gw.go index 733449d03704..78cb85437c22 100644 --- a/client/grpc/simulate/simulate.pb.gw.go +++ b/client/grpc/simulate/simulate.pb.gw.go @@ -70,6 +70,7 @@ func local_request_SimulateService_Simulate_0(ctx context.Context, marshaler run // RegisterSimulateServiceHandlerServer registers the http handlers for service SimulateService to "mux". // UnaryRPC :call SimulateServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterSimulateServiceHandlerFromEndpoint instead. func RegisterSimulateServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server SimulateServiceServer) error { mux.Handle("POST", pattern_SimulateService_Simulate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { diff --git a/crypto/keys/keys.go b/crypto/keys/keys.go index 489ee196d00d..344530dd5ce4 100644 --- a/crypto/keys/keys.go +++ b/crypto/keys/keys.go @@ -1,18 +1,13 @@ package keys import ( - "bytes" - "crypto/subtle" - "github.com/cosmos/cosmos-sdk/crypto" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - "github.com/cosmos/cosmos-sdk/crypto/keys/sr25519" - "github.com/tendermint/tendermint/crypto/ed25519" ) var ( - _, _, _ crypto.PubKey = &Secp256K1PubKey{}, &Ed25519PubKey{}, &Sr25519PubKey{} - _, _, _ crypto.PrivKey = &Secp256K1PrivKey{}, &Ed25519PrivKey{}, &Sr25519PrivKey{} + _ crypto.PubKey = &Secp256K1PubKey{} + _ crypto.PrivKey = &Secp256K1PrivKey{} ) func (m *Secp256K1PubKey) Address() crypto.Address { @@ -35,46 +30,6 @@ func (m *Secp256K1PubKey) Type() string { return m.Key.Type() } -func (m *Ed25519PubKey) Address() crypto.Address { - return m.Key.Address() -} - -func (m *Ed25519PubKey) Bytes() []byte { - return m.Key.Bytes() -} - -func (m *Ed25519PubKey) VerifySignature(msg []byte, sig []byte) bool { - return m.Key.VerifySignature(msg, sig) -} - -func (m *Ed25519PubKey) Equals(key crypto.PubKey) bool { - return m.Key.Type() == key.Type() && bytes.Equal(m.Key.Bytes(), key.Bytes()) -} - -func (m *Ed25519PubKey) Type() string { - return m.Key.Type() -} - -func (m *Sr25519PubKey) Address() crypto.Address { - return m.Key.Address() -} - -func (m *Sr25519PubKey) Bytes() []byte { - return m.Key.Bytes() -} - -func (m *Sr25519PubKey) VerifySignature(msg []byte, sig []byte) bool { - return m.Key.VerifySignature(msg, sig) -} - -func (m *Sr25519PubKey) Equals(key crypto.PubKey) bool { - return m.Key.Equals(key) -} - -func (m *Sr25519PubKey) Type() string { - return m.Key.Type() -} - func (m *Secp256K1PrivKey) Bytes() []byte { return m.Key.Bytes() } @@ -94,43 +49,3 @@ func (m *Secp256K1PrivKey) Equals(key crypto.PrivKey) bool { func (m *Secp256K1PrivKey) Type() string { return m.Key.Type() } - -func (m *Sr25519PrivKey) Bytes() []byte { - return m.Key.Bytes() -} - -func (m *Sr25519PrivKey) Sign(msg []byte) ([]byte, error) { - return m.Key.Sign(msg) -} - -func (m *Sr25519PrivKey) PubKey() crypto.PubKey { - return &Sr25519PubKey{Key: m.Key.PubKey().(sr25519.PubKey)} -} - -func (m *Sr25519PrivKey) Equals(key crypto.PrivKey) bool { - return m.Key.Equals(key) -} - -func (m *Sr25519PrivKey) Type() string { - return m.Key.Type() -} - -func (m *Ed25519PrivKey) Bytes() []byte { - return m.Key.Bytes() -} - -func (m *Ed25519PrivKey) Sign(msg []byte) ([]byte, error) { - return m.Key.Sign(msg) -} - -func (m *Ed25519PrivKey) PubKey() crypto.PubKey { - return &Ed25519PubKey{Key: m.Key.PubKey().(ed25519.PubKey)} -} - -func (m *Ed25519PrivKey) Equals(key crypto.PrivKey) bool { - return m.Key.Type() == key.Type() && subtle.ConstantTimeCompare(m.Key.Bytes(), key.Bytes()) == 1 -} - -func (m *Ed25519PrivKey) Type() string { - return m.Key.Type() -} diff --git a/crypto/keys/keys.pb.go b/crypto/keys/keys.pb.go index 7d7a1ae5bab2..2fdf531b549f 100644 --- a/crypto/keys/keys.pb.go +++ b/crypto/keys/keys.pb.go @@ -7,10 +7,8 @@ import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" github_com_cosmos_cosmos_sdk_crypto_keys_secp256k1 "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - github_com_cosmos_cosmos_sdk_crypto_keys_sr25519 "github.com/cosmos/cosmos-sdk/crypto/keys/sr25519" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" - github_com_tendermint_tendermint_crypto_ed25519 "github.com/tendermint/tendermint/crypto/ed25519" io "io" math "math" math_bits "math/bits" @@ -222,228 +220,40 @@ func (m *Secp256K1PrivKey) GetKey() github_com_cosmos_cosmos_sdk_crypto_keys_sec return nil } -type Ed25519PubKey struct { - // bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519.PubKey"]; - Key github_com_tendermint_tendermint_crypto_ed25519.PubKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/tendermint/tendermint/crypto/ed25519.PubKey" json:"key,omitempty"` -} - -func (m *Ed25519PubKey) Reset() { *m = Ed25519PubKey{} } -func (m *Ed25519PubKey) String() string { return proto.CompactTextString(m) } -func (*Ed25519PubKey) ProtoMessage() {} -func (*Ed25519PubKey) Descriptor() ([]byte, []int) { - return fileDescriptor_9a7b75e504952b64, []int{4} -} -func (m *Ed25519PubKey) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ed25519PubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ed25519PubKey.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ed25519PubKey) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ed25519PubKey.Merge(m, src) -} -func (m *Ed25519PubKey) XXX_Size() int { - return m.Size() -} -func (m *Ed25519PubKey) XXX_DiscardUnknown() { - xxx_messageInfo_Ed25519PubKey.DiscardUnknown(m) -} - -var xxx_messageInfo_Ed25519PubKey proto.InternalMessageInfo - -func (m *Ed25519PubKey) GetKey() github_com_tendermint_tendermint_crypto_ed25519.PubKey { - if m != nil { - return m.Key - } - return nil -} - -type Ed25519PrivKey struct { - // bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519.PrivKey"]; - Key github_com_tendermint_tendermint_crypto_ed25519.PrivKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/tendermint/tendermint/crypto/ed25519.PrivKey" json:"key,omitempty"` -} - -func (m *Ed25519PrivKey) Reset() { *m = Ed25519PrivKey{} } -func (m *Ed25519PrivKey) String() string { return proto.CompactTextString(m) } -func (*Ed25519PrivKey) ProtoMessage() {} -func (*Ed25519PrivKey) Descriptor() ([]byte, []int) { - return fileDescriptor_9a7b75e504952b64, []int{5} -} -func (m *Ed25519PrivKey) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ed25519PrivKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ed25519PrivKey.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ed25519PrivKey) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ed25519PrivKey.Merge(m, src) -} -func (m *Ed25519PrivKey) XXX_Size() int { - return m.Size() -} -func (m *Ed25519PrivKey) XXX_DiscardUnknown() { - xxx_messageInfo_Ed25519PrivKey.DiscardUnknown(m) -} - -var xxx_messageInfo_Ed25519PrivKey proto.InternalMessageInfo - -func (m *Ed25519PrivKey) GetKey() github_com_tendermint_tendermint_crypto_ed25519.PrivKey { - if m != nil { - return m.Key - } - return nil -} - -type Sr25519PubKey struct { - Key github_com_cosmos_cosmos_sdk_crypto_keys_sr25519.PubKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/cosmos/cosmos-sdk/crypto/keys/sr25519.PubKey" json:"key,omitempty"` -} - -func (m *Sr25519PubKey) Reset() { *m = Sr25519PubKey{} } -func (m *Sr25519PubKey) String() string { return proto.CompactTextString(m) } -func (*Sr25519PubKey) ProtoMessage() {} -func (*Sr25519PubKey) Descriptor() ([]byte, []int) { - return fileDescriptor_9a7b75e504952b64, []int{6} -} -func (m *Sr25519PubKey) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Sr25519PubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Sr25519PubKey.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Sr25519PubKey) XXX_Merge(src proto.Message) { - xxx_messageInfo_Sr25519PubKey.Merge(m, src) -} -func (m *Sr25519PubKey) XXX_Size() int { - return m.Size() -} -func (m *Sr25519PubKey) XXX_DiscardUnknown() { - xxx_messageInfo_Sr25519PubKey.DiscardUnknown(m) -} - -var xxx_messageInfo_Sr25519PubKey proto.InternalMessageInfo - -func (m *Sr25519PubKey) GetKey() github_com_cosmos_cosmos_sdk_crypto_keys_sr25519.PubKey { - if m != nil { - return m.Key - } - return nil -} - -type Sr25519PrivKey struct { - Key github_com_cosmos_cosmos_sdk_crypto_keys_sr25519.PrivKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/cosmos/cosmos-sdk/crypto/keys/sr25519.PrivKey" json:"key,omitempty"` -} - -func (m *Sr25519PrivKey) Reset() { *m = Sr25519PrivKey{} } -func (m *Sr25519PrivKey) String() string { return proto.CompactTextString(m) } -func (*Sr25519PrivKey) ProtoMessage() {} -func (*Sr25519PrivKey) Descriptor() ([]byte, []int) { - return fileDescriptor_9a7b75e504952b64, []int{7} -} -func (m *Sr25519PrivKey) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Sr25519PrivKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Sr25519PrivKey.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Sr25519PrivKey) XXX_Merge(src proto.Message) { - xxx_messageInfo_Sr25519PrivKey.Merge(m, src) -} -func (m *Sr25519PrivKey) XXX_Size() int { - return m.Size() -} -func (m *Sr25519PrivKey) XXX_DiscardUnknown() { - xxx_messageInfo_Sr25519PrivKey.DiscardUnknown(m) -} - -var xxx_messageInfo_Sr25519PrivKey proto.InternalMessageInfo - -func (m *Sr25519PrivKey) GetKey() github_com_cosmos_cosmos_sdk_crypto_keys_sr25519.PrivKey { - if m != nil { - return m.Key - } - return nil -} - func init() { proto.RegisterType((*MultisigThresholdPubKey)(nil), "cosmos.crypto.MultisigThresholdPubKey") proto.RegisterType((*LegacyAminoMultisigThresholdPubKey)(nil), "cosmos.crypto.LegacyAminoMultisigThresholdPubKey") proto.RegisterType((*Secp256K1PubKey)(nil), "cosmos.crypto.Secp256K1PubKey") proto.RegisterType((*Secp256K1PrivKey)(nil), "cosmos.crypto.Secp256K1PrivKey") - proto.RegisterType((*Ed25519PubKey)(nil), "cosmos.crypto.Ed25519PubKey") - proto.RegisterType((*Ed25519PrivKey)(nil), "cosmos.crypto.Ed25519PrivKey") - proto.RegisterType((*Sr25519PubKey)(nil), "cosmos.crypto.Sr25519PubKey") - proto.RegisterType((*Sr25519PrivKey)(nil), "cosmos.crypto.Sr25519PrivKey") } func init() { proto.RegisterFile("cosmos/keys/keys.proto", fileDescriptor_9a7b75e504952b64) } var fileDescriptor_9a7b75e504952b64 = []byte{ - // 455 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x92, 0xcb, 0x6e, 0xd3, 0x40, - 0x14, 0x86, 0x33, 0x54, 0x02, 0x31, 0xc5, 0xa1, 0x8a, 0x2a, 0x68, 0x2b, 0xe1, 0xa9, 0xbc, 0xca, - 0x06, 0x5b, 0x09, 0x4a, 0x4b, 0xc3, 0x45, 0xaa, 0x25, 0x56, 0x69, 0xa1, 0x4a, 0xbb, 0x42, 0x82, - 0x12, 0xdb, 0x83, 0x63, 0xf9, 0x32, 0x96, 0x2f, 0x48, 0xf3, 0x16, 0x3c, 0x06, 0x7b, 0x5e, 0x82, - 0x65, 0x96, 0xac, 0x46, 0xc8, 0x79, 0x83, 0x2c, 0xbd, 0x42, 0xf6, 0xb1, 0xc9, 0x20, 0x24, 0x20, - 0xec, 0xd8, 0xd8, 0xe3, 0x39, 0xe3, 0xef, 0xfb, 0x8f, 0x8f, 0xf1, 0x3d, 0x9b, 0xa5, 0x21, 0x4b, - 0x0d, 0x9f, 0x72, 0xb8, 0xe8, 0x71, 0xc2, 0x32, 0xd6, 0x53, 0x60, 0x5f, 0xb7, 0x13, 0x1e, 0x67, - 0xec, 0x60, 0xd7, 0x65, 0x2e, 0xab, 0x2b, 0x46, 0xb5, 0x82, 0x43, 0x07, 0xfb, 0x2e, 0x63, 0x6e, - 0x40, 0x8d, 0xfa, 0xc9, 0xca, 0xdf, 0x1b, 0xb3, 0x88, 0x43, 0x49, 0xfb, 0x84, 0xf0, 0xfd, 0xf3, - 0x3c, 0xc8, 0xbc, 0xd4, 0x73, 0xaf, 0xe6, 0x09, 0x4d, 0xe7, 0x2c, 0x70, 0x2e, 0x72, 0x6b, 0x42, - 0x79, 0xef, 0x18, 0xdf, 0xce, 0xda, 0xad, 0x3d, 0x74, 0x88, 0xfa, 0x8a, 0xb9, 0x5f, 0x08, 0x82, - 0x26, 0x2b, 0x41, 0x76, 0xf8, 0x2c, 0x0c, 0xc6, 0xda, 0x8f, 0xba, 0x36, 0x5d, 0x9f, 0xed, 0x5d, - 0xe1, 0xed, 0x38, 0xb7, 0x02, 0xcf, 0xbe, 0xae, 0x92, 0xee, 0xdd, 0x38, 0xdc, 0xea, 0x6f, 0x0f, - 0x77, 0x75, 0x48, 0xa1, 0xb7, 0x29, 0xf4, 0xd3, 0x88, 0x9b, 0x0f, 0x0a, 0x41, 0x6e, 0x81, 0x2f, - 0x5d, 0x09, 0xd2, 0x05, 0x6c, 0x9c, 0x5b, 0xd5, 0x9b, 0xda, 0x14, 0x03, 0xa7, 0xaa, 0x6a, 0x9f, - 0x11, 0xd6, 0xce, 0xa8, 0x3b, 0xb3, 0xf9, 0x69, 0xe8, 0x45, 0xec, 0x3f, 0x49, 0x6d, 0xe1, 0xbb, - 0x97, 0xd4, 0x8e, 0x87, 0xa3, 0xa3, 0xc9, 0xa0, 0x49, 0xf8, 0x0a, 0x6f, 0xf9, 0x94, 0xd7, 0xd9, - 0xee, 0x98, 0xcf, 0x4a, 0x41, 0x4e, 0x5c, 0x2f, 0x9b, 0xe7, 0x96, 0x6e, 0xb3, 0xd0, 0x68, 0xe6, - 0x0c, 0xb7, 0x87, 0xa9, 0xe3, 0x1b, 0x30, 0x5a, 0x98, 0x7c, 0x0a, 0x28, 0x7f, 0xa0, 0x03, 0x6b, - 0x5a, 0x91, 0x34, 0x07, 0xef, 0xac, 0x1d, 0x89, 0xf7, 0xa1, 0x92, 0x5c, 0xc8, 0x92, 0xe7, 0xa5, - 0x20, 0xe3, 0x7f, 0x91, 0x00, 0x0c, 0x2c, 0x6f, 0xb0, 0xf2, 0xc2, 0x19, 0x8e, 0x46, 0x83, 0x93, - 0xa6, 0x8f, 0x33, 0x59, 0x31, 0x2e, 0x05, 0x39, 0x92, 0x14, 0x19, 0x8d, 0x1c, 0x9a, 0x84, 0x5e, - 0x94, 0xc9, 0xcb, 0x46, 0x43, 0x81, 0xf3, 0x53, 0x13, 0xd7, 0xb8, 0xdb, 0xe2, 0x9b, 0x16, 0xce, - 0x65, 0xfe, 0x93, 0x52, 0x90, 0xe3, 0x8d, 0xf9, 0x72, 0xfe, 0xb7, 0x58, 0xb9, 0x4c, 0xe4, 0xfc, - 0xbf, 0xe5, 0xff, 0xe1, 0x13, 0x25, 0xbf, 0x36, 0xf0, 0x0e, 0x77, 0x5b, 0x7e, 0xd3, 0xc0, 0x4b, - 0x59, 0xf0, 0xb4, 0x14, 0xe4, 0xf1, 0xe6, 0x02, 0xa9, 0x03, 0xd3, 0xfc, 0x52, 0xa8, 0x68, 0x51, - 0xa8, 0xe8, 0x5b, 0xa1, 0xa2, 0x8f, 0x4b, 0xb5, 0xb3, 0x58, 0xaa, 0x9d, 0xaf, 0x4b, 0xb5, 0xf3, - 0xba, 0xff, 0xb7, 0x60, 0xeb, 0x66, 0xfd, 0x23, 0x3f, 0xfa, 0x1e, 0x00, 0x00, 0xff, 0xff, 0x87, - 0x8e, 0xee, 0xdf, 0x51, 0x04, 0x00, 0x00, + // 359 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x91, 0x3f, 0x4f, 0xc2, 0x40, + 0x18, 0xc6, 0x39, 0x49, 0x34, 0x1e, 0xa2, 0x84, 0x10, 0x05, 0x12, 0x5b, 0xd2, 0x89, 0xc5, 0x36, + 0x60, 0xd4, 0x48, 0xa2, 0x09, 0x5d, 0xd1, 0x48, 0x90, 0xc9, 0xc5, 0x70, 0xe5, 0x3c, 0x9a, 0xb6, + 0x5c, 0xd3, 0x6b, 0x4d, 0xee, 0x5b, 0xf8, 0x31, 0xdc, 0xfd, 0x12, 0x8e, 0x8c, 0x4e, 0x8d, 0x29, + 0xdf, 0x80, 0x91, 0xc9, 0xb4, 0x2f, 0x88, 0xa3, 0x71, 0x73, 0xb9, 0x3f, 0xef, 0xf3, 0xde, 0xef, + 0x79, 0x72, 0x2f, 0x3e, 0xb4, 0xb8, 0xf0, 0xb8, 0x30, 0x1c, 0x2a, 0x61, 0xd1, 0xfd, 0x80, 0x87, + 0xbc, 0x5c, 0x84, 0xba, 0x6e, 0x05, 0xd2, 0x0f, 0x79, 0xbd, 0xc2, 0x38, 0xe3, 0x99, 0x62, 0xa4, + 0x27, 0x68, 0xaa, 0xd7, 0x18, 0xe7, 0xcc, 0xa5, 0x46, 0x76, 0x23, 0xd1, 0x93, 0x31, 0x9a, 0x4a, + 0x90, 0xb4, 0x57, 0x84, 0x8f, 0x6e, 0x23, 0x37, 0xb4, 0x85, 0xcd, 0x86, 0x93, 0x80, 0x8a, 0x09, + 0x77, 0xc7, 0xfd, 0x88, 0xf4, 0xa8, 0x2c, 0x5f, 0xe0, 0xdd, 0x70, 0x5d, 0xaa, 0xa2, 0x06, 0x6a, + 0x16, 0xcd, 0x5a, 0x12, 0xab, 0xa8, 0xb7, 0x88, 0xd5, 0x92, 0x1c, 0x79, 0x6e, 0x47, 0xfb, 0xd6, + 0xb5, 0xc1, 0xa6, 0xb7, 0x3c, 0xc4, 0x05, 0x3f, 0x22, 0xae, 0x6d, 0x3d, 0xa6, 0x49, 0xab, 0x5b, + 0x8d, 0x7c, 0xb3, 0xd0, 0xae, 0xe8, 0x90, 0x42, 0x5f, 0xa7, 0xd0, 0xbb, 0x53, 0x69, 0x1e, 0x27, + 0xb1, 0xba, 0x03, 0x7e, 0x62, 0x11, 0xab, 0xfb, 0x80, 0xf5, 0x23, 0x92, 0xbe, 0xd4, 0x06, 0x18, + 0x38, 0xa9, 0xaa, 0xbd, 0x21, 0xac, 0xdd, 0x50, 0x36, 0xb2, 0x64, 0xd7, 0xb3, 0xa7, 0xfc, 0x9f, + 0xa4, 0x26, 0xf8, 0xe0, 0x9e, 0x5a, 0x7e, 0xfb, 0xec, 0xbc, 0xd7, 0x5a, 0x25, 0xbc, 0xc3, 0x79, + 0x87, 0xca, 0x2c, 0xdb, 0x9e, 0x79, 0xb5, 0x8c, 0xd5, 0x4b, 0x66, 0x87, 0x93, 0x88, 0xe8, 0x16, + 0xf7, 0x8c, 0xd5, 0x9c, 0x61, 0x3b, 0x11, 0x63, 0xc7, 0x80, 0xd1, 0xc2, 0xe4, 0x05, 0xa0, 0x9c, + 0x96, 0x0e, 0xac, 0x41, 0x4a, 0xd2, 0xc6, 0xb8, 0xb4, 0xf1, 0x08, 0xec, 0xe7, 0xd4, 0xa4, 0xff, + 0xd3, 0xe4, 0x7a, 0x19, 0xab, 0x9d, 0xbf, 0x98, 0x00, 0x2c, 0x73, 0x31, 0xcd, 0xf7, 0x44, 0x41, + 0xb3, 0x44, 0x41, 0x9f, 0x89, 0x82, 0x5e, 0xe6, 0x4a, 0x6e, 0x36, 0x57, 0x72, 0x1f, 0x73, 0x25, + 0xf7, 0xd0, 0xfc, 0x2d, 0x9a, 0x6c, 0x67, 0xdf, 0x78, 0xfa, 0x15, 0x00, 0x00, 0xff, 0xff, 0x17, + 0xe8, 0x4d, 0x17, 0xcf, 0x02, 0x00, 0x00, } func (m *MultisigThresholdPubKey) Marshal() (dAtA []byte, err error) { @@ -590,126 +400,6 @@ func (m *Secp256K1PrivKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *Ed25519PubKey) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Ed25519PubKey) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Ed25519PubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Ed25519PrivKey) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Ed25519PrivKey) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Ed25519PrivKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Sr25519PubKey) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Sr25519PubKey) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Sr25519PubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Sr25519PrivKey) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Sr25519PrivKey) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Sr25519PrivKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func encodeVarintKeys(dAtA []byte, offset int, v uint64) int { offset -= sovKeys(v) base := offset @@ -731,329 +421,65 @@ func (m *MultisigThresholdPubKey) Size() (n int) { n += 1 + sovKeys(uint64(m.K)) } if len(m.PubKeys) > 0 { - for _, e := range m.PubKeys { - l = e.Size() - n += 1 + l + sovKeys(uint64(l)) - } - } - return n -} - -func (m *LegacyAminoMultisigThresholdPubKey) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.K != 0 { - n += 1 + sovKeys(uint64(m.K)) - } - if len(m.PubKeys) > 0 { - for _, e := range m.PubKeys { - l = e.Size() - n += 1 + l + sovKeys(uint64(l)) - } - } - return n -} - -func (m *Secp256K1PubKey) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovKeys(uint64(l)) - } - return n -} - -func (m *Secp256K1PrivKey) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovKeys(uint64(l)) - } - return n -} - -func (m *Ed25519PubKey) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovKeys(uint64(l)) - } - return n -} - -func (m *Ed25519PrivKey) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovKeys(uint64(l)) - } - return n -} - -func (m *Sr25519PubKey) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovKeys(uint64(l)) - } - return n -} - -func (m *Sr25519PrivKey) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovKeys(uint64(l)) - } - return n -} - -func sovKeys(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozKeys(x uint64) (n int) { - return sovKeys(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *MultisigThresholdPubKey) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MultisigThresholdPubKey: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MultisigThresholdPubKey: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field K", wireType) - } - m.K = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.K |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PubKeys", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthKeys - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthKeys - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PubKeys = append(m.PubKeys, &types.Any{}) - if err := m.PubKeys[len(m.PubKeys)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipKeys(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *LegacyAminoMultisigThresholdPubKey) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: LegacyAminoMultisigThresholdPubKey: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: LegacyAminoMultisigThresholdPubKey: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field K", wireType) - } - m.K = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.K |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PubKeys", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthKeys - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthKeys - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PubKeys = append(m.PubKeys, &types.Any{}) - if err := m.PubKeys[len(m.PubKeys)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipKeys(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy + for _, e := range m.PubKeys { + l = e.Size() + n += 1 + l + sovKeys(uint64(l)) } } + return n +} - if iNdEx > l { - return io.ErrUnexpectedEOF +func (m *LegacyAminoMultisigThresholdPubKey) Size() (n int) { + if m == nil { + return 0 } - return nil + var l int + _ = l + if m.K != 0 { + n += 1 + sovKeys(uint64(m.K)) + } + if len(m.PubKeys) > 0 { + for _, e := range m.PubKeys { + l = e.Size() + n += 1 + l + sovKeys(uint64(l)) + } + } + return n } -func (m *Secp256K1PubKey) Unmarshal(dAtA []byte) error { + +func (m *Secp256K1PubKey) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovKeys(uint64(l)) + } + return n +} + +func (m *Secp256K1PrivKey) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovKeys(uint64(l)) + } + return n +} + +func sovKeys(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozKeys(x uint64) (n int) { + return sovKeys(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MultisigThresholdPubKey) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1076,17 +502,17 @@ func (m *Secp256K1PubKey) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Secp256K1PubKey: wiretype end group for non-group") + return fmt.Errorf("proto: MultisigThresholdPubKey: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Secp256K1PubKey: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MultisigThresholdPubKey: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field K", wireType) } - var byteLen int + m.K = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowKeys @@ -1096,84 +522,16 @@ func (m *Secp256K1PubKey) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + m.K |= uint32(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { - return ErrInvalidLengthKeys - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthKeys - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) - if m.Key == nil { - m.Key = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipKeys(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Secp256K1PrivKey) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Secp256K1PrivKey: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Secp256K1PrivKey: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PubKeys", wireType) } - var byteLen int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowKeys @@ -1183,24 +541,24 @@ func (m *Secp256K1PrivKey) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + if msglen < 0 { return ErrInvalidLengthKeys } - postIndex := iNdEx + byteLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthKeys } if postIndex > l { return io.ErrUnexpectedEOF } - m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) - if m.Key == nil { - m.Key = []byte{} + m.PubKeys = append(m.PubKeys, &types.Any{}) + if err := m.PubKeys[len(m.PubKeys)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } iNdEx = postIndex default: @@ -1227,7 +585,7 @@ func (m *Secp256K1PrivKey) Unmarshal(dAtA []byte) error { } return nil } -func (m *Ed25519PubKey) Unmarshal(dAtA []byte) error { +func (m *LegacyAminoMultisigThresholdPubKey) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1250,17 +608,17 @@ func (m *Ed25519PubKey) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ed25519PubKey: wiretype end group for non-group") + return fmt.Errorf("proto: LegacyAminoMultisigThresholdPubKey: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ed25519PubKey: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: LegacyAminoMultisigThresholdPubKey: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field K", wireType) } - var byteLen int + m.K = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowKeys @@ -1270,84 +628,16 @@ func (m *Ed25519PubKey) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + m.K |= uint32(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { - return ErrInvalidLengthKeys - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthKeys - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) - if m.Key == nil { - m.Key = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipKeys(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ed25519PrivKey) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Ed25519PrivKey: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ed25519PrivKey: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PubKeys", wireType) } - var byteLen int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowKeys @@ -1357,24 +647,24 @@ func (m *Ed25519PrivKey) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + if msglen < 0 { return ErrInvalidLengthKeys } - postIndex := iNdEx + byteLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthKeys } if postIndex > l { return io.ErrUnexpectedEOF } - m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) - if m.Key == nil { - m.Key = []byte{} + m.PubKeys = append(m.PubKeys, &types.Any{}) + if err := m.PubKeys[len(m.PubKeys)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } iNdEx = postIndex default: @@ -1401,7 +691,7 @@ func (m *Ed25519PrivKey) Unmarshal(dAtA []byte) error { } return nil } -func (m *Sr25519PubKey) Unmarshal(dAtA []byte) error { +func (m *Secp256K1PubKey) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1424,10 +714,10 @@ func (m *Sr25519PubKey) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Sr25519PubKey: wiretype end group for non-group") + return fmt.Errorf("proto: Secp256K1PubKey: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Sr25519PubKey: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Secp256K1PubKey: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -1488,7 +778,7 @@ func (m *Sr25519PubKey) Unmarshal(dAtA []byte) error { } return nil } -func (m *Sr25519PrivKey) Unmarshal(dAtA []byte) error { +func (m *Secp256K1PrivKey) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1511,10 +801,10 @@ func (m *Sr25519PrivKey) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Sr25519PrivKey: wiretype end group for non-group") + return fmt.Errorf("proto: Secp256K1PrivKey: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Sr25519PrivKey: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Secp256K1PrivKey: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: diff --git a/crypto/keys/keys_test.go b/crypto/keys/keys_test.go index 3f38e321aae0..988f2e9fb5db 100644 --- a/crypto/keys/keys_test.go +++ b/crypto/keys/keys_test.go @@ -5,19 +5,13 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - "github.com/cosmos/cosmos-sdk/crypto/keys/sr25519" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/tendermint/tendermint/crypto/sr25519" ) func TestPubKeyEquals(t *testing.T) { - sr25519PubKey := sr25519.GenPrivKey().PubKey().(sr25519.PubKey) - sr25519PbPubKey := &keys.Sr25519PubKey{Key: sr25519PubKey} - - ed25519PubKey := ed25519.GenPrivKey().PubKey().(ed25519.PubKey) - ed25519PbPubKey := &keys.Ed25519PubKey{Key: ed25519PubKey} secp256K1PubKey := secp256k1.GenPrivKey().PubKey().(secp256k1.PubKey) secp256K1PbPubKey := &keys.Secp256K1PubKey{Key: secp256K1PubKey} @@ -28,98 +22,6 @@ func TestPubKeyEquals(t *testing.T) { other crypto.PubKey expectEq bool }{ - { - "sr25519 pb different types", - sr25519PbPubKey, - &keys.Ed25519PubKey{ - Key: ed25519.GenPrivKey().PubKey().(ed25519.PubKey), - }, - false, - }, - { - "sr25519 pb different bytes", - sr25519PbPubKey, - &keys.Sr25519PubKey{ - Key: sr25519.GenPrivKey().PubKey().(sr25519.PubKey), - }, - false, - }, - { - "sr25519 pb equals", - sr25519PbPubKey, - &keys.Sr25519PubKey{ - Key: sr25519PubKey, - }, - true, - }, - { - "sr25519 different types", - sr25519PbPubKey, - ed25519.GenPrivKey().PubKey(), - false, - }, - { - "sr25519 different bytes", - sr25519PbPubKey, - sr25519.GenPrivKey().PubKey(), - false, - }, - { - "sr25519 equals", - sr25519PbPubKey, - sr25519PubKey, - true, - }, - { - "ed25519 pb different types", - ed25519PbPubKey, - &keys.Sr25519PubKey{ - Key: sr25519.GenPrivKey().PubKey().(sr25519.PubKey), - }, - false, - }, - { - "ed25519 pb different bytes", - ed25519PbPubKey, - &keys.Ed25519PubKey{ - Key: ed25519.GenPrivKey().PubKey().(ed25519.PubKey), - }, - false, - }, - { - "ed25519 pb equals", - ed25519PbPubKey, - &keys.Ed25519PubKey{ - Key: ed25519PubKey, - }, - true, - }, - { - "ed25519 different types", - ed25519PbPubKey, - sr25519.GenPrivKey().PubKey(), - false, - }, - { - "ed25519 different bytes", - ed25519PbPubKey, - ed25519.GenPrivKey().PubKey(), - false, - }, - { - "ed25519 equals", - ed25519PbPubKey, - ed25519PubKey, - true, - }, - { - "secp256k1 pb different types", - secp256K1PbPubKey, - &keys.Sr25519PubKey{ - Key: sr25519.GenPrivKey().PubKey().(sr25519.PubKey), - }, - false, - }, { "secp256k1 pb different bytes", secp256K1PbPubKey, @@ -165,12 +67,6 @@ func TestPubKeyEquals(t *testing.T) { } func TestPrivKeyEquals(t *testing.T) { - sr25519PrivKey := sr25519.GenPrivKey() - sr25519PbPrivKey := &keys.Sr25519PrivKey{Key: sr25519PrivKey} - - ed25519PrivKey := ed25519.GenPrivKey() - ed25519PbPrivKey := &keys.Ed25519PrivKey{Key: ed25519PrivKey} - secp256K1PrivKey := secp256k1.GenPrivKey() secp256K1PbPrivKey := &keys.Secp256K1PrivKey{Key: secp256K1PrivKey} @@ -180,98 +76,6 @@ func TestPrivKeyEquals(t *testing.T) { other crypto.PrivKey expectEq bool }{ - { - "sr25519 pb different types", - sr25519PbPrivKey, - &keys.Ed25519PrivKey{ - Key: ed25519.GenPrivKey(), - }, - false, - }, - { - "sr25519 pb different bytes", - sr25519PbPrivKey, - &keys.Sr25519PrivKey{ - Key: sr25519.GenPrivKey(), - }, - false, - }, - { - "sr25519 pb equals", - sr25519PbPrivKey, - &keys.Sr25519PrivKey{ - Key: sr25519PrivKey, - }, - true, - }, - { - "sr25519 different types", - sr25519PbPrivKey, - ed25519.GenPrivKey(), - false, - }, - { - "sr25519 different bytes", - sr25519PbPrivKey, - sr25519.GenPrivKey(), - false, - }, - { - "sr25519 equals", - sr25519PbPrivKey, - sr25519PrivKey, - true, - }, - { - "ed25519 pb different types", - ed25519PbPrivKey, - &keys.Sr25519PrivKey{ - Key: sr25519.GenPrivKey(), - }, - false, - }, - { - "ed25519 pb different bytes", - ed25519PbPrivKey, - &keys.Ed25519PrivKey{ - Key: ed25519.GenPrivKey(), - }, - false, - }, - { - "ed25519 pb equals", - ed25519PbPrivKey, - &keys.Ed25519PrivKey{ - Key: ed25519PrivKey, - }, - true, - }, - { - "ed25519 different types", - ed25519PbPrivKey, - sr25519.GenPrivKey(), - false, - }, - { - "ed25519 different bytes", - ed25519PbPrivKey, - ed25519.GenPrivKey(), - false, - }, - { - "ed25519 equals", - ed25519PbPrivKey, - ed25519PrivKey, - true, - }, - { - "secp256k1 pb different types", - secp256K1PbPrivKey, - &keys.Sr25519PrivKey{ - Key: sr25519.GenPrivKey(), - }, - false, - }, { "secp256k1 pb different bytes", secp256K1PbPrivKey, @@ -321,14 +125,6 @@ func TestSignAndVerifySignature(t *testing.T) { msg string privKey crypto.PrivKey }{ - { - "ed25519", - &keys.Ed25519PrivKey{Key: ed25519.GenPrivKey()}, - }, - { - "sr25519", - &keys.Sr25519PrivKey{Key: sr25519.GenPrivKey()}, - }, { "secp256k1", &keys.Secp256K1PrivKey{Key: secp256k1.GenPrivKey()}, diff --git a/go.sum b/go.sum index 69a598ac19f1..5ae2683e00c7 100644 --- a/go.sum +++ b/go.sum @@ -576,6 +576,7 @@ github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RM github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk= github.com/tendermint/go-amino v0.15.1 h1:D2uk35eT4iTsvJd9jWIetzthE5C0/k2QmMFkCN+4JgQ= github.com/tendermint/go-amino v0.15.1/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/tendermint/tendermint v0.33.8 h1:Xxu4QhpqcomSE0iQDw1MqLgfsa8fqtPtWFJK6zZOVso= github.com/tendermint/tendermint v0.34.0-rc3 h1:d7Fsd5rdbxq4GmJ0kRfx7l7LesQM7e70f0ytWLTQ/Go= github.com/tendermint/tendermint v0.34.0-rc3/go.mod h1:BoHcEpjfpBHc1Be7RQz3AHaXFNObcDG7SNHCev6Or4g= github.com/tendermint/tm-db v0.6.1 h1:w3X87itMPXopcRPlFiqspEKhw4FXihPk2rnFFkP0zGk= diff --git a/proto/cosmos/keys/keys.proto b/proto/cosmos/keys/keys.proto index 4ae5973e2a9d..2e09b2db5b10 100644 --- a/proto/cosmos/keys/keys.proto +++ b/proto/cosmos/keys/keys.proto @@ -25,23 +25,4 @@ message Secp256K1PubKey { message Secp256K1PrivKey { bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1.PrivKey"]; -} - -message Ed25519PubKey { - // bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519.PubKey"]; - bytes key = 1 [(gogoproto.casttype) = "github.com/tendermint/tendermint/crypto/ed25519.PubKey"]; -} - -message Ed25519PrivKey { - // bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519.PrivKey"]; - bytes key = 1 [(gogoproto.casttype) = "github.com/tendermint/tendermint/crypto/ed25519.PrivKey"]; - -} - -message Sr25519PubKey { - bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/sr25519.PubKey"]; -} - -message Sr25519PrivKey { - bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/sr25519.PrivKey"]; -} +} \ No newline at end of file diff --git a/x/auth/types/query.pb.gw.go b/x/auth/types/query.pb.gw.go index 7e80fa6fa5c2..3b156842ddc0 100644 --- a/x/auth/types/query.pb.gw.go +++ b/x/auth/types/query.pb.gw.go @@ -106,6 +106,7 @@ func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshal // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { mux.Handle("GET", pattern_Query_Account_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { diff --git a/x/bank/types/query.pb.gw.go b/x/bank/types/query.pb.gw.go index 85d776791747..ca9c1ddbfa6c 100644 --- a/x/bank/types/query.pb.gw.go +++ b/x/bank/types/query.pb.gw.go @@ -272,6 +272,7 @@ func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshal // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { mux.Handle("GET", pattern_Query_Balance_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { diff --git a/x/distribution/types/query.pb.gw.go b/x/distribution/types/query.pb.gw.go index b3a714f34904..890e51e40d1e 100644 --- a/x/distribution/types/query.pb.gw.go +++ b/x/distribution/types/query.pb.gw.go @@ -488,6 +488,7 @@ func local_request_Query_CommunityPool_0(ctx context.Context, marshaler runtime. // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { diff --git a/x/evidence/types/query.pb.gw.go b/x/evidence/types/query.pb.gw.go index e9346629c24d..e15d163524b4 100644 --- a/x/evidence/types/query.pb.gw.go +++ b/x/evidence/types/query.pb.gw.go @@ -124,6 +124,7 @@ func local_request_Query_AllEvidence_0(ctx context.Context, marshaler runtime.Ma // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { mux.Handle("GET", pattern_Query_Evidence_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { diff --git a/x/gov/types/query.pb.gw.go b/x/gov/types/query.pb.gw.go index 4e2c61f5f8c0..e9fc72f302b2 100644 --- a/x/gov/types/query.pb.gw.go +++ b/x/gov/types/query.pb.gw.go @@ -528,6 +528,7 @@ func local_request_Query_TallyResult_0(ctx context.Context, marshaler runtime.Ma // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { mux.Handle("GET", pattern_Query_Proposal_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { diff --git a/x/ibc-transfer/types/query.pb.gw.go b/x/ibc-transfer/types/query.pb.gw.go index 9d5093a47f15..23b91aafc162 100644 --- a/x/ibc-transfer/types/query.pb.gw.go +++ b/x/ibc-transfer/types/query.pb.gw.go @@ -142,6 +142,7 @@ func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshal // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { mux.Handle("GET", pattern_Query_DenomTrace_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { diff --git a/x/ibc/02-client/types/query.pb.gw.go b/x/ibc/02-client/types/query.pb.gw.go index 9dbd863cd2ec..8e39fc807f62 100644 --- a/x/ibc/02-client/types/query.pb.gw.go +++ b/x/ibc/02-client/types/query.pb.gw.go @@ -290,6 +290,7 @@ func local_request_Query_ConsensusStates_0(ctx context.Context, marshaler runtim // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { mux.Handle("GET", pattern_Query_ClientState_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { diff --git a/x/ibc/03-connection/types/query.pb.gw.go b/x/ibc/03-connection/types/query.pb.gw.go index 6fa7dc87e01d..7c17c2dd53ff 100644 --- a/x/ibc/03-connection/types/query.pb.gw.go +++ b/x/ibc/03-connection/types/query.pb.gw.go @@ -304,6 +304,7 @@ func local_request_Query_ConnectionConsensusState_0(ctx context.Context, marshal // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { mux.Handle("GET", pattern_Query_Connection_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { diff --git a/x/ibc/04-channel/types/query.pb.gw.go b/x/ibc/04-channel/types/query.pb.gw.go index 520d86c54948..d3ee502d1656 100644 --- a/x/ibc/04-channel/types/query.pb.gw.go +++ b/x/ibc/04-channel/types/query.pb.gw.go @@ -878,6 +878,7 @@ func local_request_Query_NextSequenceReceive_0(ctx context.Context, marshaler ru // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { mux.Handle("GET", pattern_Query_Channel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { diff --git a/x/mint/types/query.pb.gw.go b/x/mint/types/query.pb.gw.go index 644c2782e2cd..c70c3e60b077 100644 --- a/x/mint/types/query.pb.gw.go +++ b/x/mint/types/query.pb.gw.go @@ -88,6 +88,7 @@ func local_request_Query_AnnualProvisions_0(ctx context.Context, marshaler runti // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { diff --git a/x/params/types/proposal/query.pb.gw.go b/x/params/types/proposal/query.pb.gw.go index 05f80279a985..c7fab13fca65 100644 --- a/x/params/types/proposal/query.pb.gw.go +++ b/x/params/types/proposal/query.pb.gw.go @@ -70,6 +70,7 @@ func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshal // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { diff --git a/x/slashing/types/query.pb.gw.go b/x/slashing/types/query.pb.gw.go index 77c4688d9e4f..5ac3296025c2 100644 --- a/x/slashing/types/query.pb.gw.go +++ b/x/slashing/types/query.pb.gw.go @@ -142,6 +142,7 @@ func local_request_Query_SigningInfos_0(ctx context.Context, marshaler runtime.M // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { diff --git a/x/staking/types/query.pb.gw.go b/x/staking/types/query.pb.gw.go index 8995f7645485..0c433330203b 100644 --- a/x/staking/types/query.pb.gw.go +++ b/x/staking/types/query.pb.gw.go @@ -874,6 +874,7 @@ func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshal // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { mux.Handle("GET", pattern_Query_Validators_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 9baecc95caac..c0c875fb742c 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -1265,570 +1265,569 @@ func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_ func StakingDescription() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { d := &github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet{} var gzipped = []byte{ - // 9000 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6b, 0x74, 0x1c, 0xe7, - 0x75, 0x18, 0x67, 0x1f, 0xc0, 0xee, 0xc5, 0x6b, 0xf1, 0x01, 0xa4, 0x96, 0x4b, 0x0a, 0x80, 0x46, - 0xb2, 0x44, 0x51, 0xd2, 0x42, 0xa2, 0x28, 0x92, 0x5a, 0xda, 0x96, 0xb1, 0xc0, 0x12, 0x04, 0x89, - 0x97, 0x06, 0x20, 0x25, 0xdb, 0x49, 0xe7, 0x0c, 0x66, 0x3f, 0x2c, 0x46, 0x9c, 0x9d, 0x19, 0xcd, - 0xcc, 0x92, 0x00, 0x6d, 0x9f, 0xa3, 0xc4, 0x8f, 0xc6, 0x6a, 0x53, 0x3b, 0x8f, 0xd3, 0xda, 0x8e, - 0xe5, 0xfa, 0xd1, 0xd6, 0xa9, 0xd3, 0x36, 0x49, 0x9d, 0xa6, 0x4d, 0xd3, 0xd3, 0x3a, 0xad, 0x93, - 0x38, 0x6d, 0xd3, 0x63, 0x9f, 0xba, 0x6d, 0x9a, 0xd3, 0xd2, 0xa9, 0xec, 0xd3, 0x3a, 0xae, 0xdb, - 0xa4, 0xac, 0xfa, 0xd4, 0x8f, 0xe4, 0x7c, 0xaf, 0x79, 0xec, 0x03, 0xbb, 0x0b, 0x51, 0xb2, 0x75, - 0xa2, 0x5f, 0x98, 0xb9, 0x73, 0xef, 0xfd, 0xee, 0xbd, 0xdf, 0xbd, 0xf7, 0xbb, 0xdf, 0x6b, 0x01, - 0x5f, 0x4d, 0xc0, 0x49, 0xdd, 0xf6, 0xea, 0xb6, 0x37, 0xbb, 0xa5, 0x79, 0x78, 0xf6, 0xf9, 0x06, - 0x76, 0xf7, 0x66, 0xaf, 0x3f, 0xb6, 0x85, 0x7d, 0xed, 0xb1, 0x59, 0x47, 0xab, 0x19, 0x96, 0xe6, - 0x1b, 0xb6, 0x55, 0x74, 0x5c, 0xdb, 0xb7, 0xd1, 0x51, 0x86, 0x5b, 0x24, 0xb8, 0x45, 0x8a, 0x5b, - 0xe4, 0xb8, 0xb2, 0x05, 0x43, 0xeb, 0x5a, 0x0d, 0x2b, 0xf8, 0xf9, 0x06, 0xf6, 0x7c, 0x94, 0x83, - 0xe4, 0x35, 0xbc, 0x97, 0x97, 0x66, 0xa4, 0x13, 0xc3, 0x0a, 0x79, 0x44, 0x47, 0x60, 0xc0, 0xde, - 0xde, 0xf6, 0xb0, 0x9f, 0x4f, 0xcc, 0x48, 0x27, 0x52, 0x0a, 0x7f, 0x43, 0x93, 0x90, 0x36, 0x8d, - 0xba, 0xe1, 0xe7, 0x93, 0x14, 0xcc, 0x5e, 0xd0, 0x34, 0x0c, 0xe9, 0x76, 0xc3, 0xf2, 0x55, 0xdf, - 0xf6, 0x35, 0x33, 0x9f, 0x9a, 0x91, 0x4e, 0x64, 0x14, 0xa0, 0xa0, 0x4d, 0x02, 0x91, 0x9f, 0x82, - 0x61, 0xd6, 0x9e, 0xe7, 0xd8, 0x96, 0x87, 0xd1, 0x51, 0xc8, 0x58, 0x78, 0xd7, 0x57, 0xc3, 0x56, - 0x07, 0xc9, 0xfb, 0x65, 0xbc, 0x47, 0x5a, 0x60, 0x5c, 0x58, 0xc3, 0xec, 0xa5, 0x5c, 0xfe, 0xda, - 0xcb, 0x53, 0xd2, 0xd7, 0x5f, 0x9e, 0x92, 0xfe, 0xe0, 0xe5, 0x29, 0xe9, 0xe3, 0xdf, 0x9e, 0x3a, - 0xf4, 0xf5, 0x6f, 0x4f, 0x1d, 0xfa, 0xbd, 0x6f, 0x4f, 0x1d, 0x7a, 0xcf, 0x89, 0x9a, 0xe1, 0xef, - 0x34, 0xb6, 0x8a, 0xba, 0x5d, 0x9f, 0xe5, 0xc6, 0x61, 0x7f, 0x1e, 0xf1, 0xaa, 0xd7, 0x66, 0xfd, - 0x3d, 0x07, 0x7b, 0xcc, 0x50, 0x5b, 0x03, 0xd4, 0x2c, 0x8f, 0xc3, 0xcf, 0x9d, 0x87, 0x99, 0x9a, - 0x6d, 0xd7, 0x4c, 0x3c, 0x4b, 0x21, 0x5b, 0x8d, 0xed, 0xd9, 0x2a, 0xf6, 0x74, 0xd7, 0x70, 0x7c, - 0xdb, 0xe5, 0xc6, 0x1b, 0x63, 0x18, 0x45, 0x81, 0x21, 0xaf, 0xc0, 0xf8, 0x05, 0xc3, 0xc4, 0x0b, - 0x01, 0xe2, 0x06, 0xf6, 0xd1, 0x39, 0x48, 0x6d, 0x1b, 0x26, 0xce, 0x4b, 0x33, 0xc9, 0x13, 0x43, - 0xa7, 0xee, 0x2b, 0x36, 0x11, 0x15, 0xe3, 0x14, 0xeb, 0x04, 0xac, 0x50, 0x0a, 0xf9, 0x3b, 0x29, - 0x98, 0x68, 0xf3, 0x15, 0x21, 0x48, 0x59, 0x5a, 0x1d, 0x53, 0xab, 0x64, 0x15, 0xfa, 0x8c, 0xf2, - 0x30, 0xe8, 0x68, 0xfa, 0x35, 0xad, 0x86, 0xa9, 0x51, 0xb2, 0x8a, 0x78, 0x45, 0x53, 0x00, 0x55, - 0xec, 0x60, 0xab, 0x8a, 0x2d, 0x7d, 0x2f, 0x9f, 0x9c, 0x49, 0x9e, 0xc8, 0x2a, 0x11, 0x08, 0x7a, - 0x08, 0xc6, 0x9d, 0xc6, 0x96, 0x69, 0xe8, 0x6a, 0x04, 0x0d, 0x66, 0x92, 0x27, 0xd2, 0x4a, 0x8e, - 0x7d, 0x58, 0x08, 0x91, 0x1f, 0x80, 0xb1, 0x1b, 0x58, 0xbb, 0x16, 0x45, 0x1d, 0xa2, 0xa8, 0xa3, - 0x04, 0x1c, 0x41, 0x9c, 0x87, 0xe1, 0x3a, 0xf6, 0x3c, 0xad, 0x86, 0x55, 0x62, 0xdf, 0x7c, 0x8a, - 0x6a, 0x3f, 0xd3, 0xa2, 0x7d, 0xb3, 0xe6, 0x43, 0x9c, 0x6a, 0x73, 0xcf, 0xc1, 0x68, 0x0e, 0xb2, - 0xd8, 0x6a, 0xd4, 0x19, 0x87, 0x74, 0x07, 0xfb, 0x55, 0xac, 0x46, 0xbd, 0x99, 0x4b, 0x86, 0x90, - 0x71, 0x16, 0x83, 0x1e, 0x76, 0xaf, 0x1b, 0x3a, 0xce, 0x0f, 0x50, 0x06, 0x0f, 0xb4, 0x30, 0xd8, - 0x60, 0xdf, 0x9b, 0x79, 0x08, 0x3a, 0x34, 0x0f, 0x59, 0xbc, 0xeb, 0x63, 0xcb, 0x33, 0x6c, 0x2b, - 0x3f, 0x48, 0x99, 0xbc, 0xad, 0x4d, 0x2f, 0x62, 0xb3, 0xda, 0xcc, 0x22, 0xa4, 0x43, 0x67, 0x60, - 0xd0, 0x76, 0x48, 0xe0, 0x79, 0xf9, 0xcc, 0x8c, 0x74, 0x62, 0xe8, 0xd4, 0xf1, 0xb6, 0x8e, 0xb0, - 0xc6, 0x70, 0x14, 0x81, 0x8c, 0x96, 0x20, 0xe7, 0xd9, 0x0d, 0x57, 0xc7, 0xaa, 0x6e, 0x57, 0xb1, - 0x6a, 0x58, 0xdb, 0x76, 0x3e, 0x4b, 0x19, 0x4c, 0xb7, 0x2a, 0x42, 0x11, 0xe7, 0xed, 0x2a, 0x5e, - 0xb2, 0xb6, 0x6d, 0x65, 0xd4, 0x8b, 0xbd, 0x93, 0x78, 0xf5, 0xf6, 0x2c, 0x5f, 0xdb, 0xcd, 0x0f, - 0x53, 0x0f, 0xe1, 0x6f, 0xf2, 0xaf, 0x0d, 0xc0, 0x58, 0x2f, 0x2e, 0x76, 0x1e, 0xd2, 0xdb, 0x44, - 0xcb, 0x7c, 0xa2, 0x1f, 0x1b, 0x30, 0x9a, 0xb8, 0x11, 0x07, 0x0e, 0x68, 0xc4, 0x39, 0x18, 0xb2, - 0xb0, 0xe7, 0xe3, 0x2a, 0xf3, 0x88, 0x64, 0x8f, 0x3e, 0x05, 0x8c, 0xa8, 0xd5, 0xa5, 0x52, 0x07, - 0x72, 0xa9, 0x67, 0x61, 0x2c, 0x10, 0x49, 0x75, 0x35, 0xab, 0x26, 0x7c, 0x73, 0xb6, 0x9b, 0x24, - 0xc5, 0x8a, 0xa0, 0x53, 0x08, 0x99, 0x32, 0x8a, 0x63, 0xef, 0x68, 0x01, 0xc0, 0xb6, 0xb0, 0xbd, - 0xad, 0x56, 0xb1, 0x6e, 0xe6, 0x33, 0x1d, 0xac, 0xb4, 0x46, 0x50, 0x5a, 0xac, 0x64, 0x33, 0xa8, - 0x6e, 0xa2, 0x27, 0x43, 0x57, 0x1b, 0xec, 0xe0, 0x29, 0x2b, 0x2c, 0xc8, 0x5a, 0xbc, 0xed, 0x0a, - 0x8c, 0xba, 0x98, 0xf8, 0x3d, 0xae, 0x72, 0xcd, 0xb2, 0x54, 0x88, 0x62, 0x57, 0xcd, 0x14, 0x4e, - 0xc6, 0x14, 0x1b, 0x71, 0xa3, 0xaf, 0xe8, 0x5e, 0x08, 0x00, 0x2a, 0x75, 0x2b, 0xa0, 0x59, 0x68, - 0x58, 0x00, 0x57, 0xb5, 0x3a, 0x2e, 0xdc, 0x84, 0xd1, 0xb8, 0x79, 0x48, 0x9a, 0xf7, 0x7c, 0xcd, - 0xf5, 0xa9, 0x17, 0xa6, 0x15, 0xf6, 0x42, 0x06, 0x22, 0x6c, 0x55, 0x69, 0x96, 0x4b, 0x2b, 0xe4, - 0x11, 0xbd, 0x2b, 0x54, 0x38, 0x49, 0x15, 0xbe, 0xbf, 0xb5, 0x47, 0x63, 0x9c, 0x9b, 0xf5, 0x2e, - 0x9c, 0x85, 0x91, 0x98, 0x02, 0xbd, 0x36, 0x2d, 0xbf, 0x1f, 0x0e, 0xb7, 0x65, 0x8d, 0x9e, 0x85, - 0xc9, 0x86, 0x65, 0x58, 0x3e, 0x76, 0x1d, 0x17, 0x13, 0x8f, 0x65, 0x4d, 0xe5, 0xff, 0xcb, 0x60, - 0x07, 0x9f, 0xbb, 0x12, 0xc5, 0x66, 0x5c, 0x94, 0x89, 0x46, 0x2b, 0xf0, 0x64, 0x36, 0xf3, 0xdd, - 0xc1, 0xdc, 0x0b, 0x2f, 0xbc, 0xf0, 0x42, 0x42, 0xfe, 0xc4, 0x00, 0x4c, 0xb6, 0x8b, 0x99, 0xb6, - 0xe1, 0x7b, 0x04, 0x06, 0xac, 0x46, 0x7d, 0x0b, 0xbb, 0xd4, 0x48, 0x69, 0x85, 0xbf, 0xa1, 0x39, - 0x48, 0x9b, 0xda, 0x16, 0x66, 0x43, 0xf2, 0xe8, 0xa9, 0x87, 0x7a, 0x8a, 0xca, 0xe2, 0x32, 0x21, - 0x51, 0x18, 0x25, 0x7a, 0x27, 0xa4, 0x78, 0x8a, 0x26, 0x1c, 0x4e, 0xf6, 0xc6, 0x81, 0xc4, 0x92, - 0x42, 0xe9, 0xd0, 0x31, 0xc8, 0x92, 0xbf, 0xcc, 0x37, 0x06, 0xa8, 0xcc, 0x19, 0x02, 0x20, 0x7e, - 0x81, 0x0a, 0x90, 0xa1, 0x61, 0x52, 0xc5, 0x62, 0x68, 0x0b, 0xde, 0x89, 0x63, 0x55, 0xf1, 0xb6, - 0xd6, 0x30, 0x7d, 0xf5, 0xba, 0x66, 0x36, 0x30, 0x75, 0xf8, 0xac, 0x32, 0xcc, 0x81, 0x57, 0x09, - 0x8c, 0x54, 0x1e, 0x2c, 0xaa, 0x0c, 0xab, 0x8a, 0x77, 0x69, 0xf6, 0x4c, 0x2b, 0x2c, 0xd0, 0x96, - 0x08, 0x84, 0x34, 0xff, 0x9c, 0x67, 0x5b, 0xc2, 0x35, 0x69, 0x13, 0x04, 0x40, 0x9b, 0x3f, 0xdb, - 0x9c, 0xb8, 0xef, 0x6e, 0xaf, 0x5e, 0xb3, 0x4f, 0xc9, 0xbf, 0x9a, 0x80, 0x14, 0xcd, 0x17, 0x63, - 0x30, 0xb4, 0xf9, 0xee, 0xf5, 0x8a, 0xba, 0xb0, 0x76, 0xa5, 0xbc, 0x5c, 0xc9, 0x49, 0x68, 0x14, - 0x80, 0x02, 0x2e, 0x2c, 0xaf, 0xcd, 0x6d, 0xe6, 0x12, 0xc1, 0xfb, 0xd2, 0xea, 0xe6, 0x99, 0xd3, - 0xb9, 0x64, 0x40, 0x70, 0x85, 0x01, 0x52, 0x51, 0x84, 0xc7, 0x4f, 0xe5, 0xd2, 0x28, 0x07, 0xc3, - 0x8c, 0xc1, 0xd2, 0xb3, 0x95, 0x85, 0x33, 0xa7, 0x73, 0x03, 0x71, 0xc8, 0xe3, 0xa7, 0x72, 0x83, - 0x68, 0x04, 0xb2, 0x14, 0x52, 0x5e, 0x5b, 0x5b, 0xce, 0x65, 0x02, 0x9e, 0x1b, 0x9b, 0xca, 0xd2, - 0xea, 0x62, 0x2e, 0x1b, 0xf0, 0x5c, 0x54, 0xd6, 0xae, 0xac, 0xe7, 0x20, 0xe0, 0xb0, 0x52, 0xd9, - 0xd8, 0x98, 0x5b, 0xac, 0xe4, 0x86, 0x02, 0x8c, 0xf2, 0xbb, 0x37, 0x2b, 0x1b, 0xb9, 0xe1, 0x98, - 0x58, 0x8f, 0x9f, 0xca, 0x8d, 0x04, 0x4d, 0x54, 0x56, 0xaf, 0xac, 0xe4, 0x46, 0xd1, 0x38, 0x8c, - 0xb0, 0x26, 0x84, 0x10, 0x63, 0x4d, 0xa0, 0x33, 0xa7, 0x73, 0xb9, 0x50, 0x10, 0xc6, 0x65, 0x3c, - 0x06, 0x38, 0x73, 0x3a, 0x87, 0xe4, 0x79, 0x48, 0x53, 0xef, 0x42, 0x08, 0x46, 0x97, 0xe7, 0xca, - 0x95, 0x65, 0x75, 0x6d, 0x7d, 0x73, 0x69, 0x6d, 0x75, 0x6e, 0x39, 0x27, 0x85, 0x30, 0xa5, 0xf2, - 0xf4, 0x95, 0x25, 0xa5, 0xb2, 0x90, 0x4b, 0x44, 0x61, 0xeb, 0x95, 0xb9, 0xcd, 0xca, 0x42, 0x2e, - 0x29, 0xeb, 0x30, 0xd9, 0x2e, 0x4f, 0xb6, 0x8d, 0x8c, 0x48, 0x17, 0x27, 0x3a, 0x74, 0x31, 0xe5, - 0xd5, 0xd2, 0xc5, 0xdf, 0x4e, 0xc0, 0x44, 0x9b, 0xb1, 0xa2, 0x6d, 0x23, 0x4f, 0x41, 0x9a, 0xb9, - 0x28, 0x1b, 0x3d, 0x1f, 0x6c, 0x3b, 0xe8, 0x50, 0x87, 0x6d, 0x19, 0x41, 0x29, 0x5d, 0xb4, 0x82, - 0x48, 0x76, 0xa8, 0x20, 0x08, 0x8b, 0x96, 0x9c, 0xfe, 0xa3, 0x2d, 0x39, 0x9d, 0x0d, 0x7b, 0x67, - 0x7a, 0x19, 0xf6, 0x28, 0xac, 0xbf, 0xdc, 0x9e, 0x6e, 0x93, 0xdb, 0xcf, 0xc3, 0x78, 0x0b, 0xa3, - 0x9e, 0x73, 0xec, 0x07, 0x25, 0xc8, 0x77, 0x32, 0x4e, 0x97, 0x4c, 0x97, 0x88, 0x65, 0xba, 0xf3, - 0xcd, 0x16, 0xbc, 0xa7, 0x73, 0x27, 0xb4, 0xf4, 0xf5, 0x17, 0x25, 0x38, 0xd2, 0xbe, 0x52, 0x6c, - 0x2b, 0xc3, 0x3b, 0x61, 0xa0, 0x8e, 0xfd, 0x1d, 0x5b, 0x54, 0x4b, 0xf7, 0xb7, 0x19, 0x83, 0xc9, - 0xe7, 0xe6, 0xce, 0xe6, 0x54, 0xd1, 0x41, 0x3c, 0xd9, 0xa9, 0xdc, 0x63, 0xd2, 0xb4, 0x48, 0xfa, - 0xd1, 0x04, 0x1c, 0x6e, 0xcb, 0xbc, 0xad, 0xa0, 0x77, 0x03, 0x18, 0x96, 0xd3, 0xf0, 0x59, 0x45, - 0xc4, 0x12, 0x6c, 0x96, 0x42, 0x68, 0xf2, 0x22, 0xc9, 0xb3, 0xe1, 0x07, 0xdf, 0x93, 0xf4, 0x3b, - 0x30, 0x10, 0x45, 0x38, 0x17, 0x0a, 0x9a, 0xa2, 0x82, 0x4e, 0x75, 0xd0, 0xb4, 0xc5, 0x31, 0x1f, - 0x85, 0x9c, 0x6e, 0x1a, 0xd8, 0xf2, 0x55, 0xcf, 0x77, 0xb1, 0x56, 0x37, 0xac, 0x1a, 0x1d, 0x41, - 0x32, 0xa5, 0xf4, 0xb6, 0x66, 0x7a, 0x58, 0x19, 0x63, 0x9f, 0x37, 0xc4, 0x57, 0x42, 0x41, 0x1d, - 0xc8, 0x8d, 0x50, 0x0c, 0xc4, 0x28, 0xd8, 0xe7, 0x80, 0x42, 0xfe, 0xe9, 0x2c, 0x0c, 0x45, 0xea, - 0x6a, 0x74, 0x0f, 0x0c, 0x3f, 0xa7, 0x5d, 0xd7, 0x54, 0x31, 0x57, 0x62, 0x96, 0x18, 0x22, 0xb0, - 0x75, 0x3e, 0x5f, 0x7a, 0x14, 0x26, 0x29, 0x8a, 0xdd, 0xf0, 0xb1, 0xab, 0xea, 0xa6, 0xe6, 0x79, - 0xd4, 0x68, 0x19, 0x8a, 0x8a, 0xc8, 0xb7, 0x35, 0xf2, 0x69, 0x5e, 0x7c, 0x41, 0x4f, 0xc0, 0x04, - 0xa5, 0xa8, 0x37, 0x4c, 0xdf, 0x70, 0x4c, 0xac, 0x92, 0xd9, 0x9b, 0x47, 0x47, 0x92, 0x40, 0xb2, - 0x71, 0x82, 0xb1, 0xc2, 0x11, 0x88, 0x44, 0x1e, 0x5a, 0x80, 0xbb, 0x29, 0x59, 0x0d, 0x5b, 0xd8, - 0xd5, 0x7c, 0xac, 0xe2, 0xe7, 0x1b, 0x9a, 0xe9, 0xa9, 0x9a, 0x55, 0x55, 0x77, 0x34, 0x6f, 0x27, - 0x3f, 0x49, 0x18, 0x94, 0x13, 0x79, 0x49, 0x39, 0x4a, 0x10, 0x17, 0x39, 0x5e, 0x85, 0xa2, 0xcd, - 0x59, 0xd5, 0x8b, 0x9a, 0xb7, 0x83, 0x4a, 0x70, 0x84, 0x72, 0xf1, 0x7c, 0xd7, 0xb0, 0x6a, 0xaa, - 0xbe, 0x83, 0xf5, 0x6b, 0x6a, 0xc3, 0xdf, 0x3e, 0x97, 0x3f, 0x16, 0x6d, 0x9f, 0x4a, 0xb8, 0x41, - 0x71, 0xe6, 0x09, 0xca, 0x15, 0x7f, 0xfb, 0x1c, 0xda, 0x80, 0x61, 0xd2, 0x19, 0x75, 0xe3, 0x26, - 0x56, 0xb7, 0x6d, 0x97, 0x0e, 0x8d, 0xa3, 0x6d, 0x52, 0x53, 0xc4, 0x82, 0xc5, 0x35, 0x4e, 0xb0, - 0x62, 0x57, 0x71, 0x29, 0xbd, 0xb1, 0x5e, 0xa9, 0x2c, 0x28, 0x43, 0x82, 0xcb, 0x05, 0xdb, 0x25, - 0x0e, 0x55, 0xb3, 0x03, 0x03, 0x0f, 0x31, 0x87, 0xaa, 0xd9, 0xc2, 0xbc, 0x4f, 0xc0, 0x84, 0xae, - 0x33, 0x9d, 0x0d, 0x5d, 0xe5, 0x73, 0x2c, 0x2f, 0x9f, 0x8b, 0x19, 0x4b, 0xd7, 0x17, 0x19, 0x02, - 0xf7, 0x71, 0x0f, 0x3d, 0x09, 0x87, 0x43, 0x63, 0x45, 0x09, 0xc7, 0x5b, 0xb4, 0x6c, 0x26, 0x7d, - 0x02, 0x26, 0x9c, 0xbd, 0x56, 0x42, 0x14, 0x6b, 0xd1, 0xd9, 0x6b, 0x26, 0x3b, 0x0b, 0x93, 0xce, - 0x8e, 0xd3, 0x4a, 0x77, 0x32, 0x4a, 0x87, 0x9c, 0x1d, 0xa7, 0x99, 0xf0, 0x6d, 0x74, 0xc2, 0xed, - 0x62, 0x5d, 0xf3, 0x71, 0x35, 0x7f, 0x57, 0x14, 0x3d, 0xf2, 0x01, 0xcd, 0x42, 0x4e, 0xd7, 0x55, - 0x6c, 0x69, 0x5b, 0x26, 0x56, 0x35, 0x17, 0x5b, 0x9a, 0x97, 0x9f, 0x8e, 0x22, 0x8f, 0xea, 0x7a, - 0x85, 0x7e, 0x9d, 0xa3, 0x1f, 0xd1, 0x49, 0x18, 0xb7, 0xb7, 0x9e, 0xd3, 0x99, 0x4b, 0xaa, 0x8e, - 0x8b, 0xb7, 0x8d, 0xdd, 0xfc, 0x7d, 0xd4, 0xbe, 0x63, 0xe4, 0x03, 0x75, 0xc8, 0x75, 0x0a, 0x46, - 0x0f, 0x42, 0x4e, 0xf7, 0x76, 0x34, 0xd7, 0xa1, 0x39, 0xd9, 0x73, 0x34, 0x1d, 0xe7, 0xdf, 0xc6, - 0x50, 0x19, 0x7c, 0x55, 0x80, 0x49, 0x48, 0x78, 0x37, 0x8c, 0x6d, 0x5f, 0x70, 0x7c, 0x80, 0x85, - 0x04, 0x85, 0x71, 0x6e, 0x27, 0x20, 0x47, 0x4c, 0x11, 0x6b, 0xf8, 0x04, 0x45, 0x1b, 0x75, 0x76, - 0x9c, 0x68, 0xbb, 0xf7, 0xc2, 0x08, 0xc1, 0x0c, 0x1b, 0x7d, 0x90, 0x15, 0x64, 0xce, 0x4e, 0xa4, - 0xc5, 0xd3, 0x70, 0x84, 0x20, 0xd5, 0xb1, 0xaf, 0x55, 0x35, 0x5f, 0x8b, 0x60, 0x3f, 0x4c, 0xb1, - 0x89, 0xdd, 0x57, 0xf8, 0xc7, 0x98, 0x9c, 0x6e, 0x63, 0x6b, 0x2f, 0xf0, 0xac, 0x47, 0x98, 0x9c, - 0x04, 0x26, 0x7c, 0xeb, 0x75, 0x2b, 0xba, 0xe5, 0x12, 0x0c, 0x47, 0x1d, 0x1f, 0x65, 0x81, 0xb9, - 0x7e, 0x4e, 0x22, 0x55, 0xd0, 0xfc, 0xda, 0x02, 0xa9, 0x5f, 0xde, 0x53, 0xc9, 0x25, 0x48, 0x1d, - 0xb5, 0xbc, 0xb4, 0x59, 0x51, 0x95, 0x2b, 0xab, 0x9b, 0x4b, 0x2b, 0x95, 0x5c, 0x32, 0x52, 0xb0, - 0x5f, 0x4a, 0x65, 0xee, 0xcf, 0x3d, 0x20, 0x7f, 0x23, 0x01, 0xa3, 0xf1, 0x19, 0x18, 0x7a, 0x3b, - 0xdc, 0x25, 0x96, 0x4b, 0x3c, 0xec, 0xab, 0x37, 0x0c, 0x97, 0x46, 0x64, 0x5d, 0x63, 0xa3, 0x63, - 0xe0, 0x13, 0x93, 0x1c, 0x6b, 0x03, 0xfb, 0xcf, 0x18, 0x2e, 0x89, 0xb7, 0xba, 0xe6, 0xa3, 0x65, - 0x98, 0xb6, 0x6c, 0xd5, 0xf3, 0x35, 0xab, 0xaa, 0xb9, 0x55, 0x35, 0x5c, 0xa8, 0x52, 0x35, 0x5d, - 0xc7, 0x9e, 0x67, 0xb3, 0x91, 0x30, 0xe0, 0x72, 0xdc, 0xb2, 0x37, 0x38, 0x72, 0x38, 0x44, 0xcc, - 0x71, 0xd4, 0x26, 0xff, 0x4d, 0x76, 0xf2, 0xdf, 0x63, 0x90, 0xad, 0x6b, 0x8e, 0x8a, 0x2d, 0xdf, - 0xdd, 0xa3, 0x75, 0x77, 0x46, 0xc9, 0xd4, 0x35, 0xa7, 0x42, 0xde, 0xdf, 0x90, 0xe9, 0xcf, 0xa5, - 0x54, 0x26, 0x93, 0xcb, 0x5e, 0x4a, 0x65, 0xb2, 0x39, 0x90, 0x5f, 0x4e, 0xc2, 0x70, 0xb4, 0x0e, - 0x27, 0xd3, 0x1a, 0x9d, 0x0e, 0x59, 0x12, 0x4d, 0x6a, 0xf7, 0xee, 0x5b, 0xb5, 0x17, 0xe7, 0xc9, - 0x58, 0x56, 0x1a, 0x60, 0xd5, 0xb1, 0xc2, 0x28, 0x49, 0x1d, 0x41, 0x9c, 0x0d, 0xb3, 0x6a, 0x24, - 0xa3, 0xf0, 0x37, 0xb4, 0x08, 0x03, 0xcf, 0x79, 0x94, 0xf7, 0x00, 0xe5, 0x7d, 0xdf, 0xfe, 0xbc, - 0x2f, 0x6d, 0x50, 0xe6, 0xd9, 0x4b, 0x1b, 0xea, 0xea, 0x9a, 0xb2, 0x32, 0xb7, 0xac, 0x70, 0x72, - 0x74, 0x14, 0x52, 0xa6, 0x76, 0x73, 0x2f, 0x3e, 0xea, 0x51, 0x50, 0xaf, 0x9d, 0x70, 0x14, 0x52, - 0x37, 0xb0, 0x76, 0x2d, 0x3e, 0xd6, 0x50, 0xd0, 0xeb, 0x18, 0x0c, 0xb3, 0x90, 0xa6, 0xf6, 0x42, - 0x00, 0xdc, 0x62, 0xb9, 0x43, 0x28, 0x03, 0xa9, 0xf9, 0x35, 0x85, 0x04, 0x44, 0x0e, 0x86, 0x19, - 0x54, 0x5d, 0x5f, 0xaa, 0xcc, 0x57, 0x72, 0x09, 0xf9, 0x09, 0x18, 0x60, 0x46, 0x20, 0xc1, 0x12, - 0x98, 0x21, 0x77, 0x88, 0xbf, 0x72, 0x1e, 0x92, 0xf8, 0x7a, 0x65, 0xa5, 0x5c, 0x51, 0x72, 0x89, - 0x78, 0x57, 0xa7, 0x72, 0x69, 0xd9, 0x83, 0xe1, 0x68, 0x21, 0xfe, 0xc6, 0x4c, 0xb2, 0xbf, 0x22, - 0xc1, 0x50, 0xa4, 0xb0, 0x26, 0x15, 0x91, 0x66, 0x9a, 0xf6, 0x0d, 0x55, 0x33, 0x0d, 0xcd, 0xe3, - 0xae, 0x01, 0x14, 0x34, 0x47, 0x20, 0xbd, 0x76, 0xdd, 0x1b, 0x14, 0x22, 0xe9, 0xdc, 0x80, 0xfc, - 0x19, 0x09, 0x72, 0xcd, 0x95, 0x6d, 0x93, 0x98, 0xd2, 0x0f, 0x52, 0x4c, 0xf9, 0xd3, 0x12, 0x8c, - 0xc6, 0xcb, 0xd9, 0x26, 0xf1, 0xee, 0xf9, 0x81, 0x8a, 0xf7, 0x07, 0x09, 0x18, 0x89, 0x15, 0xb1, - 0xbd, 0x4a, 0xf7, 0x3c, 0x8c, 0x1b, 0x55, 0x5c, 0x77, 0x6c, 0x1f, 0x5b, 0xfa, 0x9e, 0x6a, 0xe2, - 0xeb, 0xd8, 0xcc, 0xcb, 0x34, 0x69, 0xcc, 0xee, 0x5f, 0x26, 0x17, 0x97, 0x42, 0xba, 0x65, 0x42, - 0x56, 0x9a, 0x58, 0x5a, 0xa8, 0xac, 0xac, 0xaf, 0x6d, 0x56, 0x56, 0xe7, 0xdf, 0xad, 0x5e, 0x59, - 0xbd, 0xbc, 0xba, 0xf6, 0xcc, 0xaa, 0x92, 0x33, 0x9a, 0xd0, 0x5e, 0xc7, 0xb0, 0x5f, 0x87, 0x5c, - 0xb3, 0x50, 0xe8, 0x2e, 0x68, 0x27, 0x56, 0xee, 0x10, 0x9a, 0x80, 0xb1, 0xd5, 0x35, 0x75, 0x63, - 0x69, 0xa1, 0xa2, 0x56, 0x2e, 0x5c, 0xa8, 0xcc, 0x6f, 0x6e, 0xb0, 0x85, 0x8f, 0x00, 0x7b, 0x33, - 0x16, 0xe0, 0xf2, 0xa7, 0x92, 0x30, 0xd1, 0x46, 0x12, 0x34, 0xc7, 0xa7, 0x2c, 0x6c, 0x16, 0xf5, - 0x48, 0x2f, 0xd2, 0x17, 0x49, 0xcd, 0xb0, 0xae, 0xb9, 0x3e, 0x9f, 0xe1, 0x3c, 0x08, 0xc4, 0x4a, - 0x96, 0x6f, 0x6c, 0x1b, 0xd8, 0xe5, 0xeb, 0x44, 0x6c, 0x1e, 0x33, 0x16, 0xc2, 0xd9, 0x52, 0xd1, - 0xc3, 0x80, 0x1c, 0xdb, 0x33, 0x7c, 0xe3, 0x3a, 0x56, 0x0d, 0x4b, 0x2c, 0x2a, 0xa5, 0xe8, 0x2e, - 0x53, 0x4e, 0x7c, 0x59, 0xb2, 0xfc, 0x00, 0xdb, 0xc2, 0x35, 0xad, 0x09, 0x9b, 0x24, 0xf3, 0xa4, - 0x92, 0x13, 0x5f, 0x02, 0xec, 0x7b, 0x60, 0xb8, 0x6a, 0x37, 0x48, 0xb1, 0xc7, 0xf0, 0xc8, 0xd8, - 0x21, 0x29, 0x43, 0x0c, 0x16, 0xa0, 0xf0, 0x32, 0x3e, 0x5c, 0xcd, 0x1a, 0x56, 0x86, 0x18, 0x8c, - 0xa1, 0x3c, 0x00, 0x63, 0x5a, 0xad, 0xe6, 0x12, 0xe6, 0x82, 0x11, 0x9b, 0x98, 0x8c, 0x06, 0x60, - 0x8a, 0x58, 0xb8, 0x04, 0x19, 0x61, 0x07, 0x32, 0x54, 0x13, 0x4b, 0xa8, 0x0e, 0x9b, 0x6d, 0x27, - 0x4e, 0x64, 0x95, 0x8c, 0x25, 0x3e, 0xde, 0x03, 0xc3, 0x86, 0xa7, 0x86, 0x8b, 0xf3, 0x89, 0x99, - 0xc4, 0x89, 0x8c, 0x32, 0x64, 0x78, 0xc1, 0xc2, 0xa6, 0xfc, 0xc5, 0x04, 0x8c, 0xc6, 0x37, 0x17, - 0xd0, 0x02, 0x64, 0x4c, 0x5b, 0xa7, 0x5b, 0x89, 0x7c, 0x67, 0xeb, 0x44, 0x97, 0xfd, 0x88, 0xe2, - 0x32, 0xc7, 0x57, 0x02, 0xca, 0xc2, 0xbf, 0x92, 0x20, 0x23, 0xc0, 0xe8, 0x08, 0xa4, 0x1c, 0xcd, - 0xdf, 0xa1, 0xec, 0xd2, 0xe5, 0x44, 0x4e, 0x52, 0xe8, 0x3b, 0x81, 0x7b, 0x8e, 0x66, 0x51, 0x17, - 0xe0, 0x70, 0xf2, 0x4e, 0xfa, 0xd5, 0xc4, 0x5a, 0x95, 0xce, 0x7a, 0xec, 0x7a, 0x1d, 0x5b, 0xbe, - 0x27, 0xfa, 0x95, 0xc3, 0xe7, 0x39, 0x18, 0x3d, 0x04, 0xe3, 0xbe, 0xab, 0x19, 0x66, 0x0c, 0x37, - 0x45, 0x71, 0x73, 0xe2, 0x43, 0x80, 0x5c, 0x82, 0xa3, 0x82, 0x6f, 0x15, 0xfb, 0x9a, 0xbe, 0x83, - 0xab, 0x21, 0xd1, 0x00, 0x5d, 0xdd, 0xb8, 0x8b, 0x23, 0x2c, 0xf0, 0xef, 0x82, 0x56, 0xfe, 0x86, - 0x04, 0xe3, 0x62, 0x9e, 0x56, 0x0d, 0x8c, 0xb5, 0x02, 0xa0, 0x59, 0x96, 0xed, 0x47, 0xcd, 0xd5, - 0xea, 0xca, 0x2d, 0x74, 0xc5, 0xb9, 0x80, 0x48, 0x89, 0x30, 0x28, 0xd4, 0x01, 0xc2, 0x2f, 0x1d, - 0xcd, 0x36, 0x0d, 0x43, 0x7c, 0xe7, 0x88, 0x6e, 0x3f, 0xb2, 0x99, 0x3d, 0x30, 0x10, 0x99, 0xd0, - 0xa1, 0x49, 0x48, 0x6f, 0xe1, 0x9a, 0x61, 0xf1, 0xf5, 0x60, 0xf6, 0x22, 0xd6, 0x5f, 0x52, 0xc1, - 0xfa, 0x4b, 0xf9, 0x63, 0x12, 0x4c, 0xe8, 0x76, 0xbd, 0x59, 0xde, 0x72, 0xae, 0x69, 0x79, 0xc1, - 0xbb, 0x28, 0xbd, 0xe7, 0x9d, 0x91, 0x9d, 0xd6, 0x9a, 0x6d, 0x6a, 0x56, 0x2d, 0xdc, 0x3f, 0xa5, - 0x0f, 0xfa, 0x23, 0x35, 0x6c, 0x3d, 0x52, 0xb3, 0x23, 0xbb, 0xa9, 0xe7, 0xc3, 0xc7, 0xff, 0x2b, - 0x49, 0x9f, 0x4f, 0x24, 0x17, 0xd7, 0xcb, 0x5f, 0x4a, 0x14, 0x16, 0x59, 0x73, 0xeb, 0xc2, 0x3c, - 0x0a, 0xde, 0x36, 0xb1, 0x4e, 0x54, 0x86, 0xef, 0x3d, 0x04, 0x93, 0x35, 0xbb, 0x66, 0x53, 0x8e, - 0xb3, 0xe4, 0x89, 0xef, 0xc8, 0x66, 0x03, 0x68, 0xa1, 0xeb, 0xf6, 0x6d, 0x69, 0x15, 0x26, 0x38, - 0xb2, 0x4a, 0xb7, 0x84, 0xd8, 0xc4, 0x06, 0xed, 0xbb, 0xac, 0x96, 0xff, 0xe5, 0xef, 0xd0, 0x01, - 0x5d, 0x19, 0xe7, 0xa4, 0xe4, 0x1b, 0x9b, 0xfb, 0x94, 0x14, 0x38, 0x1c, 0xe3, 0xc7, 0xc2, 0x16, - 0xbb, 0x5d, 0x38, 0xfe, 0x26, 0xe7, 0x38, 0x11, 0xe1, 0xb8, 0xc1, 0x49, 0x4b, 0xf3, 0x30, 0xd2, - 0x0f, 0xaf, 0xdf, 0xe2, 0xbc, 0x86, 0x71, 0x94, 0xc9, 0x22, 0x8c, 0x51, 0x26, 0x7a, 0xc3, 0xf3, - 0xed, 0x3a, 0xcd, 0x89, 0xfb, 0xb3, 0xf9, 0xed, 0xef, 0xb0, 0x38, 0x1a, 0x25, 0x64, 0xf3, 0x01, - 0x55, 0xa9, 0x04, 0x74, 0x17, 0xac, 0x8a, 0x75, 0xb3, 0x0b, 0x87, 0xaf, 0x71, 0x41, 0x02, 0xfc, - 0xd2, 0x55, 0x98, 0x24, 0xcf, 0x34, 0x65, 0x45, 0x25, 0xe9, 0xbe, 0x06, 0x97, 0xff, 0xc6, 0x07, - 0x59, 0xa8, 0x4e, 0x04, 0x0c, 0x22, 0x32, 0x45, 0x7a, 0xb1, 0x86, 0x7d, 0x1f, 0xbb, 0x9e, 0xaa, - 0x99, 0xed, 0xc4, 0x8b, 0x2c, 0x62, 0xe4, 0x3f, 0xf9, 0xfd, 0x78, 0x2f, 0x2e, 0x32, 0xca, 0x39, - 0xd3, 0x2c, 0x5d, 0x81, 0xbb, 0xda, 0x78, 0x45, 0x0f, 0x3c, 0x3f, 0xc5, 0x79, 0x4e, 0xb6, 0x78, - 0x06, 0x61, 0xbb, 0x0e, 0x02, 0x1e, 0xf4, 0x65, 0x0f, 0x3c, 0x7f, 0x8e, 0xf3, 0x44, 0x9c, 0x56, - 0x74, 0x29, 0xe1, 0x78, 0x09, 0xc6, 0xaf, 0x63, 0x77, 0xcb, 0xf6, 0xf8, 0xc2, 0x51, 0x0f, 0xec, - 0x3e, 0xcd, 0xd9, 0x8d, 0x71, 0x42, 0xba, 0x92, 0x44, 0x78, 0x3d, 0x09, 0x99, 0x6d, 0x4d, 0xc7, - 0x3d, 0xb0, 0x78, 0x89, 0xb3, 0x18, 0x24, 0xf8, 0x84, 0x74, 0x0e, 0x86, 0x6b, 0x36, 0x1f, 0xb5, - 0xba, 0x93, 0x7f, 0x86, 0x93, 0x0f, 0x09, 0x1a, 0xce, 0xc2, 0xb1, 0x9d, 0x86, 0x49, 0x86, 0xb4, - 0xee, 0x2c, 0xfe, 0xaa, 0x60, 0x21, 0x68, 0x38, 0x8b, 0x3e, 0xcc, 0xfa, 0x59, 0xc1, 0xc2, 0x8b, - 0xd8, 0xf3, 0x29, 0x18, 0xb2, 0x2d, 0x73, 0xcf, 0xb6, 0x7a, 0x11, 0xe2, 0x73, 0x9c, 0x03, 0x70, - 0x12, 0xc2, 0xe0, 0x3c, 0x64, 0x7b, 0xed, 0x88, 0xbf, 0xfe, 0x7d, 0x11, 0x1e, 0xa2, 0x07, 0x16, - 0x61, 0x4c, 0x24, 0x28, 0xc3, 0xb6, 0x7a, 0x60, 0xf1, 0x37, 0x38, 0x8b, 0xd1, 0x08, 0x19, 0x57, - 0xc3, 0xc7, 0x9e, 0x5f, 0xc3, 0xbd, 0x30, 0xf9, 0xa2, 0x50, 0x83, 0x93, 0x70, 0x53, 0x6e, 0x61, - 0x4b, 0xdf, 0xe9, 0x8d, 0xc3, 0xcf, 0x0b, 0x53, 0x0a, 0x1a, 0xc2, 0x62, 0x1e, 0x46, 0xea, 0x9a, - 0xeb, 0xed, 0x68, 0x66, 0x4f, 0xdd, 0xf1, 0x37, 0x39, 0x8f, 0xe1, 0x80, 0x88, 0x5b, 0xa4, 0x61, - 0xf5, 0xc3, 0xe6, 0x4b, 0xc2, 0x22, 0x11, 0x32, 0x1e, 0x7a, 0x9e, 0x4f, 0x57, 0xd9, 0xfa, 0xe1, - 0xf6, 0x0b, 0x22, 0xf4, 0x18, 0xed, 0x4a, 0x94, 0xe3, 0x79, 0xc8, 0x7a, 0xc6, 0xcd, 0x9e, 0xd8, - 0xfc, 0x2d, 0xd1, 0xd3, 0x94, 0x80, 0x10, 0xbf, 0x1b, 0x8e, 0xb6, 0x1d, 0x26, 0x7a, 0x60, 0xf6, - 0xb7, 0x39, 0xb3, 0x23, 0x6d, 0x86, 0x0a, 0x9e, 0x12, 0xfa, 0x65, 0xf9, 0x77, 0x44, 0x4a, 0xc0, - 0x4d, 0xbc, 0xd6, 0xc9, 0x3c, 0xc2, 0xd3, 0xb6, 0xfb, 0xb3, 0xda, 0x2f, 0x0a, 0xab, 0x31, 0xda, - 0x98, 0xd5, 0x36, 0xe1, 0x08, 0xe7, 0xd8, 0x5f, 0xbf, 0xfe, 0x92, 0x48, 0xac, 0x8c, 0xfa, 0x4a, - 0xbc, 0x77, 0xdf, 0x0b, 0x85, 0xc0, 0x9c, 0xa2, 0x60, 0xf5, 0xd4, 0xba, 0xe6, 0xf4, 0xc0, 0xf9, - 0x97, 0x39, 0x67, 0x91, 0xf1, 0x83, 0x8a, 0xd7, 0x5b, 0xd1, 0x1c, 0xc2, 0xfc, 0x59, 0xc8, 0x0b, - 0xe6, 0x0d, 0xcb, 0xc5, 0xba, 0x5d, 0xb3, 0x8c, 0x9b, 0xb8, 0xda, 0x03, 0xeb, 0xbf, 0xdb, 0xd4, - 0x55, 0x57, 0x22, 0xe4, 0x84, 0xf3, 0x12, 0xe4, 0x82, 0x5a, 0x45, 0x35, 0xea, 0x8e, 0xed, 0xfa, - 0x5d, 0x38, 0x7e, 0x59, 0xf4, 0x54, 0x40, 0xb7, 0x44, 0xc9, 0x4a, 0x15, 0x18, 0xa5, 0xaf, 0xbd, - 0xba, 0xe4, 0xaf, 0x70, 0x46, 0x23, 0x21, 0x15, 0x4f, 0x1c, 0xba, 0x5d, 0x77, 0x34, 0xb7, 0x97, - 0xfc, 0xf7, 0xf7, 0x44, 0xe2, 0xe0, 0x24, 0x3c, 0x71, 0xf8, 0x7b, 0x0e, 0x26, 0xa3, 0x7d, 0x0f, - 0x1c, 0x7e, 0x55, 0x24, 0x0e, 0x41, 0xc3, 0x59, 0x88, 0x82, 0xa1, 0x07, 0x16, 0x7f, 0x5f, 0xb0, - 0x10, 0x34, 0x84, 0xc5, 0xd3, 0xe1, 0x40, 0xeb, 0xe2, 0x9a, 0xe1, 0xf9, 0x2e, 0x2b, 0x93, 0xf7, - 0x67, 0xf5, 0x0f, 0xbe, 0x1f, 0x2f, 0xc2, 0x94, 0x08, 0x29, 0xc9, 0x44, 0x7c, 0xd9, 0x95, 0xce, - 0xa2, 0xba, 0x0b, 0xf6, 0x6b, 0x22, 0x13, 0x45, 0xc8, 0x88, 0x6c, 0x91, 0x0a, 0x91, 0x98, 0x5d, - 0x27, 0x73, 0x87, 0x1e, 0xd8, 0xfd, 0xc3, 0x26, 0xe1, 0x36, 0x04, 0x2d, 0xe1, 0x19, 0xa9, 0x7f, - 0x1a, 0xd6, 0x35, 0xbc, 0xd7, 0x93, 0x77, 0xfe, 0x7a, 0x53, 0xfd, 0x73, 0x85, 0x51, 0xb2, 0x1c, - 0x32, 0xd6, 0x54, 0x4f, 0xa1, 0x6e, 0xe7, 0x87, 0xf2, 0x3f, 0xf6, 0x0a, 0xd7, 0x37, 0x5e, 0x4e, - 0x95, 0x96, 0x89, 0x93, 0xc7, 0x8b, 0x9e, 0xee, 0xcc, 0x3e, 0xf8, 0x4a, 0xe0, 0xe7, 0xb1, 0x9a, - 0xa7, 0x74, 0x01, 0x46, 0x62, 0x05, 0x4f, 0x77, 0x56, 0x1f, 0xe2, 0xac, 0x86, 0xa3, 0xf5, 0x4e, - 0xe9, 0x09, 0x48, 0x91, 0xe2, 0xa5, 0x3b, 0xf9, 0x87, 0x39, 0x39, 0x45, 0x2f, 0xbd, 0x03, 0x32, - 0xa2, 0x68, 0xe9, 0x4e, 0xfa, 0x11, 0x4e, 0x1a, 0x90, 0x10, 0x72, 0x51, 0xb0, 0x74, 0x27, 0xff, - 0xf3, 0x82, 0x5c, 0x90, 0x10, 0xf2, 0xde, 0x4d, 0xf8, 0x95, 0xbf, 0x90, 0xe2, 0x83, 0x8e, 0xb0, - 0xdd, 0x79, 0x18, 0xe4, 0x95, 0x4a, 0x77, 0xea, 0x8f, 0xf2, 0xc6, 0x05, 0x45, 0xe9, 0x2c, 0xa4, - 0x7b, 0x34, 0xf8, 0x4f, 0x72, 0x52, 0x86, 0x5f, 0x9a, 0x87, 0xa1, 0x48, 0x75, 0xd2, 0x9d, 0xfc, - 0x2f, 0x71, 0xf2, 0x28, 0x15, 0x11, 0x9d, 0x57, 0x27, 0xdd, 0x19, 0x7c, 0x4c, 0x88, 0xce, 0x29, - 0x88, 0xd9, 0x44, 0x61, 0xd2, 0x9d, 0xfa, 0xe3, 0xc2, 0xea, 0x82, 0xa4, 0xf4, 0x14, 0x64, 0x83, - 0xc1, 0xa6, 0x3b, 0xfd, 0x4f, 0x71, 0xfa, 0x90, 0x86, 0x58, 0x20, 0x32, 0xd8, 0x75, 0x67, 0xf1, - 0xd3, 0xc2, 0x02, 0x11, 0x2a, 0x12, 0x46, 0xcd, 0x05, 0x4c, 0x77, 0x4e, 0x3f, 0x23, 0xc2, 0xa8, - 0xa9, 0x7e, 0x21, 0xbd, 0x49, 0x73, 0x7e, 0x77, 0x16, 0x3f, 0x2b, 0x7a, 0x93, 0xe2, 0x13, 0x31, - 0x9a, 0x2b, 0x82, 0xee, 0x3c, 0xfe, 0x8a, 0x10, 0xa3, 0xa9, 0x20, 0x28, 0xad, 0x03, 0x6a, 0xad, - 0x06, 0xba, 0xf3, 0xfb, 0x04, 0xe7, 0x37, 0xde, 0x52, 0x0c, 0x94, 0x9e, 0x81, 0x23, 0xed, 0x2b, - 0x81, 0xee, 0x5c, 0x3f, 0xf9, 0x4a, 0xd3, 0xdc, 0x2d, 0x5a, 0x08, 0x94, 0x36, 0xc3, 0x21, 0x25, - 0x5a, 0x05, 0x74, 0x67, 0xfb, 0xa9, 0x57, 0xe2, 0x89, 0x3b, 0x5a, 0x04, 0x94, 0xe6, 0x00, 0xc2, - 0x01, 0xb8, 0x3b, 0xaf, 0x4f, 0x73, 0x5e, 0x11, 0x22, 0x12, 0x1a, 0x7c, 0xfc, 0xed, 0x4e, 0xff, - 0x92, 0x08, 0x0d, 0x4e, 0x41, 0x42, 0x43, 0x0c, 0xbd, 0xdd, 0xa9, 0x3f, 0x23, 0x42, 0x43, 0x90, - 0x10, 0xcf, 0x8e, 0x8c, 0x6e, 0xdd, 0x39, 0x7c, 0x4e, 0x78, 0x76, 0x84, 0xaa, 0xb4, 0x0a, 0xe3, - 0x2d, 0x03, 0x62, 0x77, 0x56, 0x9f, 0xe7, 0xac, 0x72, 0xcd, 0xe3, 0x61, 0x74, 0xf0, 0xe2, 0x83, - 0x61, 0x77, 0x6e, 0x5f, 0x68, 0x1a, 0xbc, 0xf8, 0x58, 0x58, 0x3a, 0x0f, 0x19, 0xab, 0x61, 0x9a, - 0x24, 0x78, 0xd0, 0xfe, 0x67, 0xfe, 0xf2, 0x7f, 0xf8, 0x2a, 0xb7, 0x8e, 0x20, 0x28, 0x3d, 0x01, - 0x69, 0x5c, 0xdf, 0xc2, 0xd5, 0x6e, 0x94, 0xdf, 0x7b, 0x55, 0x24, 0x4c, 0x82, 0x5d, 0x7a, 0x0a, - 0x80, 0x2d, 0x8d, 0xd0, 0xed, 0xc1, 0x2e, 0xb4, 0xff, 0xf5, 0x55, 0x7e, 0x1a, 0x27, 0x24, 0x09, - 0x19, 0xb0, 0xb3, 0x3d, 0xfb, 0x33, 0xf8, 0x7e, 0x9c, 0x01, 0xed, 0x91, 0x27, 0x61, 0xf0, 0x39, - 0xcf, 0xb6, 0x7c, 0xad, 0xd6, 0x8d, 0xfa, 0xbf, 0x71, 0x6a, 0x81, 0x4f, 0x0c, 0x56, 0xb7, 0x5d, - 0xec, 0x6b, 0x35, 0xaf, 0x1b, 0xed, 0x7f, 0xe7, 0xb4, 0x01, 0x01, 0x21, 0xd6, 0x35, 0xcf, 0xef, - 0x45, 0xef, 0x3f, 0x12, 0xc4, 0x82, 0x80, 0x08, 0x4d, 0x9e, 0xaf, 0xe1, 0xbd, 0x6e, 0xb4, 0x7f, - 0x2c, 0x84, 0xe6, 0xf8, 0xa5, 0x77, 0x40, 0x96, 0x3c, 0xb2, 0x23, 0x76, 0x5d, 0x88, 0xff, 0x07, - 0x27, 0x0e, 0x29, 0x48, 0xcb, 0x9e, 0x5f, 0xf5, 0x8d, 0xee, 0xc6, 0xbe, 0xcd, 0x7b, 0x5a, 0xe0, - 0x97, 0xe6, 0x60, 0xc8, 0xf3, 0xab, 0xd5, 0x06, 0xaf, 0x4f, 0xbb, 0x90, 0xff, 0xcf, 0x57, 0x83, - 0x25, 0x8b, 0x80, 0x86, 0xf4, 0xf6, 0x8d, 0x6b, 0xbe, 0x63, 0xd3, 0x2d, 0x90, 0x6e, 0x1c, 0x5e, - 0xe1, 0x1c, 0x22, 0x24, 0xa5, 0x79, 0x18, 0x26, 0xba, 0xb8, 0xd8, 0xc1, 0x74, 0xbf, 0xaa, 0x0b, - 0x8b, 0xff, 0xc5, 0x0d, 0x10, 0x23, 0x2a, 0xff, 0x68, 0xa7, 0x7b, 0x37, 0xed, 0x97, 0x8d, 0x61, - 0xd1, 0x5e, 0xb4, 0xd9, 0x82, 0xf1, 0x7b, 0xe4, 0xd8, 0x72, 0x71, 0xcd, 0x0e, 0x57, 0x6b, 0x83, - 0x49, 0x0e, 0xfc, 0x66, 0x9a, 0x54, 0xcd, 0x74, 0x2d, 0x57, 0x73, 0x8c, 0xd9, 0x1d, 0xdf, 0x77, - 0xf8, 0x6a, 0x2f, 0x70, 0xd6, 0x9a, 0x63, 0xc8, 0x7b, 0x90, 0xba, 0xe8, 0xfb, 0x0e, 0x3a, 0x09, - 0x69, 0xb7, 0x61, 0x62, 0x8f, 0xaf, 0xb2, 0x4f, 0x16, 0x43, 0x9c, 0x22, 0x41, 0x50, 0x1a, 0x26, - 0x56, 0x18, 0x0a, 0xaa, 0xc0, 0xf4, 0x76, 0xc3, 0x34, 0xf7, 0xd4, 0x2a, 0xa6, 0x97, 0x2b, 0x82, - 0x73, 0x8c, 0x78, 0xd7, 0xd1, 0xc4, 0x66, 0x08, 0x31, 0xd9, 0x71, 0x8a, 0xb6, 0x40, 0xb1, 0xc4, - 0x19, 0xc6, 0x8a, 0xc0, 0x91, 0x7f, 0x3f, 0x01, 0x19, 0xc1, 0x1a, 0x15, 0x20, 0xe3, 0x61, 0x13, - 0xeb, 0xbe, 0xed, 0xf2, 0xc3, 0x65, 0xc1, 0x3b, 0x42, 0x90, 0xac, 0xf1, 0xdb, 0x52, 0xd9, 0x8b, - 0x87, 0x14, 0xf2, 0x42, 0x60, 0x4e, 0x83, 0x5d, 0x95, 0xa2, 0x30, 0xa7, 0xe1, 0xa3, 0x49, 0x48, - 0x39, 0xb6, 0xe7, 0xb3, 0x0d, 0x8a, 0x8b, 0x87, 0x14, 0xfa, 0x86, 0xf2, 0x30, 0x50, 0xc5, 0x26, - 0xf6, 0xd9, 0x0e, 0x13, 0x81, 0xf3, 0x77, 0x74, 0x04, 0xd2, 0x8e, 0xe6, 0xeb, 0x3b, 0xec, 0xe8, - 0xf4, 0xc5, 0x43, 0x0a, 0x7b, 0x45, 0x08, 0x52, 0x5b, 0x76, 0x75, 0x8f, 0x1f, 0x8a, 0xa6, 0xcf, - 0xe8, 0x2c, 0x0c, 0xb0, 0x68, 0x6f, 0x3e, 0xcd, 0x4c, 0x0c, 0xc4, 0x96, 0x55, 0x89, 0x2e, 0xeb, - 0x1a, 0xa9, 0xe0, 0x2d, 0xd2, 0x08, 0x43, 0x47, 0x15, 0x98, 0xd0, 0xaa, 0x55, 0x83, 0x38, 0x82, - 0x66, 0xaa, 0x5b, 0x86, 0x55, 0x35, 0xac, 0x9a, 0x47, 0x6f, 0xff, 0x74, 0x32, 0x33, 0x0a, 0x09, - 0xca, 0x1c, 0x9f, 0x1f, 0x17, 0xa5, 0x37, 0xbc, 0x54, 0x2a, 0x1c, 0xbb, 0x8b, 0x32, 0x2c, 0x80, - 0x65, 0xbb, 0xba, 0x57, 0xce, 0xc2, 0xa0, 0xc3, 0x04, 0x90, 0xcf, 0xc3, 0x78, 0x8b, 0x54, 0x44, - 0xb1, 0x6b, 0x86, 0x55, 0x15, 0xe7, 0x18, 0xc9, 0x33, 0x81, 0xd1, 0x6d, 0x10, 0xb6, 0xcf, 0x41, - 0x9f, 0xcb, 0x3f, 0x2e, 0x75, 0x74, 0xcd, 0xd1, 0x88, 0x6b, 0x6a, 0x8e, 0x51, 0xce, 0x52, 0xfe, - 0xc4, 0xad, 0xd6, 0xa5, 0xf7, 0xcc, 0xf1, 0x0f, 0x6c, 0x07, 0xa3, 0x68, 0xbb, 0xb5, 0xd9, 0x1a, - 0xb6, 0xc4, 0x6e, 0x03, 0xf9, 0xa4, 0x39, 0x86, 0x47, 0xdd, 0x31, 0xdc, 0x96, 0xf1, 0xce, 0x47, - 0x9e, 0xe9, 0x46, 0x46, 0x6a, 0x71, 0x6e, 0x7d, 0x29, 0xb8, 0x52, 0xf6, 0x1b, 0x09, 0x38, 0x1e, - 0xf1, 0xe3, 0x08, 0x72, 0xab, 0x3b, 0x17, 0xda, 0x7b, 0x7c, 0x0f, 0x9b, 0x1a, 0x97, 0x21, 0x45, - 0xf0, 0x51, 0x97, 0x53, 0x98, 0xf9, 0x5f, 0xfa, 0xe7, 0xff, 0x48, 0xa6, 0x0e, 0xd0, 0xbe, 0xeb, - 0x28, 0x93, 0xf2, 0x47, 0x7a, 0xb7, 0x5f, 0x2e, 0xdc, 0x91, 0xf2, 0xee, 0x9c, 0x19, 0x9b, 0x6d, - 0xf8, 0xf1, 0x04, 0x4c, 0x37, 0x9b, 0x80, 0x24, 0x53, 0xcf, 0xd7, 0xea, 0x4e, 0xa7, 0x5b, 0x79, - 0xe7, 0x21, 0xbb, 0x29, 0x70, 0x50, 0x1e, 0x06, 0x3d, 0xac, 0xdb, 0x56, 0xd5, 0xa3, 0xde, 0x93, - 0x54, 0xc4, 0x2b, 0x9a, 0x84, 0xb4, 0xa5, 0x59, 0xb6, 0xc7, 0x0f, 0x0d, 0xb3, 0x97, 0xf2, 0x5f, - 0x96, 0xfa, 0xcb, 0x6e, 0xa3, 0x41, 0x53, 0xc2, 0x0a, 0x0f, 0xed, 0xb7, 0x25, 0xc6, 0xee, 0x1e, - 0x06, 0x2a, 0x44, 0xf6, 0xbf, 0xa6, 0x9a, 0xf7, 0xbf, 0x9e, 0xc1, 0xa6, 0x79, 0xd9, 0xb2, 0x6f, - 0x58, 0x9b, 0x84, 0x26, 0x30, 0xc9, 0xef, 0x4a, 0x30, 0x43, 0x6f, 0x43, 0xb8, 0x75, 0xc3, 0xf2, - 0x67, 0x4d, 0x63, 0xcb, 0x9b, 0xdd, 0x32, 0x7c, 0x8f, 0x5d, 0x6b, 0xe4, 0x36, 0x99, 0x0c, 0x31, - 0x8a, 0x04, 0xa3, 0x48, 0x30, 0xe4, 0xd3, 0x90, 0x29, 0x1b, 0xfe, 0x9c, 0xeb, 0x6a, 0x7b, 0x34, - 0x57, 0x18, 0xbe, 0x30, 0x0a, 0x7d, 0x26, 0x16, 0xc1, 0x26, 0xae, 0x7b, 0x74, 0xe7, 0x35, 0xa5, - 0xb0, 0x97, 0xf2, 0x95, 0x8e, 0xd7, 0x2c, 0xcf, 0x47, 0x34, 0x8d, 0x88, 0x14, 0x79, 0x64, 0x7d, - 0xdf, 0x4e, 0xdc, 0x40, 0x9f, 0x2f, 0xa5, 0xe0, 0xee, 0x08, 0x82, 0xee, 0xee, 0x39, 0x3e, 0x1d, - 0x17, 0xec, 0x6d, 0xae, 0xcc, 0x78, 0x44, 0x19, 0xf6, 0xb9, 0xd0, 0x76, 0x37, 0x50, 0xde, 0x86, - 0xf4, 0x3a, 0xa1, 0x0b, 0xef, 0x8b, 0x32, 0xed, 0xd8, 0x0b, 0x81, 0xb2, 0x1b, 0x21, 0x09, 0x06, - 0x35, 0xc4, 0x65, 0x10, 0x13, 0x6b, 0xdb, 0xec, 0x04, 0x6e, 0x92, 0x6e, 0xc0, 0x67, 0x08, 0x80, - 0x1e, 0xb6, 0x9d, 0x84, 0xb4, 0xd6, 0x60, 0x7b, 0xc7, 0xc9, 0x13, 0xc3, 0x0a, 0x7b, 0x91, 0x2f, - 0xc3, 0x20, 0xdf, 0xaf, 0x6a, 0x73, 0x4b, 0xb6, 0x08, 0x69, 0x2a, 0x3c, 0xbf, 0x5a, 0x90, 0x2f, - 0xb6, 0x48, 0x5f, 0xa4, 0x42, 0x2a, 0x0c, 0x4d, 0xbe, 0x04, 0x99, 0x05, 0xbb, 0x6e, 0x58, 0x76, - 0x9c, 0x5b, 0x96, 0x71, 0xa3, 0x32, 0x93, 0x01, 0x83, 0xa5, 0x39, 0xf6, 0x42, 0x6f, 0xe2, 0xd2, - 0x13, 0xd9, 0x7c, 0xff, 0x9b, 0xbf, 0xc9, 0xf3, 0x30, 0x48, 0x79, 0xaf, 0x39, 0xa4, 0x7f, 0x83, - 0xd3, 0x70, 0x59, 0x7e, 0xed, 0x86, 0xb3, 0x4f, 0x84, 0xc2, 0x22, 0x48, 0x55, 0x35, 0x5f, 0xe3, - 0x7a, 0xd3, 0x67, 0xf9, 0x9d, 0x90, 0xe1, 0x4c, 0x3c, 0x74, 0x0a, 0x92, 0xb6, 0x23, 0xc6, 0xd6, - 0x42, 0x27, 0x55, 0xd6, 0x9c, 0x72, 0xea, 0x6b, 0xb7, 0xa6, 0x0f, 0x29, 0x04, 0xb9, 0xac, 0x74, - 0xf4, 0x97, 0x73, 0xfd, 0xfb, 0x0b, 0x6b, 0x26, 0x70, 0x96, 0xcf, 0x25, 0x60, 0x2a, 0xf2, 0xf5, - 0x3a, 0x76, 0xc9, 0x88, 0x1c, 0x73, 0x7d, 0x14, 0x11, 0x92, 0x7f, 0xef, 0xe0, 0x2e, 0xef, 0x80, - 0xe4, 0x9c, 0xe3, 0x90, 0x11, 0x9c, 0xed, 0x54, 0xdb, 0xcc, 0x5f, 0x52, 0x4a, 0xf0, 0x4e, 0x47, - 0x77, 0x7b, 0xdb, 0xbf, 0xa1, 0xb9, 0xc1, 0x5d, 0x24, 0xf1, 0x2e, 0x3f, 0x09, 0xd9, 0x79, 0x32, - 0x82, 0x59, 0x5e, 0x83, 0x86, 0xce, 0x96, 0x69, 0xeb, 0xd7, 0x38, 0x07, 0xf6, 0x42, 0x0c, 0xae, - 0x39, 0x0e, 0xbf, 0xb5, 0x4c, 0x1e, 0x4b, 0xa9, 0xef, 0x7e, 0x76, 0x5a, 0x2a, 0x6f, 0x74, 0x34, - 0xd1, 0x93, 0xfd, 0x9b, 0x88, 0x2b, 0x19, 0xd8, 0xe8, 0xd7, 0x8f, 0xc2, 0xf1, 0x28, 0x29, 0xcb, - 0x38, 0x11, 0x0b, 0xe5, 0x22, 0x16, 0xa2, 0xf0, 0xf6, 0xf6, 0x29, 0x74, 0xcb, 0xbc, 0x85, 0xae, - 0x79, 0xa8, 0xb0, 0x7f, 0x64, 0x17, 0xba, 0xf4, 0xa5, 0xfc, 0x24, 0x8c, 0xac, 0x6b, 0xae, 0xbf, - 0x81, 0xfd, 0x8b, 0x58, 0xab, 0x62, 0x37, 0x1e, 0xd8, 0x23, 0x22, 0xb0, 0x11, 0xa4, 0x68, 0xf4, - 0x32, 0xc7, 0xa6, 0xcf, 0xf2, 0x0e, 0xa4, 0xe8, 0x69, 0x97, 0x20, 0xe8, 0x39, 0x05, 0x0b, 0x7a, - 0xd2, 0x5d, 0x7b, 0x3e, 0xf6, 0x38, 0x09, 0x7b, 0x41, 0xa7, 0x45, 0xe8, 0x26, 0xf7, 0x0f, 0x5d, - 0xee, 0xed, 0x3c, 0x80, 0x4d, 0x18, 0x2c, 0x93, 0xde, 0x5e, 0x5a, 0x08, 0x04, 0x91, 0x42, 0x41, - 0xd0, 0x0a, 0x8c, 0x39, 0x9a, 0xeb, 0xd3, 0x63, 0xbe, 0x3b, 0x54, 0x0b, 0x9e, 0x19, 0xa6, 0x8b, - 0xcd, 0xfd, 0x50, 0x8c, 0x29, 0xcb, 0x5b, 0x19, 0x71, 0xa2, 0x40, 0xf9, 0x3f, 0xa7, 0x60, 0x80, - 0x1b, 0xe3, 0x1d, 0x30, 0xc8, 0x8d, 0x46, 0x1b, 0x24, 0xb5, 0x5d, 0xab, 0xef, 0x17, 0x03, 0x1f, - 0xe5, 0xfc, 0x04, 0x0d, 0xba, 0x1f, 0x32, 0xfa, 0x8e, 0x66, 0x58, 0xaa, 0xc1, 0xce, 0xbb, 0x66, - 0xcb, 0x43, 0x2f, 0xdf, 0x9a, 0x1e, 0x9c, 0x27, 0xb0, 0xa5, 0x05, 0x65, 0x90, 0x7e, 0x5c, 0xaa, - 0x92, 0x64, 0xb3, 0x83, 0x8d, 0xda, 0x0e, 0x4b, 0x36, 0x49, 0x85, 0xbf, 0xa1, 0x73, 0x90, 0x22, - 0x0e, 0xc1, 0x6f, 0x81, 0x14, 0x5a, 0xea, 0x8f, 0x60, 0x60, 0x2c, 0x67, 0x48, 0xc3, 0x1f, 0xff, - 0xd6, 0xb4, 0xa4, 0x50, 0x0a, 0x34, 0x0f, 0x23, 0xa6, 0xe6, 0xf9, 0x2a, 0x0d, 0x12, 0xd2, 0x7c, - 0x9a, 0xb2, 0x38, 0xda, 0x6a, 0x10, 0x6e, 0x58, 0x2e, 0xfa, 0x10, 0xa1, 0x62, 0xa0, 0x2a, 0x3a, - 0x01, 0x39, 0xca, 0x44, 0xb7, 0xeb, 0x75, 0xc3, 0x67, 0xe9, 0x7b, 0x80, 0xda, 0x7d, 0x94, 0xc0, - 0xe7, 0x29, 0x98, 0x26, 0xf1, 0x63, 0x90, 0xa5, 0xc7, 0xce, 0x29, 0x0a, 0x3b, 0x62, 0x95, 0x21, - 0x00, 0xfa, 0xf1, 0x01, 0x18, 0xbb, 0xae, 0x99, 0x46, 0x55, 0xf3, 0x6d, 0xd7, 0x63, 0x28, 0x19, - 0xc6, 0x25, 0x04, 0x53, 0xc4, 0x47, 0x61, 0x92, 0xfe, 0x3c, 0x41, 0x33, 0x76, 0x96, 0x62, 0x23, - 0xf2, 0xed, 0x6a, 0x9c, 0xe2, 0x6d, 0xa4, 0x68, 0xe2, 0xc6, 0x67, 0xb8, 0x40, 0x71, 0x47, 0x02, - 0x28, 0x45, 0x3b, 0x0a, 0x19, 0xcd, 0x71, 0x18, 0xc2, 0x10, 0xfb, 0xdd, 0x03, 0xcd, 0x71, 0xe8, - 0xa7, 0x93, 0x30, 0x4e, 0x75, 0x74, 0xb1, 0xd7, 0x30, 0x7d, 0xce, 0x64, 0x98, 0xe2, 0x8c, 0x91, - 0x0f, 0x0a, 0x83, 0x53, 0xdc, 0x7b, 0x61, 0x04, 0x5f, 0x37, 0xaa, 0xd8, 0xd2, 0x31, 0xc3, 0x1b, - 0xa1, 0x78, 0xc3, 0x02, 0x48, 0x91, 0x1e, 0x84, 0x9c, 0xe3, 0xda, 0x8e, 0xed, 0x61, 0x57, 0xd5, - 0xaa, 0x55, 0x17, 0x7b, 0x5e, 0x7e, 0x94, 0xf1, 0x13, 0xf0, 0x39, 0x06, 0x96, 0x1f, 0x86, 0xd4, - 0x82, 0xe6, 0x6b, 0x24, 0x87, 0xf9, 0xbb, 0x6c, 0x08, 0x18, 0x56, 0xc8, 0x63, 0xdb, 0x70, 0xfb, - 0x6e, 0x02, 0x52, 0x57, 0x6d, 0x1f, 0xa3, 0xc7, 0x23, 0xe3, 0xce, 0x68, 0x3b, 0x1f, 0xdf, 0x30, - 0x6a, 0x16, 0xae, 0xae, 0x78, 0xb5, 0xc8, 0x7d, 0xd0, 0xd0, 0xc5, 0x12, 0x31, 0x17, 0x9b, 0x84, - 0xb4, 0x6b, 0x37, 0xac, 0xaa, 0x38, 0xb1, 0x44, 0x5f, 0x50, 0x05, 0x32, 0x81, 0xe7, 0xa4, 0xba, - 0x79, 0xce, 0x18, 0xf1, 0x1c, 0xe2, 0xd7, 0x1c, 0xa0, 0x0c, 0x6e, 0x71, 0x07, 0x2a, 0x43, 0x36, - 0x48, 0x68, 0xdc, 0x03, 0x7b, 0x73, 0xe2, 0x90, 0x0c, 0x3d, 0x04, 0xe3, 0x81, 0x3f, 0x04, 0x06, - 0x65, 0x5e, 0x98, 0x0b, 0x3e, 0x70, 0x8b, 0xc6, 0x5c, 0x8d, 0xdf, 0x4d, 0x1d, 0xa4, 0x7a, 0x85, - 0xae, 0xc6, 0xee, 0xa7, 0x1e, 0x87, 0xac, 0x67, 0xd4, 0x2c, 0xcd, 0x6f, 0xb8, 0x98, 0x7b, 0x63, - 0x08, 0x90, 0x7f, 0x2a, 0x01, 0x03, 0xcc, 0xbb, 0x23, 0x76, 0x93, 0xda, 0xdb, 0x2d, 0xd1, 0xc9, - 0x6e, 0xc9, 0x83, 0xdb, 0x6d, 0x0e, 0x20, 0x10, 0xc6, 0xe3, 0x77, 0x0b, 0x8f, 0xb5, 0x32, 0x62, - 0x22, 0x6e, 0x18, 0x35, 0x1e, 0xbc, 0x11, 0xa2, 0xc0, 0x83, 0xd2, 0x91, 0x3c, 0x79, 0x1e, 0xb2, - 0x5b, 0x86, 0xaf, 0x6a, 0xa4, 0x3a, 0xa5, 0x26, 0x1c, 0x3a, 0x35, 0x55, 0x6c, 0x57, 0xc6, 0x16, - 0x45, 0x0d, 0xab, 0x64, 0xb6, 0xf8, 0x93, 0xfc, 0x1f, 0x25, 0x32, 0x18, 0xf3, 0x06, 0xd1, 0x1c, - 0x8c, 0x08, 0x45, 0xd5, 0x6d, 0x53, 0xab, 0x71, 0x67, 0xbc, 0xbb, 0xa3, 0xb6, 0x17, 0x4c, 0xad, - 0xa6, 0x0c, 0x71, 0x05, 0xc9, 0x4b, 0xfb, 0x8e, 0x4d, 0x74, 0xe8, 0xd8, 0x98, 0x27, 0x25, 0x0f, - 0xe6, 0x49, 0xb1, 0x3e, 0x4f, 0x35, 0xf7, 0xf9, 0x97, 0x13, 0xb4, 0x28, 0x73, 0x6c, 0x4f, 0x33, - 0xdf, 0x88, 0x10, 0x3b, 0x06, 0x59, 0xc7, 0x36, 0x55, 0xf6, 0x85, 0x1d, 0x0d, 0xcc, 0x38, 0xb6, - 0xa9, 0xb4, 0xf8, 0x51, 0xfa, 0x0e, 0xc5, 0xdf, 0xc0, 0x1d, 0xb0, 0xda, 0x60, 0xb3, 0xd5, 0x5c, - 0x18, 0x66, 0xa6, 0xe0, 0x03, 0xe6, 0xa3, 0xc4, 0x06, 0x74, 0x04, 0x96, 0x5a, 0x07, 0x78, 0x26, - 0x36, 0xc3, 0x54, 0x38, 0x1e, 0xa1, 0x60, 0xe3, 0x4b, 0xbb, 0x6a, 0x3e, 0xea, 0xe7, 0x0a, 0xc7, - 0x93, 0xff, 0xa9, 0x04, 0x59, 0xaa, 0xea, 0x0a, 0xf6, 0xb5, 0x98, 0xa9, 0xa4, 0x83, 0x9b, 0xea, - 0x6e, 0x00, 0xc6, 0xc6, 0x33, 0x6e, 0x62, 0xde, 0x81, 0x59, 0x0a, 0xd9, 0x30, 0x6e, 0x62, 0x74, - 0x26, 0xd0, 0x2b, 0xb9, 0xbf, 0x5e, 0x3c, 0x14, 0x85, 0x76, 0x77, 0xc1, 0x20, 0xfd, 0x69, 0x8c, - 0x5d, 0x76, 0x36, 0x36, 0x49, 0x2f, 0xce, 0x6e, 0xee, 0x7a, 0xf2, 0x73, 0x30, 0xb8, 0xb9, 0xcb, - 0xa6, 0x52, 0xc7, 0x20, 0xeb, 0xda, 0x36, 0x1f, 0x5f, 0x59, 0x5d, 0x93, 0x21, 0x00, 0x3a, 0x9c, - 0x88, 0xe9, 0x43, 0x22, 0x9c, 0x3e, 0x84, 0xf3, 0x9f, 0x64, 0x4f, 0xf3, 0x9f, 0x93, 0xff, 0x4e, - 0x82, 0xa1, 0x48, 0x18, 0xa2, 0xc7, 0xe0, 0x70, 0x79, 0x79, 0x6d, 0xfe, 0xb2, 0xba, 0xb4, 0xa0, - 0x5e, 0x58, 0x9e, 0x5b, 0x0c, 0xcf, 0x98, 0x17, 0x8e, 0xbc, 0xf8, 0xd2, 0x0c, 0x8a, 0xe0, 0x5e, - 0xb1, 0xae, 0x91, 0xf9, 0x31, 0x9a, 0x85, 0xc9, 0x38, 0xc9, 0x5c, 0x79, 0xa3, 0xb2, 0xba, 0x99, - 0x93, 0x0a, 0x87, 0x5f, 0x7c, 0x69, 0x66, 0x3c, 0x42, 0x31, 0xb7, 0xe5, 0x61, 0xcb, 0x6f, 0x25, - 0x98, 0x5f, 0x5b, 0x59, 0x59, 0xda, 0xcc, 0x25, 0x5a, 0x08, 0x78, 0xa2, 0x7d, 0x10, 0xc6, 0xe3, - 0x04, 0xab, 0x4b, 0xcb, 0xb9, 0x64, 0x01, 0xbd, 0xf8, 0xd2, 0xcc, 0x68, 0x04, 0x7b, 0xd5, 0x30, - 0x0b, 0x99, 0x9f, 0xf8, 0xc2, 0xd4, 0xa1, 0x9f, 0xff, 0x6b, 0x53, 0x12, 0xd1, 0x6c, 0x24, 0x16, - 0x8a, 0xe8, 0x61, 0xb8, 0x6b, 0x63, 0x69, 0x71, 0xb5, 0xb2, 0xa0, 0xae, 0x6c, 0x2c, 0xaa, 0xec, - 0x72, 0x7d, 0xa0, 0xdd, 0xd8, 0x8b, 0x2f, 0xcd, 0x0c, 0x71, 0x95, 0x3a, 0x61, 0xaf, 0x2b, 0x95, - 0xab, 0x6b, 0x9b, 0x95, 0x9c, 0xc4, 0xb0, 0xd7, 0x5d, 0x7c, 0xdd, 0xf6, 0xd9, 0x6f, 0xe7, 0x3c, - 0x0a, 0x47, 0xdb, 0x60, 0x07, 0x8a, 0x8d, 0xbf, 0xf8, 0xd2, 0xcc, 0xc8, 0xba, 0x8b, 0x99, 0x9b, - 0x52, 0x8a, 0x22, 0xe4, 0x5b, 0x29, 0xd6, 0xd6, 0xd7, 0x36, 0xe6, 0x96, 0x73, 0x33, 0x85, 0xdc, - 0x8b, 0x2f, 0xcd, 0x0c, 0x8b, 0x9c, 0x43, 0xf0, 0x43, 0xcd, 0xca, 0x4f, 0x77, 0x9c, 0xbf, 0x9c, - 0xed, 0x7f, 0xfe, 0xe2, 0xc7, 0x96, 0x37, 0xfe, 0x62, 0x02, 0xa6, 0x5a, 0x16, 0xbd, 0xf8, 0xfa, - 0x77, 0xa7, 0x05, 0x9f, 0x12, 0x64, 0x16, 0xc4, 0xb2, 0x7a, 0xbf, 0xeb, 0x3d, 0x3f, 0xdb, 0xe7, - 0x7a, 0xcf, 0x88, 0x68, 0x49, 0x2c, 0xf7, 0x9c, 0xec, 0xbe, 0xdc, 0x23, 0xe4, 0x3f, 0xc0, 0x6a, - 0xcf, 0x87, 0x92, 0x30, 0x15, 0xfd, 0x79, 0x2f, 0xf1, 0xc3, 0x5e, 0xba, 0x6d, 0x08, 0x73, 0x4c, - 0x44, 0x7f, 0xd2, 0x8b, 0x7f, 0xef, 0x30, 0xe3, 0x5d, 0x84, 0xd4, 0xbc, 0x6d, 0x58, 0xc4, 0x14, - 0x55, 0x6c, 0xd9, 0x75, 0xbe, 0x3a, 0xc0, 0x5e, 0xd0, 0xbd, 0x30, 0xa0, 0xd5, 0xed, 0x86, 0xe5, - 0x8b, 0xe9, 0x00, 0x49, 0x16, 0xbf, 0x7f, 0x6b, 0x3a, 0xb9, 0x64, 0xf9, 0x0a, 0xff, 0xc4, 0x26, - 0xb0, 0xf2, 0x25, 0x18, 0x5c, 0xc0, 0xfa, 0x41, 0x78, 0x2d, 0x60, 0xbd, 0x89, 0xd7, 0x83, 0x90, - 0x59, 0xb2, 0x7c, 0x76, 0x61, 0xfd, 0x6e, 0x48, 0x1a, 0x16, 0xab, 0x66, 0x9a, 0xda, 0x27, 0x70, - 0x82, 0xba, 0x80, 0xf5, 0x00, 0xb5, 0x8a, 0xf5, 0x66, 0x54, 0xc2, 0x9e, 0xc0, 0xcb, 0x0b, 0xbf, - 0xf7, 0x9f, 0xa6, 0x0e, 0xbd, 0xf0, 0xf2, 0xd4, 0xa1, 0x8e, 0xae, 0x2a, 0x77, 0xff, 0x91, 0xb0, - 0xa0, 0x1b, 0x3e, 0xfc, 0x18, 0xdc, 0xc7, 0x71, 0x3c, 0x5f, 0xbb, 0x66, 0x58, 0xb5, 0xa0, 0x27, - 0xf8, 0x3b, 0xef, 0x8c, 0x23, 0xbc, 0x33, 0x04, 0x74, 0xdf, 0xfe, 0x28, 0xec, 0x3b, 0x4f, 0xef, - 0x3e, 0xff, 0xee, 0x12, 0x28, 0x85, 0x2e, 0x9e, 0x23, 0x7f, 0x54, 0x82, 0xd1, 0x8b, 0x86, 0xe7, - 0xdb, 0xae, 0xa1, 0x6b, 0x26, 0xbd, 0xb9, 0x70, 0xa6, 0xd7, 0x21, 0xb2, 0x69, 0x28, 0x79, 0x0a, - 0x06, 0xae, 0x6b, 0x26, 0xfb, 0x6d, 0xb8, 0x24, 0xfd, 0xa5, 0x85, 0xf6, 0x86, 0x28, 0x06, 0x73, - 0x24, 0xc1, 0x80, 0x91, 0xc9, 0xbf, 0x98, 0x80, 0x31, 0x9a, 0x6c, 0x3d, 0xf6, 0xd3, 0x3a, 0x64, - 0x3e, 0x5e, 0x86, 0x94, 0xab, 0xf9, 0x7c, 0x0d, 0xab, 0x5c, 0xe4, 0x7d, 0x7c, 0x7f, 0xf7, 0x7e, - 0x2b, 0x12, 0x37, 0xa0, 0xb4, 0xe8, 0x47, 0x20, 0x53, 0xd7, 0x76, 0x55, 0xca, 0x87, 0xb9, 0xe2, - 0x5c, 0x7f, 0x7c, 0x6e, 0xdf, 0x9a, 0x1e, 0xdb, 0xd3, 0xea, 0x66, 0x49, 0x16, 0x7c, 0x64, 0x65, - 0xb0, 0xae, 0xed, 0x12, 0x11, 0x91, 0x03, 0x63, 0x04, 0xaa, 0xef, 0x68, 0x56, 0x0d, 0xb3, 0x46, - 0xe8, 0x8a, 0x5c, 0xf9, 0x62, 0xdf, 0x8d, 0x1c, 0x09, 0x1b, 0x89, 0xb0, 0x93, 0x95, 0x91, 0xba, - 0xb6, 0x3b, 0x4f, 0x01, 0xa4, 0xc5, 0x52, 0xe6, 0x13, 0x9f, 0x9d, 0x3e, 0x44, 0xe3, 0xe6, 0x1b, - 0x12, 0x40, 0x68, 0x31, 0xf4, 0x23, 0x90, 0xd3, 0x83, 0x37, 0x4a, 0xeb, 0xf1, 0x3e, 0x7c, 0xa0, - 0x53, 0x5f, 0x34, 0xd9, 0x9b, 0x95, 0x58, 0x5f, 0xbf, 0x35, 0x2d, 0x29, 0x63, 0x7a, 0x53, 0x57, - 0xbc, 0x17, 0x86, 0x1a, 0x4e, 0x55, 0xf3, 0xb1, 0x4a, 0xe7, 0xfc, 0x89, 0xae, 0xe5, 0xda, 0x14, - 0xe1, 0x75, 0xfb, 0xd6, 0x34, 0x62, 0x6a, 0x45, 0x88, 0x65, 0x5a, 0xc4, 0x01, 0x83, 0x10, 0x82, - 0x88, 0x4e, 0xbf, 0x23, 0xc1, 0xd0, 0x42, 0xe4, 0x04, 0x51, 0x1e, 0x06, 0xeb, 0xb6, 0x65, 0x5c, - 0xc3, 0x62, 0x73, 0x4d, 0xbc, 0xa2, 0x02, 0x64, 0xd8, 0x65, 0x2e, 0x7f, 0x4f, 0xac, 0xcc, 0x89, - 0x77, 0x42, 0x75, 0x03, 0x6f, 0x79, 0x86, 0xe8, 0x0d, 0x45, 0xbc, 0xa2, 0x0b, 0x90, 0xf3, 0xb0, - 0xde, 0x70, 0x0d, 0x7f, 0x4f, 0xd5, 0x6d, 0xcb, 0xd7, 0x74, 0xbe, 0xeb, 0x56, 0x3e, 0x76, 0xfb, - 0xd6, 0xf4, 0x5d, 0x4c, 0xd6, 0x66, 0x0c, 0x59, 0x19, 0x13, 0xa0, 0x79, 0x06, 0x21, 0x2d, 0x54, - 0xb1, 0xaf, 0x19, 0xa6, 0xc7, 0x36, 0xe7, 0x14, 0xf1, 0x1a, 0xd1, 0xe5, 0x1f, 0x0f, 0x42, 0x36, - 0xf0, 0x76, 0x74, 0x03, 0x72, 0xb6, 0x83, 0xdd, 0xd8, 0x7c, 0x82, 0x96, 0x53, 0xe5, 0xe5, 0xb0, - 0xe5, 0x66, 0x0c, 0xf9, 0xff, 0xdf, 0x9a, 0x7e, 0xa4, 0x07, 0x0f, 0xba, 0xaa, 0x99, 0x7c, 0x2e, - 0xa2, 0x8c, 0x09, 0x1e, 0x62, 0x72, 0x72, 0x81, 0xf8, 0x85, 0x58, 0x85, 0x70, 0x1a, 0x5b, 0x62, - 0x05, 0x38, 0xa6, 0x72, 0x33, 0x86, 0x4c, 0x3c, 0x80, 0x83, 0xd6, 0x29, 0x84, 0x4c, 0x20, 0x9e, - 0xd3, 0x0c, 0x53, 0xdc, 0x70, 0x55, 0xf8, 0x1b, 0x5a, 0x82, 0x01, 0xcf, 0xd7, 0xfc, 0x06, 0xab, - 0x21, 0xd3, 0xe5, 0xc7, 0x7a, 0x94, 0xb9, 0x6c, 0x5b, 0xd5, 0x0d, 0x4a, 0xa8, 0x70, 0x06, 0xe8, - 0x02, 0x0c, 0xf8, 0xf6, 0x35, 0x6c, 0x71, 0xa3, 0xf6, 0x15, 0xf1, 0x74, 0x8c, 0x62, 0xd4, 0xc8, - 0x87, 0x5c, 0x15, 0x9b, 0xb8, 0x46, 0x4d, 0xe9, 0xed, 0x68, 0x64, 0x9e, 0x4a, 0xb7, 0x4a, 0xcb, - 0x4b, 0x7d, 0x87, 0x25, 0x37, 0x50, 0x33, 0x3f, 0x59, 0x19, 0x0b, 0x40, 0x1b, 0x14, 0x82, 0x2e, - 0xc7, 0x0e, 0xbf, 0xf1, 0x9f, 0x62, 0xbb, 0xb7, 0x53, 0xec, 0x45, 0xbc, 0x5c, 0xac, 0x6e, 0x45, - 0x8f, 0xce, 0x5d, 0x80, 0x5c, 0xc3, 0xda, 0xb2, 0xe9, 0x26, 0xaa, 0xca, 0x27, 0x6e, 0x19, 0x52, - 0xcf, 0x44, 0x7b, 0xad, 0x19, 0x43, 0x56, 0xc6, 0x02, 0xd0, 0x45, 0x36, 0xbd, 0xab, 0xc2, 0x68, - 0x88, 0x45, 0x43, 0x37, 0xdb, 0x35, 0x74, 0xef, 0xe1, 0xa1, 0x7b, 0xb8, 0xb9, 0x95, 0x30, 0x7a, - 0x47, 0x02, 0x20, 0x21, 0x43, 0x17, 0x01, 0xc2, 0x84, 0x41, 0x57, 0xb9, 0x86, 0x4e, 0xc9, 0xdd, - 0xb3, 0x8e, 0x58, 0x19, 0x08, 0x69, 0xd1, 0xfb, 0x61, 0xa2, 0x6e, 0x58, 0xaa, 0x87, 0xcd, 0x6d, - 0x95, 0x1b, 0x98, 0xb0, 0xa4, 0xbf, 0x2a, 0x52, 0x5e, 0xee, 0xcf, 0x1f, 0x6e, 0xdf, 0x9a, 0x2e, - 0xf0, 0xa4, 0xda, 0xca, 0x52, 0x56, 0xc6, 0xeb, 0x86, 0xb5, 0x81, 0xcd, 0xed, 0x85, 0x00, 0x56, - 0x1a, 0xfe, 0x89, 0xcf, 0x4e, 0x1f, 0x0a, 0x02, 0xd8, 0x80, 0xe1, 0x30, 0xb0, 0xb0, 0x87, 0xd6, - 0x20, 0xab, 0x89, 0x17, 0xb6, 0x1e, 0xd6, 0xb3, 0xb3, 0x47, 0x02, 0x34, 0xe4, 0xc1, 0x72, 0xc5, - 0x0b, 0xff, 0x61, 0x46, 0x92, 0x5f, 0x4c, 0xc0, 0xc0, 0xc2, 0xd5, 0x75, 0xcd, 0x70, 0xd1, 0x4d, - 0x18, 0x0f, 0x9d, 0x2d, 0x9e, 0x29, 0x56, 0x6e, 0xdf, 0x9a, 0xce, 0x37, 0xfb, 0x63, 0x9f, 0xa9, - 0x62, 0x4e, 0xd7, 0x85, 0x24, 0x61, 0x90, 0x88, 0x5c, 0x71, 0xb3, 0xe3, 0xaa, 0x47, 0xb4, 0xed, - 0x16, 0x94, 0x03, 0xa4, 0xa9, 0x96, 0x45, 0x94, 0x48, 0xe2, 0xac, 0xc0, 0x20, 0xb3, 0x85, 0x87, - 0x4a, 0x90, 0x76, 0xc8, 0x03, 0xdf, 0x81, 0x9a, 0xea, 0x18, 0x4d, 0x14, 0x3f, 0x58, 0x97, 0x27, - 0x24, 0xf2, 0xe7, 0x93, 0x00, 0x0b, 0x57, 0xaf, 0x6e, 0xba, 0x86, 0x63, 0x62, 0xff, 0x07, 0x6a, - 0xd7, 0x0f, 0x4b, 0x70, 0x38, 0xb4, 0x9a, 0xe7, 0xea, 0x4d, 0xc6, 0x7d, 0xfa, 0xf6, 0xad, 0xe9, - 0xe3, 0xcd, 0xc6, 0x8d, 0xa0, 0x1d, 0xc0, 0xc0, 0x13, 0x01, 0xa3, 0x0d, 0x57, 0x6f, 0x2f, 0x47, - 0xd5, 0xf3, 0x03, 0x39, 0x92, 0x9d, 0xe5, 0x88, 0xa0, 0xbd, 0x26, 0x39, 0x16, 0x3c, 0xbf, 0xb5, - 0xaf, 0x37, 0x60, 0x28, 0xec, 0x23, 0x0f, 0x2d, 0x40, 0xc6, 0xe7, 0xcf, 0xbc, 0xcb, 0xe5, 0xce, - 0x5d, 0x2e, 0xc8, 0x78, 0xb7, 0x07, 0x94, 0xf2, 0xbf, 0x4d, 0x00, 0x84, 0x51, 0xfd, 0x67, 0x35, - 0xa2, 0xc8, 0x70, 0xca, 0x07, 0xbf, 0xe4, 0x81, 0x0a, 0x68, 0x4e, 0x1d, 0xe9, 0xad, 0x3f, 0x4c, - 0xc0, 0xc4, 0x15, 0x91, 0xf9, 0xdf, 0xb2, 0x30, 0x5a, 0x87, 0x41, 0x6c, 0xf9, 0xae, 0x41, 0x4d, - 0x4c, 0xbc, 0xf5, 0xd1, 0x4e, 0xde, 0xda, 0xc6, 0x6a, 0xf4, 0x87, 0x73, 0xc4, 0xa6, 0x1c, 0x67, - 0x13, 0xb1, 0xf5, 0xc7, 0x92, 0x90, 0xef, 0x44, 0x85, 0xe6, 0x61, 0x4c, 0x77, 0x31, 0x05, 0xa8, - 0xd1, 0x1d, 0x80, 0x72, 0x21, 0x9c, 0x49, 0x34, 0x21, 0xc8, 0xca, 0xa8, 0x80, 0xf0, 0xda, 0xa0, - 0x06, 0xa4, 0xcc, 0x27, 0x21, 0x43, 0xb0, 0x7a, 0xac, 0xeb, 0x65, 0x5e, 0x1c, 0x88, 0x46, 0xe2, - 0x0c, 0x58, 0x75, 0x30, 0x1a, 0x42, 0x69, 0x79, 0xf0, 0x3c, 0x8c, 0x19, 0x96, 0xe1, 0x1b, 0x9a, - 0xa9, 0x6e, 0x69, 0xa6, 0x66, 0xe9, 0x07, 0x99, 0x25, 0xb1, 0x01, 0x9d, 0x37, 0xdb, 0xc4, 0x4e, - 0x56, 0x46, 0x39, 0xa4, 0xcc, 0x00, 0xe8, 0x22, 0x0c, 0x8a, 0xa6, 0x52, 0x07, 0xaa, 0x25, 0x05, - 0x79, 0xa4, 0x47, 0x7e, 0x32, 0x09, 0xe3, 0x0a, 0xae, 0xbe, 0xd5, 0x15, 0xfd, 0x75, 0xc5, 0x0a, - 0x00, 0x4b, 0x24, 0x64, 0x24, 0x39, 0x40, 0x6f, 0x90, 0x54, 0x94, 0x65, 0x1c, 0x16, 0x3c, 0x3f, - 0xd2, 0x1f, 0x7f, 0x94, 0x84, 0xe1, 0x68, 0x7f, 0xbc, 0x35, 0xc4, 0xff, 0xf0, 0x0c, 0xf1, 0x68, - 0x29, 0x4c, 0x8d, 0x29, 0xfe, 0x03, 0xa8, 0x1d, 0x52, 0x63, 0x4b, 0x48, 0x75, 0xce, 0x89, 0xff, - 0x3b, 0x01, 0x03, 0xeb, 0x9a, 0xab, 0xd5, 0x3d, 0xa4, 0xb7, 0x4c, 0x6c, 0xc4, 0xfe, 0x4a, 0xcb, - 0x2f, 0x57, 0xf3, 0x45, 0xb1, 0x2e, 0xf3, 0x9a, 0x4f, 0xb4, 0x99, 0xd7, 0xbc, 0x0b, 0x46, 0xeb, - 0xda, 0x6e, 0x64, 0xcb, 0x9f, 0x76, 0xe6, 0x48, 0xf9, 0x68, 0xc8, 0x25, 0xfe, 0x9d, 0x2d, 0xd7, - 0x84, 0xe7, 0x00, 0xd0, 0x59, 0x18, 0x22, 0x18, 0xe1, 0x28, 0x41, 0xc8, 0x8f, 0x84, 0xeb, 0x22, - 0x91, 0x8f, 0xb2, 0x02, 0x75, 0x6d, 0xb7, 0xc2, 0x5e, 0xd0, 0x32, 0xa0, 0x9d, 0x60, 0x69, 0x4e, - 0x0d, 0x4d, 0x49, 0xe8, 0xef, 0xbe, 0x7d, 0x6b, 0xfa, 0x28, 0xa3, 0x6f, 0xc5, 0x91, 0x95, 0xf1, - 0x10, 0x28, 0xb8, 0x9d, 0x06, 0x20, 0x7a, 0xa9, 0x6c, 0xa5, 0x96, 0xcd, 0xae, 0x0f, 0xdf, 0xbe, - 0x35, 0x3d, 0xce, 0xb8, 0x84, 0xdf, 0x64, 0x25, 0x4b, 0x5e, 0x16, 0xc8, 0x73, 0xc4, 0xf0, 0x5f, - 0x90, 0x00, 0x85, 0x63, 0x50, 0xf0, 0x2f, 0x1b, 0x2e, 0x02, 0x44, 0x26, 0x69, 0xd2, 0xfe, 0xf3, - 0xbe, 0x90, 0x5e, 0xcc, 0xfb, 0x22, 0xa1, 0xfb, 0x64, 0x98, 0xaf, 0x13, 0xbc, 0x1f, 0xdb, 0x2c, - 0x6b, 0x17, 0xe7, 0x6d, 0x43, 0x50, 0xb7, 0x49, 0xd0, 0xff, 0x42, 0x82, 0xa3, 0x2d, 0xde, 0x14, - 0x08, 0xfb, 0xe7, 0x00, 0xb9, 0x91, 0x8f, 0xfc, 0x87, 0xec, 0x98, 0xd0, 0x7d, 0x3b, 0xe7, 0xb8, - 0xdb, 0x32, 0x10, 0xdc, 0xb9, 0x21, 0x87, 0xad, 0x8b, 0xff, 0x13, 0x09, 0x26, 0xa3, 0xcd, 0x07, - 0x8a, 0xac, 0xc2, 0x70, 0xb4, 0x75, 0xae, 0xc2, 0x7d, 0xbd, 0xa8, 0xc0, 0xa5, 0x8f, 0xd1, 0xa3, - 0xa7, 0xc3, 0x50, 0x65, 0x8b, 0xb7, 0x8f, 0xf5, 0x6c, 0x0d, 0x21, 0x53, 0x73, 0xc8, 0x32, 0x0d, - 0xfe, 0x44, 0x82, 0xd4, 0xba, 0x6d, 0x9b, 0xc8, 0x86, 0x71, 0xcb, 0xf6, 0x55, 0xe2, 0x59, 0xb8, - 0xaa, 0xf2, 0x35, 0x1e, 0xb6, 0xaa, 0x3b, 0xdf, 0x9f, 0x91, 0xbe, 0x77, 0x6b, 0xba, 0x95, 0x95, - 0x32, 0x66, 0xd9, 0x7e, 0x99, 0x42, 0x36, 0xd9, 0x0a, 0xd0, 0xfb, 0x61, 0x24, 0xde, 0x18, 0x5b, - 0xf1, 0x7a, 0xa6, 0xef, 0xc6, 0xe2, 0x6c, 0x6e, 0xdf, 0x9a, 0x9e, 0x0c, 0x23, 0x26, 0x00, 0xcb, - 0xca, 0xf0, 0x56, 0xa4, 0xf5, 0x52, 0x86, 0x68, 0xff, 0xc7, 0x9f, 0x9d, 0x96, 0xca, 0x17, 0x3a, - 0xee, 0x3e, 0x3c, 0xbc, 0xaf, 0x08, 0xbb, 0xc1, 0x36, 0x43, 0x7c, 0x1f, 0xe2, 0x33, 0xe7, 0x41, - 0xee, 0xb0, 0x0f, 0xc1, 0xfe, 0x99, 0xcb, 0xfe, 0xbb, 0x10, 0x7d, 0xfc, 0xa7, 0x98, 0x4e, 0x3b, - 0x16, 0xfb, 0x9d, 0x68, 0x2f, 0xf4, 0xb4, 0x47, 0x22, 0xef, 0xc2, 0x91, 0xa7, 0x49, 0xdb, 0x61, - 0x9a, 0x14, 0xff, 0x73, 0xe6, 0x48, 0xb0, 0x96, 0x28, 0xf1, 0xff, 0x58, 0x21, 0x16, 0x06, 0x21, - 0x94, 0x8f, 0x27, 0x88, 0xfb, 0x8b, 0x1d, 0xff, 0x95, 0x4d, 0x31, 0xf2, 0x7f, 0x6c, 0x94, 0x08, - 0xa5, 0xfc, 0x0b, 0x12, 0xdc, 0xd5, 0xd2, 0x34, 0x8f, 0xaa, 0x45, 0x80, 0x48, 0x9e, 0x97, 0xfa, - 0xdb, 0xc5, 0x88, 0x90, 0x12, 0x46, 0x2d, 0xc2, 0x3e, 0xd0, 0x55, 0x58, 0x26, 0x45, 0x4c, 0xda, - 0xe7, 0xe1, 0x70, 0x5c, 0x58, 0x61, 0xa6, 0x67, 0x61, 0x34, 0x3e, 0x9f, 0xe1, 0x45, 0xce, 0x01, - 0x56, 0xa3, 0x46, 0x62, 0x73, 0x1a, 0x59, 0x6d, 0xee, 0x9a, 0xc0, 0x3c, 0x15, 0xc8, 0x06, 0xa8, - 0x3c, 0xe3, 0xf4, 0x6c, 0x9d, 0x90, 0x52, 0xfe, 0xaa, 0x04, 0x33, 0xf1, 0x16, 0xc2, 0x61, 0xc1, - 0x7b, 0xdd, 0xf5, 0xbb, 0x63, 0x8e, 0xf4, 0x5d, 0x09, 0xee, 0xd9, 0x47, 0x0d, 0x6e, 0xb3, 0x9b, - 0x30, 0x19, 0x19, 0x6f, 0xc4, 0x8d, 0x17, 0xe1, 0x5c, 0x27, 0xbb, 0x0f, 0x94, 0x41, 0x7a, 0x3d, - 0x46, 0xec, 0xf8, 0xa5, 0x6f, 0x4d, 0x4f, 0xb4, 0x7e, 0xf3, 0x94, 0x89, 0xd6, 0x31, 0xe2, 0x0e, - 0x7a, 0xe1, 0xef, 0x4a, 0xf0, 0x60, 0x5c, 0xd5, 0x36, 0xb3, 0xd2, 0x37, 0x51, 0xd7, 0xfd, 0x7b, - 0x09, 0x4e, 0xf6, 0xa2, 0x0f, 0xef, 0xc3, 0x2d, 0x98, 0x08, 0x0b, 0xc5, 0xe6, 0x2e, 0x7c, 0xa8, - 0x8f, 0xe9, 0x3e, 0x8f, 0x05, 0x14, 0x70, 0x7b, 0x1d, 0xfa, 0xea, 0x5f, 0x4a, 0x3c, 0x7e, 0xa3, - 0x6e, 0x12, 0x74, 0x4c, 0x7c, 0xe2, 0xd3, 0x67, 0xc7, 0x44, 0x26, 0x3f, 0x23, 0xb1, 0xc9, 0x4f, - 0x9b, 0x2e, 0x4f, 0xdc, 0xa1, 0x6c, 0x74, 0x9d, 0x67, 0xeb, 0x36, 0x95, 0xe7, 0x7b, 0x61, 0xa2, - 0x4d, 0x68, 0xf1, 0xc4, 0xd4, 0x47, 0x64, 0x29, 0xa8, 0x35, 0x78, 0xe4, 0x7f, 0x23, 0xc1, 0x34, - 0x6d, 0xb8, 0x4d, 0x37, 0xbe, 0x99, 0xed, 0x59, 0xe7, 0xb9, 0xb7, 0xad, 0x5a, 0xdc, 0xb0, 0x4b, - 0x30, 0xc0, 0x3c, 0x94, 0xdb, 0xf2, 0x00, 0x2e, 0xce, 0x19, 0x84, 0xb9, 0x7e, 0x41, 0xe8, 0xd7, - 0x3e, 0x61, 0xbc, 0x4e, 0x76, 0xbc, 0x53, 0x09, 0xe3, 0x1b, 0x22, 0xd7, 0xb7, 0x57, 0x83, 0xdb, - 0x4d, 0xbf, 0x63, 0xb9, 0x9e, 0x19, 0xf1, 0x0d, 0x4a, 0xea, 0x81, 0x4e, 0x5d, 0x92, 0xfa, 0x0f, - 0x79, 0x1f, 0x05, 0x49, 0xbd, 0x8b, 0x3e, 0x6f, 0xc6, 0xa4, 0xfe, 0x27, 0x09, 0x38, 0x4a, 0x75, - 0x8b, 0xce, 0xbe, 0xde, 0x80, 0xbe, 0x51, 0x01, 0x79, 0xae, 0xae, 0xde, 0xa9, 0x5c, 0x94, 0xf3, - 0x5c, 0xfd, 0x6a, 0x6c, 0x44, 0x57, 0x01, 0x55, 0x3d, 0xbf, 0xb9, 0x81, 0xe4, 0x81, 0x1b, 0xa8, - 0x7a, 0xfe, 0xd5, 0x7d, 0x4a, 0x86, 0xd4, 0x81, 0xbd, 0xeb, 0xeb, 0x12, 0x14, 0xda, 0xf5, 0x00, - 0xf7, 0x26, 0x03, 0x8e, 0xc4, 0x16, 0x16, 0x9a, 0x1d, 0xea, 0xe1, 0x5e, 0xa6, 0xd3, 0x4d, 0xe1, - 0x7f, 0xd8, 0xc5, 0xaf, 0x6b, 0x02, 0xf8, 0x67, 0x62, 0x88, 0x0b, 0x02, 0xa6, 0x75, 0x36, 0xf6, - 0xc3, 0x1f, 0xf6, 0xbf, 0xd2, 0x32, 0xc2, 0xbc, 0x29, 0x26, 0x76, 0xdf, 0x94, 0x60, 0xaa, 0x83, - 0xd8, 0x6f, 0xe6, 0xf2, 0x62, 0xa7, 0xa3, 0x4b, 0xdd, 0xe9, 0x59, 0xe4, 0x69, 0x1e, 0x8f, 0xf1, - 0xc3, 0x8b, 0x91, 0x55, 0x84, 0x76, 0xb7, 0x62, 0xe4, 0x77, 0xc3, 0xb1, 0xb6, 0x54, 0x5c, 0xb6, - 0x12, 0xa4, 0x76, 0x0c, 0xcf, 0xe7, 0x62, 0xdd, 0xdf, 0x49, 0xac, 0x26, 0x6a, 0x4a, 0x23, 0x23, - 0xc8, 0x51, 0xd6, 0xeb, 0xb6, 0x6d, 0x72, 0x31, 0xe4, 0xcb, 0x30, 0x1e, 0x81, 0xf1, 0x46, 0xce, - 0x40, 0xca, 0xb1, 0xf9, 0x45, 0xd3, 0xa1, 0x53, 0xc7, 0x3b, 0x35, 0x42, 0x68, 0xb8, 0xda, 0x14, - 0x5f, 0x9e, 0x04, 0xc4, 0x98, 0xd1, 0xd5, 0x6f, 0xd1, 0xc4, 0x06, 0x4c, 0xc4, 0xa0, 0xbc, 0x91, - 0xb7, 0xc3, 0x80, 0x43, 0x21, 0xbc, 0x99, 0x8e, 0xc7, 0x26, 0x18, 0x9d, 0x28, 0xdb, 0x18, 0xcd, - 0xa9, 0xef, 0x1d, 0x86, 0x34, 0xe5, 0x8a, 0x3e, 0x29, 0x01, 0x44, 0xd6, 0xb2, 0x8b, 0x9d, 0xd8, - 0xb4, 0x5f, 0xcd, 0x29, 0xcc, 0xf6, 0x8c, 0xcf, 0xeb, 0xee, 0x93, 0x3f, 0xfe, 0xaf, 0xbf, 0xf3, - 0x33, 0x89, 0xfb, 0x90, 0x3c, 0xdb, 0x61, 0x1d, 0x29, 0x12, 0x8c, 0x5f, 0x94, 0xa2, 0xa7, 0xeb, - 0x1e, 0xe9, 0xad, 0x29, 0x21, 0x59, 0xb1, 0x57, 0x74, 0x2e, 0xd8, 0x79, 0x2a, 0xd8, 0x13, 0xe8, - 0xf1, 0xee, 0x82, 0xcd, 0xbe, 0x2f, 0x1e, 0x5d, 0x1f, 0x40, 0xdf, 0x94, 0x60, 0xb2, 0xdd, 0x32, - 0x01, 0x3a, 0xd7, 0x9b, 0x14, 0xad, 0x05, 0x59, 0xe1, 0xc9, 0x03, 0x50, 0x72, 0x55, 0x16, 0xa9, - 0x2a, 0x73, 0xe8, 0xa9, 0x03, 0xa8, 0x32, 0x1b, 0x19, 0xfd, 0xd0, 0xff, 0x93, 0xe0, 0xee, 0x7d, - 0xa7, 0xd0, 0x68, 0xae, 0x37, 0x29, 0xf7, 0xa9, 0x3c, 0x0b, 0xe5, 0xd7, 0xc2, 0x82, 0x6b, 0xfc, - 0x34, 0xd5, 0xf8, 0x32, 0x5a, 0x3a, 0x88, 0xc6, 0x61, 0x99, 0x18, 0xd5, 0xfd, 0xb7, 0xa5, 0xd8, - 0x01, 0x93, 0xfd, 0xdd, 0xa9, 0x65, 0xee, 0xd8, 0x25, 0x30, 0x5a, 0xa7, 0x04, 0xf2, 0xb3, 0x54, - 0x05, 0x05, 0xad, 0xbf, 0xc6, 0x4e, 0x9b, 0x7d, 0x5f, 0x7c, 0x50, 0xf9, 0x00, 0xfa, 0x3f, 0x52, - 0xfb, 0x13, 0x1d, 0x67, 0xf7, 0x15, 0xb1, 0xf3, 0xbc, 0xb8, 0x70, 0xae, 0x7f, 0x42, 0xae, 0x64, - 0x9d, 0x2a, 0x59, 0x43, 0xf8, 0x4e, 0x2b, 0xd9, 0xb6, 0x13, 0xd1, 0xef, 0x48, 0x30, 0xd9, 0x6e, - 0x46, 0xd7, 0x25, 0x2c, 0xf7, 0x99, 0xcb, 0x76, 0x09, 0xcb, 0xfd, 0xa6, 0x8f, 0xf2, 0xdb, 0xa9, - 0xf2, 0x67, 0xd0, 0xe9, 0x4e, 0xca, 0xef, 0xdb, 0x8b, 0x24, 0x16, 0xf7, 0x9d, 0xf9, 0x74, 0x89, - 0xc5, 0x5e, 0x66, 0x81, 0x5d, 0x62, 0xb1, 0xa7, 0x89, 0x57, 0xf7, 0x58, 0x0c, 0x34, 0xeb, 0xb1, - 0x1b, 0x3d, 0xf4, 0x1b, 0x12, 0x8c, 0xc4, 0xea, 0x72, 0xf4, 0xd8, 0xbe, 0x82, 0xb6, 0x9b, 0x45, - 0x15, 0x4e, 0xf5, 0x43, 0xc2, 0x75, 0x59, 0xa2, 0xba, 0xcc, 0xa3, 0xb9, 0x83, 0xe8, 0xe2, 0xc6, - 0x24, 0xfe, 0xba, 0x04, 0x13, 0x6d, 0x4a, 0xd8, 0x2e, 0x51, 0xd8, 0xb9, 0x74, 0x2f, 0x9c, 0xeb, - 0x9f, 0x90, 0x6b, 0x75, 0x81, 0x6a, 0xf5, 0x2e, 0xf4, 0xce, 0x83, 0x68, 0x15, 0x19, 0x9f, 0x6f, - 0x85, 0x3b, 0xc6, 0x91, 0x76, 0xd0, 0x99, 0x3e, 0x05, 0x13, 0x0a, 0x9d, 0xed, 0x9b, 0x8e, 0xeb, - 0xf3, 0x0c, 0xd5, 0xe7, 0x69, 0xb4, 0xf6, 0xda, 0xf4, 0x69, 0x1d, 0xd6, 0xbf, 0xdc, 0x7a, 0x79, - 0x66, 0x7f, 0x2f, 0x6a, 0x5b, 0xac, 0x16, 0x1e, 0xef, 0x8b, 0x86, 0x2b, 0x75, 0x8e, 0x2a, 0x75, - 0x0a, 0x3d, 0xda, 0x49, 0xa9, 0xc8, 0xb1, 0x00, 0xc3, 0xda, 0xb6, 0x67, 0xdf, 0xc7, 0x4a, 0xe0, - 0x0f, 0xa0, 0x1f, 0x13, 0x5b, 0xb2, 0x27, 0xf6, 0x6d, 0x37, 0x52, 0xc7, 0x16, 0x1e, 0xec, 0x01, - 0x93, 0xcb, 0x75, 0x1f, 0x95, 0x6b, 0x0a, 0x1d, 0xef, 0x24, 0x17, 0xa9, 0x65, 0xd1, 0x47, 0xa5, - 0xe0, 0x14, 0xc7, 0xc9, 0xfd, 0x79, 0x47, 0x8b, 0xdd, 0xc2, 0x43, 0x3d, 0xe1, 0x72, 0x49, 0xee, - 0xa7, 0x92, 0xcc, 0xa0, 0xa9, 0x8e, 0x92, 0xb0, 0xd2, 0xf7, 0x4e, 0x6f, 0xd0, 0x7e, 0x62, 0x02, - 0xa6, 0x3b, 0xb4, 0xe8, 0xef, 0x1e, 0xe8, 0x8e, 0x58, 0x97, 0x4b, 0x5c, 0x3d, 0xee, 0xb9, 0xbe, - 0x9a, 0x02, 0xb4, 0xe2, 0xd5, 0xe6, 0x5d, 0xcc, 0xfe, 0x61, 0x10, 0x0f, 0xc7, 0xa6, 0x3b, 0x0b, - 0xd2, 0x6b, 0xba, 0xb3, 0xb0, 0x12, 0xbb, 0x05, 0x90, 0xe8, 0xef, 0xee, 0x51, 0xcf, 0x57, 0x01, - 0x92, 0x6f, 0xc8, 0x55, 0x80, 0xf6, 0x67, 0xc9, 0x52, 0x3f, 0xc0, 0x23, 0xad, 0xe9, 0x37, 0xe6, - 0x48, 0xeb, 0x11, 0x18, 0xe0, 0x97, 0x84, 0xd8, 0xff, 0x65, 0xe7, 0x6f, 0xe8, 0x09, 0xf1, 0xef, - 0xac, 0x07, 0x7b, 0x3b, 0x9e, 0xc3, 0xb0, 0xf9, 0x41, 0x90, 0xaf, 0x24, 0x21, 0xb7, 0xe2, 0xd5, - 0x2a, 0x55, 0xc3, 0x7f, 0x9d, 0x7c, 0xcf, 0xe9, 0x7c, 0x0a, 0x78, 0xfe, 0xf6, 0xad, 0xe9, 0x51, - 0x66, 0xb2, 0x3b, 0x69, 0xa8, 0x3a, 0x8c, 0x35, 0xdd, 0xb7, 0xe3, 0xae, 0xb9, 0x70, 0x90, 0x6b, - 0x7f, 0x4d, 0xac, 0x64, 0x7a, 0x70, 0x33, 0x12, 0x20, 0x68, 0xb7, 0x7d, 0x34, 0xb0, 0x93, 0x46, - 0x17, 0x5f, 0xcf, 0x4b, 0x31, 0xac, 0x0b, 0xbf, 0x9a, 0x80, 0xa1, 0x15, 0x4f, 0x14, 0x75, 0xf8, - 0xcf, 0xec, 0x91, 0xef, 0xb3, 0xc1, 0xc5, 0xe6, 0x64, 0x6f, 0x81, 0x10, 0xbf, 0xec, 0xfc, 0xad, - 0x24, 0xcd, 0xc3, 0x65, 0x5c, 0x33, 0xac, 0xa0, 0xac, 0xc4, 0x6f, 0x9d, 0x5c, 0xfd, 0x21, 0x3a, - 0xb9, 0x1a, 0xf6, 0x70, 0xea, 0x20, 0x3d, 0xfc, 0x5b, 0x09, 0x18, 0x59, 0xf1, 0x6a, 0x57, 0xac, - 0xea, 0x5b, 0xa1, 0xf2, 0x5a, 0x42, 0xe5, 0x8e, 0x97, 0x66, 0x9f, 0xca, 0x74, 0xbc, 0xc3, 0x5f, - 0xc3, 0x16, 0xf6, 0x0c, 0xef, 0x40, 0xf5, 0x59, 0x6f, 0xf5, 0xd7, 0x37, 0xd3, 0x30, 0xbc, 0xc8, - 0x5a, 0xd9, 0xf0, 0x89, 0x53, 0xbc, 0xa6, 0x35, 0x5a, 0xe4, 0xf1, 0x1f, 0x3f, 0xa3, 0xbf, 0x7f, - 0xa7, 0x3a, 0xf6, 0x0d, 0x2c, 0x96, 0xf1, 0x97, 0xfa, 0x2e, 0x8c, 0xf8, 0x65, 0xd2, 0x66, 0x7e, - 0x32, 0xfb, 0x1d, 0xb5, 0x4d, 0x02, 0x59, 0x27, 0x00, 0xf4, 0x21, 0x09, 0x0e, 0x53, 0xac, 0xd0, - 0x5d, 0x28, 0xa6, 0xb8, 0xfc, 0xd2, 0xb1, 0x98, 0x5f, 0xd6, 0x22, 0x3b, 0x73, 0x94, 0x57, 0xf9, - 0x3e, 0x7e, 0x16, 0xfb, 0x78, 0xa4, 0xf1, 0x66, 0xb6, 0xb2, 0x32, 0x61, 0xb6, 0x50, 0x7a, 0x4d, - 0xfb, 0x39, 0xa9, 0x83, 0xef, 0xe7, 0x5c, 0x22, 0x05, 0x48, 0x30, 0x09, 0xcf, 0xa7, 0xbb, 0xdc, - 0x37, 0x6b, 0xde, 0xf4, 0x8d, 0x12, 0xa3, 0x8f, 0x48, 0x70, 0xb8, 0xed, 0xfa, 0x04, 0xfd, 0x07, - 0x92, 0x7d, 0x6e, 0x2a, 0x37, 0x19, 0xa7, 0x2d, 0x5f, 0x59, 0x99, 0x6c, 0xb4, 0x5b, 0xe8, 0x59, - 0x87, 0x91, 0xd8, 0xda, 0x42, 0x5e, 0xfc, 0x1b, 0xd8, 0xde, 0x4f, 0x07, 0xc7, 0x19, 0xa0, 0x02, - 0x64, 0xf0, 0xae, 0x63, 0xbb, 0x3e, 0xae, 0xd2, 0x2b, 0xc8, 0x19, 0x25, 0x78, 0x97, 0x6f, 0x00, - 0x6a, 0xed, 0x5c, 0x74, 0x19, 0x06, 0xe3, 0x69, 0xee, 0x00, 0x7b, 0x4b, 0x82, 0x03, 0x9a, 0x84, - 0x74, 0xe8, 0xdf, 0x49, 0x85, 0xbd, 0xdc, 0xe9, 0xe4, 0xf0, 0xa7, 0x01, 0x00, 0x00, 0xff, 0xff, - 0x36, 0x66, 0xc7, 0xfd, 0x47, 0x91, 0x00, 0x00, + // 8985 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x74, 0x1c, 0xd7, + 0x75, 0x18, 0x67, 0x3f, 0x80, 0xdd, 0xbb, 0xf8, 0x58, 0x3c, 0x80, 0xd0, 0x72, 0x49, 0x02, 0xd4, + 0x48, 0x96, 0x28, 0x4a, 0x5a, 0x48, 0x14, 0x45, 0x51, 0x4b, 0xdb, 0x32, 0x16, 0x58, 0x82, 0x20, + 0xf1, 0xa5, 0x01, 0x40, 0xc9, 0x76, 0xd2, 0x3d, 0x83, 0xd9, 0x87, 0xc5, 0x88, 0xb3, 0x33, 0xa3, + 0x99, 0x59, 0x12, 0xa0, 0xed, 0x73, 0x94, 0xf8, 0xa3, 0xb1, 0xda, 0xd4, 0xce, 0xc7, 0x69, 0x65, + 0xc7, 0x72, 0x65, 0xbb, 0xad, 0x53, 0xa7, 0x6d, 0x92, 0x3a, 0x4d, 0x9b, 0xa6, 0xa7, 0x75, 0x5a, + 0x27, 0x71, 0xda, 0xa6, 0x47, 0x3a, 0x75, 0xdb, 0x34, 0xa7, 0xa5, 0x53, 0xd9, 0xa7, 0x75, 0x5c, + 0xb7, 0x49, 0x59, 0xf5, 0x53, 0x3f, 0x92, 0xf3, 0xbe, 0xe6, 0x63, 0x3f, 0xb0, 0xbb, 0x10, 0x25, + 0x5b, 0x27, 0xfa, 0x85, 0x7d, 0xf7, 0xdd, 0x7b, 0xdf, 0xbd, 0xf7, 0xdd, 0x7b, 0xdf, 0x7d, 0x6f, + 0xde, 0x0c, 0xe0, 0xe7, 0xce, 0xc3, 0x89, 0x9a, 0x65, 0xd5, 0x0c, 0x3c, 0x63, 0x3b, 0x96, 0x67, + 0x6d, 0x35, 0xb6, 0x67, 0xaa, 0xd8, 0xd5, 0x1c, 0xdd, 0xf6, 0x2c, 0xa7, 0x40, 0x61, 0x68, 0x94, + 0x61, 0x14, 0x04, 0x86, 0xbc, 0x0c, 0x63, 0x17, 0x74, 0x03, 0xcf, 0xfb, 0x88, 0xeb, 0xd8, 0x43, + 0xe7, 0x20, 0xb1, 0xad, 0x1b, 0x38, 0x27, 0x9d, 0x88, 0x9f, 0xcc, 0x9c, 0xbe, 0xbb, 0xd0, 0x44, + 0x54, 0x88, 0x52, 0xac, 0x11, 0xb0, 0x42, 0x29, 0xe4, 0xef, 0x24, 0x60, 0xbc, 0x4d, 0x2f, 0x42, + 0x90, 0x30, 0xd5, 0x3a, 0xe1, 0x28, 0x9d, 0x4c, 0x2b, 0xf4, 0x37, 0xca, 0xc1, 0xa0, 0xad, 0x6a, + 0x57, 0xd5, 0x1a, 0xce, 0xc5, 0x28, 0x58, 0x34, 0xd1, 0x14, 0x40, 0x15, 0xdb, 0xd8, 0xac, 0x62, + 0x53, 0xdb, 0xcb, 0xc5, 0x4f, 0xc4, 0x4f, 0xa6, 0x95, 0x10, 0x04, 0xdd, 0x0f, 0x63, 0x76, 0x63, + 0xcb, 0xd0, 0xb5, 0x4a, 0x08, 0x0d, 0x4e, 0xc4, 0x4f, 0x26, 0x95, 0x2c, 0xeb, 0x98, 0x0f, 0x90, + 0xef, 0x85, 0xd1, 0xeb, 0x58, 0xbd, 0x1a, 0x46, 0xcd, 0x50, 0xd4, 0x11, 0x02, 0x0e, 0x21, 0xce, + 0xc1, 0x50, 0x1d, 0xbb, 0xae, 0x5a, 0xc3, 0x15, 0x6f, 0xcf, 0xc6, 0xb9, 0x04, 0xd5, 0xfe, 0x44, + 0x8b, 0xf6, 0xcd, 0x9a, 0x67, 0x38, 0xd5, 0xc6, 0x9e, 0x8d, 0xd1, 0x2c, 0xa4, 0xb1, 0xd9, 0xa8, + 0x33, 0x0e, 0xc9, 0x0e, 0xf6, 0x2b, 0x9b, 0x8d, 0x7a, 0x33, 0x97, 0x14, 0x21, 0xe3, 0x2c, 0x06, + 0x5d, 0xec, 0x5c, 0xd3, 0x35, 0x9c, 0x1b, 0xa0, 0x0c, 0xee, 0x6d, 0x61, 0xb0, 0xce, 0xfa, 0x9b, + 0x79, 0x08, 0x3a, 0x34, 0x07, 0x69, 0xbc, 0xeb, 0x61, 0xd3, 0xd5, 0x2d, 0x33, 0x37, 0x48, 0x99, + 0xbc, 0xab, 0xcd, 0x2c, 0x62, 0xa3, 0xda, 0xcc, 0x22, 0xa0, 0x43, 0x67, 0x61, 0xd0, 0xb2, 0x3d, + 0xdd, 0x32, 0xdd, 0x5c, 0xea, 0x84, 0x74, 0x32, 0x73, 0xfa, 0x58, 0x5b, 0x47, 0x58, 0x65, 0x38, + 0x8a, 0x40, 0x46, 0x8b, 0x90, 0x75, 0xad, 0x86, 0xa3, 0xe1, 0x8a, 0x66, 0x55, 0x71, 0x45, 0x37, + 0xb7, 0xad, 0x5c, 0x9a, 0x32, 0x98, 0x6e, 0x55, 0x84, 0x22, 0xce, 0x59, 0x55, 0xbc, 0x68, 0x6e, + 0x5b, 0xca, 0x88, 0x1b, 0x69, 0xa3, 0x49, 0x18, 0x70, 0xf7, 0x4c, 0x4f, 0xdd, 0xcd, 0x0d, 0x51, + 0x0f, 0xe1, 0x2d, 0xf9, 0xd7, 0x06, 0x60, 0xb4, 0x17, 0x17, 0x3b, 0x0f, 0xc9, 0x6d, 0xa2, 0x65, + 0x2e, 0xd6, 0x8f, 0x0d, 0x18, 0x4d, 0xd4, 0x88, 0x03, 0x07, 0x34, 0xe2, 0x2c, 0x64, 0x4c, 0xec, + 0x7a, 0xb8, 0xca, 0x3c, 0x22, 0xde, 0xa3, 0x4f, 0x01, 0x23, 0x6a, 0x75, 0xa9, 0xc4, 0x81, 0x5c, + 0xea, 0x69, 0x18, 0xf5, 0x45, 0xaa, 0x38, 0xaa, 0x59, 0x13, 0xbe, 0x39, 0xd3, 0x4d, 0x92, 0x42, + 0x59, 0xd0, 0x29, 0x84, 0x4c, 0x19, 0xc1, 0x91, 0x36, 0x9a, 0x07, 0xb0, 0x4c, 0x6c, 0x6d, 0x57, + 0xaa, 0x58, 0x33, 0x72, 0xa9, 0x0e, 0x56, 0x5a, 0x25, 0x28, 0x2d, 0x56, 0xb2, 0x18, 0x54, 0x33, + 0xd0, 0xe3, 0x81, 0xab, 0x0d, 0x76, 0xf0, 0x94, 0x65, 0x16, 0x64, 0x2d, 0xde, 0xb6, 0x09, 0x23, + 0x0e, 0x26, 0x7e, 0x8f, 0xab, 0x5c, 0xb3, 0x34, 0x15, 0xa2, 0xd0, 0x55, 0x33, 0x85, 0x93, 0x31, + 0xc5, 0x86, 0x9d, 0x70, 0x13, 0xdd, 0x05, 0x3e, 0xa0, 0x42, 0xdd, 0x0a, 0x68, 0x16, 0x1a, 0x12, + 0xc0, 0x15, 0xb5, 0x8e, 0xf3, 0x37, 0x60, 0x24, 0x6a, 0x1e, 0x34, 0x01, 0x49, 0xd7, 0x53, 0x1d, + 0x8f, 0x7a, 0x61, 0x52, 0x61, 0x0d, 0x94, 0x85, 0x38, 0x36, 0xab, 0x34, 0xcb, 0x25, 0x15, 0xf2, + 0x13, 0xbd, 0x2f, 0x50, 0x38, 0x4e, 0x15, 0xbe, 0xa7, 0x75, 0x46, 0x23, 0x9c, 0x9b, 0xf5, 0xce, + 0x3f, 0x06, 0xc3, 0x11, 0x05, 0x7a, 0x1d, 0x5a, 0xfe, 0x30, 0x1c, 0x6e, 0xcb, 0x1a, 0x3d, 0x0d, + 0x13, 0x0d, 0x53, 0x37, 0x3d, 0xec, 0xd8, 0x0e, 0x26, 0x1e, 0xcb, 0x86, 0xca, 0xfd, 0x97, 0xc1, + 0x0e, 0x3e, 0xb7, 0x19, 0xc6, 0x66, 0x5c, 0x94, 0xf1, 0x46, 0x2b, 0xf0, 0x54, 0x3a, 0xf5, 0xdd, + 0xc1, 0xec, 0x73, 0xcf, 0x3d, 0xf7, 0x5c, 0x4c, 0x7e, 0x61, 0x00, 0x26, 0xda, 0xc5, 0x4c, 0xdb, + 0xf0, 0x9d, 0x84, 0x01, 0xb3, 0x51, 0xdf, 0xc2, 0x0e, 0x35, 0x52, 0x52, 0xe1, 0x2d, 0x34, 0x0b, + 0x49, 0x43, 0xdd, 0xc2, 0x46, 0x2e, 0x71, 0x42, 0x3a, 0x39, 0x72, 0xfa, 0xfe, 0x9e, 0xa2, 0xb2, + 0xb0, 0x44, 0x48, 0x14, 0x46, 0x89, 0xde, 0x0b, 0x09, 0x9e, 0xa2, 0x09, 0x87, 0x53, 0xbd, 0x71, + 0x20, 0xb1, 0xa4, 0x50, 0x3a, 0x74, 0x14, 0xd2, 0xe4, 0x2f, 0xf3, 0x8d, 0x01, 0x2a, 0x73, 0x8a, + 0x00, 0x88, 0x5f, 0xa0, 0x3c, 0xa4, 0x68, 0x98, 0x54, 0xb1, 0x58, 0xda, 0xfc, 0x36, 0x71, 0xac, + 0x2a, 0xde, 0x56, 0x1b, 0x86, 0x57, 0xb9, 0xa6, 0x1a, 0x0d, 0x4c, 0x1d, 0x3e, 0xad, 0x0c, 0x71, + 0xe0, 0x15, 0x02, 0x43, 0xd3, 0x90, 0x61, 0x51, 0xa5, 0x9b, 0x55, 0xbc, 0x4b, 0xb3, 0x67, 0x52, + 0x61, 0x81, 0xb6, 0x48, 0x20, 0x64, 0xf8, 0x67, 0x5c, 0xcb, 0x14, 0xae, 0x49, 0x87, 0x20, 0x00, + 0x3a, 0xfc, 0x63, 0xcd, 0x89, 0xfb, 0x78, 0x7b, 0xf5, 0x9a, 0x7d, 0x4a, 0xfe, 0xd5, 0x18, 0x24, + 0x68, 0xbe, 0x18, 0x85, 0xcc, 0xc6, 0xfb, 0xd7, 0xca, 0x95, 0xf9, 0xd5, 0xcd, 0xd2, 0x52, 0x39, + 0x2b, 0xa1, 0x11, 0x00, 0x0a, 0xb8, 0xb0, 0xb4, 0x3a, 0xbb, 0x91, 0x8d, 0xf9, 0xed, 0xc5, 0x95, + 0x8d, 0xb3, 0x67, 0xb2, 0x71, 0x9f, 0x60, 0x93, 0x01, 0x12, 0x61, 0x84, 0x47, 0x4e, 0x67, 0x93, + 0x28, 0x0b, 0x43, 0x8c, 0xc1, 0xe2, 0xd3, 0xe5, 0xf9, 0xb3, 0x67, 0xb2, 0x03, 0x51, 0xc8, 0x23, + 0xa7, 0xb3, 0x83, 0x68, 0x18, 0xd2, 0x14, 0x52, 0x5a, 0x5d, 0x5d, 0xca, 0xa6, 0x7c, 0x9e, 0xeb, + 0x1b, 0xca, 0xe2, 0xca, 0x42, 0x36, 0xed, 0xf3, 0x5c, 0x50, 0x56, 0x37, 0xd7, 0xb2, 0xe0, 0x73, + 0x58, 0x2e, 0xaf, 0xaf, 0xcf, 0x2e, 0x94, 0xb3, 0x19, 0x1f, 0xa3, 0xf4, 0xfe, 0x8d, 0xf2, 0x7a, + 0x76, 0x28, 0x22, 0xd6, 0x23, 0xa7, 0xb3, 0xc3, 0xfe, 0x10, 0xe5, 0x95, 0xcd, 0xe5, 0xec, 0x08, + 0x1a, 0x83, 0x61, 0x36, 0x84, 0x10, 0x62, 0xb4, 0x09, 0x74, 0xf6, 0x4c, 0x36, 0x1b, 0x08, 0xc2, + 0xb8, 0x8c, 0x45, 0x00, 0x67, 0xcf, 0x64, 0x91, 0x3c, 0x07, 0x49, 0xea, 0x5d, 0x08, 0xc1, 0xc8, + 0xd2, 0x6c, 0xa9, 0xbc, 0x54, 0x59, 0x5d, 0xdb, 0x58, 0x5c, 0x5d, 0x99, 0x5d, 0xca, 0x4a, 0x01, + 0x4c, 0x29, 0x3f, 0xb9, 0xb9, 0xa8, 0x94, 0xe7, 0xb3, 0xb1, 0x30, 0x6c, 0xad, 0x3c, 0xbb, 0x51, + 0x9e, 0xcf, 0xc6, 0x65, 0x0d, 0x26, 0xda, 0xe5, 0xc9, 0xb6, 0x91, 0x11, 0x9a, 0xe2, 0x58, 0x87, + 0x29, 0xa6, 0xbc, 0x5a, 0xa6, 0xf8, 0xdb, 0x31, 0x18, 0x6f, 0xb3, 0x56, 0xb4, 0x1d, 0xe4, 0x09, + 0x48, 0x32, 0x17, 0x65, 0xab, 0xe7, 0x7d, 0x6d, 0x17, 0x1d, 0xea, 0xb0, 0x2d, 0x2b, 0x28, 0xa5, + 0x0b, 0x57, 0x10, 0xf1, 0x0e, 0x15, 0x04, 0x61, 0xd1, 0x92, 0xd3, 0x7f, 0xb4, 0x25, 0xa7, 0xb3, + 0x65, 0xef, 0x6c, 0x2f, 0xcb, 0x1e, 0x85, 0xf5, 0x97, 0xdb, 0x93, 0x6d, 0x72, 0xfb, 0x79, 0x18, + 0x6b, 0x61, 0xd4, 0x73, 0x8e, 0xfd, 0xa8, 0x04, 0xb9, 0x4e, 0xc6, 0xe9, 0x92, 0xe9, 0x62, 0x91, + 0x4c, 0x77, 0xbe, 0xd9, 0x82, 0x77, 0x76, 0x9e, 0x84, 0x96, 0xb9, 0xfe, 0xb2, 0x04, 0x93, 0xed, + 0x2b, 0xc5, 0xb6, 0x32, 0xbc, 0x17, 0x06, 0xea, 0xd8, 0xdb, 0xb1, 0x44, 0xb5, 0x74, 0x4f, 0x9b, + 0x35, 0x98, 0x74, 0x37, 0x4f, 0x36, 0xa7, 0x0a, 0x2f, 0xe2, 0xf1, 0x4e, 0xe5, 0x1e, 0x93, 0xa6, + 0x45, 0xd2, 0x4f, 0xc6, 0xe0, 0x70, 0x5b, 0xe6, 0x6d, 0x05, 0x3d, 0x0e, 0xa0, 0x9b, 0x76, 0xc3, + 0x63, 0x15, 0x11, 0x4b, 0xb0, 0x69, 0x0a, 0xa1, 0xc9, 0x8b, 0x24, 0xcf, 0x86, 0xe7, 0xf7, 0xc7, + 0x69, 0x3f, 0x30, 0x10, 0x45, 0x38, 0x17, 0x08, 0x9a, 0xa0, 0x82, 0x4e, 0x75, 0xd0, 0xb4, 0xc5, + 0x31, 0x1f, 0x82, 0xac, 0x66, 0xe8, 0xd8, 0xf4, 0x2a, 0xae, 0xe7, 0x60, 0xb5, 0xae, 0x9b, 0x35, + 0xba, 0x82, 0xa4, 0x8a, 0xc9, 0x6d, 0xd5, 0x70, 0xb1, 0x32, 0xca, 0xba, 0xd7, 0x45, 0x2f, 0xa1, + 0xa0, 0x0e, 0xe4, 0x84, 0x28, 0x06, 0x22, 0x14, 0xac, 0xdb, 0xa7, 0x90, 0x7f, 0x3a, 0x0d, 0x99, + 0x50, 0x5d, 0x8d, 0xee, 0x84, 0xa1, 0x67, 0xd4, 0x6b, 0x6a, 0x45, 0xec, 0x95, 0x98, 0x25, 0x32, + 0x04, 0xb6, 0xc6, 0xf7, 0x4b, 0x0f, 0xc1, 0x04, 0x45, 0xb1, 0x1a, 0x1e, 0x76, 0x2a, 0x9a, 0xa1, + 0xba, 0x2e, 0x35, 0x5a, 0x8a, 0xa2, 0x22, 0xd2, 0xb7, 0x4a, 0xba, 0xe6, 0x44, 0x0f, 0x7a, 0x14, + 0xc6, 0x29, 0x45, 0xbd, 0x61, 0x78, 0xba, 0x6d, 0xe0, 0x0a, 0xd9, 0xbd, 0xb9, 0x74, 0x25, 0xf1, + 0x25, 0x1b, 0x23, 0x18, 0xcb, 0x1c, 0x81, 0x48, 0xe4, 0xa2, 0x79, 0x38, 0x4e, 0xc9, 0x6a, 0xd8, + 0xc4, 0x8e, 0xea, 0xe1, 0x0a, 0x7e, 0xb6, 0xa1, 0x1a, 0x6e, 0x45, 0x35, 0xab, 0x95, 0x1d, 0xd5, + 0xdd, 0xc9, 0x4d, 0x10, 0x06, 0xa5, 0x58, 0x4e, 0x52, 0x8e, 0x10, 0xc4, 0x05, 0x8e, 0x57, 0xa6, + 0x68, 0xb3, 0x66, 0xf5, 0xa2, 0xea, 0xee, 0xa0, 0x22, 0x4c, 0x52, 0x2e, 0xae, 0xe7, 0xe8, 0x66, + 0xad, 0xa2, 0xed, 0x60, 0xed, 0x6a, 0xa5, 0xe1, 0x6d, 0x9f, 0xcb, 0x1d, 0x0d, 0x8f, 0x4f, 0x25, + 0x5c, 0xa7, 0x38, 0x73, 0x04, 0x65, 0xd3, 0xdb, 0x3e, 0x87, 0xd6, 0x61, 0x88, 0x4c, 0x46, 0x5d, + 0xbf, 0x81, 0x2b, 0xdb, 0x96, 0x43, 0x97, 0xc6, 0x91, 0x36, 0xa9, 0x29, 0x64, 0xc1, 0xc2, 0x2a, + 0x27, 0x58, 0xb6, 0xaa, 0xb8, 0x98, 0x5c, 0x5f, 0x2b, 0x97, 0xe7, 0x95, 0x8c, 0xe0, 0x72, 0xc1, + 0x72, 0x88, 0x43, 0xd5, 0x2c, 0xdf, 0xc0, 0x19, 0xe6, 0x50, 0x35, 0x4b, 0x98, 0xf7, 0x51, 0x18, + 0xd7, 0x34, 0xa6, 0xb3, 0xae, 0x55, 0xf8, 0x1e, 0xcb, 0xcd, 0x65, 0x23, 0xc6, 0xd2, 0xb4, 0x05, + 0x86, 0xc0, 0x7d, 0xdc, 0x45, 0x8f, 0xc3, 0xe1, 0xc0, 0x58, 0x61, 0xc2, 0xb1, 0x16, 0x2d, 0x9b, + 0x49, 0x1f, 0x85, 0x71, 0x7b, 0xaf, 0x95, 0x10, 0x45, 0x46, 0xb4, 0xf7, 0x9a, 0xc9, 0x1e, 0x83, + 0x09, 0x7b, 0xc7, 0x6e, 0xa5, 0x3b, 0x15, 0xa6, 0x43, 0xf6, 0x8e, 0xdd, 0x4c, 0xf8, 0x2e, 0xba, + 0xe1, 0x76, 0xb0, 0xa6, 0x7a, 0xb8, 0x9a, 0xbb, 0x23, 0x8c, 0x1e, 0xea, 0x40, 0x33, 0x90, 0xd5, + 0xb4, 0x0a, 0x36, 0xd5, 0x2d, 0x03, 0x57, 0x54, 0x07, 0x9b, 0xaa, 0x9b, 0x9b, 0x0e, 0x23, 0x8f, + 0x68, 0x5a, 0x99, 0xf6, 0xce, 0xd2, 0x4e, 0x74, 0x0a, 0xc6, 0xac, 0xad, 0x67, 0x34, 0xe6, 0x92, + 0x15, 0xdb, 0xc1, 0xdb, 0xfa, 0x6e, 0xee, 0x6e, 0x6a, 0xdf, 0x51, 0xd2, 0x41, 0x1d, 0x72, 0x8d, + 0x82, 0xd1, 0x7d, 0x90, 0xd5, 0xdc, 0x1d, 0xd5, 0xb1, 0x69, 0x4e, 0x76, 0x6d, 0x55, 0xc3, 0xb9, + 0x77, 0x31, 0x54, 0x06, 0x5f, 0x11, 0x60, 0x12, 0x12, 0xee, 0x75, 0x7d, 0xdb, 0x13, 0x1c, 0xef, + 0x65, 0x21, 0x41, 0x61, 0x9c, 0xdb, 0x49, 0xc8, 0x12, 0x53, 0x44, 0x06, 0x3e, 0x49, 0xd1, 0x46, + 0xec, 0x1d, 0x3b, 0x3c, 0xee, 0x5d, 0x30, 0x4c, 0x30, 0x83, 0x41, 0xef, 0x63, 0x05, 0x99, 0xbd, + 0x13, 0x1a, 0xf1, 0x0c, 0x4c, 0x12, 0xa4, 0x3a, 0xf6, 0xd4, 0xaa, 0xea, 0xa9, 0x21, 0xec, 0x07, + 0x28, 0x36, 0xb1, 0xfb, 0x32, 0xef, 0x8c, 0xc8, 0xe9, 0x34, 0xb6, 0xf6, 0x7c, 0xcf, 0x7a, 0x90, + 0xc9, 0x49, 0x60, 0xc2, 0xb7, 0xde, 0xb4, 0xa2, 0x5b, 0x2e, 0xc2, 0x50, 0xd8, 0xf1, 0x51, 0x1a, + 0x98, 0xeb, 0x67, 0x25, 0x52, 0x05, 0xcd, 0xad, 0xce, 0x93, 0xfa, 0xe5, 0x03, 0xe5, 0x6c, 0x8c, + 0xd4, 0x51, 0x4b, 0x8b, 0x1b, 0xe5, 0x8a, 0xb2, 0xb9, 0xb2, 0xb1, 0xb8, 0x5c, 0xce, 0xc6, 0x43, + 0x05, 0xfb, 0xa5, 0x44, 0xea, 0x9e, 0xec, 0xbd, 0xf2, 0x2b, 0x31, 0x18, 0x89, 0xee, 0xc0, 0xd0, + 0xbb, 0xe1, 0x0e, 0x71, 0x5c, 0xe2, 0x62, 0xaf, 0x72, 0x5d, 0x77, 0x68, 0x44, 0xd6, 0x55, 0xb6, + 0x3a, 0xfa, 0x3e, 0x31, 0xc1, 0xb1, 0xd6, 0xb1, 0xf7, 0x94, 0xee, 0x90, 0x78, 0xab, 0xab, 0x1e, + 0x5a, 0x82, 0x69, 0xd3, 0xaa, 0xb8, 0x9e, 0x6a, 0x56, 0x55, 0xa7, 0x5a, 0x09, 0x0e, 0xaa, 0x2a, + 0xaa, 0xa6, 0x61, 0xd7, 0xb5, 0xd8, 0x4a, 0xe8, 0x73, 0x39, 0x66, 0x5a, 0xeb, 0x1c, 0x39, 0x58, + 0x22, 0x66, 0x39, 0x6a, 0x93, 0xff, 0xc6, 0x3b, 0xf9, 0xef, 0x51, 0x48, 0xd7, 0x55, 0xbb, 0x82, + 0x4d, 0xcf, 0xd9, 0xa3, 0x75, 0x77, 0x4a, 0x49, 0xd5, 0x55, 0xbb, 0x4c, 0xda, 0x6f, 0xc9, 0xf6, + 0xe7, 0x52, 0x22, 0x95, 0xca, 0xa6, 0x2f, 0x25, 0x52, 0xe9, 0x2c, 0xc8, 0xaf, 0xc6, 0x61, 0x28, + 0x5c, 0x87, 0x93, 0x6d, 0x8d, 0x46, 0x97, 0x2c, 0x89, 0x26, 0xb5, 0xbb, 0xf6, 0xad, 0xda, 0x0b, + 0x73, 0x64, 0x2d, 0x2b, 0x0e, 0xb0, 0xea, 0x58, 0x61, 0x94, 0xa4, 0x8e, 0x20, 0xce, 0x86, 0x59, + 0x35, 0x92, 0x52, 0x78, 0x0b, 0x2d, 0xc0, 0xc0, 0x33, 0x2e, 0xe5, 0x3d, 0x40, 0x79, 0xdf, 0xbd, + 0x3f, 0xef, 0x4b, 0xeb, 0x94, 0x79, 0xfa, 0xd2, 0x7a, 0x65, 0x65, 0x55, 0x59, 0x9e, 0x5d, 0x52, + 0x38, 0x39, 0x3a, 0x02, 0x09, 0x43, 0xbd, 0xb1, 0x17, 0x5d, 0xf5, 0x28, 0xa8, 0xd7, 0x49, 0x38, + 0x02, 0x89, 0xeb, 0x58, 0xbd, 0x1a, 0x5d, 0x6b, 0x28, 0xe8, 0x4d, 0x0c, 0x86, 0x19, 0x48, 0x52, + 0x7b, 0x21, 0x00, 0x6e, 0xb1, 0xec, 0x21, 0x94, 0x82, 0xc4, 0xdc, 0xaa, 0x42, 0x02, 0x22, 0x0b, + 0x43, 0x0c, 0x5a, 0x59, 0x5b, 0x2c, 0xcf, 0x95, 0xb3, 0x31, 0xf9, 0x51, 0x18, 0x60, 0x46, 0x20, + 0xc1, 0xe2, 0x9b, 0x21, 0x7b, 0x88, 0x37, 0x39, 0x0f, 0x49, 0xf4, 0x6e, 0x2e, 0x97, 0xca, 0x4a, + 0x36, 0x16, 0x9d, 0xea, 0x44, 0x36, 0x29, 0xbb, 0x30, 0x14, 0x2e, 0xc4, 0xdf, 0x9a, 0x4d, 0xf6, + 0xd7, 0x24, 0xc8, 0x84, 0x0a, 0x6b, 0x52, 0x11, 0xa9, 0x86, 0x61, 0x5d, 0xaf, 0xa8, 0x86, 0xae, + 0xba, 0xdc, 0x35, 0x80, 0x82, 0x66, 0x09, 0xa4, 0xd7, 0xa9, 0x7b, 0x8b, 0x42, 0x24, 0x99, 0x1d, + 0x90, 0x3f, 0x2f, 0x41, 0xb6, 0xb9, 0xb2, 0x6d, 0x12, 0x53, 0xfa, 0x41, 0x8a, 0x29, 0x7f, 0x4e, + 0x82, 0x91, 0x68, 0x39, 0xdb, 0x24, 0xde, 0x9d, 0x3f, 0x50, 0xf1, 0xfe, 0x20, 0x06, 0xc3, 0x91, + 0x22, 0xb6, 0x57, 0xe9, 0x9e, 0x85, 0x31, 0xbd, 0x8a, 0xeb, 0xb6, 0xe5, 0x61, 0x53, 0xdb, 0xab, + 0x18, 0xf8, 0x1a, 0x36, 0x72, 0x32, 0x4d, 0x1a, 0x33, 0xfb, 0x97, 0xc9, 0x85, 0xc5, 0x80, 0x6e, + 0x89, 0x90, 0x15, 0xc7, 0x17, 0xe7, 0xcb, 0xcb, 0x6b, 0xab, 0x1b, 0xe5, 0x95, 0xb9, 0xf7, 0x57, + 0x36, 0x57, 0x2e, 0xaf, 0xac, 0x3e, 0xb5, 0xa2, 0x64, 0xf5, 0x26, 0xb4, 0x37, 0x31, 0xec, 0xd7, + 0x20, 0xdb, 0x2c, 0x14, 0xba, 0x03, 0xda, 0x89, 0x95, 0x3d, 0x84, 0xc6, 0x61, 0x74, 0x65, 0xb5, + 0xb2, 0xbe, 0x38, 0x5f, 0xae, 0x94, 0x2f, 0x5c, 0x28, 0xcf, 0x6d, 0xac, 0xb3, 0x83, 0x0f, 0x1f, + 0x7b, 0x23, 0x12, 0xe0, 0xf2, 0x67, 0xe3, 0x30, 0xde, 0x46, 0x12, 0x34, 0xcb, 0xb7, 0x2c, 0x6c, + 0x17, 0xf5, 0x60, 0x2f, 0xd2, 0x17, 0x48, 0xcd, 0xb0, 0xa6, 0x3a, 0x1e, 0xdf, 0xe1, 0xdc, 0x07, + 0xc4, 0x4a, 0xa6, 0xa7, 0x6f, 0xeb, 0xd8, 0xe1, 0xe7, 0x44, 0x6c, 0x1f, 0x33, 0x1a, 0xc0, 0xd9, + 0x51, 0xd1, 0x03, 0x80, 0x6c, 0xcb, 0xd5, 0x3d, 0xfd, 0x1a, 0xae, 0xe8, 0xa6, 0x38, 0x54, 0x22, + 0xfb, 0x9a, 0x84, 0x92, 0x15, 0x3d, 0x8b, 0xa6, 0xe7, 0x63, 0x9b, 0xb8, 0xa6, 0x36, 0x61, 0x93, + 0x64, 0x1e, 0x57, 0xb2, 0xa2, 0xc7, 0xc7, 0xbe, 0x13, 0x86, 0xaa, 0x56, 0x83, 0x14, 0x7b, 0x0c, + 0x8f, 0xac, 0x1d, 0x92, 0x92, 0x61, 0x30, 0x1f, 0x85, 0x97, 0xf1, 0xc1, 0x69, 0xd6, 0x90, 0x92, + 0x61, 0x30, 0x86, 0x72, 0x2f, 0x8c, 0xaa, 0xb5, 0x9a, 0x43, 0x98, 0x0b, 0x46, 0x6c, 0x63, 0x32, + 0xe2, 0x83, 0x29, 0x62, 0xfe, 0x12, 0xa4, 0x84, 0x1d, 0xc8, 0x52, 0x4d, 0x2c, 0x51, 0xb1, 0xd9, + 0x6e, 0x3b, 0x76, 0x32, 0xad, 0xa4, 0x4c, 0xd1, 0x79, 0x27, 0x0c, 0xe9, 0x6e, 0x25, 0x38, 0x9c, + 0x8f, 0x9d, 0x88, 0x9d, 0x4c, 0x29, 0x19, 0xdd, 0xf5, 0x0f, 0x36, 0xe5, 0x2f, 0xc7, 0x60, 0x24, + 0xfa, 0x70, 0x01, 0xcd, 0x43, 0xca, 0xb0, 0x34, 0x95, 0xba, 0x16, 0x7b, 0xb2, 0x75, 0xb2, 0xcb, + 0xf3, 0x88, 0xc2, 0x12, 0xc7, 0x57, 0x7c, 0xca, 0xfc, 0xbf, 0x92, 0x20, 0x25, 0xc0, 0x68, 0x12, + 0x12, 0xb6, 0xea, 0xed, 0x50, 0x76, 0xc9, 0x52, 0x2c, 0x2b, 0x29, 0xb4, 0x4d, 0xe0, 0xae, 0xad, + 0x9a, 0xd4, 0x05, 0x38, 0x9c, 0xb4, 0xc9, 0xbc, 0x1a, 0x58, 0xad, 0xd2, 0x5d, 0x8f, 0x55, 0xaf, + 0x63, 0xd3, 0x73, 0xc5, 0xbc, 0x72, 0xf8, 0x1c, 0x07, 0xa3, 0xfb, 0x61, 0xcc, 0x73, 0x54, 0xdd, + 0x88, 0xe0, 0x26, 0x28, 0x6e, 0x56, 0x74, 0xf8, 0xc8, 0x45, 0x38, 0x22, 0xf8, 0x56, 0xb1, 0xa7, + 0x6a, 0x3b, 0xb8, 0x1a, 0x10, 0x0d, 0xd0, 0xd3, 0x8d, 0x3b, 0x38, 0xc2, 0x3c, 0xef, 0x17, 0xb4, + 0xf2, 0x2b, 0x12, 0x8c, 0x89, 0x7d, 0x5a, 0xd5, 0x37, 0xd6, 0x32, 0x80, 0x6a, 0x9a, 0x96, 0x17, + 0x36, 0x57, 0xab, 0x2b, 0xb7, 0xd0, 0x15, 0x66, 0x7d, 0x22, 0x25, 0xc4, 0x20, 0x5f, 0x07, 0x08, + 0x7a, 0x3a, 0x9a, 0x6d, 0x1a, 0x32, 0xfc, 0xc9, 0x11, 0x7d, 0xfc, 0xc8, 0x76, 0xf6, 0xc0, 0x40, + 0x64, 0x43, 0x87, 0x26, 0x20, 0xb9, 0x85, 0x6b, 0xba, 0xc9, 0xcf, 0x83, 0x59, 0x43, 0x9c, 0xbf, + 0x24, 0xfc, 0xf3, 0x97, 0xd2, 0xa7, 0x24, 0x18, 0xd7, 0xac, 0x7a, 0xb3, 0xbc, 0xa5, 0x6c, 0xd3, + 0xf1, 0x82, 0x7b, 0x51, 0xfa, 0xc0, 0x7b, 0x6b, 0xba, 0xb7, 0xd3, 0xd8, 0x2a, 0x68, 0x56, 0x7d, + 0xa6, 0x66, 0x19, 0xaa, 0x59, 0x0b, 0x9e, 0x9f, 0xd2, 0x1f, 0xda, 0x83, 0x35, 0x6c, 0x3e, 0x58, + 0xb3, 0x42, 0x4f, 0x53, 0xcf, 0x07, 0x3f, 0xff, 0xaf, 0x24, 0x7d, 0x31, 0x16, 0x5f, 0x58, 0x2b, + 0x7d, 0x25, 0x96, 0x5f, 0x60, 0xc3, 0xad, 0x09, 0xf3, 0x28, 0x78, 0xdb, 0xc0, 0x1a, 0x51, 0x19, + 0xbe, 0x77, 0x3f, 0x4c, 0xd4, 0xac, 0x9a, 0x45, 0x39, 0xce, 0x90, 0x5f, 0xfc, 0x89, 0x6c, 0xda, + 0x87, 0xe6, 0xbb, 0x3e, 0xbe, 0x2d, 0xae, 0xc0, 0x38, 0x47, 0xae, 0xd0, 0x47, 0x42, 0x6c, 0x63, + 0x83, 0xf6, 0x3d, 0x56, 0xcb, 0xfd, 0xf2, 0x77, 0xe8, 0x82, 0xae, 0x8c, 0x71, 0x52, 0xd2, 0xc7, + 0xf6, 0x3e, 0x45, 0x05, 0x0e, 0x47, 0xf8, 0xb1, 0xb0, 0xc5, 0x4e, 0x17, 0x8e, 0xbf, 0xc9, 0x39, + 0x8e, 0x87, 0x38, 0xae, 0x73, 0xd2, 0xe2, 0x1c, 0x0c, 0xf7, 0xc3, 0xeb, 0xb7, 0x38, 0xaf, 0x21, + 0x1c, 0x66, 0xb2, 0x00, 0xa3, 0x94, 0x89, 0xd6, 0x70, 0x3d, 0xab, 0x4e, 0x73, 0xe2, 0xfe, 0x6c, + 0x7e, 0xfb, 0x3b, 0x2c, 0x8e, 0x46, 0x08, 0xd9, 0x9c, 0x4f, 0x55, 0x2c, 0x02, 0x7d, 0x0a, 0x56, + 0xc5, 0x9a, 0xd1, 0x85, 0xc3, 0x37, 0xb8, 0x20, 0x3e, 0x7e, 0xf1, 0x0a, 0x4c, 0x90, 0xdf, 0x34, + 0x65, 0x85, 0x25, 0xe9, 0x7e, 0x06, 0x97, 0x7b, 0xe5, 0xa3, 0x2c, 0x54, 0xc7, 0x7d, 0x06, 0x21, + 0x99, 0x42, 0xb3, 0x58, 0xc3, 0x9e, 0x87, 0x1d, 0xb7, 0xa2, 0x1a, 0xed, 0xc4, 0x0b, 0x1d, 0x62, + 0xe4, 0x3e, 0xf3, 0xfd, 0xe8, 0x2c, 0x2e, 0x30, 0xca, 0x59, 0xc3, 0x28, 0x6e, 0xc2, 0x1d, 0x6d, + 0xbc, 0xa2, 0x07, 0x9e, 0x9f, 0xe5, 0x3c, 0x27, 0x5a, 0x3c, 0x83, 0xb0, 0x5d, 0x03, 0x01, 0xf7, + 0xe7, 0xb2, 0x07, 0x9e, 0x3f, 0xc7, 0x79, 0x22, 0x4e, 0x2b, 0xa6, 0x94, 0x70, 0xbc, 0x04, 0x63, + 0xd7, 0xb0, 0xb3, 0x65, 0xb9, 0xfc, 0xe0, 0xa8, 0x07, 0x76, 0x9f, 0xe3, 0xec, 0x46, 0x39, 0x21, + 0x3d, 0x49, 0x22, 0xbc, 0x1e, 0x87, 0xd4, 0xb6, 0xaa, 0xe1, 0x1e, 0x58, 0xbc, 0xc8, 0x59, 0x0c, + 0x12, 0x7c, 0x42, 0x3a, 0x0b, 0x43, 0x35, 0x8b, 0xaf, 0x5a, 0xdd, 0xc9, 0x3f, 0xcf, 0xc9, 0x33, + 0x82, 0x86, 0xb3, 0xb0, 0x2d, 0xbb, 0x61, 0x90, 0x25, 0xad, 0x3b, 0x8b, 0xbf, 0x2a, 0x58, 0x08, + 0x1a, 0xce, 0xa2, 0x0f, 0xb3, 0xbe, 0x24, 0x58, 0xb8, 0x21, 0x7b, 0x3e, 0x01, 0x19, 0xcb, 0x34, + 0xf6, 0x2c, 0xb3, 0x17, 0x21, 0xbe, 0xc0, 0x39, 0x00, 0x27, 0x21, 0x0c, 0xce, 0x43, 0xba, 0xd7, + 0x89, 0xf8, 0xeb, 0xdf, 0x17, 0xe1, 0x21, 0x66, 0x60, 0x01, 0x46, 0x45, 0x82, 0xd2, 0x2d, 0xb3, + 0x07, 0x16, 0x7f, 0x83, 0xb3, 0x18, 0x09, 0x91, 0x71, 0x35, 0x3c, 0xec, 0x7a, 0x35, 0xdc, 0x0b, + 0x93, 0x2f, 0x0b, 0x35, 0x38, 0x09, 0x37, 0xe5, 0x16, 0x36, 0xb5, 0x9d, 0xde, 0x38, 0xfc, 0xbc, + 0x30, 0xa5, 0xa0, 0x21, 0x2c, 0xe6, 0x60, 0xb8, 0xae, 0x3a, 0xee, 0x8e, 0x6a, 0xf4, 0x34, 0x1d, + 0x7f, 0x93, 0xf3, 0x18, 0xf2, 0x89, 0xb8, 0x45, 0x1a, 0x66, 0x3f, 0x6c, 0xbe, 0x22, 0x2c, 0x12, + 0x22, 0xe3, 0xa1, 0xe7, 0x7a, 0xf4, 0x94, 0xad, 0x1f, 0x6e, 0xbf, 0x20, 0x42, 0x8f, 0xd1, 0x2e, + 0x87, 0x39, 0x9e, 0x87, 0xb4, 0xab, 0xdf, 0xe8, 0x89, 0xcd, 0xdf, 0x12, 0x33, 0x4d, 0x09, 0x08, + 0xf1, 0xfb, 0xe1, 0x48, 0xdb, 0x65, 0xa2, 0x07, 0x66, 0x7f, 0x9b, 0x33, 0x9b, 0x6c, 0xb3, 0x54, + 0xf0, 0x94, 0xd0, 0x2f, 0xcb, 0xbf, 0x23, 0x52, 0x02, 0x6e, 0xe2, 0xb5, 0x46, 0xf6, 0x11, 0xae, + 0xba, 0xdd, 0x9f, 0xd5, 0x7e, 0x51, 0x58, 0x8d, 0xd1, 0x46, 0xac, 0xb6, 0x01, 0x93, 0x9c, 0x63, + 0x7f, 0xf3, 0xfa, 0x4b, 0x22, 0xb1, 0x32, 0xea, 0xcd, 0xe8, 0xec, 0x7e, 0x10, 0xf2, 0xbe, 0x39, + 0x45, 0xc1, 0xea, 0x56, 0xea, 0xaa, 0xdd, 0x03, 0xe7, 0x5f, 0xe6, 0x9c, 0x45, 0xc6, 0xf7, 0x2b, + 0x5e, 0x77, 0x59, 0xb5, 0x09, 0xf3, 0xa7, 0x21, 0x27, 0x98, 0x37, 0x4c, 0x07, 0x6b, 0x56, 0xcd, + 0xd4, 0x6f, 0xe0, 0x6a, 0x0f, 0xac, 0xff, 0x6e, 0xd3, 0x54, 0x6d, 0x86, 0xc8, 0x09, 0xe7, 0x45, + 0xc8, 0xfa, 0xb5, 0x4a, 0x45, 0xaf, 0xdb, 0x96, 0xe3, 0x75, 0xe1, 0xf8, 0x55, 0x31, 0x53, 0x3e, + 0xdd, 0x22, 0x25, 0x2b, 0x96, 0x61, 0x84, 0x36, 0x7b, 0x75, 0xc9, 0x5f, 0xe1, 0x8c, 0x86, 0x03, + 0x2a, 0x9e, 0x38, 0x34, 0xab, 0x6e, 0xab, 0x4e, 0x2f, 0xf9, 0xef, 0xef, 0x89, 0xc4, 0xc1, 0x49, + 0x78, 0xe2, 0xf0, 0xf6, 0x6c, 0x4c, 0x56, 0xfb, 0x1e, 0x38, 0xfc, 0xaa, 0x48, 0x1c, 0x82, 0x86, + 0xb3, 0x10, 0x05, 0x43, 0x0f, 0x2c, 0xfe, 0xbe, 0x60, 0x21, 0x68, 0x08, 0x8b, 0x27, 0x83, 0x85, + 0xd6, 0xc1, 0x35, 0xdd, 0xf5, 0x1c, 0x56, 0x26, 0xef, 0xcf, 0xea, 0x1f, 0x7c, 0x3f, 0x5a, 0x84, + 0x29, 0x21, 0x52, 0x92, 0x89, 0xf8, 0xb1, 0x2b, 0xdd, 0x45, 0x75, 0x17, 0xec, 0xd7, 0x44, 0x26, + 0x0a, 0x91, 0x11, 0xd9, 0x42, 0x15, 0x22, 0x31, 0xbb, 0x46, 0xf6, 0x0e, 0x3d, 0xb0, 0xfb, 0x87, + 0x4d, 0xc2, 0xad, 0x0b, 0x5a, 0xc2, 0x33, 0x54, 0xff, 0x34, 0xcc, 0xab, 0x78, 0xaf, 0x27, 0xef, + 0xfc, 0xf5, 0xa6, 0xfa, 0x67, 0x93, 0x51, 0xb2, 0x1c, 0x32, 0xda, 0x54, 0x4f, 0xa1, 0x6e, 0xf7, + 0x87, 0x72, 0x3f, 0xf6, 0x1a, 0xd7, 0x37, 0x5a, 0x4e, 0x15, 0x97, 0x88, 0x93, 0x47, 0x8b, 0x9e, + 0xee, 0xcc, 0x3e, 0xfa, 0x9a, 0xef, 0xe7, 0x91, 0x9a, 0xa7, 0x78, 0x01, 0x86, 0x23, 0x05, 0x4f, + 0x77, 0x56, 0x1f, 0xe3, 0xac, 0x86, 0xc2, 0xf5, 0x4e, 0xf1, 0x51, 0x48, 0x90, 0xe2, 0xa5, 0x3b, + 0xf9, 0xc7, 0x39, 0x39, 0x45, 0x2f, 0xbe, 0x07, 0x52, 0xa2, 0x68, 0xe9, 0x4e, 0xfa, 0x09, 0x4e, + 0xea, 0x93, 0x10, 0x72, 0x51, 0xb0, 0x74, 0x27, 0xff, 0xf3, 0x82, 0x5c, 0x90, 0x10, 0xf2, 0xde, + 0x4d, 0xf8, 0xb5, 0xbf, 0x90, 0xe0, 0x8b, 0x8e, 0xb0, 0xdd, 0x79, 0x18, 0xe4, 0x95, 0x4a, 0x77, + 0xea, 0x4f, 0xf2, 0xc1, 0x05, 0x45, 0xf1, 0x31, 0x48, 0xf6, 0x68, 0xf0, 0x9f, 0xe4, 0xa4, 0x0c, + 0xbf, 0x38, 0x07, 0x99, 0x50, 0x75, 0xd2, 0x9d, 0xfc, 0x2f, 0x71, 0xf2, 0x30, 0x15, 0x11, 0x9d, + 0x57, 0x27, 0xdd, 0x19, 0x7c, 0x4a, 0x88, 0xce, 0x29, 0x88, 0xd9, 0x44, 0x61, 0xd2, 0x9d, 0xfa, + 0xd3, 0xc2, 0xea, 0x82, 0xa4, 0xf8, 0x04, 0xa4, 0xfd, 0xc5, 0xa6, 0x3b, 0xfd, 0x4f, 0x71, 0xfa, + 0x80, 0x86, 0x58, 0x20, 0xb4, 0xd8, 0x75, 0x67, 0xf1, 0xd3, 0xc2, 0x02, 0x21, 0x2a, 0x12, 0x46, + 0xcd, 0x05, 0x4c, 0x77, 0x4e, 0x3f, 0x23, 0xc2, 0xa8, 0xa9, 0x7e, 0x21, 0xb3, 0x49, 0x73, 0x7e, + 0x77, 0x16, 0x3f, 0x2b, 0x66, 0x93, 0xe2, 0x13, 0x31, 0x9a, 0x2b, 0x82, 0xee, 0x3c, 0xfe, 0x8a, + 0x10, 0xa3, 0xa9, 0x20, 0x28, 0xae, 0x01, 0x6a, 0xad, 0x06, 0xba, 0xf3, 0x7b, 0x81, 0xf3, 0x1b, + 0x6b, 0x29, 0x06, 0x8a, 0x4f, 0xc1, 0x64, 0xfb, 0x4a, 0xa0, 0x3b, 0xd7, 0xcf, 0xbc, 0xd6, 0xb4, + 0x77, 0x0b, 0x17, 0x02, 0xc5, 0x8d, 0x60, 0x49, 0x09, 0x57, 0x01, 0xdd, 0xd9, 0x7e, 0xf6, 0xb5, + 0x68, 0xe2, 0x0e, 0x17, 0x01, 0xc5, 0x59, 0x80, 0x60, 0x01, 0xee, 0xce, 0xeb, 0x73, 0x9c, 0x57, + 0x88, 0x88, 0x84, 0x06, 0x5f, 0x7f, 0xbb, 0xd3, 0xbf, 0x28, 0x42, 0x83, 0x53, 0x90, 0xd0, 0x10, + 0x4b, 0x6f, 0x77, 0xea, 0xcf, 0x8b, 0xd0, 0x10, 0x24, 0xc4, 0xb3, 0x43, 0xab, 0x5b, 0x77, 0x0e, + 0x5f, 0x10, 0x9e, 0x1d, 0xa2, 0x2a, 0xae, 0xc0, 0x58, 0xcb, 0x82, 0xd8, 0x9d, 0xd5, 0x17, 0x39, + 0xab, 0x6c, 0xf3, 0x7a, 0x18, 0x5e, 0xbc, 0xf8, 0x62, 0xd8, 0x9d, 0xdb, 0x97, 0x9a, 0x16, 0x2f, + 0xbe, 0x16, 0x16, 0xcf, 0x43, 0xca, 0x6c, 0x18, 0x06, 0x09, 0x1e, 0xb4, 0xff, 0x9d, 0xbf, 0xdc, + 0x1f, 0xbe, 0xce, 0xad, 0x23, 0x08, 0x8a, 0x8f, 0x42, 0x12, 0xd7, 0xb7, 0x70, 0xb5, 0x1b, 0xe5, + 0xf7, 0x5e, 0x17, 0x09, 0x93, 0x60, 0x17, 0x9f, 0x00, 0x60, 0x47, 0x23, 0xf4, 0xf1, 0x60, 0x17, + 0xda, 0xff, 0xfa, 0x3a, 0xbf, 0x8d, 0x13, 0x90, 0x04, 0x0c, 0xd8, 0xdd, 0x9e, 0xfd, 0x19, 0x7c, + 0x3f, 0xca, 0x80, 0xce, 0xc8, 0xe3, 0x30, 0xf8, 0x8c, 0x6b, 0x99, 0x9e, 0x5a, 0xeb, 0x46, 0xfd, + 0xdf, 0x38, 0xb5, 0xc0, 0x27, 0x06, 0xab, 0x5b, 0x0e, 0xf6, 0xd4, 0x9a, 0xdb, 0x8d, 0xf6, 0xbf, + 0x73, 0x5a, 0x9f, 0x80, 0x10, 0x6b, 0xaa, 0xeb, 0xf5, 0xa2, 0xf7, 0x1f, 0x09, 0x62, 0x41, 0x40, + 0x84, 0x26, 0xbf, 0xaf, 0xe2, 0xbd, 0x6e, 0xb4, 0x7f, 0x2c, 0x84, 0xe6, 0xf8, 0xc5, 0xf7, 0x40, + 0x9a, 0xfc, 0x64, 0x57, 0xec, 0xba, 0x10, 0xff, 0x0f, 0x4e, 0x1c, 0x50, 0x90, 0x91, 0x5d, 0xaf, + 0xea, 0xe9, 0xdd, 0x8d, 0x7d, 0x8b, 0xcf, 0xb4, 0xc0, 0x2f, 0xce, 0x42, 0xc6, 0xf5, 0xaa, 0xd5, + 0x06, 0xaf, 0x4f, 0xbb, 0x90, 0xff, 0xcf, 0xd7, 0xfd, 0x23, 0x0b, 0x9f, 0x86, 0xcc, 0xf6, 0xf5, + 0xab, 0x9e, 0x6d, 0xd1, 0x47, 0x20, 0xdd, 0x38, 0xbc, 0xc6, 0x39, 0x84, 0x48, 0x8a, 0x73, 0x30, + 0x44, 0x74, 0x71, 0xb0, 0x8d, 0xe9, 0xf3, 0xaa, 0x2e, 0x2c, 0xfe, 0x17, 0x37, 0x40, 0x84, 0xa8, + 0xf4, 0xa3, 0xdf, 0x78, 0x75, 0x4a, 0x7a, 0xf9, 0xd5, 0x29, 0xe9, 0x0f, 0x5e, 0x9d, 0x92, 0x3e, + 0xfd, 0xed, 0xa9, 0x43, 0x2f, 0x7f, 0x7b, 0xea, 0xd0, 0xef, 0x7d, 0x7b, 0xea, 0x50, 0xfb, 0x63, + 0x63, 0x58, 0xb0, 0x16, 0x2c, 0x76, 0x60, 0xfc, 0x01, 0x39, 0x72, 0x5c, 0x5c, 0xb3, 0x82, 0xd3, + 0x5a, 0x7f, 0x93, 0x03, 0x1f, 0x8b, 0xc3, 0x94, 0x66, 0xb9, 0x75, 0xcb, 0x9d, 0xd9, 0x52, 0x5d, + 0x3c, 0x73, 0xed, 0xe1, 0x2d, 0xec, 0xa9, 0x0f, 0xcf, 0x68, 0x96, 0x6e, 0xf2, 0x63, 0xdf, 0x71, + 0xd6, 0x5f, 0x20, 0xfd, 0x05, 0xde, 0x9f, 0x6f, 0x7b, 0x42, 0x2c, 0x2f, 0x40, 0x62, 0xce, 0xd2, + 0x4d, 0x34, 0x01, 0xc9, 0x2a, 0x36, 0xad, 0x3a, 0xbf, 0x01, 0xc6, 0x1a, 0xe8, 0x2e, 0x18, 0x50, + 0xeb, 0x56, 0xc3, 0xf4, 0xd8, 0x71, 0x79, 0x29, 0xf3, 0x8d, 0x9b, 0xd3, 0x87, 0x7e, 0xff, 0xe6, + 0x74, 0x7c, 0xd1, 0xf4, 0x14, 0xde, 0x55, 0x4c, 0x7c, 0xf7, 0xa5, 0x69, 0x49, 0xbe, 0x04, 0x83, + 0xf3, 0x58, 0x3b, 0x08, 0xaf, 0x79, 0xac, 0x35, 0xf1, 0xba, 0x0f, 0x52, 0x8b, 0xa6, 0xc7, 0xee, + 0xe8, 0x1d, 0x87, 0xb8, 0x6e, 0xb2, 0x5b, 0x1f, 0x4d, 0xe3, 0x13, 0x38, 0x41, 0x9d, 0xc7, 0x9a, + 0x8f, 0x5a, 0xc5, 0x5a, 0x33, 0x2a, 0x61, 0x4f, 0xe0, 0xa5, 0xf9, 0xdf, 0xfb, 0x4f, 0x53, 0x87, + 0x9e, 0x7b, 0x75, 0xea, 0x50, 0xa7, 0xf9, 0x89, 0x98, 0x9f, 0x9b, 0x98, 0xfd, 0x79, 0xd0, 0xad, + 0x5e, 0x9d, 0x21, 0xa1, 0xe5, 0x6e, 0x0d, 0x50, 0xbb, 0x3d, 0x02, 0x9f, 0x8e, 0xc1, 0x74, 0xf3, + 0x91, 0x3a, 0xf1, 0x63, 0xd7, 0x53, 0xeb, 0x76, 0xa7, 0x17, 0xa2, 0xce, 0x43, 0x7a, 0x43, 0xe0, + 0xa0, 0x1c, 0x0c, 0xba, 0x58, 0xb3, 0xcc, 0xaa, 0x4b, 0x45, 0x8e, 0x2b, 0xa2, 0x49, 0x0c, 0x68, + 0xaa, 0xa6, 0xe5, 0xf2, 0xfb, 0x9a, 0xac, 0x51, 0xfa, 0xcb, 0x52, 0x7f, 0x8e, 0x35, 0xe2, 0x0f, + 0x45, 0xcd, 0xb3, 0x26, 0x7d, 0xe0, 0xfe, 0xfd, 0x9e, 0x46, 0x50, 0xf5, 0x02, 0x15, 0x42, 0x8f, + 0x1e, 0xa6, 0x9a, 0x1f, 0x3d, 0x3c, 0x85, 0x0d, 0xe3, 0xb2, 0x69, 0x5d, 0x37, 0x37, 0x22, 0x26, + 0xf9, 0x5d, 0x09, 0x4e, 0xd0, 0x8b, 0xe8, 0x4e, 0x5d, 0x37, 0xbd, 0x19, 0x43, 0xdf, 0x72, 0x67, + 0xb6, 0x74, 0xcf, 0x65, 0x96, 0xe3, 0x36, 0x99, 0x08, 0x30, 0x0a, 0x04, 0xa3, 0x40, 0x30, 0xe4, + 0x33, 0x90, 0x2a, 0xe9, 0xde, 0xac, 0xe3, 0xa8, 0x7b, 0x08, 0x41, 0x82, 0xc0, 0xb8, 0x51, 0xe8, + 0x6f, 0x62, 0x11, 0x6c, 0xe0, 0xba, 0x4b, 0x1f, 0x7a, 0x25, 0x14, 0xd6, 0x28, 0x6d, 0x76, 0x9c, + 0xc9, 0xf3, 0x21, 0x4d, 0x43, 0x22, 0x85, 0x7e, 0xb2, 0x48, 0x68, 0x27, 0xae, 0xaf, 0xcf, 0x57, + 0x12, 0x70, 0x3c, 0x84, 0xa0, 0x39, 0x7b, 0xb6, 0x47, 0x43, 0xd2, 0xda, 0xe6, 0xca, 0x8c, 0x85, + 0x94, 0x61, 0xdd, 0x1d, 0xc2, 0x6c, 0x1b, 0x92, 0x6b, 0x84, 0x8e, 0x28, 0xe2, 0x59, 0x9e, 0x6a, + 0x70, 0xed, 0x58, 0x83, 0x40, 0xd9, 0x65, 0xfc, 0x18, 0x83, 0xea, 0xe2, 0x1e, 0xbe, 0x81, 0xd5, + 0x6d, 0x76, 0xf9, 0x31, 0x4e, 0x9f, 0x7d, 0xa6, 0x08, 0x80, 0xde, 0x73, 0x9c, 0x80, 0xa4, 0xda, + 0x60, 0x8f, 0xed, 0xe2, 0x27, 0x87, 0x14, 0xd6, 0x90, 0x2f, 0xc3, 0x20, 0x7f, 0x54, 0x80, 0xb2, + 0x10, 0xbf, 0x8a, 0xf7, 0xe8, 0x38, 0x43, 0x0a, 0xf9, 0x89, 0x0a, 0x90, 0xa4, 0xc2, 0xf3, 0x5b, + 0xdd, 0xb9, 0x42, 0x8b, 0xf4, 0x05, 0x2a, 0xa4, 0xc2, 0xd0, 0xe4, 0x4b, 0x90, 0x9a, 0xb7, 0xea, + 0xba, 0x69, 0x45, 0xb9, 0xa5, 0x19, 0x37, 0x2a, 0xb3, 0xdd, 0xe0, 0xe1, 0xac, 0xb0, 0x06, 0x9a, + 0x84, 0x01, 0x76, 0x19, 0x96, 0x3f, 0x7a, 0xe4, 0x2d, 0x79, 0x0e, 0x06, 0x29, 0xef, 0x55, 0x9b, + 0xcc, 0xaf, 0x7f, 0x11, 0x29, 0xcd, 0xdf, 0x78, 0xe0, 0xec, 0x63, 0x81, 0xb0, 0x08, 0x12, 0x55, + 0xd5, 0x53, 0xb9, 0xde, 0xf4, 0xb7, 0xfc, 0x5e, 0x48, 0x71, 0x26, 0x2e, 0x3a, 0x0d, 0x71, 0xcb, + 0x76, 0xf9, 0xc3, 0xc3, 0x7c, 0x27, 0x55, 0x56, 0xed, 0x52, 0x82, 0x24, 0x02, 0x85, 0x20, 0x97, + 0x94, 0x8e, 0xfe, 0x72, 0xae, 0x7f, 0x7f, 0x61, 0xc3, 0xf8, 0xce, 0xf2, 0x85, 0x18, 0x4c, 0x85, + 0x7a, 0xaf, 0x61, 0x87, 0xd4, 0xcb, 0x11, 0xd7, 0x47, 0x21, 0x21, 0x79, 0x7f, 0x07, 0x77, 0x79, + 0x0f, 0xc4, 0x67, 0x6d, 0x1b, 0xe5, 0x21, 0xc5, 0x1e, 0x12, 0x5a, 0xcc, 0x5f, 0x12, 0x8a, 0xdf, + 0x26, 0x7d, 0xae, 0xb5, 0xed, 0x5d, 0x57, 0x1d, 0xff, 0x35, 0x10, 0xd1, 0x96, 0x1f, 0x87, 0xf4, + 0x9c, 0x65, 0xba, 0xd8, 0x74, 0x1b, 0x34, 0x74, 0xb6, 0x0c, 0x4b, 0xbb, 0xca, 0x39, 0xb0, 0x06, + 0x31, 0xb8, 0x6a, 0xdb, 0x94, 0x32, 0xa1, 0x90, 0x9f, 0x2c, 0xf5, 0x96, 0xd6, 0x3b, 0x9a, 0xe8, + 0xf1, 0xfe, 0x4d, 0xc4, 0x95, 0xf4, 0x6d, 0xf4, 0xeb, 0x47, 0xe0, 0x58, 0x98, 0x94, 0x65, 0x9c, + 0x90, 0x85, 0xb2, 0x21, 0x0b, 0x51, 0x78, 0x7b, 0xfb, 0xe4, 0xbb, 0x65, 0xde, 0x7c, 0xd7, 0x3c, + 0x94, 0xdf, 0x3f, 0xb2, 0xf3, 0x5d, 0xe6, 0x52, 0x7e, 0x1c, 0x86, 0xd7, 0x54, 0xc7, 0x5b, 0xc7, + 0xde, 0x45, 0xac, 0x56, 0xb1, 0x13, 0x0d, 0xec, 0x61, 0x11, 0xd8, 0x08, 0x12, 0x34, 0x7a, 0x99, + 0x63, 0xd3, 0xdf, 0xf2, 0x0e, 0x24, 0xe8, 0x45, 0x03, 0x3f, 0xe8, 0x39, 0x05, 0x0b, 0x7a, 0x32, + 0x5d, 0x7b, 0x1e, 0x76, 0x39, 0x09, 0x6b, 0xa0, 0x33, 0x22, 0x74, 0xe3, 0xfb, 0x87, 0x2e, 0xf7, + 0x76, 0x1e, 0xc0, 0x06, 0x0c, 0x96, 0xc8, 0x6c, 0x2f, 0xce, 0xfb, 0x82, 0x48, 0x81, 0x20, 0x68, + 0x19, 0x46, 0x6d, 0xd5, 0xf1, 0xe8, 0x0d, 0xcb, 0x1d, 0xaa, 0x05, 0xcf, 0x0c, 0xd3, 0x85, 0xe6, + 0x79, 0x28, 0x44, 0x94, 0xe5, 0xa3, 0x0c, 0xdb, 0x61, 0xa0, 0xfc, 0x9f, 0x13, 0x30, 0xc0, 0x8d, + 0xf1, 0x1e, 0x18, 0xe4, 0x46, 0xa3, 0x03, 0x66, 0x4e, 0x1f, 0x2f, 0xb4, 0xfa, 0x7e, 0xc1, 0xf7, + 0x51, 0xce, 0x4f, 0xd0, 0xa0, 0x7b, 0x20, 0xa5, 0xed, 0xa8, 0xba, 0x59, 0xd1, 0xab, 0xa2, 0x58, + 0x78, 0xf5, 0xe6, 0xf4, 0xe0, 0x1c, 0x81, 0x2d, 0xce, 0x2b, 0x83, 0xb4, 0x73, 0xb1, 0x4a, 0x92, + 0xcd, 0x0e, 0xd6, 0x6b, 0x3b, 0x2c, 0xd9, 0xc4, 0x15, 0xde, 0x42, 0xe7, 0x20, 0x41, 0x1c, 0x82, + 0x5f, 0xc0, 0xcf, 0xb7, 0x14, 0x71, 0xfe, 0xc2, 0x58, 0x4a, 0x91, 0x81, 0x3f, 0xfd, 0xad, 0x69, + 0x49, 0xa1, 0x14, 0x68, 0x0e, 0x86, 0x0d, 0xd5, 0xf5, 0x2a, 0x34, 0x48, 0xc8, 0xf0, 0x49, 0xca, + 0xe2, 0x48, 0xab, 0x41, 0xb8, 0x61, 0xb9, 0xe8, 0x19, 0x42, 0xc5, 0x40, 0x55, 0x74, 0x12, 0xb2, + 0x94, 0x89, 0x66, 0xd5, 0xeb, 0xba, 0xc7, 0xd2, 0xf7, 0x00, 0xb5, 0xfb, 0x08, 0x81, 0xcf, 0x51, + 0x30, 0x4d, 0xe2, 0x47, 0x21, 0x4d, 0x6f, 0xfc, 0x52, 0x14, 0x76, 0xbb, 0x25, 0x45, 0x00, 0xb4, + 0xf3, 0x5e, 0x18, 0xbd, 0xa6, 0x1a, 0x7a, 0x55, 0xf5, 0x2c, 0xc7, 0x65, 0x28, 0x29, 0xc6, 0x25, + 0x00, 0x53, 0xc4, 0x87, 0x60, 0xc2, 0xc4, 0xbb, 0xf4, 0xbe, 0x4d, 0x04, 0x3b, 0x4d, 0xb1, 0x11, + 0xe9, 0xbb, 0x12, 0xa5, 0x78, 0x17, 0x8c, 0x68, 0xc2, 0xf8, 0x0c, 0x17, 0x28, 0xee, 0xb0, 0x0f, + 0xa5, 0x68, 0x47, 0x20, 0xa5, 0xda, 0x36, 0x43, 0xc8, 0x50, 0x84, 0x41, 0xd5, 0xb6, 0x69, 0xd7, + 0x29, 0x18, 0xa3, 0x3a, 0x3a, 0xd8, 0x6d, 0x18, 0x1e, 0x67, 0x32, 0x44, 0x71, 0x46, 0x49, 0x87, + 0xc2, 0xe0, 0x14, 0xf7, 0x2e, 0x18, 0xc6, 0xd7, 0xf4, 0x2a, 0x36, 0x35, 0xcc, 0xf0, 0x86, 0x29, + 0xde, 0x90, 0x00, 0x52, 0xa4, 0xfb, 0x20, 0x6b, 0x3b, 0x96, 0x6d, 0xb9, 0xd8, 0xa9, 0xa8, 0xd5, + 0xaa, 0x83, 0x5d, 0x37, 0x37, 0xc2, 0xf8, 0x09, 0xf8, 0x2c, 0x03, 0xcb, 0x0f, 0x40, 0x62, 0x5e, + 0xf5, 0x54, 0x92, 0xc3, 0xbc, 0x5d, 0xb6, 0x04, 0x0c, 0x29, 0xe4, 0x67, 0xdb, 0x70, 0xfb, 0x6e, + 0x0c, 0x12, 0x57, 0x2c, 0x0f, 0xa3, 0x47, 0x42, 0xeb, 0xce, 0x48, 0x3b, 0x1f, 0x5f, 0xd7, 0x6b, + 0x26, 0xae, 0x2e, 0xbb, 0xb5, 0xd0, 0xab, 0x78, 0x81, 0x8b, 0xc5, 0x22, 0x2e, 0x36, 0x01, 0x49, + 0xc7, 0x6a, 0x98, 0x55, 0x71, 0x59, 0x84, 0x36, 0x50, 0x19, 0x52, 0xbe, 0xe7, 0x24, 0xba, 0x79, + 0xce, 0x28, 0xf1, 0x1c, 0xe2, 0xd7, 0x1c, 0xa0, 0x0c, 0x6e, 0x71, 0x07, 0x2a, 0x41, 0xda, 0x4f, + 0x68, 0xdc, 0x03, 0x7b, 0x73, 0xe2, 0x80, 0x0c, 0xdd, 0x0f, 0x63, 0xbe, 0x3f, 0xf8, 0x06, 0x65, + 0x5e, 0x98, 0xf5, 0x3b, 0xb8, 0x45, 0x23, 0xae, 0xc6, 0x5f, 0x0b, 0x1c, 0xa4, 0x7a, 0x05, 0xae, + 0xc6, 0x5e, 0x0d, 0x3c, 0x06, 0x69, 0x57, 0xaf, 0x99, 0xaa, 0xd7, 0x70, 0x30, 0xf7, 0xc6, 0x00, + 0x20, 0xff, 0x54, 0x0c, 0x06, 0x98, 0x77, 0x87, 0xec, 0x26, 0xb5, 0xb7, 0x5b, 0xac, 0x93, 0xdd, + 0xe2, 0x07, 0xb7, 0xdb, 0x2c, 0x80, 0x2f, 0x8c, 0xcb, 0x5f, 0xeb, 0x3a, 0xda, 0xca, 0x88, 0x89, + 0xb8, 0xae, 0xd7, 0x78, 0xf0, 0x86, 0x88, 0x7c, 0x0f, 0x4a, 0x86, 0xf2, 0xe4, 0x79, 0x48, 0x6f, + 0xe9, 0x5e, 0x45, 0x25, 0xd5, 0x29, 0x35, 0x61, 0xe6, 0xf4, 0x54, 0xa1, 0x5d, 0x19, 0x5b, 0x10, + 0x35, 0xac, 0x92, 0xda, 0xe2, 0xbf, 0xe4, 0xff, 0x28, 0x91, 0xc5, 0x98, 0x0f, 0x88, 0x66, 0x61, + 0x58, 0x28, 0x5a, 0xd9, 0x36, 0xd4, 0x1a, 0x77, 0xc6, 0xe3, 0x1d, 0xb5, 0xbd, 0x60, 0xa8, 0x35, + 0x25, 0xc3, 0x15, 0x24, 0x8d, 0xf6, 0x13, 0x1b, 0xeb, 0x30, 0xb1, 0x11, 0x4f, 0x8a, 0x1f, 0xcc, + 0x93, 0x22, 0x73, 0x9e, 0x68, 0x9e, 0xf3, 0xaf, 0xc6, 0x68, 0x51, 0x66, 0x5b, 0xae, 0x6a, 0xbc, + 0x15, 0x21, 0x76, 0x14, 0xd2, 0xb6, 0x65, 0x54, 0x58, 0x0f, 0xbb, 0x95, 0x95, 0xb2, 0x2d, 0x43, + 0x69, 0xf1, 0xa3, 0xe4, 0x6d, 0x8a, 0xbf, 0x81, 0xdb, 0x60, 0xb5, 0xc1, 0x66, 0xab, 0x39, 0x30, + 0xc4, 0x4c, 0xc1, 0x17, 0xcc, 0x87, 0x88, 0x0d, 0xe8, 0x0a, 0x2c, 0xb5, 0x2e, 0xf0, 0x4c, 0x6c, + 0x86, 0xa9, 0x70, 0x3c, 0x42, 0xc1, 0xd6, 0x97, 0x76, 0xd5, 0x7c, 0xd8, 0xcf, 0x15, 0x8e, 0x27, + 0xff, 0x53, 0x09, 0xd2, 0x54, 0xd5, 0x65, 0xec, 0xa9, 0x11, 0x53, 0x49, 0x07, 0x37, 0xd5, 0x71, + 0x00, 0xc6, 0xc6, 0xd5, 0x6f, 0x60, 0x3e, 0x81, 0x69, 0x0a, 0x59, 0xd7, 0x6f, 0x60, 0x74, 0xd6, + 0xd7, 0x2b, 0xbe, 0xbf, 0x5e, 0x3c, 0x14, 0x85, 0x76, 0x77, 0xc0, 0x20, 0xfd, 0x2a, 0xc1, 0x2e, + 0xbb, 0x96, 0x18, 0xa7, 0xef, 0x2c, 0x6e, 0xec, 0xba, 0xf2, 0x33, 0x30, 0xb8, 0xb1, 0xcb, 0xb6, + 0x52, 0x47, 0x21, 0xed, 0x58, 0x16, 0x5f, 0x5f, 0x59, 0x5d, 0x93, 0x22, 0x00, 0xba, 0x9c, 0x88, + 0xed, 0x43, 0x2c, 0xd8, 0x3e, 0x04, 0xfb, 0x9f, 0x78, 0x4f, 0xfb, 0x9f, 0x53, 0xff, 0x4e, 0x82, + 0x4c, 0x28, 0x0c, 0xd1, 0xc3, 0x70, 0xb8, 0xb4, 0xb4, 0x3a, 0x77, 0xb9, 0xb2, 0x38, 0x5f, 0xb9, + 0xb0, 0x34, 0xbb, 0x10, 0x5c, 0xef, 0xcd, 0x4f, 0x3e, 0xff, 0xe2, 0x09, 0x14, 0xc2, 0xdd, 0x34, + 0xaf, 0x92, 0xfd, 0x31, 0x9a, 0x81, 0x89, 0x28, 0xc9, 0x6c, 0x69, 0xbd, 0xbc, 0xb2, 0x91, 0x95, + 0xf2, 0x87, 0x9f, 0x7f, 0xf1, 0xc4, 0x58, 0x88, 0x62, 0x76, 0xcb, 0xc5, 0xa6, 0xd7, 0x4a, 0x30, + 0xb7, 0xba, 0xbc, 0xbc, 0xb8, 0x91, 0x8d, 0xb5, 0x10, 0xf0, 0x44, 0x7b, 0x1f, 0x8c, 0x45, 0x09, + 0x56, 0x16, 0x97, 0xb2, 0xf1, 0x3c, 0x7a, 0xfe, 0xc5, 0x13, 0x23, 0x21, 0xec, 0x15, 0xdd, 0xc8, + 0xa7, 0x7e, 0xe2, 0x4b, 0x53, 0x87, 0x7e, 0xfe, 0xaf, 0x4d, 0x49, 0x44, 0xb3, 0xe1, 0x48, 0x28, + 0xa2, 0x07, 0xe0, 0x8e, 0xf5, 0xc5, 0x85, 0x95, 0xf2, 0x7c, 0x65, 0x79, 0x7d, 0xa1, 0xc2, 0xde, + 0x6b, 0xf6, 0xb5, 0x1b, 0x7d, 0xfe, 0xc5, 0x13, 0x19, 0xae, 0x52, 0x27, 0xec, 0x35, 0xa5, 0x7c, + 0x65, 0x75, 0xa3, 0x9c, 0x95, 0x18, 0xf6, 0x9a, 0x83, 0xaf, 0x59, 0x1e, 0xfb, 0x6c, 0xc9, 0x43, + 0x70, 0xa4, 0x0d, 0xb6, 0xaf, 0xd8, 0xd8, 0xf3, 0x2f, 0x9e, 0x18, 0x5e, 0x73, 0x30, 0x73, 0x53, + 0x4a, 0x51, 0x80, 0x5c, 0x2b, 0xc5, 0xea, 0xda, 0xea, 0xfa, 0xec, 0x52, 0xf6, 0x44, 0x3e, 0xfb, + 0xfc, 0x8b, 0x27, 0x86, 0x44, 0xce, 0x21, 0xf8, 0x81, 0x66, 0xa5, 0x27, 0x3b, 0xee, 0x5f, 0x1e, + 0xeb, 0x7f, 0xff, 0x12, 0x3d, 0xf1, 0xf9, 0x8b, 0x31, 0x98, 0x6a, 0xb9, 0x44, 0xc9, 0x8f, 0x1e, + 0x3b, 0x1d, 0xf8, 0x14, 0x21, 0x35, 0x2f, 0x4e, 0x34, 0xfb, 0x3d, 0xef, 0xf9, 0xd9, 0x3e, 0xcf, + 0x7b, 0x86, 0xc5, 0x48, 0xe2, 0xb8, 0xe7, 0x54, 0xf7, 0xe3, 0x1e, 0x21, 0xff, 0x01, 0x4e, 0x7b, + 0x3e, 0xfe, 0x30, 0xdc, 0xcd, 0x0f, 0xc9, 0x5c, 0x4f, 0xbd, 0xaa, 0x9b, 0x35, 0xff, 0x28, 0x92, + 0xb7, 0xb9, 0x51, 0x26, 0xf9, 0x69, 0xa4, 0x80, 0xee, 0x7b, 0x20, 0x99, 0xdf, 0x77, 0x83, 0xd8, + 0x7d, 0xe3, 0xd7, 0x65, 0x86, 0xf2, 0x5d, 0x8e, 0x4e, 0xe5, 0x4f, 0x4a, 0x30, 0x72, 0x51, 0x77, + 0x3d, 0xcb, 0xd1, 0x35, 0xd5, 0xa0, 0xb7, 0x95, 0xcf, 0xf6, 0x9a, 0x9b, 0x9b, 0x72, 0xd8, 0x13, + 0x30, 0x70, 0x4d, 0x35, 0x5c, 0xec, 0xf1, 0xcb, 0xfa, 0x77, 0x16, 0xda, 0x1b, 0xa2, 0xe0, 0x17, + 0xe7, 0x82, 0x01, 0x23, 0x93, 0x7f, 0x31, 0x06, 0xa3, 0x34, 0xca, 0x5d, 0xf6, 0x39, 0x0d, 0xb2, + 0x11, 0x2c, 0x41, 0xc2, 0x51, 0x3d, 0x7e, 0x78, 0x52, 0x2a, 0xf0, 0x43, 0xce, 0x7b, 0xba, 0x1f, + 0x5c, 0x16, 0xe6, 0xb1, 0xa6, 0x50, 0x5a, 0xf4, 0x23, 0x90, 0xaa, 0xab, 0xbb, 0x15, 0xca, 0x87, + 0x6d, 0xaf, 0x66, 0xfb, 0xe3, 0x73, 0xeb, 0xe6, 0xf4, 0xe8, 0x9e, 0x5a, 0x37, 0x8a, 0xb2, 0xe0, + 0x23, 0x2b, 0x83, 0x75, 0x75, 0x97, 0x88, 0x88, 0x6c, 0x18, 0x25, 0x50, 0x6d, 0x47, 0x35, 0x6b, + 0x98, 0x0d, 0x42, 0x8f, 0x82, 0x4a, 0x17, 0xfb, 0x1e, 0x64, 0x32, 0x18, 0x24, 0xc4, 0x4e, 0x56, + 0x86, 0xeb, 0xea, 0xee, 0x1c, 0x05, 0x90, 0x11, 0x8b, 0xa9, 0x17, 0x5e, 0x9a, 0x3e, 0x44, 0x0f, + 0x8e, 0x5f, 0x91, 0x00, 0x02, 0x8b, 0xa1, 0x1f, 0x81, 0xac, 0xe6, 0xb7, 0x28, 0xad, 0xcb, 0xe7, + 0xf0, 0xde, 0x4e, 0x73, 0xd1, 0x64, 0x6f, 0xb6, 0xb6, 0xbf, 0x7c, 0x73, 0x5a, 0x52, 0x46, 0xb5, + 0xa6, 0xa9, 0xf8, 0x20, 0x64, 0x1a, 0x76, 0x55, 0xf5, 0x70, 0x85, 0x6e, 0x36, 0x63, 0x5d, 0xeb, + 0x84, 0x29, 0xc2, 0xeb, 0xd6, 0xcd, 0x69, 0xc4, 0xd4, 0x0a, 0x11, 0xcb, 0xb4, 0x7a, 0x00, 0x06, + 0x21, 0x04, 0x21, 0x9d, 0x7e, 0x47, 0x82, 0xcc, 0x7c, 0xe8, 0xd6, 0x40, 0x0e, 0x06, 0xeb, 0x96, + 0xa9, 0x5f, 0xe5, 0xfe, 0x98, 0x56, 0x44, 0x13, 0xe5, 0x21, 0xc5, 0x5e, 0xe0, 0xf0, 0xf6, 0xc4, + 0x91, 0x90, 0x68, 0x13, 0xaa, 0xeb, 0x78, 0xcb, 0xd5, 0xc5, 0x6c, 0x28, 0xa2, 0x89, 0x2e, 0x40, + 0xd6, 0xc5, 0x5a, 0xc3, 0xd1, 0xbd, 0xbd, 0x8a, 0x66, 0x99, 0x9e, 0xaa, 0x79, 0xec, 0x55, 0x80, + 0xd2, 0xd1, 0x5b, 0x37, 0xa7, 0xef, 0x60, 0xb2, 0x36, 0x63, 0xc8, 0xca, 0xa8, 0x00, 0xcd, 0x31, + 0x08, 0x19, 0xa1, 0x8a, 0x3d, 0x55, 0x37, 0x5c, 0x5a, 0x7a, 0xa5, 0x15, 0xd1, 0x0c, 0xe9, 0xf2, + 0x8f, 0x07, 0x21, 0xed, 0x7b, 0x3b, 0xba, 0x0e, 0x59, 0xcb, 0xc6, 0x4e, 0xa4, 0x90, 0xa5, 0xeb, + 0x78, 0x69, 0x29, 0x18, 0xb9, 0x19, 0x43, 0xfe, 0xff, 0x37, 0xa7, 0x1f, 0xec, 0xc1, 0x83, 0xae, + 0xa8, 0x06, 0x2f, 0x82, 0x95, 0x51, 0xc1, 0x43, 0x54, 0xc5, 0x17, 0x88, 0x5f, 0x88, 0xed, 0xaf, + 0xdd, 0xd8, 0x12, 0x47, 0x8f, 0x11, 0x95, 0x9b, 0x31, 0x64, 0xe2, 0x01, 0x1c, 0xb4, 0x46, 0x21, + 0xa4, 0x72, 0x7d, 0x46, 0xd5, 0x0d, 0xf1, 0x56, 0x9b, 0xc2, 0x5b, 0x68, 0x11, 0x06, 0x5c, 0x4f, + 0xf5, 0x1a, 0xac, 0x78, 0x49, 0x96, 0x1e, 0xee, 0x51, 0xe6, 0x92, 0x65, 0x56, 0xd7, 0x29, 0xa1, + 0xc2, 0x19, 0xa0, 0x0b, 0x30, 0xe0, 0x59, 0x57, 0xb1, 0xc9, 0x8d, 0xda, 0x57, 0xc4, 0xd3, 0x87, + 0x34, 0x8c, 0x1a, 0x79, 0x90, 0xad, 0x62, 0x03, 0xd7, 0xa8, 0x29, 0xdd, 0x1d, 0x95, 0x6c, 0x90, + 0xe8, 0x97, 0x65, 0x4a, 0x8b, 0x7d, 0x87, 0x25, 0x37, 0x50, 0x33, 0x3f, 0x59, 0x19, 0xf5, 0x41, + 0xeb, 0x14, 0x82, 0x2e, 0x47, 0x2e, 0xbc, 0xf0, 0xcf, 0x2f, 0xdd, 0xd5, 0x29, 0xf6, 0x42, 0x5e, + 0x2e, 0x8e, 0x55, 0xc2, 0xd7, 0x65, 0x2e, 0x40, 0xb6, 0x61, 0x6e, 0x59, 0x26, 0x7d, 0x13, 0x85, + 0xef, 0x18, 0xc8, 0x16, 0x34, 0x1e, 0x9e, 0xb5, 0x66, 0x0c, 0x59, 0x19, 0xf5, 0x41, 0x17, 0xd9, + 0xbe, 0xa2, 0x0a, 0x23, 0x01, 0x16, 0x0d, 0xdd, 0x74, 0xd7, 0xd0, 0xbd, 0x93, 0x87, 0xee, 0xe1, + 0xe6, 0x51, 0x82, 0xe8, 0x1d, 0xf6, 0x81, 0x84, 0x0c, 0x5d, 0x04, 0x08, 0x12, 0x06, 0x3d, 0x5e, + 0xc9, 0x9c, 0x96, 0xbb, 0x67, 0x1d, 0xb1, 0x25, 0x0d, 0x68, 0xd1, 0x87, 0x61, 0xbc, 0xae, 0x9b, + 0x15, 0x17, 0x1b, 0xdb, 0x15, 0x6e, 0x60, 0xc2, 0x92, 0x7e, 0x49, 0xa0, 0xb4, 0xd4, 0x9f, 0x3f, + 0xdc, 0xba, 0x39, 0x9d, 0xe7, 0x49, 0xb5, 0x95, 0xa5, 0xac, 0x8c, 0xd5, 0x75, 0x73, 0x1d, 0x1b, + 0xdb, 0xf3, 0x3e, 0xac, 0x38, 0xf4, 0x13, 0x2f, 0x4d, 0x1f, 0xf2, 0x03, 0x58, 0x87, 0xa1, 0x20, + 0xb0, 0xb0, 0x8b, 0x56, 0x21, 0xad, 0x8a, 0x06, 0x3b, 0x88, 0xe9, 0xd9, 0xd9, 0x43, 0x01, 0x1a, + 0xf0, 0x60, 0xb9, 0xe2, 0xb9, 0xff, 0x70, 0x42, 0x92, 0x9f, 0x8f, 0xc1, 0xc0, 0xfc, 0x95, 0x35, + 0x55, 0x77, 0xd0, 0x0d, 0x18, 0x0b, 0x9c, 0x2d, 0x9a, 0x29, 0x96, 0x6f, 0xdd, 0x9c, 0xce, 0x35, + 0xfb, 0x63, 0x9f, 0xa9, 0x62, 0x56, 0xd3, 0x84, 0x24, 0x41, 0x90, 0x88, 0x5c, 0x71, 0xa3, 0xe3, + 0x76, 0x3b, 0x3c, 0x76, 0x0b, 0xca, 0x01, 0xd2, 0x54, 0xcb, 0xee, 0x3d, 0x94, 0x38, 0xcb, 0x30, + 0xc8, 0x6c, 0xe1, 0xa2, 0x22, 0x24, 0x6d, 0xf2, 0x83, 0x3f, 0xfa, 0x98, 0xea, 0x18, 0x4d, 0x14, + 0xdf, 0x3f, 0x10, 0x26, 0x24, 0xf2, 0x17, 0xe3, 0x00, 0xf3, 0x57, 0xae, 0x6c, 0x38, 0xba, 0x6d, + 0x60, 0xef, 0x07, 0x6a, 0xd7, 0x8f, 0x4b, 0x70, 0x38, 0xb0, 0x9a, 0xeb, 0x68, 0x4d, 0xc6, 0x7d, + 0xf2, 0xd6, 0xcd, 0xe9, 0x63, 0xcd, 0xc6, 0x0d, 0xa1, 0x1d, 0xc0, 0xc0, 0xe3, 0x3e, 0xa3, 0x75, + 0x47, 0x6b, 0x2f, 0x47, 0xd5, 0xf5, 0x7c, 0x39, 0xe2, 0x9d, 0xe5, 0x08, 0xa1, 0xbd, 0x21, 0x39, + 0xe6, 0x5d, 0xaf, 0x75, 0xae, 0xd7, 0x21, 0x13, 0xcc, 0x91, 0x8b, 0xe6, 0x21, 0xe5, 0xf1, 0xdf, + 0x7c, 0xca, 0xe5, 0xce, 0x53, 0x2e, 0xc8, 0xf8, 0xb4, 0xfb, 0x94, 0xf2, 0xbf, 0x8d, 0x01, 0x04, + 0x51, 0xfd, 0x67, 0x35, 0xa2, 0xc8, 0x72, 0xca, 0x17, 0xbf, 0xf8, 0x81, 0x0a, 0x68, 0x4e, 0x1d, + 0x9a, 0xad, 0x3f, 0x8c, 0xc1, 0xf8, 0xa6, 0xc8, 0xfc, 0xef, 0x58, 0x18, 0xad, 0xc1, 0x20, 0x36, + 0x3d, 0x47, 0xa7, 0x26, 0x26, 0xde, 0xfa, 0x50, 0x27, 0x6f, 0x6d, 0x63, 0x35, 0xfa, 0xb1, 0x0c, + 0xf1, 0x34, 0x88, 0xb3, 0x09, 0xd9, 0xfa, 0x53, 0x71, 0xc8, 0x75, 0xa2, 0x42, 0x73, 0x30, 0xaa, + 0x39, 0x98, 0x02, 0x2a, 0xe1, 0xa3, 0xe7, 0x52, 0x3e, 0xd8, 0x49, 0x34, 0x21, 0xc8, 0xca, 0x88, + 0x80, 0xf0, 0xda, 0xa0, 0x06, 0xa4, 0xcc, 0x27, 0x21, 0x43, 0xb0, 0x7a, 0xac, 0xeb, 0x65, 0x5e, + 0x1c, 0x88, 0x41, 0xa2, 0x0c, 0x58, 0x75, 0x30, 0x12, 0x40, 0x69, 0x79, 0xf0, 0x2c, 0x8c, 0xea, + 0xa6, 0xee, 0xe9, 0xaa, 0x51, 0xd9, 0x52, 0x0d, 0xd5, 0xd4, 0x0e, 0xb2, 0x4b, 0x62, 0x0b, 0x3a, + 0x1f, 0xb6, 0x89, 0x9d, 0xac, 0x8c, 0x70, 0x48, 0x89, 0x01, 0xd0, 0x45, 0x18, 0x14, 0x43, 0x25, + 0x0e, 0x54, 0x4b, 0x0a, 0xf2, 0xd0, 0x8c, 0xfc, 0x64, 0x1c, 0xc6, 0x14, 0x5c, 0x7d, 0x67, 0x2a, + 0xfa, 0x9b, 0x8a, 0x65, 0x00, 0x96, 0x48, 0xc8, 0x4a, 0x72, 0x80, 0xd9, 0x20, 0xa9, 0x28, 0xcd, + 0x38, 0xcc, 0xbb, 0x5e, 0x68, 0x3e, 0xfe, 0x28, 0x0e, 0x43, 0xe1, 0xf9, 0x78, 0x67, 0x89, 0xff, + 0xe1, 0x59, 0xe2, 0xd1, 0x62, 0x90, 0x1a, 0x13, 0xfc, 0xa3, 0x87, 0x1d, 0x52, 0x63, 0x4b, 0x48, + 0x75, 0xce, 0x89, 0xff, 0x3b, 0x06, 0x03, 0x6b, 0xaa, 0xa3, 0xd6, 0x5d, 0xa4, 0xb5, 0x6c, 0x6c, + 0xc4, 0xc1, 0x7e, 0xcb, 0xd7, 0x6a, 0xf9, 0xa1, 0x58, 0x97, 0x7d, 0xcd, 0x0b, 0x6d, 0xf6, 0x35, + 0xef, 0x83, 0x91, 0xba, 0xba, 0x1b, 0x7a, 0xd6, 0x4c, 0x27, 0x73, 0xb8, 0x74, 0x24, 0xe0, 0x12, + 0xed, 0x67, 0xc7, 0x35, 0xc1, 0x03, 0x68, 0xf4, 0x18, 0x64, 0x08, 0x46, 0xb0, 0x4a, 0x10, 0xf2, + 0xc9, 0xe0, 0x5c, 0x24, 0xd4, 0x29, 0x2b, 0x50, 0x57, 0x77, 0xcb, 0xac, 0x81, 0x96, 0x00, 0xed, + 0xf8, 0x47, 0x73, 0x95, 0xc0, 0x94, 0x84, 0xfe, 0xf8, 0xad, 0x9b, 0xd3, 0x47, 0x18, 0x7d, 0x2b, + 0x8e, 0xac, 0x8c, 0x05, 0x40, 0xc1, 0xed, 0x0c, 0x00, 0xd1, 0xab, 0xc2, 0xae, 0x2a, 0xb2, 0xdd, + 0xf5, 0xe1, 0x5b, 0x37, 0xa7, 0xc7, 0x18, 0x97, 0xa0, 0x4f, 0x56, 0xd2, 0xa4, 0x31, 0x4f, 0x7e, + 0x87, 0x0c, 0xff, 0x25, 0x09, 0x50, 0xb0, 0x06, 0x29, 0xd8, 0xb5, 0x2d, 0xd3, 0xa5, 0xfb, 0xbe, + 0xd0, 0x26, 0x4d, 0xda, 0x7f, 0xdf, 0x17, 0xd0, 0x8b, 0x7d, 0x5f, 0x28, 0x74, 0x1f, 0x0f, 0xf2, + 0x75, 0x8c, 0xcf, 0x63, 0x9b, 0x7b, 0x9d, 0x85, 0x39, 0x4b, 0x17, 0xd4, 0x6d, 0x12, 0xf4, 0xbf, + 0x90, 0xe0, 0x48, 0x8b, 0x37, 0xf9, 0xc2, 0xfe, 0x39, 0x40, 0x4e, 0xa8, 0x93, 0x7f, 0xbc, 0x8a, + 0x09, 0xdd, 0xb7, 0x73, 0x8e, 0x39, 0x2d, 0x0b, 0xc1, 0xed, 0x5b, 0x72, 0xd8, 0xc5, 0xd0, 0x7f, + 0x22, 0xc1, 0x44, 0x78, 0x78, 0x5f, 0x91, 0x15, 0x18, 0x0a, 0x8f, 0xce, 0x55, 0xb8, 0xbb, 0x17, + 0x15, 0xb8, 0xf4, 0x11, 0x7a, 0xf4, 0x64, 0x10, 0xaa, 0xec, 0xf0, 0xf6, 0xe1, 0x9e, 0xad, 0x21, + 0x64, 0x6a, 0x0e, 0x59, 0xa6, 0xc1, 0x9f, 0x48, 0x90, 0x58, 0xb3, 0x2c, 0x03, 0x59, 0x30, 0x66, + 0x5a, 0x5e, 0x85, 0x78, 0x16, 0xae, 0x56, 0xf8, 0x19, 0x0f, 0x3b, 0xd5, 0x9d, 0xeb, 0xcf, 0x48, + 0xdf, 0xbb, 0x39, 0xdd, 0xca, 0x4a, 0x19, 0x35, 0x2d, 0xaf, 0x44, 0x21, 0x1b, 0xec, 0x04, 0xe8, + 0xc3, 0x30, 0x1c, 0x1d, 0x8c, 0x9d, 0x78, 0x3d, 0xd5, 0xf7, 0x60, 0x51, 0x36, 0xb7, 0x6e, 0x4e, + 0x4f, 0x04, 0x11, 0xe3, 0x83, 0x65, 0x65, 0x68, 0x2b, 0x34, 0x7a, 0x31, 0x45, 0xb4, 0xff, 0xe3, + 0x97, 0xa6, 0xa5, 0xd2, 0x85, 0x8e, 0x4f, 0x68, 0x1e, 0xd8, 0x57, 0x84, 0x5d, 0xff, 0x31, 0x43, + 0xf4, 0xb1, 0xcc, 0x0b, 0xe3, 0x30, 0xdd, 0xe1, 0x39, 0x84, 0xb7, 0x7b, 0xa0, 0x47, 0x10, 0x5d, + 0x9e, 0x11, 0xe4, 0x7b, 0x7a, 0xec, 0x21, 0xbf, 0x9e, 0x00, 0xb4, 0xec, 0xd6, 0xe6, 0x48, 0x55, + 0x83, 0x83, 0x43, 0xcf, 0xa6, 0x23, 0x31, 0xe9, 0x0d, 0x1d, 0x89, 0x2d, 0x47, 0x0e, 0x99, 0x62, + 0xfd, 0x1d, 0x6d, 0xf7, 0x7c, 0xd2, 0x14, 0x7f, 0x4b, 0x4e, 0x9a, 0xda, 0x97, 0x2a, 0x89, 0x1f, + 0xe0, 0x8e, 0x29, 0xf9, 0xd6, 0xec, 0x98, 0x26, 0x61, 0x80, 0x9f, 0x41, 0xb3, 0x4f, 0x7d, 0xf3, + 0x16, 0x7a, 0x54, 0x7c, 0x21, 0x79, 0xb0, 0xb7, 0xec, 0xcf, 0xb0, 0x79, 0x9e, 0xf9, 0x5a, 0x1c, + 0xb2, 0xcb, 0x6e, 0xad, 0x5c, 0xd5, 0xbd, 0x37, 0xc9, 0xf7, 0xec, 0xce, 0x9b, 0xcc, 0xb9, 0x5b, + 0x37, 0xa7, 0x47, 0x98, 0xc9, 0x6e, 0xa7, 0xa1, 0xea, 0x30, 0xda, 0xf4, 0x38, 0x87, 0xbb, 0xe6, + 0xfc, 0x41, 0x9e, 0x2a, 0x35, 0xb1, 0x92, 0xe9, 0xbe, 0x20, 0x14, 0x20, 0x68, 0xb7, 0x7d, 0x34, + 0xb0, 0x85, 0xec, 0xe2, 0x9b, 0x79, 0xe6, 0xca, 0xa6, 0xf0, 0xeb, 0x31, 0xc8, 0x2c, 0xbb, 0x62, + 0x9f, 0x8b, 0xff, 0xcc, 0x9e, 0x28, 0x3c, 0xe6, 0xbf, 0x38, 0x12, 0xef, 0x2d, 0x10, 0xa2, 0x2f, + 0x93, 0x7c, 0x2b, 0x4e, 0xf3, 0x70, 0x09, 0xd7, 0x74, 0xd3, 0x5f, 0xac, 0xf1, 0x3b, 0x1b, 0xa3, + 0x1f, 0xa2, 0x8d, 0x51, 0x30, 0xc3, 0x89, 0x83, 0xcc, 0xf0, 0x6f, 0xc5, 0x60, 0x78, 0xd9, 0xad, + 0x6d, 0x9a, 0xd5, 0x77, 0x42, 0xe5, 0x8d, 0x84, 0xca, 0x6d, 0x2f, 0xcd, 0xbe, 0x1e, 0x83, 0x53, + 0xe1, 0x5a, 0xea, 0xd9, 0x06, 0x76, 0xf6, 0xfc, 0x72, 0xc9, 0x56, 0x6b, 0xba, 0x19, 0xbe, 0x3d, + 0x73, 0x24, 0x2c, 0x2c, 0xc5, 0x15, 0x22, 0xcb, 0x26, 0x64, 0xd6, 0xd4, 0x1a, 0x56, 0xf0, 0xb3, + 0x0d, 0xec, 0x7a, 0x6d, 0xde, 0x6d, 0x99, 0x84, 0x01, 0x6b, 0x7b, 0x9b, 0x5d, 0xb6, 0x90, 0x4e, + 0x26, 0x14, 0xde, 0x42, 0x13, 0x90, 0x34, 0xf4, 0xba, 0xce, 0x0c, 0x92, 0x50, 0x58, 0x03, 0x4d, + 0x43, 0x46, 0x23, 0x7a, 0x57, 0xd8, 0x95, 0xfd, 0x84, 0xf8, 0x76, 0x47, 0xc3, 0xf4, 0x36, 0x08, + 0x44, 0x7e, 0x02, 0x86, 0xd8, 0x78, 0x7c, 0x7f, 0x71, 0x04, 0x52, 0xf4, 0x8a, 0x75, 0x30, 0xea, + 0x20, 0x69, 0x5f, 0x66, 0xef, 0xc1, 0x30, 0x2e, 0x6c, 0x60, 0xd6, 0x28, 0x95, 0x3a, 0x9a, 0xf2, + 0x64, 0xf7, 0x49, 0x66, 0x86, 0xf2, 0xcd, 0xf8, 0x9b, 0x49, 0x38, 0xcc, 0xaf, 0xb5, 0xa8, 0xb6, + 0x3e, 0xb3, 0xe3, 0x79, 0xe2, 0x05, 0x33, 0xe0, 0x1b, 0x7b, 0xd5, 0xd6, 0xe5, 0x3d, 0x48, 0x5c, + 0xf4, 0x3c, 0x1b, 0x9d, 0x82, 0xa4, 0xd3, 0x30, 0xb0, 0x78, 0x58, 0x30, 0x51, 0x08, 0x70, 0x0a, + 0x04, 0x41, 0x69, 0x18, 0x58, 0x61, 0x28, 0xa8, 0x0c, 0xd3, 0xdb, 0x0d, 0xc3, 0xd8, 0xab, 0x54, + 0x31, 0xfd, 0x77, 0x4a, 0xfe, 0x7f, 0x2e, 0xc0, 0xbb, 0xb6, 0x6a, 0xfa, 0x45, 0x65, 0x4a, 0x39, + 0x46, 0xd1, 0xe6, 0x29, 0x96, 0xf8, 0xaf, 0x05, 0x65, 0x81, 0x23, 0xff, 0x7e, 0x0c, 0x52, 0x82, + 0x35, 0x7d, 0x31, 0x05, 0x1b, 0x58, 0xf3, 0x2c, 0x71, 0x41, 0xc1, 0x6f, 0x23, 0x04, 0xf1, 0x1a, + 0x9f, 0xa2, 0xf4, 0xc5, 0x43, 0x0a, 0x69, 0x10, 0x98, 0xff, 0xba, 0x10, 0x81, 0xd9, 0x0d, 0x32, + 0x6b, 0x09, 0xdb, 0x12, 0x27, 0x63, 0x17, 0x0f, 0x29, 0xb4, 0x85, 0x72, 0x30, 0x40, 0xa2, 0xcd, + 0x63, 0xdf, 0x94, 0x24, 0x70, 0xde, 0x46, 0x93, 0x90, 0xb4, 0x55, 0x4f, 0x63, 0xd7, 0xec, 0x49, + 0x07, 0x6b, 0x92, 0x78, 0x60, 0xef, 0xf2, 0x36, 0xff, 0xaf, 0x12, 0x62, 0x0c, 0xf6, 0xd1, 0x34, + 0x22, 0xf7, 0x9a, 0xea, 0x79, 0xd8, 0x31, 0x09, 0x43, 0x86, 0x4e, 0xdf, 0x41, 0xb3, 0xaa, 0x7b, + 0xfc, 0xff, 0xa7, 0xd0, 0xdf, 0xfc, 0x3f, 0x3b, 0x50, 0x7f, 0xa8, 0xd0, 0x4e, 0xf6, 0x6f, 0xa3, + 0x86, 0x04, 0xb0, 0x44, 0x90, 0xca, 0x30, 0xae, 0x56, 0xab, 0x3a, 0xf1, 0x6a, 0xd5, 0xa8, 0x6c, + 0xe9, 0xf4, 0xe0, 0xc4, 0xa5, 0xff, 0x14, 0xac, 0xd3, 0x5c, 0xa0, 0x80, 0xa0, 0xc4, 0xf1, 0x4b, + 0x69, 0x18, 0xb4, 0x99, 0x50, 0xf2, 0x79, 0x18, 0x6b, 0x91, 0x94, 0xc8, 0x77, 0x55, 0x37, 0xab, + 0xe2, 0x1d, 0x2a, 0xf2, 0x9b, 0xc0, 0xe8, 0x87, 0x0f, 0xd9, 0xd5, 0x0f, 0xfa, 0xbb, 0xf4, 0xe3, + 0x9d, 0xef, 0x90, 0x8d, 0x84, 0xee, 0x90, 0xa9, 0xb6, 0x5e, 0x4a, 0x53, 0xfe, 0xfc, 0xea, 0xd8, + 0x2c, 0xef, 0x60, 0xd7, 0xc6, 0x0a, 0x96, 0x53, 0x9b, 0xa9, 0x61, 0x53, 0xec, 0x94, 0x48, 0x97, + 0x6a, 0xeb, 0x2e, 0x75, 0xc7, 0xe0, 0x43, 0x8c, 0xee, 0xf9, 0xd0, 0x6f, 0x7a, 0xa3, 0x2c, 0xb1, + 0x30, 0xbb, 0xb6, 0xe8, 0xfb, 0xf1, 0x6f, 0xc4, 0xe0, 0x58, 0xc8, 0x8f, 0x43, 0xc8, 0xad, 0xee, + 0x9c, 0x6f, 0xef, 0xf1, 0x3d, 0x7c, 0xc6, 0xf0, 0x32, 0x24, 0x08, 0x3e, 0xea, 0xf2, 0x7f, 0x17, + 0x72, 0xbf, 0xf4, 0xcf, 0xff, 0x91, 0x4c, 0x9d, 0xa2, 0xfd, 0xac, 0x50, 0x26, 0xa5, 0x4f, 0xf4, + 0x6e, 0xbf, 0x6c, 0xf0, 0x0d, 0x4a, 0xf7, 0xf6, 0x99, 0xb1, 0xd9, 0x86, 0x9f, 0x3f, 0x0f, 0x72, + 0x87, 0xed, 0x27, 0xcb, 0x98, 0xfb, 0x6f, 0x78, 0xfb, 0x48, 0xc7, 0x9d, 0xee, 0xe7, 0xed, 0x37, + 0x83, 0x3d, 0x6e, 0x8d, 0x77, 0x61, 0xf2, 0x49, 0x32, 0x76, 0x70, 0x28, 0x28, 0x12, 0xfb, 0xa4, + 0x7f, 0x73, 0x46, 0xe2, 0xff, 0x93, 0x4d, 0x5c, 0x83, 0x81, 0x40, 0x3e, 0xbe, 0xd1, 0xbd, 0xa7, + 0xd0, 0x71, 0xbd, 0x28, 0x84, 0x16, 0x0b, 0x25, 0x44, 0x29, 0xff, 0x82, 0x04, 0x77, 0xb4, 0x0c, + 0xcd, 0x73, 0xfc, 0x02, 0x40, 0xe8, 0x54, 0x53, 0xea, 0xef, 0xce, 0x5e, 0x88, 0x94, 0x30, 0x6a, + 0x11, 0xf6, 0xde, 0xae, 0xc2, 0x32, 0x29, 0x22, 0xd2, 0x3e, 0x0b, 0x87, 0xa3, 0xc2, 0x0a, 0x33, + 0x3d, 0x0d, 0x23, 0xd1, 0x02, 0x82, 0x17, 0x37, 0x07, 0xb8, 0x7b, 0x31, 0x1c, 0x29, 0x22, 0xe4, + 0x4a, 0xf3, 0xd4, 0xf8, 0xe6, 0x29, 0x43, 0xda, 0x47, 0xe5, 0x5b, 0xc7, 0x9e, 0xad, 0x13, 0x50, + 0xca, 0x5f, 0x97, 0xe0, 0x44, 0x74, 0x84, 0x60, 0xe3, 0xe3, 0xbe, 0xe9, 0xfa, 0xdd, 0x36, 0x47, + 0xfa, 0xae, 0x04, 0x77, 0xee, 0xa3, 0x06, 0xb7, 0xd9, 0x0d, 0x98, 0x08, 0x9d, 0xae, 0x8a, 0x85, + 0x42, 0x38, 0xd7, 0xa9, 0xee, 0xc7, 0xc2, 0xfe, 0x61, 0xe2, 0x51, 0x62, 0xc7, 0xaf, 0x7c, 0x6b, + 0x7a, 0xbc, 0xb5, 0xcf, 0x55, 0xc6, 0x5b, 0x4f, 0x44, 0x6f, 0xa3, 0x17, 0xfe, 0xae, 0x04, 0xf7, + 0x45, 0x55, 0x6d, 0xf3, 0x0c, 0xf6, 0x6d, 0x34, 0x75, 0xff, 0x5e, 0x82, 0x53, 0xbd, 0xe8, 0xc3, + 0xe7, 0x70, 0x0b, 0xc6, 0x83, 0xc7, 0x22, 0xcd, 0x53, 0x78, 0x7f, 0x1f, 0x0f, 0xb7, 0x79, 0x2c, + 0x20, 0x9f, 0xdb, 0x9b, 0x30, 0x57, 0xff, 0x52, 0xe2, 0xf1, 0x1b, 0x76, 0x13, 0x7f, 0x62, 0xa2, + 0x1b, 0x9e, 0x3e, 0x27, 0x26, 0xb4, 0xe9, 0x19, 0x8e, 0x6c, 0x7a, 0xda, 0x4c, 0x79, 0xec, 0x36, + 0x65, 0xa3, 0x6b, 0x3c, 0x5b, 0xb7, 0x79, 0xce, 0xf2, 0x41, 0x18, 0x6f, 0x13, 0x5a, 0x3c, 0x31, + 0xf5, 0x11, 0x59, 0x0a, 0x6a, 0x0d, 0x1e, 0xf9, 0xdf, 0x48, 0x30, 0x4d, 0x07, 0x6e, 0x33, 0x8d, + 0x6f, 0x67, 0x7b, 0xd6, 0x79, 0xee, 0x6d, 0xab, 0x16, 0x37, 0xec, 0x22, 0x0c, 0x30, 0x0f, 0xe5, + 0xb6, 0x3c, 0x80, 0x8b, 0x73, 0x06, 0x41, 0xae, 0x9f, 0x17, 0xfa, 0xb5, 0x4f, 0x18, 0x6f, 0x92, + 0x1d, 0x6f, 0x57, 0xc2, 0x78, 0x45, 0xe4, 0xfa, 0xf6, 0x6a, 0x70, 0xbb, 0x69, 0xb7, 0x2d, 0xd7, + 0x33, 0x23, 0xbe, 0x45, 0x49, 0xdd, 0xd7, 0xa9, 0x4b, 0x52, 0xff, 0x21, 0x9f, 0x23, 0x3f, 0xa9, + 0x77, 0xd1, 0xe7, 0xed, 0x98, 0xd4, 0xff, 0x24, 0x06, 0x47, 0xa8, 0x6e, 0xe1, 0x67, 0x8d, 0x6f, + 0xc1, 0xdc, 0x54, 0x00, 0xb9, 0x8e, 0x56, 0xb9, 0x5d, 0xb9, 0x28, 0xeb, 0x3a, 0xda, 0x95, 0xc8, + 0x8a, 0x5e, 0x01, 0x54, 0x75, 0xbd, 0xe6, 0x01, 0xe2, 0x07, 0x1e, 0xa0, 0xea, 0x7a, 0x57, 0xf6, + 0x29, 0x19, 0x12, 0x07, 0xf6, 0xae, 0x97, 0x25, 0xc8, 0xb7, 0x9b, 0x01, 0xee, 0x4d, 0x3a, 0x4c, + 0x46, 0x1e, 0xa3, 0x37, 0x3b, 0xd4, 0x03, 0xbd, 0x3c, 0x3c, 0x6e, 0x0a, 0xff, 0xc3, 0x0e, 0x7e, + 0x53, 0x13, 0xc0, 0x3f, 0x13, 0x4b, 0x9c, 0x1f, 0x30, 0xad, 0xbb, 0xb1, 0x1f, 0xfe, 0xb0, 0xff, + 0x95, 0x96, 0x15, 0xe6, 0x6d, 0xb1, 0xb1, 0xfb, 0xa6, 0x04, 0x53, 0x1d, 0xc4, 0x7e, 0x3b, 0x97, + 0x17, 0x3b, 0x1d, 0x5d, 0xea, 0x76, 0xef, 0x22, 0xcf, 0xf0, 0x78, 0x8c, 0xbe, 0xaa, 0x17, 0x3a, + 0x45, 0x68, 0xf7, 0xf1, 0x01, 0xf9, 0xfd, 0x70, 0xb4, 0x2d, 0x15, 0x97, 0xad, 0x08, 0x89, 0x1d, + 0xdd, 0xf5, 0xb8, 0x58, 0xf7, 0x74, 0x12, 0xab, 0x89, 0x9a, 0xd2, 0xc8, 0x08, 0xb2, 0x94, 0xf5, + 0x9a, 0x65, 0x19, 0x5c, 0x0c, 0xf9, 0x32, 0x8c, 0x85, 0x60, 0x7c, 0x90, 0xb3, 0x90, 0xb0, 0x2d, + 0xfe, 0x3d, 0x9f, 0xcc, 0xe9, 0x63, 0x9d, 0x06, 0x21, 0x34, 0x5c, 0x6d, 0x8a, 0x2f, 0x4f, 0x00, + 0x62, 0xcc, 0xe8, 0x5d, 0x2f, 0x31, 0xc4, 0x3a, 0x8c, 0x47, 0xa0, 0x7c, 0x90, 0x77, 0xc3, 0x80, + 0x4d, 0x21, 0x7c, 0x98, 0x8e, 0x2f, 0x09, 0x30, 0x3a, 0x51, 0xb6, 0x31, 0x9a, 0xd3, 0xdf, 0x3b, + 0x0c, 0x49, 0xca, 0x15, 0x7d, 0x46, 0x02, 0x08, 0xdd, 0xdc, 0x2a, 0x74, 0x62, 0xd3, 0xfe, 0x34, + 0x27, 0x3f, 0xd3, 0x33, 0x3e, 0xaf, 0xbb, 0x4f, 0xfd, 0xf8, 0xbf, 0xfe, 0xce, 0xcf, 0xc4, 0xee, + 0x46, 0xf2, 0x4c, 0x87, 0x73, 0xa4, 0x50, 0x30, 0x7e, 0x59, 0x0a, 0xbf, 0x4b, 0xf6, 0x60, 0x6f, + 0x43, 0x09, 0xc9, 0x0a, 0xbd, 0xa2, 0x73, 0xc1, 0xce, 0x53, 0xc1, 0x1e, 0x45, 0x8f, 0x74, 0x17, + 0x6c, 0xe6, 0x43, 0xd1, 0xe8, 0xfa, 0x08, 0xfa, 0xa6, 0x04, 0x13, 0xed, 0x8e, 0x09, 0xd0, 0xb9, + 0xde, 0xa4, 0x68, 0x2d, 0xc8, 0xf2, 0x8f, 0x1f, 0x80, 0x92, 0xab, 0xb2, 0x40, 0x55, 0x99, 0x45, + 0x4f, 0x1c, 0x40, 0x95, 0x99, 0xd0, 0xea, 0x87, 0xfe, 0x9f, 0x04, 0xc7, 0xf7, 0xdd, 0x42, 0xa3, + 0xd9, 0xde, 0xa4, 0xdc, 0xa7, 0xf2, 0xcc, 0x97, 0xde, 0x08, 0x0b, 0xae, 0xf1, 0x93, 0x54, 0xe3, + 0xcb, 0x68, 0xf1, 0x20, 0x1a, 0x07, 0x65, 0x62, 0x58, 0xf7, 0xdf, 0x96, 0x22, 0xaf, 0x53, 0xec, + 0xef, 0x4e, 0x2d, 0x7b, 0xc7, 0x2e, 0x81, 0xd1, 0xba, 0x25, 0x90, 0x9f, 0xa6, 0x2a, 0x28, 0x68, + 0xed, 0x0d, 0x4e, 0xda, 0xcc, 0x87, 0xa2, 0x8b, 0xca, 0x47, 0xd0, 0xff, 0x91, 0xda, 0xbf, 0xbf, + 0xf0, 0xd8, 0xbe, 0x22, 0x76, 0xde, 0x17, 0xe7, 0xcf, 0xf5, 0x4f, 0xc8, 0x95, 0xac, 0x53, 0x25, + 0x6b, 0x08, 0xdf, 0x6e, 0x25, 0xdb, 0x4e, 0x22, 0xfa, 0x1d, 0x09, 0x26, 0xda, 0xed, 0xe8, 0xba, + 0x84, 0xe5, 0x3e, 0x7b, 0xd9, 0x2e, 0x61, 0xb9, 0xdf, 0xf6, 0x51, 0x7e, 0x37, 0x55, 0xfe, 0x2c, + 0x3a, 0xd3, 0x49, 0xf9, 0x7d, 0x67, 0x91, 0xc4, 0xe2, 0xbe, 0x3b, 0x9f, 0x2e, 0xb1, 0xd8, 0xcb, + 0x2e, 0xb0, 0x4b, 0x2c, 0xf6, 0xb4, 0xf1, 0xea, 0x1e, 0x8b, 0xbe, 0x66, 0x3d, 0x4e, 0xa3, 0x8b, + 0x7e, 0x43, 0x82, 0xe1, 0x48, 0x5d, 0x8e, 0x1e, 0xde, 0x57, 0xd0, 0x76, 0xbb, 0xa8, 0xfc, 0xe9, + 0x7e, 0x48, 0xb8, 0x2e, 0x8b, 0x54, 0x97, 0x39, 0x34, 0x7b, 0x10, 0x5d, 0x9c, 0x88, 0xc4, 0x2f, + 0x4b, 0x30, 0xde, 0xa6, 0x84, 0xed, 0x12, 0x85, 0x9d, 0x4b, 0xf7, 0xfc, 0xb9, 0xfe, 0x09, 0xb9, + 0x56, 0x17, 0xa8, 0x56, 0xef, 0x43, 0xef, 0x3d, 0x88, 0x56, 0xa1, 0xf5, 0xf9, 0x66, 0x70, 0x3f, + 0x3a, 0x34, 0x0e, 0x3a, 0xdb, 0xa7, 0x60, 0x42, 0xa1, 0xc7, 0xfa, 0xa6, 0xe3, 0xfa, 0x3c, 0x45, + 0xf5, 0x79, 0x12, 0xad, 0xbe, 0x31, 0x7d, 0x5a, 0x97, 0xf5, 0xaf, 0xb6, 0x7e, 0x2a, 0x62, 0x7f, + 0x2f, 0x6a, 0x5b, 0xac, 0xe6, 0x1f, 0xe9, 0x8b, 0x86, 0x2b, 0x75, 0x8e, 0x2a, 0x75, 0x1a, 0x3d, + 0xd4, 0x49, 0xa9, 0xd0, 0x25, 0x78, 0xdd, 0xdc, 0xb6, 0x66, 0x3e, 0xc4, 0x4a, 0xe0, 0x8f, 0xa0, + 0x1f, 0x13, 0x17, 0x90, 0x4f, 0xee, 0x3b, 0x6e, 0xa8, 0x8e, 0xcd, 0xdf, 0xd7, 0x03, 0x26, 0x97, + 0xeb, 0x6e, 0x2a, 0xd7, 0x14, 0x3a, 0xd6, 0x49, 0x2e, 0x52, 0xcb, 0xa2, 0x4f, 0x4a, 0xfe, 0x3b, + 0x0b, 0xa7, 0xf6, 0xe7, 0x1d, 0x2e, 0x76, 0xf3, 0xf7, 0xf7, 0x84, 0xcb, 0x25, 0xb9, 0x87, 0x4a, + 0x72, 0x02, 0x4d, 0x75, 0x94, 0x84, 0x95, 0xbe, 0xb7, 0xfb, 0xce, 0xcb, 0x67, 0x53, 0x1d, 0x3f, + 0x8b, 0x52, 0xc3, 0x26, 0x76, 0x75, 0xf7, 0x40, 0x77, 0x92, 0x7b, 0x7b, 0xb0, 0xfa, 0xcd, 0x24, + 0x0c, 0x2d, 0xb0, 0x51, 0xd6, 0x3d, 0xd5, 0x7b, 0x83, 0x1b, 0x01, 0xe4, 0xf2, 0x0f, 0x19, 0xd2, + 0x2b, 0x2d, 0x15, 0xdb, 0xba, 0x8e, 0xc5, 0x5e, 0x71, 0xb1, 0xef, 0xcb, 0xc0, 0xfc, 0xfd, 0xfc, + 0x66, 0x7e, 0x32, 0xfb, 0x26, 0x22, 0xbd, 0x75, 0xb3, 0x46, 0x00, 0xe8, 0x63, 0x12, 0x1c, 0xa6, + 0x58, 0x41, 0xbc, 0x51, 0x4c, 0xf1, 0x3e, 0x61, 0x47, 0x8f, 0x59, 0x52, 0x43, 0xc7, 0x3f, 0x94, + 0x57, 0xe9, 0x6e, 0xfe, 0x7a, 0xcb, 0xb1, 0xd0, 0xe0, 0xcd, 0x6c, 0x65, 0x65, 0xdc, 0x68, 0xa1, + 0x74, 0x9b, 0x0e, 0x0d, 0x12, 0x07, 0x3f, 0x34, 0xb8, 0x04, 0x99, 0x50, 0xa6, 0xcf, 0x25, 0xbb, + 0xbc, 0xc2, 0xdb, 0x7c, 0xb2, 0x18, 0x26, 0x46, 0x9f, 0x90, 0xe0, 0x70, 0xdb, 0x45, 0x90, 0xfe, + 0x1f, 0xce, 0x3e, 0x4f, 0x2e, 0x9b, 0x8c, 0xd3, 0x96, 0xaf, 0xac, 0x4c, 0x34, 0xda, 0x55, 0x13, + 0x6b, 0x30, 0x1c, 0x59, 0xc0, 0x72, 0xe2, 0xbf, 0xe9, 0xf6, 0xfe, 0xc2, 0x45, 0x94, 0x01, 0xca, + 0x43, 0x0a, 0xef, 0xda, 0x96, 0xe3, 0xe1, 0x2a, 0xbd, 0xac, 0x93, 0x52, 0xfc, 0xb6, 0x7c, 0x1d, + 0x50, 0xeb, 0xe4, 0xa2, 0xcb, 0x30, 0x18, 0xbd, 0xda, 0x77, 0x80, 0x03, 0x0c, 0xc1, 0x01, 0x4d, + 0x40, 0x32, 0xf0, 0xef, 0xb8, 0xc2, 0x1a, 0xb7, 0x3b, 0x39, 0xfc, 0x69, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x75, 0x0a, 0xea, 0x1f, 0x47, 0x91, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) diff --git a/x/upgrade/types/query.pb.gw.go b/x/upgrade/types/query.pb.gw.go index 004a27419cb7..6d311b577828 100644 --- a/x/upgrade/types/query.pb.gw.go +++ b/x/upgrade/types/query.pb.gw.go @@ -106,6 +106,7 @@ func local_request_Query_AppliedPlan_0(ctx context.Context, marshaler runtime.Ma // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features (such as grpc.SendHeader, etc) to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { mux.Handle("GET", pattern_Query_CurrentPlan_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { From 4c1358b50f76b231c5a318fbb1068689d9e02f9c Mon Sep 17 00:00:00 2001 From: blushi Date: Mon, 31 Aug 2020 13:09:02 +0200 Subject: [PATCH 018/128] proto linting --- crypto/keys/keys.pb.go | 66 +++++++++++++++++++----------------- proto/cosmos/keys/keys.proto | 28 --------------- 2 files changed, 34 insertions(+), 60 deletions(-) delete mode 100644 proto/cosmos/keys/keys.proto diff --git a/crypto/keys/keys.pb.go b/crypto/keys/keys.pb.go index 2fdf531b549f..92e9a9063000 100644 --- a/crypto/keys/keys.pb.go +++ b/crypto/keys/keys.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: cosmos/keys/keys.proto +// source: cosmos/crypto/v1beta1/keys.proto package keys @@ -36,7 +36,7 @@ func (m *MultisigThresholdPubKey) Reset() { *m = MultisigThresholdPubKey func (m *MultisigThresholdPubKey) String() string { return proto.CompactTextString(m) } func (*MultisigThresholdPubKey) ProtoMessage() {} func (*MultisigThresholdPubKey) Descriptor() ([]byte, []int) { - return fileDescriptor_9a7b75e504952b64, []int{0} + return fileDescriptor_1e964ea87598ec3f, []int{0} } func (m *MultisigThresholdPubKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -89,7 +89,7 @@ func (m *LegacyAminoMultisigThresholdPubKey) Reset() { *m = LegacyAminoM func (m *LegacyAminoMultisigThresholdPubKey) String() string { return proto.CompactTextString(m) } func (*LegacyAminoMultisigThresholdPubKey) ProtoMessage() {} func (*LegacyAminoMultisigThresholdPubKey) Descriptor() ([]byte, []int) { - return fileDescriptor_9a7b75e504952b64, []int{1} + return fileDescriptor_1e964ea87598ec3f, []int{1} } func (m *LegacyAminoMultisigThresholdPubKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -132,6 +132,7 @@ func (m *LegacyAminoMultisigThresholdPubKey) GetPubKeys() []*types.Any { return nil } +// Secp256K1PubKey defines a secp256k1 public key type Secp256K1PubKey struct { Key github_com_cosmos_cosmos_sdk_crypto_keys_secp256k1.PubKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1.PubKey" json:"key,omitempty"` } @@ -140,7 +141,7 @@ func (m *Secp256K1PubKey) Reset() { *m = Secp256K1PubKey{} } func (m *Secp256K1PubKey) String() string { return proto.CompactTextString(m) } func (*Secp256K1PubKey) ProtoMessage() {} func (*Secp256K1PubKey) Descriptor() ([]byte, []int) { - return fileDescriptor_9a7b75e504952b64, []int{2} + return fileDescriptor_1e964ea87598ec3f, []int{2} } func (m *Secp256K1PubKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -176,6 +177,7 @@ func (m *Secp256K1PubKey) GetKey() github_com_cosmos_cosmos_sdk_crypto_keys_secp return nil } +// Secp256K1PrivKey defines a secp256k1 private key type Secp256K1PrivKey struct { Key github_com_cosmos_cosmos_sdk_crypto_keys_secp256k1.PrivKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1.PrivKey" json:"key,omitempty"` } @@ -184,7 +186,7 @@ func (m *Secp256K1PrivKey) Reset() { *m = Secp256K1PrivKey{} } func (m *Secp256K1PrivKey) String() string { return proto.CompactTextString(m) } func (*Secp256K1PrivKey) ProtoMessage() {} func (*Secp256K1PrivKey) Descriptor() ([]byte, []int) { - return fileDescriptor_9a7b75e504952b64, []int{3} + return fileDescriptor_1e964ea87598ec3f, []int{3} } func (m *Secp256K1PrivKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -227,33 +229,33 @@ func init() { proto.RegisterType((*Secp256K1PrivKey)(nil), "cosmos.crypto.Secp256K1PrivKey") } -func init() { proto.RegisterFile("cosmos/keys/keys.proto", fileDescriptor_9a7b75e504952b64) } - -var fileDescriptor_9a7b75e504952b64 = []byte{ - // 359 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x91, 0x3f, 0x4f, 0xc2, 0x40, - 0x18, 0xc6, 0x39, 0x49, 0x34, 0x1e, 0xa2, 0x84, 0x10, 0x05, 0x12, 0x5b, 0xd2, 0x89, 0xc5, 0x36, - 0x60, 0xd4, 0x48, 0xa2, 0x09, 0x5d, 0xd1, 0x48, 0x90, 0xc9, 0xc5, 0x70, 0xe5, 0x3c, 0x9a, 0xb6, - 0x5c, 0xd3, 0x6b, 0x4d, 0xee, 0x5b, 0xf8, 0x31, 0xdc, 0xfd, 0x12, 0x8e, 0x8c, 0x4e, 0x8d, 0x29, - 0xdf, 0x80, 0x91, 0xc9, 0xb4, 0x2f, 0x88, 0xa3, 0x71, 0x73, 0xb9, 0x3f, 0xef, 0xf3, 0xde, 0xef, - 0x79, 0x72, 0x2f, 0x3e, 0xb4, 0xb8, 0xf0, 0xb8, 0x30, 0x1c, 0x2a, 0x61, 0xd1, 0xfd, 0x80, 0x87, - 0xbc, 0x5c, 0x84, 0xba, 0x6e, 0x05, 0xd2, 0x0f, 0x79, 0xbd, 0xc2, 0x38, 0xe3, 0x99, 0x62, 0xa4, - 0x27, 0x68, 0xaa, 0xd7, 0x18, 0xe7, 0xcc, 0xa5, 0x46, 0x76, 0x23, 0xd1, 0x93, 0x31, 0x9a, 0x4a, - 0x90, 0xb4, 0x57, 0x84, 0x8f, 0x6e, 0x23, 0x37, 0xb4, 0x85, 0xcd, 0x86, 0x93, 0x80, 0x8a, 0x09, - 0x77, 0xc7, 0xfd, 0x88, 0xf4, 0xa8, 0x2c, 0x5f, 0xe0, 0xdd, 0x70, 0x5d, 0xaa, 0xa2, 0x06, 0x6a, - 0x16, 0xcd, 0x5a, 0x12, 0xab, 0xa8, 0xb7, 0x88, 0xd5, 0x92, 0x1c, 0x79, 0x6e, 0x47, 0xfb, 0xd6, - 0xb5, 0xc1, 0xa6, 0xb7, 0x3c, 0xc4, 0x05, 0x3f, 0x22, 0xae, 0x6d, 0x3d, 0xa6, 0x49, 0xab, 0x5b, - 0x8d, 0x7c, 0xb3, 0xd0, 0xae, 0xe8, 0x90, 0x42, 0x5f, 0xa7, 0xd0, 0xbb, 0x53, 0x69, 0x1e, 0x27, - 0xb1, 0xba, 0x03, 0x7e, 0x62, 0x11, 0xab, 0xfb, 0x80, 0xf5, 0x23, 0x92, 0xbe, 0xd4, 0x06, 0x18, - 0x38, 0xa9, 0xaa, 0xbd, 0x21, 0xac, 0xdd, 0x50, 0x36, 0xb2, 0x64, 0xd7, 0xb3, 0xa7, 0xfc, 0x9f, - 0xa4, 0x26, 0xf8, 0xe0, 0x9e, 0x5a, 0x7e, 0xfb, 0xec, 0xbc, 0xd7, 0x5a, 0x25, 0xbc, 0xc3, 0x79, - 0x87, 0xca, 0x2c, 0xdb, 0x9e, 0x79, 0xb5, 0x8c, 0xd5, 0x4b, 0x66, 0x87, 0x93, 0x88, 0xe8, 0x16, - 0xf7, 0x8c, 0xd5, 0x9c, 0x61, 0x3b, 0x11, 0x63, 0xc7, 0x80, 0xd1, 0xc2, 0xe4, 0x05, 0xa0, 0x9c, - 0x96, 0x0e, 0xac, 0x41, 0x4a, 0xd2, 0xc6, 0xb8, 0xb4, 0xf1, 0x08, 0xec, 0xe7, 0xd4, 0xa4, 0xff, - 0xd3, 0xe4, 0x7a, 0x19, 0xab, 0x9d, 0xbf, 0x98, 0x00, 0x2c, 0x73, 0x31, 0xcd, 0xf7, 0x44, 0x41, - 0xb3, 0x44, 0x41, 0x9f, 0x89, 0x82, 0x5e, 0xe6, 0x4a, 0x6e, 0x36, 0x57, 0x72, 0x1f, 0x73, 0x25, - 0xf7, 0xd0, 0xfc, 0x2d, 0x9a, 0x6c, 0x67, 0xdf, 0x78, 0xfa, 0x15, 0x00, 0x00, 0xff, 0xff, 0x17, - 0xe8, 0x4d, 0x17, 0xcf, 0x02, 0x00, 0x00, +func init() { proto.RegisterFile("cosmos/crypto/v1beta1/keys.proto", fileDescriptor_1e964ea87598ec3f) } + +var fileDescriptor_1e964ea87598ec3f = []byte{ + // 367 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x91, 0x3f, 0x4b, 0xfb, 0x40, + 0x1c, 0xc6, 0x7b, 0xbf, 0xc2, 0x4f, 0xbc, 0x5a, 0x2d, 0xa5, 0x60, 0x5b, 0x30, 0x29, 0x99, 0xba, + 0x98, 0x23, 0x15, 0x15, 0x0b, 0x0a, 0xcd, 0x5a, 0xc5, 0x52, 0x3b, 0xb9, 0x48, 0x2e, 0x3d, 0xd3, + 0x90, 0xa4, 0x17, 0x72, 0x49, 0xe1, 0xde, 0x85, 0x2f, 0xc3, 0xdd, 0x37, 0xe1, 0xd8, 0xd1, 0x29, + 0x48, 0xfa, 0x0e, 0x3a, 0x76, 0x92, 0xcb, 0x19, 0xeb, 0x28, 0x6e, 0x4e, 0xf7, 0xe7, 0x79, 0xee, + 0xf3, 0x3c, 0xdc, 0x17, 0x76, 0x6c, 0xca, 0x02, 0xca, 0x90, 0x1d, 0xf1, 0x30, 0xa6, 0x68, 0x61, + 0x60, 0x12, 0x5b, 0x06, 0xf2, 0x08, 0x67, 0x7a, 0x18, 0xd1, 0x98, 0xd6, 0xab, 0xd2, 0xa1, 0x4b, + 0x47, 0xbb, 0xe1, 0x50, 0x87, 0xe6, 0x0a, 0x12, 0x3b, 0x69, 0x6a, 0xb7, 0x1c, 0x4a, 0x1d, 0x9f, + 0xa0, 0xfc, 0x84, 0x93, 0x47, 0x64, 0xcd, 0xb9, 0x94, 0xb4, 0x67, 0x00, 0x0f, 0x6f, 0x12, 0x3f, + 0x76, 0x99, 0xeb, 0x4c, 0x66, 0x11, 0x61, 0x33, 0xea, 0x4f, 0x47, 0x09, 0x1e, 0x12, 0x5e, 0x3f, + 0x87, 0xbb, 0x71, 0x71, 0xd5, 0x04, 0x1d, 0xd0, 0xad, 0x9a, 0xad, 0x2c, 0x55, 0xc1, 0x70, 0x9d, + 0xaa, 0x35, 0x6e, 0x05, 0x7e, 0x5f, 0xfb, 0xd2, 0xb5, 0xf1, 0xd6, 0x5b, 0x9f, 0xc0, 0x4a, 0x98, + 0x60, 0xdf, 0xb5, 0x1f, 0x44, 0xd3, 0xe6, 0xbf, 0x4e, 0xb9, 0x5b, 0xe9, 0x35, 0x74, 0xd9, 0x42, + 0x2f, 0x5a, 0xe8, 0x83, 0x39, 0x37, 0x8f, 0xb2, 0x54, 0xdd, 0x91, 0x79, 0x6c, 0x9d, 0xaa, 0xfb, + 0x12, 0x1b, 0x26, 0x58, 0xbc, 0xd4, 0xc6, 0x50, 0x72, 0x84, 0xaa, 0xbd, 0x00, 0xa8, 0x5d, 0x13, + 0xc7, 0xb2, 0xf9, 0x20, 0x70, 0xe7, 0xf4, 0x8f, 0xb4, 0xc6, 0xf0, 0xe0, 0x8e, 0xd8, 0x61, 0xef, + 0xf4, 0x6c, 0x68, 0x7c, 0x36, 0xbc, 0x85, 0x65, 0x8f, 0xf0, 0xbc, 0xdb, 0x9e, 0x79, 0xb9, 0x49, + 0xd5, 0x0b, 0xc7, 0x8d, 0x67, 0x09, 0xd6, 0x6d, 0x1a, 0xa0, 0x62, 0xe2, 0xf9, 0x72, 0xcc, 0xa6, + 0x5e, 0x31, 0x7c, 0x81, 0x46, 0x4c, 0xa2, 0x3c, 0x43, 0x97, 0xac, 0xb1, 0x20, 0x69, 0x53, 0x58, + 0xdb, 0x66, 0x44, 0xee, 0x42, 0x84, 0x8c, 0xbe, 0x87, 0x5c, 0x6d, 0x52, 0xb5, 0xff, 0x9b, 0x10, + 0x09, 0xcb, 0x53, 0x4c, 0xf3, 0x35, 0x53, 0xc0, 0x32, 0x53, 0xc0, 0x7b, 0xa6, 0x80, 0xa7, 0x95, + 0x52, 0x5a, 0xae, 0x94, 0xd2, 0xdb, 0x4a, 0x29, 0xdd, 0x77, 0x7f, 0x8a, 0xc6, 0xff, 0xf3, 0x6f, + 0x3c, 0xf9, 0x08, 0x00, 0x00, 0xff, 0xff, 0x6f, 0x15, 0xa3, 0xa1, 0xd9, 0x02, 0x00, 0x00, } func (m *MultisigThresholdPubKey) Marshal() (dAtA []byte, err error) { diff --git a/proto/cosmos/keys/keys.proto b/proto/cosmos/keys/keys.proto deleted file mode 100644 index 2e09b2db5b10..000000000000 --- a/proto/cosmos/keys/keys.proto +++ /dev/null @@ -1,28 +0,0 @@ -syntax = "proto3"; -package cosmos.crypto; - -import "gogoproto/gogo.proto"; -import "google/protobuf/any.proto"; - -option go_package = "github.com/cosmos/cosmos-sdk/crypto/keys"; - -// MultisigThresholdPubKey specifies a public key type which nests multiple public -// keys and a threshold -message MultisigThresholdPubKey { - uint32 threshold = 1 [(gogoproto.customname) = "K", (gogoproto.moretags) = "yaml:\"threshold\""]; - repeated google.protobuf.Any public_keys = 2 [(gogoproto.customname) = "PubKeys", (gogoproto.moretags) = "yaml:\"pubkeys\""]; -} - -// LegacyAminoMultisigThresholdPubKey is a version of MultisigThresholdPubKey which uses legacy amino address rules -message LegacyAminoMultisigThresholdPubKey { - uint32 threshold = 1 [(gogoproto.customname) = "K", (gogoproto.moretags) = "yaml:\"threshold\""]; - repeated google.protobuf.Any public_keys = 2 [(gogoproto.customname) = "PubKeys", (gogoproto.moretags) = "yaml:\"pubkeys\""]; -} - -message Secp256K1PubKey { - bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1.PubKey"]; -} - -message Secp256K1PrivKey { - bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1.PrivKey"]; -} \ No newline at end of file From d6a27513d9f549c8154820b27bf8ff9ba32e0749 Mon Sep 17 00:00:00 2001 From: blushi Date: Mon, 31 Aug 2020 15:06:12 +0200 Subject: [PATCH 019/128] Add proto crypto file --- crypto/keys/keys.go | 21 ++++++++++++++++++ proto/cosmos/crypto/v1beta1/keys.proto | 30 ++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 proto/cosmos/crypto/v1beta1/keys.proto diff --git a/crypto/keys/keys.go b/crypto/keys/keys.go index 344530dd5ce4..dabdfda4bcc2 100644 --- a/crypto/keys/keys.go +++ b/crypto/keys/keys.go @@ -1,8 +1,11 @@ package keys import ( + fmt "fmt" + "github.com/cosmos/cosmos-sdk/crypto" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + proto "github.com/gogo/protobuf/proto" ) var ( @@ -49,3 +52,21 @@ func (m *Secp256K1PrivKey) Equals(key crypto.PrivKey) bool { func (m *Secp256K1PrivKey) Type() string { return m.Key.Type() } + +func ProtoPubKeyToAminoPubKey(msg proto.Message) (crypto.PubKey, error) { + switch msg := msg.(type) { + case *Secp256K1PubKey: + return msg.GetKey(), nil + default: + return nil, fmt.Errorf("unknown proto public key type: %v", msg) + } +} + +func AminoPubKeyToProtoPubKey(key crypto.PubKey) (proto.Message, error) { + switch key := key.(type) { + case secp256k1.PubKey: + return &Secp256K1PubKey{Key: key}, nil + default: + return nil, fmt.Errorf("unknown public key type: %v", key) + } +} diff --git a/proto/cosmos/crypto/v1beta1/keys.proto b/proto/cosmos/crypto/v1beta1/keys.proto new file mode 100644 index 000000000000..43000df8d1c6 --- /dev/null +++ b/proto/cosmos/crypto/v1beta1/keys.proto @@ -0,0 +1,30 @@ +syntax = "proto3"; +package cosmos.crypto.v1beta1; + +import "gogoproto/gogo.proto"; +import "google/protobuf/any.proto"; + +option go_package = "github.com/cosmos/cosmos-sdk/crypto/keys"; + +// MultisigThresholdPubKey specifies a public key type which nests multiple public +// keys and a threshold +message MultisigThresholdPubKey { + uint32 threshold = 1 [(gogoproto.customname) = "K", (gogoproto.moretags) = "yaml:\"threshold\""]; + repeated google.protobuf.Any public_keys = 2 [(gogoproto.customname) = "PubKeys", (gogoproto.moretags) = "yaml:\"pubkeys\""]; +} + +// LegacyAminoMultisigThresholdPubKey is a version of MultisigThresholdPubKey which uses legacy amino address rules +message LegacyAminoMultisigThresholdPubKey { + uint32 threshold = 1 [(gogoproto.customname) = "K", (gogoproto.moretags) = "yaml:\"threshold\""]; + repeated google.protobuf.Any public_keys = 2 [(gogoproto.customname) = "PubKeys", (gogoproto.moretags) = "yaml:\"pubkeys\""]; +} + +// Secp256K1PubKey defines a secp256k1 public key +message Secp256K1PubKey { + bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1.PubKey"]; +} + +// Secp256K1PrivKey defines a secp256k1 private key +message Secp256K1PrivKey { + bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1.PrivKey"]; +} \ No newline at end of file From eb020c2a4573a13802f591771f7f52c3bc226172 Mon Sep 17 00:00:00 2001 From: blushi Date: Mon, 31 Aug 2020 19:26:51 +0200 Subject: [PATCH 020/128] Implement some of the new multisig proto type methods --- crypto/keys/keys.go | 28 ++++++ crypto/keys/keys.pb.go | 71 ++++++-------- crypto/keys/multisig.go | 110 ++++++++++++++++++++++ crypto/keys/multisig_test.go | 3 + crypto/types/multisig/threshold_pubkey.go | 2 +- proto/cosmos/crypto/v1beta1/keys.proto | 2 + 6 files changed, 173 insertions(+), 43 deletions(-) create mode 100644 crypto/keys/multisig.go create mode 100644 crypto/keys/multisig_test.go diff --git a/crypto/keys/keys.go b/crypto/keys/keys.go index dabdfda4bcc2..75ce75c9c178 100644 --- a/crypto/keys/keys.go +++ b/crypto/keys/keys.go @@ -3,8 +3,10 @@ package keys import ( fmt "fmt" + "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + "github.com/cosmos/cosmos-sdk/crypto/types/multisig" proto "github.com/gogo/protobuf/proto" ) @@ -53,19 +55,45 @@ func (m *Secp256K1PrivKey) Type() string { return m.Key.Type() } +// ProtoPubKeyToAminoPubKey converts the proto.Message into a crypto.PubKey func ProtoPubKeyToAminoPubKey(msg proto.Message) (crypto.PubKey, error) { switch msg := msg.(type) { case *Secp256K1PubKey: return msg.GetKey(), nil + case *MultisigThresholdPubKey: + keys := make([]crypto.PubKey, len(msg.PubKeys)) + for i, any := range msg.PubKeys { + k, ok := any.GetCachedValue().(crypto.PubKey) + if !ok { + return nil, fmt.Errorf("expected crypto.PubKey") + } + keys[i] = k + } + return multisig.PubKeyMultisigThreshold{K: uint(msg.K), PubKeys: keys}, nil default: return nil, fmt.Errorf("unknown proto public key type: %v", msg) } } +// AminoPubKeyToProtoPubKey converts the crypto.PubKey into a proto.Message func AminoPubKeyToProtoPubKey(key crypto.PubKey) (proto.Message, error) { switch key := key.(type) { case secp256k1.PubKey: return &Secp256K1PubKey{Key: key}, nil + case multisig.PubKeyMultisigThreshold: + keys := make([]*types.Any, len(key.PubKeys)) + for i, k := range key.PubKeys { + msg, err := AminoPubKeyToProtoPubKey(k) + if err != nil { + return nil, err + } + any, err := types.NewAnyWithValue(msg) + if err != nil { + return nil, err + } + keys[i] = any + } + return &MultisigThresholdPubKey{K: uint32(key.K), PubKeys: keys}, nil default: return nil, fmt.Errorf("unknown public key type: %v", key) } diff --git a/crypto/keys/keys.pb.go b/crypto/keys/keys.pb.go index 92e9a9063000..7f5a32a7ea2a 100644 --- a/crypto/keys/keys.pb.go +++ b/crypto/keys/keys.pb.go @@ -65,20 +65,6 @@ func (m *MultisigThresholdPubKey) XXX_DiscardUnknown() { var xxx_messageInfo_MultisigThresholdPubKey proto.InternalMessageInfo -func (m *MultisigThresholdPubKey) GetK() uint32 { - if m != nil { - return m.K - } - return 0 -} - -func (m *MultisigThresholdPubKey) GetPubKeys() []*types.Any { - if m != nil { - return m.PubKeys - } - return nil -} - // LegacyAminoMultisigThresholdPubKey is a version of MultisigThresholdPubKey which uses legacy amino address rules type LegacyAminoMultisigThresholdPubKey struct { K uint32 `protobuf:"varint,1,opt,name=threshold,proto3" json:"threshold,omitempty" yaml:"threshold"` @@ -223,39 +209,40 @@ func (m *Secp256K1PrivKey) GetKey() github_com_cosmos_cosmos_sdk_crypto_keys_sec } func init() { - proto.RegisterType((*MultisigThresholdPubKey)(nil), "cosmos.crypto.MultisigThresholdPubKey") - proto.RegisterType((*LegacyAminoMultisigThresholdPubKey)(nil), "cosmos.crypto.LegacyAminoMultisigThresholdPubKey") - proto.RegisterType((*Secp256K1PubKey)(nil), "cosmos.crypto.Secp256K1PubKey") - proto.RegisterType((*Secp256K1PrivKey)(nil), "cosmos.crypto.Secp256K1PrivKey") + proto.RegisterType((*MultisigThresholdPubKey)(nil), "cosmos.crypto.v1beta1.MultisigThresholdPubKey") + proto.RegisterType((*LegacyAminoMultisigThresholdPubKey)(nil), "cosmos.crypto.v1beta1.LegacyAminoMultisigThresholdPubKey") + proto.RegisterType((*Secp256K1PubKey)(nil), "cosmos.crypto.v1beta1.Secp256K1PubKey") + proto.RegisterType((*Secp256K1PrivKey)(nil), "cosmos.crypto.v1beta1.Secp256K1PrivKey") } func init() { proto.RegisterFile("cosmos/crypto/v1beta1/keys.proto", fileDescriptor_1e964ea87598ec3f) } var fileDescriptor_1e964ea87598ec3f = []byte{ - // 367 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x91, 0x3f, 0x4b, 0xfb, 0x40, - 0x1c, 0xc6, 0x7b, 0xbf, 0xc2, 0x4f, 0xbc, 0x5a, 0x2d, 0xa5, 0x60, 0x5b, 0x30, 0x29, 0x99, 0xba, - 0x98, 0x23, 0x15, 0x15, 0x0b, 0x0a, 0xcd, 0x5a, 0xc5, 0x52, 0x3b, 0xb9, 0x48, 0x2e, 0x3d, 0xd3, - 0x90, 0xa4, 0x17, 0x72, 0x49, 0xe1, 0xde, 0x85, 0x2f, 0xc3, 0xdd, 0x37, 0xe1, 0xd8, 0xd1, 0x29, - 0x48, 0xfa, 0x0e, 0x3a, 0x76, 0x92, 0xcb, 0x19, 0xeb, 0x28, 0x6e, 0x4e, 0xf7, 0xe7, 0x79, 0xee, - 0xf3, 0x3c, 0xdc, 0x17, 0x76, 0x6c, 0xca, 0x02, 0xca, 0x90, 0x1d, 0xf1, 0x30, 0xa6, 0x68, 0x61, - 0x60, 0x12, 0x5b, 0x06, 0xf2, 0x08, 0x67, 0x7a, 0x18, 0xd1, 0x98, 0xd6, 0xab, 0xd2, 0xa1, 0x4b, - 0x47, 0xbb, 0xe1, 0x50, 0x87, 0xe6, 0x0a, 0x12, 0x3b, 0x69, 0x6a, 0xb7, 0x1c, 0x4a, 0x1d, 0x9f, - 0xa0, 0xfc, 0x84, 0x93, 0x47, 0x64, 0xcd, 0xb9, 0x94, 0xb4, 0x67, 0x00, 0x0f, 0x6f, 0x12, 0x3f, - 0x76, 0x99, 0xeb, 0x4c, 0x66, 0x11, 0x61, 0x33, 0xea, 0x4f, 0x47, 0x09, 0x1e, 0x12, 0x5e, 0x3f, - 0x87, 0xbb, 0x71, 0x71, 0xd5, 0x04, 0x1d, 0xd0, 0xad, 0x9a, 0xad, 0x2c, 0x55, 0xc1, 0x70, 0x9d, - 0xaa, 0x35, 0x6e, 0x05, 0x7e, 0x5f, 0xfb, 0xd2, 0xb5, 0xf1, 0xd6, 0x5b, 0x9f, 0xc0, 0x4a, 0x98, - 0x60, 0xdf, 0xb5, 0x1f, 0x44, 0xd3, 0xe6, 0xbf, 0x4e, 0xb9, 0x5b, 0xe9, 0x35, 0x74, 0xd9, 0x42, - 0x2f, 0x5a, 0xe8, 0x83, 0x39, 0x37, 0x8f, 0xb2, 0x54, 0xdd, 0x91, 0x79, 0x6c, 0x9d, 0xaa, 0xfb, - 0x12, 0x1b, 0x26, 0x58, 0xbc, 0xd4, 0xc6, 0x50, 0x72, 0x84, 0xaa, 0xbd, 0x00, 0xa8, 0x5d, 0x13, - 0xc7, 0xb2, 0xf9, 0x20, 0x70, 0xe7, 0xf4, 0x8f, 0xb4, 0xc6, 0xf0, 0xe0, 0x8e, 0xd8, 0x61, 0xef, - 0xf4, 0x6c, 0x68, 0x7c, 0x36, 0xbc, 0x85, 0x65, 0x8f, 0xf0, 0xbc, 0xdb, 0x9e, 0x79, 0xb9, 0x49, - 0xd5, 0x0b, 0xc7, 0x8d, 0x67, 0x09, 0xd6, 0x6d, 0x1a, 0xa0, 0x62, 0xe2, 0xf9, 0x72, 0xcc, 0xa6, - 0x5e, 0x31, 0x7c, 0x81, 0x46, 0x4c, 0xa2, 0x3c, 0x43, 0x97, 0xac, 0xb1, 0x20, 0x69, 0x53, 0x58, - 0xdb, 0x66, 0x44, 0xee, 0x42, 0x84, 0x8c, 0xbe, 0x87, 0x5c, 0x6d, 0x52, 0xb5, 0xff, 0x9b, 0x10, - 0x09, 0xcb, 0x53, 0x4c, 0xf3, 0x35, 0x53, 0xc0, 0x32, 0x53, 0xc0, 0x7b, 0xa6, 0x80, 0xa7, 0x95, - 0x52, 0x5a, 0xae, 0x94, 0xd2, 0xdb, 0x4a, 0x29, 0xdd, 0x77, 0x7f, 0x8a, 0xc6, 0xff, 0xf3, 0x6f, - 0x3c, 0xf9, 0x08, 0x00, 0x00, 0xff, 0xff, 0x6f, 0x15, 0xa3, 0xa1, 0xd9, 0x02, 0x00, 0x00, + // 380 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x48, 0xce, 0x2f, 0xce, + 0xcd, 0x2f, 0xd6, 0x4f, 0x2e, 0xaa, 0x2c, 0x28, 0xc9, 0xd7, 0x2f, 0x33, 0x4c, 0x4a, 0x2d, 0x49, + 0x34, 0xd4, 0xcf, 0x4e, 0xad, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x85, 0xa8, + 0xd0, 0x83, 0xa8, 0xd0, 0x83, 0xaa, 0x90, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0xab, 0xd0, 0x07, + 0xb1, 0x20, 0x8a, 0xa5, 0x24, 0xd3, 0xf3, 0xf3, 0xd3, 0x73, 0x52, 0xf5, 0xc1, 0xbc, 0xa4, 0xd2, + 0x34, 0xfd, 0xc4, 0xbc, 0x4a, 0x88, 0x94, 0xd2, 0x3a, 0x46, 0x2e, 0x71, 0xdf, 0xd2, 0x9c, 0x92, + 0xcc, 0xe2, 0xcc, 0xf4, 0x90, 0x8c, 0xa2, 0xd4, 0xe2, 0x8c, 0xfc, 0x9c, 0x94, 0x80, 0xd2, 0x24, + 0xef, 0xd4, 0x4a, 0x21, 0x73, 0x2e, 0xce, 0x12, 0x98, 0x90, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0xaf, + 0x93, 0xe4, 0xa3, 0x7b, 0xf2, 0x8c, 0xde, 0x9f, 0xee, 0xc9, 0x0b, 0x54, 0x26, 0xe6, 0xe6, 0x58, + 0x29, 0xc1, 0xe5, 0x95, 0x82, 0x10, 0x6a, 0x85, 0x42, 0xb8, 0xb8, 0x0b, 0x4a, 0x93, 0x72, 0x32, + 0x93, 0xe3, 0x41, 0x2e, 0x96, 0x60, 0x52, 0x60, 0xd6, 0xe0, 0x36, 0x12, 0xd1, 0x83, 0xb8, 0x42, + 0x0f, 0xe6, 0x0a, 0x3d, 0xc7, 0xbc, 0x4a, 0x27, 0xd9, 0x47, 0xf7, 0xe4, 0xd9, 0x21, 0xf6, 0x15, + 0x7f, 0xba, 0x27, 0xcf, 0x07, 0x31, 0xb6, 0xa0, 0x34, 0x09, 0xa4, 0x53, 0x29, 0x88, 0x0b, 0x62, + 0x0e, 0x48, 0xd6, 0x8a, 0xa5, 0x63, 0x81, 0x3c, 0x83, 0xd2, 0x66, 0x46, 0x2e, 0x25, 0x9f, 0xd4, + 0xf4, 0xc4, 0xe4, 0x4a, 0xc7, 0xdc, 0xcc, 0xbc, 0xfc, 0xa1, 0xe1, 0x76, 0xa5, 0x24, 0x2e, 0xfe, + 0xe0, 0xd4, 0xe4, 0x02, 0x23, 0x53, 0x33, 0x6f, 0x43, 0xa8, 0x0b, 0xfd, 0xb9, 0x98, 0xb3, 0x53, + 0x2b, 0xc1, 0x6e, 0xe3, 0x71, 0xb2, 0xfd, 0x75, 0x4f, 0xde, 0x32, 0x3d, 0xb3, 0x24, 0xa3, 0x34, + 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x16, 0xff, 0x60, 0x4a, 0xb7, 0x38, 0x25, 0x1b, 0x96, 0x14, + 0x40, 0x46, 0xeb, 0x17, 0x43, 0x8c, 0xca, 0x36, 0xd4, 0x83, 0x98, 0x15, 0x04, 0x32, 0x49, 0x29, + 0x85, 0x4b, 0x00, 0x61, 0x47, 0x51, 0x66, 0x19, 0xc8, 0x92, 0x00, 0x64, 0x4b, 0xec, 0x7e, 0xdd, + 0x93, 0xb7, 0x22, 0xc7, 0x12, 0x88, 0x61, 0x60, 0x5b, 0x9c, 0x9c, 0x4e, 0x3c, 0x92, 0x63, 0xbc, + 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, + 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0x4a, 0x83, 0x58, 0xa3, 0x93, 0xd8, 0xc0, 0xc1, 0x68, 0x0c, 0x08, + 0x00, 0x00, 0xff, 0xff, 0x53, 0xb6, 0xd7, 0x18, 0xe7, 0x02, 0x00, 0x00, } func (m *MultisigThresholdPubKey) Marshal() (dAtA []byte, err error) { diff --git a/crypto/keys/multisig.go b/crypto/keys/multisig.go new file mode 100644 index 000000000000..62410f0c44dc --- /dev/null +++ b/crypto/keys/multisig.go @@ -0,0 +1,110 @@ +package keys + +import ( + "github.com/cosmos/cosmos-sdk/codec" + + "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/crypto" + "github.com/cosmos/cosmos-sdk/types/tx/signing" + tmcrypto "github.com/tendermint/tendermint/crypto" + + "github.com/cosmos/cosmos-sdk/crypto/types/multisig" +) + +var cdc = codec.NewProtoCodec(types.NewInterfaceRegistry()) + +var _ multisig.PubKey = &MultisigThresholdPubKey{} + +// Address implements crypto.PubKey Address method +// TODO +func (m *MultisigThresholdPubKey) Address() crypto.Address { + return nil +} + +// Bytes returns the proto encoded version of the MultisigThresholdPubKey +func (m *MultisigThresholdPubKey) Bytes() []byte { + return cdc.MustMarshalBinaryBare(m) +} + +// VerifyMultisignature implements the multisig.PubKey VerifyMultisignature method +// TODO +func (m *MultisigThresholdPubKey) VerifyMultisignature(getSignBytes multisig.GetSignBytesFunc, sig *signing.MultiSignatureData) error { + return nil +} + +// VerifySignature implements crypto.PubKey VerifySignature method +func (m *MultisigThresholdPubKey) VerifySignature(msg []byte, sig []byte) bool { + // var sigData signing.SignatureDescriptor_Data_Multi // is this expected? + // err := cdc.UnmarshalBinaryBare(sig, &sigData) + // if err != nil { + // return false + // } + // size := sigData.Bitarray.Count() + // // ensure bit array is the correct size + // if len(m.PubKeys) != size { + // return false + // } + // // ensure size of signature list + // if len(sigData.Signatures) < int(m.K) || len(sigData.Signatures) > size { + // return false + // } + // // ensure at least k signatures are set + // if sigData.Bitarray.NumTrueBitsBefore(size) < int(m.K) { + // return false + // } + // // index in the list of signatures which we are concerned with. + // sigIndex := 0 + // for i := 0; i < size; i++ { + // if sigData.Bitarray.GetIndex(i) { + // pk, ok := m.PubKeys[i].GetCachedValue().(tmcrypto.PubKey) + // if !ok { + // return false + // } + // if !pk.VerifySignature(msg, sigData.Signatures[sigIndex]) { // TODO fix + // return false + // } + // sigIndex++ + // } + // } + return true +} + +// GetPubKeys implements the PubKey.GetPubKeys method +func (m *MultisigThresholdPubKey) GetPubKeys() []crypto.PubKey { + pubKeys := make([]crypto.PubKey, len(m.PubKeys)) + for i := 0; i < len(m.PubKeys); i++ { + pubKeys[i] = m.PubKeys[i].GetCachedValue().(tmcrypto.PubKey) + } + return pubKeys +} + +// Equals returns true if m and other both have the same number of keys, and +// all constituent keys are the same, and in the same order. +func (m *MultisigThresholdPubKey) Equals(key crypto.PubKey) bool { + otherKey, ok := key.(multisig.PubKey) + if !ok { + return false + } + pubKeys := m.GetPubKeys() + otherPubKeys := otherKey.GetPubKeys() + if m.GetThreshold() != otherKey.GetThreshold() || len(pubKeys) != len(otherPubKeys) { + return false + } + + for i := 0; i < len(pubKeys); i++ { + if !pubKeys[i].Equals(otherPubKeys[i]) { + return false + } + } + return true +} + +// GetThreshold implements the PubKey.GetThreshold method +func (m *MultisigThresholdPubKey) GetThreshold() uint { + return uint(m.K) +} + +// Type returns multisig type +func (m *MultisigThresholdPubKey) Type() string { + return "PubKeyMultisigThreshold" +} diff --git a/crypto/keys/multisig_test.go b/crypto/keys/multisig_test.go new file mode 100644 index 000000000000..d0f202eb2a56 --- /dev/null +++ b/crypto/keys/multisig_test.go @@ -0,0 +1,3 @@ +package keys_test + +// TODO diff --git a/crypto/types/multisig/threshold_pubkey.go b/crypto/types/multisig/threshold_pubkey.go index 1c5cabf72f09..28e098733434 100644 --- a/crypto/types/multisig/threshold_pubkey.go +++ b/crypto/types/multisig/threshold_pubkey.go @@ -137,7 +137,7 @@ func (pk PubKeyMultisigThreshold) Address() crypto.Address { return crypto.AddressHash(pk.Bytes()) } -// Equals returns true iff pk and other both have the same number of keys, and +// Equals returns true if pk and other both have the same number of keys, and // all constituent keys are the same, and in the same order. func (pk PubKeyMultisigThreshold) Equals(other crypto.PubKey) bool { otherKey, sameType := other.(PubKeyMultisigThreshold) diff --git a/proto/cosmos/crypto/v1beta1/keys.proto b/proto/cosmos/crypto/v1beta1/keys.proto index 43000df8d1c6..37e252217703 100644 --- a/proto/cosmos/crypto/v1beta1/keys.proto +++ b/proto/cosmos/crypto/v1beta1/keys.proto @@ -9,6 +9,8 @@ option go_package = "github.com/cosmos/cosmos-sdk/crypto/keys"; // MultisigThresholdPubKey specifies a public key type which nests multiple public // keys and a threshold message MultisigThresholdPubKey { + option (gogoproto.goproto_getters) = false; + uint32 threshold = 1 [(gogoproto.customname) = "K", (gogoproto.moretags) = "yaml:\"threshold\""]; repeated google.protobuf.Any public_keys = 2 [(gogoproto.customname) = "PubKeys", (gogoproto.moretags) = "yaml:\"pubkeys\""]; } From a4f6dd6640b1aaa025c5454f240f3838bc95a174 Mon Sep 17 00:00:00 2001 From: blushi Date: Wed, 2 Sep 2020 13:01:13 +0200 Subject: [PATCH 021/128] Add tests for MultisigThresholdPubKey --- crypto/keys/multisig.go | 98 +++++++++------ crypto/keys/multisig_test.go | 114 +++++++++++++++++- crypto/types/multisig/threshold_pubkey.go | 11 +- .../types/multisig/threshold_pubkey_test.go | 73 +++++++++-- 4 files changed, 237 insertions(+), 59 deletions(-) diff --git a/crypto/keys/multisig.go b/crypto/keys/multisig.go index 62410f0c44dc..6d27deea23cd 100644 --- a/crypto/keys/multisig.go +++ b/crypto/keys/multisig.go @@ -1,6 +1,8 @@ package keys import ( + fmt "fmt" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" @@ -16,9 +18,8 @@ var cdc = codec.NewProtoCodec(types.NewInterfaceRegistry()) var _ multisig.PubKey = &MultisigThresholdPubKey{} // Address implements crypto.PubKey Address method -// TODO func (m *MultisigThresholdPubKey) Address() crypto.Address { - return nil + return tmcrypto.AddressHash(m.Bytes()) } // Bytes returns the proto encoded version of the MultisigThresholdPubKey @@ -27,55 +28,72 @@ func (m *MultisigThresholdPubKey) Bytes() []byte { } // VerifyMultisignature implements the multisig.PubKey VerifyMultisignature method -// TODO func (m *MultisigThresholdPubKey) VerifyMultisignature(getSignBytes multisig.GetSignBytesFunc, sig *signing.MultiSignatureData) error { + bitarray := sig.BitArray + sigs := sig.Signatures + size := bitarray.Count() + pubKeys := m.GetPubKeys() + // ensure bit array is the correct size + if len(pubKeys) != size { + return fmt.Errorf("bit array size is incorrect %d", len(pubKeys)) + } + // ensure size of signature list + if len(sigs) < int(m.K) || len(sigs) > size { + return fmt.Errorf("signature size is incorrect %d", len(sigs)) + } + // ensure at least k signatures are set + if bitarray.NumTrueBitsBefore(size) < int(m.K) { + return fmt.Errorf("minimum number of signatures not set, have %d, expected %d", bitarray.NumTrueBitsBefore(size), int(m.K)) + } + // index in the list of signatures which we are concerned with. + sigIndex := 0 + for i := 0; i < size; i++ { + if bitarray.GetIndex(i) { + si := sig.Signatures[sigIndex] + switch si := si.(type) { + case *signing.SingleSignatureData: + msg, err := getSignBytes(si.SignMode) + if err != nil { + return err + } + if !pubKeys[i].VerifySignature(msg, si.Signature) { + return err + } + case *signing.MultiSignatureData: + nestedMultisigPk, ok := pubKeys[i].(multisig.PubKey) + if !ok { + return fmt.Errorf("unable to parse pubkey of index %d", i) + } + if err := nestedMultisigPk.VerifyMultisignature(getSignBytes, si); err != nil { + return err + } + default: + return fmt.Errorf("improper signature data type for index %d", sigIndex) + } + sigIndex++ + } + } return nil } // VerifySignature implements crypto.PubKey VerifySignature method func (m *MultisigThresholdPubKey) VerifySignature(msg []byte, sig []byte) bool { - // var sigData signing.SignatureDescriptor_Data_Multi // is this expected? - // err := cdc.UnmarshalBinaryBare(sig, &sigData) - // if err != nil { - // return false - // } - // size := sigData.Bitarray.Count() - // // ensure bit array is the correct size - // if len(m.PubKeys) != size { - // return false - // } - // // ensure size of signature list - // if len(sigData.Signatures) < int(m.K) || len(sigData.Signatures) > size { - // return false - // } - // // ensure at least k signatures are set - // if sigData.Bitarray.NumTrueBitsBefore(size) < int(m.K) { - // return false - // } - // // index in the list of signatures which we are concerned with. - // sigIndex := 0 - // for i := 0; i < size; i++ { - // if sigData.Bitarray.GetIndex(i) { - // pk, ok := m.PubKeys[i].GetCachedValue().(tmcrypto.PubKey) - // if !ok { - // return false - // } - // if !pk.VerifySignature(msg, sigData.Signatures[sigIndex]) { // TODO fix - // return false - // } - // sigIndex++ - // } - // } - return true + // TODO + // which type is expected in sig? + return false } // GetPubKeys implements the PubKey.GetPubKeys method func (m *MultisigThresholdPubKey) GetPubKeys() []crypto.PubKey { - pubKeys := make([]crypto.PubKey, len(m.PubKeys)) - for i := 0; i < len(m.PubKeys); i++ { - pubKeys[i] = m.PubKeys[i].GetCachedValue().(tmcrypto.PubKey) + if m != nil { + pubKeys := make([]crypto.PubKey, len(m.PubKeys)) + for i := 0; i < len(m.PubKeys); i++ { + pubKeys[i] = m.PubKeys[i].GetCachedValue().(tmcrypto.PubKey) + } + return pubKeys } - return pubKeys + + return nil } // Equals returns true if m and other both have the same number of keys, and diff --git a/crypto/keys/multisig_test.go b/crypto/keys/multisig_test.go index d0f202eb2a56..620bea1cf153 100644 --- a/crypto/keys/multisig_test.go +++ b/crypto/keys/multisig_test.go @@ -1,3 +1,115 @@ package keys_test -// TODO +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/crypto" + keys "github.com/cosmos/cosmos-sdk/crypto/keys" + "github.com/cosmos/cosmos-sdk/crypto/types/multisig" + proto "github.com/gogo/protobuf/proto" + + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + "github.com/cosmos/cosmos-sdk/types/tx/signing" + "github.com/stretchr/testify/require" +) + +func TestAddress(t *testing.T) { + msg := []byte{1, 2, 3, 4} + pubKeys, _ := generatePubKeysAndSignatures(5, msg) + anyPubKeys, err := packPubKeys(pubKeys) + require.NoError(t, err) + multisigKey := &keys.MultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys} + + require.Len(t, multisigKey.Address().Bytes(), 20) +} + +func TestEquals(t *testing.T) { + pubKey1 := secp256k1.GenPrivKey().PubKey() + pubKey2 := secp256k1.GenPrivKey().PubKey() + + pbPubKey1 := &keys.Secp256K1PubKey{Key: pubKey1.(secp256k1.PubKey)} + pbPubKey2 := &keys.Secp256K1PubKey{Key: pubKey2.(secp256k1.PubKey)} + anyPubKeys, err := packPubKeys([]crypto.PubKey{pbPubKey1, pbPubKey2}) + require.NoError(t, err) + multisigKey := keys.MultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys} + + otherPubKeys, err := packPubKeys([]crypto.PubKey{pbPubKey1, &multisigKey}) + require.NoError(t, err) + otherMultisigKey := keys.MultisigThresholdPubKey{K: 1, PubKeys: otherPubKeys} + + testCases := []struct { + msg string + other crypto.PubKey + expectEq bool + }{ + { + "equals with proto pub key", + &keys.MultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys}, + true, + }, + { + "different threshold", + &keys.MultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys}, + false, + }, + { + "different pub keys length", + &keys.MultisigThresholdPubKey{K: 1, PubKeys: []*types.Any{anyPubKeys[0]}}, + false, + }, + { + "different pub keys", + &otherMultisigKey, + false, + }, + { + "different types", + secp256k1.GenPrivKey().PubKey(), + false, + }, + { + "equals with amino pub key", + multisig.NewPubKeyMultisigThreshold(1, []crypto.PubKey{pubKey1, pubKey2}), + true, + }, + } + + for _, tc := range testCases { + t.Run(tc.msg, func(t *testing.T) { + eq := multisigKey.Equals(tc.other) + require.Equal(t, eq, tc.expectEq) + }) + } +} + +func TestVerifyMultisignature(t *testing.T) { + // TODO +} + +func generatePubKeysAndSignatures(n int, msg []byte) (pubKeys []crypto.PubKey, signatures []signing.SignatureData) { + pubKeys = make([]crypto.PubKey, n) + signatures = make([]signing.SignatureData, n) + + for i := 0; i < n; i++ { + privkey := &keys.Secp256K1PrivKey{Key: secp256k1.GenPrivKey()} + pubKeys[i] = privkey.PubKey() + + sig, _ := privkey.Sign(msg) + signatures[i] = &signing.SingleSignatureData{Signature: sig} + } + return +} + +func packPubKeys(pubKeys []crypto.PubKey) ([]*types.Any, error) { + anyPubKeys := make([]*types.Any, len(pubKeys)) + + for i := 0; i < len(pubKeys); i++ { + any, err := types.NewAnyWithValue(pubKeys[i].(proto.Message)) + if err != nil { + return nil, err + } + anyPubKeys[i] = any + } + return anyPubKeys, nil +} diff --git a/crypto/types/multisig/threshold_pubkey.go b/crypto/types/multisig/threshold_pubkey.go index 28e098733434..49de88c4de5d 100644 --- a/crypto/types/multisig/threshold_pubkey.go +++ b/crypto/types/multisig/threshold_pubkey.go @@ -33,14 +33,14 @@ func NewPubKeyMultisigThreshold(k int, pubkeys []crypto.PubKey) PubKey { return PubKeyMultisigThreshold{uint(k), pubkeys} } -// VerifyBytes expects sig to be an amino encoded version of a MultiSignature. +// VerifySignature expects sig to be an amino encoded version of a MultiSignature. // Returns true iff the multisignature contains k or more signatures // for the correct corresponding keys, // and all signatures are valid. (Not just k of the signatures) // The multisig uses a bitarray, so multiple signatures for the same key is not // a concern. // -// NOTE: VerifyMultisignature should preferred to VerifyBytes which only works +// NOTE: VerifyMultisignature should preferred to VerifySignature which only works // with amino multisignatures. func (pk PubKeyMultisigThreshold) VerifySignature(msg []byte, marshalledSig []byte) bool { var sig AminoMultisignature @@ -140,15 +140,16 @@ func (pk PubKeyMultisigThreshold) Address() crypto.Address { // Equals returns true if pk and other both have the same number of keys, and // all constituent keys are the same, and in the same order. func (pk PubKeyMultisigThreshold) Equals(other crypto.PubKey) bool { - otherKey, sameType := other.(PubKeyMultisigThreshold) + otherKey, sameType := other.(PubKey) if !sameType { return false } - if pk.K != otherKey.K || len(pk.PubKeys) != len(otherKey.PubKeys) { + otherPubKeys := otherKey.GetPubKeys() + if pk.GetThreshold() != otherKey.GetThreshold() || len(pk.PubKeys) != len(otherPubKeys) { return false } for i := 0; i < len(pk.PubKeys); i++ { - if !pk.PubKeys[i].Equals(otherKey.PubKeys[i]) { + if !pk.PubKeys[i].Equals(otherPubKeys[i]) { return false } } diff --git a/crypto/types/multisig/threshold_pubkey_test.go b/crypto/types/multisig/threshold_pubkey_test.go index 2396e09ad54b..bee629ad1bc3 100644 --- a/crypto/types/multisig/threshold_pubkey_test.go +++ b/crypto/types/multisig/threshold_pubkey_test.go @@ -4,12 +4,16 @@ import ( "math/rand" "testing" + proto "github.com/gogo/protobuf/proto" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/crypto/sr25519" "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + + "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" @@ -130,22 +134,65 @@ func TestThresholdMultisigDuplicateSignatures(t *testing.T) { require.Error(t, multisigKey.VerifyMultisignature(signBytesFn, multisignature)) } -// TODO: Fully replace this test with table driven tests func TestMultiSigPubKeyEquality(t *testing.T) { - msg := []byte{1, 2, 3, 4} - pubkeys, _ := generatePubKeysAndSignatures(5, msg) + pubKey1 := secp256k1.GenPrivKey().PubKey() + pubKey2 := secp256k1.GenPrivKey().PubKey() + pubkeys := []crypto.PubKey{pubKey1, pubKey2} multisigKey := multisig.NewPubKeyMultisigThreshold(2, pubkeys) - var unmarshalledMultisig multisig.PubKeyMultisigThreshold - multisig.Cdc.MustUnmarshalBinaryBare(multisigKey.Bytes(), &unmarshalledMultisig) - require.True(t, multisigKey.Equals(unmarshalledMultisig)) + var other multisig.PubKey - // Ensure that reordering pubkeys is treated as a different pubkey - pubkeysCpy := make([]crypto.PubKey, 5) - copy(pubkeysCpy, pubkeys) - pubkeysCpy[4] = pubkeys[3] - pubkeysCpy[3] = pubkeys[4] - multisigKey2 := multisig.NewPubKeyMultisigThreshold(2, pubkeysCpy) - require.False(t, multisigKey.Equals(multisigKey2)) + testCases := []struct { + msg string + malleate func() + expectEq bool + }{ + { + "equals", + func() { + var otherPubKey multisig.PubKeyMultisigThreshold + multisig.Cdc.MustUnmarshalBinaryBare(multisigKey.Bytes(), &otherPubKey) + other = otherPubKey + }, + true, + }, + { + "ensure that reordering pubkeys is treated as a different pubkey", + func() { + pubkeysCpy := make([]crypto.PubKey, 2) + copy(pubkeysCpy, pubkeys) + pubkeysCpy[0] = pubkeys[1] + pubkeysCpy[1] = pubkeys[0] + other = multisig.NewPubKeyMultisigThreshold(2, pubkeysCpy) + }, + false, + }, + { + "equals with proto pub key", + func() { + pbPubkeys := []crypto.PubKey{ + &keys.Secp256K1PubKey{Key: pubKey1.(secp256k1.PubKey)}, + &keys.Secp256K1PubKey{Key: pubKey2.(secp256k1.PubKey)}, + } + anyPubKeys := make([]*codectypes.Any, len(pbPubkeys)) + + for i := 0; i < len(pubkeys); i++ { + any, err := codectypes.NewAnyWithValue(pbPubkeys[i].(proto.Message)) + require.NoError(t, err) + anyPubKeys[i] = any + } + other = &keys.MultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys} + }, + true, + }, + } + + for _, tc := range testCases { + t.Run(tc.msg, func(t *testing.T) { + tc.malleate() + eq := multisigKey.Equals(other) + require.Equal(t, eq, tc.expectEq) + }) + } } func TestAddress(t *testing.T) { From e1a20ce50630d38bd46ad1e51d2e7d00804306db Mon Sep 17 00:00:00 2001 From: blushi Date: Wed, 2 Sep 2020 13:30:08 +0200 Subject: [PATCH 022/128] Add tests for pubkey pb/amino conversion functions --- crypto/keys/keys.go | 10 +++- crypto/keys/keys_test.go | 118 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 124 insertions(+), 4 deletions(-) diff --git a/crypto/keys/keys.go b/crypto/keys/keys.go index 75ce75c9c178..27a041c44152 100644 --- a/crypto/keys/keys.go +++ b/crypto/keys/keys.go @@ -63,11 +63,15 @@ func ProtoPubKeyToAminoPubKey(msg proto.Message) (crypto.PubKey, error) { case *MultisigThresholdPubKey: keys := make([]crypto.PubKey, len(msg.PubKeys)) for i, any := range msg.PubKeys { - k, ok := any.GetCachedValue().(crypto.PubKey) + cachedKey, ok := any.GetCachedValue().(proto.Message) if !ok { - return nil, fmt.Errorf("expected crypto.PubKey") + return nil, fmt.Errorf("can't proto marshal %T", any.GetCachedValue()) } - keys[i] = k + key, err := ProtoPubKeyToAminoPubKey(cachedKey) + if err != nil { + return nil, err + } + keys[i] = key } return multisig.PubKeyMultisigThreshold{K: uint(msg.K), PubKeys: keys}, nil default: diff --git a/crypto/keys/keys_test.go b/crypto/keys/keys_test.go index 988f2e9fb5db..e85ca18d2492 100644 --- a/crypto/keys/keys_test.go +++ b/crypto/keys/keys_test.go @@ -5,6 +5,9 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + "github.com/cosmos/cosmos-sdk/crypto/types/multisig" + "github.com/cosmos/cosmos-sdk/testutil/testdata" + proto "github.com/gogo/protobuf/proto" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto" @@ -12,7 +15,6 @@ import ( ) func TestPubKeyEquals(t *testing.T) { - secp256K1PubKey := secp256k1.GenPrivKey().PubKey().(secp256k1.PubKey) secp256K1PbPubKey := &keys.Secp256K1PubKey{Key: secp256K1PubKey} @@ -147,3 +149,117 @@ func TestSignAndVerifySignature(t *testing.T) { } } + +func TestProtoPubKeyToAminoPubKey(t *testing.T) { + var ( + pbPubKey proto.Message + aminoPubKey crypto.PubKey + ) + testCases := []struct { + msg string + malleate func() + expectPass bool + }{ + { + "Secp256K1PubKey", + func() { + aminoPubKey = secp256k1.GenPrivKey().PubKey() + pbPubKey = &keys.Secp256K1PubKey{Key: aminoPubKey.(secp256k1.PubKey)} + }, + true, + }, + { + "MultisigThresholdPubKey", + func() { + pubKey1 := secp256k1.GenPrivKey().PubKey() + pubKey2 := secp256k1.GenPrivKey().PubKey() + + pbPubKey1 := &keys.Secp256K1PubKey{Key: pubKey1.(secp256k1.PubKey)} + pbPubKey2 := &keys.Secp256K1PubKey{Key: pubKey2.(secp256k1.PubKey)} + anyPubKeys, err := packPubKeys([]crypto.PubKey{pbPubKey1, pbPubKey2}) + require.NoError(t, err) + + pbPubKey = &keys.MultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys} + aminoPubKey = multisig.NewPubKeyMultisigThreshold(1, []crypto.PubKey{pubKey1, pubKey2}) + }, + true, + }, + { + "unknown type", + func() { + pbPubKey = &testdata.Dog{} + }, + false, + }, + } + + for _, tc := range testCases { + t.Run(tc.msg, func(t *testing.T) { + tc.malleate() + pubKey, err := keys.ProtoPubKeyToAminoPubKey(pbPubKey) + if tc.expectPass { + require.NoError(t, err) + require.Equal(t, aminoPubKey, pubKey) + } else { + require.Error(t, err) + } + }) + } +} + +func TestAminoPubKeyToProtoPubKey(t *testing.T) { + var ( + pbPubKey proto.Message + aminoPubKey crypto.PubKey + ) + testCases := []struct { + msg string + malleate func() + expectPass bool + }{ + { + "secp256k1.PubKey", + func() { + aminoPubKey = secp256k1.GenPrivKey().PubKey() + pbPubKey = &keys.Secp256K1PubKey{Key: aminoPubKey.(secp256k1.PubKey)} + }, + true, + }, + { + "multisig.PubKeyMultisigThreshold", + func() { + pubKey1 := secp256k1.GenPrivKey().PubKey() + pubKey2 := secp256k1.GenPrivKey().PubKey() + + pbPubKey1 := &keys.Secp256K1PubKey{Key: pubKey1.(secp256k1.PubKey)} + pbPubKey2 := &keys.Secp256K1PubKey{Key: pubKey2.(secp256k1.PubKey)} + anyPubKeys, err := packPubKeys([]crypto.PubKey{pbPubKey1, pbPubKey2}) + require.NoError(t, err) + + pbPubKey = &keys.MultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys} + aminoPubKey = multisig.NewPubKeyMultisigThreshold(1, []crypto.PubKey{pubKey1, pubKey2}) + }, + true, + }, + { + "unknown type", + func() { + aminoPubKey = sr25519.GenPrivKey().PubKey() + }, + false, + }, + } + + for _, tc := range testCases { + t.Run(tc.msg, func(t *testing.T) { + tc.malleate() + pubKey, err := keys.AminoPubKeyToProtoPubKey(aminoPubKey) + if tc.expectPass { + require.NoError(t, err) + require.Equal(t, pbPubKey, pubKey) + } else { + require.Error(t, err) + } + }) + } +} From bc5af8b097f635ff7ba9e3dc208576304fa15dd9 Mon Sep 17 00:00:00 2001 From: blushi Date: Fri, 4 Sep 2020 12:59:56 +0200 Subject: [PATCH 023/128] Move crypto types.go and register new proto pubkeys --- crypto/codec/amino.go | 5 +++++ crypto/keys/keys.go | 2 +- crypto/keys/keys_test.go | 5 +++-- crypto/keys/multisig.go | 2 +- crypto/keys/multisig_test.go | 2 +- crypto/{ => types}/types.go | 2 +- 6 files changed, 12 insertions(+), 6 deletions(-) rename crypto/{ => types}/types.go (91%) diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index 027a831e499e..8da5254a3512 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -6,6 +6,7 @@ import ( "github.com/tendermint/tendermint/crypto/sr25519" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" ) @@ -29,6 +30,10 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { secp256k1.PubKeyName, nil) cdc.RegisterConcrete(multisig.PubKeyMultisigThreshold{}, multisig.PubKeyAminoRoute, nil) + cdc.RegisterConcrete(keys.Secp256K1PubKey{}, + "cosmos-sdk/Secp256K1PubKey", nil) + cdc.RegisterConcrete(keys.MultisigThresholdPubKey{}, + "cosmos-sdk/MultisigThresholdPubKey", nil) cdc.RegisterInterface((*crypto.PrivKey)(nil), nil) cdc.RegisterConcrete(ed25519.PrivKey{}, diff --git a/crypto/keys/keys.go b/crypto/keys/keys.go index 27a041c44152..6f22ca3dadd0 100644 --- a/crypto/keys/keys.go +++ b/crypto/keys/keys.go @@ -4,8 +4,8 @@ import ( fmt "fmt" "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/crypto" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + crypto "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" proto "github.com/gogo/protobuf/proto" ) diff --git a/crypto/keys/keys_test.go b/crypto/keys/keys_test.go index e85ca18d2492..c38dda50889a 100644 --- a/crypto/keys/keys_test.go +++ b/crypto/keys/keys_test.go @@ -5,12 +5,13 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + crypto "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/testutil/testdata" proto "github.com/gogo/protobuf/proto" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto" + tmcrypto "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/sr25519" ) @@ -136,7 +137,7 @@ func TestSignAndVerifySignature(t *testing.T) { for _, tc := range testCases { t.Run(tc.msg, func(t *testing.T) { pubKey := tc.privKey.PubKey() - msg := crypto.CRandBytes(128) + msg := tmcrypto.CRandBytes(128) sig, err := tc.privKey.Sign(msg) require.Nil(t, err) diff --git a/crypto/keys/multisig.go b/crypto/keys/multisig.go index 6d27deea23cd..0b302844bfb9 100644 --- a/crypto/keys/multisig.go +++ b/crypto/keys/multisig.go @@ -6,7 +6,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/crypto" + crypto "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/types/tx/signing" tmcrypto "github.com/tendermint/tendermint/crypto" diff --git a/crypto/keys/multisig_test.go b/crypto/keys/multisig_test.go index 620bea1cf153..1e213090532e 100644 --- a/crypto/keys/multisig_test.go +++ b/crypto/keys/multisig_test.go @@ -4,8 +4,8 @@ import ( "testing" "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/crypto" keys "github.com/cosmos/cosmos-sdk/crypto/keys" + crypto "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" proto "github.com/gogo/protobuf/proto" diff --git a/crypto/types.go b/crypto/types/types.go similarity index 91% rename from crypto/types.go rename to crypto/types/types.go index 1c2141f1bd55..d0ac48f8ff5b 100644 --- a/crypto/types.go +++ b/crypto/types/types.go @@ -1,4 +1,4 @@ -package crypto +package types import tmcrypto "github.com/tendermint/tendermint/crypto" From f4a1fd53b201d7dbca4aa511d028cc8b2fb6909f Mon Sep 17 00:00:00 2001 From: blushi Date: Fri, 4 Sep 2020 13:06:56 +0200 Subject: [PATCH 024/128] Add missing pointer ref --- crypto/codec/amino.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index 8da5254a3512..fe45e0e42ac7 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -30,9 +30,9 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { secp256k1.PubKeyName, nil) cdc.RegisterConcrete(multisig.PubKeyMultisigThreshold{}, multisig.PubKeyAminoRoute, nil) - cdc.RegisterConcrete(keys.Secp256K1PubKey{}, + cdc.RegisterConcrete(&keys.Secp256K1PubKey{}, "cosmos-sdk/Secp256K1PubKey", nil) - cdc.RegisterConcrete(keys.MultisigThresholdPubKey{}, + cdc.RegisterConcrete(&keys.MultisigThresholdPubKey{}, "cosmos-sdk/MultisigThresholdPubKey", nil) cdc.RegisterInterface((*crypto.PrivKey)(nil), nil) From b9ab6c95ee32097e8f9cf10e5aadb6c5bcdfa6a4 Mon Sep 17 00:00:00 2001 From: blushi Date: Mon, 7 Sep 2020 09:16:49 +0200 Subject: [PATCH 025/128] Address review comments --- crypto/keys/keys.go | 45 ------- crypto/keys/keys_test.go | 138 -------------------- crypto/keys/secp256k1.go | 51 ++++++++ crypto/keys/secp256k1_test.go | 149 ++++++++++++++++++++++ crypto/types/multisig/threshold_pubkey.go | 2 +- 5 files changed, 201 insertions(+), 184 deletions(-) create mode 100644 crypto/keys/secp256k1.go create mode 100644 crypto/keys/secp256k1_test.go diff --git a/crypto/keys/keys.go b/crypto/keys/keys.go index 6f22ca3dadd0..14b10571eb44 100644 --- a/crypto/keys/keys.go +++ b/crypto/keys/keys.go @@ -10,51 +10,6 @@ import ( proto "github.com/gogo/protobuf/proto" ) -var ( - _ crypto.PubKey = &Secp256K1PubKey{} - _ crypto.PrivKey = &Secp256K1PrivKey{} -) - -func (m *Secp256K1PubKey) Address() crypto.Address { - return m.Key.Address() -} - -func (m *Secp256K1PubKey) Bytes() []byte { - return m.Key.Bytes() -} - -func (m *Secp256K1PubKey) VerifySignature(msg []byte, sig []byte) bool { - return m.Key.VerifySignature(msg, sig) -} - -func (m *Secp256K1PubKey) Equals(key crypto.PubKey) bool { - return m.Key.Equals(key) -} - -func (m *Secp256K1PubKey) Type() string { - return m.Key.Type() -} - -func (m *Secp256K1PrivKey) Bytes() []byte { - return m.Key.Bytes() -} - -func (m *Secp256K1PrivKey) Sign(msg []byte) ([]byte, error) { - return m.Key.Sign(msg) -} - -func (m *Secp256K1PrivKey) PubKey() crypto.PubKey { - return &Secp256K1PubKey{Key: m.Key.PubKey().(secp256k1.PubKey)} -} - -func (m *Secp256K1PrivKey) Equals(key crypto.PrivKey) bool { - return m.Key.Equals(key) -} - -func (m *Secp256K1PrivKey) Type() string { - return m.Key.Type() -} - // ProtoPubKeyToAminoPubKey converts the proto.Message into a crypto.PubKey func ProtoPubKeyToAminoPubKey(msg proto.Message) (crypto.PubKey, error) { switch msg := msg.(type) { diff --git a/crypto/keys/keys_test.go b/crypto/keys/keys_test.go index c38dda50889a..20b327e5f792 100644 --- a/crypto/keys/keys_test.go +++ b/crypto/keys/keys_test.go @@ -9,148 +9,10 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/testutil/testdata" proto "github.com/gogo/protobuf/proto" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - tmcrypto "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/sr25519" ) -func TestPubKeyEquals(t *testing.T) { - secp256K1PubKey := secp256k1.GenPrivKey().PubKey().(secp256k1.PubKey) - secp256K1PbPubKey := &keys.Secp256K1PubKey{Key: secp256K1PubKey} - - testCases := []struct { - msg string - pubKey crypto.PubKey - other crypto.PubKey - expectEq bool - }{ - { - "secp256k1 pb different bytes", - secp256K1PbPubKey, - &keys.Secp256K1PubKey{ - Key: secp256k1.GenPrivKey().PubKey().(secp256k1.PubKey), - }, - false, - }, - { - "secp256k1 pb equals", - secp256K1PbPubKey, - &keys.Secp256K1PubKey{ - Key: secp256K1PubKey, - }, - true, - }, - { - "secp256k1 different types", - secp256K1PbPubKey, - sr25519.GenPrivKey().PubKey(), - false, - }, - { - "secp256k1 different bytes", - secp256K1PbPubKey, - secp256k1.GenPrivKey().PubKey(), - false, - }, - { - "secp256k1 equals", - secp256K1PbPubKey, - secp256K1PubKey, - true, - }, - } - - for _, tc := range testCases { - t.Run(tc.msg, func(t *testing.T) { - eq := tc.pubKey.Equals(tc.other) - require.Equal(t, eq, tc.expectEq) - }) - } -} - -func TestPrivKeyEquals(t *testing.T) { - secp256K1PrivKey := secp256k1.GenPrivKey() - secp256K1PbPrivKey := &keys.Secp256K1PrivKey{Key: secp256K1PrivKey} - - testCases := []struct { - msg string - privKey crypto.PrivKey - other crypto.PrivKey - expectEq bool - }{ - { - "secp256k1 pb different bytes", - secp256K1PbPrivKey, - &keys.Secp256K1PrivKey{ - Key: secp256k1.GenPrivKey(), - }, - false, - }, - { - "secp256k1 pb equals", - secp256K1PbPrivKey, - &keys.Secp256K1PrivKey{ - Key: secp256K1PrivKey, - }, - true, - }, - { - "secp256k1 different types", - secp256K1PbPrivKey, - sr25519.GenPrivKey(), - false, - }, - { - "secp256k1 different bytes", - secp256K1PbPrivKey, - secp256k1.GenPrivKey(), - false, - }, - { - "secp256k1 equals", - secp256K1PbPrivKey, - secp256K1PrivKey, - true, - }, - } - - for _, tc := range testCases { - t.Run(tc.msg, func(t *testing.T) { - eq := tc.privKey.Equals(tc.other) - require.Equal(t, eq, tc.expectEq) - }) - } -} - -func TestSignAndVerifySignature(t *testing.T) { - testCases := []struct { - msg string - privKey crypto.PrivKey - }{ - { - "secp256k1", - &keys.Secp256K1PrivKey{Key: secp256k1.GenPrivKey()}, - }, - } - - for _, tc := range testCases { - t.Run(tc.msg, func(t *testing.T) { - pubKey := tc.privKey.PubKey() - msg := tmcrypto.CRandBytes(128) - sig, err := tc.privKey.Sign(msg) - require.Nil(t, err) - - assert.True(t, pubKey.VerifySignature(msg, sig)) - - sig[7] ^= byte(0x01) - - assert.False(t, pubKey.VerifySignature(msg, sig)) - }) - } - -} - func TestProtoPubKeyToAminoPubKey(t *testing.T) { var ( pbPubKey proto.Message diff --git a/crypto/keys/secp256k1.go b/crypto/keys/secp256k1.go new file mode 100644 index 000000000000..379cf8725f99 --- /dev/null +++ b/crypto/keys/secp256k1.go @@ -0,0 +1,51 @@ +package keys + +import ( + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + crypto "github.com/cosmos/cosmos-sdk/crypto/types" +) + +var ( + _ crypto.PubKey = &Secp256K1PubKey{} + _ crypto.PrivKey = &Secp256K1PrivKey{} +) + +func (m *Secp256K1PubKey) Address() crypto.Address { + return m.Key.Address() +} + +func (m *Secp256K1PubKey) Bytes() []byte { + return m.Key.Bytes() +} + +func (m *Secp256K1PubKey) VerifySignature(msg []byte, sig []byte) bool { + return m.Key.VerifySignature(msg, sig) +} + +func (m *Secp256K1PubKey) Equals(key crypto.PubKey) bool { + return m.Key.Equals(key) +} + +func (m *Secp256K1PubKey) Type() string { + return m.Key.Type() +} + +func (m *Secp256K1PrivKey) Bytes() []byte { + return m.Key.Bytes() +} + +func (m *Secp256K1PrivKey) Sign(msg []byte) ([]byte, error) { + return m.Key.Sign(msg) +} + +func (m *Secp256K1PrivKey) PubKey() crypto.PubKey { + return &Secp256K1PubKey{Key: m.Key.PubKey().(secp256k1.PubKey)} +} + +func (m *Secp256K1PrivKey) Equals(key crypto.PrivKey) bool { + return m.Key.Equals(key) +} + +func (m *Secp256K1PrivKey) Type() string { + return m.Key.Type() +} diff --git a/crypto/keys/secp256k1_test.go b/crypto/keys/secp256k1_test.go new file mode 100644 index 000000000000..a4a1d8e4739e --- /dev/null +++ b/crypto/keys/secp256k1_test.go @@ -0,0 +1,149 @@ +package keys_test + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/crypto/keys" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + crypto "github.com/cosmos/cosmos-sdk/crypto/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + tmcrypto "github.com/tendermint/tendermint/crypto" + "github.com/tendermint/tendermint/crypto/sr25519" +) + +func TestPubKeyEquals(t *testing.T) { + secp256K1PubKey := secp256k1.GenPrivKey().PubKey().(secp256k1.PubKey) + secp256K1PbPubKey := &keys.Secp256K1PubKey{Key: secp256K1PubKey} + + testCases := []struct { + msg string + pubKey crypto.PubKey + other crypto.PubKey + expectEq bool + }{ + { + "secp256k1 pb different bytes", + secp256K1PbPubKey, + &keys.Secp256K1PubKey{ + Key: secp256k1.GenPrivKey().PubKey().(secp256k1.PubKey), + }, + false, + }, + { + "secp256k1 pb equals", + secp256K1PbPubKey, + &keys.Secp256K1PubKey{ + Key: secp256K1PubKey, + }, + true, + }, + { + "secp256k1 different types", + secp256K1PbPubKey, + sr25519.GenPrivKey().PubKey(), + false, + }, + { + "secp256k1 different bytes", + secp256K1PbPubKey, + secp256k1.GenPrivKey().PubKey(), + false, + }, + { + "secp256k1 equals", + secp256K1PbPubKey, + secp256K1PubKey, + true, + }, + } + + for _, tc := range testCases { + t.Run(tc.msg, func(t *testing.T) { + eq := tc.pubKey.Equals(tc.other) + require.Equal(t, eq, tc.expectEq) + }) + } +} + +func TestPrivKeyEquals(t *testing.T) { + secp256K1PrivKey := secp256k1.GenPrivKey() + secp256K1PbPrivKey := &keys.Secp256K1PrivKey{Key: secp256K1PrivKey} + + testCases := []struct { + msg string + privKey crypto.PrivKey + other crypto.PrivKey + expectEq bool + }{ + { + "secp256k1 pb different bytes", + secp256K1PbPrivKey, + &keys.Secp256K1PrivKey{ + Key: secp256k1.GenPrivKey(), + }, + false, + }, + { + "secp256k1 pb equals", + secp256K1PbPrivKey, + &keys.Secp256K1PrivKey{ + Key: secp256K1PrivKey, + }, + true, + }, + { + "secp256k1 different types", + secp256K1PbPrivKey, + sr25519.GenPrivKey(), + false, + }, + { + "secp256k1 different bytes", + secp256K1PbPrivKey, + secp256k1.GenPrivKey(), + false, + }, + { + "secp256k1 equals", + secp256K1PbPrivKey, + secp256K1PrivKey, + true, + }, + } + + for _, tc := range testCases { + t.Run(tc.msg, func(t *testing.T) { + eq := tc.privKey.Equals(tc.other) + require.Equal(t, eq, tc.expectEq) + }) + } +} + +func TestSignAndVerifySignature(t *testing.T) { + testCases := []struct { + msg string + privKey crypto.PrivKey + }{ + { + "secp256k1", + &keys.Secp256K1PrivKey{Key: secp256k1.GenPrivKey()}, + }, + } + + for _, tc := range testCases { + t.Run(tc.msg, func(t *testing.T) { + pubKey := tc.privKey.PubKey() + msg := tmcrypto.CRandBytes(128) + sig, err := tc.privKey.Sign(msg) + require.Nil(t, err) + + assert.True(t, pubKey.VerifySignature(msg, sig)) + + sig[7] ^= byte(0x01) + + assert.False(t, pubKey.VerifySignature(msg, sig)) + }) + } + +} diff --git a/crypto/types/multisig/threshold_pubkey.go b/crypto/types/multisig/threshold_pubkey.go index 49de88c4de5d..7a3c410b7b30 100644 --- a/crypto/types/multisig/threshold_pubkey.go +++ b/crypto/types/multisig/threshold_pubkey.go @@ -137,7 +137,7 @@ func (pk PubKeyMultisigThreshold) Address() crypto.Address { return crypto.AddressHash(pk.Bytes()) } -// Equals returns true if pk and other both have the same number of keys, and +// Equals returns true iff pk and other both have the same number of keys, and // all constituent keys are the same, and in the same order. func (pk PubKeyMultisigThreshold) Equals(other crypto.PubKey) bool { otherKey, sameType := other.(PubKey) From 6fc4073dbbdc3b48c95228e58f5f179ac8119697 Mon Sep 17 00:00:00 2001 From: blushi Date: Mon, 7 Sep 2020 09:29:25 +0200 Subject: [PATCH 026/128] panic in MultisigThresholdPubKey VerifySignature --- crypto/keys/multisig.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crypto/keys/multisig.go b/crypto/keys/multisig.go index 0b302844bfb9..5cc0313d2e58 100644 --- a/crypto/keys/multisig.go +++ b/crypto/keys/multisig.go @@ -76,11 +76,11 @@ func (m *MultisigThresholdPubKey) VerifyMultisignature(getSignBytes multisig.Get return nil } -// VerifySignature implements crypto.PubKey VerifySignature method +// VerifySignature implements crypto.PubKey VerifySignature method, +// it panics because it can't handle MultiSignatureData +// cf. https://github.com/cosmos/cosmos-sdk/issues/7109#issuecomment-686329936 func (m *MultisigThresholdPubKey) VerifySignature(msg []byte, sig []byte) bool { - // TODO - // which type is expected in sig? - return false + panic("not implemented") } // GetPubKeys implements the PubKey.GetPubKeys method From 09db3e93c6faa45c25f7399447dbbcdc817335f8 Mon Sep 17 00:00:00 2001 From: blushi Date: Mon, 7 Sep 2020 09:52:44 +0200 Subject: [PATCH 027/128] Fix compile errors --- client/context.go | 11 ++++++++--- codec/yaml.go | 3 ++- codec/yaml_test.go | 2 +- testutil/testdata/test_tx.go | 3 ++- x/auth/ante/sigverify.go | 13 +++++++++++-- x/auth/types/account.go | 36 ++++++++++++++++++++++++++---------- 6 files changed, 50 insertions(+), 18 deletions(-) diff --git a/client/context.go b/client/context.go index dad5f56b57b8..1b45adeee485 100644 --- a/client/context.go +++ b/client/context.go @@ -1,10 +1,12 @@ package client import ( + "encoding/json" "io" "os" "github.com/gogo/protobuf/proto" + "gopkg.in/yaml.v2" "github.com/pkg/errors" rpcclient "github.com/tendermint/tendermint/rpc/client" @@ -230,12 +232,15 @@ func (ctx Context) PrintOutputLegacy(toPrint interface{}) error { func (ctx Context) printOutput(out []byte) error { if ctx.OutputFormat == "text" { - out, err = codec.MarshalYAML(ctx.JSONMarshaler, toPrint) + // handle text format by decoding and re-encoding JSON as YAML + var j interface{} + + err := json.Unmarshal(out, &j) if err != nil { return err } - } else { - out, err = ctx.JSONMarshaler.MarshalJSON(toPrint) + + out, err = yaml.Marshal(j) if err != nil { return err } diff --git a/codec/yaml.go b/codec/yaml.go index 20a9564ba48f..817fb8e4c0bc 100644 --- a/codec/yaml.go +++ b/codec/yaml.go @@ -3,12 +3,13 @@ package codec import ( "encoding/json" + "github.com/gogo/protobuf/proto" "gopkg.in/yaml.v2" ) // MarshalYAML marshals the provided toPrint content with the provided JSON marshaler // by encoding JSON, decoding JSON, and then encoding YAML. -func MarshalYAML(jsonMarshaler JSONMarshaler, toPrint interface{}) ([]byte, error) { +func MarshalYAML(jsonMarshaler JSONMarshaler, toPrint proto.Message) ([]byte, error) { bz, err := jsonMarshaler.MarshalJSON(toPrint) if err != nil { return nil, err diff --git a/codec/yaml_test.go b/codec/yaml_test.go index fc9488997cb1..e9206a74a3d7 100644 --- a/codec/yaml_test.go +++ b/codec/yaml_test.go @@ -35,7 +35,7 @@ x: "0" `, string(bz)) // amino - aminoCdc := &codec.Codec{testdata.NewTestAmino()} + aminoCdc := codec.NewAminoCodec(&codec.LegacyAmino{testdata.NewTestAmino()}) bz, err = codec.MarshalYAML(aminoCdc, hasAnimal) require.NoError(t, err) require.Equal(t, `type: testdata/HasAnimal diff --git a/testutil/testdata/test_tx.go b/testutil/testdata/test_tx.go index bbcfde5f8195..2a8cab662818 100644 --- a/testutil/testdata/test_tx.go +++ b/testutil/testdata/test_tx.go @@ -5,6 +5,7 @@ import ( "github.com/tendermint/tendermint/crypto" + "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -12,7 +13,7 @@ import ( // KeyTestPubAddr generates a new secp256k1 keypair. func KeyTestPubAddr() (crypto.PrivKey, crypto.PubKey, sdk.AccAddress) { key := secp256k1.GenPrivKey() - pub := key.PubKey() + pub := &keys.Secp256K1PubKey{Key: key.PubKey().(secp256k1.PubKey)} addr := sdk.AccAddress(pub.Address()) return key, pub, addr } diff --git a/x/auth/ante/sigverify.go b/x/auth/ante/sigverify.go index 7d1fea1ebec9..eaa7ac575415 100644 --- a/x/auth/ante/sigverify.go +++ b/x/auth/ante/sigverify.go @@ -5,8 +5,10 @@ import ( "encoding/hex" "fmt" + "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" sdk "github.com/cosmos/cosmos-sdk/types" @@ -79,7 +81,11 @@ func (spkd SetPubKeyDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate b if acc.GetPubKey() != nil { continue } - err = acc.SetPubKey(pk) + protoPk, err := keys.AminoPubKeyToProtoPubKey(pk) + if err != nil { + return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidPubKey, err.Error()) + } + err = acc.SetPubKey(protoPk.(crypto.PubKey)) if err != nil { return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidPubKey, err.Error()) } @@ -331,7 +337,10 @@ func DefaultSigVerificationGasConsumer( meter sdk.GasMeter, sig signing.SignatureV2, params types.Params, ) error { pubkey := sig.PubKey - + // protoPk, err := keys.AminoPubKeyToProtoPubKey(pubkey) + // if err != nil { + // return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidPubKey, err.Error()) + // } switch pubkey := pubkey.(type) { case ed25519.PubKey: meter.ConsumeGas(params.SigVerifyCostED25519, "ante verify: ed25519") diff --git a/x/auth/types/account.go b/x/auth/types/account.go index 79c3fc28692d..e2b1a82d5569 100644 --- a/x/auth/types/account.go +++ b/x/auth/types/account.go @@ -72,6 +72,9 @@ func (acc *BaseAccount) SetAddress(addr sdk.AccAddress) error { // GetPubKey - Implements sdk.AccountI. func (acc BaseAccount) GetPubKey() (pk crypto.PubKey) { + if acc.PubKey == nil { + return nil + } content, ok := acc.PubKey.GetCachedValue().(crypto.PubKey) if !ok { return nil @@ -81,17 +84,21 @@ func (acc BaseAccount) GetPubKey() (pk crypto.PubKey) { // SetPubKey - Implements sdk.AccountI. func (acc *BaseAccount) SetPubKey(pubKey crypto.PubKey) error { - protoMsg, ok := pubKey.(proto.Message) - if !ok { - return sdkerrors.ErrInvalidPubKey - } + if pubKey == nil { + acc.PubKey = nil + } else { + protoMsg, ok := pubKey.(proto.Message) + if !ok { + return sdkerrors.ErrInvalidPubKey + } - any, err := codectypes.NewAnyWithValue(protoMsg) - if err != nil { - return nil - } + any, err := codectypes.NewAnyWithValue(protoMsg) + if err != nil { + return nil + } - acc.PubKey = any + acc.PubKey = any + } return nil } @@ -135,13 +142,22 @@ func (acc BaseAccount) String() string { // MarshalYAML returns the YAML representation of an account. func (acc BaseAccount) MarshalYAML() (interface{}, error) { - bz, err := codec.MarshalYAML(codec.NewProtoCodec(codectypes.NewInterfaceRegistry()), acc) + bz, err := codec.MarshalYAML(codec.NewProtoCodec(codectypes.NewInterfaceRegistry()), &acc) if err != nil { return nil, err } return string(bz), err } +// UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces +func (acc BaseAccount) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { + if acc.PubKey == nil { + return nil + } + var pubKey crypto.PubKey + return unpacker.UnpackAny(acc.PubKey, &pubKey) +} + // NewModuleAddress creates an AccAddress from the hash of the module's name func NewModuleAddress(name string) sdk.AccAddress { return sdk.AccAddress(crypto.AddressHash([]byte(name))) From e0fc222cc04b810d8b15c6ce224ca9c6dac0537c Mon Sep 17 00:00:00 2001 From: blushi Date: Wed, 9 Sep 2020 09:29:50 +0200 Subject: [PATCH 028/128] Remove pk conversion in ante handler --- x/auth/ante/sigverify.go | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/x/auth/ante/sigverify.go b/x/auth/ante/sigverify.go index eaa7ac575415..cc4cb00de480 100644 --- a/x/auth/ante/sigverify.go +++ b/x/auth/ante/sigverify.go @@ -5,10 +5,8 @@ import ( "encoding/hex" "fmt" - "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/ed25519" - "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" sdk "github.com/cosmos/cosmos-sdk/types" @@ -81,11 +79,7 @@ func (spkd SetPubKeyDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate b if acc.GetPubKey() != nil { continue } - protoPk, err := keys.AminoPubKeyToProtoPubKey(pk) - if err != nil { - return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidPubKey, err.Error()) - } - err = acc.SetPubKey(protoPk.(crypto.PubKey)) + err = acc.SetPubKey(pk) if err != nil { return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidPubKey, err.Error()) } @@ -337,10 +331,6 @@ func DefaultSigVerificationGasConsumer( meter sdk.GasMeter, sig signing.SignatureV2, params types.Params, ) error { pubkey := sig.PubKey - // protoPk, err := keys.AminoPubKeyToProtoPubKey(pubkey) - // if err != nil { - // return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidPubKey, err.Error()) - // } switch pubkey := pubkey.(type) { case ed25519.PubKey: meter.ConsumeGas(params.SigVerifyCostED25519, "ante verify: ed25519") From d9eee8d40b813130cef21c5df189f3c7ea164259 Mon Sep 17 00:00:00 2001 From: blushi Date: Wed, 9 Sep 2020 12:53:45 +0200 Subject: [PATCH 029/128] Use internal crypto.PubKey in multisig --- crypto/keys/multisig.go | 2 +- crypto/keys/secp256k1.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/crypto/keys/multisig.go b/crypto/keys/multisig.go index 5cc0313d2e58..eae39c20859c 100644 --- a/crypto/keys/multisig.go +++ b/crypto/keys/multisig.go @@ -88,7 +88,7 @@ func (m *MultisigThresholdPubKey) GetPubKeys() []crypto.PubKey { if m != nil { pubKeys := make([]crypto.PubKey, len(m.PubKeys)) for i := 0; i < len(m.PubKeys); i++ { - pubKeys[i] = m.PubKeys[i].GetCachedValue().(tmcrypto.PubKey) + pubKeys[i] = m.PubKeys[i].GetCachedValue().(crypto.PubKey) } return pubKeys } diff --git a/crypto/keys/secp256k1.go b/crypto/keys/secp256k1.go index 379cf8725f99..1f01e4140fc7 100644 --- a/crypto/keys/secp256k1.go +++ b/crypto/keys/secp256k1.go @@ -5,6 +5,7 @@ import ( crypto "github.com/cosmos/cosmos-sdk/crypto/types" ) +// asserting interface implementation var ( _ crypto.PubKey = &Secp256K1PubKey{} _ crypto.PrivKey = &Secp256K1PrivKey{} From 339f4609d35f01583b9e76bbd0f7a94c7d6f7814 Mon Sep 17 00:00:00 2001 From: blushi Date: Wed, 9 Sep 2020 15:12:19 +0200 Subject: [PATCH 030/128] Add tests for MultisigThresholdPubKey VerifyMultisignature --- crypto/keys/multisig_test.go | 124 ++++++++++++++++++++++++++++++++++- 1 file changed, 123 insertions(+), 1 deletion(-) diff --git a/crypto/keys/multisig_test.go b/crypto/keys/multisig_test.go index 1e213090532e..44f9f73766af 100644 --- a/crypto/keys/multisig_test.go +++ b/crypto/keys/multisig_test.go @@ -84,7 +84,97 @@ func TestEquals(t *testing.T) { } func TestVerifyMultisignature(t *testing.T) { - // TODO + var ( + pk multisig.PubKey + sig *signing.MultiSignatureData + ) + msg := []byte{1, 2, 3, 4} + signBytesFn := func(mode signing.SignMode) ([]byte, error) { return msg, nil } + + testCases := []struct { + msg string + malleate func() + expectPass bool + }{ + { + "nested multisignature", + func() { + genPk, genSig, err := generateNestedMultiSignature(3, msg) + require.NoError(t, err) + sig = genSig + pk = genPk + }, + true, + }, + { + "wrong size for sig bit array", + func() { + pubKeys, _ := generatePubKeysAndSignatures(3, msg) + anyPubKeys, err := packPubKeys(pubKeys) + require.NoError(t, err) + pk = &keys.MultisigThresholdPubKey{K: 3, PubKeys: anyPubKeys} + sig = multisig.NewMultisig(1) + }, + false, + }, + { + "single signature data", + func() { + k := 2 + signingIndices := []int{0, 3, 1} + pubKeys, sigs := generatePubKeysAndSignatures(5, msg) + anyPubKeys, err := packPubKeys(pubKeys) + require.NoError(t, err) + pk = &keys.MultisigThresholdPubKey{K: uint32(k), PubKeys: anyPubKeys} + sig = multisig.NewMultisig(len(pubKeys)) + signBytesFn := func(mode signing.SignMode) ([]byte, error) { return msg, nil } + + for i := 0; i < k-1; i++ { + signingIndex := signingIndices[i] + require.NoError( + t, + multisig.AddSignatureFromPubKey(sig, sigs[signingIndex], pubKeys[signingIndex], pubKeys), + ) + require.Error( + t, + pk.VerifyMultisignature(signBytesFn, sig), + "multisig passed when i < k, i %d", i, + ) + require.NoError( + t, + multisig.AddSignatureFromPubKey(sig, sigs[signingIndex], pubKeys[signingIndex], pubKeys), + ) + } + require.Error( + t, + pk.VerifyMultisignature(signBytesFn, sig), + "multisig passed with k - 1 sigs", + ) + require.NoError( + t, + multisig.AddSignatureFromPubKey( + sig, + sigs[signingIndices[k]], + pubKeys[signingIndices[k]], + pubKeys, + ), + ) + }, + true, + }, + } + + for _, tc := range testCases { + t.Run(tc.msg, func(t *testing.T) { + tc.malleate() + err := pk.VerifyMultisignature(signBytesFn, sig) + if tc.expectPass { + require.NoError(t, err) + } else { + require.Error(t, err) + } + }) + } } func generatePubKeysAndSignatures(n int, msg []byte) (pubKeys []crypto.PubKey, signatures []signing.SignatureData) { @@ -101,6 +191,38 @@ func generatePubKeysAndSignatures(n int, msg []byte) (pubKeys []crypto.PubKey, s return } +func generateNestedMultiSignature(n int, msg []byte) (multisig.PubKey, *signing.MultiSignatureData, error) { + pubKeys := make([]crypto.PubKey, n) + signatures := make([]signing.SignatureData, n) + bitArray := crypto.NewCompactBitArray(n) + for i := 0; i < n; i++ { + nestedPks, nestedSigs := generatePubKeysAndSignatures(5, msg) + nestedBitArray := crypto.NewCompactBitArray(5) + for j := 0; j < 5; j++ { + nestedBitArray.SetIndex(j, true) + } + nestedSig := &signing.MultiSignatureData{ + BitArray: nestedBitArray, + Signatures: nestedSigs, + } + signatures[i] = nestedSig + anyNestedPks, err := packPubKeys(nestedPks) + if err != nil { + return nil, nil, err + } + pubKeys[i] = &keys.MultisigThresholdPubKey{K: 5, PubKeys: anyNestedPks} + bitArray.SetIndex(i, true) + } + anyPubKeys, err := packPubKeys(pubKeys) + if err != nil { + return nil, nil, err + } + return &keys.MultisigThresholdPubKey{K: uint32(n), PubKeys: anyPubKeys}, &signing.MultiSignatureData{ + BitArray: bitArray, + Signatures: signatures, + }, nil +} + func packPubKeys(pubKeys []crypto.PubKey) ([]*types.Any, error) { anyPubKeys := make([]*types.Any, len(pubKeys)) From af942727729dd05fb8446218511944ccd737ec79 Mon Sep 17 00:00:00 2001 From: blushi Date: Thu, 10 Sep 2020 09:30:36 +0200 Subject: [PATCH 031/128] Only keep LegacyAminoMultisigThresholdPubKey and move to proto keys to v1 --- crypto/codec/amino.go | 4 +- crypto/keys/keys.go | 4 +- crypto/keys/keys.pb.go | 298 +---- crypto/keys/keys_test.go | 6 +- crypto/keys/multisig.go | 20 +- crypto/keys/multisig_test.go | 20 +- .../types/multisig/threshold_pubkey_test.go | 2 +- .../cosmos/crypto/{v1beta1 => v1}/keys.proto | 15 +- x/ibc/04-channel/types/channel.pb.go | 2 +- x/staking/types/staking.pb.go | 1161 ++++++++--------- 10 files changed, 653 insertions(+), 879 deletions(-) rename proto/cosmos/crypto/{v1beta1 => v1}/keys.proto (61%) diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index 0c1b33cc2cca..a80aede72707 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -32,8 +32,8 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { multisig.PubKeyAminoRoute, nil) cdc.RegisterConcrete(&keys.Secp256K1PubKey{}, "cosmos-sdk/Secp256K1PubKey", nil) - cdc.RegisterConcrete(&keys.MultisigThresholdPubKey{}, - "cosmos-sdk/MultisigThresholdPubKey", nil) + cdc.RegisterConcrete(&keys.LegacyAminoMultisigThresholdPubKey{}, + "cosmos-sdk/LegacyAminoMultisigThresholdPubKey", nil) cdc.RegisterInterface((*crypto.PrivKey)(nil), nil) cdc.RegisterConcrete(ed25519.PrivKey{}, diff --git a/crypto/keys/keys.go b/crypto/keys/keys.go index 14b10571eb44..6c2c5e7fc7f7 100644 --- a/crypto/keys/keys.go +++ b/crypto/keys/keys.go @@ -15,7 +15,7 @@ func ProtoPubKeyToAminoPubKey(msg proto.Message) (crypto.PubKey, error) { switch msg := msg.(type) { case *Secp256K1PubKey: return msg.GetKey(), nil - case *MultisigThresholdPubKey: + case *LegacyAminoMultisigThresholdPubKey: keys := make([]crypto.PubKey, len(msg.PubKeys)) for i, any := range msg.PubKeys { cachedKey, ok := any.GetCachedValue().(proto.Message) @@ -52,7 +52,7 @@ func AminoPubKeyToProtoPubKey(key crypto.PubKey) (proto.Message, error) { } keys[i] = any } - return &MultisigThresholdPubKey{K: uint32(key.K), PubKeys: keys}, nil + return &LegacyAminoMultisigThresholdPubKey{K: uint32(key.K), PubKeys: keys}, nil default: return nil, fmt.Errorf("unknown public key type: %v", key) } diff --git a/crypto/keys/keys.pb.go b/crypto/keys/keys.pb.go index 7f5a32a7ea2a..32f40eb5868a 100644 --- a/crypto/keys/keys.pb.go +++ b/crypto/keys/keys.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: cosmos/crypto/v1beta1/keys.proto +// source: cosmos/crypto/v1/keys.proto package keys @@ -25,47 +25,9 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// MultisigThresholdPubKey specifies a public key type which nests multiple public -// keys and a threshold -type MultisigThresholdPubKey struct { - K uint32 `protobuf:"varint,1,opt,name=threshold,proto3" json:"threshold,omitempty" yaml:"threshold"` - PubKeys []*types.Any `protobuf:"bytes,2,rep,name=public_keys,json=publicKeys,proto3" json:"public_keys,omitempty" yaml:"pubkeys"` -} - -func (m *MultisigThresholdPubKey) Reset() { *m = MultisigThresholdPubKey{} } -func (m *MultisigThresholdPubKey) String() string { return proto.CompactTextString(m) } -func (*MultisigThresholdPubKey) ProtoMessage() {} -func (*MultisigThresholdPubKey) Descriptor() ([]byte, []int) { - return fileDescriptor_1e964ea87598ec3f, []int{0} -} -func (m *MultisigThresholdPubKey) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MultisigThresholdPubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MultisigThresholdPubKey.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MultisigThresholdPubKey) XXX_Merge(src proto.Message) { - xxx_messageInfo_MultisigThresholdPubKey.Merge(m, src) -} -func (m *MultisigThresholdPubKey) XXX_Size() int { - return m.Size() -} -func (m *MultisigThresholdPubKey) XXX_DiscardUnknown() { - xxx_messageInfo_MultisigThresholdPubKey.DiscardUnknown(m) -} - -var xxx_messageInfo_MultisigThresholdPubKey proto.InternalMessageInfo - -// LegacyAminoMultisigThresholdPubKey is a version of MultisigThresholdPubKey which uses legacy amino address rules +// LegacyAminoMultisigThresholdPubKey specifies a public key type +// which nests multiple public keys and a threshold, +// it uses legacy amino address rules type LegacyAminoMultisigThresholdPubKey struct { K uint32 `protobuf:"varint,1,opt,name=threshold,proto3" json:"threshold,omitempty" yaml:"threshold"` PubKeys []*types.Any `protobuf:"bytes,2,rep,name=public_keys,json=publicKeys,proto3" json:"public_keys,omitempty" yaml:"pubkeys"` @@ -75,7 +37,7 @@ func (m *LegacyAminoMultisigThresholdPubKey) Reset() { *m = LegacyAminoM func (m *LegacyAminoMultisigThresholdPubKey) String() string { return proto.CompactTextString(m) } func (*LegacyAminoMultisigThresholdPubKey) ProtoMessage() {} func (*LegacyAminoMultisigThresholdPubKey) Descriptor() ([]byte, []int) { - return fileDescriptor_1e964ea87598ec3f, []int{1} + return fileDescriptor_eeb831e3a63b6aad, []int{0} } func (m *LegacyAminoMultisigThresholdPubKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -104,20 +66,6 @@ func (m *LegacyAminoMultisigThresholdPubKey) XXX_DiscardUnknown() { var xxx_messageInfo_LegacyAminoMultisigThresholdPubKey proto.InternalMessageInfo -func (m *LegacyAminoMultisigThresholdPubKey) GetK() uint32 { - if m != nil { - return m.K - } - return 0 -} - -func (m *LegacyAminoMultisigThresholdPubKey) GetPubKeys() []*types.Any { - if m != nil { - return m.PubKeys - } - return nil -} - // Secp256K1PubKey defines a secp256k1 public key type Secp256K1PubKey struct { Key github_com_cosmos_cosmos_sdk_crypto_keys_secp256k1.PubKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1.PubKey" json:"key,omitempty"` @@ -127,7 +75,7 @@ func (m *Secp256K1PubKey) Reset() { *m = Secp256K1PubKey{} } func (m *Secp256K1PubKey) String() string { return proto.CompactTextString(m) } func (*Secp256K1PubKey) ProtoMessage() {} func (*Secp256K1PubKey) Descriptor() ([]byte, []int) { - return fileDescriptor_1e964ea87598ec3f, []int{2} + return fileDescriptor_eeb831e3a63b6aad, []int{1} } func (m *Secp256K1PubKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -172,7 +120,7 @@ func (m *Secp256K1PrivKey) Reset() { *m = Secp256K1PrivKey{} } func (m *Secp256K1PrivKey) String() string { return proto.CompactTextString(m) } func (*Secp256K1PrivKey) ProtoMessage() {} func (*Secp256K1PrivKey) Descriptor() ([]byte, []int) { - return fileDescriptor_1e964ea87598ec3f, []int{3} + return fileDescriptor_eeb831e3a63b6aad, []int{2} } func (m *Secp256K1PrivKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -209,82 +157,38 @@ func (m *Secp256K1PrivKey) GetKey() github_com_cosmos_cosmos_sdk_crypto_keys_sec } func init() { - proto.RegisterType((*MultisigThresholdPubKey)(nil), "cosmos.crypto.v1beta1.MultisigThresholdPubKey") - proto.RegisterType((*LegacyAminoMultisigThresholdPubKey)(nil), "cosmos.crypto.v1beta1.LegacyAminoMultisigThresholdPubKey") - proto.RegisterType((*Secp256K1PubKey)(nil), "cosmos.crypto.v1beta1.Secp256K1PubKey") - proto.RegisterType((*Secp256K1PrivKey)(nil), "cosmos.crypto.v1beta1.Secp256K1PrivKey") -} - -func init() { proto.RegisterFile("cosmos/crypto/v1beta1/keys.proto", fileDescriptor_1e964ea87598ec3f) } - -var fileDescriptor_1e964ea87598ec3f = []byte{ - // 380 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x48, 0xce, 0x2f, 0xce, - 0xcd, 0x2f, 0xd6, 0x4f, 0x2e, 0xaa, 0x2c, 0x28, 0xc9, 0xd7, 0x2f, 0x33, 0x4c, 0x4a, 0x2d, 0x49, - 0x34, 0xd4, 0xcf, 0x4e, 0xad, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x85, 0xa8, - 0xd0, 0x83, 0xa8, 0xd0, 0x83, 0xaa, 0x90, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0xab, 0xd0, 0x07, - 0xb1, 0x20, 0x8a, 0xa5, 0x24, 0xd3, 0xf3, 0xf3, 0xd3, 0x73, 0x52, 0xf5, 0xc1, 0xbc, 0xa4, 0xd2, - 0x34, 0xfd, 0xc4, 0xbc, 0x4a, 0x88, 0x94, 0xd2, 0x3a, 0x46, 0x2e, 0x71, 0xdf, 0xd2, 0x9c, 0x92, - 0xcc, 0xe2, 0xcc, 0xf4, 0x90, 0x8c, 0xa2, 0xd4, 0xe2, 0x8c, 0xfc, 0x9c, 0x94, 0x80, 0xd2, 0x24, - 0xef, 0xd4, 0x4a, 0x21, 0x73, 0x2e, 0xce, 0x12, 0x98, 0x90, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0xaf, - 0x93, 0xe4, 0xa3, 0x7b, 0xf2, 0x8c, 0xde, 0x9f, 0xee, 0xc9, 0x0b, 0x54, 0x26, 0xe6, 0xe6, 0x58, - 0x29, 0xc1, 0xe5, 0x95, 0x82, 0x10, 0x6a, 0x85, 0x42, 0xb8, 0xb8, 0x0b, 0x4a, 0x93, 0x72, 0x32, - 0x93, 0xe3, 0x41, 0x2e, 0x96, 0x60, 0x52, 0x60, 0xd6, 0xe0, 0x36, 0x12, 0xd1, 0x83, 0xb8, 0x42, - 0x0f, 0xe6, 0x0a, 0x3d, 0xc7, 0xbc, 0x4a, 0x27, 0xd9, 0x47, 0xf7, 0xe4, 0xd9, 0x21, 0xf6, 0x15, - 0x7f, 0xba, 0x27, 0xcf, 0x07, 0x31, 0xb6, 0xa0, 0x34, 0x09, 0xa4, 0x53, 0x29, 0x88, 0x0b, 0x62, - 0x0e, 0x48, 0xd6, 0x8a, 0xa5, 0x63, 0x81, 0x3c, 0x83, 0xd2, 0x66, 0x46, 0x2e, 0x25, 0x9f, 0xd4, - 0xf4, 0xc4, 0xe4, 0x4a, 0xc7, 0xdc, 0xcc, 0xbc, 0xfc, 0xa1, 0xe1, 0x76, 0xa5, 0x24, 0x2e, 0xfe, - 0xe0, 0xd4, 0xe4, 0x02, 0x23, 0x53, 0x33, 0x6f, 0x43, 0xa8, 0x0b, 0xfd, 0xb9, 0x98, 0xb3, 0x53, - 0x2b, 0xc1, 0x6e, 0xe3, 0x71, 0xb2, 0xfd, 0x75, 0x4f, 0xde, 0x32, 0x3d, 0xb3, 0x24, 0xa3, 0x34, - 0x49, 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x16, 0xff, 0x60, 0x4a, 0xb7, 0x38, 0x25, 0x1b, 0x96, 0x14, - 0x40, 0x46, 0xeb, 0x17, 0x43, 0x8c, 0xca, 0x36, 0xd4, 0x83, 0x98, 0x15, 0x04, 0x32, 0x49, 0x29, - 0x85, 0x4b, 0x00, 0x61, 0x47, 0x51, 0x66, 0x19, 0xc8, 0x92, 0x00, 0x64, 0x4b, 0xec, 0x7e, 0xdd, - 0x93, 0xb7, 0x22, 0xc7, 0x12, 0x88, 0x61, 0x60, 0x5b, 0x9c, 0x9c, 0x4e, 0x3c, 0x92, 0x63, 0xbc, - 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, - 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0x4a, 0x83, 0x58, 0xa3, 0x93, 0xd8, 0xc0, 0xc1, 0x68, 0x0c, 0x08, - 0x00, 0x00, 0xff, 0xff, 0x53, 0xb6, 0xd7, 0x18, 0xe7, 0x02, 0x00, 0x00, -} - -func (m *MultisigThresholdPubKey) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MultisigThresholdPubKey) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MultisigThresholdPubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.PubKeys) > 0 { - for iNdEx := len(m.PubKeys) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.PubKeys[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintKeys(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if m.K != 0 { - i = encodeVarintKeys(dAtA, i, uint64(m.K)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil + proto.RegisterType((*LegacyAminoMultisigThresholdPubKey)(nil), "cosmos.crypto.v1.LegacyAminoMultisigThresholdPubKey") + proto.RegisterType((*Secp256K1PubKey)(nil), "cosmos.crypto.v1.Secp256K1PubKey") + proto.RegisterType((*Secp256K1PrivKey)(nil), "cosmos.crypto.v1.Secp256K1PrivKey") +} + +func init() { proto.RegisterFile("cosmos/crypto/v1/keys.proto", fileDescriptor_eeb831e3a63b6aad) } + +var fileDescriptor_eeb831e3a63b6aad = []byte{ + // 366 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x90, 0x3f, 0x4f, 0xf2, 0x40, + 0x1c, 0xc7, 0xdb, 0x87, 0x27, 0x1a, 0x0f, 0xff, 0x10, 0xc2, 0x00, 0x18, 0x5b, 0xd2, 0x89, 0xc5, + 0xbb, 0x14, 0xa3, 0x46, 0x12, 0x4d, 0xe8, 0x8a, 0x46, 0x82, 0x4c, 0x2e, 0x86, 0x96, 0xf3, 0x68, + 0xda, 0x72, 0x4d, 0xaf, 0x25, 0xb9, 0x77, 0xe0, 0xe8, 0x4b, 0xf0, 0x6d, 0xf8, 0x0e, 0x1c, 0x19, + 0x9d, 0x1a, 0x53, 0xde, 0x01, 0x23, 0x93, 0xb9, 0x9e, 0x15, 0x47, 0xe3, 0xd4, 0xde, 0x7d, 0x7f, + 0xf7, 0xf9, 0x7c, 0xf3, 0x03, 0x87, 0x0e, 0x65, 0x01, 0x65, 0xc8, 0x89, 0x78, 0x18, 0x53, 0x34, + 0x37, 0x91, 0x87, 0x39, 0x83, 0x61, 0x44, 0x63, 0x5a, 0xad, 0xc8, 0x10, 0xca, 0x10, 0xce, 0xcd, + 0x66, 0x8d, 0x50, 0x42, 0xf3, 0x10, 0x89, 0x3f, 0x39, 0xd7, 0x6c, 0x10, 0x4a, 0x89, 0x8f, 0x51, + 0x7e, 0xb2, 0x93, 0x47, 0x34, 0x9e, 0x71, 0x19, 0x19, 0xaf, 0x2a, 0x30, 0xae, 0x31, 0x19, 0x3b, + 0xbc, 0x17, 0xb8, 0x33, 0x7a, 0x93, 0xf8, 0xb1, 0xcb, 0x5c, 0x32, 0x9a, 0x46, 0x98, 0x4d, 0xa9, + 0x3f, 0x19, 0x24, 0x76, 0x1f, 0xf3, 0xea, 0x39, 0xd8, 0x89, 0x8b, 0xab, 0xba, 0xda, 0x52, 0xdb, + 0x7b, 0x56, 0x23, 0x4b, 0x75, 0xb5, 0xbf, 0x4a, 0xf5, 0x0a, 0x1f, 0x07, 0x7e, 0xd7, 0xf8, 0xce, + 0x8d, 0xe1, 0x66, 0xb6, 0x3a, 0x02, 0xe5, 0x30, 0xb1, 0x7d, 0xd7, 0x79, 0x10, 0xbd, 0xeb, 0xff, + 0x5a, 0xa5, 0x76, 0xb9, 0x53, 0x83, 0xb2, 0x10, 0x2c, 0x0a, 0xc1, 0xde, 0x8c, 0x5b, 0x47, 0x59, + 0xaa, 0x6f, 0x4b, 0x1f, 0x5b, 0xa5, 0xfa, 0xbe, 0xc4, 0x86, 0x89, 0x2d, 0x5e, 0x1a, 0x43, 0x20, + 0x39, 0x22, 0xed, 0xfe, 0x7f, 0x7a, 0xd1, 0x15, 0xc3, 0x06, 0x07, 0x77, 0xd8, 0x09, 0x3b, 0xa7, + 0x67, 0x7d, 0xf3, 0xab, 0xe7, 0x2d, 0x28, 0x79, 0x98, 0xe7, 0x0d, 0x77, 0xad, 0xcb, 0x75, 0xaa, + 0x5f, 0x10, 0x37, 0x9e, 0x26, 0x36, 0x74, 0x68, 0x80, 0x8a, 0x55, 0xe6, 0x9f, 0x63, 0x36, 0xf1, + 0x8a, 0xad, 0x0a, 0x01, 0x62, 0x12, 0xe5, 0x99, 0x50, 0xb2, 0x86, 0x82, 0x64, 0x4c, 0x40, 0x65, + 0xe3, 0x88, 0xdc, 0xb9, 0x90, 0x0c, 0x7e, 0x4a, 0xae, 0xd6, 0xa9, 0xde, 0xfd, 0x8b, 0x44, 0xc2, + 0x72, 0x8b, 0x65, 0xbd, 0x65, 0x9a, 0xba, 0xc8, 0x34, 0xf5, 0x23, 0xd3, 0xd4, 0xe7, 0xa5, 0xa6, + 0x2c, 0x96, 0x9a, 0xf2, 0xbe, 0xd4, 0x94, 0xfb, 0xf6, 0x6f, 0xd1, 0xf6, 0x56, 0xbe, 0xcc, 0x93, + 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1b, 0xae, 0x95, 0x7c, 0x32, 0x02, 0x00, 0x00, } func (m *LegacyAminoMultisigThresholdPubKey) Marshal() (dAtA []byte, err error) { @@ -400,24 +304,6 @@ func encodeVarintKeys(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } -func (m *MultisigThresholdPubKey) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.K != 0 { - n += 1 + sovKeys(uint64(m.K)) - } - if len(m.PubKeys) > 0 { - for _, e := range m.PubKeys { - l = e.Size() - n += 1 + l + sovKeys(uint64(l)) - } - } - return n -} - func (m *LegacyAminoMultisigThresholdPubKey) Size() (n int) { if m == nil { return 0 @@ -468,112 +354,6 @@ func sovKeys(x uint64) (n int) { func sozKeys(x uint64) (n int) { return sovKeys(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (m *MultisigThresholdPubKey) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MultisigThresholdPubKey: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MultisigThresholdPubKey: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field K", wireType) - } - m.K = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.K |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PubKeys", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthKeys - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthKeys - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PubKeys = append(m.PubKeys, &types.Any{}) - if err := m.PubKeys[len(m.PubKeys)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipKeys(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *LegacyAminoMultisigThresholdPubKey) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/crypto/keys/keys_test.go b/crypto/keys/keys_test.go index 20b327e5f792..032d860fcbcf 100644 --- a/crypto/keys/keys_test.go +++ b/crypto/keys/keys_test.go @@ -32,7 +32,7 @@ func TestProtoPubKeyToAminoPubKey(t *testing.T) { true, }, { - "MultisigThresholdPubKey", + "LegacyAminoMultisigThresholdPubKey", func() { pubKey1 := secp256k1.GenPrivKey().PubKey() pubKey2 := secp256k1.GenPrivKey().PubKey() @@ -42,7 +42,7 @@ func TestProtoPubKeyToAminoPubKey(t *testing.T) { anyPubKeys, err := packPubKeys([]crypto.PubKey{pbPubKey1, pbPubKey2}) require.NoError(t, err) - pbPubKey = &keys.MultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys} + pbPubKey = &keys.LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys} aminoPubKey = multisig.NewPubKeyMultisigThreshold(1, []crypto.PubKey{pubKey1, pubKey2}) }, true, @@ -99,7 +99,7 @@ func TestAminoPubKeyToProtoPubKey(t *testing.T) { anyPubKeys, err := packPubKeys([]crypto.PubKey{pbPubKey1, pbPubKey2}) require.NoError(t, err) - pbPubKey = &keys.MultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys} + pbPubKey = &keys.LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys} aminoPubKey = multisig.NewPubKeyMultisigThreshold(1, []crypto.PubKey{pubKey1, pubKey2}) }, true, diff --git a/crypto/keys/multisig.go b/crypto/keys/multisig.go index eae39c20859c..b069e7014b0a 100644 --- a/crypto/keys/multisig.go +++ b/crypto/keys/multisig.go @@ -15,20 +15,20 @@ import ( var cdc = codec.NewProtoCodec(types.NewInterfaceRegistry()) -var _ multisig.PubKey = &MultisigThresholdPubKey{} +var _ multisig.PubKey = &LegacyAminoMultisigThresholdPubKey{} // Address implements crypto.PubKey Address method -func (m *MultisigThresholdPubKey) Address() crypto.Address { +func (m *LegacyAminoMultisigThresholdPubKey) Address() crypto.Address { return tmcrypto.AddressHash(m.Bytes()) } -// Bytes returns the proto encoded version of the MultisigThresholdPubKey -func (m *MultisigThresholdPubKey) Bytes() []byte { +// Bytes returns the proto encoded version of the LegacyAminoMultisigThresholdPubKey +func (m *LegacyAminoMultisigThresholdPubKey) Bytes() []byte { return cdc.MustMarshalBinaryBare(m) } // VerifyMultisignature implements the multisig.PubKey VerifyMultisignature method -func (m *MultisigThresholdPubKey) VerifyMultisignature(getSignBytes multisig.GetSignBytesFunc, sig *signing.MultiSignatureData) error { +func (m *LegacyAminoMultisigThresholdPubKey) VerifyMultisignature(getSignBytes multisig.GetSignBytesFunc, sig *signing.MultiSignatureData) error { bitarray := sig.BitArray sigs := sig.Signatures size := bitarray.Count() @@ -79,12 +79,12 @@ func (m *MultisigThresholdPubKey) VerifyMultisignature(getSignBytes multisig.Get // VerifySignature implements crypto.PubKey VerifySignature method, // it panics because it can't handle MultiSignatureData // cf. https://github.com/cosmos/cosmos-sdk/issues/7109#issuecomment-686329936 -func (m *MultisigThresholdPubKey) VerifySignature(msg []byte, sig []byte) bool { +func (m *LegacyAminoMultisigThresholdPubKey) VerifySignature(msg []byte, sig []byte) bool { panic("not implemented") } // GetPubKeys implements the PubKey.GetPubKeys method -func (m *MultisigThresholdPubKey) GetPubKeys() []crypto.PubKey { +func (m *LegacyAminoMultisigThresholdPubKey) GetPubKeys() []crypto.PubKey { if m != nil { pubKeys := make([]crypto.PubKey, len(m.PubKeys)) for i := 0; i < len(m.PubKeys); i++ { @@ -98,7 +98,7 @@ func (m *MultisigThresholdPubKey) GetPubKeys() []crypto.PubKey { // Equals returns true if m and other both have the same number of keys, and // all constituent keys are the same, and in the same order. -func (m *MultisigThresholdPubKey) Equals(key crypto.PubKey) bool { +func (m *LegacyAminoMultisigThresholdPubKey) Equals(key crypto.PubKey) bool { otherKey, ok := key.(multisig.PubKey) if !ok { return false @@ -118,11 +118,11 @@ func (m *MultisigThresholdPubKey) Equals(key crypto.PubKey) bool { } // GetThreshold implements the PubKey.GetThreshold method -func (m *MultisigThresholdPubKey) GetThreshold() uint { +func (m *LegacyAminoMultisigThresholdPubKey) GetThreshold() uint { return uint(m.K) } // Type returns multisig type -func (m *MultisigThresholdPubKey) Type() string { +func (m *LegacyAminoMultisigThresholdPubKey) Type() string { return "PubKeyMultisigThreshold" } diff --git a/crypto/keys/multisig_test.go b/crypto/keys/multisig_test.go index 44f9f73766af..0c66b8d01351 100644 --- a/crypto/keys/multisig_test.go +++ b/crypto/keys/multisig_test.go @@ -19,7 +19,7 @@ func TestAddress(t *testing.T) { pubKeys, _ := generatePubKeysAndSignatures(5, msg) anyPubKeys, err := packPubKeys(pubKeys) require.NoError(t, err) - multisigKey := &keys.MultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys} + multisigKey := &keys.LegacyAminoMultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys} require.Len(t, multisigKey.Address().Bytes(), 20) } @@ -32,11 +32,11 @@ func TestEquals(t *testing.T) { pbPubKey2 := &keys.Secp256K1PubKey{Key: pubKey2.(secp256k1.PubKey)} anyPubKeys, err := packPubKeys([]crypto.PubKey{pbPubKey1, pbPubKey2}) require.NoError(t, err) - multisigKey := keys.MultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys} + multisigKey := keys.LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys} otherPubKeys, err := packPubKeys([]crypto.PubKey{pbPubKey1, &multisigKey}) require.NoError(t, err) - otherMultisigKey := keys.MultisigThresholdPubKey{K: 1, PubKeys: otherPubKeys} + otherMultisigKey := keys.LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: otherPubKeys} testCases := []struct { msg string @@ -45,17 +45,17 @@ func TestEquals(t *testing.T) { }{ { "equals with proto pub key", - &keys.MultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys}, + &keys.LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys}, true, }, { "different threshold", - &keys.MultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys}, + &keys.LegacyAminoMultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys}, false, }, { "different pub keys length", - &keys.MultisigThresholdPubKey{K: 1, PubKeys: []*types.Any{anyPubKeys[0]}}, + &keys.LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: []*types.Any{anyPubKeys[0]}}, false, }, { @@ -112,7 +112,7 @@ func TestVerifyMultisignature(t *testing.T) { pubKeys, _ := generatePubKeysAndSignatures(3, msg) anyPubKeys, err := packPubKeys(pubKeys) require.NoError(t, err) - pk = &keys.MultisigThresholdPubKey{K: 3, PubKeys: anyPubKeys} + pk = &keys.LegacyAminoMultisigThresholdPubKey{K: 3, PubKeys: anyPubKeys} sig = multisig.NewMultisig(1) }, false, @@ -125,7 +125,7 @@ func TestVerifyMultisignature(t *testing.T) { pubKeys, sigs := generatePubKeysAndSignatures(5, msg) anyPubKeys, err := packPubKeys(pubKeys) require.NoError(t, err) - pk = &keys.MultisigThresholdPubKey{K: uint32(k), PubKeys: anyPubKeys} + pk = &keys.LegacyAminoMultisigThresholdPubKey{K: uint32(k), PubKeys: anyPubKeys} sig = multisig.NewMultisig(len(pubKeys)) signBytesFn := func(mode signing.SignMode) ([]byte, error) { return msg, nil } @@ -210,14 +210,14 @@ func generateNestedMultiSignature(n int, msg []byte) (multisig.PubKey, *signing. if err != nil { return nil, nil, err } - pubKeys[i] = &keys.MultisigThresholdPubKey{K: 5, PubKeys: anyNestedPks} + pubKeys[i] = &keys.LegacyAminoMultisigThresholdPubKey{K: 5, PubKeys: anyNestedPks} bitArray.SetIndex(i, true) } anyPubKeys, err := packPubKeys(pubKeys) if err != nil { return nil, nil, err } - return &keys.MultisigThresholdPubKey{K: uint32(n), PubKeys: anyPubKeys}, &signing.MultiSignatureData{ + return &keys.LegacyAminoMultisigThresholdPubKey{K: uint32(n), PubKeys: anyPubKeys}, &signing.MultiSignatureData{ BitArray: bitArray, Signatures: signatures, }, nil diff --git a/crypto/types/multisig/threshold_pubkey_test.go b/crypto/types/multisig/threshold_pubkey_test.go index 8d16de661785..71ed9147100b 100644 --- a/crypto/types/multisig/threshold_pubkey_test.go +++ b/crypto/types/multisig/threshold_pubkey_test.go @@ -180,7 +180,7 @@ func TestMultiSigPubKeyEquality(t *testing.T) { require.NoError(t, err) anyPubKeys[i] = any } - other = &keys.MultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys} + other = &keys.LegacyAminoMultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys} }, true, }, diff --git a/proto/cosmos/crypto/v1beta1/keys.proto b/proto/cosmos/crypto/v1/keys.proto similarity index 61% rename from proto/cosmos/crypto/v1beta1/keys.proto rename to proto/cosmos/crypto/v1/keys.proto index 37e252217703..26e9fd1b849e 100644 --- a/proto/cosmos/crypto/v1beta1/keys.proto +++ b/proto/cosmos/crypto/v1/keys.proto @@ -1,26 +1,21 @@ syntax = "proto3"; -package cosmos.crypto.v1beta1; +package cosmos.crypto.v1; import "gogoproto/gogo.proto"; import "google/protobuf/any.proto"; option go_package = "github.com/cosmos/cosmos-sdk/crypto/keys"; -// MultisigThresholdPubKey specifies a public key type which nests multiple public -// keys and a threshold -message MultisigThresholdPubKey { +// LegacyAminoMultisigThresholdPubKey specifies a public key type +// which nests multiple public keys and a threshold, +// it uses legacy amino address rules +message LegacyAminoMultisigThresholdPubKey { option (gogoproto.goproto_getters) = false; uint32 threshold = 1 [(gogoproto.customname) = "K", (gogoproto.moretags) = "yaml:\"threshold\""]; repeated google.protobuf.Any public_keys = 2 [(gogoproto.customname) = "PubKeys", (gogoproto.moretags) = "yaml:\"pubkeys\""]; } -// LegacyAminoMultisigThresholdPubKey is a version of MultisigThresholdPubKey which uses legacy amino address rules -message LegacyAminoMultisigThresholdPubKey { - uint32 threshold = 1 [(gogoproto.customname) = "K", (gogoproto.moretags) = "yaml:\"threshold\""]; - repeated google.protobuf.Any public_keys = 2 [(gogoproto.customname) = "PubKeys", (gogoproto.moretags) = "yaml:\"pubkeys\""]; -} - // Secp256K1PubKey defines a secp256k1 public key message Secp256K1PubKey { bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1.PubKey"]; diff --git a/x/ibc/04-channel/types/channel.pb.go b/x/ibc/04-channel/types/channel.pb.go index 259e4095897e..ed0338cae9d4 100644 --- a/x/ibc/04-channel/types/channel.pb.go +++ b/x/ibc/04-channel/types/channel.pb.go @@ -1123,7 +1123,7 @@ func (m *PacketAckCommitment) XXX_DiscardUnknown() { var xxx_messageInfo_PacketAckCommitment proto.InternalMessageInfo // Acknowledgement is the recommended acknowledgement format to be used by -// app-specifc protocols. +// app-specific protocols. // NOTE: The field numbers 21 and 22 were explicitly chosen to avoid accidental // conflicts with other protobuf message formats used for acknowledgements. // The first byte of any message with this format will be the non-ASCII values diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 33a481d49ada..5d53eaf0737c 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -1265,587 +1265,586 @@ func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_ func StakingDescription() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { d := &github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet{} var gzipped = []byte{ - // 9273 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7b, 0x74, 0x1c, 0xd7, - 0x79, 0x18, 0xce, 0xd9, 0x07, 0xb0, 0xfb, 0x2d, 0x1e, 0x8b, 0x0b, 0x10, 0x5a, 0x2e, 0x49, 0x00, - 0x1a, 0xc9, 0x12, 0x45, 0x49, 0x80, 0x44, 0xf1, 0xb9, 0xb4, 0x2d, 0x63, 0x81, 0x25, 0x08, 0x12, - 0x2f, 0x0d, 0x40, 0xea, 0xe1, 0xe4, 0xb7, 0x67, 0x30, 0x7b, 0xb1, 0x18, 0x71, 0x76, 0x66, 0x34, - 0x33, 0x4b, 0x12, 0xb4, 0x7d, 0x8e, 0x12, 0x3f, 0x7e, 0xb1, 0xda, 0xd4, 0x76, 0x93, 0x93, 0xda, - 0xaa, 0xe5, 0xca, 0x76, 0x5b, 0xa7, 0x4e, 0xdb, 0x3c, 0x9c, 0xa6, 0x4d, 0xdb, 0xd3, 0xda, 0x8d, - 0x93, 0x38, 0x6d, 0xd3, 0x23, 0x9d, 0xba, 0x6d, 0x9a, 0xd3, 0xd0, 0xa9, 0xec, 0xd3, 0x2a, 0xae, - 0xdb, 0xa4, 0xac, 0x9a, 0x3e, 0xf4, 0x47, 0x7a, 0xee, 0x6b, 0x1e, 0xfb, 0xc0, 0xee, 0x42, 0xa4, - 0x6c, 0x9d, 0xe8, 0x2f, 0xec, 0xfd, 0xe6, 0xfb, 0xbe, 0xfb, 0xdd, 0xef, 0x7e, 0xaf, 0xfb, 0x98, - 0x01, 0xfc, 0xc6, 0x59, 0x98, 0xaa, 0x5a, 0x56, 0xd5, 0xc0, 0x33, 0xb6, 0x63, 0x79, 0xd6, 0x66, - 0x7d, 0x6b, 0xa6, 0x82, 0x5d, 0xcd, 0xd1, 0x6d, 0xcf, 0x72, 0xa6, 0x29, 0x0c, 0x0d, 0x33, 0x8c, - 0x69, 0x81, 0x21, 0x2f, 0xc3, 0xc8, 0x39, 0xdd, 0xc0, 0xf3, 0x3e, 0xe2, 0x3a, 0xf6, 0xd0, 0x69, - 0x48, 0x6c, 0xe9, 0x06, 0xce, 0x49, 0x53, 0xf1, 0x23, 0x99, 0x63, 0xf7, 0x4e, 0x37, 0x10, 0x4d, - 0x47, 0x29, 0xd6, 0x08, 0x58, 0xa1, 0x14, 0xf2, 0xf7, 0x12, 0x30, 0xda, 0xe2, 0x29, 0x42, 0x90, - 0x30, 0xd5, 0x1a, 0xe1, 0x28, 0x1d, 0x49, 0x2b, 0xf4, 0x37, 0xca, 0x41, 0xbf, 0xad, 0x6a, 0x57, - 0xd4, 0x2a, 0xce, 0xc5, 0x28, 0x58, 0x34, 0xd1, 0x04, 0x40, 0x05, 0xdb, 0xd8, 0xac, 0x60, 0x53, - 0xdb, 0xc9, 0xc5, 0xa7, 0xe2, 0x47, 0xd2, 0x4a, 0x08, 0x82, 0x1e, 0x84, 0x11, 0xbb, 0xbe, 0x69, - 0xe8, 0x5a, 0x39, 0x84, 0x06, 0x53, 0xf1, 0x23, 0x49, 0x25, 0xcb, 0x1e, 0xcc, 0x07, 0xc8, 0xf7, - 0xc3, 0xf0, 0x35, 0xac, 0x5e, 0x09, 0xa3, 0x66, 0x28, 0xea, 0x10, 0x01, 0x87, 0x10, 0xe7, 0x60, - 0xa0, 0x86, 0x5d, 0x57, 0xad, 0xe2, 0xb2, 0xb7, 0x63, 0xe3, 0x5c, 0x82, 0x8e, 0x7e, 0xaa, 0x69, - 0xf4, 0x8d, 0x23, 0xcf, 0x70, 0xaa, 0x8d, 0x1d, 0x1b, 0xa3, 0x59, 0x48, 0x63, 0xb3, 0x5e, 0x63, - 0x1c, 0x92, 0x6d, 0xf4, 0x57, 0x32, 0xeb, 0xb5, 0x46, 0x2e, 0x29, 0x42, 0xc6, 0x59, 0xf4, 0xbb, - 0xd8, 0xb9, 0xaa, 0x6b, 0x38, 0xd7, 0x47, 0x19, 0xdc, 0xdf, 0xc4, 0x60, 0x9d, 0x3d, 0x6f, 0xe4, - 0x21, 0xe8, 0xd0, 0x1c, 0xa4, 0xf1, 0x75, 0x0f, 0x9b, 0xae, 0x6e, 0x99, 0xb9, 0x7e, 0xca, 0xe4, - 0x3d, 0x2d, 0x66, 0x11, 0x1b, 0x95, 0x46, 0x16, 0x01, 0x1d, 0x3a, 0x09, 0xfd, 0x96, 0xed, 0xe9, - 0x96, 0xe9, 0xe6, 0x52, 0x53, 0xd2, 0x91, 0xcc, 0xb1, 0x43, 0x2d, 0x0d, 0x61, 0x95, 0xe1, 0x28, - 0x02, 0x19, 0x2d, 0x42, 0xd6, 0xb5, 0xea, 0x8e, 0x86, 0xcb, 0x9a, 0x55, 0xc1, 0x65, 0xdd, 0xdc, - 0xb2, 0x72, 0x69, 0xca, 0x60, 0xb2, 0x79, 0x20, 0x14, 0x71, 0xce, 0xaa, 0xe0, 0x45, 0x73, 0xcb, - 0x52, 0x86, 0xdc, 0x48, 0x1b, 0x8d, 0x43, 0x9f, 0xbb, 0x63, 0x7a, 0xea, 0xf5, 0xdc, 0x00, 0xb5, - 0x10, 0xde, 0x92, 0x7f, 0xbd, 0x0f, 0x86, 0xbb, 0x31, 0xb1, 0xb3, 0x90, 0xdc, 0x22, 0xa3, 0xcc, - 0xc5, 0x7a, 0xd1, 0x01, 0xa3, 0x89, 0x2a, 0xb1, 0x6f, 0x8f, 0x4a, 0x9c, 0x85, 0x8c, 0x89, 0x5d, - 0x0f, 0x57, 0x98, 0x45, 0xc4, 0xbb, 0xb4, 0x29, 0x60, 0x44, 0xcd, 0x26, 0x95, 0xd8, 0x93, 0x49, - 0x3d, 0x05, 0xc3, 0xbe, 0x48, 0x65, 0x47, 0x35, 0xab, 0xc2, 0x36, 0x67, 0x3a, 0x49, 0x32, 0x5d, - 0x12, 0x74, 0x0a, 0x21, 0x53, 0x86, 0x70, 0xa4, 0x8d, 0xe6, 0x01, 0x2c, 0x13, 0x5b, 0x5b, 0xe5, - 0x0a, 0xd6, 0x8c, 0x5c, 0xaa, 0x8d, 0x96, 0x56, 0x09, 0x4a, 0x93, 0x96, 0x2c, 0x06, 0xd5, 0x0c, - 0x74, 0x26, 0x30, 0xb5, 0xfe, 0x36, 0x96, 0xb2, 0xcc, 0x9c, 0xac, 0xc9, 0xda, 0x2e, 0xc1, 0x90, - 0x83, 0x89, 0xdd, 0xe3, 0x0a, 0x1f, 0x59, 0x9a, 0x0a, 0x31, 0xdd, 0x71, 0x64, 0x0a, 0x27, 0x63, - 0x03, 0x1b, 0x74, 0xc2, 0x4d, 0x74, 0x0f, 0xf8, 0x80, 0x32, 0x35, 0x2b, 0xa0, 0x51, 0x68, 0x40, - 0x00, 0x57, 0xd4, 0x1a, 0xce, 0xdf, 0x80, 0xa1, 0xa8, 0x7a, 0xd0, 0x18, 0x24, 0x5d, 0x4f, 0x75, - 0x3c, 0x6a, 0x85, 0x49, 0x85, 0x35, 0x50, 0x16, 0xe2, 0xd8, 0xac, 0xd0, 0x28, 0x97, 0x54, 0xc8, - 0x4f, 0xf4, 0x81, 0x60, 0xc0, 0x71, 0x3a, 0xe0, 0xfb, 0x9a, 0x67, 0x34, 0xc2, 0xb9, 0x71, 0xdc, - 0xf9, 0x53, 0x30, 0x18, 0x19, 0x40, 0xb7, 0x5d, 0xcb, 0x1f, 0x86, 0xfd, 0x2d, 0x59, 0xa3, 0xa7, - 0x60, 0xac, 0x6e, 0xea, 0xa6, 0x87, 0x1d, 0xdb, 0xc1, 0xc4, 0x62, 0x59, 0x57, 0xb9, 0xff, 0xdc, - 0xdf, 0xc6, 0xe6, 0x2e, 0x85, 0xb1, 0x19, 0x17, 0x65, 0xb4, 0xde, 0x0c, 0x3c, 0x9a, 0x4e, 0xbd, - 0xde, 0x9f, 0x7d, 0xfe, 0xf9, 0xe7, 0x9f, 0x8f, 0xc9, 0xdf, 0xe8, 0x83, 0xb1, 0x56, 0x3e, 0xd3, - 0xd2, 0x7d, 0xc7, 0xa1, 0xcf, 0xac, 0xd7, 0x36, 0xb1, 0x43, 0x95, 0x94, 0x54, 0x78, 0x0b, 0xcd, - 0x42, 0xd2, 0x50, 0x37, 0xb1, 0x91, 0x4b, 0x4c, 0x49, 0x47, 0x86, 0x8e, 0x3d, 0xd8, 0x95, 0x57, - 0x4e, 0x2f, 0x11, 0x12, 0x85, 0x51, 0xa2, 0xf7, 0x43, 0x82, 0x87, 0x68, 0xc2, 0xe1, 0x68, 0x77, - 0x1c, 0x88, 0x2f, 0x29, 0x94, 0x0e, 0x1d, 0x84, 0x34, 0xf9, 0xcb, 0x6c, 0xa3, 0x8f, 0xca, 0x9c, - 0x22, 0x00, 0x62, 0x17, 0x28, 0x0f, 0x29, 0xea, 0x26, 0x15, 0x2c, 0x52, 0x9b, 0xdf, 0x26, 0x86, - 0x55, 0xc1, 0x5b, 0x6a, 0xdd, 0xf0, 0xca, 0x57, 0x55, 0xa3, 0x8e, 0xa9, 0xc1, 0xa7, 0x95, 0x01, - 0x0e, 0xbc, 0x4c, 0x60, 0x68, 0x12, 0x32, 0xcc, 0xab, 0x74, 0xb3, 0x82, 0xaf, 0xd3, 0xe8, 0x99, - 0x54, 0x98, 0xa3, 0x2d, 0x12, 0x08, 0xe9, 0xfe, 0x59, 0xd7, 0x32, 0x85, 0x69, 0xd2, 0x2e, 0x08, - 0x80, 0x76, 0x7f, 0xaa, 0x31, 0x70, 0x1f, 0x6e, 0x3d, 0xbc, 0x26, 0x5f, 0xba, 0x1f, 0x86, 0x29, - 0xc6, 0x63, 0x7c, 0xea, 0x55, 0x23, 0x37, 0x32, 0x25, 0x1d, 0x49, 0x29, 0x43, 0x0c, 0xbc, 0xca, - 0xa1, 0xf2, 0xaf, 0xc5, 0x20, 0x41, 0x03, 0xcb, 0x30, 0x64, 0x36, 0x9e, 0x5e, 0x2b, 0x95, 0xe7, - 0x57, 0x2f, 0x15, 0x97, 0x4a, 0x59, 0x09, 0x0d, 0x01, 0x50, 0xc0, 0xb9, 0xa5, 0xd5, 0xd9, 0x8d, - 0x6c, 0xcc, 0x6f, 0x2f, 0xae, 0x6c, 0x9c, 0x3c, 0x9e, 0x8d, 0xfb, 0x04, 0x97, 0x18, 0x20, 0x11, - 0x46, 0x78, 0xec, 0x58, 0x36, 0x89, 0xb2, 0x30, 0xc0, 0x18, 0x2c, 0x3e, 0x55, 0x9a, 0x3f, 0x79, - 0x3c, 0xdb, 0x17, 0x85, 0x3c, 0x76, 0x2c, 0xdb, 0x8f, 0x06, 0x21, 0x4d, 0x21, 0xc5, 0xd5, 0xd5, - 0xa5, 0x6c, 0xca, 0xe7, 0xb9, 0xbe, 0xa1, 0x2c, 0xae, 0x2c, 0x64, 0xd3, 0x3e, 0xcf, 0x05, 0x65, - 0xf5, 0xd2, 0x5a, 0x16, 0x7c, 0x0e, 0xcb, 0xa5, 0xf5, 0xf5, 0xd9, 0x85, 0x52, 0x36, 0xe3, 0x63, - 0x14, 0x9f, 0xde, 0x28, 0xad, 0x67, 0x07, 0x22, 0x62, 0x3d, 0x76, 0x2c, 0x3b, 0xe8, 0x77, 0x51, - 0x5a, 0xb9, 0xb4, 0x9c, 0x1d, 0x42, 0x23, 0x30, 0xc8, 0xba, 0x10, 0x42, 0x0c, 0x37, 0x80, 0x4e, - 0x1e, 0xcf, 0x66, 0x03, 0x41, 0x18, 0x97, 0x91, 0x08, 0xe0, 0xe4, 0xf1, 0x2c, 0x92, 0xe7, 0x20, - 0x49, 0xcd, 0x10, 0x21, 0x18, 0x5a, 0x9a, 0x2d, 0x96, 0x96, 0xca, 0xab, 0x6b, 0x1b, 0x8b, 0xab, - 0x2b, 0xb3, 0x4b, 0x59, 0x29, 0x80, 0x29, 0xa5, 0x27, 0x2e, 0x2d, 0x2a, 0xa5, 0xf9, 0x6c, 0x2c, - 0x0c, 0x5b, 0x2b, 0xcd, 0x6e, 0x94, 0xe6, 0xb3, 0x71, 0x59, 0x83, 0xb1, 0x56, 0x01, 0xb5, 0xa5, - 0x0b, 0x85, 0x6c, 0x21, 0xd6, 0xc6, 0x16, 0x28, 0xaf, 0x46, 0x5b, 0x90, 0xbf, 0x1b, 0x83, 0xd1, - 0x16, 0x49, 0xa5, 0x65, 0x27, 0x8f, 0x43, 0x92, 0xd9, 0x32, 0x4b, 0xb3, 0x0f, 0xb4, 0xcc, 0x4e, - 0xd4, 0xb2, 0x9b, 0x52, 0x2d, 0xa5, 0x0b, 0x97, 0x1a, 0xf1, 0x36, 0xa5, 0x06, 0x61, 0xd1, 0x64, - 0xb0, 0x3f, 0xde, 0x14, 0xfc, 0x59, 0x7e, 0x3c, 0xd9, 0x4d, 0x7e, 0xa4, 0xb0, 0xde, 0x92, 0x40, - 0xb2, 0x45, 0x12, 0x38, 0x0b, 0x23, 0x4d, 0x8c, 0xba, 0x0e, 0xc6, 0x1f, 0x95, 0x20, 0xd7, 0x4e, - 0x39, 0x1d, 0x42, 0x62, 0x2c, 0x12, 0x12, 0xcf, 0x36, 0x6a, 0xf0, 0xee, 0xf6, 0x93, 0xd0, 0x34, - 0xd7, 0x5f, 0x91, 0x60, 0xbc, 0x75, 0x49, 0xd9, 0x52, 0x86, 0xf7, 0x43, 0x5f, 0x0d, 0x7b, 0xdb, - 0x96, 0x28, 0xab, 0xee, 0x6b, 0x91, 0xac, 0xc9, 0xe3, 0xc6, 0xc9, 0xe6, 0x54, 0xe1, 0x6c, 0x1f, - 0x6f, 0x57, 0x17, 0x32, 0x69, 0x9a, 0x24, 0xfd, 0x64, 0x0c, 0xf6, 0xb7, 0x64, 0xde, 0x52, 0xd0, - 0xc3, 0x00, 0xba, 0x69, 0xd7, 0x3d, 0x56, 0x3a, 0xb1, 0x48, 0x9c, 0xa6, 0x10, 0x1a, 0xbc, 0x48, - 0x94, 0xad, 0x7b, 0xfe, 0xf3, 0x38, 0x7d, 0x0e, 0x0c, 0x44, 0x11, 0x4e, 0x07, 0x82, 0x26, 0xa8, - 0xa0, 0x13, 0x6d, 0x46, 0xda, 0x64, 0x98, 0x8f, 0x40, 0x56, 0x33, 0x74, 0x6c, 0x7a, 0x65, 0xd7, - 0x73, 0xb0, 0x5a, 0xd3, 0xcd, 0x2a, 0x4d, 0x35, 0xa9, 0x42, 0x72, 0x4b, 0x35, 0x5c, 0xac, 0x0c, - 0xb3, 0xc7, 0xeb, 0xe2, 0x29, 0xa1, 0xa0, 0x06, 0xe4, 0x84, 0x28, 0xfa, 0x22, 0x14, 0xec, 0xb1, - 0x4f, 0x21, 0x7f, 0x26, 0x0d, 0x99, 0x50, 0x01, 0x8e, 0xee, 0x86, 0x81, 0x67, 0xd5, 0xab, 0x6a, - 0x59, 0x2c, 0xaa, 0x98, 0x26, 0x32, 0x04, 0xb6, 0xc6, 0x17, 0x56, 0x8f, 0xc0, 0x18, 0x45, 0xb1, - 0xea, 0x1e, 0x76, 0xca, 0x9a, 0xa1, 0xba, 0x2e, 0x55, 0x5a, 0x8a, 0xa2, 0x22, 0xf2, 0x6c, 0x95, - 0x3c, 0x9a, 0x13, 0x4f, 0xd0, 0x09, 0x18, 0xa5, 0x14, 0xb5, 0xba, 0xe1, 0xe9, 0xb6, 0x81, 0xcb, - 0x64, 0x99, 0xe7, 0xd2, 0x94, 0xe3, 0x4b, 0x36, 0x42, 0x30, 0x96, 0x39, 0x02, 0x91, 0xc8, 0x45, - 0xf3, 0x70, 0x98, 0x92, 0x55, 0xb1, 0x89, 0x1d, 0xd5, 0xc3, 0x65, 0xfc, 0x5c, 0x5d, 0x35, 0xdc, - 0xb2, 0x6a, 0x56, 0xca, 0xdb, 0xaa, 0xbb, 0x9d, 0x1b, 0x23, 0x0c, 0x8a, 0xb1, 0x9c, 0xa4, 0x1c, - 0x20, 0x88, 0x0b, 0x1c, 0xaf, 0x44, 0xd1, 0x66, 0xcd, 0xca, 0x79, 0xd5, 0xdd, 0x46, 0x05, 0x18, - 0xa7, 0x5c, 0x5c, 0xcf, 0xd1, 0xcd, 0x6a, 0x59, 0xdb, 0xc6, 0xda, 0x95, 0x72, 0xdd, 0xdb, 0x3a, - 0x9d, 0x3b, 0x18, 0xee, 0x9f, 0x4a, 0xb8, 0x4e, 0x71, 0xe6, 0x08, 0xca, 0x25, 0x6f, 0xeb, 0x34, - 0x5a, 0x87, 0x01, 0x32, 0x19, 0x35, 0xfd, 0x06, 0x2e, 0x6f, 0x59, 0x0e, 0xcd, 0xa1, 0x43, 0x2d, - 0x42, 0x53, 0x48, 0x83, 0xd3, 0xab, 0x9c, 0x60, 0xd9, 0xaa, 0xe0, 0x42, 0x72, 0x7d, 0xad, 0x54, - 0x9a, 0x57, 0x32, 0x82, 0xcb, 0x39, 0xcb, 0x21, 0x06, 0x55, 0xb5, 0x7c, 0x05, 0x67, 0x98, 0x41, - 0x55, 0x2d, 0xa1, 0xde, 0x13, 0x30, 0xaa, 0x69, 0x6c, 0xcc, 0xba, 0x56, 0xe6, 0x8b, 0x31, 0x37, - 0x97, 0x8d, 0x28, 0x4b, 0xd3, 0x16, 0x18, 0x02, 0xb7, 0x71, 0x17, 0x9d, 0x81, 0xfd, 0x81, 0xb2, - 0xc2, 0x84, 0x23, 0x4d, 0xa3, 0x6c, 0x24, 0x3d, 0x01, 0xa3, 0xf6, 0x4e, 0x33, 0x21, 0x8a, 0xf4, - 0x68, 0xef, 0x34, 0x92, 0x9d, 0x82, 0x31, 0x7b, 0xdb, 0x6e, 0xa6, 0x3b, 0x1a, 0xa6, 0x43, 0xf6, - 0xb6, 0xdd, 0x48, 0xf8, 0x1e, 0xba, 0x32, 0x77, 0xb0, 0xa6, 0x7a, 0xb8, 0x92, 0xbb, 0x2b, 0x8c, - 0x1e, 0x7a, 0x80, 0xa6, 0x21, 0xab, 0x69, 0x65, 0x6c, 0xaa, 0x9b, 0x06, 0x2e, 0xab, 0x0e, 0x36, - 0x55, 0x37, 0x37, 0x49, 0x91, 0x13, 0x9e, 0x53, 0xc7, 0xca, 0x90, 0xa6, 0x95, 0xe8, 0xc3, 0x59, - 0xfa, 0x0c, 0x1d, 0x85, 0x11, 0x6b, 0xf3, 0x59, 0x8d, 0x59, 0x64, 0xd9, 0x76, 0xf0, 0x96, 0x7e, - 0x3d, 0x77, 0x2f, 0x55, 0xef, 0x30, 0x79, 0x40, 0xed, 0x71, 0x8d, 0x82, 0xd1, 0x03, 0x90, 0xd5, - 0xdc, 0x6d, 0xd5, 0xb1, 0x69, 0x48, 0x76, 0x6d, 0x55, 0xc3, 0xb9, 0xf7, 0x30, 0x54, 0x06, 0x5f, - 0x11, 0x60, 0xe2, 0x11, 0xee, 0x35, 0x7d, 0xcb, 0x13, 0x1c, 0xef, 0x67, 0x1e, 0x41, 0x61, 0x9c, - 0xdb, 0x11, 0xc8, 0x12, 0x4d, 0x44, 0x3a, 0x3e, 0x42, 0xd1, 0x86, 0xec, 0x6d, 0x3b, 0xdc, 0xef, - 0x3d, 0x30, 0x48, 0x30, 0x83, 0x4e, 0x1f, 0x60, 0x85, 0x9b, 0xbd, 0x1d, 0xea, 0xf1, 0x38, 0x8c, - 0x13, 0xa4, 0x1a, 0xf6, 0xd4, 0x8a, 0xea, 0xa9, 0x21, 0xec, 0x87, 0x28, 0x36, 0x51, 0xfb, 0x32, - 0x7f, 0x18, 0x91, 0xd3, 0xa9, 0x6f, 0xee, 0xf8, 0x86, 0xf5, 0x30, 0x93, 0x93, 0xc0, 0x84, 0x69, - 0xdd, 0xb1, 0xe2, 0x5c, 0x2e, 0xc0, 0x40, 0xd8, 0xee, 0x51, 0x1a, 0x98, 0xe5, 0x67, 0x25, 0x52, - 0x04, 0xcd, 0xad, 0xce, 0x93, 0xf2, 0xe5, 0x99, 0x52, 0x36, 0x46, 0xca, 0xa8, 0xa5, 0xc5, 0x8d, - 0x52, 0x59, 0xb9, 0xb4, 0xb2, 0xb1, 0xb8, 0x5c, 0xca, 0xc6, 0x43, 0x85, 0xfd, 0x85, 0x44, 0xea, - 0xbe, 0xec, 0xfd, 0xf2, 0xab, 0x31, 0x18, 0x8a, 0xae, 0xd4, 0xd0, 0x7b, 0xe1, 0x2e, 0xb1, 0xad, - 0xe2, 0x62, 0xaf, 0x7c, 0x4d, 0x77, 0xa8, 0x43, 0xd6, 0x54, 0x96, 0x1c, 0x7d, 0xfb, 0x19, 0xe3, - 0x58, 0xeb, 0xd8, 0x7b, 0x52, 0x77, 0x88, 0xbb, 0xd5, 0x54, 0x0f, 0x2d, 0xc1, 0xa4, 0x69, 0x95, - 0x5d, 0x4f, 0x35, 0x2b, 0xaa, 0x53, 0x29, 0x07, 0x1b, 0x5a, 0x65, 0x55, 0xd3, 0xb0, 0xeb, 0x5a, - 0x2c, 0x11, 0xfa, 0x5c, 0x0e, 0x99, 0xd6, 0x3a, 0x47, 0x0e, 0x32, 0xc4, 0x2c, 0x47, 0x6d, 0x30, - 0xdf, 0x78, 0x3b, 0xf3, 0x3d, 0x08, 0xe9, 0x9a, 0x6a, 0x97, 0xb1, 0xe9, 0x39, 0x3b, 0xb4, 0x3e, - 0x4f, 0x29, 0xa9, 0x9a, 0x6a, 0x97, 0x48, 0xfb, 0x6d, 0x59, 0x26, 0x5d, 0x48, 0xa4, 0x52, 0xd9, - 0xf4, 0x85, 0x44, 0x2a, 0x9d, 0x05, 0xf9, 0xb5, 0x38, 0x0c, 0x84, 0xeb, 0x75, 0xb2, 0xfc, 0xd1, - 0x68, 0xc6, 0x92, 0x68, 0x4c, 0xbb, 0x67, 0xd7, 0xea, 0x7e, 0x7a, 0x8e, 0xa4, 0xb2, 0x42, 0x1f, - 0x2b, 0x8e, 0x15, 0x46, 0x49, 0xca, 0x08, 0x62, 0x6c, 0x98, 0x15, 0x23, 0x29, 0x85, 0xb7, 0xd0, - 0x02, 0xf4, 0x3d, 0xeb, 0x52, 0xde, 0x7d, 0x94, 0xf7, 0xbd, 0xbb, 0xf3, 0xbe, 0xb0, 0x4e, 0x99, - 0xa7, 0x2f, 0xac, 0x97, 0x57, 0x56, 0x95, 0xe5, 0xd9, 0x25, 0x85, 0x93, 0xa3, 0x03, 0x90, 0x30, - 0xd4, 0x1b, 0x3b, 0xd1, 0xa4, 0x47, 0x41, 0xdd, 0x4e, 0xc2, 0x01, 0x48, 0x5c, 0xc3, 0xea, 0x95, - 0x68, 0xaa, 0xa1, 0xa0, 0x3b, 0xe8, 0x0c, 0x33, 0x90, 0xa4, 0xfa, 0x42, 0x00, 0x5c, 0x63, 0xd9, - 0x7d, 0x28, 0x05, 0x89, 0xb9, 0x55, 0x85, 0x38, 0x44, 0x16, 0x06, 0x18, 0xb4, 0xbc, 0xb6, 0x58, - 0x9a, 0x2b, 0x65, 0x63, 0xf2, 0x09, 0xe8, 0x63, 0x4a, 0x20, 0xce, 0xe2, 0xab, 0x21, 0xbb, 0x8f, - 0x37, 0x39, 0x0f, 0x49, 0x3c, 0xbd, 0xb4, 0x5c, 0x2c, 0x29, 0xd9, 0x58, 0x74, 0xaa, 0x13, 0xd9, - 0xa4, 0xec, 0xc2, 0x40, 0xb8, 0x0e, 0x7f, 0x7b, 0x16, 0xe3, 0x5f, 0x97, 0x20, 0x13, 0xaa, 0xab, - 0x49, 0x41, 0xa4, 0x1a, 0x86, 0x75, 0xad, 0xac, 0x1a, 0xba, 0xea, 0x72, 0xd3, 0x00, 0x0a, 0x9a, - 0x25, 0x90, 0x6e, 0xa7, 0xee, 0x6d, 0x72, 0x91, 0x64, 0xb6, 0x4f, 0xfe, 0x82, 0x04, 0xd9, 0xc6, - 0xc2, 0xb6, 0x41, 0x4c, 0xe9, 0x87, 0x29, 0xa6, 0xfc, 0x79, 0x09, 0x86, 0xa2, 0xd5, 0x6c, 0x83, - 0x78, 0x77, 0xff, 0x50, 0xc5, 0xfb, 0xc3, 0x18, 0x0c, 0x46, 0x6a, 0xd8, 0x6e, 0xa5, 0x7b, 0x0e, - 0x46, 0xf4, 0x0a, 0xae, 0xd9, 0x96, 0x87, 0x4d, 0x6d, 0xa7, 0x6c, 0xe0, 0xab, 0xd8, 0xc8, 0xc9, - 0x34, 0x68, 0xcc, 0xec, 0x5e, 0x25, 0x4f, 0x2f, 0x06, 0x74, 0x4b, 0x84, 0xac, 0x30, 0xba, 0x38, - 0x5f, 0x5a, 0x5e, 0x5b, 0xdd, 0x28, 0xad, 0xcc, 0x3d, 0x5d, 0xbe, 0xb4, 0x72, 0x71, 0x65, 0xf5, - 0xc9, 0x15, 0x25, 0xab, 0x37, 0xa0, 0xdd, 0x41, 0xb7, 0x5f, 0x83, 0x6c, 0xa3, 0x50, 0xe8, 0x2e, - 0x68, 0x25, 0x56, 0x76, 0x1f, 0x1a, 0x85, 0xe1, 0x95, 0xd5, 0xf2, 0xfa, 0xe2, 0x7c, 0xa9, 0x5c, - 0x3a, 0x77, 0xae, 0x34, 0xb7, 0xb1, 0xce, 0xf6, 0x3d, 0x7c, 0xec, 0x8d, 0x88, 0x83, 0xcb, 0x2f, - 0xc6, 0x61, 0xb4, 0x85, 0x24, 0x68, 0x96, 0xaf, 0x58, 0xd8, 0x22, 0xea, 0xe1, 0x6e, 0xa4, 0x9f, - 0x26, 0x35, 0xc3, 0x9a, 0xea, 0x78, 0x7c, 0x81, 0xf3, 0x00, 0x10, 0x2d, 0x99, 0x9e, 0xbe, 0xa5, - 0x63, 0x87, 0xef, 0x27, 0xb1, 0x65, 0xcc, 0x70, 0x00, 0x67, 0x5b, 0x4a, 0x0f, 0x01, 0xb2, 0x2d, - 0x57, 0xf7, 0xf4, 0xab, 0xb8, 0xac, 0x9b, 0x62, 0xf3, 0x89, 0x2c, 0x6b, 0x12, 0x4a, 0x56, 0x3c, - 0x59, 0x34, 0x3d, 0x1f, 0xdb, 0xc4, 0x55, 0xb5, 0x01, 0x9b, 0x04, 0xf3, 0xb8, 0x92, 0x15, 0x4f, - 0x7c, 0xec, 0xbb, 0x61, 0xa0, 0x62, 0xd5, 0x49, 0xad, 0xc7, 0xf0, 0x48, 0xee, 0x90, 0x94, 0x0c, - 0x83, 0xf9, 0x28, 0xbc, 0x8a, 0x0f, 0x76, 0xbd, 0x06, 0x94, 0x0c, 0x83, 0x31, 0x94, 0xfb, 0x61, - 0x58, 0xad, 0x56, 0x1d, 0xc2, 0x5c, 0x30, 0x62, 0xeb, 0x92, 0x21, 0x1f, 0x4c, 0x11, 0xf3, 0x17, - 0x20, 0x25, 0xf4, 0x40, 0x52, 0x35, 0xd1, 0x44, 0xd9, 0x66, 0x8b, 0xed, 0xd8, 0x91, 0xb4, 0x92, - 0x32, 0xc5, 0xc3, 0xbb, 0x61, 0x40, 0x77, 0xcb, 0xc1, 0x26, 0x7e, 0x6c, 0x2a, 0x76, 0x24, 0xa5, - 0x64, 0x74, 0xd7, 0xdf, 0x00, 0x95, 0xbf, 0x12, 0x83, 0xa1, 0xe8, 0x21, 0x04, 0x9a, 0x87, 0x94, - 0x61, 0x69, 0x2a, 0x35, 0x2d, 0x76, 0x02, 0x76, 0xa4, 0xc3, 0xb9, 0xc5, 0xf4, 0x12, 0xc7, 0x57, - 0x7c, 0xca, 0xfc, 0xbf, 0x92, 0x20, 0x25, 0xc0, 0x68, 0x1c, 0x12, 0xb6, 0xea, 0x6d, 0x53, 0x76, - 0xc9, 0x62, 0x2c, 0x2b, 0x29, 0xb4, 0x4d, 0xe0, 0xae, 0xad, 0x9a, 0xd4, 0x04, 0x38, 0x9c, 0xb4, - 0xc9, 0xbc, 0x1a, 0x58, 0xad, 0xd0, 0x45, 0x8f, 0x55, 0xab, 0x61, 0xd3, 0x73, 0xc5, 0xbc, 0x72, - 0xf8, 0x1c, 0x07, 0xa3, 0x07, 0x61, 0xc4, 0x73, 0x54, 0xdd, 0x88, 0xe0, 0x26, 0x28, 0x6e, 0x56, - 0x3c, 0xf0, 0x91, 0x0b, 0x70, 0x40, 0xf0, 0xad, 0x60, 0x4f, 0xd5, 0xb6, 0x71, 0x25, 0x20, 0xea, - 0xa3, 0x9b, 0x1b, 0x77, 0x71, 0x84, 0x79, 0xfe, 0x5c, 0xd0, 0xca, 0xaf, 0x4a, 0x30, 0x22, 0x96, - 0x69, 0x15, 0x5f, 0x59, 0xcb, 0x00, 0xaa, 0x69, 0x5a, 0x5e, 0x58, 0x5d, 0xcd, 0xa6, 0xdc, 0x44, - 0x37, 0x3d, 0xeb, 0x13, 0x29, 0x21, 0x06, 0xf9, 0x1a, 0x40, 0xf0, 0xa4, 0xad, 0xda, 0x26, 0x21, - 0xc3, 0x4f, 0x98, 0xe8, 0x31, 0x25, 0x5b, 0xd8, 0x03, 0x03, 0x91, 0xf5, 0x1c, 0x1a, 0x83, 0xe4, - 0x26, 0xae, 0xea, 0x26, 0xdf, 0x37, 0x66, 0x0d, 0xb1, 0xfd, 0x92, 0xf0, 0xb7, 0x5f, 0x8a, 0x9f, - 0x92, 0x60, 0x54, 0xb3, 0x6a, 0x8d, 0xf2, 0x16, 0xb3, 0x0d, 0xbb, 0x0b, 0xee, 0x79, 0xe9, 0x99, - 0xf7, 0x57, 0x75, 0x6f, 0xbb, 0xbe, 0x39, 0xad, 0x59, 0xb5, 0x99, 0xaa, 0x65, 0xa8, 0x66, 0x35, - 0x38, 0x67, 0xa5, 0x3f, 0xb4, 0x87, 0xab, 0xd8, 0x7c, 0xb8, 0x6a, 0x85, 0x4e, 0x5d, 0xcf, 0x06, - 0x3f, 0xff, 0xb7, 0x24, 0x7d, 0x29, 0x16, 0x5f, 0x58, 0x2b, 0x7e, 0x35, 0x96, 0x5f, 0x60, 0xdd, - 0xad, 0x09, 0xf5, 0x28, 0x78, 0xcb, 0xc0, 0x1a, 0x19, 0x32, 0x7c, 0xff, 0x41, 0x18, 0xab, 0x5a, - 0x55, 0x8b, 0x72, 0x9c, 0x21, 0xbf, 0xf8, 0xc9, 0x6d, 0xda, 0x87, 0xe6, 0x3b, 0x1e, 0xf3, 0x16, - 0x56, 0x60, 0x94, 0x23, 0x97, 0xe9, 0xd1, 0x11, 0x5b, 0xd8, 0xa0, 0x5d, 0x77, 0xd5, 0x72, 0xbf, - 0xfc, 0x3d, 0x9a, 0xd0, 0x95, 0x11, 0x4e, 0x4a, 0x9e, 0xb1, 0xb5, 0x4f, 0x41, 0x81, 0xfd, 0x11, - 0x7e, 0xcc, 0x6d, 0xb1, 0xd3, 0x81, 0xe3, 0x6f, 0x72, 0x8e, 0xa3, 0x21, 0x8e, 0xeb, 0x9c, 0xb4, - 0x30, 0x07, 0x83, 0xbd, 0xf0, 0xfa, 0x2d, 0xce, 0x6b, 0x00, 0x87, 0x99, 0x2c, 0xc0, 0x30, 0x65, - 0xa2, 0xd5, 0x5d, 0xcf, 0xaa, 0xd1, 0x98, 0xb8, 0x3b, 0x9b, 0xdf, 0xfe, 0x1e, 0xf3, 0xa3, 0x21, - 0x42, 0x36, 0xe7, 0x53, 0x15, 0x0a, 0x40, 0x4f, 0xcb, 0x2a, 0x58, 0x33, 0x3a, 0x70, 0xf8, 0x16, - 0x17, 0xc4, 0xc7, 0x2f, 0x5c, 0x86, 0x31, 0xf2, 0x9b, 0x86, 0xac, 0xb0, 0x24, 0x9d, 0xb7, 0xe0, - 0x72, 0xaf, 0x7e, 0x94, 0xb9, 0xea, 0xa8, 0xcf, 0x20, 0x24, 0x53, 0x68, 0x16, 0xab, 0xd8, 0xf3, - 0xb0, 0xe3, 0x96, 0x55, 0xa3, 0x95, 0x78, 0xa1, 0x3d, 0x8c, 0xdc, 0xe7, 0x7e, 0x10, 0x9d, 0xc5, - 0x05, 0x46, 0x39, 0x6b, 0x18, 0x85, 0x4b, 0x70, 0x57, 0x0b, 0xab, 0xe8, 0x82, 0xe7, 0x8b, 0x9c, - 0xe7, 0x58, 0x93, 0x65, 0x10, 0xb6, 0x6b, 0x20, 0xe0, 0xfe, 0x5c, 0x76, 0xc1, 0xf3, 0xaf, 0x72, - 0x9e, 0x88, 0xd3, 0x8a, 0x29, 0x25, 0x1c, 0x2f, 0xc0, 0xc8, 0x55, 0xec, 0x6c, 0x5a, 0x2e, 0xdf, - 0x37, 0xea, 0x82, 0xdd, 0xe7, 0x39, 0xbb, 0x61, 0x4e, 0x48, 0x37, 0x92, 0x08, 0xaf, 0x33, 0x90, - 0xda, 0x52, 0x35, 0xdc, 0x05, 0x8b, 0x97, 0x38, 0x8b, 0x7e, 0x82, 0x4f, 0x48, 0x67, 0x61, 0xa0, - 0x6a, 0xf1, 0xac, 0xd5, 0x99, 0xfc, 0x0b, 0x9c, 0x3c, 0x23, 0x68, 0x38, 0x0b, 0xdb, 0xb2, 0xeb, - 0x06, 0x49, 0x69, 0x9d, 0x59, 0xfc, 0x35, 0xc1, 0x42, 0xd0, 0x70, 0x16, 0x3d, 0xa8, 0xf5, 0x65, - 0xc1, 0xc2, 0x0d, 0xe9, 0xf3, 0x71, 0xc8, 0x58, 0xa6, 0xb1, 0x63, 0x99, 0xdd, 0x08, 0xf1, 0x45, - 0xce, 0x01, 0x38, 0x09, 0x61, 0x70, 0x16, 0xd2, 0xdd, 0x4e, 0xc4, 0xdf, 0xf8, 0x81, 0x70, 0x0f, - 0x31, 0x03, 0x0b, 0x30, 0x2c, 0x02, 0x94, 0x6e, 0x99, 0x5d, 0xb0, 0xf8, 0x9b, 0x9c, 0xc5, 0x50, - 0x88, 0x8c, 0x0f, 0xc3, 0xc3, 0xae, 0x57, 0xc5, 0xdd, 0x30, 0xf9, 0x8a, 0x18, 0x06, 0x27, 0xe1, - 0xaa, 0xdc, 0xc4, 0xa6, 0xb6, 0xdd, 0x1d, 0x87, 0x9f, 0x17, 0xaa, 0x14, 0x34, 0x84, 0xc5, 0x1c, - 0x0c, 0xd6, 0x54, 0xc7, 0xdd, 0x56, 0x8d, 0xae, 0xa6, 0xe3, 0x6f, 0x71, 0x1e, 0x03, 0x3e, 0x11, - 0xd7, 0x48, 0xdd, 0xec, 0x85, 0xcd, 0x57, 0x85, 0x46, 0x42, 0x64, 0xdc, 0xf5, 0x5c, 0x8f, 0x6e, - 0xb2, 0xf5, 0xc2, 0xed, 0x17, 0x84, 0xeb, 0x31, 0xda, 0xe5, 0x30, 0xc7, 0xb3, 0x90, 0x76, 0xf5, - 0x1b, 0x5d, 0xb1, 0xf9, 0xdb, 0x62, 0xa6, 0x29, 0x01, 0x21, 0x7e, 0x1a, 0x0e, 0xb4, 0x4c, 0x13, - 0x5d, 0x30, 0xfb, 0x3b, 0x9c, 0xd9, 0x78, 0x8b, 0x54, 0xc1, 0x43, 0x42, 0xaf, 0x2c, 0xff, 0xae, - 0x08, 0x09, 0xb8, 0x81, 0xd7, 0x1a, 0x59, 0x47, 0xb8, 0xea, 0x56, 0x6f, 0x5a, 0xfb, 0x45, 0xa1, - 0x35, 0x46, 0x1b, 0xd1, 0xda, 0x06, 0x8c, 0x73, 0x8e, 0xbd, 0xcd, 0xeb, 0x2f, 0x89, 0xc0, 0xca, - 0xa8, 0x2f, 0x45, 0x67, 0xf7, 0x83, 0x90, 0xf7, 0xd5, 0x29, 0x0a, 0x56, 0xb7, 0x5c, 0x53, 0xed, - 0x2e, 0x38, 0xff, 0x32, 0xe7, 0x2c, 0x22, 0xbe, 0x5f, 0xf1, 0xba, 0xcb, 0xaa, 0x4d, 0x98, 0x3f, - 0x05, 0x39, 0xc1, 0xbc, 0x6e, 0x3a, 0x58, 0xb3, 0xaa, 0xa6, 0x7e, 0x03, 0x57, 0xba, 0x60, 0xfd, - 0x2b, 0x0d, 0x53, 0x75, 0x29, 0x44, 0x4e, 0x38, 0x2f, 0x42, 0xd6, 0xaf, 0x55, 0xca, 0x7a, 0xcd, - 0xb6, 0x1c, 0xaf, 0x03, 0xc7, 0xaf, 0x89, 0x99, 0xf2, 0xe9, 0x16, 0x29, 0x59, 0xa1, 0x04, 0xec, - 0xe4, 0xb9, 0x5b, 0x93, 0xfc, 0x55, 0xce, 0x68, 0x30, 0xa0, 0xe2, 0x81, 0x43, 0xb3, 0x6a, 0xb6, - 0xea, 0x74, 0x13, 0xff, 0xfe, 0x9e, 0x08, 0x1c, 0x9c, 0x84, 0x07, 0x0e, 0x6f, 0xc7, 0xc6, 0x24, - 0xdb, 0x77, 0xc1, 0xe1, 0xd7, 0x44, 0xe0, 0x10, 0x34, 0x9c, 0x85, 0x28, 0x18, 0xba, 0x60, 0xf1, - 0xf7, 0x05, 0x0b, 0x41, 0x43, 0x58, 0x3c, 0x11, 0x24, 0x5a, 0x07, 0x57, 0x75, 0xd7, 0x73, 0x58, - 0x99, 0xbc, 0x3b, 0xab, 0x7f, 0xf0, 0x83, 0x68, 0x11, 0xa6, 0x84, 0x48, 0x49, 0x24, 0xe2, 0xdb, - 0xae, 0x74, 0x15, 0xd5, 0x59, 0xb0, 0x5f, 0x17, 0x91, 0x28, 0x44, 0x46, 0x64, 0x0b, 0x55, 0x88, - 0x44, 0xed, 0x1a, 0x59, 0x3b, 0x74, 0xc1, 0xee, 0x1f, 0x36, 0x08, 0xb7, 0x2e, 0x68, 0x09, 0xcf, - 0x50, 0xfd, 0x53, 0x37, 0xaf, 0xe0, 0x9d, 0xae, 0xac, 0xf3, 0x1f, 0x35, 0xd4, 0x3f, 0x97, 0x18, - 0x25, 0x8b, 0x21, 0xc3, 0x0d, 0xf5, 0x14, 0xea, 0x74, 0xcf, 0x28, 0xf7, 0x13, 0x6f, 0xf0, 0xf1, - 0x46, 0xcb, 0xa9, 0xc2, 0x12, 0x31, 0xf2, 0x68, 0xd1, 0xd3, 0x99, 0xd9, 0x47, 0xdf, 0xf0, 0xed, - 0x3c, 0x52, 0xf3, 0x14, 0xce, 0xc1, 0x60, 0xa4, 0xe0, 0xe9, 0xcc, 0xea, 0x63, 0x9c, 0xd5, 0x40, - 0xb8, 0xde, 0x29, 0x9c, 0x80, 0x04, 0x29, 0x5e, 0x3a, 0x93, 0x7f, 0x9c, 0x93, 0x53, 0xf4, 0xc2, - 0xfb, 0x20, 0x25, 0x8a, 0x96, 0xce, 0xa4, 0x9f, 0xe0, 0xa4, 0x3e, 0x09, 0x21, 0x17, 0x05, 0x4b, - 0x67, 0xf2, 0xff, 0x5f, 0x90, 0x0b, 0x12, 0x42, 0xde, 0xbd, 0x0a, 0xbf, 0xfe, 0x17, 0x12, 0x3c, - 0xe9, 0x08, 0xdd, 0x9d, 0x85, 0x7e, 0x5e, 0xa9, 0x74, 0xa6, 0xfe, 0x24, 0xef, 0x5c, 0x50, 0x14, - 0x4e, 0x41, 0xb2, 0x4b, 0x85, 0xff, 0x34, 0x27, 0x65, 0xf8, 0x85, 0x39, 0xc8, 0x84, 0xaa, 0x93, - 0xce, 0xe4, 0x7f, 0x89, 0x93, 0x87, 0xa9, 0x88, 0xe8, 0xbc, 0x3a, 0xe9, 0xcc, 0xe0, 0x53, 0x42, - 0x74, 0x4e, 0x41, 0xd4, 0x26, 0x0a, 0x93, 0xce, 0xd4, 0x9f, 0x16, 0x5a, 0x17, 0x24, 0x85, 0xc7, - 0x21, 0xed, 0x27, 0x9b, 0xce, 0xf4, 0x9f, 0xe1, 0xf4, 0x01, 0x0d, 0xd1, 0x40, 0x28, 0xd9, 0x75, - 0x66, 0xf1, 0x97, 0x85, 0x06, 0x42, 0x54, 0xc4, 0x8d, 0x1a, 0x0b, 0x98, 0xce, 0x9c, 0x7e, 0x46, - 0xb8, 0x51, 0x43, 0xfd, 0x42, 0x66, 0x93, 0xc6, 0xfc, 0xce, 0x2c, 0x7e, 0x56, 0xcc, 0x26, 0xc5, - 0x27, 0x62, 0x34, 0x56, 0x04, 0x9d, 0x79, 0xfc, 0x15, 0x21, 0x46, 0x43, 0x41, 0x50, 0x58, 0x03, - 0xd4, 0x5c, 0x0d, 0x74, 0xe6, 0xf7, 0x59, 0xce, 0x6f, 0xa4, 0xa9, 0x18, 0x28, 0x3c, 0x09, 0xe3, - 0xad, 0x2b, 0x81, 0xce, 0x5c, 0x3f, 0xf7, 0x46, 0xc3, 0xda, 0x2d, 0x5c, 0x08, 0x14, 0x36, 0x82, - 0x94, 0x12, 0xae, 0x02, 0x3a, 0xb3, 0x7d, 0xf1, 0x8d, 0x68, 0xe0, 0x0e, 0x17, 0x01, 0x85, 0x59, - 0x80, 0x20, 0x01, 0x77, 0xe6, 0xf5, 0x79, 0xce, 0x2b, 0x44, 0x44, 0x5c, 0x83, 0xe7, 0xdf, 0xce, - 0xf4, 0x2f, 0x09, 0xd7, 0xe0, 0x14, 0xc4, 0x35, 0x44, 0xea, 0xed, 0x4c, 0xfd, 0x05, 0xe1, 0x1a, - 0x82, 0x84, 0x58, 0x76, 0x28, 0xbb, 0x75, 0xe6, 0xf0, 0x45, 0x61, 0xd9, 0x21, 0xaa, 0xc2, 0x0a, - 0x8c, 0x34, 0x25, 0xc4, 0xce, 0xac, 0xbe, 0xc4, 0x59, 0x65, 0x1b, 0xf3, 0x61, 0x38, 0x79, 0xf1, - 0x64, 0xd8, 0x99, 0xdb, 0x97, 0x1b, 0x92, 0x17, 0xcf, 0x85, 0x85, 0xb3, 0x90, 0x32, 0xeb, 0x86, - 0x41, 0x9c, 0x07, 0xed, 0x7e, 0x37, 0x30, 0xf7, 0x47, 0x6f, 0x72, 0xed, 0x08, 0x82, 0xc2, 0x09, - 0x48, 0xe2, 0xda, 0x26, 0xae, 0x74, 0xa2, 0xfc, 0xfe, 0x9b, 0x22, 0x60, 0x12, 0xec, 0xc2, 0xe3, - 0x00, 0x6c, 0x6b, 0x84, 0x1e, 0x0f, 0x76, 0xa0, 0xfd, 0x2f, 0x6f, 0xf2, 0xcb, 0x38, 0x01, 0x49, - 0xc0, 0x80, 0x5d, 0xed, 0xd9, 0x9d, 0xc1, 0x0f, 0xa2, 0x0c, 0xe8, 0x8c, 0x9c, 0x81, 0xfe, 0x67, - 0x5d, 0xcb, 0xf4, 0xd4, 0x6a, 0x27, 0xea, 0xff, 0xca, 0xa9, 0x05, 0x3e, 0x51, 0x58, 0xcd, 0x72, - 0xb0, 0xa7, 0x56, 0xdd, 0x4e, 0xb4, 0xff, 0x8d, 0xd3, 0xfa, 0x04, 0x84, 0x58, 0x53, 0x5d, 0xaf, - 0x9b, 0x71, 0xff, 0xb1, 0x20, 0x16, 0x04, 0x44, 0x68, 0xf2, 0xfb, 0x0a, 0xde, 0xe9, 0x44, 0xfb, - 0x27, 0x42, 0x68, 0x8e, 0x5f, 0x78, 0x1f, 0xa4, 0xc9, 0x4f, 0x76, 0xc3, 0xae, 0x03, 0xf1, 0x7f, - 0xe7, 0xc4, 0x01, 0x05, 0xe9, 0xd9, 0xf5, 0x2a, 0x9e, 0xde, 0x59, 0xd9, 0xb7, 0xf8, 0x4c, 0x0b, - 0xfc, 0xc2, 0x2c, 0x64, 0x5c, 0xaf, 0x52, 0xa9, 0xf3, 0xfa, 0xb4, 0x03, 0xf9, 0xff, 0x78, 0xd3, - 0xdf, 0xb2, 0xf0, 0x69, 0xc8, 0x6c, 0x5f, 0xbb, 0xe2, 0xd9, 0x16, 0x3d, 0x02, 0xe9, 0xc4, 0xe1, - 0x0d, 0xce, 0x21, 0x44, 0x52, 0x98, 0x83, 0x01, 0x32, 0x16, 0x07, 0xdb, 0x98, 0x9e, 0x57, 0x75, - 0x60, 0xf1, 0x3f, 0xb9, 0x02, 0x22, 0x44, 0xc5, 0x1f, 0xff, 0xd6, 0x6b, 0x13, 0xd2, 0x2b, 0xaf, - 0x4d, 0x48, 0x7f, 0xf8, 0xda, 0x84, 0xf4, 0xe9, 0xef, 0x4e, 0xec, 0x7b, 0xe5, 0xbb, 0x13, 0xfb, - 0x7e, 0xef, 0xbb, 0x13, 0xfb, 0x5a, 0x6f, 0x1b, 0xc3, 0x82, 0xb5, 0x60, 0xb1, 0x0d, 0xe3, 0x67, - 0xe4, 0xc8, 0x76, 0x71, 0xd5, 0x0a, 0x76, 0x6b, 0xfd, 0x45, 0x0e, 0x7c, 0x3a, 0x06, 0x93, 0x8d, - 0x7b, 0xb9, 0x44, 0x81, 0xae, 0xa7, 0xd6, 0xec, 0x76, 0x6f, 0xec, 0x9c, 0x85, 0xf4, 0x86, 0xc0, - 0x41, 0x39, 0xe8, 0x77, 0xb1, 0x66, 0x99, 0x15, 0x97, 0x1e, 0x73, 0xc6, 0x15, 0xd1, 0x44, 0x63, - 0x90, 0x34, 0x55, 0xd3, 0x72, 0xf9, 0x3d, 0x41, 0xd6, 0x28, 0xfe, 0x9c, 0xd4, 0xdb, 0x88, 0x86, - 0xfc, 0xae, 0xe8, 0xb0, 0xd6, 0xa4, 0x67, 0x1e, 0xdc, 0x6d, 0x1b, 0x9c, 0x98, 0xac, 0x1b, 0x0c, - 0x21, 0xb4, 0xe7, 0x3d, 0xd1, 0xb8, 0xe7, 0xfd, 0x24, 0x36, 0x8c, 0x8b, 0xa6, 0x75, 0xcd, 0xdc, - 0x20, 0x34, 0x9b, 0x7d, 0xec, 0x86, 0x31, 0xfc, 0xae, 0x04, 0x53, 0xf4, 0xa6, 0xb4, 0x53, 0xd3, - 0x4d, 0x6f, 0xc6, 0xd0, 0x37, 0xdd, 0x99, 0x4d, 0xdd, 0x73, 0x67, 0x28, 0x6b, 0xae, 0x93, 0xb1, - 0x00, 0x63, 0x9a, 0x60, 0x4c, 0x13, 0x0c, 0xf9, 0x38, 0xa4, 0x8a, 0xba, 0x37, 0xeb, 0x38, 0xea, - 0x0e, 0x42, 0x90, 0x20, 0x30, 0xae, 0x14, 0xfa, 0x9b, 0x68, 0x04, 0x1b, 0xb8, 0xe6, 0xd2, 0xd3, - 0x96, 0x84, 0xc2, 0x1a, 0xc5, 0x4b, 0xed, 0x14, 0xf2, 0xcc, 0xd9, 0xd0, 0x48, 0x43, 0x22, 0x85, - 0x7e, 0xb2, 0x4d, 0xfa, 0x56, 0xe2, 0xfa, 0xe3, 0xf9, 0x6a, 0x02, 0x0e, 0x87, 0x10, 0x34, 0x67, - 0xc7, 0xf6, 0xa8, 0x2d, 0x58, 0x5b, 0x7c, 0x30, 0x23, 0xa1, 0xc1, 0xb0, 0xc7, 0xf9, 0x96, 0x27, - 0x00, 0xf2, 0x16, 0x24, 0xd7, 0x08, 0x1d, 0x19, 0x88, 0x67, 0x79, 0xaa, 0xc1, 0x47, 0xc7, 0x1a, - 0x04, 0xca, 0x6e, 0x8b, 0xc7, 0x18, 0x54, 0x17, 0x17, 0xc5, 0x0d, 0xac, 0x6e, 0xb1, 0x4b, 0x77, - 0x71, 0x7a, 0xe8, 0x96, 0x22, 0x00, 0x7a, 0xbf, 0x6e, 0x0c, 0x92, 0x6a, 0x9d, 0x9d, 0x17, 0xc5, - 0x8f, 0x0c, 0x28, 0xac, 0x21, 0x5f, 0x84, 0x7e, 0xbe, 0x47, 0x8d, 0xb2, 0x10, 0xbf, 0x82, 0x77, - 0x68, 0x3f, 0x03, 0x0a, 0xf9, 0x89, 0xa6, 0x21, 0x49, 0x85, 0xe7, 0xb7, 0x89, 0x73, 0xd3, 0x4d, - 0xd2, 0x4f, 0x53, 0x21, 0x15, 0x86, 0x26, 0x5f, 0x80, 0xd4, 0xbc, 0x55, 0xd3, 0x4d, 0x2b, 0xca, - 0x2d, 0xcd, 0xb8, 0x51, 0x99, 0xed, 0xba, 0xc7, 0x8f, 0x70, 0x58, 0x03, 0x8d, 0x43, 0x1f, 0xbb, - 0x84, 0xc9, 0xcf, 0xbc, 0x78, 0x4b, 0x9e, 0x83, 0x7e, 0xca, 0x7b, 0xd5, 0x26, 0xf3, 0xeb, 0xdf, - 0x80, 0x49, 0xf3, 0x2b, 0xf9, 0x9c, 0x7d, 0x2c, 0x10, 0x16, 0x41, 0xa2, 0xa2, 0x7a, 0x2a, 0x1f, - 0x37, 0xfd, 0x2d, 0xbf, 0x1f, 0x52, 0x9c, 0x89, 0x8b, 0x8e, 0x41, 0xdc, 0xb2, 0x5d, 0x7e, 0x6a, - 0x95, 0x6f, 0x37, 0x94, 0x55, 0xbb, 0x98, 0xf8, 0xd6, 0xcd, 0xc9, 0x7d, 0x0a, 0x41, 0x2e, 0x2a, - 0x6d, 0xed, 0xe5, 0x74, 0xef, 0xf6, 0xc2, 0xba, 0xf1, 0x8d, 0xe5, 0x8b, 0x31, 0x98, 0x08, 0x3d, - 0xbd, 0x8a, 0x1d, 0x52, 0xa8, 0x45, 0x4c, 0x1f, 0x85, 0x84, 0xe4, 0xcf, 0xdb, 0x98, 0xcb, 0xfb, - 0x20, 0x3e, 0x6b, 0xdb, 0x28, 0x0f, 0x29, 0x76, 0x3a, 0x65, 0x31, 0x7b, 0x49, 0x28, 0x7e, 0x9b, - 0x3c, 0x73, 0xad, 0x2d, 0xef, 0x9a, 0xea, 0xf8, 0xef, 0x29, 0x88, 0xb6, 0x7c, 0x06, 0xd2, 0x73, - 0x96, 0xe9, 0x62, 0xd3, 0xad, 0x53, 0xd7, 0xd9, 0x34, 0x2c, 0xed, 0x0a, 0xe7, 0xc0, 0x1a, 0x44, - 0xe1, 0xaa, 0x6d, 0x53, 0xca, 0x84, 0x42, 0x7e, 0x16, 0x12, 0xaf, 0xbf, 0x3c, 0x29, 0x15, 0xd7, - 0xdb, 0xaa, 0xe8, 0x4c, 0xef, 0x2a, 0xe2, 0x83, 0xf4, 0x75, 0xf4, 0x07, 0x12, 0x1c, 0x6a, 0x76, - 0xa8, 0x2b, 0x78, 0xc7, 0xed, 0xd5, 0x9f, 0x4e, 0x43, 0x7a, 0x8d, 0xbe, 0x2c, 0x78, 0x11, 0xef, - 0xa0, 0x3c, 0xf4, 0xe3, 0xca, 0xb1, 0x13, 0x27, 0x1e, 0x3d, 0xc3, 0xac, 0xfd, 0xfc, 0x3e, 0x45, - 0x00, 0x0a, 0x29, 0x32, 0xaa, 0xd7, 0xbf, 0x38, 0x29, 0x15, 0x93, 0x10, 0x77, 0xeb, 0xb5, 0x3b, - 0x6a, 0x03, 0x2f, 0x26, 0x23, 0x01, 0x90, 0x45, 0xd4, 0xab, 0xaa, 0xa1, 0x57, 0xd4, 0xe0, 0x35, - 0xce, 0x6c, 0x68, 0x8c, 0x14, 0xa3, 0xf5, 0x10, 0xf3, 0xbb, 0x6a, 0x4a, 0xfe, 0x15, 0x09, 0x06, - 0x2e, 0x0b, 0xce, 0xeb, 0xd8, 0x43, 0x67, 0x01, 0xfc, 0x9e, 0x84, 0x5b, 0x1c, 0x9c, 0x6e, 0xec, - 0x6b, 0xda, 0xa7, 0x51, 0x42, 0xe8, 0xe8, 0x14, 0x35, 0x34, 0xdb, 0x72, 0xf9, 0xdd, 0xf4, 0x0e, - 0xa4, 0x3e, 0x32, 0x7a, 0x08, 0x10, 0x8d, 0x60, 0xe5, 0xab, 0x96, 0xa7, 0x9b, 0xd5, 0xb2, 0x6d, - 0x5d, 0xe3, 0x6f, 0xfc, 0xc4, 0x95, 0x2c, 0x7d, 0x72, 0x99, 0x3e, 0x58, 0x23, 0x70, 0x22, 0x74, - 0xda, 0xe7, 0x42, 0xf2, 0x9f, 0x5a, 0xa9, 0x38, 0xd8, 0x75, 0x79, 0x90, 0x12, 0x4d, 0x74, 0x16, - 0xfa, 0xed, 0xfa, 0x66, 0x59, 0x44, 0x84, 0xcc, 0xb1, 0x43, 0xad, 0xfc, 0x5b, 0xcc, 0x3f, 0xf7, - 0xf0, 0x3e, 0xbb, 0xbe, 0x49, 0xac, 0xe1, 0x6e, 0x18, 0x68, 0x21, 0x4c, 0xe6, 0x6a, 0x20, 0x07, - 0x7d, 0x07, 0x95, 0x8f, 0xa0, 0x6c, 0x3b, 0xba, 0xe5, 0xe8, 0xde, 0x0e, 0x3d, 0x5a, 0x8e, 0x2b, - 0x59, 0xf1, 0x60, 0x8d, 0xc3, 0xe5, 0x2b, 0x30, 0xbc, 0xae, 0xd7, 0x6c, 0x7a, 0x19, 0x82, 0x4b, - 0x7e, 0x22, 0x90, 0x4f, 0xea, 0x2c, 0x5f, 0x5b, 0xc9, 0x62, 0x4d, 0x92, 0x15, 0x9f, 0x68, 0x6b, - 0x9d, 0xa7, 0x7a, 0xb7, 0x4e, 0x2f, 0x92, 0x9d, 0xff, 0x34, 0x1f, 0x71, 0x3e, 0x9e, 0xee, 0x43, - 0xe1, 0xa9, 0x5b, 0xc3, 0xec, 0x54, 0xf6, 0xe4, 0x3b, 0x16, 0x01, 0xf9, 0xdd, 0xd3, 0x6a, 0xbe, - 0x43, 0x20, 0xcd, 0x77, 0x74, 0x32, 0xf9, 0x0c, 0x0c, 0xae, 0xa9, 0x8e, 0xb7, 0x8e, 0xbd, 0xf3, - 0x58, 0xad, 0x60, 0x27, 0x9a, 0x77, 0x07, 0x45, 0xde, 0x45, 0x90, 0xa0, 0xc9, 0x95, 0xe5, 0x1d, - 0xfa, 0x5b, 0xde, 0x86, 0x04, 0xbd, 0x80, 0xe2, 0xe7, 0x64, 0x4e, 0xc1, 0x72, 0x32, 0x89, 0xa6, - 0x3b, 0x1e, 0x76, 0x39, 0x09, 0x6b, 0xa0, 0xe3, 0x22, 0xb3, 0xc6, 0x77, 0xcf, 0xac, 0xdc, 0x54, - 0x79, 0x7e, 0x35, 0xa0, 0xbf, 0x48, 0x82, 0xf1, 0xe2, 0xbc, 0x2f, 0x88, 0x14, 0x08, 0x82, 0x96, - 0x61, 0xd8, 0x56, 0x1d, 0x8f, 0xde, 0xbc, 0xdd, 0xa6, 0xa3, 0xe0, 0xde, 0x30, 0xd9, 0xec, 0x9b, - 0x91, 0xc1, 0xf2, 0x5e, 0x06, 0xed, 0x30, 0x50, 0xfe, 0x4f, 0x09, 0xe8, 0xe3, 0xca, 0x78, 0x1f, - 0xf4, 0x73, 0xb5, 0x72, 0xfb, 0x3d, 0x3c, 0xdd, 0x9c, 0x9a, 0xa6, 0xfd, 0x14, 0xc2, 0xf9, 0x09, - 0x1a, 0x74, 0x1f, 0xa4, 0xb4, 0x6d, 0x55, 0x37, 0xcb, 0x3a, 0xbb, 0x82, 0x9a, 0x2e, 0x66, 0x5e, - 0xbb, 0x39, 0xd9, 0x3f, 0x47, 0x60, 0x8b, 0xf3, 0x4a, 0x3f, 0x7d, 0xb8, 0x58, 0x21, 0xb5, 0xc0, - 0x36, 0xd6, 0xab, 0xdb, 0x1e, 0xf7, 0x41, 0xde, 0x42, 0xa7, 0x21, 0x41, 0x4c, 0x86, 0xbf, 0x97, - 0x91, 0x6f, 0x2a, 0xee, 0xfd, 0xba, 0xb5, 0x98, 0x22, 0x1d, 0x7f, 0xfa, 0x3b, 0x93, 0x92, 0x42, - 0x29, 0xd0, 0x1c, 0x0c, 0x1a, 0xaa, 0xeb, 0x95, 0x69, 0x0e, 0x23, 0xdd, 0x27, 0x29, 0x8b, 0x03, - 0xcd, 0x0a, 0xe1, 0x8a, 0xe5, 0xa2, 0x67, 0x08, 0x15, 0x03, 0x55, 0xd0, 0x11, 0xc8, 0x52, 0x26, - 0x9a, 0x55, 0xab, 0xe9, 0x1e, 0xab, 0xae, 0xfa, 0xa8, 0xde, 0x87, 0x08, 0x7c, 0x8e, 0x82, 0x69, - 0x8d, 0x75, 0x10, 0xd2, 0xf4, 0x26, 0x38, 0x45, 0x61, 0xb7, 0x9e, 0x52, 0x04, 0x40, 0x1f, 0xde, - 0x0f, 0xc3, 0x41, 0x04, 0x65, 0x28, 0x29, 0xc6, 0x25, 0x00, 0x53, 0xc4, 0x47, 0x60, 0xcc, 0xc4, - 0xd7, 0xe9, 0x3d, 0xac, 0x08, 0x76, 0x9a, 0x62, 0x23, 0xf2, 0xec, 0x72, 0x94, 0xe2, 0x3d, 0x30, - 0xa4, 0x09, 0xe5, 0x33, 0x5c, 0xa0, 0xb8, 0x83, 0x3e, 0x94, 0xa2, 0x1d, 0x80, 0x94, 0x6a, 0xdb, - 0x0c, 0x21, 0xc3, 0x23, 0xa8, 0x6d, 0xd3, 0x47, 0x47, 0x61, 0x84, 0x8e, 0xd1, 0xc1, 0x6e, 0xdd, - 0xf0, 0x38, 0x93, 0x01, 0x8a, 0x33, 0x4c, 0x1e, 0x28, 0x0c, 0x4e, 0x71, 0xef, 0x81, 0x41, 0x7c, - 0x55, 0xaf, 0x60, 0x53, 0xc3, 0x0c, 0x6f, 0x90, 0xe2, 0x0d, 0x08, 0x20, 0x45, 0x7a, 0x00, 0xfc, - 0xc8, 0x58, 0x16, 0x51, 0x7b, 0x88, 0xf1, 0x13, 0xf0, 0x59, 0x06, 0x96, 0x1f, 0x82, 0xc4, 0xbc, - 0xea, 0xa9, 0xa4, 0xc4, 0xf0, 0xae, 0xb3, 0x54, 0x34, 0xa0, 0x90, 0x9f, 0x2d, 0xdd, 0xed, 0xf5, - 0x18, 0x24, 0x2e, 0x5b, 0x1e, 0x46, 0x8f, 0x85, 0xca, 0xc2, 0xa1, 0x56, 0x36, 0xbe, 0xae, 0x57, - 0x4d, 0x5c, 0x59, 0x76, 0xab, 0xa1, 0x57, 0x39, 0x03, 0x13, 0x8b, 0x45, 0x4c, 0x6c, 0x0c, 0x92, - 0x8e, 0x55, 0x37, 0x2b, 0xe2, 0x12, 0x11, 0x6d, 0xa0, 0x12, 0xa4, 0x7c, 0xcb, 0x49, 0x74, 0xb2, - 0x9c, 0x61, 0x62, 0x39, 0xc4, 0xae, 0x39, 0x40, 0xe9, 0xdf, 0xe4, 0x06, 0x54, 0x84, 0xb4, 0x1f, - 0xf2, 0xb8, 0x05, 0x76, 0x67, 0xc4, 0x01, 0x19, 0x49, 0x41, 0xbe, 0x3d, 0xf8, 0x0a, 0x65, 0x56, - 0x98, 0xf5, 0x1f, 0x70, 0x8d, 0x46, 0x4c, 0x8d, 0xbf, 0x56, 0xda, 0x4f, 0xc7, 0x15, 0x98, 0x1a, - 0x7b, 0xb5, 0xf4, 0x10, 0xa4, 0x5d, 0xbd, 0x6a, 0xaa, 0x5e, 0xdd, 0xc1, 0xdc, 0x1a, 0x03, 0x80, - 0xfc, 0x99, 0x18, 0xf4, 0x31, 0xeb, 0x0e, 0xe9, 0x4d, 0x6a, 0xad, 0xb7, 0x58, 0x3b, 0xbd, 0xc5, - 0xf7, 0xae, 0xb7, 0x59, 0x00, 0x5f, 0x18, 0x97, 0xbf, 0xed, 0xd7, 0xa2, 0xce, 0x60, 0x22, 0xae, - 0xeb, 0x55, 0xee, 0xbc, 0x21, 0x22, 0xdf, 0x82, 0x92, 0xa1, 0x38, 0x79, 0x16, 0xd2, 0x9b, 0xba, - 0x57, 0x56, 0xc9, 0xe2, 0x91, 0xaa, 0x30, 0x73, 0x6c, 0x62, 0xba, 0xd5, 0x2a, 0x73, 0x5a, 0x2c, - 0x31, 0x95, 0xd4, 0x26, 0xff, 0x25, 0xff, 0x81, 0x44, 0x6a, 0x65, 0xde, 0x21, 0x9a, 0x85, 0x41, - 0x31, 0xd0, 0xf2, 0x96, 0xa1, 0x56, 0xb9, 0x31, 0x1e, 0x6e, 0x3b, 0xda, 0x73, 0x86, 0x5a, 0x55, - 0x32, 0x7c, 0x80, 0xa4, 0xd1, 0x7a, 0x62, 0x63, 0x6d, 0x26, 0x36, 0x62, 0x49, 0xf1, 0xbd, 0x59, - 0x52, 0x64, 0xce, 0x13, 0x8d, 0x73, 0xfe, 0xb5, 0x18, 0x5d, 0x33, 0xd9, 0x96, 0xab, 0x1a, 0x6f, - 0x87, 0x8b, 0x1d, 0x84, 0xb4, 0x6d, 0x19, 0x65, 0xf6, 0x84, 0xdd, 0xd6, 0x4b, 0xd9, 0x96, 0xa1, - 0x34, 0xd9, 0x51, 0xf2, 0x36, 0xf9, 0x5f, 0xdf, 0x6d, 0xd0, 0x5a, 0x7f, 0xa3, 0xd6, 0x1c, 0x18, - 0x60, 0xaa, 0xe0, 0x09, 0xf3, 0x11, 0xa2, 0x03, 0x9a, 0x81, 0xa5, 0xe6, 0x04, 0xcf, 0xc4, 0x66, - 0x98, 0x0a, 0xc7, 0x23, 0x14, 0x2c, 0xbf, 0xb4, 0x5a, 0x6c, 0x87, 0xed, 0x5c, 0xe1, 0x78, 0xf2, - 0xcf, 0x49, 0x00, 0x4b, 0x44, 0xb3, 0x74, 0xbc, 0x24, 0xd5, 0xb9, 0x54, 0x84, 0x72, 0xa4, 0xe7, - 0x89, 0x76, 0x93, 0xc6, 0xfb, 0x1f, 0x70, 0xc3, 0x72, 0xcf, 0xc1, 0x60, 0x60, 0x8c, 0x2e, 0x16, - 0xc2, 0x4c, 0xec, 0x52, 0xdc, 0xaf, 0x63, 0x4f, 0x19, 0xb8, 0x1a, 0x6a, 0xc9, 0xff, 0x4c, 0x82, - 0x34, 0x95, 0x69, 0x19, 0x7b, 0x6a, 0x64, 0x0e, 0xa5, 0xbd, 0xcf, 0xe1, 0x61, 0x00, 0xc6, 0xc6, - 0xd5, 0x6f, 0x60, 0x6e, 0x59, 0x69, 0x0a, 0x59, 0xd7, 0x6f, 0x60, 0x74, 0xd2, 0x57, 0x78, 0x7c, - 0x77, 0x85, 0x8b, 0xe2, 0x9f, 0xab, 0xfd, 0x2e, 0xe8, 0xa7, 0x9f, 0xdb, 0xb8, 0xee, 0xf2, 0x7a, - 0xbe, 0xcf, 0xac, 0xd7, 0x36, 0xae, 0xbb, 0xf2, 0xb3, 0xd0, 0xbf, 0x71, 0x9d, 0x6d, 0xc1, 0x1c, - 0x84, 0xb4, 0x63, 0x59, 0x3c, 0xf1, 0xb3, 0x82, 0x2b, 0x45, 0x00, 0x34, 0xcf, 0x89, 0x6d, 0x87, - 0x58, 0xb0, 0xed, 0x10, 0xec, 0x9b, 0xc4, 0xbb, 0xda, 0x37, 0x39, 0xfa, 0xef, 0x24, 0xc8, 0x84, - 0xe2, 0x03, 0x7a, 0x14, 0xf6, 0x17, 0x97, 0x56, 0xe7, 0x2e, 0x96, 0x17, 0xe7, 0xcb, 0xe7, 0x96, - 0x66, 0x17, 0x82, 0xfb, 0xe8, 0xf9, 0xf1, 0x17, 0x5e, 0x9a, 0x42, 0x21, 0xdc, 0x4b, 0xe6, 0x15, - 0xd3, 0xba, 0x66, 0xa2, 0x19, 0x18, 0x8b, 0x92, 0xcc, 0x16, 0xd7, 0x4b, 0x2b, 0x1b, 0x59, 0x29, - 0xbf, 0xff, 0x85, 0x97, 0xa6, 0x46, 0x42, 0x14, 0xb3, 0x9b, 0x2e, 0x36, 0xbd, 0x66, 0x82, 0xb9, - 0xd5, 0xe5, 0xe5, 0xc5, 0x8d, 0x6c, 0xac, 0x89, 0x80, 0x67, 0x80, 0x07, 0x60, 0x24, 0x4a, 0xb0, - 0xb2, 0xb8, 0x94, 0x8d, 0xe7, 0xd1, 0x0b, 0x2f, 0x4d, 0x0d, 0x85, 0xb0, 0x57, 0x74, 0x23, 0x9f, - 0xfa, 0xa9, 0x2f, 0x4f, 0xec, 0xfb, 0xf9, 0xbf, 0x3e, 0x21, 0x91, 0x91, 0x0d, 0x46, 0x62, 0x04, - 0x7a, 0x08, 0xee, 0x5a, 0x5f, 0x5c, 0x58, 0x29, 0xcd, 0x97, 0x97, 0xd7, 0x17, 0xca, 0xec, 0x3d, - 0x7c, 0x7f, 0x74, 0xc3, 0x2f, 0xbc, 0x34, 0x95, 0xe1, 0x43, 0x6a, 0x87, 0xbd, 0xa6, 0x94, 0x2e, - 0xaf, 0x6e, 0x94, 0xb2, 0x12, 0xc3, 0x5e, 0x73, 0xf0, 0x55, 0xcb, 0x63, 0xdf, 0xe3, 0x79, 0x04, - 0x0e, 0xb4, 0xc0, 0xf6, 0x07, 0x36, 0xf2, 0xc2, 0x4b, 0x53, 0x83, 0x6b, 0x0e, 0x66, 0xfe, 0x43, - 0x29, 0xa6, 0x21, 0xd7, 0x4c, 0xb1, 0xba, 0xb6, 0xba, 0x3e, 0xbb, 0x94, 0x9d, 0xca, 0x67, 0x5f, - 0x78, 0x69, 0x6a, 0x40, 0x04, 0x43, 0x82, 0x1f, 0x8c, 0xec, 0x4e, 0x2e, 0xbc, 0xfe, 0x62, 0x0c, - 0x26, 0x9a, 0x6e, 0xfd, 0xf2, 0xbd, 0xf2, 0x76, 0x1b, 0xc5, 0x05, 0x48, 0xcd, 0x8b, 0x2d, 0xf8, - 0x5e, 0xf7, 0x89, 0x7f, 0xb6, 0xc7, 0x7d, 0xe2, 0x41, 0xd1, 0x93, 0xd8, 0x26, 0x3e, 0xda, 0x79, - 0x9b, 0x58, 0xc8, 0xbf, 0x87, 0x5d, 0xe2, 0x8f, 0xc5, 0x61, 0x42, 0xb3, 0xdc, 0x9a, 0xe5, 0xce, - 0x6c, 0xaa, 0x2e, 0x9e, 0xb9, 0xfa, 0xe8, 0x26, 0xf6, 0xd4, 0x47, 0x67, 0x34, 0x4b, 0x17, 0xea, - 0x18, 0x65, 0xcf, 0xa7, 0xc9, 0xf3, 0x69, 0xfe, 0xbc, 0xcd, 0x46, 0xd0, 0x02, 0x24, 0xe6, 0x2c, - 0xdd, 0x24, 0xaa, 0xa8, 0x60, 0xd3, 0xaa, 0xf1, 0x5d, 0x45, 0xd6, 0x40, 0xf7, 0x40, 0x9f, 0x5a, - 0xb3, 0xea, 0xa6, 0x27, 0xd6, 0x29, 0x24, 0x58, 0xfc, 0xfe, 0xcd, 0xc9, 0xf8, 0xa2, 0xe9, 0x29, - 0xfc, 0x11, 0xdb, 0xf8, 0x92, 0x2f, 0x40, 0xff, 0x3c, 0xd6, 0xf6, 0xc2, 0x6b, 0x1e, 0x6b, 0x0d, - 0xbc, 0x1e, 0x80, 0xd4, 0xa2, 0xe9, 0xb1, 0x77, 0xdb, 0x0f, 0x43, 0x5c, 0x37, 0x59, 0x99, 0xd5, - 0xd0, 0x3f, 0x81, 0x13, 0xd4, 0x79, 0xac, 0xf9, 0xa8, 0x15, 0xac, 0x35, 0xa2, 0x12, 0xf6, 0x04, - 0x5e, 0x9c, 0xff, 0xbd, 0xff, 0x38, 0xb1, 0xef, 0xf9, 0xd7, 0x26, 0xf6, 0xb5, 0x35, 0xd5, 0xf0, - 0xb9, 0x05, 0x57, 0x31, 0xfb, 0xf3, 0xb0, 0x5b, 0xb9, 0xd2, 0x60, 0x95, 0x1f, 0x7f, 0x14, 0xee, - 0xe5, 0x38, 0xae, 0xa7, 0x5e, 0xd1, 0xcd, 0xaa, 0x3f, 0x13, 0xbc, 0xcd, 0x27, 0x63, 0x9c, 0x4f, - 0x86, 0x80, 0xee, 0x3a, 0x1f, 0xf9, 0x5d, 0xb7, 0x18, 0x3a, 0x6f, 0x1d, 0x74, 0x70, 0x94, 0x7c, - 0x07, 0xcb, 0x91, 0x3f, 0x29, 0xc1, 0xd0, 0x79, 0xdd, 0xf5, 0x2c, 0x47, 0xd7, 0x54, 0x83, 0xbe, - 0xe5, 0x70, 0xb2, 0xdb, 0xdc, 0xdd, 0x90, 0x4a, 0x1e, 0x87, 0xbe, 0xab, 0xaa, 0xc1, 0x92, 0x66, - 0x9c, 0x7e, 0x94, 0xa1, 0xb5, 0x22, 0x82, 0xd4, 0x29, 0x18, 0x30, 0x32, 0xf9, 0x17, 0x63, 0x30, - 0x4c, 0x83, 0xad, 0xcb, 0x3e, 0xd7, 0xe3, 0x61, 0x52, 0xf0, 0x25, 0x1c, 0xd5, 0xe3, 0x7b, 0xdf, - 0xc5, 0x69, 0x3e, 0xc7, 0xf7, 0x75, 0x9e, 0xb7, 0x69, 0x62, 0x06, 0x94, 0x16, 0xfd, 0x18, 0xa4, - 0x6a, 0xea, 0xf5, 0x32, 0xe5, 0xc3, 0x4c, 0x71, 0xb6, 0x37, 0x3e, 0xb7, 0x6e, 0x4e, 0x0e, 0xef, - 0xa8, 0x35, 0xa3, 0x20, 0x0b, 0x3e, 0xb2, 0xd2, 0x5f, 0x53, 0xaf, 0x13, 0x11, 0x91, 0x0d, 0xc3, - 0x04, 0xaa, 0x6d, 0xab, 0x66, 0x15, 0xb3, 0x4e, 0xe8, 0x4e, 0x7e, 0xf1, 0x7c, 0xcf, 0x9d, 0x8c, - 0x07, 0x9d, 0x84, 0xd8, 0xc9, 0xca, 0x60, 0x4d, 0xbd, 0x3e, 0x47, 0x01, 0xa4, 0xc7, 0x42, 0xea, - 0xb3, 0x2f, 0x4f, 0xee, 0xa3, 0x7e, 0xf3, 0xaa, 0x04, 0x10, 0x68, 0x0c, 0xfd, 0x18, 0x64, 0x35, - 0xbf, 0x45, 0x69, 0x5d, 0x3e, 0x87, 0xf7, 0xb7, 0x9b, 0x8b, 0x06, 0x7d, 0xb3, 0xda, 0xef, 0x95, - 0x9b, 0x93, 0x92, 0x32, 0xac, 0x35, 0x4c, 0xc5, 0x07, 0x21, 0x53, 0xb7, 0x2b, 0xaa, 0x87, 0xcb, - 0x74, 0x33, 0x22, 0xd6, 0xb1, 0x8e, 0x9c, 0x20, 0xbc, 0x6e, 0xdd, 0x9c, 0x44, 0x6c, 0x58, 0x21, - 0x62, 0x99, 0x56, 0x97, 0xc0, 0x20, 0x84, 0x20, 0x34, 0xa6, 0xdf, 0x91, 0x20, 0x33, 0x1f, 0xba, - 0x6d, 0x94, 0x83, 0xfe, 0x9a, 0x65, 0xea, 0x57, 0xb8, 0x3d, 0xa6, 0x15, 0xd1, 0x44, 0x79, 0x48, - 0xb1, 0x17, 0xbf, 0xbc, 0x1d, 0xb1, 0xa3, 0x2f, 0xda, 0x84, 0xea, 0x1a, 0xde, 0x74, 0x75, 0x31, - 0x1b, 0x8a, 0x68, 0xa2, 0x73, 0x90, 0x75, 0xb1, 0x56, 0x77, 0x74, 0x6f, 0xa7, 0xac, 0x59, 0xa6, - 0xa7, 0x6a, 0x1e, 0x7b, 0x85, 0xa8, 0x78, 0xf0, 0xd6, 0xcd, 0xc9, 0xbb, 0x98, 0xac, 0x8d, 0x18, - 0xb2, 0x32, 0x2c, 0x40, 0x73, 0x0c, 0x42, 0x7a, 0xa8, 0x60, 0x4f, 0xd5, 0x0d, 0x97, 0x96, 0xe6, - 0x69, 0x45, 0x34, 0x43, 0x63, 0xf9, 0x27, 0xfd, 0xe1, 0xfd, 0xdb, 0x6b, 0x90, 0xb5, 0x6c, 0xec, - 0x44, 0x16, 0x3a, 0xb4, 0x9c, 0x2a, 0x2e, 0x05, 0x3d, 0x37, 0x62, 0xc8, 0xff, 0xf7, 0xe6, 0xe4, - 0xc3, 0x5d, 0x58, 0xd0, 0x65, 0xd5, 0xe0, 0x8b, 0x24, 0x65, 0x58, 0xf0, 0x10, 0xab, 0xa6, 0x73, - 0xc4, 0x2e, 0xc4, 0xf6, 0x88, 0x5d, 0xdf, 0x14, 0xfb, 0xc4, 0x91, 0x21, 0x37, 0x62, 0xc8, 0xc4, - 0x02, 0x38, 0x68, 0x8d, 0x42, 0xc8, 0xca, 0xe6, 0x59, 0x55, 0x37, 0xc4, 0xdb, 0xb0, 0x0a, 0x6f, - 0xa1, 0x45, 0xe8, 0x73, 0x3d, 0xd5, 0xab, 0xb3, 0x1a, 0x32, 0x59, 0x7c, 0xb4, 0x4b, 0x99, 0x8b, - 0x96, 0x59, 0x59, 0xa7, 0x84, 0x0a, 0x67, 0x80, 0xce, 0x41, 0x9f, 0x67, 0x5d, 0xc1, 0x26, 0x57, - 0x6a, 0x4f, 0x1e, 0x4f, 0x73, 0x14, 0xa3, 0x46, 0x1e, 0x64, 0x2b, 0xd8, 0xc0, 0x55, 0x56, 0xc8, - 0x6f, 0xab, 0x64, 0x01, 0x4d, 0xbf, 0x5c, 0x55, 0x5c, 0xec, 0xd9, 0x2d, 0xb9, 0x82, 0x1a, 0xf9, - 0xc9, 0xca, 0xb0, 0x0f, 0x5a, 0xa7, 0x10, 0x74, 0x31, 0x72, 0x51, 0x8e, 0x7f, 0xde, 0xed, 0x9e, - 0x76, 0xbe, 0x17, 0xb2, 0x72, 0xb1, 0xed, 0x16, 0xbe, 0x66, 0x77, 0x0e, 0xb2, 0x75, 0x73, 0xd3, - 0x32, 0xe9, 0x1b, 0x6c, 0x7c, 0x45, 0x99, 0x22, 0xf5, 0x4c, 0x78, 0xd6, 0x1a, 0x31, 0x64, 0x65, - 0xd8, 0x07, 0x9d, 0x67, 0xeb, 0xce, 0x0a, 0x0c, 0x05, 0x58, 0xd4, 0x75, 0xd3, 0x1d, 0x5d, 0xf7, - 0x6e, 0xee, 0xba, 0xfb, 0x1b, 0x7b, 0x09, 0xbc, 0x77, 0xd0, 0x07, 0x12, 0x32, 0x74, 0x1e, 0x20, - 0x08, 0x18, 0x74, 0xfb, 0x2d, 0x73, 0x4c, 0xee, 0x1c, 0x75, 0xc4, 0x96, 0x45, 0x40, 0x8b, 0x3e, - 0x0c, 0xa3, 0x35, 0xdd, 0x2c, 0xbb, 0xd8, 0xd8, 0x2a, 0x73, 0x05, 0x13, 0x96, 0xf4, 0x03, 0x24, - 0xc5, 0xa5, 0xde, 0xec, 0xe1, 0xd6, 0xcd, 0xc9, 0x3c, 0x0f, 0xaa, 0xcd, 0x2c, 0x65, 0x65, 0xa4, - 0xa6, 0x9b, 0xeb, 0xd8, 0xd8, 0x9a, 0xf7, 0x61, 0x85, 0x81, 0x9f, 0x7a, 0x79, 0x72, 0x9f, 0xef, - 0xc0, 0x3a, 0x3d, 0x34, 0xe2, 0x7e, 0x84, 0x5d, 0xb4, 0x0a, 0x69, 0x55, 0x34, 0xd8, 0x46, 0x5d, - 0xd7, 0xc6, 0x1e, 0x72, 0xd0, 0x80, 0x07, 0x8b, 0x15, 0xcf, 0xff, 0x87, 0x29, 0x49, 0x7e, 0x21, - 0x06, 0x7d, 0xf3, 0x97, 0xd7, 0x54, 0xdd, 0x41, 0x37, 0x60, 0x24, 0x30, 0xb6, 0x68, 0xa4, 0x58, - 0xbe, 0x75, 0x73, 0x32, 0xd7, 0x68, 0x8f, 0x3d, 0x86, 0x8a, 0x59, 0x4d, 0x13, 0x92, 0x04, 0x4e, - 0x22, 0x62, 0xc5, 0x8d, 0xb6, 0xdb, 0x31, 0xe1, 0xbe, 0x9b, 0x50, 0xf6, 0x10, 0xa6, 0x9a, 0x76, - 0x77, 0x42, 0x81, 0xb3, 0x04, 0xfd, 0x4c, 0x17, 0x2e, 0x2a, 0x40, 0xd2, 0x26, 0x3f, 0xf8, 0x11, - 0xdd, 0x44, 0x5b, 0x6f, 0xa2, 0xf8, 0xfe, 0x81, 0x01, 0x21, 0x91, 0xbf, 0x14, 0x07, 0x98, 0xbf, - 0x7c, 0x79, 0xc3, 0xd1, 0x6d, 0x03, 0x7b, 0x3f, 0x54, 0xbd, 0x7e, 0x5c, 0x82, 0xfd, 0xa1, 0xad, - 0x05, 0x47, 0x6b, 0x50, 0xee, 0x13, 0xb7, 0x6e, 0x4e, 0x1e, 0x6a, 0x54, 0x6e, 0x08, 0x6d, 0x0f, - 0x0a, 0x1e, 0x0d, 0x76, 0x25, 0x1c, 0xad, 0xb5, 0x1c, 0x15, 0xd7, 0xf3, 0xe5, 0x88, 0xb7, 0x97, - 0x23, 0x84, 0xf6, 0x96, 0xe4, 0x98, 0x77, 0xbd, 0xe6, 0xb9, 0x5e, 0x87, 0x4c, 0x30, 0x47, 0x2e, - 0x9a, 0x87, 0x94, 0xc7, 0x7f, 0xf3, 0x29, 0x97, 0xdb, 0x4f, 0xb9, 0x20, 0xe3, 0xd3, 0xee, 0x53, - 0xca, 0xff, 0x36, 0x06, 0x10, 0x78, 0xf5, 0x9f, 0x57, 0x8f, 0x22, 0xe9, 0x94, 0x27, 0xbf, 0xf8, - 0x9e, 0x0a, 0x68, 0x4e, 0x1d, 0x9a, 0xad, 0x3f, 0x8a, 0xc1, 0xe8, 0x25, 0x11, 0xf9, 0xdf, 0xd5, - 0x30, 0x5a, 0x83, 0x7e, 0x6c, 0x7a, 0x8e, 0x4e, 0x55, 0x4c, 0xac, 0xf5, 0x91, 0x76, 0xd6, 0xda, - 0x42, 0x6b, 0xf4, 0x23, 0x3b, 0xe2, 0xb4, 0x90, 0xb3, 0x09, 0xe9, 0xfa, 0x53, 0x71, 0xc8, 0xb5, - 0xa3, 0x42, 0x73, 0x30, 0xac, 0x39, 0x98, 0x02, 0xca, 0xe1, 0xa3, 0x89, 0x62, 0x3e, 0x58, 0x49, - 0x34, 0x20, 0xc8, 0xca, 0x90, 0x80, 0xf0, 0xda, 0xa0, 0x0a, 0xa4, 0xcc, 0x27, 0x2e, 0x43, 0xb0, - 0xba, 0xac, 0xeb, 0x65, 0x5e, 0x1c, 0x88, 0x4e, 0xa2, 0x0c, 0x58, 0x75, 0x30, 0x14, 0x40, 0x69, - 0x79, 0xf0, 0x1c, 0x0c, 0xeb, 0xa6, 0xee, 0xe9, 0xaa, 0x51, 0xde, 0x54, 0x0d, 0xd5, 0xd4, 0xf6, - 0xb2, 0x4a, 0x62, 0x09, 0x9d, 0x77, 0xdb, 0xc0, 0x4e, 0x56, 0x86, 0x38, 0xa4, 0xc8, 0x00, 0xe8, - 0x3c, 0xf4, 0x8b, 0xae, 0x12, 0x7b, 0xaa, 0x25, 0x05, 0x79, 0x68, 0x46, 0x7e, 0x3a, 0x0e, 0x23, - 0x0a, 0xae, 0xbc, 0x3b, 0x15, 0xbd, 0x4d, 0xc5, 0x32, 0x00, 0x0b, 0x24, 0x24, 0x93, 0xec, 0x61, - 0x36, 0x48, 0x28, 0x4a, 0x33, 0x0e, 0xf3, 0xae, 0x17, 0x9a, 0x8f, 0x3f, 0x8e, 0xc3, 0x40, 0x78, - 0x3e, 0xde, 0x4d, 0xf1, 0x3f, 0x3a, 0x29, 0x1e, 0x2d, 0x06, 0xa1, 0x31, 0xc1, 0xbf, 0x95, 0xda, - 0x26, 0x34, 0x36, 0xb9, 0x54, 0xfb, 0x98, 0xf8, 0xa7, 0x31, 0xe8, 0x5b, 0x53, 0x1d, 0xb5, 0xe6, - 0x22, 0xad, 0x69, 0x61, 0x23, 0xce, 0x57, 0x9a, 0xbe, 0x86, 0xcd, 0x37, 0xc5, 0x3a, 0xac, 0x6b, - 0x3e, 0xdb, 0x62, 0x5d, 0xf3, 0x01, 0x18, 0xaa, 0xa9, 0xd7, 0x43, 0x77, 0x11, 0xe8, 0x64, 0x0e, - 0x16, 0x0f, 0x04, 0x5c, 0xa2, 0xcf, 0xd9, 0x76, 0xcd, 0xe5, 0xf0, 0x5d, 0xb1, 0x0c, 0xc1, 0x08, - 0xb2, 0x04, 0x21, 0x1f, 0x0f, 0xf6, 0x45, 0x42, 0x0f, 0x65, 0x05, 0x6a, 0xea, 0xf5, 0x12, 0x6b, - 0xa0, 0x25, 0x40, 0xdb, 0xfe, 0xd6, 0x5c, 0x39, 0x50, 0x25, 0xa1, 0x3f, 0x7c, 0xeb, 0xe6, 0xe4, - 0x01, 0x46, 0xdf, 0x8c, 0x23, 0x2b, 0x23, 0x01, 0x50, 0x70, 0x3b, 0x0e, 0x40, 0xc6, 0x55, 0x66, - 0x3b, 0xb5, 0x6c, 0x75, 0xbd, 0xff, 0xd6, 0xcd, 0xc9, 0x11, 0xc6, 0x25, 0x78, 0x26, 0x2b, 0x69, - 0xd2, 0x98, 0x27, 0xbf, 0x43, 0x8a, 0xff, 0xb2, 0x04, 0x28, 0xc8, 0x41, 0x0a, 0x76, 0x6d, 0xcb, - 0x74, 0xe9, 0xba, 0x2f, 0xb4, 0x48, 0x93, 0x76, 0x5f, 0xf7, 0x05, 0xf4, 0x62, 0xdd, 0x17, 0x72, - 0xdd, 0x33, 0x41, 0xbc, 0x8e, 0xf1, 0x79, 0x6c, 0xb1, 0xad, 0x3d, 0x3d, 0x67, 0xe9, 0x82, 0xba, - 0x45, 0x80, 0xfe, 0x17, 0x12, 0x1c, 0x68, 0xb2, 0x26, 0x5f, 0xd8, 0xff, 0x0f, 0x90, 0x13, 0x7a, - 0xc8, 0x3f, 0x7a, 0xc7, 0x84, 0xee, 0xd9, 0x38, 0x47, 0x9c, 0xa6, 0x44, 0x70, 0xfb, 0x52, 0x0e, - 0xdb, 0x17, 0xff, 0xa7, 0x12, 0x8c, 0x85, 0xbb, 0xf7, 0x07, 0xb2, 0x02, 0x03, 0xe1, 0xde, 0xf9, - 0x10, 0xee, 0xed, 0x66, 0x08, 0x5c, 0xfa, 0x08, 0x3d, 0x7a, 0x22, 0x70, 0x55, 0xb6, 0x79, 0xfb, - 0x68, 0xd7, 0xda, 0x10, 0x32, 0x35, 0xba, 0x2c, 0x1b, 0xc1, 0x9f, 0x49, 0x90, 0x58, 0xb3, 0x2c, - 0x03, 0x59, 0x30, 0x62, 0x5a, 0x5e, 0x99, 0x58, 0x16, 0xae, 0x94, 0xf9, 0x1e, 0x0f, 0xdb, 0xd5, - 0x9d, 0xeb, 0x4d, 0x49, 0xdf, 0xbf, 0x39, 0xd9, 0xcc, 0x4a, 0x19, 0x36, 0x2d, 0xaf, 0x48, 0x21, - 0x1b, 0x6c, 0x07, 0xe8, 0xc3, 0x30, 0x18, 0xed, 0x8c, 0xed, 0x78, 0x3d, 0xd9, 0x73, 0x67, 0x51, - 0x36, 0xb7, 0x6e, 0x4e, 0x8e, 0x05, 0x1e, 0xe3, 0x83, 0x65, 0x65, 0x60, 0x33, 0xd4, 0x3b, 0xbb, - 0x46, 0xfb, 0x27, 0x2f, 0x4f, 0x4a, 0xc5, 0x73, 0x6d, 0x4f, 0x1f, 0x1e, 0xda, 0x55, 0x84, 0xeb, - 0xfe, 0x31, 0x43, 0xf4, 0x1c, 0xe2, 0xc5, 0x54, 0xdb, 0x73, 0x88, 0x2a, 0x36, 0xb1, 0xab, 0xbb, - 0x7b, 0x3a, 0x87, 0xe8, 0xea, 0x6c, 0x43, 0xfe, 0x76, 0x12, 0x06, 0x16, 0x58, 0x2f, 0xeb, 0x9e, - 0xea, 0x61, 0xf4, 0x5e, 0xe8, 0xb3, 0x69, 0x34, 0xf6, 0x8f, 0xdb, 0xdb, 0xd8, 0x0d, 0x8b, 0xd9, - 0xfe, 0xd5, 0x53, 0x16, 0xc1, 0x5d, 0x7e, 0xb3, 0x8c, 0x5d, 0x89, 0x0d, 0x2e, 0x79, 0x0e, 0xf4, - 0xb4, 0x4b, 0xc7, 0x6a, 0x11, 0xbe, 0x21, 0xd6, 0xc8, 0x4f, 0x66, 0x97, 0xd4, 0x36, 0x08, 0x84, - 0x5d, 0x66, 0xfd, 0x98, 0x04, 0xfb, 0x29, 0x56, 0x90, 0xfc, 0x28, 0xa6, 0x28, 0xe0, 0x8f, 0xb6, - 0x1b, 0xc2, 0x92, 0xea, 0x06, 0x17, 0xcf, 0xd8, 0xf5, 0xd3, 0x7b, 0x79, 0x3e, 0x39, 0x14, 0xea, - 0xbc, 0x91, 0xad, 0xac, 0x8c, 0x1a, 0x4d, 0x94, 0x2e, 0x5a, 0x88, 0xdc, 0x3f, 0x4e, 0xf4, 0x76, - 0x64, 0x12, 0xbe, 0x8b, 0x7c, 0x01, 0x32, 0x81, 0x4b, 0xba, 0xfc, 0x7f, 0x5d, 0x74, 0x1f, 0x82, - 0xc3, 0xc4, 0xe8, 0x13, 0x12, 0xec, 0x0f, 0x92, 0x62, 0x98, 0x2d, 0xfb, 0x9f, 0x20, 0x0f, 0xf6, - 0xb0, 0xb8, 0x69, 0x54, 0x4e, 0x4b, 0xbe, 0xb2, 0x32, 0x56, 0x6f, 0x26, 0x25, 0xcb, 0xaa, 0xc1, - 0x70, 0x80, 0x72, 0x73, 0xe2, 0xb3, 0x77, 0xdd, 0x47, 0xb8, 0x28, 0x03, 0xf6, 0x7f, 0x0a, 0x6c, - 0xcb, 0xf1, 0x70, 0x85, 0x6e, 0xa3, 0xa6, 0x14, 0xbf, 0x2d, 0x5f, 0x03, 0xd4, 0x3c, 0xb9, 0xe8, - 0x62, 0xc3, 0x7d, 0xeb, 0xbd, 0x6c, 0xf5, 0xf9, 0x57, 0xb4, 0xc7, 0x20, 0x19, 0xbe, 0xc4, 0xcc, - 0x1a, 0xb7, 0x3d, 0x38, 0x7c, 0x33, 0x06, 0x47, 0xc3, 0x27, 0x7e, 0xcf, 0xd5, 0xb1, 0xb3, 0xe3, - 0xfb, 0xb2, 0xad, 0x56, 0x75, 0x33, 0x7c, 0x8c, 0x7e, 0x20, 0x9c, 0x60, 0x29, 0xae, 0x50, 0xa8, - 0x6c, 0x42, 0x66, 0x4d, 0xad, 0x62, 0x05, 0x3f, 0x57, 0xc7, 0xae, 0xd7, 0xe2, 0xe5, 0x98, 0x71, - 0xe8, 0xb3, 0xb6, 0xb6, 0xc4, 0x1d, 0x99, 0x84, 0xc2, 0x5b, 0x64, 0xa0, 0x86, 0x5e, 0xd3, 0xd9, - 0x1d, 0xd6, 0x84, 0xc2, 0x1a, 0x68, 0x12, 0x32, 0x9a, 0x55, 0x37, 0xb9, 0x6b, 0xe6, 0x12, 0xe2, - 0xab, 0x13, 0x75, 0x93, 0xb9, 0xa6, 0xfc, 0x38, 0x0c, 0xb0, 0xfe, 0x78, 0x86, 0x3b, 0x00, 0x29, - 0x7a, 0x09, 0x34, 0xe8, 0xb5, 0x9f, 0xb4, 0x2f, 0xb2, 0x17, 0x69, 0x18, 0x17, 0xd6, 0x31, 0x6b, - 0x14, 0x8b, 0x6d, 0x55, 0x79, 0xa4, 0xf3, 0x94, 0x31, 0x45, 0xf9, 0x6a, 0xfc, 0xcd, 0x24, 0xec, - 0xe7, 0x07, 0xab, 0xaa, 0xad, 0xcf, 0x6c, 0x7b, 0x9e, 0x78, 0x43, 0x0d, 0x78, 0x69, 0xa9, 0xda, - 0xba, 0xbc, 0x03, 0x89, 0xf3, 0x9e, 0x67, 0xa3, 0xa3, 0x90, 0x74, 0xea, 0x06, 0x16, 0xdb, 0x55, - 0x63, 0xd3, 0x01, 0xce, 0x34, 0x41, 0x50, 0xea, 0x06, 0x56, 0x18, 0x0a, 0x2a, 0xc1, 0xe4, 0x56, - 0xdd, 0x30, 0x76, 0xca, 0x15, 0x4c, 0xff, 0x61, 0x90, 0xff, 0xc9, 0x7d, 0x7c, 0xdd, 0x56, 0xc5, - 0x87, 0xfb, 0x88, 0x6e, 0x0e, 0x51, 0xb4, 0x79, 0x8a, 0x25, 0x3e, 0xb7, 0x5f, 0x12, 0x38, 0xf2, - 0xef, 0xc7, 0x20, 0x25, 0x58, 0xd3, 0x37, 0x5b, 0xb0, 0x81, 0x35, 0xcf, 0x12, 0x47, 0x64, 0x7e, - 0x1b, 0x21, 0x88, 0x57, 0xf9, 0x14, 0xa5, 0xcf, 0xef, 0x53, 0x48, 0x83, 0xc0, 0xfc, 0xf7, 0x8d, - 0x08, 0xcc, 0xae, 0x93, 0x59, 0x4b, 0xd8, 0x96, 0x58, 0x9b, 0x9d, 0xdf, 0xa7, 0xd0, 0x16, 0xca, - 0x41, 0x1f, 0x71, 0x21, 0x8f, 0x7d, 0x0d, 0x91, 0xc0, 0x79, 0x1b, 0x8d, 0x43, 0xd2, 0x56, 0x3d, - 0x8d, 0x5d, 0x04, 0x26, 0x0f, 0x58, 0x13, 0x9d, 0x82, 0x3e, 0xf6, 0x16, 0x6a, 0xe3, 0x7f, 0xe3, - 0x20, 0xca, 0x60, 0x9f, 0xfb, 0x22, 0x72, 0xaf, 0xa9, 0x9e, 0x87, 0x1d, 0x93, 0x30, 0x64, 0xe8, - 0xf4, 0x25, 0x36, 0xab, 0xb2, 0xc3, 0xff, 0x43, 0x08, 0xfd, 0xcd, 0xff, 0x25, 0x01, 0xb5, 0x87, - 0x32, 0x7d, 0xc8, 0xfe, 0x31, 0xd2, 0x80, 0x00, 0x16, 0x09, 0x52, 0x09, 0x46, 0xd5, 0x4a, 0x45, - 0x67, 0xff, 0xac, 0xa3, 0xbc, 0xa9, 0xd3, 0x50, 0xe2, 0xd2, 0x7f, 0x7b, 0xd5, 0x6e, 0x2e, 0x50, - 0x40, 0x50, 0xe4, 0xf8, 0xc5, 0x34, 0xf4, 0xdb, 0x4c, 0x28, 0xf9, 0x2c, 0x8c, 0x34, 0x49, 0x4a, - 0xe4, 0xbb, 0xa2, 0x9b, 0x15, 0xf1, 0x12, 0x16, 0xf9, 0x4d, 0x60, 0xf4, 0x93, 0x7d, 0xec, 0xf0, - 0x91, 0xfe, 0x2e, 0xfe, 0x64, 0xfb, 0xcb, 0x24, 0x43, 0xa1, 0xcb, 0x24, 0xaa, 0xad, 0x17, 0xd3, - 0x94, 0x3f, 0xbf, 0x43, 0x32, 0xcb, 0x1f, 0xb0, 0xfb, 0x23, 0xd3, 0x96, 0x53, 0x25, 0xe9, 0x5c, - 0xa4, 0x69, 0xf2, 0x48, 0xb5, 0x75, 0x97, 0x9a, 0x63, 0xf0, 0x09, 0x41, 0xf7, 0x6c, 0xe8, 0x37, - 0xbd, 0x5a, 0x92, 0x58, 0x98, 0x5d, 0x5b, 0xf4, 0xed, 0xf8, 0x1b, 0x31, 0x38, 0x14, 0xb2, 0xe3, - 0x10, 0x72, 0xb3, 0x39, 0xe7, 0x5b, 0x5b, 0x7c, 0x17, 0x1f, 0xe0, 0xbb, 0x08, 0x09, 0x82, 0x8f, - 0x3a, 0xfc, 0xc3, 0x80, 0xdc, 0x2f, 0xfd, 0xf3, 0x7f, 0x2c, 0x53, 0xa3, 0x68, 0x3d, 0x2b, 0x94, - 0x49, 0xf1, 0x13, 0xdd, 0xeb, 0x2f, 0x1b, 0x7c, 0x3d, 0xd1, 0xbd, 0x7d, 0x6a, 0x6c, 0xd4, 0xe1, - 0x17, 0xce, 0x82, 0xdc, 0xa6, 0x36, 0x62, 0x11, 0x73, 0xf7, 0x6a, 0xab, 0x87, 0x70, 0xdc, 0xee, - 0x86, 0xc8, 0x6e, 0x33, 0xd8, 0x65, 0xdd, 0x76, 0x1d, 0xc6, 0x9f, 0x20, 0x7d, 0x07, 0xcb, 0x52, - 0x11, 0xd8, 0xc7, 0xfd, 0xb3, 0x5b, 0x89, 0xff, 0xd7, 0x31, 0x71, 0x10, 0x0b, 0x81, 0x7c, 0x7c, - 0x41, 0x76, 0xdf, 0x74, 0xdb, 0x7c, 0x31, 0x1d, 0x4a, 0x16, 0x4a, 0x88, 0x52, 0xfe, 0x05, 0x09, - 0xee, 0x6a, 0xea, 0x9a, 0xc7, 0xf8, 0x85, 0x16, 0xaf, 0x60, 0xed, 0xa9, 0x04, 0x5a, 0x68, 0x21, - 0xec, 0xfd, 0x1d, 0x85, 0x65, 0x52, 0x44, 0xa4, 0x7d, 0x0e, 0xf6, 0x47, 0x85, 0x15, 0x6a, 0x7a, - 0x0a, 0x86, 0xa2, 0xfb, 0xc7, 0x7b, 0x2f, 0x09, 0x06, 0x23, 0x7b, 0xc8, 0x72, 0xb9, 0x71, 0x6a, - 0x7c, 0xf5, 0x94, 0x20, 0xed, 0xa3, 0xf2, 0xf2, 0xba, 0x6b, 0xed, 0x04, 0x94, 0xf2, 0x37, 0x25, - 0x98, 0x8a, 0xf6, 0x10, 0x2a, 0xb4, 0xee, 0xf8, 0xf8, 0x6e, 0x9b, 0x21, 0xbd, 0x2e, 0xc1, 0xdd, - 0xbb, 0x0c, 0x83, 0xeb, 0xec, 0x06, 0x8c, 0x85, 0xd6, 0xf7, 0x22, 0x51, 0x08, 0xe3, 0x3a, 0xda, - 0xb9, 0x2a, 0xf6, 0x97, 0xb3, 0x07, 0x89, 0x1e, 0xbf, 0xfa, 0x9d, 0xc9, 0xd1, 0xe6, 0x67, 0xae, - 0x32, 0xda, 0xbc, 0x26, 0xbf, 0x8d, 0x56, 0xf8, 0xbb, 0x12, 0x3c, 0x10, 0x1d, 0x6a, 0x8b, 0xf2, - 0xfa, 0x1d, 0x34, 0x75, 0xff, 0x5e, 0x82, 0xa3, 0xdd, 0x8c, 0x87, 0xcf, 0xe1, 0x26, 0x8c, 0x06, - 0x6b, 0x85, 0xc6, 0x29, 0xec, 0x69, 0x05, 0xc2, 0x7c, 0x01, 0xf9, 0xdc, 0xee, 0xc0, 0x5c, 0xfd, - 0x4b, 0x89, 0xfb, 0x6f, 0xd8, 0x4c, 0xfc, 0x89, 0x89, 0x6e, 0x34, 0xf7, 0x38, 0x31, 0xa1, 0xcd, - 0xe6, 0xc1, 0xc8, 0x66, 0x73, 0x8b, 0x29, 0x8f, 0xdd, 0xa6, 0x68, 0x74, 0x95, 0x47, 0xeb, 0x16, - 0x3b, 0x7d, 0x1f, 0x84, 0xd1, 0x16, 0xae, 0xc5, 0x03, 0x53, 0x0f, 0x9e, 0xa5, 0xa0, 0x66, 0xe7, - 0x91, 0xff, 0x8d, 0x04, 0x93, 0xb4, 0xe3, 0x16, 0xd3, 0xf8, 0x4e, 0xd6, 0x67, 0x8d, 0xc7, 0xde, - 0x96, 0xc3, 0xe2, 0x8a, 0x5d, 0x84, 0x3e, 0x66, 0xa1, 0x5c, 0x97, 0x7b, 0x30, 0x71, 0xce, 0x20, - 0x88, 0xf5, 0xf3, 0x62, 0x7c, 0xad, 0x03, 0xc6, 0x1d, 0xd2, 0xe3, 0xed, 0x0a, 0x18, 0xaf, 0x8a, - 0x58, 0xdf, 0x7a, 0x18, 0x5c, 0x6f, 0xda, 0x6d, 0x8b, 0xf5, 0x4c, 0x89, 0x6f, 0x53, 0x50, 0xf7, - 0xc7, 0xd4, 0x21, 0xa8, 0xff, 0x88, 0xcf, 0x91, 0x1f, 0xd4, 0x3b, 0x8c, 0xe7, 0x9d, 0x18, 0xd4, - 0xff, 0x2c, 0x06, 0x07, 0xe8, 0xd8, 0xc2, 0xdb, 0x4a, 0x6f, 0xc3, 0xdc, 0x94, 0x01, 0xb9, 0x8e, - 0x56, 0xbe, 0x5d, 0xb1, 0x28, 0xeb, 0x3a, 0xda, 0xe5, 0x48, 0x46, 0x2f, 0x03, 0xaa, 0x44, 0xb6, - 0x28, 0x69, 0x07, 0xf1, 0x3d, 0x77, 0x50, 0x09, 0x6d, 0x9a, 0xb5, 0xb0, 0xae, 0xc4, 0x9e, 0xad, - 0xeb, 0x15, 0x09, 0xf2, 0xad, 0x66, 0x80, 0x5b, 0x93, 0x0e, 0xe3, 0x91, 0x83, 0x9c, 0x46, 0x83, - 0x7a, 0xa8, 0x9b, 0x7d, 0xc2, 0x06, 0xf7, 0xdf, 0xef, 0xe0, 0x3b, 0x1a, 0x00, 0x7e, 0x43, 0xa4, - 0x38, 0xdf, 0x61, 0x9a, 0x57, 0x63, 0x3f, 0xfa, 0x6e, 0xff, 0xab, 0x4d, 0x19, 0xe6, 0x1d, 0xb1, - 0xb0, 0xfb, 0xb6, 0x04, 0x13, 0x6d, 0xc4, 0x7e, 0x27, 0x97, 0x17, 0xdb, 0x6d, 0x4d, 0xea, 0x76, - 0xaf, 0x22, 0x8f, 0x73, 0x7f, 0x8c, 0xbe, 0x2c, 0x12, 0xda, 0x45, 0x68, 0xf5, 0x7a, 0xb4, 0xfc, - 0x34, 0x1c, 0x6c, 0x49, 0xc5, 0x65, 0x2b, 0x40, 0x62, 0x5b, 0x77, 0x3d, 0x2e, 0xd6, 0x7d, 0xed, - 0xc4, 0x6a, 0xa0, 0xa6, 0x34, 0x32, 0x82, 0x2c, 0x65, 0xbd, 0x66, 0x59, 0x06, 0x17, 0x43, 0xbe, - 0x08, 0x23, 0x21, 0x18, 0xef, 0xe4, 0x24, 0x24, 0x6c, 0x8b, 0x7f, 0x10, 0x28, 0x73, 0xec, 0x50, - 0xdb, 0x03, 0x2a, 0xcb, 0x32, 0xf8, 0xb0, 0x29, 0xbe, 0x3c, 0x06, 0x88, 0x31, 0xa3, 0x67, 0x55, - 0xa2, 0x8b, 0x75, 0x18, 0x8d, 0x40, 0x79, 0x27, 0x6f, 0xe9, 0x1c, 0xec, 0xd8, 0xf7, 0xf7, 0x43, - 0x92, 0x72, 0x45, 0x9f, 0x93, 0x00, 0x42, 0x77, 0x07, 0xa6, 0xdb, 0xb1, 0x69, 0xbd, 0x9b, 0x93, - 0x9f, 0xe9, 0x1a, 0x9f, 0xd7, 0xdd, 0x47, 0x7f, 0xf2, 0x5f, 0x7f, 0xef, 0x67, 0x62, 0xf7, 0x22, - 0x79, 0xa6, 0xcd, 0x3e, 0x52, 0xc8, 0x19, 0xbf, 0x12, 0xf9, 0x1a, 0xcd, 0xc3, 0xdd, 0x75, 0x25, - 0x24, 0x9b, 0xee, 0x16, 0x9d, 0x0b, 0x76, 0x96, 0x0a, 0x76, 0x02, 0x3d, 0xd6, 0x59, 0xb0, 0x99, - 0x0f, 0x45, 0xbd, 0xeb, 0x23, 0xe8, 0xdb, 0x12, 0x8c, 0xb5, 0xda, 0x26, 0x40, 0xa7, 0xbb, 0x93, - 0xa2, 0xb9, 0x20, 0xcb, 0x9f, 0xd9, 0x03, 0x25, 0x1f, 0xca, 0x02, 0x1d, 0xca, 0x2c, 0x7a, 0x7c, - 0x0f, 0x43, 0x99, 0x09, 0x1f, 0x61, 0xfd, 0x1f, 0x09, 0x0e, 0xef, 0xba, 0x84, 0x46, 0xb3, 0xdd, - 0x49, 0xb9, 0x4b, 0xe5, 0x99, 0x2f, 0xbe, 0x15, 0x16, 0x7c, 0xc4, 0x4f, 0xd0, 0x11, 0x5f, 0x44, - 0x8b, 0x7b, 0x19, 0x71, 0xcb, 0x73, 0x42, 0xf4, 0xdb, 0x52, 0xe4, 0x42, 0xef, 0xee, 0xe6, 0xd4, - 0xb4, 0x76, 0xec, 0xe0, 0x18, 0xcd, 0x4b, 0x02, 0xf9, 0x29, 0x3a, 0x04, 0x05, 0xad, 0xbd, 0xc5, - 0x49, 0x9b, 0xf9, 0x50, 0x34, 0xa9, 0x7c, 0x04, 0xfd, 0x2f, 0xa9, 0xf5, 0x0d, 0xda, 0x53, 0xbb, - 0x8a, 0xd8, 0x7e, 0x5d, 0x9c, 0x3f, 0xdd, 0x3b, 0x21, 0x1f, 0x64, 0x8d, 0x0e, 0xb2, 0x8a, 0xf0, - 0xed, 0x1e, 0x64, 0xcb, 0x49, 0x44, 0xbf, 0x23, 0xc1, 0x58, 0xab, 0x15, 0x5d, 0x07, 0xb7, 0xdc, - 0x65, 0x2d, 0xdb, 0xc1, 0x2d, 0x77, 0x5b, 0x3e, 0xca, 0xef, 0xa5, 0x83, 0x3f, 0x89, 0x8e, 0xb7, - 0x1b, 0xfc, 0xae, 0xb3, 0x48, 0x7c, 0x71, 0xd7, 0x95, 0x4f, 0x07, 0x5f, 0xec, 0x66, 0x15, 0xd8, - 0xc1, 0x17, 0xbb, 0x5a, 0x78, 0x75, 0xf6, 0x45, 0x7f, 0x64, 0x5d, 0x4e, 0xa3, 0x8b, 0xbe, 0x21, - 0xc1, 0x60, 0xa4, 0x2e, 0x47, 0x8f, 0xee, 0x2a, 0x68, 0xab, 0x55, 0x54, 0xfe, 0x58, 0x2f, 0x24, - 0x7c, 0x2c, 0x8b, 0x74, 0x2c, 0x73, 0x68, 0x76, 0x2f, 0x63, 0x89, 0x5e, 0x07, 0x78, 0x45, 0x82, - 0xd1, 0x16, 0x25, 0x6c, 0x07, 0x2f, 0x6c, 0x5f, 0xba, 0xe7, 0x4f, 0xf7, 0x4e, 0xc8, 0x47, 0x75, - 0x8e, 0x8e, 0xea, 0x03, 0xe8, 0xfd, 0x7b, 0x19, 0x55, 0x28, 0x3f, 0xdf, 0x0c, 0x6e, 0xe8, 0x85, - 0xfa, 0x41, 0x27, 0x7b, 0x14, 0x4c, 0x0c, 0xe8, 0x54, 0xcf, 0x74, 0x7c, 0x3c, 0x4f, 0xd2, 0xf1, - 0x3c, 0x81, 0x56, 0xdf, 0xda, 0x78, 0x9a, 0xd3, 0xfa, 0xd7, 0x9a, 0x5f, 0x56, 0xde, 0xdd, 0x8a, - 0x5a, 0x16, 0xab, 0xf9, 0xc7, 0x7a, 0xa2, 0xe1, 0x83, 0x3a, 0x4d, 0x07, 0x75, 0x0c, 0x3d, 0xd2, - 0x6e, 0x50, 0xa1, 0x6b, 0x98, 0xba, 0xb9, 0x65, 0xcd, 0x7c, 0x88, 0x95, 0xc0, 0x1f, 0x41, 0x3f, - 0x21, 0xae, 0xc0, 0x1d, 0xd9, 0xb5, 0xdf, 0x50, 0x1d, 0x9b, 0x7f, 0xa0, 0x0b, 0x4c, 0x2e, 0xd7, - 0xbd, 0x54, 0xae, 0x09, 0x74, 0xa8, 0x9d, 0x5c, 0xa4, 0x96, 0x45, 0x9f, 0x94, 0xfc, 0x5b, 0xb3, - 0x47, 0x77, 0xe7, 0x1d, 0x2e, 0x76, 0xf3, 0x0f, 0x76, 0x85, 0xcb, 0x25, 0xb9, 0x8f, 0x4a, 0x32, - 0x85, 0x26, 0xda, 0x4a, 0xc2, 0x4a, 0xdf, 0xdb, 0x7d, 0xe7, 0xe5, 0xb3, 0xa3, 0x30, 0xd9, 0xa6, - 0x47, 0xef, 0xfa, 0x9e, 0xee, 0xc2, 0x75, 0x78, 0x69, 0xbe, 0xcb, 0x33, 0xd7, 0x37, 0x13, 0x80, - 0x96, 0xdd, 0xea, 0x9c, 0x83, 0xd9, 0x3f, 0x73, 0xe4, 0xee, 0xd8, 0xf0, 0x8e, 0xa8, 0xf4, 0x96, - 0xde, 0x11, 0x5d, 0x8e, 0xbc, 0x75, 0x19, 0xeb, 0xed, 0x5d, 0xef, 0xae, 0x5f, 0xbd, 0x8c, 0xbf, - 0x2d, 0xaf, 0x5e, 0xb6, 0xbe, 0xbb, 0x9f, 0xf8, 0x21, 0xbe, 0x42, 0x94, 0x7c, 0x7b, 0x5e, 0x21, - 0x1a, 0x87, 0x3e, 0xfe, 0x52, 0x76, 0x1f, 0x3b, 0x82, 0x67, 0x2d, 0x74, 0x02, 0x92, 0xc1, 0xff, - 0x0f, 0xed, 0xe2, 0x3a, 0x34, 0xc3, 0xe6, 0x17, 0x6f, 0xbf, 0x1e, 0x87, 0xec, 0xb2, 0x5b, 0x2d, - 0x55, 0x74, 0xef, 0x0e, 0xd9, 0x9e, 0xdd, 0xfe, 0xad, 0xab, 0xb9, 0x5b, 0x37, 0x27, 0x87, 0x98, - 0xca, 0x6e, 0xa7, 0xa2, 0x6a, 0x30, 0xdc, 0xf0, 0x7d, 0x03, 0x6e, 0x9a, 0xf3, 0x7b, 0xf9, 0xcc, - 0x42, 0x03, 0x2b, 0x99, 0xbe, 0x28, 0x13, 0x72, 0x10, 0x74, 0xbd, 0xb5, 0x37, 0xb0, 0x9b, 0xdd, - 0xe7, 0xef, 0xe4, 0x4b, 0xc8, 0x6c, 0x0a, 0xbf, 0x19, 0x83, 0xcc, 0xb2, 0x2b, 0x8a, 0x3a, 0xfc, - 0xe7, 0xf6, 0x15, 0xbb, 0x53, 0xfe, 0x87, 0x64, 0xe2, 0xdd, 0x39, 0x42, 0xf4, 0xe3, 0x32, 0xdf, - 0x89, 0xd3, 0x38, 0x5c, 0xc4, 0x55, 0xdd, 0xf4, 0xcb, 0x4a, 0xfc, 0xee, 0x9b, 0x42, 0x3f, 0x42, - 0x6f, 0x0a, 0x05, 0x33, 0x9c, 0xd8, 0xcb, 0x0c, 0xff, 0x56, 0x0c, 0x06, 0x97, 0xdd, 0xea, 0x25, - 0xb3, 0xf2, 0xae, 0xab, 0xbc, 0x15, 0x57, 0xb9, 0xdd, 0xa5, 0xd9, 0xff, 0x0b, 0x00, 0x00, 0xff, - 0xff, 0xb6, 0xbf, 0x71, 0x89, 0xa7, 0x95, 0x00, 0x00, + // 9250 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6b, 0x74, 0x1c, 0xe7, + 0x75, 0x18, 0x67, 0x1f, 0xc0, 0xee, 0x5d, 0x3c, 0x16, 0x1f, 0x40, 0x68, 0xb9, 0x24, 0x01, 0x6a, + 0x24, 0x4b, 0x14, 0x25, 0x01, 0x12, 0x45, 0x52, 0xe4, 0x32, 0xb6, 0x8c, 0x05, 0x96, 0x20, 0x48, + 0xbc, 0x34, 0x00, 0x29, 0xd9, 0x4e, 0x3a, 0x67, 0x30, 0xfb, 0x61, 0x31, 0xe2, 0xee, 0xcc, 0x68, + 0x66, 0x96, 0x04, 0x68, 0xfb, 0x1c, 0x25, 0x7e, 0x34, 0x56, 0x9b, 0xda, 0x79, 0x9c, 0xd4, 0x76, + 0x2c, 0xd7, 0x8f, 0xb6, 0x4e, 0x9d, 0xb6, 0x79, 0x38, 0x4d, 0x9b, 0xb6, 0xa7, 0x75, 0x5a, 0x27, + 0x71, 0xda, 0xa6, 0xc7, 0x3a, 0x75, 0xdb, 0x34, 0xa7, 0xa1, 0x53, 0xd9, 0xa7, 0x55, 0x5c, 0xb7, + 0x49, 0x59, 0x35, 0x7d, 0xe8, 0x47, 0x7a, 0xbe, 0xd7, 0x3c, 0xf6, 0x81, 0x59, 0x40, 0xa4, 0x6c, + 0x9d, 0xe8, 0x17, 0xf6, 0xbb, 0x73, 0xef, 0xfd, 0xee, 0xbd, 0xdf, 0xbd, 0xf7, 0xbb, 0xdf, 0x63, + 0x06, 0xf0, 0x73, 0xe7, 0xe1, 0x58, 0xcd, 0xb2, 0x6a, 0x75, 0x3c, 0x6d, 0x3b, 0x96, 0x67, 0x6d, + 0x34, 0x37, 0xa7, 0xab, 0xd8, 0xd5, 0x1d, 0xc3, 0xf6, 0x2c, 0x67, 0x8a, 0xc2, 0xd0, 0x30, 0xc3, + 0x98, 0x12, 0x18, 0xf2, 0x12, 0x8c, 0x5c, 0x30, 0xea, 0x78, 0xce, 0x47, 0x5c, 0xc3, 0x1e, 0x3a, + 0x0b, 0xa9, 0x4d, 0xa3, 0x8e, 0x0b, 0xd2, 0xb1, 0xe4, 0xf1, 0xdc, 0xc9, 0xfb, 0xa7, 0x5a, 0x88, + 0xa6, 0xa2, 0x14, 0xab, 0x04, 0xac, 0x50, 0x0a, 0xf9, 0x3b, 0x29, 0x18, 0xed, 0xf0, 0x14, 0x21, + 0x48, 0x99, 0x5a, 0x83, 0x70, 0x94, 0x8e, 0x67, 0x15, 0xfa, 0x1b, 0x15, 0xa0, 0xdf, 0xd6, 0xf4, + 0x6b, 0x5a, 0x0d, 0x17, 0x12, 0x14, 0x2c, 0x9a, 0x68, 0x02, 0xa0, 0x8a, 0x6d, 0x6c, 0x56, 0xb1, + 0xa9, 0xef, 0x14, 0x92, 0xc7, 0x92, 0xc7, 0xb3, 0x4a, 0x08, 0x82, 0x1e, 0x86, 0x11, 0xbb, 0xb9, + 0x51, 0x37, 0x74, 0x35, 0x84, 0x06, 0xc7, 0x92, 0xc7, 0xd3, 0x4a, 0x9e, 0x3d, 0x98, 0x0b, 0x90, + 0x1f, 0x84, 0xe1, 0x1b, 0x58, 0xbb, 0x16, 0x46, 0xcd, 0x51, 0xd4, 0x21, 0x02, 0x0e, 0x21, 0xce, + 0xc2, 0x40, 0x03, 0xbb, 0xae, 0x56, 0xc3, 0xaa, 0xb7, 0x63, 0xe3, 0x42, 0x8a, 0x6a, 0x7f, 0xac, + 0x4d, 0xfb, 0x56, 0xcd, 0x73, 0x9c, 0x6a, 0x7d, 0xc7, 0xc6, 0x68, 0x06, 0xb2, 0xd8, 0x6c, 0x36, + 0x18, 0x87, 0x74, 0x17, 0xfb, 0x55, 0xcc, 0x66, 0xa3, 0x95, 0x4b, 0x86, 0x90, 0x71, 0x16, 0xfd, + 0x2e, 0x76, 0xae, 0x1b, 0x3a, 0x2e, 0xf4, 0x51, 0x06, 0x0f, 0xb6, 0x31, 0x58, 0x63, 0xcf, 0x5b, + 0x79, 0x08, 0x3a, 0x34, 0x0b, 0x59, 0xbc, 0xed, 0x61, 0xd3, 0x35, 0x2c, 0xb3, 0xd0, 0x4f, 0x99, + 0xbc, 0xa3, 0xc3, 0x28, 0xe2, 0x7a, 0xb5, 0x95, 0x45, 0x40, 0x87, 0xce, 0x40, 0xbf, 0x65, 0x7b, + 0x86, 0x65, 0xba, 0x85, 0xcc, 0x31, 0xe9, 0x78, 0xee, 0xe4, 0x91, 0x8e, 0x8e, 0xb0, 0xc2, 0x70, + 0x14, 0x81, 0x8c, 0x16, 0x20, 0xef, 0x5a, 0x4d, 0x47, 0xc7, 0xaa, 0x6e, 0x55, 0xb1, 0x6a, 0x98, + 0x9b, 0x56, 0x21, 0x4b, 0x19, 0x4c, 0xb6, 0x2b, 0x42, 0x11, 0x67, 0xad, 0x2a, 0x5e, 0x30, 0x37, + 0x2d, 0x65, 0xc8, 0x8d, 0xb4, 0xd1, 0x38, 0xf4, 0xb9, 0x3b, 0xa6, 0xa7, 0x6d, 0x17, 0x06, 0xa8, + 0x87, 0xf0, 0x96, 0xfc, 0xeb, 0x7d, 0x30, 0xdc, 0x8b, 0x8b, 0x9d, 0x87, 0xf4, 0x26, 0xd1, 0xb2, + 0x90, 0xd8, 0x8b, 0x0d, 0x18, 0x4d, 0xd4, 0x88, 0x7d, 0xfb, 0x34, 0xe2, 0x0c, 0xe4, 0x4c, 0xec, + 0x7a, 0xb8, 0xca, 0x3c, 0x22, 0xd9, 0xa3, 0x4f, 0x01, 0x23, 0x6a, 0x77, 0xa9, 0xd4, 0xbe, 0x5c, + 0xea, 0x59, 0x18, 0xf6, 0x45, 0x52, 0x1d, 0xcd, 0xac, 0x09, 0xdf, 0x9c, 0x8e, 0x93, 0x64, 0xaa, + 0x22, 0xe8, 0x14, 0x42, 0xa6, 0x0c, 0xe1, 0x48, 0x1b, 0xcd, 0x01, 0x58, 0x26, 0xb6, 0x36, 0xd5, + 0x2a, 0xd6, 0xeb, 0x85, 0x4c, 0x17, 0x2b, 0xad, 0x10, 0x94, 0x36, 0x2b, 0x59, 0x0c, 0xaa, 0xd7, + 0xd1, 0xb9, 0xc0, 0xd5, 0xfa, 0xbb, 0x78, 0xca, 0x12, 0x0b, 0xb2, 0x36, 0x6f, 0xbb, 0x02, 0x43, + 0x0e, 0x26, 0x7e, 0x8f, 0xab, 0x5c, 0xb3, 0x2c, 0x15, 0x62, 0x2a, 0x56, 0x33, 0x85, 0x93, 0x31, + 0xc5, 0x06, 0x9d, 0x70, 0x13, 0xdd, 0x07, 0x3e, 0x40, 0xa5, 0x6e, 0x05, 0x34, 0x0b, 0x0d, 0x08, + 0xe0, 0xb2, 0xd6, 0xc0, 0xc5, 0x9b, 0x30, 0x14, 0x35, 0x0f, 0x1a, 0x83, 0xb4, 0xeb, 0x69, 0x8e, + 0x47, 0xbd, 0x30, 0xad, 0xb0, 0x06, 0xca, 0x43, 0x12, 0x9b, 0x55, 0x9a, 0xe5, 0xd2, 0x0a, 0xf9, + 0x89, 0xde, 0x1d, 0x28, 0x9c, 0xa4, 0x0a, 0x3f, 0xd0, 0x3e, 0xa2, 0x11, 0xce, 0xad, 0x7a, 0x17, + 0x9f, 0x84, 0xc1, 0x88, 0x02, 0xbd, 0x76, 0x2d, 0x7f, 0x00, 0x0e, 0x76, 0x64, 0x8d, 0x9e, 0x85, + 0xb1, 0xa6, 0x69, 0x98, 0x1e, 0x76, 0x6c, 0x07, 0x13, 0x8f, 0x65, 0x5d, 0x15, 0xfe, 0x4b, 0x7f, + 0x17, 0x9f, 0xbb, 0x12, 0xc6, 0x66, 0x5c, 0x94, 0xd1, 0x66, 0x3b, 0xf0, 0x44, 0x36, 0xf3, 0x6a, + 0x7f, 0xfe, 0x85, 0x17, 0x5e, 0x78, 0x21, 0x21, 0x7f, 0xb2, 0x0f, 0xc6, 0x3a, 0xc5, 0x4c, 0xc7, + 0xf0, 0x1d, 0x87, 0x3e, 0xb3, 0xd9, 0xd8, 0xc0, 0x0e, 0x35, 0x52, 0x5a, 0xe1, 0x2d, 0x34, 0x03, + 0xe9, 0xba, 0xb6, 0x81, 0xeb, 0x85, 0xd4, 0x31, 0xe9, 0xf8, 0xd0, 0xc9, 0x87, 0x7b, 0x8a, 0xca, + 0xa9, 0x45, 0x42, 0xa2, 0x30, 0x4a, 0xf4, 0x2e, 0x48, 0xf1, 0x14, 0x4d, 0x38, 0x9c, 0xe8, 0x8d, + 0x03, 0x89, 0x25, 0x85, 0xd2, 0xa1, 0xc3, 0x90, 0x25, 0x7f, 0x99, 0x6f, 0xf4, 0x51, 0x99, 0x33, + 0x04, 0x40, 0xfc, 0x02, 0x15, 0x21, 0x43, 0xc3, 0xa4, 0x8a, 0xc5, 0xd4, 0xe6, 0xb7, 0x89, 0x63, + 0x55, 0xf1, 0xa6, 0xd6, 0xac, 0x7b, 0xea, 0x75, 0xad, 0xde, 0xc4, 0xd4, 0xe1, 0xb3, 0xca, 0x00, + 0x07, 0x5e, 0x25, 0x30, 0x34, 0x09, 0x39, 0x16, 0x55, 0x86, 0x59, 0xc5, 0xdb, 0x34, 0x7b, 0xa6, + 0x15, 0x16, 0x68, 0x0b, 0x04, 0x42, 0xba, 0x7f, 0xce, 0xb5, 0x4c, 0xe1, 0x9a, 0xb4, 0x0b, 0x02, + 0xa0, 0xdd, 0x3f, 0xd9, 0x9a, 0xb8, 0x8f, 0x76, 0x56, 0xaf, 0xd5, 0xa7, 0xe4, 0x5f, 0x4b, 0x40, + 0x8a, 0xe6, 0x8b, 0x61, 0xc8, 0xad, 0xbf, 0x67, 0xb5, 0xa2, 0xce, 0xad, 0x5c, 0x29, 0x2f, 0x56, + 0xf2, 0x12, 0x1a, 0x02, 0xa0, 0x80, 0x0b, 0x8b, 0x2b, 0x33, 0xeb, 0xf9, 0x84, 0xdf, 0x5e, 0x58, + 0x5e, 0x3f, 0x73, 0x2a, 0x9f, 0xf4, 0x09, 0xae, 0x30, 0x40, 0x2a, 0x8c, 0xf0, 0xc4, 0xc9, 0x7c, + 0x1a, 0xe5, 0x61, 0x80, 0x31, 0x58, 0x78, 0xb6, 0x32, 0x77, 0xe6, 0x54, 0xbe, 0x2f, 0x0a, 0x79, + 0xe2, 0x64, 0xbe, 0x1f, 0x0d, 0x42, 0x96, 0x42, 0xca, 0x2b, 0x2b, 0x8b, 0xf9, 0x8c, 0xcf, 0x73, + 0x6d, 0x5d, 0x59, 0x58, 0x9e, 0xcf, 0x67, 0x7d, 0x9e, 0xf3, 0xca, 0xca, 0x95, 0xd5, 0x3c, 0xf8, + 0x1c, 0x96, 0x2a, 0x6b, 0x6b, 0x33, 0xf3, 0x95, 0x7c, 0xce, 0xc7, 0x28, 0xbf, 0x67, 0xbd, 0xb2, + 0x96, 0x1f, 0x88, 0x88, 0xf5, 0xc4, 0xc9, 0xfc, 0xa0, 0xdf, 0x45, 0x65, 0xf9, 0xca, 0x52, 0x7e, + 0x08, 0x8d, 0xc0, 0x20, 0xeb, 0x42, 0x08, 0x31, 0xdc, 0x02, 0x3a, 0x73, 0x2a, 0x9f, 0x0f, 0x04, + 0x61, 0x5c, 0x46, 0x22, 0x80, 0x33, 0xa7, 0xf2, 0x48, 0x9e, 0x85, 0x34, 0xf5, 0x2e, 0x84, 0x60, + 0x68, 0x71, 0xa6, 0x5c, 0x59, 0x54, 0x57, 0x56, 0xd7, 0x17, 0x56, 0x96, 0x67, 0x16, 0xf3, 0x52, + 0x00, 0x53, 0x2a, 0x4f, 0x5f, 0x59, 0x50, 0x2a, 0x73, 0xf9, 0x44, 0x18, 0xb6, 0x5a, 0x99, 0x59, + 0xaf, 0xcc, 0xe5, 0x93, 0xb2, 0x0e, 0x63, 0x9d, 0xf2, 0x64, 0xc7, 0xc8, 0x08, 0x0d, 0x71, 0xa2, + 0xcb, 0x10, 0x53, 0x5e, 0x6d, 0x43, 0xfc, 0xed, 0x04, 0x8c, 0x76, 0x98, 0x2b, 0x3a, 0x76, 0xf2, + 0x14, 0xa4, 0x99, 0x8b, 0xb2, 0xd9, 0xf3, 0xa1, 0x8e, 0x93, 0x0e, 0x75, 0xd8, 0xb6, 0x19, 0x94, + 0xd2, 0x85, 0x2b, 0x88, 0x64, 0x97, 0x0a, 0x82, 0xb0, 0x68, 0xcb, 0xe9, 0x3f, 0xd2, 0x96, 0xd3, + 0xd9, 0xb4, 0x77, 0xa6, 0x97, 0x69, 0x8f, 0xc2, 0xf6, 0x96, 0xdb, 0xd3, 0x1d, 0x72, 0xfb, 0x79, + 0x18, 0x69, 0x63, 0xd4, 0x73, 0x8e, 0xfd, 0x90, 0x04, 0x85, 0x6e, 0xc6, 0x89, 0xc9, 0x74, 0x89, + 0x48, 0xa6, 0x3b, 0xdf, 0x6a, 0xc1, 0x7b, 0xbb, 0x0f, 0x42, 0xdb, 0x58, 0x7f, 0x49, 0x82, 0xf1, + 0xce, 0x95, 0x62, 0x47, 0x19, 0xde, 0x05, 0x7d, 0x0d, 0xec, 0x6d, 0x59, 0xa2, 0x5a, 0x7a, 0xa0, + 0xc3, 0x1c, 0x4c, 0x1e, 0xb7, 0x0e, 0x36, 0xa7, 0x0a, 0x4f, 0xe2, 0xc9, 0x6e, 0xe5, 0x1e, 0x93, + 0xa6, 0x4d, 0xd2, 0x8f, 0x25, 0xe0, 0x60, 0x47, 0xe6, 0x1d, 0x05, 0x3d, 0x0a, 0x60, 0x98, 0x76, + 0xd3, 0x63, 0x15, 0x11, 0x4b, 0xb0, 0x59, 0x0a, 0xa1, 0xc9, 0x8b, 0x24, 0xcf, 0xa6, 0xe7, 0x3f, + 0x4f, 0xd2, 0xe7, 0xc0, 0x40, 0x14, 0xe1, 0x6c, 0x20, 0x68, 0x8a, 0x0a, 0x3a, 0xd1, 0x45, 0xd3, + 0x36, 0xc7, 0x7c, 0x0c, 0xf2, 0x7a, 0xdd, 0xc0, 0xa6, 0xa7, 0xba, 0x9e, 0x83, 0xb5, 0x86, 0x61, + 0xd6, 0xe8, 0x0c, 0x92, 0x29, 0xa5, 0x37, 0xb5, 0xba, 0x8b, 0x95, 0x61, 0xf6, 0x78, 0x4d, 0x3c, + 0x25, 0x14, 0xd4, 0x81, 0x9c, 0x10, 0x45, 0x5f, 0x84, 0x82, 0x3d, 0xf6, 0x29, 0xe4, 0x9f, 0xca, + 0x42, 0x2e, 0x54, 0x57, 0xa3, 0x7b, 0x61, 0xe0, 0x39, 0xed, 0xba, 0xa6, 0x8a, 0xb5, 0x12, 0xb3, + 0x44, 0x8e, 0xc0, 0x56, 0xf9, 0x7a, 0xe9, 0x31, 0x18, 0xa3, 0x28, 0x56, 0xd3, 0xc3, 0x8e, 0xaa, + 0xd7, 0x35, 0xd7, 0xa5, 0x46, 0xcb, 0x50, 0x54, 0x44, 0x9e, 0xad, 0x90, 0x47, 0xb3, 0xe2, 0x09, + 0x3a, 0x0d, 0xa3, 0x94, 0xa2, 0xd1, 0xac, 0x7b, 0x86, 0x5d, 0xc7, 0x2a, 0x59, 0xbd, 0xb9, 0x74, + 0x26, 0xf1, 0x25, 0x1b, 0x21, 0x18, 0x4b, 0x1c, 0x81, 0x48, 0xe4, 0xa2, 0x39, 0x38, 0x4a, 0xc9, + 0x6a, 0xd8, 0xc4, 0x8e, 0xe6, 0x61, 0x15, 0x3f, 0xdf, 0xd4, 0xea, 0xae, 0xaa, 0x99, 0x55, 0x75, + 0x4b, 0x73, 0xb7, 0x0a, 0x63, 0x84, 0x41, 0x39, 0x51, 0x90, 0x94, 0x43, 0x04, 0x71, 0x9e, 0xe3, + 0x55, 0x28, 0xda, 0x8c, 0x59, 0xbd, 0xa8, 0xb9, 0x5b, 0xa8, 0x04, 0xe3, 0x94, 0x8b, 0xeb, 0x39, + 0x86, 0x59, 0x53, 0xf5, 0x2d, 0xac, 0x5f, 0x53, 0x9b, 0xde, 0xe6, 0xd9, 0xc2, 0xe1, 0x70, 0xff, + 0x54, 0xc2, 0x35, 0x8a, 0x33, 0x4b, 0x50, 0xae, 0x78, 0x9b, 0x67, 0xd1, 0x1a, 0x0c, 0x90, 0xc1, + 0x68, 0x18, 0x37, 0xb1, 0xba, 0x69, 0x39, 0x74, 0x6a, 0x1c, 0xea, 0x90, 0x9a, 0x42, 0x16, 0x9c, + 0x5a, 0xe1, 0x04, 0x4b, 0x56, 0x15, 0x97, 0xd2, 0x6b, 0xab, 0x95, 0xca, 0x9c, 0x92, 0x13, 0x5c, + 0x2e, 0x58, 0x0e, 0x71, 0xa8, 0x9a, 0xe5, 0x1b, 0x38, 0xc7, 0x1c, 0xaa, 0x66, 0x09, 0xf3, 0x9e, + 0x86, 0x51, 0x5d, 0x67, 0x3a, 0x1b, 0xba, 0xca, 0xd7, 0x58, 0x6e, 0x21, 0x1f, 0x31, 0x96, 0xae, + 0xcf, 0x33, 0x04, 0xee, 0xe3, 0x2e, 0x3a, 0x07, 0x07, 0x03, 0x63, 0x85, 0x09, 0x47, 0xda, 0xb4, + 0x6c, 0x25, 0x3d, 0x0d, 0xa3, 0xf6, 0x4e, 0x3b, 0x21, 0x8a, 0xf4, 0x68, 0xef, 0xb4, 0x92, 0x3d, + 0x09, 0x63, 0xf6, 0x96, 0xdd, 0x4e, 0x77, 0x22, 0x4c, 0x87, 0xec, 0x2d, 0xbb, 0x95, 0xf0, 0x1d, + 0x74, 0xc1, 0xed, 0x60, 0x5d, 0xf3, 0x70, 0xb5, 0x70, 0x4f, 0x18, 0x3d, 0xf4, 0x00, 0x4d, 0x43, + 0x5e, 0xd7, 0x55, 0x6c, 0x6a, 0x1b, 0x75, 0xac, 0x6a, 0x0e, 0x36, 0x35, 0xb7, 0x30, 0x19, 0x46, + 0x1e, 0xd2, 0xf5, 0x0a, 0x7d, 0x3a, 0x43, 0x1f, 0xa2, 0x13, 0x30, 0x62, 0x6d, 0x3c, 0xa7, 0x33, + 0x97, 0x54, 0x6d, 0x07, 0x6f, 0x1a, 0xdb, 0x85, 0xfb, 0xa9, 0x7d, 0x87, 0xc9, 0x03, 0xea, 0x90, + 0xab, 0x14, 0x8c, 0x1e, 0x82, 0xbc, 0xee, 0x6e, 0x69, 0x8e, 0x4d, 0x73, 0xb2, 0x6b, 0x6b, 0x3a, + 0x2e, 0xbc, 0x83, 0xa1, 0x32, 0xf8, 0xb2, 0x00, 0x93, 0x90, 0x70, 0x6f, 0x18, 0x9b, 0x9e, 0xe0, + 0xf8, 0x20, 0x0b, 0x09, 0x0a, 0xe3, 0xdc, 0x8e, 0x43, 0x9e, 0x98, 0x22, 0xd2, 0xf1, 0x71, 0x8a, + 0x36, 0x64, 0x6f, 0xd9, 0xe1, 0x7e, 0xef, 0x83, 0x41, 0x82, 0x19, 0x74, 0xfa, 0x10, 0x2b, 0xc8, + 0xec, 0xad, 0x50, 0x8f, 0xa7, 0x60, 0x9c, 0x20, 0x35, 0xb0, 0xa7, 0x55, 0x35, 0x4f, 0x0b, 0x61, + 0x3f, 0x42, 0xb1, 0x89, 0xdd, 0x97, 0xf8, 0xc3, 0x88, 0x9c, 0x4e, 0x73, 0x63, 0xc7, 0xf7, 0xac, + 0x47, 0x99, 0x9c, 0x04, 0x26, 0x7c, 0xeb, 0xae, 0x15, 0xdd, 0x72, 0x09, 0x06, 0xc2, 0x8e, 0x8f, + 0xb2, 0xc0, 0x5c, 0x3f, 0x2f, 0x91, 0x2a, 0x68, 0x76, 0x65, 0x8e, 0xd4, 0x2f, 0xef, 0xad, 0xe4, + 0x13, 0xa4, 0x8e, 0x5a, 0x5c, 0x58, 0xaf, 0xa8, 0xca, 0x95, 0xe5, 0xf5, 0x85, 0xa5, 0x4a, 0x3e, + 0x19, 0x2a, 0xd8, 0x2f, 0xa5, 0x32, 0x0f, 0xe4, 0x1f, 0x94, 0x5f, 0x4e, 0xc0, 0x50, 0x74, 0x05, + 0x86, 0x7e, 0x08, 0xee, 0x11, 0xdb, 0x25, 0x2e, 0xf6, 0xd4, 0x1b, 0x86, 0x43, 0x23, 0xb2, 0xa1, + 0xb1, 0xd9, 0xd1, 0xf7, 0x89, 0x31, 0x8e, 0xb5, 0x86, 0xbd, 0x67, 0x0c, 0x87, 0xc4, 0x5b, 0x43, + 0xf3, 0xd0, 0x22, 0x4c, 0x9a, 0x96, 0xea, 0x7a, 0x9a, 0x59, 0xd5, 0x9c, 0xaa, 0x1a, 0x6c, 0x54, + 0xa9, 0x9a, 0xae, 0x63, 0xd7, 0xb5, 0xd8, 0x4c, 0xe8, 0x73, 0x39, 0x62, 0x5a, 0x6b, 0x1c, 0x39, + 0x98, 0x22, 0x66, 0x38, 0x6a, 0x8b, 0xff, 0x26, 0xbb, 0xf9, 0xef, 0x61, 0xc8, 0x36, 0x34, 0x5b, + 0xc5, 0xa6, 0xe7, 0xec, 0xd0, 0xba, 0x3b, 0xa3, 0x64, 0x1a, 0x9a, 0x5d, 0x21, 0xed, 0x37, 0x65, + 0xf9, 0x73, 0x29, 0x95, 0xc9, 0xe4, 0xb3, 0x97, 0x52, 0x99, 0x6c, 0x1e, 0xe4, 0x57, 0x92, 0x30, + 0x10, 0xae, 0xc3, 0xc9, 0xb2, 0x46, 0xa7, 0x53, 0x96, 0x44, 0x93, 0xda, 0x7d, 0xbb, 0x56, 0xed, + 0x53, 0xb3, 0x64, 0x2e, 0x2b, 0xf5, 0xb1, 0xea, 0x58, 0x61, 0x94, 0xa4, 0x8e, 0x20, 0xce, 0x86, + 0x59, 0x35, 0x92, 0x51, 0x78, 0x0b, 0xcd, 0x43, 0xdf, 0x73, 0x2e, 0xe5, 0xdd, 0x47, 0x79, 0xdf, + 0xbf, 0x3b, 0xef, 0x4b, 0x6b, 0x94, 0x79, 0xf6, 0xd2, 0x9a, 0xba, 0xbc, 0xa2, 0x2c, 0xcd, 0x2c, + 0x2a, 0x9c, 0x1c, 0x1d, 0x82, 0x54, 0x5d, 0xbb, 0xb9, 0x13, 0x9d, 0xf5, 0x28, 0xa8, 0xd7, 0x41, + 0x38, 0x04, 0xa9, 0x1b, 0x58, 0xbb, 0x16, 0x9d, 0x6b, 0x28, 0xe8, 0x2e, 0x06, 0xc3, 0x34, 0xa4, + 0xa9, 0xbd, 0x10, 0x00, 0xb7, 0x58, 0xfe, 0x00, 0xca, 0x40, 0x6a, 0x76, 0x45, 0x21, 0x01, 0x91, + 0x87, 0x01, 0x06, 0x55, 0x57, 0x17, 0x2a, 0xb3, 0x95, 0x7c, 0x42, 0x3e, 0x0d, 0x7d, 0xcc, 0x08, + 0x24, 0x58, 0x7c, 0x33, 0xe4, 0x0f, 0xf0, 0x26, 0xe7, 0x21, 0x89, 0xa7, 0x57, 0x96, 0xca, 0x15, + 0x25, 0x9f, 0x88, 0x0e, 0x75, 0x2a, 0x9f, 0x96, 0x5d, 0x18, 0x08, 0x17, 0xe2, 0x6f, 0xce, 0x22, + 0xfb, 0xab, 0x12, 0xe4, 0x42, 0x85, 0x35, 0xa9, 0x88, 0xb4, 0x7a, 0xdd, 0xba, 0xa1, 0x6a, 0x75, + 0x43, 0x73, 0xb9, 0x6b, 0x00, 0x05, 0xcd, 0x10, 0x48, 0xaf, 0x43, 0xf7, 0x26, 0x85, 0x48, 0x3a, + 0xdf, 0x27, 0x7f, 0x56, 0x82, 0x7c, 0x6b, 0x65, 0xdb, 0x22, 0xa6, 0xf4, 0xfd, 0x14, 0x53, 0xfe, + 0x8c, 0x04, 0x43, 0xd1, 0x72, 0xb6, 0x45, 0xbc, 0x7b, 0xbf, 0xaf, 0xe2, 0xfd, 0x61, 0x02, 0x06, + 0x23, 0x45, 0x6c, 0xaf, 0xd2, 0x3d, 0x0f, 0x23, 0x46, 0x15, 0x37, 0x6c, 0xcb, 0xc3, 0xa6, 0xbe, + 0xa3, 0xd6, 0xf1, 0x75, 0x5c, 0x2f, 0xc8, 0x34, 0x69, 0x4c, 0xef, 0x5e, 0x26, 0x4f, 0x2d, 0x04, + 0x74, 0x8b, 0x84, 0xac, 0x34, 0xba, 0x30, 0x57, 0x59, 0x5a, 0x5d, 0x59, 0xaf, 0x2c, 0xcf, 0xbe, + 0x47, 0xbd, 0xb2, 0x7c, 0x79, 0x79, 0xe5, 0x99, 0x65, 0x25, 0x6f, 0xb4, 0xa0, 0xdd, 0xc5, 0xb0, + 0x5f, 0x85, 0x7c, 0xab, 0x50, 0xe8, 0x1e, 0xe8, 0x24, 0x56, 0xfe, 0x00, 0x1a, 0x85, 0xe1, 0xe5, + 0x15, 0x75, 0x6d, 0x61, 0xae, 0xa2, 0x56, 0x2e, 0x5c, 0xa8, 0xcc, 0xae, 0xaf, 0xb1, 0x8d, 0x0f, + 0x1f, 0x7b, 0x3d, 0x12, 0xe0, 0xf2, 0xa7, 0x93, 0x30, 0xda, 0x41, 0x12, 0x34, 0xc3, 0x97, 0x2c, + 0x6c, 0x15, 0xf5, 0x68, 0x2f, 0xd2, 0x4f, 0x91, 0x9a, 0x61, 0x55, 0x73, 0x3c, 0xbe, 0xc2, 0x79, + 0x08, 0x88, 0x95, 0x4c, 0xcf, 0xd8, 0x34, 0xb0, 0xc3, 0xf7, 0x89, 0xd8, 0x3a, 0x66, 0x38, 0x80, + 0xb3, 0xad, 0xa2, 0x47, 0x00, 0xd9, 0x96, 0x6b, 0x78, 0xc6, 0x75, 0xac, 0x1a, 0xa6, 0xd8, 0x54, + 0x22, 0xeb, 0x9a, 0x94, 0x92, 0x17, 0x4f, 0x16, 0x4c, 0xcf, 0xc7, 0x36, 0x71, 0x4d, 0x6b, 0xc1, + 0x26, 0xc9, 0x3c, 0xa9, 0xe4, 0xc5, 0x13, 0x1f, 0xfb, 0x5e, 0x18, 0xa8, 0x5a, 0x4d, 0x52, 0xec, + 0x31, 0x3c, 0x32, 0x77, 0x48, 0x4a, 0x8e, 0xc1, 0x7c, 0x14, 0x5e, 0xc6, 0x07, 0xbb, 0x59, 0x03, + 0x4a, 0x8e, 0xc1, 0x18, 0xca, 0x83, 0x30, 0xac, 0xd5, 0x6a, 0x0e, 0x61, 0x2e, 0x18, 0xb1, 0x85, + 0xc9, 0x90, 0x0f, 0xa6, 0x88, 0xc5, 0x4b, 0x90, 0x11, 0x76, 0x20, 0x53, 0x35, 0xb1, 0x84, 0x6a, + 0xb3, 0xd5, 0x76, 0xe2, 0x78, 0x56, 0xc9, 0x98, 0xe2, 0xe1, 0xbd, 0x30, 0x60, 0xb8, 0x6a, 0xb0, + 0x39, 0x9f, 0x38, 0x96, 0x38, 0x9e, 0x51, 0x72, 0x86, 0xeb, 0x6f, 0x6c, 0xca, 0x5f, 0x4a, 0xc0, + 0x50, 0xf4, 0x70, 0x01, 0xcd, 0x41, 0xa6, 0x6e, 0xe9, 0x1a, 0x75, 0x2d, 0x76, 0xb2, 0x75, 0x3c, + 0xe6, 0x3c, 0x62, 0x6a, 0x91, 0xe3, 0x2b, 0x3e, 0x65, 0xf1, 0x5f, 0x4b, 0x90, 0x11, 0x60, 0x34, + 0x0e, 0x29, 0x5b, 0xf3, 0xb6, 0x28, 0xbb, 0x74, 0x39, 0x91, 0x97, 0x14, 0xda, 0x26, 0x70, 0xd7, + 0xd6, 0x4c, 0xea, 0x02, 0x1c, 0x4e, 0xda, 0x64, 0x5c, 0xeb, 0x58, 0xab, 0xd2, 0x55, 0x8f, 0xd5, + 0x68, 0x60, 0xd3, 0x73, 0xc5, 0xb8, 0x72, 0xf8, 0x2c, 0x07, 0xa3, 0x87, 0x61, 0xc4, 0x73, 0x34, + 0xa3, 0x1e, 0xc1, 0x4d, 0x51, 0xdc, 0xbc, 0x78, 0xe0, 0x23, 0x97, 0xe0, 0x90, 0xe0, 0x5b, 0xc5, + 0x9e, 0xa6, 0x6f, 0xe1, 0x6a, 0x40, 0xd4, 0x47, 0x77, 0x37, 0xee, 0xe1, 0x08, 0x73, 0xfc, 0xb9, + 0xa0, 0x95, 0x5f, 0x96, 0x60, 0x44, 0xac, 0xd3, 0xaa, 0xbe, 0xb1, 0x96, 0x00, 0x34, 0xd3, 0xb4, + 0xbc, 0xb0, 0xb9, 0xda, 0x5d, 0xb9, 0x8d, 0x6e, 0x6a, 0xc6, 0x27, 0x52, 0x42, 0x0c, 0x8a, 0x0d, + 0x80, 0xe0, 0x49, 0x57, 0xb3, 0x4d, 0x42, 0x8e, 0x9f, 0x1c, 0xd1, 0xe3, 0x47, 0xb6, 0xb2, 0x07, + 0x06, 0x22, 0x0b, 0x3a, 0x34, 0x06, 0xe9, 0x0d, 0x5c, 0x33, 0x4c, 0xbe, 0x1f, 0xcc, 0x1a, 0x62, + 0xff, 0x25, 0xe5, 0xef, 0xbf, 0x94, 0x3f, 0x2e, 0xc1, 0xa8, 0x6e, 0x35, 0x5a, 0xe5, 0x2d, 0xe7, + 0x5b, 0xb6, 0x17, 0xdc, 0x8b, 0xd2, 0x7b, 0xdf, 0x55, 0x33, 0xbc, 0xad, 0xe6, 0xc6, 0x94, 0x6e, + 0x35, 0xa6, 0x6b, 0x56, 0x5d, 0x33, 0x6b, 0xc1, 0xf9, 0x29, 0xfd, 0xa1, 0x3f, 0x5a, 0xc3, 0xe6, + 0xa3, 0x35, 0x2b, 0x74, 0x9a, 0x7a, 0x3e, 0xf8, 0xf9, 0x7f, 0x24, 0xe9, 0x0b, 0x89, 0xe4, 0xfc, + 0x6a, 0xf9, 0xcb, 0x89, 0xe2, 0x3c, 0xeb, 0x6e, 0x55, 0x98, 0x47, 0xc1, 0x9b, 0x75, 0xac, 0x13, + 0x95, 0xe1, 0xbb, 0x0f, 0xc3, 0x58, 0xcd, 0xaa, 0x59, 0x94, 0xe3, 0x34, 0xf9, 0xc5, 0x4f, 0x64, + 0xb3, 0x3e, 0xb4, 0x18, 0x7b, 0x7c, 0x5b, 0x5a, 0x86, 0x51, 0x8e, 0xac, 0xd2, 0x23, 0x21, 0xb6, + 0xb0, 0x41, 0xbb, 0x6e, 0xab, 0x15, 0x7e, 0xf9, 0x3b, 0x74, 0x42, 0x57, 0x46, 0x38, 0x29, 0x79, + 0xc6, 0xd6, 0x3e, 0x25, 0x05, 0x0e, 0x46, 0xf8, 0xb1, 0xb0, 0xc5, 0x4e, 0x0c, 0xc7, 0xdf, 0xe4, + 0x1c, 0x47, 0x43, 0x1c, 0xd7, 0x38, 0x69, 0x69, 0x16, 0x06, 0xf7, 0xc2, 0xeb, 0xb7, 0x38, 0xaf, + 0x01, 0x1c, 0x66, 0x32, 0x0f, 0xc3, 0x94, 0x89, 0xde, 0x74, 0x3d, 0xab, 0x41, 0x73, 0xe2, 0xee, + 0x6c, 0x7e, 0xfb, 0x3b, 0x2c, 0x8e, 0x86, 0x08, 0xd9, 0xac, 0x4f, 0x55, 0x2a, 0x01, 0x3d, 0x05, + 0xab, 0x62, 0xbd, 0x1e, 0xc3, 0xe1, 0xeb, 0x5c, 0x10, 0x1f, 0xbf, 0x74, 0x15, 0xc6, 0xc8, 0x6f, + 0x9a, 0xb2, 0xc2, 0x92, 0xc4, 0xef, 0xc1, 0x15, 0x5e, 0xfe, 0x10, 0x0b, 0xd5, 0x51, 0x9f, 0x41, + 0x48, 0xa6, 0xd0, 0x28, 0xd6, 0xb0, 0xe7, 0x61, 0xc7, 0x55, 0xb5, 0x7a, 0x27, 0xf1, 0x42, 0x9b, + 0x18, 0x85, 0x4f, 0x7d, 0x2f, 0x3a, 0x8a, 0xf3, 0x8c, 0x72, 0xa6, 0x5e, 0x2f, 0x5d, 0x81, 0x7b, + 0x3a, 0x78, 0x45, 0x0f, 0x3c, 0x3f, 0xcd, 0x79, 0x8e, 0xb5, 0x79, 0x06, 0x61, 0xbb, 0x0a, 0x02, + 0xee, 0x8f, 0x65, 0x0f, 0x3c, 0x7f, 0x8e, 0xf3, 0x44, 0x9c, 0x56, 0x0c, 0x29, 0xe1, 0x78, 0x09, + 0x46, 0xae, 0x63, 0x67, 0xc3, 0x72, 0xf9, 0xc6, 0x51, 0x0f, 0xec, 0x3e, 0xc3, 0xd9, 0x0d, 0x73, + 0x42, 0xba, 0x93, 0x44, 0x78, 0x9d, 0x83, 0xcc, 0xa6, 0xa6, 0xe3, 0x1e, 0x58, 0xbc, 0xc4, 0x59, + 0xf4, 0x13, 0x7c, 0x42, 0x3a, 0x03, 0x03, 0x35, 0x8b, 0xcf, 0x5a, 0xf1, 0xe4, 0x9f, 0xe5, 0xe4, + 0x39, 0x41, 0xc3, 0x59, 0xd8, 0x96, 0xdd, 0xac, 0x93, 0x29, 0x2d, 0x9e, 0xc5, 0x5f, 0x13, 0x2c, + 0x04, 0x0d, 0x67, 0xb1, 0x07, 0xb3, 0x7e, 0x4e, 0xb0, 0x70, 0x43, 0xf6, 0x7c, 0x0a, 0x72, 0x96, + 0x59, 0xdf, 0xb1, 0xcc, 0x5e, 0x84, 0xf8, 0x3c, 0xe7, 0x00, 0x9c, 0x84, 0x30, 0x38, 0x0f, 0xd9, + 0x5e, 0x07, 0xe2, 0x6f, 0x7c, 0x4f, 0x84, 0x87, 0x18, 0x81, 0x79, 0x18, 0x16, 0x09, 0xca, 0xb0, + 0xcc, 0x1e, 0x58, 0xfc, 0x4d, 0xce, 0x62, 0x28, 0x44, 0xc6, 0xd5, 0xf0, 0xb0, 0xeb, 0xd5, 0x70, + 0x2f, 0x4c, 0xbe, 0x24, 0xd4, 0xe0, 0x24, 0xdc, 0x94, 0x1b, 0xd8, 0xd4, 0xb7, 0x7a, 0xe3, 0xf0, + 0xf3, 0xc2, 0x94, 0x82, 0x86, 0xb0, 0x98, 0x85, 0xc1, 0x86, 0xe6, 0xb8, 0x5b, 0x5a, 0xbd, 0xa7, + 0xe1, 0xf8, 0x5b, 0x9c, 0xc7, 0x80, 0x4f, 0xc4, 0x2d, 0xd2, 0x34, 0xf7, 0xc2, 0xe6, 0xcb, 0xc2, + 0x22, 0x21, 0x32, 0x1e, 0x7a, 0xae, 0x47, 0x77, 0xd9, 0xf6, 0xc2, 0xed, 0x17, 0x44, 0xe8, 0x31, + 0xda, 0xa5, 0x30, 0xc7, 0xf3, 0x90, 0x75, 0x8d, 0x9b, 0x3d, 0xb1, 0xf9, 0xdb, 0x62, 0xa4, 0x29, + 0x01, 0x21, 0x7e, 0x0f, 0x1c, 0xea, 0x38, 0x4d, 0xf4, 0xc0, 0xec, 0xef, 0x70, 0x66, 0xe3, 0x1d, + 0xa6, 0x0a, 0x9e, 0x12, 0xf6, 0xca, 0xf2, 0xef, 0x8a, 0x94, 0x80, 0x5b, 0x78, 0xad, 0x92, 0x75, + 0x84, 0xab, 0x6d, 0xee, 0xcd, 0x6a, 0xbf, 0x28, 0xac, 0xc6, 0x68, 0x23, 0x56, 0x5b, 0x87, 0x71, + 0xce, 0x71, 0x6f, 0xe3, 0xfa, 0x4b, 0x22, 0xb1, 0x32, 0xea, 0x2b, 0xd1, 0xd1, 0x7d, 0x1f, 0x14, + 0x7d, 0x73, 0x8a, 0x82, 0xd5, 0x55, 0x1b, 0x9a, 0xdd, 0x03, 0xe7, 0x5f, 0xe6, 0x9c, 0x45, 0xc6, + 0xf7, 0x2b, 0x5e, 0x77, 0x49, 0xb3, 0x09, 0xf3, 0x67, 0xa1, 0x20, 0x98, 0x37, 0x4d, 0x07, 0xeb, + 0x56, 0xcd, 0x34, 0x6e, 0xe2, 0x6a, 0x0f, 0xac, 0x7f, 0xa5, 0x65, 0xa8, 0xae, 0x84, 0xc8, 0x09, + 0xe7, 0x05, 0xc8, 0xfb, 0xb5, 0x8a, 0x6a, 0x34, 0x6c, 0xcb, 0xf1, 0x62, 0x38, 0x7e, 0x45, 0x8c, + 0x94, 0x4f, 0xb7, 0x40, 0xc9, 0x4a, 0x15, 0x18, 0xa2, 0xcd, 0x5e, 0x5d, 0xf2, 0x57, 0x39, 0xa3, + 0xc1, 0x80, 0x8a, 0x27, 0x0e, 0xdd, 0x6a, 0xd8, 0x9a, 0xd3, 0x4b, 0xfe, 0xfb, 0x7b, 0x22, 0x71, + 0x70, 0x12, 0x9e, 0x38, 0xbc, 0x1d, 0x1b, 0x93, 0xd9, 0xbe, 0x07, 0x0e, 0xbf, 0x26, 0x12, 0x87, + 0xa0, 0xe1, 0x2c, 0x44, 0xc1, 0xd0, 0x03, 0x8b, 0xbf, 0x2f, 0x58, 0x08, 0x1a, 0xc2, 0xe2, 0xe9, + 0x60, 0xa2, 0x75, 0x70, 0xcd, 0x70, 0x3d, 0x87, 0x95, 0xc9, 0xbb, 0xb3, 0xfa, 0x07, 0xdf, 0x8b, + 0x16, 0x61, 0x4a, 0x88, 0x94, 0x64, 0x22, 0xbe, 0xed, 0x4a, 0x57, 0x51, 0xf1, 0x82, 0xfd, 0xba, + 0xc8, 0x44, 0x21, 0x32, 0x22, 0x5b, 0xa8, 0x42, 0x24, 0x66, 0xd7, 0xc9, 0xda, 0xa1, 0x07, 0x76, + 0xff, 0xb0, 0x45, 0xb8, 0x35, 0x41, 0x4b, 0x78, 0x86, 0xea, 0x9f, 0xa6, 0x79, 0x0d, 0xef, 0xf4, + 0xe4, 0x9d, 0xff, 0xa8, 0xa5, 0xfe, 0xb9, 0xc2, 0x28, 0x59, 0x0e, 0x19, 0x6e, 0xa9, 0xa7, 0x50, + 0xdc, 0xfd, 0xa1, 0xc2, 0x8f, 0xbe, 0xc6, 0xf5, 0x8d, 0x96, 0x53, 0xa5, 0x45, 0xe2, 0xe4, 0xd1, + 0xa2, 0x27, 0x9e, 0xd9, 0x87, 0x5e, 0xf3, 0xfd, 0x3c, 0x52, 0xf3, 0x94, 0x2e, 0xc0, 0x60, 0xa4, + 0xe0, 0x89, 0x67, 0xf5, 0x61, 0xce, 0x6a, 0x20, 0x5c, 0xef, 0x94, 0x4e, 0x43, 0x8a, 0x14, 0x2f, + 0xf1, 0xe4, 0x1f, 0xe1, 0xe4, 0x14, 0xbd, 0xf4, 0x4e, 0xc8, 0x88, 0xa2, 0x25, 0x9e, 0xf4, 0xa3, + 0x9c, 0xd4, 0x27, 0x21, 0xe4, 0xa2, 0x60, 0x89, 0x27, 0xff, 0x8b, 0x82, 0x5c, 0x90, 0x10, 0xf2, + 0xde, 0x4d, 0xf8, 0xd5, 0xbf, 0x94, 0xe2, 0x93, 0x8e, 0xb0, 0xdd, 0x79, 0xe8, 0xe7, 0x95, 0x4a, + 0x3c, 0xf5, 0xc7, 0x78, 0xe7, 0x82, 0xa2, 0xf4, 0x24, 0xa4, 0x7b, 0x34, 0xf8, 0x4f, 0x70, 0x52, + 0x86, 0x5f, 0x9a, 0x85, 0x5c, 0xa8, 0x3a, 0x89, 0x27, 0xff, 0x2b, 0x9c, 0x3c, 0x4c, 0x45, 0x44, + 0xe7, 0xd5, 0x49, 0x3c, 0x83, 0x8f, 0x0b, 0xd1, 0x39, 0x05, 0x31, 0x9b, 0x28, 0x4c, 0xe2, 0xa9, + 0x3f, 0x21, 0xac, 0x2e, 0x48, 0x4a, 0x4f, 0x41, 0xd6, 0x9f, 0x6c, 0xe2, 0xe9, 0x7f, 0x92, 0xd3, + 0x07, 0x34, 0xc4, 0x02, 0xa1, 0xc9, 0x2e, 0x9e, 0xc5, 0x4f, 0x09, 0x0b, 0x84, 0xa8, 0x48, 0x18, + 0xb5, 0x16, 0x30, 0xf1, 0x9c, 0x7e, 0x5a, 0x84, 0x51, 0x4b, 0xfd, 0x42, 0x46, 0x93, 0xe6, 0xfc, + 0x78, 0x16, 0x3f, 0x23, 0x46, 0x93, 0xe2, 0x13, 0x31, 0x5a, 0x2b, 0x82, 0x78, 0x1e, 0x7f, 0x55, + 0x88, 0xd1, 0x52, 0x10, 0x94, 0x56, 0x01, 0xb5, 0x57, 0x03, 0xf1, 0xfc, 0x3e, 0xc9, 0xf9, 0x8d, + 0xb4, 0x15, 0x03, 0xa5, 0x67, 0x60, 0xbc, 0x73, 0x25, 0x10, 0xcf, 0xf5, 0x53, 0xaf, 0xb5, 0xac, + 0xdd, 0xc2, 0x85, 0x40, 0x69, 0x3d, 0x98, 0x52, 0xc2, 0x55, 0x40, 0x3c, 0xdb, 0x4f, 0xbf, 0x16, + 0x4d, 0xdc, 0xe1, 0x22, 0xa0, 0x34, 0x03, 0x10, 0x4c, 0xc0, 0xf1, 0xbc, 0x3e, 0xc3, 0x79, 0x85, + 0x88, 0x48, 0x68, 0xf0, 0xf9, 0x37, 0x9e, 0xfe, 0x25, 0x11, 0x1a, 0x9c, 0x82, 0x84, 0x86, 0x98, + 0x7a, 0xe3, 0xa9, 0x3f, 0x2b, 0x42, 0x43, 0x90, 0x10, 0xcf, 0x0e, 0xcd, 0x6e, 0xf1, 0x1c, 0x3e, + 0x2f, 0x3c, 0x3b, 0x44, 0x55, 0x5a, 0x86, 0x91, 0xb6, 0x09, 0x31, 0x9e, 0xd5, 0x17, 0x38, 0xab, + 0x7c, 0xeb, 0x7c, 0x18, 0x9e, 0xbc, 0xf8, 0x64, 0x18, 0xcf, 0xed, 0x8b, 0x2d, 0x93, 0x17, 0x9f, + 0x0b, 0x4b, 0xe7, 0x21, 0x63, 0x36, 0xeb, 0x75, 0x12, 0x3c, 0x68, 0xf7, 0x3b, 0x7f, 0x85, 0x3f, + 0x7a, 0x9d, 0x5b, 0x47, 0x10, 0x94, 0x4e, 0x43, 0x1a, 0x37, 0x36, 0x70, 0x35, 0x8e, 0xf2, 0xbb, + 0xaf, 0x8b, 0x84, 0x49, 0xb0, 0x4b, 0x4f, 0x01, 0xb0, 0xad, 0x11, 0x7a, 0x3c, 0x18, 0x43, 0xfb, + 0x5f, 0x5f, 0xe7, 0xb7, 0x71, 0x02, 0x92, 0x80, 0x01, 0xbb, 0xdb, 0xb3, 0x3b, 0x83, 0xef, 0x45, + 0x19, 0xd0, 0x11, 0x39, 0x07, 0xfd, 0xcf, 0xb9, 0x96, 0xe9, 0x69, 0xb5, 0x38, 0xea, 0xff, 0xc6, + 0xa9, 0x05, 0x3e, 0x31, 0x58, 0xc3, 0x72, 0xb0, 0xa7, 0xd5, 0xdc, 0x38, 0xda, 0xff, 0xce, 0x69, + 0x7d, 0x02, 0x42, 0xac, 0x6b, 0xae, 0xd7, 0x8b, 0xde, 0x7f, 0x2c, 0x88, 0x05, 0x01, 0x11, 0x9a, + 0xfc, 0xbe, 0x86, 0x77, 0xe2, 0x68, 0xff, 0x44, 0x08, 0xcd, 0xf1, 0x4b, 0xef, 0x84, 0x2c, 0xf9, + 0xc9, 0xae, 0xd8, 0xc5, 0x10, 0xff, 0x0f, 0x4e, 0x1c, 0x50, 0x90, 0x9e, 0x5d, 0xaf, 0xea, 0x19, + 0xf1, 0xc6, 0xbe, 0xcd, 0x47, 0x5a, 0xe0, 0x97, 0x66, 0x20, 0xe7, 0x7a, 0xd5, 0x6a, 0x93, 0xd7, + 0xa7, 0x31, 0xe4, 0xff, 0xf3, 0x75, 0x7f, 0xcb, 0xc2, 0xa7, 0x21, 0xa3, 0x7d, 0xe3, 0x9a, 0x67, + 0x5b, 0xf4, 0x08, 0x24, 0x8e, 0xc3, 0x6b, 0x9c, 0x43, 0x88, 0xa4, 0x34, 0x0b, 0x03, 0x44, 0x17, + 0x07, 0xdb, 0x98, 0x9e, 0x57, 0xc5, 0xb0, 0xf8, 0x5f, 0xdc, 0x00, 0x11, 0xa2, 0xf2, 0x8f, 0x7c, + 0xfd, 0x95, 0x09, 0xe9, 0x1b, 0xaf, 0x4c, 0x48, 0x7f, 0xf8, 0xca, 0x84, 0xf4, 0x89, 0x6f, 0x4f, + 0x1c, 0xf8, 0xc6, 0xb7, 0x27, 0x0e, 0xfc, 0xde, 0xb7, 0x27, 0x0e, 0x74, 0xde, 0x36, 0x86, 0x79, + 0x6b, 0xde, 0x62, 0x1b, 0xc6, 0xef, 0x95, 0x23, 0xdb, 0xc5, 0x35, 0x2b, 0xd8, 0xad, 0xf5, 0x17, + 0x39, 0xf0, 0xe1, 0x24, 0x4c, 0xe8, 0x96, 0xdb, 0xb0, 0xdc, 0xe9, 0x0d, 0xcd, 0xc5, 0xd3, 0xd7, + 0x1f, 0xdf, 0xc0, 0x9e, 0xf6, 0xf8, 0xb4, 0x6e, 0x19, 0x26, 0xdf, 0xf6, 0x1d, 0x65, 0xcf, 0xa7, + 0xc8, 0xf3, 0x29, 0xfe, 0xbc, 0xd8, 0x71, 0x87, 0x58, 0x9e, 0x87, 0xd4, 0xac, 0x65, 0x98, 0x68, + 0x0c, 0xd2, 0x55, 0x6c, 0x5a, 0x0d, 0x7e, 0x03, 0x8c, 0x35, 0xd0, 0x7d, 0xd0, 0xa7, 0x35, 0xac, + 0xa6, 0xe9, 0xb1, 0xed, 0xf2, 0x72, 0xee, 0xeb, 0xb7, 0x26, 0x0f, 0xfc, 0xfe, 0xad, 0xc9, 0xe4, + 0x82, 0xe9, 0x29, 0xfc, 0x51, 0x29, 0xf5, 0xea, 0xe7, 0x26, 0x25, 0xf9, 0x12, 0xf4, 0xcf, 0x61, + 0x7d, 0x3f, 0xbc, 0xe6, 0xb0, 0xde, 0xc2, 0xeb, 0x21, 0xc8, 0x2c, 0x98, 0x1e, 0xbb, 0xa3, 0x77, + 0x14, 0x92, 0x86, 0xc9, 0x6e, 0x7d, 0xb4, 0xf4, 0x4f, 0xe0, 0x04, 0x75, 0x0e, 0xeb, 0x3e, 0x6a, + 0x15, 0xeb, 0xad, 0xa8, 0x84, 0x3d, 0x81, 0x97, 0xe7, 0x7e, 0xef, 0x3f, 0x4d, 0x1c, 0x78, 0xe1, + 0x95, 0x89, 0x03, 0xdd, 0xc6, 0x27, 0x62, 0x7e, 0x6e, 0x62, 0xf6, 0xe7, 0x51, 0xb7, 0x7a, 0x6d, + 0x9a, 0x84, 0x96, 0xbb, 0xd1, 0x47, 0xed, 0xf6, 0x04, 0x7c, 0x22, 0x01, 0x93, 0xad, 0x5b, 0xea, + 0xc4, 0x8f, 0x5d, 0x4f, 0x6b, 0xd8, 0xdd, 0x5e, 0x88, 0x3a, 0x0f, 0xd9, 0x75, 0x81, 0x83, 0x0a, + 0xd0, 0xef, 0x62, 0xdd, 0x32, 0xab, 0x2e, 0x15, 0x39, 0xa9, 0x88, 0x26, 0x31, 0xa0, 0xa9, 0x99, + 0x96, 0xcb, 0xef, 0x6b, 0xb2, 0x46, 0xf9, 0x67, 0xa5, 0xbd, 0x39, 0xd6, 0x90, 0xdf, 0x15, 0x35, + 0xcf, 0xaa, 0xf4, 0xde, 0x87, 0x77, 0x3b, 0x8d, 0xa0, 0xea, 0x05, 0x2a, 0x84, 0x8e, 0x1e, 0x26, + 0x5a, 0x8f, 0x1e, 0x9e, 0xc1, 0xf5, 0xfa, 0x65, 0xd3, 0xba, 0x61, 0xae, 0x47, 0x4c, 0xf2, 0xbb, + 0x12, 0x1c, 0xa3, 0x17, 0xd1, 0x9d, 0x86, 0x61, 0x7a, 0xd3, 0x75, 0x63, 0xc3, 0x9d, 0xde, 0x30, + 0x3c, 0x97, 0x59, 0x8e, 0xdb, 0x64, 0x2c, 0xc0, 0x98, 0x22, 0x18, 0x53, 0x04, 0x43, 0x3e, 0x05, + 0x99, 0xb2, 0xe1, 0xcd, 0x38, 0x8e, 0xb6, 0x83, 0x10, 0xa4, 0x08, 0x8c, 0x1b, 0x85, 0xfe, 0x26, + 0x16, 0xc1, 0x75, 0xdc, 0x70, 0xe9, 0xa1, 0x57, 0x4a, 0x61, 0x8d, 0xf2, 0x95, 0xae, 0x23, 0x79, + 0x3e, 0xa4, 0x69, 0x48, 0xa4, 0xd0, 0x4f, 0x16, 0x09, 0x9d, 0xc4, 0xf5, 0xf5, 0xf9, 0x72, 0x0a, + 0x8e, 0x86, 0x10, 0x74, 0x67, 0xc7, 0xf6, 0x68, 0x48, 0x5a, 0x9b, 0x5c, 0x99, 0x91, 0x90, 0x32, + 0xec, 0x71, 0x97, 0x30, 0xdb, 0x84, 0xf4, 0x2a, 0xa1, 0x23, 0x8a, 0x78, 0x96, 0xa7, 0xd5, 0xb9, + 0x76, 0xac, 0x41, 0xa0, 0xec, 0x32, 0x7e, 0x82, 0x41, 0x0d, 0x71, 0x0f, 0xbf, 0x8e, 0xb5, 0x4d, + 0x76, 0xf9, 0x31, 0x49, 0xcf, 0x3e, 0x33, 0x04, 0x40, 0xef, 0x39, 0x8e, 0x41, 0x5a, 0x6b, 0xb2, + 0x63, 0xbb, 0xe4, 0xf1, 0x01, 0x85, 0x35, 0xe4, 0xcb, 0xd0, 0xcf, 0x8f, 0x0a, 0x50, 0x1e, 0x92, + 0xd7, 0xf0, 0x0e, 0xed, 0x67, 0x40, 0x21, 0x3f, 0xd1, 0x14, 0xa4, 0xa9, 0xf0, 0xfc, 0x56, 0x77, + 0x61, 0xaa, 0x4d, 0xfa, 0x29, 0x2a, 0xa4, 0xc2, 0xd0, 0xe4, 0x4b, 0x90, 0x99, 0xb3, 0x1a, 0x86, + 0x69, 0x45, 0xb9, 0x65, 0x19, 0x37, 0x2a, 0xb3, 0xdd, 0xe4, 0xe1, 0xac, 0xb0, 0x06, 0x1a, 0x87, + 0x3e, 0x76, 0x19, 0x96, 0x1f, 0x3d, 0xf2, 0x96, 0x3c, 0x0b, 0xfd, 0x94, 0xf7, 0x8a, 0x4d, 0xc6, + 0xd7, 0xbf, 0x88, 0x94, 0xe5, 0x6f, 0x3c, 0x70, 0xf6, 0x89, 0x40, 0x58, 0x04, 0xa9, 0xaa, 0xe6, + 0x69, 0x5c, 0x6f, 0xfa, 0x5b, 0x7e, 0x17, 0x64, 0x38, 0x13, 0x17, 0x9d, 0x84, 0xa4, 0x65, 0xbb, + 0xfc, 0xf0, 0xb0, 0xd8, 0x4d, 0x95, 0x15, 0xbb, 0x9c, 0x22, 0x89, 0x40, 0x21, 0xc8, 0x65, 0xa5, + 0xab, 0xbf, 0x9c, 0xdd, 0xbb, 0xbf, 0xb0, 0x6e, 0x7c, 0x67, 0xf9, 0x7c, 0x02, 0x26, 0x42, 0x4f, + 0xaf, 0x63, 0x87, 0xd4, 0xcb, 0x11, 0xd7, 0x47, 0x21, 0x21, 0xf9, 0xf3, 0x2e, 0xee, 0xf2, 0x4e, + 0x48, 0xce, 0xd8, 0x36, 0x2a, 0x42, 0x86, 0x1d, 0x12, 0x5a, 0xcc, 0x5f, 0x52, 0x8a, 0xdf, 0x26, + 0xcf, 0x5c, 0x6b, 0xd3, 0xbb, 0xa1, 0x39, 0xfe, 0x6b, 0x20, 0xa2, 0x2d, 0x9f, 0x83, 0xec, 0xac, + 0x65, 0xba, 0xd8, 0x74, 0x9b, 0x34, 0x74, 0x36, 0xea, 0x96, 0x7e, 0x8d, 0x73, 0x60, 0x0d, 0x62, + 0x70, 0xcd, 0xb6, 0x29, 0x65, 0x4a, 0x21, 0x3f, 0x59, 0xea, 0x2d, 0xaf, 0x75, 0x35, 0xd1, 0xb9, + 0xbd, 0x9b, 0x88, 0x2b, 0xe9, 0xdb, 0xe8, 0x0f, 0x24, 0x38, 0xd2, 0x1e, 0x50, 0xd7, 0xf0, 0x8e, + 0xbb, 0xd7, 0x78, 0x3a, 0x0b, 0xd9, 0x55, 0xfa, 0x2e, 0xe6, 0x65, 0xbc, 0x83, 0x8a, 0xd0, 0x8f, + 0xab, 0x27, 0x4f, 0x9f, 0x7e, 0xfc, 0x1c, 0xf3, 0xf6, 0x8b, 0x07, 0x14, 0x01, 0x28, 0x65, 0x88, + 0x56, 0xaf, 0x7e, 0x7e, 0x52, 0x2a, 0xa7, 0x21, 0xe9, 0x36, 0x1b, 0x77, 0xd5, 0x07, 0x3e, 0x9d, + 0x8e, 0x24, 0x40, 0x96, 0x51, 0xaf, 0x6b, 0x75, 0xa3, 0xaa, 0x05, 0x6f, 0xc9, 0xe6, 0x43, 0x3a, + 0x52, 0x8c, 0xce, 0x2a, 0x16, 0x77, 0xb5, 0x94, 0xfc, 0x2b, 0x12, 0x0c, 0x5c, 0x15, 0x9c, 0xd7, + 0xb0, 0x87, 0xce, 0x03, 0xf8, 0x3d, 0x89, 0xb0, 0x38, 0x3c, 0xd5, 0xda, 0xd7, 0x94, 0x4f, 0xa3, + 0x84, 0xd0, 0xd1, 0x93, 0xd4, 0xd1, 0x6c, 0xcb, 0xe5, 0xef, 0x08, 0xc4, 0x90, 0xfa, 0xc8, 0xe8, + 0x11, 0x40, 0x34, 0x83, 0xa9, 0xd7, 0x2d, 0xcf, 0x30, 0x6b, 0xaa, 0x6d, 0xdd, 0xe0, 0x2f, 0x54, + 0x25, 0x95, 0x3c, 0x7d, 0x72, 0x95, 0x3e, 0x58, 0x25, 0x70, 0x22, 0x74, 0xd6, 0xe7, 0x42, 0xe6, + 0x3f, 0xad, 0x5a, 0x75, 0xb0, 0xeb, 0xf2, 0x24, 0x25, 0x9a, 0xe8, 0x3c, 0xf4, 0xdb, 0xcd, 0x0d, + 0x55, 0x64, 0x84, 0xdc, 0xc9, 0x23, 0x9d, 0xe2, 0x5b, 0x8c, 0x3f, 0x8f, 0xf0, 0x3e, 0xbb, 0xb9, + 0x41, 0xbc, 0xe1, 0x5e, 0x18, 0xe8, 0x20, 0x4c, 0xee, 0x7a, 0x20, 0x07, 0x7d, 0xc5, 0x97, 0x6b, + 0xa0, 0xda, 0x8e, 0x61, 0x39, 0x86, 0xb7, 0x43, 0x4f, 0xf8, 0x93, 0x4a, 0x5e, 0x3c, 0x58, 0xe5, + 0x70, 0xf9, 0x1a, 0x0c, 0xaf, 0x19, 0x0d, 0x9b, 0xde, 0x49, 0xe1, 0x92, 0x9f, 0x0e, 0xe4, 0x93, + 0xe2, 0xe5, 0xeb, 0x2a, 0x59, 0xa2, 0x4d, 0xb2, 0xf2, 0xd3, 0x5d, 0xbd, 0xf3, 0xc9, 0xbd, 0x7b, + 0x67, 0xb4, 0x60, 0xf9, 0xd3, 0x62, 0x24, 0xf8, 0xf8, 0x74, 0x1f, 0x4a, 0x4f, 0xbd, 0x3a, 0x66, + 0x5c, 0xd9, 0x53, 0x8c, 0x2d, 0x02, 0x8a, 0xbb, 0x4f, 0xab, 0xc5, 0x98, 0x44, 0x5a, 0x8c, 0x0d, + 0x32, 0xf9, 0x1c, 0x0c, 0xae, 0x6a, 0x8e, 0xb7, 0x86, 0xbd, 0x8b, 0x58, 0xab, 0x62, 0x27, 0x3a, + 0xef, 0x0e, 0x8a, 0x79, 0x17, 0x41, 0x8a, 0x4e, 0xae, 0x6c, 0xde, 0xa1, 0xbf, 0xe5, 0x2d, 0x48, + 0xd1, 0x7b, 0x40, 0xfe, 0x9c, 0xcc, 0x29, 0xd8, 0x9c, 0x4c, 0xb2, 0xe9, 0x8e, 0x87, 0x5d, 0x4e, + 0xc2, 0x1a, 0xe8, 0x94, 0x98, 0x59, 0x93, 0xbb, 0xcf, 0xac, 0xdc, 0x55, 0xf9, 0xfc, 0x5a, 0x87, + 0xfe, 0x32, 0x49, 0xc6, 0x0b, 0x73, 0xbe, 0x20, 0x52, 0x20, 0x08, 0x5a, 0x82, 0x61, 0x5b, 0x73, + 0x3c, 0x7a, 0x01, 0x7a, 0x8b, 0x6a, 0xc1, 0xa3, 0x61, 0xb2, 0x3d, 0x36, 0x23, 0xca, 0xf2, 0x5e, + 0x06, 0xed, 0x30, 0x50, 0xfe, 0xcf, 0x29, 0xe8, 0xe3, 0xc6, 0x78, 0x27, 0xf4, 0x73, 0xb3, 0x72, + 0xff, 0x3d, 0x3a, 0xd5, 0x3e, 0x35, 0x4d, 0xf9, 0x53, 0x08, 0xe7, 0x27, 0x68, 0xd0, 0x03, 0x90, + 0xd1, 0xb7, 0x34, 0xc3, 0x54, 0x8d, 0xaa, 0xa8, 0xe5, 0x5f, 0xb9, 0x35, 0xd9, 0x3f, 0x4b, 0x60, + 0x0b, 0x73, 0x4a, 0x3f, 0x7d, 0xb8, 0x50, 0x25, 0xb5, 0xc0, 0x16, 0x36, 0x6a, 0x5b, 0x1e, 0x8f, + 0x41, 0xde, 0x42, 0x67, 0x21, 0x45, 0x5c, 0x86, 0xbf, 0x1f, 0x53, 0x6c, 0x5b, 0x63, 0xf9, 0x75, + 0x6b, 0x39, 0x43, 0x3a, 0xfe, 0xc4, 0xb7, 0x26, 0x25, 0x85, 0x52, 0xa0, 0x59, 0x18, 0xac, 0x6b, + 0xae, 0xa7, 0xd2, 0x39, 0x8c, 0x74, 0x9f, 0xa6, 0x2c, 0x0e, 0xb5, 0x1b, 0x84, 0x1b, 0x96, 0x8b, + 0x9e, 0x23, 0x54, 0x0c, 0x54, 0x45, 0xc7, 0x21, 0x4f, 0x99, 0xe8, 0x56, 0xa3, 0x61, 0x78, 0xac, + 0xba, 0xea, 0xa3, 0x76, 0x1f, 0x22, 0xf0, 0x59, 0x0a, 0xa6, 0x35, 0xd6, 0x61, 0xc8, 0xd2, 0x0b, + 0xf9, 0x14, 0x85, 0x5d, 0x3e, 0xcb, 0x10, 0x00, 0x7d, 0xf8, 0x20, 0x0c, 0x07, 0x19, 0x94, 0xa1, + 0x64, 0x18, 0x97, 0x00, 0x4c, 0x11, 0x1f, 0x83, 0x31, 0x13, 0x6f, 0xd3, 0xeb, 0x70, 0x11, 0xec, + 0x2c, 0xc5, 0x46, 0xe4, 0xd9, 0xd5, 0x28, 0xc5, 0x3b, 0x60, 0x48, 0x17, 0xc6, 0x67, 0xb8, 0x40, + 0x71, 0x07, 0x7d, 0x28, 0x45, 0x3b, 0x04, 0x19, 0xcd, 0xb6, 0x19, 0x42, 0x8e, 0x67, 0x50, 0xdb, + 0xa6, 0x8f, 0x4e, 0xc0, 0x08, 0xd5, 0xd1, 0xc1, 0x6e, 0xb3, 0xee, 0x71, 0x26, 0x03, 0x14, 0x67, + 0x98, 0x3c, 0x50, 0x18, 0x9c, 0xe2, 0xde, 0x07, 0x83, 0xf8, 0xba, 0x51, 0xc5, 0xa6, 0x8e, 0x19, + 0xde, 0x20, 0xc5, 0x1b, 0x10, 0x40, 0x8a, 0xf4, 0x10, 0xf8, 0x99, 0x51, 0x15, 0x59, 0x7b, 0x88, + 0xf1, 0x13, 0xf0, 0x19, 0x06, 0x96, 0x1f, 0x81, 0xd4, 0x9c, 0xe6, 0x69, 0xa4, 0xc4, 0xf0, 0xb6, + 0xd9, 0x54, 0x34, 0xa0, 0x90, 0x9f, 0x1d, 0xc3, 0xed, 0xd5, 0x04, 0xa4, 0xae, 0x5a, 0x1e, 0x46, + 0x4f, 0x84, 0xca, 0xc2, 0xa1, 0x4e, 0x3e, 0xbe, 0x66, 0xd4, 0x4c, 0x5c, 0x5d, 0x72, 0x6b, 0xa1, + 0x37, 0x65, 0x03, 0x17, 0x4b, 0x44, 0x5c, 0x6c, 0x0c, 0xd2, 0x8e, 0xd5, 0x34, 0xab, 0xe2, 0x2e, + 0x17, 0x6d, 0xa0, 0x0a, 0x64, 0x7c, 0xcf, 0x49, 0xc5, 0x79, 0xce, 0x30, 0xf1, 0x1c, 0xe2, 0xd7, + 0x1c, 0xa0, 0xf4, 0x6f, 0x70, 0x07, 0x2a, 0x43, 0xd6, 0x4f, 0x79, 0xdc, 0x03, 0x7b, 0x73, 0xe2, + 0x80, 0x8c, 0x4c, 0x41, 0xbe, 0x3f, 0xf8, 0x06, 0x65, 0x5e, 0x98, 0xf7, 0x1f, 0x70, 0x8b, 0x46, + 0x5c, 0x8d, 0xbf, 0xb5, 0xdb, 0x4f, 0xf5, 0x0a, 0x5c, 0x8d, 0xbd, 0xb9, 0x7b, 0x04, 0xb2, 0xae, + 0x51, 0x33, 0x35, 0xaf, 0xe9, 0x60, 0xee, 0x8d, 0x01, 0x40, 0xfe, 0xc9, 0x04, 0xf4, 0x31, 0xef, + 0x0e, 0xd9, 0x4d, 0xea, 0x6c, 0xb7, 0x44, 0x37, 0xbb, 0x25, 0xf7, 0x6f, 0xb7, 0x19, 0x00, 0x5f, + 0x18, 0x97, 0xbf, 0x75, 0xd9, 0xa1, 0xce, 0x60, 0x22, 0xae, 0x19, 0x35, 0x1e, 0xbc, 0x21, 0x22, + 0xdf, 0x83, 0xd2, 0xa1, 0x3c, 0x79, 0x1e, 0xb2, 0x1b, 0x86, 0xa7, 0x6a, 0x64, 0xf1, 0x48, 0x4d, + 0x98, 0x3b, 0x39, 0x31, 0xd5, 0x69, 0x95, 0x39, 0x25, 0x96, 0x98, 0x4a, 0x66, 0x83, 0xff, 0x92, + 0xff, 0x40, 0x22, 0xb5, 0x32, 0xef, 0x10, 0xcd, 0xc0, 0xa0, 0x50, 0x54, 0xdd, 0xac, 0x6b, 0x35, + 0xee, 0x8c, 0x47, 0xbb, 0x6a, 0x7b, 0xa1, 0xae, 0xd5, 0x94, 0x1c, 0x57, 0x90, 0x34, 0x3a, 0x0f, + 0x6c, 0xa2, 0xcb, 0xc0, 0x46, 0x3c, 0x29, 0xb9, 0x3f, 0x4f, 0x8a, 0x8c, 0x79, 0xaa, 0x75, 0xcc, + 0xbf, 0x92, 0xa0, 0x6b, 0x26, 0xdb, 0x72, 0xb5, 0xfa, 0x9b, 0x11, 0x62, 0x87, 0x21, 0x6b, 0x5b, + 0x75, 0x95, 0x3d, 0x61, 0x97, 0x26, 0x33, 0xb6, 0x55, 0x57, 0xda, 0xfc, 0x28, 0x7d, 0x87, 0xe2, + 0xaf, 0xef, 0x0e, 0x58, 0xad, 0xbf, 0xd5, 0x6a, 0x0e, 0x0c, 0x30, 0x53, 0xf0, 0x09, 0xf3, 0x31, + 0x62, 0x03, 0x3a, 0x03, 0x4b, 0xed, 0x13, 0x3c, 0x13, 0x9b, 0x61, 0x2a, 0x1c, 0x8f, 0x50, 0xb0, + 0xf9, 0xa5, 0xd3, 0x62, 0x3b, 0xec, 0xe7, 0x0a, 0xc7, 0x93, 0x7f, 0x56, 0x02, 0x58, 0x24, 0x96, + 0xa5, 0xfa, 0x92, 0xa9, 0xce, 0xa5, 0x22, 0xa8, 0x91, 0x9e, 0x27, 0xba, 0x0d, 0x1a, 0xef, 0x7f, + 0xc0, 0x0d, 0xcb, 0x3d, 0x0b, 0x83, 0x81, 0x33, 0xba, 0x58, 0x08, 0x33, 0xb1, 0x4b, 0x71, 0xbf, + 0x86, 0x3d, 0x65, 0xe0, 0x7a, 0xa8, 0x25, 0xff, 0x33, 0x09, 0xb2, 0x54, 0xa6, 0x25, 0xec, 0x69, + 0x91, 0x31, 0x94, 0xf6, 0x3f, 0x86, 0x47, 0x01, 0x18, 0x1b, 0xd7, 0xb8, 0x89, 0xb9, 0x67, 0x65, + 0x29, 0x64, 0xcd, 0xb8, 0x89, 0xd1, 0x19, 0xdf, 0xe0, 0xc9, 0xdd, 0x0d, 0x2e, 0x8a, 0x7f, 0x6e, + 0xf6, 0x7b, 0xa0, 0x9f, 0x7e, 0xcd, 0x64, 0xdb, 0xe5, 0xf5, 0x7c, 0x9f, 0xd9, 0x6c, 0xac, 0x6f, + 0xbb, 0xf2, 0x73, 0xd0, 0xbf, 0xbe, 0xcd, 0xb6, 0x60, 0x0e, 0x43, 0xd6, 0xb1, 0x2c, 0x3e, 0xf1, + 0xb3, 0x82, 0x2b, 0x43, 0x00, 0x74, 0x9e, 0x13, 0xdb, 0x0e, 0x89, 0x60, 0xdb, 0x21, 0xd8, 0x37, + 0x49, 0xf6, 0xb4, 0x6f, 0x72, 0xe2, 0xdf, 0x4b, 0x90, 0x0b, 0xe5, 0x07, 0xf4, 0x38, 0x1c, 0x2c, + 0x2f, 0xae, 0xcc, 0x5e, 0x56, 0x17, 0xe6, 0xd4, 0x0b, 0x8b, 0x33, 0xf3, 0xc1, 0x6b, 0x01, 0xc5, + 0xf1, 0x17, 0x5f, 0x3a, 0x86, 0x42, 0xb8, 0x57, 0xcc, 0x6b, 0xa6, 0x75, 0xc3, 0x44, 0xd3, 0x30, + 0x16, 0x25, 0x99, 0x29, 0xaf, 0x55, 0x96, 0xd7, 0xf3, 0x52, 0xf1, 0xe0, 0x8b, 0x2f, 0x1d, 0x1b, + 0x09, 0x51, 0xcc, 0x6c, 0xb8, 0xd8, 0xf4, 0xda, 0x09, 0x66, 0x57, 0x96, 0x96, 0x16, 0xd6, 0xf3, + 0x89, 0x36, 0x02, 0x3e, 0x03, 0x3c, 0x04, 0x23, 0x51, 0x82, 0xe5, 0x85, 0xc5, 0x7c, 0xb2, 0x88, + 0x5e, 0x7c, 0xe9, 0xd8, 0x50, 0x08, 0x7b, 0xd9, 0xa8, 0x17, 0x33, 0x3f, 0xfe, 0xc5, 0x89, 0x03, + 0x3f, 0xff, 0xd7, 0x27, 0x24, 0xa2, 0xd9, 0x60, 0x24, 0x47, 0xa0, 0x47, 0xe0, 0x9e, 0xb5, 0x85, + 0xf9, 0xe5, 0xca, 0x9c, 0xba, 0xb4, 0x36, 0xaf, 0xb2, 0xef, 0x21, 0xf8, 0xda, 0x0d, 0xbf, 0xf8, + 0xd2, 0xb1, 0x1c, 0x57, 0xa9, 0x1b, 0xf6, 0xaa, 0x52, 0xb9, 0xba, 0xb2, 0x5e, 0xc9, 0x4b, 0x0c, + 0x7b, 0xd5, 0xc1, 0xd7, 0x2d, 0x8f, 0x7d, 0xee, 0xe8, 0x31, 0x38, 0xd4, 0x01, 0xdb, 0x57, 0x6c, + 0xe4, 0xc5, 0x97, 0x8e, 0x0d, 0xae, 0x3a, 0x98, 0xc5, 0x0f, 0xa5, 0x98, 0x82, 0x42, 0x3b, 0xc5, + 0xca, 0xea, 0xca, 0xda, 0xcc, 0x62, 0xfe, 0x58, 0x31, 0xff, 0xe2, 0x4b, 0xc7, 0x06, 0x44, 0x32, + 0x24, 0xf8, 0x81, 0x66, 0x77, 0x73, 0xe1, 0xf5, 0x97, 0x13, 0x30, 0xd1, 0x76, 0xf9, 0x9a, 0x1f, + 0x59, 0x74, 0xdb, 0x28, 0x2e, 0x41, 0x66, 0x4e, 0x9c, 0x84, 0xec, 0x75, 0x9f, 0xf8, 0x67, 0xf6, + 0xb8, 0x4f, 0x3c, 0x28, 0x7a, 0x12, 0xdb, 0xc4, 0x27, 0xe2, 0xb7, 0x89, 0x85, 0xfc, 0xfb, 0xd8, + 0x25, 0xfe, 0xc8, 0xe3, 0x70, 0x3f, 0xdf, 0x5c, 0x77, 0x3d, 0xed, 0x9a, 0x61, 0xd6, 0xfc, 0x23, + 0x0c, 0xde, 0xe6, 0x46, 0x19, 0xe7, 0xa7, 0x18, 0x02, 0xba, 0xeb, 0x41, 0x46, 0x71, 0xd7, 0xb5, + 0x6d, 0xfc, 0x9a, 0x35, 0x66, 0x84, 0x8a, 0x31, 0x47, 0x2e, 0xf2, 0xc7, 0x24, 0x18, 0xba, 0x68, + 0xb8, 0x9e, 0xe5, 0x18, 0xba, 0x56, 0xa7, 0x6f, 0x39, 0x9c, 0xe9, 0x75, 0xd2, 0x68, 0xc9, 0x61, + 0x4f, 0x41, 0xdf, 0x75, 0xad, 0xce, 0xb2, 0x75, 0x92, 0x7e, 0x95, 0xa1, 0xb3, 0x21, 0x82, 0x9c, + 0x2d, 0x18, 0x30, 0x32, 0xf9, 0x17, 0x13, 0x30, 0x4c, 0xa3, 0xdc, 0x65, 0x9f, 0xe1, 0x21, 0x2b, + 0xd4, 0x32, 0xa4, 0x1c, 0xcd, 0xe3, 0x9b, 0xae, 0xe5, 0x29, 0x7e, 0x38, 0xf2, 0x40, 0xfc, 0x81, + 0xc7, 0xd4, 0x1c, 0xd6, 0x15, 0x4a, 0x8b, 0x7e, 0x18, 0x32, 0x0d, 0x6d, 0x5b, 0xa5, 0x7c, 0xd8, + 0xba, 0x6f, 0x66, 0x6f, 0x7c, 0x6e, 0xdf, 0x9a, 0x1c, 0xde, 0xd1, 0x1a, 0xf5, 0x92, 0x2c, 0xf8, + 0xc8, 0x4a, 0x7f, 0x43, 0xdb, 0x26, 0x22, 0x22, 0x1b, 0x86, 0x09, 0x54, 0xdf, 0xd2, 0xcc, 0x1a, + 0x66, 0x9d, 0xd0, 0x2d, 0xe4, 0xf2, 0xc5, 0x3d, 0x77, 0x32, 0x1e, 0x74, 0x12, 0x62, 0x27, 0x2b, + 0x83, 0x0d, 0x6d, 0x7b, 0x96, 0x02, 0x48, 0x8f, 0xa5, 0xcc, 0x27, 0x3f, 0x37, 0x79, 0x80, 0x1e, + 0x38, 0xbd, 0x2c, 0x01, 0x04, 0x16, 0x43, 0x3f, 0x0c, 0x79, 0xdd, 0x6f, 0x51, 0x5a, 0x97, 0x8f, + 0xe1, 0x83, 0xdd, 0xc6, 0xa2, 0xc5, 0xde, 0xac, 0xe8, 0xf8, 0xc6, 0xad, 0x49, 0x49, 0x19, 0xd6, + 0x5b, 0x86, 0xe2, 0x7d, 0x90, 0x6b, 0xda, 0x55, 0xcd, 0xc3, 0x2a, 0x5d, 0x05, 0x27, 0x62, 0x0b, + 0x98, 0x09, 0xc2, 0xeb, 0xf6, 0xad, 0x49, 0xc4, 0xd4, 0x0a, 0x11, 0xcb, 0xb4, 0xac, 0x01, 0x06, + 0x21, 0x04, 0x21, 0x9d, 0x7e, 0x47, 0x82, 0xdc, 0x5c, 0xe8, 0xb6, 0x51, 0x01, 0xfa, 0x1b, 0x96, + 0x69, 0x5c, 0xe3, 0xfe, 0x98, 0x55, 0x44, 0x13, 0x15, 0x21, 0xc3, 0x5e, 0xfc, 0xf2, 0x76, 0xc4, + 0x56, 0xb2, 0x68, 0x13, 0xaa, 0x1b, 0x78, 0xc3, 0x35, 0xc4, 0x68, 0x28, 0xa2, 0x89, 0x2e, 0x40, + 0xde, 0xc5, 0x7a, 0xd3, 0x31, 0xbc, 0x1d, 0x55, 0xb7, 0x4c, 0x4f, 0xd3, 0x3d, 0xf6, 0x0a, 0x51, + 0xf9, 0xf0, 0xed, 0x5b, 0x93, 0xf7, 0x30, 0x59, 0x5b, 0x31, 0x64, 0x65, 0x58, 0x80, 0x66, 0x19, + 0x84, 0xf4, 0x50, 0xc5, 0x9e, 0x66, 0xd4, 0x5d, 0x5a, 0x13, 0x66, 0x15, 0xd1, 0x0c, 0xe9, 0xf2, + 0x4f, 0xfa, 0xc3, 0x1b, 0x87, 0x37, 0x20, 0x6f, 0xd9, 0xd8, 0x89, 0x54, 0xd8, 0x74, 0x1e, 0x2f, + 0x2f, 0x06, 0x3d, 0xb7, 0x62, 0xc8, 0xff, 0xef, 0xd6, 0xe4, 0xa3, 0x3d, 0x78, 0xd0, 0x55, 0xad, + 0xce, 0xab, 0x73, 0x65, 0x58, 0xf0, 0x10, 0xe5, 0xfa, 0x05, 0xe2, 0x17, 0x62, 0x5d, 0x6e, 0x37, + 0x37, 0xc4, 0x06, 0x65, 0x44, 0xe5, 0x56, 0x0c, 0x99, 0x78, 0x00, 0x07, 0xad, 0x52, 0x08, 0x29, + 0xa9, 0x9f, 0xd3, 0x8c, 0xba, 0x78, 0x1b, 0x56, 0xe1, 0x2d, 0xb4, 0x00, 0x7d, 0xae, 0xa7, 0x79, + 0x4d, 0x56, 0xbc, 0xa4, 0xcb, 0x8f, 0xf7, 0x28, 0x73, 0xd9, 0x32, 0xab, 0x6b, 0x94, 0x50, 0xe1, + 0x0c, 0xd0, 0x05, 0xe8, 0xf3, 0xac, 0x6b, 0xd8, 0xe4, 0x46, 0xdd, 0x53, 0xc4, 0xd3, 0xc3, 0x5d, + 0x46, 0x8d, 0x3c, 0xc8, 0x57, 0x71, 0x1d, 0xd7, 0x58, 0x05, 0xb9, 0xa5, 0x91, 0x95, 0x1b, 0xfd, + 0x22, 0x55, 0x79, 0x61, 0xcf, 0x61, 0xc9, 0x0d, 0xd4, 0xca, 0x4f, 0x56, 0x86, 0x7d, 0xd0, 0x1a, + 0x85, 0xa0, 0xcb, 0x91, 0x8b, 0x72, 0xfc, 0xb3, 0x6d, 0xf7, 0x75, 0x8b, 0xbd, 0x90, 0x97, 0x8b, + 0xfd, 0x9e, 0xf0, 0x35, 0xbb, 0x0b, 0x90, 0x6f, 0x9a, 0x1b, 0x96, 0x49, 0xdf, 0x60, 0xe3, 0x4b, + 0x19, 0xb2, 0x36, 0x4e, 0x86, 0x47, 0xad, 0x15, 0x43, 0x56, 0x86, 0x7d, 0xd0, 0x45, 0xb6, 0xe0, + 0xa9, 0xc2, 0x50, 0x80, 0x45, 0x43, 0x37, 0x1b, 0x1b, 0xba, 0xf7, 0xf2, 0xd0, 0x3d, 0xd8, 0xda, + 0x4b, 0x10, 0xbd, 0x83, 0x3e, 0x90, 0x90, 0xa1, 0x8b, 0x00, 0x41, 0xc2, 0xa0, 0xfb, 0x3e, 0xb9, + 0x93, 0x72, 0x7c, 0xd6, 0x11, 0x6b, 0xe5, 0x80, 0x16, 0x7d, 0x00, 0x46, 0x1b, 0x86, 0xa9, 0xba, + 0xb8, 0xbe, 0xa9, 0x72, 0x03, 0x13, 0x96, 0xf4, 0x0b, 0x24, 0xe5, 0xc5, 0xbd, 0xf9, 0xc3, 0xed, + 0x5b, 0x93, 0x45, 0x9e, 0x54, 0xdb, 0x59, 0xca, 0xca, 0x48, 0xc3, 0x30, 0xd7, 0x70, 0x7d, 0x73, + 0xce, 0x87, 0x95, 0x06, 0x7e, 0xfc, 0x73, 0x93, 0x07, 0xfc, 0x00, 0x36, 0xe8, 0x69, 0x05, 0x8f, + 0x23, 0xec, 0xa2, 0x15, 0xc8, 0x6a, 0xa2, 0xc1, 0x76, 0x88, 0x7a, 0x76, 0xf6, 0x50, 0x80, 0x06, + 0x3c, 0x58, 0xae, 0x78, 0xe1, 0x3f, 0x1e, 0x93, 0xe4, 0x17, 0x13, 0xd0, 0x37, 0x77, 0x75, 0x55, + 0x33, 0x1c, 0x74, 0x13, 0x46, 0x02, 0x67, 0x8b, 0x66, 0x8a, 0xa5, 0xdb, 0xb7, 0x26, 0x0b, 0xad, + 0xfe, 0xb8, 0xc7, 0x54, 0x31, 0xa3, 0xeb, 0x42, 0x92, 0x20, 0x48, 0x44, 0xae, 0xb8, 0xd9, 0x75, + 0x1f, 0x20, 0xdc, 0x77, 0x1b, 0xca, 0x3e, 0xd2, 0x54, 0xdb, 0xb6, 0x42, 0x28, 0x71, 0x56, 0xa0, + 0x9f, 0xd9, 0xc2, 0x45, 0x25, 0x48, 0xdb, 0xe4, 0x07, 0x3f, 0x1b, 0x9a, 0xe8, 0x1a, 0x4d, 0x14, + 0xdf, 0xdf, 0xa9, 0x26, 0x24, 0xf2, 0x17, 0x92, 0x00, 0x73, 0x57, 0xaf, 0xae, 0x3b, 0x86, 0x5d, + 0xc7, 0xde, 0xf7, 0xd5, 0xae, 0x1f, 0x91, 0xe0, 0x60, 0x68, 0x4d, 0xeb, 0xe8, 0x2d, 0xc6, 0x7d, + 0xfa, 0xf6, 0xad, 0xc9, 0x23, 0xad, 0xc6, 0x0d, 0xa1, 0xed, 0xc3, 0xc0, 0xa3, 0xc1, 0x72, 0xd8, + 0xd1, 0x3b, 0xcb, 0x51, 0x75, 0x3d, 0x5f, 0x8e, 0x64, 0x77, 0x39, 0x42, 0x68, 0x6f, 0x48, 0x8e, + 0x39, 0xd7, 0x6b, 0x1f, 0xeb, 0x35, 0xc8, 0x05, 0x63, 0xe4, 0xa2, 0x39, 0xc8, 0x78, 0xfc, 0x37, + 0x1f, 0x72, 0xb9, 0xfb, 0x90, 0x0b, 0x32, 0x3e, 0xec, 0x3e, 0xa5, 0xfc, 0xef, 0x12, 0x00, 0x41, + 0x54, 0xff, 0x79, 0x8d, 0x28, 0x32, 0x9d, 0xf2, 0xc9, 0x2f, 0xb9, 0xaf, 0x02, 0x9a, 0x53, 0x87, + 0x46, 0xeb, 0x8f, 0x12, 0x30, 0x7a, 0x45, 0x64, 0xfe, 0xb7, 0x2d, 0x8c, 0x56, 0xa1, 0x1f, 0x9b, + 0x9e, 0x63, 0x50, 0x13, 0x13, 0x6f, 0x7d, 0xac, 0x9b, 0xb7, 0x76, 0xb0, 0x1a, 0xfd, 0xc8, 0x8e, + 0x38, 0xa6, 0xe2, 0x6c, 0x42, 0xb6, 0xfe, 0x78, 0x12, 0x0a, 0xdd, 0xa8, 0xd0, 0x2c, 0x0c, 0xeb, + 0x0e, 0xa6, 0x00, 0x35, 0xbc, 0x27, 0x5e, 0x2e, 0x06, 0x2b, 0x89, 0x16, 0x04, 0x59, 0x19, 0x12, + 0x10, 0x5e, 0x1b, 0xd4, 0x80, 0x94, 0xf9, 0x24, 0x64, 0x08, 0x56, 0x8f, 0x75, 0xbd, 0xcc, 0x8b, + 0x03, 0xd1, 0x49, 0x94, 0x01, 0xab, 0x0e, 0x86, 0x02, 0x28, 0x2d, 0x0f, 0x9e, 0x87, 0x61, 0xc3, + 0x34, 0x3c, 0x43, 0xab, 0xab, 0x1b, 0x5a, 0x5d, 0x33, 0xf5, 0xfd, 0xac, 0x92, 0xd8, 0x84, 0xce, + 0xbb, 0x6d, 0x61, 0x27, 0x2b, 0x43, 0x1c, 0x52, 0x66, 0x00, 0x74, 0x11, 0xfa, 0x45, 0x57, 0xa9, + 0x7d, 0xd5, 0x92, 0x82, 0x3c, 0x34, 0x22, 0x3f, 0x91, 0x84, 0x11, 0x05, 0x57, 0xdf, 0x1e, 0x8a, + 0xbd, 0x0d, 0xc5, 0x12, 0x00, 0x4b, 0x24, 0x64, 0x26, 0xd9, 0xc7, 0x68, 0x90, 0x54, 0x94, 0x65, + 0x1c, 0xe6, 0x5c, 0x2f, 0x34, 0x1e, 0x7f, 0x9c, 0x84, 0x81, 0xf0, 0x78, 0xbc, 0x3d, 0xc5, 0xff, + 0xe0, 0x4c, 0xf1, 0x68, 0x21, 0x48, 0x8d, 0x29, 0xfe, 0xb1, 0xd4, 0x2e, 0xa9, 0xb1, 0x2d, 0xa4, + 0xba, 0xe7, 0xc4, 0x3f, 0x4d, 0x40, 0xdf, 0xaa, 0xe6, 0x68, 0x0d, 0x17, 0xe9, 0x6d, 0x0b, 0x1b, + 0xb1, 0xb1, 0xdf, 0xf6, 0x95, 0x6b, 0xbe, 0x29, 0x16, 0xb3, 0xae, 0xf9, 0x64, 0x87, 0x75, 0xcd, + 0xbb, 0x61, 0xa8, 0xa1, 0x6d, 0x87, 0x0e, 0xc1, 0xe9, 0x60, 0x0e, 0x96, 0x0f, 0x05, 0x5c, 0xa2, + 0xcf, 0xd9, 0x76, 0xcd, 0xd5, 0xf0, 0x25, 0xa5, 0x1c, 0xc1, 0x08, 0x66, 0x09, 0x42, 0x3e, 0x1e, + 0xec, 0x8b, 0x84, 0x1e, 0xca, 0x0a, 0x34, 0xb4, 0xed, 0x0a, 0x6b, 0xa0, 0x45, 0x40, 0x5b, 0xfe, + 0xd6, 0x9c, 0x1a, 0x98, 0x92, 0xd0, 0x1f, 0xbd, 0x7d, 0x6b, 0xf2, 0x10, 0xa3, 0x6f, 0xc7, 0x91, + 0x95, 0x91, 0x00, 0x28, 0xb8, 0x9d, 0x02, 0x20, 0x7a, 0xa9, 0xec, 0x8a, 0x33, 0x5b, 0x5d, 0x1f, + 0xbc, 0x7d, 0x6b, 0x72, 0x84, 0x71, 0x09, 0x9e, 0xc9, 0x4a, 0x96, 0x34, 0xe6, 0xc8, 0xef, 0x90, + 0xe1, 0xbf, 0x28, 0x01, 0x0a, 0xe6, 0x20, 0x05, 0xbb, 0xb6, 0x65, 0xba, 0x74, 0xdd, 0x17, 0x5a, + 0xa4, 0x49, 0xbb, 0xaf, 0xfb, 0x02, 0x7a, 0xb1, 0xee, 0x0b, 0x85, 0xee, 0xb9, 0x20, 0x5f, 0x27, + 0xf8, 0x38, 0x76, 0xb8, 0x0f, 0x3e, 0x35, 0x6b, 0x19, 0x82, 0xba, 0x43, 0x82, 0xfe, 0x97, 0x12, + 0x1c, 0x6a, 0xf3, 0x26, 0x5f, 0xd8, 0xbf, 0x00, 0xc8, 0x09, 0x3d, 0xe4, 0x1f, 0xbd, 0x63, 0x42, + 0xef, 0xd9, 0x39, 0x47, 0x9c, 0xb6, 0x89, 0xe0, 0xce, 0x4d, 0x39, 0xec, 0x42, 0xf9, 0x3f, 0x95, + 0x60, 0x2c, 0xdc, 0xbd, 0xaf, 0xc8, 0x32, 0x0c, 0x84, 0x7b, 0xe7, 0x2a, 0xdc, 0xdf, 0x8b, 0x0a, + 0x5c, 0xfa, 0x08, 0x3d, 0x7a, 0x3a, 0x08, 0x55, 0xb6, 0x79, 0xfb, 0x78, 0xcf, 0xd6, 0x10, 0x32, + 0xb5, 0x86, 0x2c, 0xd3, 0xe0, 0xcf, 0x24, 0x48, 0xad, 0x5a, 0x56, 0x1d, 0x59, 0x30, 0x62, 0x5a, + 0x9e, 0x4a, 0x3c, 0x0b, 0x57, 0x55, 0xbe, 0xc7, 0xc3, 0x76, 0x75, 0x67, 0xf7, 0x66, 0xa4, 0xef, + 0xde, 0x9a, 0x6c, 0x67, 0xa5, 0x0c, 0x9b, 0x96, 0x57, 0xa6, 0x90, 0x75, 0xb6, 0x03, 0xf4, 0x01, + 0x18, 0x8c, 0x76, 0xc6, 0x76, 0xbc, 0x9e, 0xd9, 0x73, 0x67, 0x51, 0x36, 0xb7, 0x6f, 0x4d, 0x8e, + 0x05, 0x11, 0xe3, 0x83, 0x65, 0x65, 0x60, 0x23, 0xd4, 0x3b, 0xbb, 0xbf, 0xf9, 0x27, 0x9f, 0x9b, + 0x94, 0xca, 0x17, 0xba, 0x9e, 0xd0, 0x3c, 0xb2, 0xab, 0x08, 0xdb, 0xfe, 0x31, 0x43, 0xf4, 0x58, + 0xe6, 0x93, 0xa3, 0x30, 0xd9, 0xe5, 0x1c, 0xc2, 0xdb, 0xde, 0xd7, 0x11, 0x44, 0xcc, 0x19, 0x41, + 0xb1, 0xa7, 0x63, 0x0f, 0xf9, 0xf5, 0x14, 0xa0, 0x25, 0xb7, 0x36, 0x4b, 0xaa, 0x9a, 0xd0, 0x9d, + 0xc3, 0x96, 0x2d, 0x31, 0xe9, 0x0d, 0x6d, 0x89, 0x2d, 0x45, 0x36, 0x99, 0x12, 0x7b, 0xdb, 0xda, + 0xee, 0x79, 0xa7, 0x29, 0xf9, 0xa6, 0xec, 0x34, 0x75, 0x2e, 0x55, 0x52, 0xdf, 0xc7, 0x15, 0x53, + 0xfa, 0xcd, 0x59, 0x31, 0x8d, 0x43, 0x1f, 0xdf, 0x83, 0x66, 0xff, 0x22, 0x80, 0xb7, 0xd0, 0x69, + 0xf1, 0x65, 0xf5, 0xfe, 0xde, 0xb2, 0x3f, 0xc3, 0xe6, 0x79, 0xe6, 0xab, 0x49, 0xc8, 0x2f, 0xb9, + 0xb5, 0x4a, 0xd5, 0xf0, 0xee, 0x92, 0xef, 0xd9, 0xdd, 0x17, 0x99, 0xb3, 0xb7, 0x6f, 0x4d, 0x0e, + 0x31, 0x93, 0xdd, 0x49, 0x43, 0x35, 0x60, 0xb8, 0xe5, 0x38, 0x87, 0xbb, 0xe6, 0xdc, 0x7e, 0x4e, + 0x95, 0x5a, 0x58, 0xc9, 0x74, 0x5d, 0x10, 0x0a, 0x10, 0xb4, 0xdd, 0x39, 0x1a, 0xd8, 0x44, 0x76, + 0xf1, 0x6e, 0xee, 0xb9, 0xb2, 0x21, 0xfc, 0x5a, 0x02, 0x72, 0x4b, 0xae, 0x58, 0xe7, 0xe2, 0x3f, + 0xb7, 0x3b, 0x0a, 0x4f, 0xfa, 0x2f, 0x9c, 0x25, 0x7b, 0x0b, 0x84, 0xe8, 0x4b, 0x68, 0xdf, 0x4a, + 0xd2, 0x3c, 0x5c, 0xc6, 0x35, 0xc3, 0xf4, 0x27, 0x6b, 0xfc, 0xf6, 0xc2, 0xe8, 0x07, 0x68, 0x61, + 0x14, 0x8c, 0x70, 0x6a, 0x3f, 0x23, 0xfc, 0x5b, 0x09, 0x18, 0x5c, 0x72, 0x6b, 0x57, 0xcc, 0xea, + 0xdb, 0xa1, 0xf2, 0x46, 0x42, 0xe5, 0x8e, 0x97, 0x66, 0x5f, 0x4b, 0xc0, 0x89, 0x70, 0x2d, 0xf5, + 0x7c, 0x13, 0x3b, 0x3b, 0x7e, 0xb9, 0x64, 0x6b, 0x35, 0xc3, 0x0c, 0xdf, 0x9e, 0x39, 0x14, 0x16, + 0x96, 0xe2, 0x0a, 0x91, 0x65, 0x13, 0x72, 0xab, 0x5a, 0x0d, 0x2b, 0xf8, 0xf9, 0x26, 0x76, 0xbd, + 0x0e, 0xef, 0xc4, 0x8d, 0x43, 0x9f, 0xb5, 0xb9, 0x29, 0xae, 0xc6, 0xa5, 0x14, 0xde, 0x42, 0x63, + 0x90, 0xae, 0x1b, 0x0d, 0x83, 0x19, 0x24, 0xa5, 0xb0, 0x06, 0x9a, 0x84, 0x9c, 0x4e, 0xf4, 0x56, + 0xd9, 0xbb, 0x04, 0x29, 0xf1, 0xcd, 0x9f, 0xa6, 0xe9, 0xad, 0x13, 0x88, 0xfc, 0x14, 0x0c, 0xb0, + 0xfe, 0xf8, 0xfa, 0xe2, 0x10, 0x64, 0xe8, 0xdd, 0xef, 0xa0, 0xd7, 0x7e, 0xd2, 0xbe, 0xcc, 0xde, + 0x9f, 0x63, 0x5c, 0x58, 0xc7, 0xac, 0x51, 0x2e, 0x77, 0x35, 0xe5, 0xf1, 0xf8, 0x41, 0x66, 0x86, + 0xf2, 0xcd, 0xf8, 0x9b, 0x69, 0x38, 0xc8, 0xaf, 0xb5, 0x68, 0xb6, 0x31, 0xbd, 0xe5, 0x79, 0xe2, + 0xc5, 0x54, 0xe0, 0x0b, 0x7b, 0xcd, 0x36, 0xe4, 0x1d, 0x48, 0x5d, 0xf4, 0x3c, 0x1b, 0x9d, 0x80, + 0xb4, 0xd3, 0xac, 0x63, 0x71, 0x58, 0x30, 0x36, 0x15, 0xe0, 0x4c, 0x11, 0x04, 0xa5, 0x59, 0xc7, + 0x0a, 0x43, 0x41, 0x15, 0x98, 0xdc, 0x6c, 0xd6, 0xeb, 0x3b, 0x6a, 0x15, 0xd3, 0x7f, 0xc3, 0xe6, + 0xff, 0xc7, 0x13, 0xbc, 0x6d, 0x6b, 0xa6, 0x5f, 0x54, 0x66, 0x94, 0x23, 0x14, 0x6d, 0x8e, 0x62, + 0x89, 0xff, 0x76, 0x52, 0x11, 0x38, 0xf2, 0xef, 0x27, 0x20, 0x23, 0x58, 0xd3, 0x17, 0xda, 0x70, + 0x1d, 0xeb, 0x9e, 0x25, 0x2e, 0x28, 0xf8, 0x6d, 0x84, 0x20, 0x59, 0xe3, 0x43, 0x94, 0xbd, 0x78, + 0x40, 0x21, 0x0d, 0x02, 0xf3, 0x5f, 0x33, 0x24, 0x30, 0xbb, 0x49, 0x46, 0x2d, 0x65, 0x5b, 0x62, + 0x67, 0xec, 0xe2, 0x01, 0x85, 0xb6, 0x50, 0x01, 0xfa, 0x48, 0xb4, 0x79, 0xec, 0x5b, 0xb4, 0x04, + 0xce, 0xdb, 0x68, 0x1c, 0xd2, 0xb6, 0xe6, 0xe9, 0xec, 0xfe, 0x3f, 0x79, 0xc0, 0x9a, 0x24, 0x1e, + 0xd8, 0x37, 0x00, 0x5a, 0xff, 0xc7, 0x11, 0x31, 0x06, 0xfb, 0xd8, 0x22, 0x91, 0x7b, 0x55, 0xf3, + 0x3c, 0xec, 0x98, 0x84, 0x21, 0x43, 0xa7, 0xef, 0xae, 0x5a, 0xd5, 0x1d, 0xfe, 0x7f, 0x97, 0xe8, + 0x6f, 0xfe, 0x1f, 0x61, 0xa8, 0x3f, 0xa8, 0xf4, 0x21, 0xfb, 0x77, 0x73, 0x03, 0x02, 0x58, 0x26, + 0x48, 0x15, 0x18, 0xd5, 0xaa, 0x55, 0x83, 0x78, 0xb5, 0x56, 0x57, 0x37, 0x0c, 0xba, 0x71, 0xe2, + 0xd2, 0x7f, 0x26, 0xd8, 0x6d, 0x2c, 0x50, 0x40, 0x50, 0xe6, 0xf8, 0xe5, 0x2c, 0xf4, 0xdb, 0x4c, + 0x28, 0xf9, 0x3c, 0x8c, 0xb4, 0x49, 0x4a, 0xe4, 0xbb, 0x66, 0x98, 0x55, 0xf1, 0xee, 0x25, 0xf9, + 0x4d, 0x60, 0xf4, 0x83, 0xa9, 0xec, 0xea, 0x07, 0xfd, 0x5d, 0xfe, 0xb1, 0xee, 0x77, 0xc8, 0x86, + 0x42, 0x77, 0xc8, 0x34, 0xdb, 0x28, 0x67, 0x29, 0x7f, 0x7e, 0x75, 0x6c, 0x86, 0x3f, 0x60, 0xd7, + 0xc6, 0xa6, 0x2c, 0xa7, 0x36, 0x5d, 0xc3, 0xa6, 0x58, 0x29, 0x91, 0x47, 0x9a, 0x6d, 0xb8, 0xd4, + 0x1d, 0x83, 0x0f, 0xb8, 0xba, 0xe7, 0x43, 0xbf, 0xe9, 0x8d, 0xb2, 0xd4, 0xfc, 0xcc, 0xea, 0x82, + 0xef, 0xc7, 0xbf, 0x91, 0x80, 0x23, 0x21, 0x3f, 0x0e, 0x21, 0xb7, 0xbb, 0x73, 0xb1, 0xb3, 0xc7, + 0xf7, 0xf0, 0xf9, 0xd3, 0xcb, 0x90, 0x22, 0xf8, 0x28, 0xe6, 0xff, 0xb5, 0x14, 0x7e, 0xe9, 0x5f, + 0xfc, 0x63, 0x99, 0x3a, 0x45, 0xe7, 0x51, 0xa1, 0x4c, 0xca, 0x1f, 0xed, 0xdd, 0x7e, 0xf9, 0xe0, + 0xdb, 0xb5, 0xee, 0x9d, 0x33, 0x63, 0xab, 0x0d, 0x3f, 0x7b, 0x1e, 0xe4, 0x2e, 0xcb, 0x4f, 0x96, + 0x31, 0x77, 0x5f, 0xf0, 0xee, 0x21, 0x1d, 0x77, 0xbb, 0x9f, 0xb7, 0xdb, 0x08, 0xf6, 0xb8, 0x34, + 0xde, 0x86, 0xf1, 0xa7, 0x49, 0xdf, 0xc1, 0xa6, 0xa0, 0x48, 0xec, 0xe3, 0xfe, 0xcd, 0x19, 0x89, + 0xff, 0x2f, 0x47, 0x71, 0x0d, 0x06, 0x02, 0xf9, 0xf8, 0x42, 0xf7, 0x81, 0xa9, 0xae, 0xf3, 0xc5, + 0x54, 0x68, 0xb2, 0x50, 0x42, 0x94, 0xf2, 0x2f, 0x48, 0x70, 0x4f, 0x5b, 0xd7, 0x3c, 0xc7, 0xcf, + 0x77, 0x78, 0xf3, 0xb2, 0xe7, 0x3b, 0x7b, 0xe1, 0xb7, 0x30, 0xe7, 0x3b, 0x08, 0xfb, 0x60, 0xac, + 0xb0, 0x4c, 0x8a, 0x88, 0xb4, 0xcf, 0xc3, 0xc1, 0xa8, 0xb0, 0xc2, 0x4c, 0xcf, 0xc2, 0x50, 0xb4, + 0x80, 0xe0, 0xc5, 0xcd, 0x3e, 0xee, 0x5e, 0x0c, 0x46, 0x8a, 0x08, 0x59, 0x6d, 0x1d, 0x1a, 0xdf, + 0x3c, 0x15, 0xc8, 0xfa, 0xa8, 0x7c, 0xe9, 0xd8, 0xb3, 0x75, 0x02, 0x4a, 0xf9, 0x6b, 0x12, 0x1c, + 0x8b, 0xf6, 0x10, 0x2c, 0x7c, 0xdc, 0xbb, 0xae, 0xdf, 0x1d, 0x73, 0xa4, 0x57, 0x25, 0xb8, 0x77, + 0x17, 0x35, 0xb8, 0xcd, 0x6e, 0xc2, 0x58, 0x68, 0x77, 0x55, 0x4c, 0x14, 0xc2, 0xb9, 0x4e, 0xc4, + 0x6f, 0x0b, 0xfb, 0x9b, 0x89, 0x87, 0x89, 0x1d, 0xbf, 0xfc, 0xad, 0xc9, 0xd1, 0xf6, 0x67, 0xae, + 0x32, 0xda, 0xbe, 0x23, 0x7a, 0x07, 0xbd, 0xf0, 0x77, 0x25, 0x78, 0x28, 0xaa, 0x6a, 0x87, 0x33, + 0xd8, 0xb7, 0xd0, 0xd0, 0xfd, 0x07, 0x09, 0x4e, 0xf4, 0xa2, 0x0f, 0x1f, 0xc3, 0x0d, 0x18, 0x0d, + 0x8e, 0x45, 0x5a, 0x87, 0xf0, 0xe1, 0x3d, 0x1c, 0x6e, 0xf3, 0x58, 0x40, 0x3e, 0xb7, 0xbb, 0x30, + 0x56, 0xff, 0x4a, 0xe2, 0xf1, 0x1b, 0x76, 0x13, 0x7f, 0x60, 0xa2, 0x0b, 0x9e, 0x3d, 0x0e, 0x4c, + 0x68, 0xd1, 0x33, 0x18, 0x59, 0xf4, 0x74, 0x18, 0xf2, 0xc4, 0x1d, 0xca, 0x46, 0xd7, 0x79, 0xb6, + 0xee, 0x70, 0xce, 0xf2, 0x3e, 0x18, 0xed, 0x10, 0x5a, 0x3c, 0x31, 0xed, 0x21, 0xb2, 0x14, 0xd4, + 0x1e, 0x3c, 0xf2, 0xbf, 0x95, 0x60, 0x92, 0x76, 0xdc, 0x61, 0x18, 0xdf, 0xca, 0xf6, 0x6c, 0xf0, + 0xdc, 0xdb, 0x51, 0x2d, 0x6e, 0xd8, 0x05, 0xe8, 0x63, 0x1e, 0xca, 0x6d, 0xb9, 0x0f, 0x17, 0xe7, + 0x0c, 0x82, 0x5c, 0x3f, 0x27, 0xf4, 0xeb, 0x9c, 0x30, 0xee, 0x92, 0x1d, 0xef, 0x54, 0xc2, 0x78, + 0x59, 0xe4, 0xfa, 0xce, 0x6a, 0x70, 0xbb, 0xe9, 0x77, 0x2c, 0xd7, 0x33, 0x23, 0xbe, 0x49, 0x49, + 0xdd, 0xd7, 0x29, 0x26, 0xa9, 0xff, 0x80, 0x8f, 0x91, 0x9f, 0xd4, 0x63, 0xf4, 0x79, 0x2b, 0x26, + 0xf5, 0x3f, 0x4b, 0xc0, 0x21, 0xaa, 0x5b, 0xf8, 0xac, 0xf1, 0x4d, 0x18, 0x1b, 0x15, 0x90, 0xeb, + 0xe8, 0xea, 0x9d, 0xca, 0x45, 0x79, 0xd7, 0xd1, 0xaf, 0x46, 0x66, 0x74, 0x15, 0x50, 0xd5, 0xf5, + 0x5a, 0x3b, 0x48, 0xee, 0xbb, 0x83, 0xaa, 0xeb, 0x5d, 0xdd, 0xa5, 0x64, 0x48, 0xed, 0xdb, 0xbb, + 0xbe, 0x21, 0x41, 0xb1, 0xd3, 0x08, 0x70, 0x6f, 0x32, 0x60, 0x3c, 0x72, 0x8c, 0xde, 0xea, 0x50, + 0x8f, 0xf4, 0x72, 0x78, 0xdc, 0x12, 0xfe, 0x07, 0x1d, 0x7c, 0x57, 0x13, 0xc0, 0x3f, 0x17, 0x53, + 0x9c, 0x1f, 0x30, 0xed, 0xab, 0xb1, 0x1f, 0xfc, 0xb0, 0xff, 0xd5, 0xb6, 0x19, 0xe6, 0x2d, 0xb1, + 0xb0, 0xfb, 0xa6, 0x04, 0x13, 0x5d, 0xc4, 0x7e, 0x2b, 0x97, 0x17, 0x5b, 0x5d, 0x5d, 0xea, 0x4e, + 0xaf, 0x22, 0x4f, 0xf1, 0x78, 0x8c, 0xbe, 0xaa, 0x17, 0xda, 0x45, 0xe8, 0xf4, 0x55, 0x04, 0xf9, + 0x3d, 0x70, 0xb8, 0x23, 0x15, 0x97, 0xad, 0x04, 0xa9, 0x2d, 0xc3, 0xf5, 0xb8, 0x58, 0x0f, 0x74, + 0x13, 0xab, 0x85, 0x9a, 0xd2, 0xc8, 0x08, 0xf2, 0x94, 0xf5, 0xaa, 0x65, 0xd5, 0xb9, 0x18, 0xf2, + 0x65, 0x18, 0x09, 0xc1, 0x78, 0x27, 0x67, 0x20, 0x65, 0x5b, 0xfc, 0x3b, 0x60, 0xb9, 0x93, 0x47, + 0xba, 0x75, 0x42, 0x68, 0xb8, 0xda, 0x14, 0x5f, 0x1e, 0x03, 0xc4, 0x98, 0xd1, 0xbb, 0x5e, 0xa2, + 0x8b, 0x35, 0x18, 0x8d, 0x40, 0x79, 0x27, 0x3f, 0x04, 0x7d, 0x36, 0x85, 0xf8, 0x6f, 0x9b, 0x77, + 0xeb, 0x86, 0x62, 0xf9, 0x5f, 0x5e, 0xa2, 0xad, 0x93, 0xdf, 0x3d, 0x08, 0x69, 0xca, 0x15, 0x7d, + 0x4a, 0x02, 0x08, 0xdd, 0xdc, 0x9a, 0xea, 0xc6, 0xa6, 0xf3, 0x6e, 0x4e, 0x71, 0xba, 0x67, 0x7c, + 0x5e, 0x77, 0x9f, 0xf8, 0xb1, 0x7f, 0xf3, 0x9d, 0x9f, 0x4e, 0xdc, 0x8f, 0xe4, 0xe9, 0x2e, 0xfb, + 0x48, 0xa1, 0x60, 0xfc, 0x52, 0xe4, 0x23, 0x54, 0x8f, 0xf6, 0xd6, 0x95, 0x90, 0x6c, 0xaa, 0x57, + 0x74, 0x2e, 0xd8, 0x79, 0x2a, 0xd8, 0x69, 0xf4, 0x44, 0xbc, 0x60, 0xd3, 0xef, 0x8f, 0x46, 0xd7, + 0x07, 0xd1, 0x37, 0x25, 0x18, 0xeb, 0xb4, 0x4d, 0x80, 0xce, 0xf6, 0x26, 0x45, 0x7b, 0x41, 0x56, + 0x3c, 0xb7, 0x0f, 0x4a, 0xae, 0xca, 0x3c, 0x55, 0x65, 0x06, 0x3d, 0xb5, 0x0f, 0x55, 0xa6, 0x43, + 0xb3, 0x1f, 0xfa, 0xbf, 0x12, 0x1c, 0xdd, 0x75, 0x09, 0x8d, 0x66, 0x7a, 0x93, 0x72, 0x97, 0xca, + 0xb3, 0x58, 0x7e, 0x23, 0x2c, 0xb8, 0xc6, 0x4f, 0x53, 0x8d, 0x2f, 0xa3, 0x85, 0xfd, 0x68, 0x1c, + 0x94, 0x89, 0x61, 0xdd, 0x7f, 0x5b, 0x8a, 0xbc, 0x4e, 0xb1, 0xbb, 0x3b, 0xb5, 0xad, 0x1d, 0x63, + 0x02, 0xa3, 0x7d, 0x49, 0x20, 0x3f, 0x4b, 0x55, 0x50, 0xd0, 0xea, 0x1b, 0x1c, 0xb4, 0xe9, 0xf7, + 0x47, 0x27, 0x95, 0x0f, 0xa2, 0xff, 0x2d, 0x75, 0x7e, 0x7f, 0xe1, 0xc9, 0x5d, 0x45, 0xec, 0xbe, + 0x2e, 0x2e, 0x9e, 0xdd, 0x3b, 0x21, 0x57, 0xb2, 0x41, 0x95, 0xac, 0x21, 0x7c, 0xa7, 0x95, 0xec, + 0x38, 0x88, 0xe8, 0x77, 0x24, 0x18, 0xeb, 0xb4, 0xa2, 0x8b, 0x09, 0xcb, 0x5d, 0xd6, 0xb2, 0x31, + 0x61, 0xb9, 0xdb, 0xf2, 0x51, 0xfe, 0x21, 0xaa, 0xfc, 0x19, 0x74, 0xaa, 0x9b, 0xf2, 0xbb, 0x8e, + 0x22, 0x89, 0xc5, 0x5d, 0x57, 0x3e, 0x31, 0xb1, 0xd8, 0xcb, 0x2a, 0x30, 0x26, 0x16, 0x7b, 0x5a, + 0x78, 0xc5, 0xc7, 0xa2, 0xaf, 0x59, 0x8f, 0xc3, 0xe8, 0xa2, 0xdf, 0x90, 0x60, 0x30, 0x52, 0x97, + 0xa3, 0xc7, 0x77, 0x15, 0xb4, 0xd3, 0x2a, 0xaa, 0x78, 0x72, 0x2f, 0x24, 0x5c, 0x97, 0x05, 0xaa, + 0xcb, 0x2c, 0x9a, 0xd9, 0x8f, 0x2e, 0x4e, 0x44, 0xe2, 0x6f, 0x48, 0x30, 0xda, 0xa1, 0x84, 0x8d, + 0x89, 0xc2, 0xee, 0xa5, 0x7b, 0xf1, 0xec, 0xde, 0x09, 0xb9, 0x56, 0x17, 0xa8, 0x56, 0xef, 0x46, + 0xef, 0xda, 0x8f, 0x56, 0xa1, 0xf9, 0xf9, 0x56, 0x70, 0x3f, 0x3a, 0xd4, 0x0f, 0x3a, 0xb3, 0x47, + 0xc1, 0x84, 0x42, 0x4f, 0xee, 0x99, 0x8e, 0xeb, 0xf3, 0x0c, 0xd5, 0xe7, 0x69, 0xb4, 0xf2, 0xc6, + 0xf4, 0x69, 0x9f, 0xd6, 0xbf, 0xd2, 0xfe, 0xa9, 0x88, 0xdd, 0xbd, 0xa8, 0x63, 0xb1, 0x5a, 0x7c, + 0x62, 0x4f, 0x34, 0x5c, 0xa9, 0xb3, 0x54, 0xa9, 0x93, 0xe8, 0xb1, 0x6e, 0x4a, 0x85, 0x2e, 0xc1, + 0x1b, 0xe6, 0xa6, 0x35, 0xfd, 0x7e, 0x56, 0x02, 0x7f, 0x10, 0xfd, 0xa8, 0xb8, 0x80, 0x7c, 0x7c, + 0xd7, 0x7e, 0x43, 0x75, 0x6c, 0xf1, 0xa1, 0x1e, 0x30, 0xb9, 0x5c, 0xf7, 0x53, 0xb9, 0x26, 0xd0, + 0x91, 0x6e, 0x72, 0x91, 0x5a, 0x16, 0x7d, 0x4c, 0xf2, 0xdf, 0x59, 0x38, 0xb1, 0x3b, 0xef, 0x70, + 0xb1, 0x5b, 0x7c, 0xb8, 0x27, 0x5c, 0x2e, 0xc9, 0x03, 0x54, 0x92, 0x63, 0x68, 0xa2, 0xab, 0x24, + 0xac, 0xf4, 0xbd, 0xd3, 0x77, 0x5e, 0x3e, 0x9d, 0xe9, 0xfa, 0x59, 0x94, 0x1a, 0x36, 0xb1, 0x6b, + 0xb8, 0xfb, 0xba, 0x93, 0xdc, 0xdb, 0xc1, 0xea, 0x37, 0xd3, 0x30, 0x30, 0xcf, 0x7a, 0x59, 0xf3, + 0x34, 0xef, 0x0d, 0x2e, 0x04, 0x90, 0xcb, 0xbf, 0xb0, 0xc8, 0x3e, 0x0d, 0x1b, 0x7c, 0xec, 0x74, + 0x60, 0x4f, 0x1f, 0x0d, 0x60, 0x57, 0x20, 0xf9, 0xfb, 0xf9, 0xad, 0xfc, 0x64, 0xf6, 0xb1, 0x46, + 0x7a, 0xeb, 0x86, 0x7d, 0xd4, 0xf5, 0xc3, 0x12, 0x1c, 0xa4, 0x58, 0x41, 0xbc, 0x51, 0x4c, 0xf1, + 0x3e, 0x61, 0x57, 0x8f, 0x59, 0xd4, 0x42, 0xdb, 0x3f, 0xec, 0x33, 0xac, 0xf7, 0xf3, 0xd7, 0x5b, + 0x8e, 0x84, 0x3a, 0x6f, 0x65, 0x2b, 0x2b, 0xa3, 0xf5, 0x36, 0x4a, 0xb7, 0x65, 0xd3, 0x20, 0xb5, + 0xff, 0x4d, 0x83, 0x4b, 0x90, 0x0b, 0x65, 0xfa, 0x42, 0x3a, 0xe6, 0x15, 0xde, 0xd6, 0x9d, 0xc5, + 0x30, 0x31, 0xfa, 0xa8, 0x04, 0x07, 0x3b, 0x4e, 0x82, 0xf4, 0xff, 0xf7, 0xee, 0x71, 0xe7, 0xb2, + 0xc5, 0x38, 0x1d, 0xf9, 0xca, 0xca, 0x58, 0xb3, 0x53, 0x35, 0xb1, 0x0a, 0x83, 0x91, 0x09, 0xac, + 0x20, 0xfe, 0x0b, 0x77, 0xef, 0x2f, 0x5c, 0x44, 0x19, 0xa0, 0x22, 0x64, 0xf0, 0xb6, 0x6d, 0x39, + 0x1e, 0xae, 0xd2, 0xcb, 0x3a, 0x19, 0xc5, 0x6f, 0xcb, 0x37, 0x00, 0xb5, 0x0f, 0x2e, 0xba, 0xdc, + 0xf2, 0xdd, 0xe1, 0xfd, 0x6c, 0x60, 0xf8, 0x9f, 0x2a, 0x1e, 0x83, 0x74, 0xf8, 0x63, 0xbe, 0xac, + 0x71, 0xa7, 0x93, 0xc3, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x8c, 0x8b, 0x36, 0x50, 0x7f, 0x95, + 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) From b4393b4c6219db1f14643f174457c1c386cba26a Mon Sep 17 00:00:00 2001 From: blushi Date: Thu, 10 Sep 2020 12:25:26 +0200 Subject: [PATCH 032/128] Remove conversion functions and introduce internal PubKey type --- crypto/keys/keys.go | 59 ---------------- crypto/keys/keys_test.go | 128 ---------------------------------- crypto/keys/multisig.go | 8 +-- crypto/keys/multisig_test.go | 17 ++--- crypto/keys/secp256k1.go | 7 +- crypto/keys/secp256k1_test.go | 4 +- crypto/types/types.go | 21 +++++- 7 files changed, 37 insertions(+), 207 deletions(-) delete mode 100644 crypto/keys/keys.go delete mode 100644 crypto/keys/keys_test.go diff --git a/crypto/keys/keys.go b/crypto/keys/keys.go deleted file mode 100644 index 6c2c5e7fc7f7..000000000000 --- a/crypto/keys/keys.go +++ /dev/null @@ -1,59 +0,0 @@ -package keys - -import ( - fmt "fmt" - - "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - crypto "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" - proto "github.com/gogo/protobuf/proto" -) - -// ProtoPubKeyToAminoPubKey converts the proto.Message into a crypto.PubKey -func ProtoPubKeyToAminoPubKey(msg proto.Message) (crypto.PubKey, error) { - switch msg := msg.(type) { - case *Secp256K1PubKey: - return msg.GetKey(), nil - case *LegacyAminoMultisigThresholdPubKey: - keys := make([]crypto.PubKey, len(msg.PubKeys)) - for i, any := range msg.PubKeys { - cachedKey, ok := any.GetCachedValue().(proto.Message) - if !ok { - return nil, fmt.Errorf("can't proto marshal %T", any.GetCachedValue()) - } - key, err := ProtoPubKeyToAminoPubKey(cachedKey) - if err != nil { - return nil, err - } - keys[i] = key - } - return multisig.PubKeyMultisigThreshold{K: uint(msg.K), PubKeys: keys}, nil - default: - return nil, fmt.Errorf("unknown proto public key type: %v", msg) - } -} - -// AminoPubKeyToProtoPubKey converts the crypto.PubKey into a proto.Message -func AminoPubKeyToProtoPubKey(key crypto.PubKey) (proto.Message, error) { - switch key := key.(type) { - case secp256k1.PubKey: - return &Secp256K1PubKey{Key: key}, nil - case multisig.PubKeyMultisigThreshold: - keys := make([]*types.Any, len(key.PubKeys)) - for i, k := range key.PubKeys { - msg, err := AminoPubKeyToProtoPubKey(k) - if err != nil { - return nil, err - } - any, err := types.NewAnyWithValue(msg) - if err != nil { - return nil, err - } - keys[i] = any - } - return &LegacyAminoMultisigThresholdPubKey{K: uint32(key.K), PubKeys: keys}, nil - default: - return nil, fmt.Errorf("unknown public key type: %v", key) - } -} diff --git a/crypto/keys/keys_test.go b/crypto/keys/keys_test.go deleted file mode 100644 index 032d860fcbcf..000000000000 --- a/crypto/keys/keys_test.go +++ /dev/null @@ -1,128 +0,0 @@ -package keys_test - -import ( - "testing" - - "github.com/cosmos/cosmos-sdk/crypto/keys" - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - crypto "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" - "github.com/cosmos/cosmos-sdk/testutil/testdata" - proto "github.com/gogo/protobuf/proto" - "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/sr25519" -) - -func TestProtoPubKeyToAminoPubKey(t *testing.T) { - var ( - pbPubKey proto.Message - aminoPubKey crypto.PubKey - ) - testCases := []struct { - msg string - malleate func() - expectPass bool - }{ - { - "Secp256K1PubKey", - func() { - aminoPubKey = secp256k1.GenPrivKey().PubKey() - pbPubKey = &keys.Secp256K1PubKey{Key: aminoPubKey.(secp256k1.PubKey)} - }, - true, - }, - { - "LegacyAminoMultisigThresholdPubKey", - func() { - pubKey1 := secp256k1.GenPrivKey().PubKey() - pubKey2 := secp256k1.GenPrivKey().PubKey() - - pbPubKey1 := &keys.Secp256K1PubKey{Key: pubKey1.(secp256k1.PubKey)} - pbPubKey2 := &keys.Secp256K1PubKey{Key: pubKey2.(secp256k1.PubKey)} - anyPubKeys, err := packPubKeys([]crypto.PubKey{pbPubKey1, pbPubKey2}) - require.NoError(t, err) - - pbPubKey = &keys.LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys} - aminoPubKey = multisig.NewPubKeyMultisigThreshold(1, []crypto.PubKey{pubKey1, pubKey2}) - }, - true, - }, - { - "unknown type", - func() { - pbPubKey = &testdata.Dog{} - }, - false, - }, - } - - for _, tc := range testCases { - t.Run(tc.msg, func(t *testing.T) { - tc.malleate() - pubKey, err := keys.ProtoPubKeyToAminoPubKey(pbPubKey) - if tc.expectPass { - require.NoError(t, err) - require.Equal(t, aminoPubKey, pubKey) - } else { - require.Error(t, err) - } - }) - } -} - -func TestAminoPubKeyToProtoPubKey(t *testing.T) { - var ( - pbPubKey proto.Message - aminoPubKey crypto.PubKey - ) - testCases := []struct { - msg string - malleate func() - expectPass bool - }{ - { - "secp256k1.PubKey", - func() { - aminoPubKey = secp256k1.GenPrivKey().PubKey() - pbPubKey = &keys.Secp256K1PubKey{Key: aminoPubKey.(secp256k1.PubKey)} - }, - true, - }, - { - "multisig.PubKeyMultisigThreshold", - func() { - pubKey1 := secp256k1.GenPrivKey().PubKey() - pubKey2 := secp256k1.GenPrivKey().PubKey() - - pbPubKey1 := &keys.Secp256K1PubKey{Key: pubKey1.(secp256k1.PubKey)} - pbPubKey2 := &keys.Secp256K1PubKey{Key: pubKey2.(secp256k1.PubKey)} - anyPubKeys, err := packPubKeys([]crypto.PubKey{pbPubKey1, pbPubKey2}) - require.NoError(t, err) - - pbPubKey = &keys.LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys} - aminoPubKey = multisig.NewPubKeyMultisigThreshold(1, []crypto.PubKey{pubKey1, pubKey2}) - }, - true, - }, - { - "unknown type", - func() { - aminoPubKey = sr25519.GenPrivKey().PubKey() - }, - false, - }, - } - - for _, tc := range testCases { - t.Run(tc.msg, func(t *testing.T) { - tc.malleate() - pubKey, err := keys.AminoPubKeyToProtoPubKey(aminoPubKey) - if tc.expectPass { - require.NoError(t, err) - require.Equal(t, pbPubKey, pubKey) - } else { - require.Error(t, err) - } - }) - } -} diff --git a/crypto/keys/multisig.go b/crypto/keys/multisig.go index b069e7014b0a..8ed0aceb3dec 100644 --- a/crypto/keys/multisig.go +++ b/crypto/keys/multisig.go @@ -84,11 +84,11 @@ func (m *LegacyAminoMultisigThresholdPubKey) VerifySignature(msg []byte, sig []b } // GetPubKeys implements the PubKey.GetPubKeys method -func (m *LegacyAminoMultisigThresholdPubKey) GetPubKeys() []crypto.PubKey { +func (m *LegacyAminoMultisigThresholdPubKey) GetPubKeys() []tmcrypto.PubKey { if m != nil { - pubKeys := make([]crypto.PubKey, len(m.PubKeys)) + pubKeys := make([]tmcrypto.PubKey, len(m.PubKeys)) for i := 0; i < len(m.PubKeys); i++ { - pubKeys[i] = m.PubKeys[i].GetCachedValue().(crypto.PubKey) + pubKeys[i] = m.PubKeys[i].GetCachedValue().(tmcrypto.PubKey) } return pubKeys } @@ -98,7 +98,7 @@ func (m *LegacyAminoMultisigThresholdPubKey) GetPubKeys() []crypto.PubKey { // Equals returns true if m and other both have the same number of keys, and // all constituent keys are the same, and in the same order. -func (m *LegacyAminoMultisigThresholdPubKey) Equals(key crypto.PubKey) bool { +func (m *LegacyAminoMultisigThresholdPubKey) Equals(key tmcrypto.PubKey) bool { otherKey, ok := key.(multisig.PubKey) if !ok { return false diff --git a/crypto/keys/multisig_test.go b/crypto/keys/multisig_test.go index 0c66b8d01351..10b3db8ae61b 100644 --- a/crypto/keys/multisig_test.go +++ b/crypto/keys/multisig_test.go @@ -8,6 +8,7 @@ import ( crypto "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" proto "github.com/gogo/protobuf/proto" + tmcrypto "github.com/tendermint/tendermint/crypto" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/types/tx/signing" @@ -30,17 +31,17 @@ func TestEquals(t *testing.T) { pbPubKey1 := &keys.Secp256K1PubKey{Key: pubKey1.(secp256k1.PubKey)} pbPubKey2 := &keys.Secp256K1PubKey{Key: pubKey2.(secp256k1.PubKey)} - anyPubKeys, err := packPubKeys([]crypto.PubKey{pbPubKey1, pbPubKey2}) + anyPubKeys, err := packPubKeys([]tmcrypto.PubKey{pbPubKey1, pbPubKey2}) require.NoError(t, err) multisigKey := keys.LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys} - otherPubKeys, err := packPubKeys([]crypto.PubKey{pbPubKey1, &multisigKey}) + otherPubKeys, err := packPubKeys([]tmcrypto.PubKey{pbPubKey1, &multisigKey}) require.NoError(t, err) otherMultisigKey := keys.LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: otherPubKeys} testCases := []struct { msg string - other crypto.PubKey + other tmcrypto.PubKey expectEq bool }{ { @@ -70,7 +71,7 @@ func TestEquals(t *testing.T) { }, { "equals with amino pub key", - multisig.NewPubKeyMultisigThreshold(1, []crypto.PubKey{pubKey1, pubKey2}), + multisig.NewPubKeyMultisigThreshold(1, []tmcrypto.PubKey{pubKey1, pubKey2}), true, }, } @@ -177,8 +178,8 @@ func TestVerifyMultisignature(t *testing.T) { } } -func generatePubKeysAndSignatures(n int, msg []byte) (pubKeys []crypto.PubKey, signatures []signing.SignatureData) { - pubKeys = make([]crypto.PubKey, n) +func generatePubKeysAndSignatures(n int, msg []byte) (pubKeys []tmcrypto.PubKey, signatures []signing.SignatureData) { + pubKeys = make([]tmcrypto.PubKey, n) signatures = make([]signing.SignatureData, n) for i := 0; i < n; i++ { @@ -192,7 +193,7 @@ func generatePubKeysAndSignatures(n int, msg []byte) (pubKeys []crypto.PubKey, s } func generateNestedMultiSignature(n int, msg []byte) (multisig.PubKey, *signing.MultiSignatureData, error) { - pubKeys := make([]crypto.PubKey, n) + pubKeys := make([]tmcrypto.PubKey, n) signatures := make([]signing.SignatureData, n) bitArray := crypto.NewCompactBitArray(n) for i := 0; i < n; i++ { @@ -223,7 +224,7 @@ func generateNestedMultiSignature(n int, msg []byte) (multisig.PubKey, *signing. }, nil } -func packPubKeys(pubKeys []crypto.PubKey) ([]*types.Any, error) { +func packPubKeys(pubKeys []tmcrypto.PubKey) ([]*types.Any, error) { anyPubKeys := make([]*types.Any, len(pubKeys)) for i := 0; i < len(pubKeys); i++ { diff --git a/crypto/keys/secp256k1.go b/crypto/keys/secp256k1.go index 1f01e4140fc7..0cc4b7294c59 100644 --- a/crypto/keys/secp256k1.go +++ b/crypto/keys/secp256k1.go @@ -3,6 +3,7 @@ package keys import ( "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" crypto "github.com/cosmos/cosmos-sdk/crypto/types" + tmcrypto "github.com/tendermint/tendermint/crypto" ) // asserting interface implementation @@ -23,7 +24,7 @@ func (m *Secp256K1PubKey) VerifySignature(msg []byte, sig []byte) bool { return m.Key.VerifySignature(msg, sig) } -func (m *Secp256K1PubKey) Equals(key crypto.PubKey) bool { +func (m *Secp256K1PubKey) Equals(key tmcrypto.PubKey) bool { return m.Key.Equals(key) } @@ -39,11 +40,11 @@ func (m *Secp256K1PrivKey) Sign(msg []byte) ([]byte, error) { return m.Key.Sign(msg) } -func (m *Secp256K1PrivKey) PubKey() crypto.PubKey { +func (m *Secp256K1PrivKey) PubKey() tmcrypto.PubKey { return &Secp256K1PubKey{Key: m.Key.PubKey().(secp256k1.PubKey)} } -func (m *Secp256K1PrivKey) Equals(key crypto.PrivKey) bool { +func (m *Secp256K1PrivKey) Equals(key tmcrypto.PrivKey) bool { return m.Key.Equals(key) } diff --git a/crypto/keys/secp256k1_test.go b/crypto/keys/secp256k1_test.go index a4a1d8e4739e..8aff46258446 100644 --- a/crypto/keys/secp256k1_test.go +++ b/crypto/keys/secp256k1_test.go @@ -19,7 +19,7 @@ func TestPubKeyEquals(t *testing.T) { testCases := []struct { msg string pubKey crypto.PubKey - other crypto.PubKey + other tmcrypto.PubKey expectEq bool }{ { @@ -73,7 +73,7 @@ func TestPrivKeyEquals(t *testing.T) { testCases := []struct { msg string privKey crypto.PrivKey - other crypto.PrivKey + other tmcrypto.PrivKey expectEq bool }{ { diff --git a/crypto/types/types.go b/crypto/types/types.go index d0ac48f8ff5b..f6873b5e7565 100644 --- a/crypto/types/types.go +++ b/crypto/types/types.go @@ -1,9 +1,24 @@ package types -import tmcrypto "github.com/tendermint/tendermint/crypto" +import ( + proto "github.com/gogo/protobuf/proto" + tmcrypto "github.com/tendermint/tendermint/crypto" +) + +// PubKey interface extends proto.Message +// and tendermint crypto.PubKey +type PubKey interface { + proto.Message + tmcrypto.PubKey +} + +// PrivKey interface extends proto.Message +// and tendermint crypto.PrivKey +type PrivKey interface { + proto.Message + tmcrypto.PrivKey +} type ( - PubKey = tmcrypto.PubKey - PrivKey = tmcrypto.PrivKey Address = tmcrypto.Address ) From b67f9d42b7b2bec292fca8b4ec68ac7d2ef19b65 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 10 Sep 2020 16:21:35 +0200 Subject: [PATCH 033/128] Override Amino marshaling for proto pubkeys --- codec/amino.go | 1 + codec/codec.go | 9 ++++++ crypto/keys/secp256k1.go | 54 +++++++++++++++++++++++++++++++++-- crypto/keys/secp256k1_test.go | 47 ++++++++++++++++++++++++++++++ go.mod | 2 +- go.sum | 3 ++ 6 files changed, 113 insertions(+), 3 deletions(-) diff --git a/codec/amino.go b/codec/amino.go index f34713a9b0f0..d0e78bab5e1d 100644 --- a/codec/amino.go +++ b/codec/amino.go @@ -156,6 +156,7 @@ func (cdc *LegacyAmino) MustMarshalJSON(o interface{}) []byte { } func (cdc *LegacyAmino) UnmarshalJSON(bz []byte, ptr interface{}) error { + fmt.Println(bz, ptr) err := cdc.Amino.UnmarshalJSON(bz, ptr) if err != nil { return err diff --git a/codec/codec.go b/codec/codec.go index a0bf5a598b9d..0e501aa105c7 100644 --- a/codec/codec.go +++ b/codec/codec.go @@ -54,4 +54,13 @@ type ( Size() int Unmarshal(data []byte) error } + + // AminoMarshaler defines an interface where Amino marshalling can be + // overriden by custom marshalling. + AminoMarshaler interface { + MarshalAmino() ([]byte, error) + UnmarshalAmino([]byte) error + MarshalAminoJSON() ([]byte, error) + UnmarshalAminoJSON([]byte) error + } ) diff --git a/crypto/keys/secp256k1.go b/crypto/keys/secp256k1.go index 0cc4b7294c59..681339f8f34f 100644 --- a/crypto/keys/secp256k1.go +++ b/crypto/keys/secp256k1.go @@ -1,6 +1,7 @@ package keys import ( + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" crypto "github.com/cosmos/cosmos-sdk/crypto/types" tmcrypto "github.com/tendermint/tendermint/crypto" @@ -8,8 +9,9 @@ import ( // asserting interface implementation var ( - _ crypto.PubKey = &Secp256K1PubKey{} - _ crypto.PrivKey = &Secp256K1PrivKey{} + _ crypto.PubKey = &Secp256K1PubKey{} + _ crypto.PrivKey = &Secp256K1PrivKey{} + _ codec.AminoMarshaler = &Secp256K1PrivKey{} ) func (m *Secp256K1PubKey) Address() crypto.Address { @@ -32,6 +34,30 @@ func (m *Secp256K1PubKey) Type() string { return m.Key.Type() } +// MarshalAminoJSON overrides Amino binary marshalling. +func (m *Secp256K1PubKey) MarshalAmino() ([]byte, error) { + return m.Key.Bytes(), nil +} + +// UnmarshalAminoJSON overrides Amino binary marshalling. +func (m *Secp256K1PubKey) UnmarshalAmino(bz []byte) error { + *m = Secp256K1PubKey{ + Key: bz, + } + + return nil +} + +// MarshalAminoJSON overrides Amino JSON marshalling. +func (m *Secp256K1PubKey) MarshalAminoJSON() ([]byte, error) { + return m.MarshalAmino() +} + +// UnmarshalAminoJSON overrides Amino JSON marshalling. +func (m *Secp256K1PubKey) UnmarshalAminoJSON(bz []byte) error { + return m.UnmarshalAmino(bz) +} + func (m *Secp256K1PrivKey) Bytes() []byte { return m.Key.Bytes() } @@ -51,3 +77,27 @@ func (m *Secp256K1PrivKey) Equals(key tmcrypto.PrivKey) bool { func (m *Secp256K1PrivKey) Type() string { return m.Key.Type() } + +// MarshalAminoJSON overrides Amino binary marshalling. +func (m Secp256K1PrivKey) MarshalAmino() ([]byte, error) { + return m.Key.Bytes(), nil +} + +// UnmarshalAminoJSON overrides Amino binary marshalling. +func (m *Secp256K1PrivKey) UnmarshalAmino(bz []byte) error { + *m = Secp256K1PrivKey{ + Key: bz, + } + + return nil +} + +// MarshalAminoJSON overrides Amino JSON marshalling. +func (m Secp256K1PrivKey) MarshalAminoJSON() ([]byte, error) { + return m.MarshalAmino() +} + +// UnmarshalAminoJSON overrides Amino JSON marshalling. +func (m *Secp256K1PrivKey) UnmarshalAminoJSON(bz []byte) error { + return m.UnmarshalAmino(bz) +} diff --git a/crypto/keys/secp256k1_test.go b/crypto/keys/secp256k1_test.go index 8aff46258446..b08e5572cf3f 100644 --- a/crypto/keys/secp256k1_test.go +++ b/crypto/keys/secp256k1_test.go @@ -3,6 +3,7 @@ package keys_test import ( "testing" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" crypto "github.com/cosmos/cosmos-sdk/crypto/types" @@ -147,3 +148,49 @@ func TestSignAndVerifySignature(t *testing.T) { } } + +func TestMarshalAmino(t *testing.T) { + aminoCdc := codec.NewLegacyAmino() + privKey := secp256k1.GenPrivKey() + + testCases := []struct { + desc string + msg codec.AminoMarshaler + expBinary []byte + expJSON []byte + }{ + { + "secp256k1 private key", + &keys.Secp256K1PrivKey{Key: privKey}, + append([]byte{32}, privKey.Bytes()...), // Length-prefixed. + append([]byte{32}, privKey.Bytes()...), // Length-prefixed. + }, + } + + for _, tc := range testCases { + t.Run(tc.desc, func(t *testing.T) { + // Do a round trip of encoding/decoding binary. + bz, err := aminoCdc.MarshalBinaryBare(tc.msg) + require.NoError(t, err) + require.Equal(t, tc.expBinary, bz) + + newMsg := new(keys.Secp256K1PrivKey) + err = aminoCdc.UnmarshalBinaryBare(bz, newMsg) + require.NoError(t, err) + + require.Equal(t, tc.msg, newMsg) + + // Do a round trip of encoding/decoding JSON. + bz, err = aminoCdc.MarshalJSON(tc.msg) + require.NoError(t, err) + require.Equal(t, tc.expJSON, bz) + + newMsg = new(keys.Secp256K1PrivKey) + err = aminoCdc.UnmarshalJSON(bz, newMsg) + require.NoError(t, err) + + require.Equal(t, tc.msg, newMsg) + }) + } + +} diff --git a/go.mod b/go.mod index e659c413e8c1..6bebf5be4f44 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/stretchr/testify v1.6.1 github.com/tendermint/btcd v0.1.1 github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 - github.com/tendermint/go-amino v0.15.1 + github.com/tendermint/go-amino v0.15.1-0.20200910131452-a7241d6f4149 github.com/tendermint/tendermint v0.34.0-rc3.0.20200907055413-3359e0bf2f84 github.com/tendermint/tm-db v0.6.2 golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a diff --git a/go.sum b/go.sum index 768ac7075048..33d0fbd484a7 100644 --- a/go.sum +++ b/go.sum @@ -562,6 +562,7 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH 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/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= @@ -576,6 +577,8 @@ github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s github.com/tendermint/btcd v0.1.1/go.mod h1:DC6/m53jtQzr/NFmMNEu0rxf18/ktVoVtMrnDD5pN+U= github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RMWx1aInLzndwxKalgi5rTqgfXxOxbEI= github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15/go.mod h1:z4YtwM70uOnk8h0pjJYlj3zdYwi9l03By6iAIF5j/Pk= +github.com/tendermint/go-amino v0.15.1-0.20200910131452-a7241d6f4149 h1:PtWgyl8pihuorbaRgsjoc3YrC4hqHjNG9l6oRI5Sgtg= +github.com/tendermint/go-amino v0.15.1-0.20200910131452-a7241d6f4149/go.mod h1:odo+dN1h2dkEoTFQaN/Qmdb4FAdvIu/E4YwijJJOeYc= github.com/tendermint/go-amino v0.15.1 h1:D2uk35eT4iTsvJd9jWIetzthE5C0/k2QmMFkCN+4JgQ= github.com/tendermint/go-amino v0.15.1/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/tendermint/tendermint v0.33.8 h1:Xxu4QhpqcomSE0iQDw1MqLgfsa8fqtPtWFJK6zZOVso= From 08cd25add8451d9ab3f64c741dc42080037b9e11 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Tue, 8 Sep 2020 16:34:12 +0200 Subject: [PATCH 034/128] Merge master --- baseapp/grpcrouter.go | 4 +- client/grpc/simulate/simulate.go | 7 +- client/grpc/simulate/simulate_test.go | 4 +- client/tx/legacy_test.go | 3 +- crypto/types/codec.go | 15 --- crypto/types/multisig/threshold_pubkey.go | 2 +- .../adr-020-protobuf-transaction-encoding.md | 4 +- proto/cosmos/tx/signing/v1beta1/signing.proto | 76 ++++++------ proto/cosmos/tx/v1beta1/tx.proto | 2 +- .../solomachine/v1/solomachine.proto | 17 ++- simapp/app.go | 3 +- simapp/params/proto.go | 3 +- std/pubkey.go | 105 ----------------- std/pubkey_test.go | 44 ------- types/tx/signing/signing.pb.go | 82 ++++++------- types/tx/tx.pb.go | 110 +++++++++--------- x/auth/tx/builder.go | 55 ++++----- x/auth/tx/builder_test.go | 13 +-- x/auth/tx/config.go | 13 +-- x/auth/tx/config_test.go | 4 +- x/auth/tx/decoder.go | 44 +------ x/auth/tx/direct_test.go | 8 +- x/auth/tx/encode_decode_test.go | 11 +- x/auth/tx/legacy_amino_json_test.go | 7 +- x/auth/tx/sigs.go | 14 +-- .../solomachine/types/consensus_state.go | 8 +- .../light-clients/solomachine/types/header.go | 8 +- .../solomachine/types/solomachine.pb.go | 71 +++++++++++ x/ibc/testing/solomachine.go | 6 +- 29 files changed, 292 insertions(+), 451 deletions(-) delete mode 100644 crypto/types/codec.go delete mode 100644 std/pubkey.go delete mode 100644 std/pubkey_test.go diff --git a/baseapp/grpcrouter.go b/baseapp/grpcrouter.go index ea750980e273..a32da6758120 100644 --- a/baseapp/grpcrouter.go +++ b/baseapp/grpcrouter.go @@ -12,7 +12,6 @@ import ( "github.com/cosmos/cosmos-sdk/client/grpc/reflection" "github.com/cosmos/cosmos-sdk/client/grpc/simulate" codectypes "github.com/cosmos/cosmos-sdk/codec/types" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -116,10 +115,9 @@ func (qrt *GRPCQueryRouter) SetInterfaceRegistry(interfaceRegistry codectypes.In func (qrt *GRPCQueryRouter) RegisterSimulateService( simulateFn simulate.BaseAppSimulateFn, interfaceRegistry codectypes.InterfaceRegistry, - pubkeyCodec cryptotypes.PublicKeyCodec, ) { simulate.RegisterSimulateServiceServer( qrt, - simulate.NewSimulateServer(simulateFn, interfaceRegistry, pubkeyCodec), + simulate.NewSimulateServer(simulateFn, interfaceRegistry), ) } diff --git a/client/grpc/simulate/simulate.go b/client/grpc/simulate/simulate.go index 9f9fd1acfb91..eee54583cb4b 100644 --- a/client/grpc/simulate/simulate.go +++ b/client/grpc/simulate/simulate.go @@ -7,7 +7,6 @@ import ( "google.golang.org/grpc/status" codectypes "github.com/cosmos/cosmos-sdk/codec/types" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" ) @@ -18,15 +17,13 @@ type BaseAppSimulateFn func(txBytes []byte, txtypes sdk.Tx) (sdk.GasInfo, *sdk.R type simulateServer struct { simulate BaseAppSimulateFn interfaceRegistry codectypes.InterfaceRegistry - pubkeyCodec cryptotypes.PublicKeyCodec } // NewSimulateServer creates a new SimulateServer. -func NewSimulateServer(simulate BaseAppSimulateFn, interfaceRegistry codectypes.InterfaceRegistry, pubkeyCodec cryptotypes.PublicKeyCodec) SimulateServiceServer { +func NewSimulateServer(simulate BaseAppSimulateFn, interfaceRegistry codectypes.InterfaceRegistry) SimulateServiceServer { return simulateServer{ simulate: simulate, interfaceRegistry: interfaceRegistry, - pubkeyCodec: pubkeyCodec, } } @@ -42,7 +39,7 @@ func (s simulateServer) Simulate(ctx context.Context, req *SimulateRequest) (*Si if err != nil { return nil, err } - txBuilder := authtx.WrapTx(req.Tx, s.pubkeyCodec) + txBuilder := authtx.WrapTx(req.Tx) txBytes, err := req.Tx.Marshal() if err != nil { return nil, err diff --git a/client/grpc/simulate/simulate_test.go b/client/grpc/simulate/simulate_test.go index 390b5b52e433..43ab4f51e958 100644 --- a/client/grpc/simulate/simulate_test.go +++ b/client/grpc/simulate/simulate_test.go @@ -12,7 +12,6 @@ import ( "github.com/cosmos/cosmos-sdk/client/grpc/simulate" "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/simapp" - "github.com/cosmos/cosmos-sdk/std" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/tx/signing" @@ -39,11 +38,10 @@ func (s *IntegrationTestSuite) SetupSuite() { // Set up TxConfig. encodingConfig := simapp.MakeEncodingConfig() - pubKeyCodec := std.DefaultPublicKeyCodec{} clientCtx := client.Context{}.WithTxConfig(encodingConfig.TxConfig) // Create new simulation server. - srv := simulate.NewSimulateServer(app.BaseApp.Simulate, encodingConfig.InterfaceRegistry, pubKeyCodec) + srv := simulate.NewSimulateServer(app.BaseApp.Simulate, encodingConfig.InterfaceRegistry) queryHelper := baseapp.NewQueryServerTestHelper(sdkCtx, app.InterfaceRegistry()) simulate.RegisterSimulateServiceServer(queryHelper, srv) diff --git a/client/tx/legacy_test.go b/client/tx/legacy_test.go index 86e506a9eab8..b4db101f2fcf 100644 --- a/client/tx/legacy_test.go +++ b/client/tx/legacy_test.go @@ -14,7 +14,6 @@ import ( tx2 "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/simapp" - "github.com/cosmos/cosmos-sdk/std" "github.com/cosmos/cosmos-sdk/x/auth/tx" types3 "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -65,7 +64,7 @@ type TestSuite struct { func (s *TestSuite) SetupSuite() { encCfg := simapp.MakeEncodingConfig() s.encCfg = encCfg - s.protoCfg = tx.NewTxConfig(codec.NewProtoCodec(encCfg.InterfaceRegistry), std.DefaultPublicKeyCodec{}, tx.DefaultSignModes) + s.protoCfg = tx.NewTxConfig(codec.NewProtoCodec(encCfg.InterfaceRegistry), tx.DefaultSignModes) s.aminoCfg = types3.StdTxConfig{Cdc: encCfg.Amino} } diff --git a/crypto/types/codec.go b/crypto/types/codec.go deleted file mode 100644 index 2796d71744b3..000000000000 --- a/crypto/types/codec.go +++ /dev/null @@ -1,15 +0,0 @@ -package types - -import ( - "github.com/tendermint/tendermint/crypto" -) - -// PublicKeyCodec defines a type which can encode and decode crypto.PubKey's -// to and from protobuf PublicKey's -type PublicKeyCodec interface { - // Encode encodes the crypto.PubKey as a protobuf PublicKey or returns an error - Encode(key crypto.PubKey) (*PublicKey, error) - - // Decode decodes a crypto.PubKey from a protobuf PublicKey or returns an error - Decode(key *PublicKey) (crypto.PubKey, error) -} diff --git a/crypto/types/multisig/threshold_pubkey.go b/crypto/types/multisig/threshold_pubkey.go index 7a3c410b7b30..dfad7776a208 100644 --- a/crypto/types/multisig/threshold_pubkey.go +++ b/crypto/types/multisig/threshold_pubkey.go @@ -22,7 +22,7 @@ func NewPubKeyMultisigThreshold(k int, pubkeys []crypto.PubKey) PubKey { if k <= 0 { panic("threshold k of n multisignature: k <= 0") } - if len(pubkeys) < k { + if len(pubkeys) < int(k) { panic("threshold k of n multisignature: len(pubkeys) < k") } for _, pubkey := range pubkeys { diff --git a/docs/architecture/adr-020-protobuf-transaction-encoding.md b/docs/architecture/adr-020-protobuf-transaction-encoding.md index cdea6817ec8b..4f879552c567 100644 --- a/docs/architecture/adr-020-protobuf-transaction-encoding.md +++ b/docs/architecture/adr-020-protobuf-transaction-encoding.md @@ -13,7 +13,7 @@ ## Status -Proposed +Accepted ## Context @@ -103,7 +103,7 @@ message AuthInfo { message SignerInfo { // The public key is optional for accounts that already exist in state. If unset, the // verifier can use the required signer address for this position and lookup the public key. - PublicKey public_key = 1; + google.protobuf.Any public_key = 1; // ModeInfo describes the signing mode of the signer and is a nested // structure to support nested multisig pubkey's ModeInfo mode_info = 2; diff --git a/proto/cosmos/tx/signing/v1beta1/signing.proto b/proto/cosmos/tx/signing/v1beta1/signing.proto index bb99a7415025..b49b6d94b156 100644 --- a/proto/cosmos/tx/signing/v1beta1/signing.proto +++ b/proto/cosmos/tx/signing/v1beta1/signing.proto @@ -2,6 +2,7 @@ syntax = "proto3"; package cosmos.tx.signing.v1beta1; import "cosmos/base/crypto/v1beta1/crypto.proto"; +import "google/protobuf/any.proto"; option go_package = "github.com/cosmos/cosmos-sdk/types/tx/signing"; @@ -33,43 +34,44 @@ message SignatureDescriptors { // signature including the public key of the signer, signing modes and the signature // itself. It is primarily used for coordinating signatures between clients. message SignatureDescriptor { - // public_key is the public key of the signer - cosmos.base.crypto.v1beta1.PublicKey public_key = 1; - - Data data = 2; - - // sequence is the sequence of the account, which describes the - // number of committed transactions signed by a given address. It is used to prevent - // replay attacks. - uint64 sequence = 3; - - // Data represents signature data - message Data { - // sum is the oneof that specifies whether this represents single or multi-signature data - oneof sum { - // single represents a single signer - Single single = 1; - - // multi represents a multisig signer - Multi multi = 2; - } - - // Single is the signature data for a single signer - message Single { - // mode is the signing mode of the single signer - SignMode mode = 1; - - // signature is the raw signature bytes - bytes signature = 2; - } - - // Multi is the signature data for a multisig public key - message Multi { - // bitarray specifies which keys within the multisig are signing - cosmos.base.crypto.v1beta1.CompactBitArray bitarray = 1; - - // signatures is the signatures of the multi-signature - repeated Data signatures = 2; + // public_key is the public key of the signer + google.protobuf.Any public_key = 1; + + Data data = 2; + + // sequence is the sequence of the account, which describes the + // number of committed transactions signed by a given address. It is used to prevent + // replay attacks. + uint64 sequence = 3; + + // Data represents signature data + message Data { + // sum is the oneof that specifies whether this represents single or multi-signature data + oneof sum { + // single represents a single signer + Single single = 1; + + // multi represents a multisig signer + Multi multi = 2; + } + + // Single is the signature data for a single signer + message Single { + // mode is the signing mode of the single signer + SignMode mode = 1; + + // signature is the raw signature bytes + bytes signature = 2; + } + + // Multi is the signature data for a multisig public key + message Multi { + // bitarray specifies which keys within the multisig are signing + cosmos.base.crypto.v1beta1.CompactBitArray bitarray = 1; + + // signatures is the signatures of the multi-signature + repeated Data signatures = 2; + } } } } diff --git a/proto/cosmos/tx/v1beta1/tx.proto b/proto/cosmos/tx/v1beta1/tx.proto index 398950488921..1a3b21e05a71 100644 --- a/proto/cosmos/tx/v1beta1/tx.proto +++ b/proto/cosmos/tx/v1beta1/tx.proto @@ -103,7 +103,7 @@ message SignerInfo { // public_key is the public key of the signer. It is optional for accounts // that already exist in state. If unset, the verifier can use the required \ // signer address for this position and lookup the public key. - cosmos.base.crypto.v1beta1.PublicKey public_key = 1; + google.protobuf.Any public_key = 1; // mode_info describes the signing mode of the signer and is a nested // structure to support nested multisig pubkey's diff --git a/proto/ibc/lightclients/solomachine/v1/solomachine.proto b/proto/ibc/lightclients/solomachine/v1/solomachine.proto index 7f04e9133a73..6d55eb6995d2 100644 --- a/proto/ibc/lightclients/solomachine/v1/solomachine.proto +++ b/proto/ibc/lightclients/solomachine/v1/solomachine.proto @@ -28,22 +28,19 @@ message ClientState { message ConsensusState { option (gogoproto.goproto_getters) = false; // public key of the solo machine - cosmos.base.crypto.v1beta1.PublicKey public_key = 1 [(gogoproto.moretags) = "yaml:\"public_key\""]; - // diversifier allows the same public key to be re-used across different solo machine clients - // (potentially on different chains) without being considered misbehaviour. - string diversifier = 2; - uint64 timestamp = 3; + google.protobuf.Any public_key = 2 + [(gogoproto.moretags) = "yaml:\"public_key\""]; + uint64 timestamp = 3; } // Header defines a solo machine consensus header message Header { option (gogoproto.goproto_getters) = false; // sequence to update solo machine public key at - uint64 sequence = 1; - uint64 timestamp = 2; - bytes signature = 3; - cosmos.base.crypto.v1beta1.PublicKey new_public_key = 4 [(gogoproto.moretags) = "yaml:\"new_public_key\""]; - string new_diversifier = 5 [(gogoproto.moretags) = "yaml:\"new_diversifier\""]; + uint64 sequence = 1; + bytes signature = 2; + google.protobuf.Any new_public_key = 3 + [(gogoproto.moretags) = "yaml:\"new_public_key\""]; } // Misbehaviour defines misbehaviour for a solo machine which consists diff --git a/simapp/app.go b/simapp/app.go index 5f225ccc6563..3317a6461428 100644 --- a/simapp/app.go +++ b/simapp/app.go @@ -16,7 +16,6 @@ import ( "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/server/api" simappparams "github.com/cosmos/cosmos-sdk/simapp/params" - "github.com/cosmos/cosmos-sdk/std" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" @@ -185,7 +184,7 @@ func NewSimApp( bApp.SetCommitMultiStoreTracer(traceStore) bApp.SetAppVersion(version.Version) bApp.GRPCQueryRouter().SetInterfaceRegistry(interfaceRegistry) - bApp.GRPCQueryRouter().RegisterSimulateService(bApp.Simulate, interfaceRegistry, std.DefaultPublicKeyCodec{}) + bApp.GRPCQueryRouter().RegisterSimulateService(bApp.Simulate, interfaceRegistry) keys := sdk.NewKVStoreKeys( authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey, diff --git a/simapp/params/proto.go b/simapp/params/proto.go index 20d3a3af9046..7bcdffe40505 100644 --- a/simapp/params/proto.go +++ b/simapp/params/proto.go @@ -5,7 +5,6 @@ package params import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/std" "github.com/cosmos/cosmos-sdk/x/auth/tx" ) @@ -14,7 +13,7 @@ func MakeEncodingConfig() EncodingConfig { amino := codec.NewLegacyAmino() interfaceRegistry := types.NewInterfaceRegistry() marshaler := codec.NewProtoCodec(interfaceRegistry) - txCfg := tx.NewTxConfig(marshaler, std.DefaultPublicKeyCodec{}, tx.DefaultSignModes) + txCfg := tx.NewTxConfig(marshaler, tx.DefaultSignModes) return EncodingConfig{ InterfaceRegistry: interfaceRegistry, diff --git a/std/pubkey.go b/std/pubkey.go deleted file mode 100644 index 72f71933af4e..000000000000 --- a/std/pubkey.go +++ /dev/null @@ -1,105 +0,0 @@ -package std - -import ( - "fmt" - - "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" - "github.com/tendermint/tendermint/crypto/sr25519" - - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" -) - -// DefaultPublicKeyCodec implements the standard PublicKeyCodec for the SDK which -// supports a standard set of public key types -type DefaultPublicKeyCodec struct{} - -var _ types.PublicKeyCodec = DefaultPublicKeyCodec{} - -// Decode implements the PublicKeyCodec.Decode method -func (cdc DefaultPublicKeyCodec) Decode(key *types.PublicKey) (crypto.PubKey, error) { - // key being nil is allowed as all fields in proto are optional - if key == nil { - return nil, nil - } - if key.Sum == nil { - return nil, nil - } - switch key := key.Sum.(type) { - case *types.PublicKey_Secp256K1: - n := len(key.Secp256K1) - if n != secp256k1.PubKeySize { - return nil, fmt.Errorf("wrong length %d for secp256k1 public key", n) - } - - res := make(secp256k1.PubKey, secp256k1.PubKeySize) - copy(res, key.Secp256K1) - return res, nil - case *types.PublicKey_Ed25519: - n := len(key.Ed25519) - if n != ed25519.PubKeySize { - return nil, fmt.Errorf("wrong length %d for ed25519 public key", n) - } - - res := make(ed25519.PubKey, ed25519.PubKeySize) - copy(res, key.Ed25519) - return res, nil - case *types.PublicKey_Sr25519: - n := len(key.Sr25519) - if n != sr25519.PubKeySize { - return nil, fmt.Errorf("wrong length %d for sr25519 public key", n) - } - - res := make(sr25519.PubKey, sr25519.PubKeySize) - copy(res, key.Sr25519) - - return res, nil - case *types.PublicKey_Multisig: - pubKeys := key.Multisig.PubKeys - resKeys := make([]crypto.PubKey, len(pubKeys)) - for i, k := range pubKeys { - dk, err := cdc.Decode(k) - if err != nil { - return nil, err - } - resKeys[i] = dk - } - - return multisig.NewPubKeyMultisigThreshold(int(key.Multisig.K), resKeys), nil - default: - return nil, fmt.Errorf("can't decode PubKey of type %T. Use a custom PublicKeyCodec instead", key) - } -} - -// Encode implements the PublicKeyCodec.Encode method -func (cdc DefaultPublicKeyCodec) Encode(key crypto.PubKey) (*types.PublicKey, error) { - if key == nil { - return &types.PublicKey{}, nil - } - switch key := key.(type) { - case secp256k1.PubKey: - return &types.PublicKey{Sum: &types.PublicKey_Secp256K1{Secp256K1: key}}, nil - case ed25519.PubKey: - return &types.PublicKey{Sum: &types.PublicKey_Ed25519{Ed25519: key}}, nil - case sr25519.PubKey: - return &types.PublicKey{Sum: &types.PublicKey_Sr25519{Sr25519: key}}, nil - case multisig.PubKeyMultisigThreshold: - pubKeys := key.PubKeys - resKeys := make([]*types.PublicKey, len(pubKeys)) - for i, k := range pubKeys { - dk, err := cdc.Encode(k) - if err != nil { - return nil, err - } - resKeys[i] = dk - } - return &types.PublicKey{Sum: &types.PublicKey_Multisig{Multisig: &types.PubKeyMultisigThreshold{ - K: uint32(key.K), - PubKeys: resKeys, - }}}, nil - default: - return nil, fmt.Errorf("can't encode PubKey of type %T. Use a custom PublicKeyCodec instead", key) - } -} diff --git a/std/pubkey_test.go b/std/pubkey_test.go deleted file mode 100644 index 302ba2238799..000000000000 --- a/std/pubkey_test.go +++ /dev/null @@ -1,44 +0,0 @@ -package std_test - -import ( - "testing" - - "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" - "github.com/tendermint/tendermint/crypto/sr25519" - - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" - "github.com/cosmos/cosmos-sdk/std" -) - -func roundTripTest(t *testing.T, pubKey crypto.PubKey) { - cdc := std.DefaultPublicKeyCodec{} - - pubKeyEnc, err := cdc.Encode(pubKey) - require.NoError(t, err) - pubKeyDec, err := cdc.Decode(pubKeyEnc) - require.NoError(t, err) - require.Equal(t, pubKey, pubKeyDec) -} - -func TestDefaultPublicKeyCodec(t *testing.T) { - roundTripTest(t, nil) - - roundTripTest(t, crypto.PubKey(nil)) - - pubKeySecp256k1 := secp256k1.GenPrivKey().PubKey() - roundTripTest(t, pubKeySecp256k1) - - pubKeyEd25519 := ed25519.GenPrivKey().PubKey() - roundTripTest(t, pubKeyEd25519) - - pubKeySr25519 := sr25519.GenPrivKey().PubKey() - roundTripTest(t, pubKeySr25519) - - pubKeyMultisig := multisig.NewPubKeyMultisigThreshold(2, []crypto.PubKey{ - pubKeySecp256k1, pubKeyEd25519, pubKeySr25519, - }) - roundTripTest(t, pubKeyMultisig) -} diff --git a/types/tx/signing/signing.pb.go b/types/tx/signing/signing.pb.go index c9a04ac233b6..c7e95c6eec61 100644 --- a/types/tx/signing/signing.pb.go +++ b/types/tx/signing/signing.pb.go @@ -5,7 +5,8 @@ package signing import ( fmt "fmt" - types "github.com/cosmos/cosmos-sdk/crypto/types" + types "github.com/cosmos/cosmos-sdk/codec/types" + types1 "github.com/cosmos/cosmos-sdk/crypto/types" proto "github.com/gogo/protobuf/proto" io "io" math "math" @@ -113,7 +114,7 @@ func (m *SignatureDescriptors) GetSignatures() []*SignatureDescriptor { // itself. It is primarily used for coordinating signatures between clients. type SignatureDescriptor struct { // public_key is the public key of the signer - PublicKey *types.PublicKey `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + PublicKey *types.Any `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` Data *SignatureDescriptor_Data `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` // sequence is the sequence of the account, which describes the // number of committed transactions signed by a given address. It is used to prevent @@ -154,7 +155,7 @@ func (m *SignatureDescriptor) XXX_DiscardUnknown() { var xxx_messageInfo_SignatureDescriptor proto.InternalMessageInfo -func (m *SignatureDescriptor) GetPublicKey() *types.PublicKey { +func (m *SignatureDescriptor) GetPublicKey() *types.Any { if m != nil { return m.PublicKey } @@ -321,7 +322,7 @@ func (m *SignatureDescriptor_Data_Single) GetSignature() []byte { // Multi is the signature data for a multisig public key type SignatureDescriptor_Data_Multi struct { // bitarray specifies which keys within the multisig are signing - Bitarray *types.CompactBitArray `protobuf:"bytes,1,opt,name=bitarray,proto3" json:"bitarray,omitempty"` + Bitarray *types1.CompactBitArray `protobuf:"bytes,1,opt,name=bitarray,proto3" json:"bitarray,omitempty"` // signatures is the signatures of the multi-signature Signatures []*SignatureDescriptor_Data `protobuf:"bytes,2,rep,name=signatures,proto3" json:"signatures,omitempty"` } @@ -359,7 +360,7 @@ func (m *SignatureDescriptor_Data_Multi) XXX_DiscardUnknown() { var xxx_messageInfo_SignatureDescriptor_Data_Multi proto.InternalMessageInfo -func (m *SignatureDescriptor_Data_Multi) GetBitarray() *types.CompactBitArray { +func (m *SignatureDescriptor_Data_Multi) GetBitarray() *types1.CompactBitArray { if m != nil { return m.Bitarray } @@ -387,40 +388,41 @@ func init() { } var fileDescriptor_9a54958ff3d0b1b9 = []byte{ - // 525 bytes of a gzipped FileDescriptorProto + // 543 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0xcd, 0x6e, 0xd3, 0x40, - 0x10, 0xc7, 0xed, 0xe6, 0x43, 0xe9, 0x14, 0xa1, 0xb0, 0xb4, 0x52, 0x1a, 0x90, 0x89, 0x8a, 0x10, - 0x11, 0xa8, 0xb6, 0x9a, 0x1e, 0x10, 0xdc, 0x92, 0xd8, 0xa4, 0x81, 0x26, 0x29, 0x76, 0x2a, 0x01, - 0x17, 0x6b, 0xed, 0x2c, 0x61, 0xd5, 0xd8, 0x6b, 0xbc, 0x6b, 0xd4, 0x9c, 0x90, 0x78, 0x02, 0x5e, - 0x82, 0xe7, 0xe0, 0xca, 0xb1, 0x47, 0x8e, 0x28, 0x79, 0x11, 0x14, 0x7f, 0x24, 0x41, 0x2a, 0x20, - 0x72, 0xb2, 0x67, 0x76, 0xe6, 0xf7, 0xff, 0xaf, 0x66, 0x77, 0xe1, 0xa1, 0xcb, 0xb8, 0xc7, 0xb8, - 0x26, 0x2e, 0x35, 0x4e, 0xc7, 0x3e, 0xf5, 0xc7, 0xda, 0xc7, 0x23, 0x87, 0x08, 0x7c, 0x94, 0xc5, - 0x6a, 0x10, 0x32, 0xc1, 0xd0, 0x7e, 0x52, 0xa8, 0x8a, 0x4b, 0x35, 0x5b, 0x48, 0x0b, 0xab, 0x19, - 0xc3, 0xc1, 0x9c, 0x68, 0x6e, 0x38, 0x0d, 0x04, 0x5b, 0x42, 0x92, 0x30, 0x61, 0x1c, 0xbc, 0x83, - 0x5d, 0x8b, 0x8e, 0x7d, 0x2c, 0xa2, 0x90, 0xe8, 0x84, 0xbb, 0x21, 0x0d, 0x04, 0x0b, 0x39, 0xea, - 0x03, 0xf0, 0x2c, 0xcf, 0x2b, 0x72, 0x2d, 0x57, 0xdf, 0x69, 0xa8, 0xea, 0x1f, 0x05, 0xd5, 0x6b, - 0x20, 0xe6, 0x1a, 0xe1, 0xe0, 0x73, 0x01, 0x6e, 0x5f, 0x53, 0x83, 0x74, 0x80, 0x20, 0x72, 0x26, - 0xd4, 0xb5, 0x2f, 0xc8, 0xb4, 0x22, 0xd7, 0xe4, 0xfa, 0x4e, 0xe3, 0x41, 0xa6, 0xb3, 0x70, 0xaf, - 0xa6, 0x76, 0x33, 0xa1, 0xb3, 0xb8, 0xfa, 0x25, 0x99, 0x9a, 0xdb, 0x41, 0xf6, 0x8b, 0x3a, 0x90, - 0x1f, 0x61, 0x81, 0x2b, 0x5b, 0x71, 0xff, 0xf1, 0xff, 0xf9, 0x54, 0x75, 0x2c, 0xb0, 0x19, 0x03, - 0x50, 0x15, 0x4a, 0x9c, 0x7c, 0x88, 0x88, 0xef, 0x92, 0x4a, 0xae, 0x26, 0xd7, 0xf3, 0xe6, 0x32, - 0xae, 0x7e, 0xcb, 0x41, 0x7e, 0x51, 0x8a, 0x86, 0x50, 0xe4, 0xd4, 0x1f, 0x4f, 0x48, 0xea, 0xf7, - 0xd9, 0x06, 0x7a, 0xaa, 0x15, 0x13, 0x4e, 0x24, 0x33, 0x65, 0xa1, 0x57, 0x50, 0xf0, 0xa2, 0x89, - 0xa0, 0xe9, 0x26, 0x9e, 0x6e, 0x02, 0xed, 0x2d, 0x00, 0x27, 0x92, 0x99, 0x90, 0xaa, 0x36, 0x14, - 0x13, 0x19, 0xf4, 0x04, 0xf2, 0x1e, 0x1b, 0x25, 0x86, 0x6f, 0x36, 0xee, 0xff, 0x83, 0xdd, 0x63, - 0x23, 0x62, 0xc6, 0x0d, 0xe8, 0x2e, 0x6c, 0x2f, 0xa7, 0x18, 0x3b, 0xbb, 0x61, 0xae, 0x12, 0xd5, - 0xaf, 0x32, 0x14, 0x62, 0x4d, 0xd4, 0x81, 0x92, 0x43, 0x05, 0x0e, 0x43, 0x9c, 0x4d, 0xf1, 0xf1, - 0xdf, 0xa6, 0xd8, 0x66, 0x5e, 0x80, 0x5d, 0xd1, 0xa2, 0xa2, 0xb9, 0x68, 0x31, 0x97, 0xcd, 0xc8, - 0xfa, 0xed, 0xe0, 0x6d, 0xc5, 0x07, 0x6f, 0xa3, 0x81, 0xae, 0x61, 0x5a, 0x05, 0xc8, 0xf1, 0xc8, - 0x7b, 0xc4, 0xa1, 0x94, 0x6d, 0x0f, 0xed, 0xc3, 0x9e, 0xd5, 0xed, 0xf4, 0xed, 0xde, 0x40, 0x37, - 0xec, 0xf3, 0xbe, 0x75, 0x66, 0xb4, 0xbb, 0xcf, 0xbb, 0x86, 0x5e, 0x96, 0xd0, 0x2e, 0x94, 0x57, - 0x4b, 0x7a, 0xd7, 0x34, 0xda, 0xc3, 0xb2, 0x8c, 0xf6, 0xe0, 0xd6, 0x2a, 0x3b, 0x34, 0x5e, 0x0f, - 0xcf, 0x9b, 0xa7, 0xe5, 0x2d, 0x74, 0x0f, 0xee, 0xac, 0xd2, 0xa7, 0x46, 0xa7, 0xd9, 0x7e, 0x63, - 0x37, 0x7b, 0xdd, 0xfe, 0xc0, 0x7e, 0x61, 0x0d, 0xfa, 0xe5, 0x4f, 0xad, 0xce, 0xf7, 0x99, 0x22, - 0x5f, 0xcd, 0x14, 0xf9, 0xe7, 0x4c, 0x91, 0xbf, 0xcc, 0x15, 0xe9, 0x6a, 0xae, 0x48, 0x3f, 0xe6, - 0x8a, 0xf4, 0xf6, 0x70, 0x4c, 0xc5, 0xfb, 0xc8, 0x51, 0x5d, 0xe6, 0x69, 0xe9, 0x7d, 0x4d, 0x3e, - 0x87, 0x7c, 0x74, 0xa1, 0x89, 0x69, 0x40, 0xd6, 0x1f, 0x01, 0xa7, 0x18, 0xdf, 0xd8, 0xe3, 0x5f, - 0x01, 0x00, 0x00, 0xff, 0xff, 0x05, 0x81, 0x3c, 0x0b, 0x20, 0x04, 0x00, 0x00, + 0x10, 0xc7, 0xed, 0x26, 0xad, 0xd2, 0x29, 0x42, 0x61, 0x49, 0xa5, 0xc4, 0x20, 0x13, 0x95, 0x03, + 0x11, 0xa8, 0x6b, 0x35, 0x39, 0x20, 0xb8, 0xe5, 0xc3, 0xa4, 0x81, 0x26, 0x01, 0x3b, 0x95, 0x80, + 0x8b, 0x65, 0x3b, 0x5b, 0x63, 0x35, 0xf6, 0x1a, 0xef, 0x1a, 0xd5, 0x27, 0x5e, 0x81, 0x97, 0xe0, + 0x39, 0xb8, 0x72, 0xec, 0x91, 0x23, 0x4a, 0x9e, 0x80, 0x37, 0x40, 0xf1, 0x47, 0x12, 0xa4, 0x22, + 0x44, 0x4e, 0xd1, 0xcc, 0xfc, 0xe7, 0x37, 0xff, 0xd5, 0x4c, 0x0c, 0x8f, 0x6c, 0xca, 0x3c, 0xca, + 0x14, 0x7e, 0xa5, 0x30, 0xd7, 0xf1, 0x5d, 0xdf, 0x51, 0x3e, 0x9d, 0x58, 0x84, 0x9b, 0x27, 0x79, + 0x8c, 0x83, 0x90, 0x72, 0x8a, 0x6a, 0xa9, 0x10, 0xf3, 0x2b, 0x9c, 0x17, 0x32, 0xa1, 0x94, 0x33, + 0x2c, 0x93, 0x11, 0xc5, 0x0e, 0xe3, 0x80, 0xd3, 0x15, 0x24, 0x0d, 0x53, 0x86, 0x54, 0x73, 0x28, + 0x75, 0x66, 0x44, 0x49, 0x22, 0x2b, 0xba, 0x50, 0x4c, 0x3f, 0x4e, 0x4b, 0x47, 0x17, 0x50, 0xd1, + 0x5d, 0xc7, 0x37, 0x79, 0x14, 0x92, 0x1e, 0x61, 0x76, 0xe8, 0x06, 0x9c, 0x86, 0x0c, 0x8d, 0x00, + 0x58, 0x9e, 0x67, 0x55, 0xb1, 0x5e, 0x68, 0x1c, 0x34, 0x31, 0xfe, 0xab, 0x17, 0x7c, 0x03, 0x44, + 0xdb, 0x20, 0x1c, 0xfd, 0x2a, 0xc2, 0xdd, 0x1b, 0x34, 0xa8, 0x05, 0x10, 0x44, 0xd6, 0xcc, 0xb5, + 0x8d, 0x4b, 0x12, 0x57, 0xc5, 0xba, 0xd8, 0x38, 0x68, 0x56, 0x70, 0xea, 0x17, 0xe7, 0x7e, 0x71, + 0xdb, 0x8f, 0xb5, 0xfd, 0x54, 0xf7, 0x8a, 0xc4, 0xa8, 0x0f, 0xc5, 0xa9, 0xc9, 0xcd, 0xea, 0x4e, + 0x22, 0x6f, 0xfd, 0x9f, 0x2d, 0xdc, 0x33, 0xb9, 0xa9, 0x25, 0x00, 0x24, 0x41, 0x89, 0x91, 0x8f, + 0x11, 0xf1, 0x6d, 0x52, 0x2d, 0xd4, 0xc5, 0x46, 0x51, 0x5b, 0xc5, 0xd2, 0xb7, 0x02, 0x14, 0x97, + 0x52, 0x34, 0x81, 0x3d, 0xe6, 0xfa, 0xce, 0x8c, 0x64, 0xf6, 0x9e, 0x6f, 0x31, 0x0f, 0xeb, 0x09, + 0xe1, 0x54, 0xd0, 0x32, 0x16, 0x7a, 0x03, 0xbb, 0x5e, 0x34, 0xe3, 0x6e, 0xf6, 0x88, 0x67, 0xdb, + 0x40, 0x87, 0x4b, 0xc0, 0xa9, 0xa0, 0xa5, 0x24, 0xc9, 0x80, 0xbd, 0x74, 0x0c, 0x7a, 0x0a, 0x45, + 0x8f, 0x4e, 0x53, 0xc3, 0xb7, 0x9b, 0x0f, 0xff, 0xc1, 0x1e, 0xd2, 0x29, 0xd1, 0x92, 0x06, 0x74, + 0x1f, 0xf6, 0x57, 0x4b, 0x4b, 0x9c, 0xdd, 0xd2, 0xd6, 0x09, 0xe9, 0xab, 0x08, 0xbb, 0xc9, 0x4c, + 0xd4, 0x87, 0x92, 0xe5, 0x72, 0x33, 0x0c, 0xcd, 0x7c, 0x69, 0x4f, 0xf2, 0x21, 0xcb, 0x6b, 0xc4, + 0xd9, 0xf9, 0xe5, 0x53, 0xba, 0xd4, 0x0b, 0x4c, 0x9b, 0x77, 0x5c, 0xde, 0x5e, 0xb6, 0x68, 0xab, + 0x66, 0xa4, 0xff, 0x71, 0x67, 0x3b, 0xc9, 0x9d, 0x6d, 0xb5, 0xd0, 0x0d, 0x4c, 0x67, 0x17, 0x0a, + 0x2c, 0xf2, 0x1e, 0x33, 0x28, 0xe5, 0xcf, 0x43, 0x35, 0x38, 0xd4, 0x07, 0xfd, 0x91, 0x31, 0x1c, + 0xf7, 0x54, 0xe3, 0x7c, 0xa4, 0xbf, 0x56, 0xbb, 0x83, 0x17, 0x03, 0xb5, 0x57, 0x16, 0x50, 0x05, + 0xca, 0xeb, 0x52, 0x6f, 0xa0, 0xa9, 0xdd, 0x49, 0x59, 0x44, 0x87, 0x70, 0x67, 0x9d, 0x9d, 0xa8, + 0x6f, 0x27, 0xe7, 0xed, 0xb3, 0xf2, 0x0e, 0x7a, 0x00, 0xf7, 0xd6, 0xe9, 0x33, 0xb5, 0xdf, 0xee, + 0xbe, 0x33, 0xda, 0xc3, 0xc1, 0x68, 0x6c, 0xbc, 0xd4, 0xc7, 0xa3, 0xf2, 0xe7, 0x4e, 0xff, 0xfb, + 0x5c, 0x16, 0xaf, 0xe7, 0xb2, 0xf8, 0x73, 0x2e, 0x8b, 0x5f, 0x16, 0xb2, 0x70, 0xbd, 0x90, 0x85, + 0x1f, 0x0b, 0x59, 0x78, 0x7f, 0xec, 0xb8, 0xfc, 0x43, 0x64, 0x61, 0x9b, 0x7a, 0x4a, 0xf6, 0xcf, + 0x4d, 0x7f, 0x8e, 0xd9, 0xf4, 0x52, 0xe1, 0x71, 0x40, 0x36, 0x3f, 0x07, 0xd6, 0x5e, 0x72, 0xfd, + 0xad, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xd1, 0x38, 0x12, 0x3c, 0x2a, 0x04, 0x00, 0x00, } func (m *SignatureDescriptors) Marshal() (dAtA []byte, err error) { @@ -939,7 +941,7 @@ func (m *SignatureDescriptor) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.PublicKey == nil { - m.PublicKey = &types.PublicKey{} + m.PublicKey = &types.Any{} } if err := m.PublicKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -1312,7 +1314,7 @@ func (m *SignatureDescriptor_Data_Multi) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Bitarray == nil { - m.Bitarray = &types.CompactBitArray{} + m.Bitarray = &types1.CompactBitArray{} } if err := m.Bitarray.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err diff --git a/types/tx/tx.pb.go b/types/tx/tx.pb.go index b2265028f0aa..68bb723b38cc 100644 --- a/types/tx/tx.pb.go +++ b/types/tx/tx.pb.go @@ -394,7 +394,7 @@ type SignerInfo struct { // public_key is the public key of the signer. It is optional for accounts // that already exist in state. If unset, the verifier can use the required \ // signer address for this position and lookup the public key. - PublicKey *types1.PublicKey `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + PublicKey *types.Any `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` // mode_info describes the signing mode of the signer and is a nested // structure to support nested multisig pubkey's ModeInfo *ModeInfo `protobuf:"bytes,2,opt,name=mode_info,json=modeInfo,proto3" json:"mode_info,omitempty"` @@ -437,7 +437,7 @@ func (m *SignerInfo) XXX_DiscardUnknown() { var xxx_messageInfo_SignerInfo proto.InternalMessageInfo -func (m *SignerInfo) GetPublicKey() *types1.PublicKey { +func (m *SignerInfo) GetPublicKey() *types.Any { if m != nil { return m.PublicKey } @@ -724,59 +724,59 @@ func init() { func init() { proto.RegisterFile("cosmos/tx/v1beta1/tx.proto", fileDescriptor_96d1575ffde80842) } var fileDescriptor_96d1575ffde80842 = []byte{ - // 823 bytes of a gzipped FileDescriptorProto + // 817 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0x4f, 0x6f, 0xdc, 0x44, - 0x14, 0x5f, 0xef, 0x6e, 0x36, 0xde, 0x97, 0xa4, 0xa5, 0xa3, 0x0a, 0x6d, 0x36, 0xaa, 0x1b, 0x8c, - 0x02, 0x2b, 0xa1, 0xda, 0x6d, 0x38, 0xf0, 0x47, 0x48, 0x90, 0x6d, 0x29, 0xa9, 0xa0, 0x80, 0x26, - 0x39, 0xf5, 0x62, 0x8d, 0xbd, 0x13, 0xef, 0xa8, 0xeb, 0x99, 0xc5, 0x33, 0x2e, 0xf6, 0x27, 0xe0, - 0x02, 0x12, 0x42, 0xe2, 0x3b, 0x20, 0x3e, 0x49, 0x8f, 0x3d, 0x72, 0x40, 0x80, 0x92, 0x0f, 0x02, - 0x9a, 0xf1, 0xd8, 0x0d, 0x25, 0xda, 0xbd, 0x70, 0xda, 0x79, 0x6f, 0x7e, 0xbf, 0xdf, 0xfb, 0xed, - 0x7b, 0xf3, 0x0c, 0xe3, 0x44, 0xc8, 0x4c, 0xc8, 0x50, 0x95, 0xe1, 0xb3, 0x7b, 0x31, 0x55, 0xe4, - 0x5e, 0xa8, 0xca, 0x60, 0x99, 0x0b, 0x25, 0xd0, 0x8d, 0xfa, 0x2e, 0x50, 0x65, 0x60, 0xef, 0xc6, - 0x37, 0x53, 0x91, 0x0a, 0x73, 0x1b, 0xea, 0x53, 0x0d, 0x1c, 0xbf, 0x6d, 0x45, 0x62, 0x22, 0x69, - 0x98, 0xe4, 0xd5, 0x52, 0x89, 0x56, 0xad, 0x0e, 0x2d, 0xd0, 0xbb, 0x0c, 0x6c, 0x11, 0x82, 0xf1, - 0x57, 0x84, 0x54, 0x19, 0x4a, 0x96, 0x72, 0xc6, 0xd3, 0x16, 0x65, 0x63, 0x0b, 0xdc, 0x4d, 0x85, - 0x48, 0x17, 0x34, 0x34, 0x51, 0x5c, 0x9c, 0x85, 0x84, 0x57, 0xf5, 0x95, 0xff, 0x83, 0x03, 0xdd, - 0xd3, 0x12, 0xdd, 0x81, 0x7e, 0x2c, 0x66, 0xd5, 0xc8, 0xd9, 0x77, 0x26, 0x5b, 0x87, 0xbb, 0xc1, - 0x7f, 0xfe, 0x4b, 0x70, 0x5a, 0x4e, 0xc5, 0xac, 0xc2, 0x06, 0x86, 0xde, 0x87, 0x21, 0x29, 0xd4, - 0x3c, 0x62, 0xfc, 0x4c, 0x8c, 0xba, 0x86, 0xb3, 0x77, 0x05, 0xe7, 0xa8, 0x50, 0xf3, 0x47, 0xfc, - 0x4c, 0x60, 0x97, 0xd8, 0x13, 0xf2, 0x00, 0xb4, 0x37, 0xa2, 0x8a, 0x9c, 0xca, 0x51, 0x6f, 0xbf, - 0x37, 0xd9, 0xc6, 0x97, 0x32, 0x3e, 0x87, 0x8d, 0xd3, 0x12, 0x93, 0x6f, 0xd1, 0x2d, 0x00, 0x5d, - 0x2a, 0x8a, 0x2b, 0x45, 0xa5, 0xf1, 0xb5, 0x8d, 0x87, 0x3a, 0x33, 0xd5, 0x09, 0xf4, 0x16, 0x5c, - 0x6f, 0x1d, 0x58, 0x4c, 0xd7, 0x60, 0x76, 0x9a, 0x52, 0x35, 0x6e, 0x5d, 0xbd, 0x9f, 0x1c, 0xd8, - 0x3c, 0x61, 0x29, 0x7f, 0x20, 0x92, 0xff, 0xab, 0xe4, 0x2e, 0xb8, 0xc9, 0x9c, 0x30, 0x1e, 0xb1, - 0xd9, 0xa8, 0xb7, 0xef, 0x4c, 0x86, 0x78, 0xd3, 0xc4, 0x8f, 0x66, 0xe8, 0x00, 0xae, 0x91, 0x24, - 0x11, 0x05, 0x57, 0x11, 0x2f, 0xb2, 0x98, 0xe6, 0xa3, 0xfe, 0xbe, 0x33, 0xe9, 0xe3, 0x1d, 0x9b, - 0xfd, 0xd2, 0x24, 0xfd, 0x9f, 0xbb, 0x30, 0xa8, 0xfb, 0x8d, 0xee, 0x82, 0x9b, 0x51, 0x29, 0x49, - 0x6a, 0x1c, 0xf5, 0x26, 0x5b, 0x87, 0x37, 0x83, 0x7a, 0x9a, 0x41, 0x33, 0xcd, 0xe0, 0x88, 0x57, - 0xb8, 0x45, 0x21, 0x04, 0xfd, 0x8c, 0x66, 0xf5, 0x58, 0x86, 0xd8, 0x9c, 0x75, 0x5d, 0xc5, 0x32, - 0x2a, 0x0a, 0x15, 0xcd, 0x29, 0x4b, 0xe7, 0xca, 0x18, 0xeb, 0xe3, 0x1d, 0x9b, 0x3d, 0x36, 0x49, - 0x34, 0x85, 0x1b, 0xb4, 0x54, 0x94, 0x4b, 0x26, 0x78, 0x24, 0x96, 0x8a, 0x09, 0x2e, 0x47, 0x7f, - 0x6f, 0xae, 0x28, 0xfb, 0x5a, 0x8b, 0xff, 0xaa, 0x86, 0xa3, 0x27, 0xe0, 0x71, 0xc1, 0xa3, 0x24, - 0x67, 0x8a, 0x25, 0x64, 0x11, 0x5d, 0x21, 0x78, 0x7d, 0x85, 0xe0, 0x1e, 0x17, 0xfc, 0xbe, 0xe5, - 0x7e, 0xfa, 0x8a, 0xb6, 0xff, 0x0c, 0xdc, 0xe6, 0x49, 0xa1, 0x4f, 0x60, 0x5b, 0x8f, 0x91, 0xe6, - 0x66, 0x1e, 0x4d, 0x73, 0x6e, 0x5d, 0xf1, 0x0a, 0x4f, 0x0c, 0xcc, 0xbc, 0xc3, 0x2d, 0xd9, 0x9e, - 0x25, 0x9a, 0x40, 0xef, 0x8c, 0x52, 0xfb, 0x7c, 0x5f, 0xbf, 0x82, 0xf8, 0x90, 0x52, 0xac, 0x21, - 0xfe, 0x2f, 0x0e, 0xc0, 0x4b, 0x15, 0xf4, 0x00, 0x60, 0x59, 0xc4, 0x0b, 0x96, 0x44, 0x4f, 0x69, - 0xb3, 0x32, 0x07, 0x0d, 0x5f, 0x2f, 0x6b, 0x60, 0xd7, 0xb8, 0x11, 0xfa, 0xda, 0xa0, 0x3f, 0xa7, - 0x15, 0x1e, 0x2e, 0x9b, 0xa3, 0xde, 0xa1, 0x4c, 0xcc, 0xe8, 0xba, 0x1d, 0x7a, 0x2c, 0x66, 0xb4, - 0xde, 0xa1, 0xcc, 0x9e, 0xd0, 0x18, 0x5c, 0x49, 0xbf, 0x29, 0x28, 0x4f, 0xa8, 0x9d, 0x63, 0x1b, - 0xfb, 0xbf, 0x77, 0xc1, 0x6d, 0x28, 0xe8, 0x23, 0x18, 0x48, 0xc6, 0xd3, 0x05, 0xb5, 0x26, 0xfd, - 0x15, 0xfa, 0xc1, 0x89, 0x41, 0x1e, 0x77, 0xb0, 0xe5, 0xa0, 0x0f, 0x60, 0x23, 0x2b, 0x16, 0x8a, - 0x59, 0x73, 0x6f, 0xac, 0x22, 0x3f, 0xd6, 0xc0, 0xe3, 0x0e, 0xae, 0x19, 0xe3, 0x23, 0x18, 0xd4, - 0x72, 0xe8, 0x3d, 0xe8, 0x6b, 0xdf, 0xc6, 0xc0, 0xb5, 0xc3, 0x37, 0x2f, 0x69, 0x34, 0x9f, 0xa8, - 0xcb, 0x63, 0xd2, 0x7a, 0xd8, 0x10, 0xc6, 0xdf, 0x3b, 0xb0, 0x61, 0x54, 0xd1, 0x67, 0xe0, 0xc6, - 0x4c, 0x91, 0x3c, 0x27, 0x4d, 0xb3, 0xdf, 0x59, 0xd5, 0xec, 0xfb, 0x22, 0x5b, 0x92, 0x44, 0x4d, - 0x99, 0x3a, 0xd2, 0x14, 0xdc, 0x92, 0xd1, 0x87, 0x00, 0x6d, 0xc7, 0xf5, 0xee, 0xf6, 0xd6, 0xb5, - 0x7c, 0xd8, 0xb4, 0x5c, 0x4e, 0x37, 0xa0, 0x27, 0x8b, 0xcc, 0xff, 0xce, 0x81, 0xde, 0x43, 0x4a, - 0x51, 0x02, 0x03, 0x92, 0xe9, 0x8d, 0xb5, 0xef, 0x6e, 0xf7, 0x5f, 0x8e, 0x5e, 0x5a, 0x61, 0x7c, - 0x7a, 0xf7, 0xf9, 0x1f, 0xb7, 0x3b, 0xbf, 0xfe, 0x79, 0x7b, 0x92, 0x32, 0x35, 0x2f, 0xe2, 0x20, - 0x11, 0x59, 0x68, 0x3f, 0xdc, 0xf5, 0xcf, 0x1d, 0x39, 0x7b, 0x1a, 0xaa, 0x6a, 0x49, 0xa5, 0x21, - 0x48, 0x6c, 0xa5, 0xd1, 0x1e, 0x0c, 0x53, 0x22, 0xa3, 0x05, 0xcb, 0x98, 0x32, 0x43, 0xe8, 0x63, - 0x37, 0x25, 0xf2, 0x0b, 0x1d, 0x4f, 0x3f, 0x7e, 0x7e, 0xee, 0x39, 0x2f, 0xce, 0x3d, 0xe7, 0xaf, - 0x73, 0xcf, 0xf9, 0xf1, 0xc2, 0xeb, 0xbc, 0xb8, 0xf0, 0x3a, 0xbf, 0x5d, 0x78, 0x9d, 0x27, 0x07, - 0xeb, 0x0b, 0x85, 0xaa, 0x8c, 0x07, 0x66, 0xef, 0xde, 0xfd, 0x27, 0x00, 0x00, 0xff, 0xff, 0x1d, - 0xe3, 0xfb, 0xd0, 0xd4, 0x06, 0x00, 0x00, + 0x14, 0x5f, 0xaf, 0x37, 0x1b, 0xef, 0x4b, 0xd2, 0xd2, 0x51, 0x85, 0x36, 0x1b, 0xd5, 0x0d, 0x46, + 0x85, 0x95, 0x50, 0xed, 0x36, 0x3d, 0xf0, 0x47, 0x48, 0x90, 0x2d, 0x94, 0x54, 0x50, 0x90, 0x26, + 0x39, 0xf5, 0x62, 0x8d, 0xbd, 0x13, 0xef, 0xa8, 0xeb, 0x99, 0xc5, 0x33, 0x2e, 0xde, 0x4f, 0xc0, + 0x05, 0x24, 0x84, 0x84, 0xf8, 0x0e, 0x7c, 0x92, 0x1e, 0x7b, 0xe4, 0x80, 0x00, 0x25, 0x1f, 0x04, + 0x34, 0xe3, 0xb1, 0x1b, 0xc2, 0x2a, 0x7b, 0xe9, 0xc9, 0xf3, 0xde, 0xfc, 0x7e, 0xbf, 0xf7, 0xfc, + 0xfe, 0x0c, 0x8c, 0x52, 0x21, 0x73, 0x21, 0x23, 0x55, 0x45, 0xcf, 0xef, 0x27, 0x54, 0x91, 0xfb, + 0x91, 0xaa, 0xc2, 0x45, 0x21, 0x94, 0x40, 0x37, 0xea, 0xbb, 0x50, 0x55, 0xa1, 0xbd, 0x1b, 0xdd, + 0xcc, 0x44, 0x26, 0xcc, 0x6d, 0xa4, 0x4f, 0x35, 0x70, 0xf4, 0xae, 0x15, 0x49, 0x88, 0xa4, 0x51, + 0x5a, 0x2c, 0x17, 0x4a, 0xb4, 0x6a, 0xb5, 0x69, 0x81, 0xfe, 0x45, 0x60, 0x8b, 0x10, 0x8c, 0x5f, + 0x12, 0x52, 0x55, 0x24, 0x59, 0xc6, 0x19, 0xcf, 0x5a, 0x94, 0xb5, 0x2d, 0x70, 0x37, 0x13, 0x22, + 0x9b, 0xd3, 0xc8, 0x58, 0x49, 0x79, 0x1a, 0x11, 0xbe, 0xac, 0xaf, 0x82, 0x1f, 0x1d, 0xe8, 0x9e, + 0x54, 0xe8, 0x2e, 0xf4, 0x12, 0x31, 0x5d, 0x0e, 0x9d, 0x7d, 0x67, 0xbc, 0x75, 0xb0, 0x1b, 0xfe, + 0xef, 0x5f, 0xc2, 0x93, 0x6a, 0x22, 0xa6, 0x4b, 0x6c, 0x60, 0xe8, 0x03, 0x18, 0x90, 0x52, 0xcd, + 0x62, 0xc6, 0x4f, 0xc5, 0xb0, 0x6b, 0x38, 0x7b, 0x2b, 0x38, 0x87, 0xa5, 0x9a, 0x3d, 0xe6, 0xa7, + 0x02, 0x7b, 0xc4, 0x9e, 0x90, 0x0f, 0xa0, 0x73, 0x23, 0xaa, 0x2c, 0xa8, 0x1c, 0xba, 0xfb, 0xee, + 0x78, 0x1b, 0x5f, 0xf0, 0x04, 0x1c, 0x36, 0x4e, 0x2a, 0x4c, 0xbe, 0x43, 0xb7, 0x00, 0x74, 0xa8, + 0x38, 0x59, 0x2a, 0x2a, 0x4d, 0x5e, 0xdb, 0x78, 0xa0, 0x3d, 0x13, 0xed, 0x40, 0xef, 0xc0, 0xf5, + 0x36, 0x03, 0x8b, 0xe9, 0x1a, 0xcc, 0x4e, 0x13, 0xaa, 0xc6, 0xad, 0x8b, 0xf7, 0xb3, 0x03, 0x9b, + 0xc7, 0x2c, 0xe3, 0x9f, 0x89, 0xf4, 0x75, 0x85, 0xdc, 0x05, 0x2f, 0x9d, 0x11, 0xc6, 0x63, 0x36, + 0x1d, 0xba, 0xfb, 0xce, 0x78, 0x80, 0x37, 0x8d, 0xfd, 0x78, 0x8a, 0xee, 0xc0, 0x35, 0x92, 0xa6, + 0xa2, 0xe4, 0x2a, 0xe6, 0x65, 0x9e, 0xd0, 0x62, 0xd8, 0xdb, 0x77, 0xc6, 0x3d, 0xbc, 0x63, 0xbd, + 0x5f, 0x1b, 0x67, 0xf0, 0x4b, 0x17, 0xfa, 0x75, 0xbd, 0xd1, 0x3d, 0xf0, 0x72, 0x2a, 0x25, 0xc9, + 0x4c, 0x46, 0xee, 0x78, 0xeb, 0xe0, 0x66, 0x58, 0x77, 0x33, 0x6c, 0xba, 0x19, 0x1e, 0xf2, 0x25, + 0x6e, 0x51, 0x08, 0x41, 0x2f, 0xa7, 0x79, 0xdd, 0x96, 0x01, 0x36, 0x67, 0x1d, 0x57, 0xb1, 0x9c, + 0x8a, 0x52, 0xc5, 0x33, 0xca, 0xb2, 0x99, 0x32, 0x89, 0xf5, 0xf0, 0x8e, 0xf5, 0x1e, 0x19, 0x27, + 0x9a, 0xc0, 0x0d, 0x5a, 0x29, 0xca, 0x25, 0x13, 0x3c, 0x16, 0x0b, 0xc5, 0x04, 0x97, 0xc3, 0x7f, + 0x36, 0xaf, 0x08, 0xfb, 0x46, 0x8b, 0xff, 0xa6, 0x86, 0xa3, 0xa7, 0xe0, 0x73, 0xc1, 0xe3, 0xb4, + 0x60, 0x8a, 0xa5, 0x64, 0x1e, 0xaf, 0x10, 0xbc, 0x7e, 0x85, 0xe0, 0x1e, 0x17, 0xfc, 0xa1, 0xe5, + 0x7e, 0x7e, 0x49, 0x3b, 0x78, 0x0e, 0x5e, 0x33, 0x52, 0xe8, 0x53, 0xd8, 0xd6, 0x6d, 0xa4, 0x85, + 0xe9, 0x47, 0x53, 0x9c, 0x5b, 0x2b, 0xa6, 0xf0, 0xd8, 0xc0, 0xcc, 0x1c, 0x6e, 0xc9, 0xf6, 0x2c, + 0xd1, 0x18, 0xdc, 0x53, 0x4a, 0xed, 0xf8, 0xbe, 0xb9, 0x82, 0xf8, 0x88, 0x52, 0xac, 0x21, 0xc1, + 0xaf, 0x0e, 0xc0, 0x2b, 0x15, 0xf4, 0x00, 0x60, 0x51, 0x26, 0x73, 0x96, 0xc6, 0xcf, 0x68, 0xb3, + 0x32, 0xab, 0xff, 0x66, 0x50, 0xe3, 0xbe, 0xa4, 0x66, 0x65, 0x72, 0x31, 0xa5, 0xeb, 0x56, 0xe6, + 0x89, 0x98, 0xd2, 0x7a, 0x65, 0x72, 0x7b, 0x42, 0x23, 0xf0, 0x24, 0xfd, 0xb6, 0xa4, 0x3c, 0xa5, + 0xb6, 0x6d, 0xad, 0x1d, 0xfc, 0xd1, 0x05, 0xaf, 0xa1, 0xa0, 0x8f, 0xa1, 0x2f, 0x19, 0xcf, 0xe6, + 0xd4, 0xe6, 0x14, 0x5c, 0xa1, 0x1f, 0x1e, 0x1b, 0xe4, 0x51, 0x07, 0x5b, 0x0e, 0xfa, 0x10, 0x36, + 0xf2, 0x72, 0xae, 0x98, 0x4d, 0xee, 0xad, 0xab, 0xc8, 0x4f, 0x34, 0xf0, 0xa8, 0x83, 0x6b, 0xc6, + 0xe8, 0x10, 0xfa, 0xb5, 0x1c, 0x7a, 0x1f, 0x7a, 0x3a, 0x6f, 0x93, 0xc0, 0xb5, 0x83, 0xb7, 0x2f, + 0x68, 0x34, 0x2f, 0xd2, 0xc5, 0xae, 0x68, 0x3d, 0x6c, 0x08, 0xa3, 0x1f, 0x1c, 0xd8, 0x30, 0xaa, + 0xe8, 0x0b, 0xf0, 0x12, 0xa6, 0x48, 0x51, 0x90, 0xa6, 0xb6, 0xef, 0x35, 0x32, 0xfa, 0x21, 0x0c, + 0xed, 0x13, 0xd9, 0xe8, 0x3c, 0x14, 0xf9, 0x82, 0xa4, 0x6a, 0xc2, 0xd4, 0xa1, 0xa6, 0xe0, 0x96, + 0x8c, 0x3e, 0x02, 0x68, 0x2b, 0xae, 0x57, 0xd5, 0x5d, 0x57, 0xf2, 0x41, 0x53, 0x72, 0x39, 0xd9, + 0x00, 0x57, 0x96, 0x79, 0xf0, 0xbd, 0x03, 0xee, 0x23, 0x4a, 0x51, 0x0a, 0x7d, 0x92, 0xeb, 0x05, + 0xb5, 0x63, 0xb6, 0xfb, 0x9f, 0x8c, 0x5e, 0xa5, 0xc2, 0xf8, 0xe4, 0xde, 0x8b, 0x3f, 0x6f, 0x77, + 0x7e, 0xfb, 0xeb, 0xf6, 0x38, 0x63, 0x6a, 0x56, 0x26, 0x61, 0x2a, 0xf2, 0xc8, 0xbe, 0xd3, 0xf5, + 0xe7, 0xae, 0x9c, 0x3e, 0x8b, 0xd4, 0x72, 0x41, 0xa5, 0x21, 0x48, 0x6c, 0xa5, 0xd1, 0x1e, 0x0c, + 0x32, 0x22, 0xe3, 0x39, 0xcb, 0x99, 0x32, 0x4d, 0xe8, 0x61, 0x2f, 0x23, 0xf2, 0x2b, 0x6d, 0x4f, + 0x3e, 0x79, 0x71, 0xe6, 0x3b, 0x2f, 0xcf, 0x7c, 0xe7, 0xef, 0x33, 0xdf, 0xf9, 0xe9, 0xdc, 0xef, + 0xbc, 0x3c, 0xf7, 0x3b, 0xbf, 0x9f, 0xfb, 0x9d, 0xa7, 0x77, 0xd6, 0x07, 0x8a, 0x54, 0x95, 0xf4, + 0xcd, 0x60, 0x3e, 0xf8, 0x37, 0x00, 0x00, 0xff, 0xff, 0x29, 0x4f, 0x1c, 0xdf, 0xc3, 0x06, 0x00, + 0x00, } func (m *Tx) Marshal() (dAtA []byte, err error) { @@ -2420,7 +2420,7 @@ func (m *SignerInfo) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.PublicKey == nil { - m.PublicKey = &types1.PublicKey{} + m.PublicKey = &types.Any{} } if err := m.PublicKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err diff --git a/x/auth/tx/builder.go b/x/auth/tx/builder.go index cfb4bc925179..315af06b832e 100644 --- a/x/auth/tx/builder.go +++ b/x/auth/tx/builder.go @@ -8,8 +8,8 @@ import ( "github.com/cosmos/cosmos-sdk/client" codectypes "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/errors" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/tx" "github.com/cosmos/cosmos-sdk/types/tx/signing" @@ -30,12 +30,6 @@ type wrapper struct { // from the client using TxRaw if the tx was decoded from the wire authInfoBz []byte - // pubKeys represents the cached crypto.PubKey's that were set either from tx decoding - // or decoded from AuthInfo when GetPubKey's was called - pubKeys []crypto.PubKey - - pubkeyCodec types.PublicKeyCodec - txBodyHasUnknownNonCriticals bool } @@ -54,7 +48,7 @@ type ExtensionOptionsTxBuilder interface { SetNonCriticalExtensionOptions(...*codectypes.Any) } -func newBuilder(pubkeyCodec types.PublicKeyCodec) *wrapper { +func newBuilder() *wrapper { return &wrapper{ tx: &tx.Tx{ Body: &tx.TxBody{}, @@ -62,7 +56,6 @@ func newBuilder(pubkeyCodec types.PublicKeyCodec) *wrapper { Fee: &tx.Fee{}, }, }, - pubkeyCodec: pubkeyCodec, } } @@ -183,25 +176,19 @@ func (w *wrapper) GetSigners() []sdk.AccAddress { } func (w *wrapper) GetPubKeys() []crypto.PubKey { - if w.pubKeys == nil { - signerInfos := w.tx.AuthInfo.SignerInfos - pubKeys := make([]crypto.PubKey, len(signerInfos)) + signerInfos := w.tx.AuthInfo.SignerInfos + pks := make([]crypto.PubKey, len(signerInfos)) - for i, si := range signerInfos { - var err error - pk := si.PublicKey - if pk != nil { - pubKeys[i], err = w.pubkeyCodec.Decode(si.PublicKey) - if err != nil { - panic(err) - } - } + for i, si := range signerInfos { + pk, ok := si.PublicKey.GetCachedValue().(crypto.PubKey) + // NOTE: it is okay to leave this nil if there is no PubKey in the SignerInfo. + // PubKey's can be left unset in SignerInfo. + if ok { + pks[i] = pk } - - w.pubKeys = pubKeys } - return w.pubKeys + return pks } func (w *wrapper) GetGas() uint64 { @@ -324,12 +311,12 @@ func (w *wrapper) SetSignatures(signatures ...signing.SignatureV2) error { for i, sig := range signatures { var modeInfo *tx.ModeInfo modeInfo, rawSigs[i] = SignatureDataToModeInfoAndSig(sig.Data) - pk, err := w.pubkeyCodec.Encode(sig.PubKey) + any, err := PubKeyToAny(sig.PubKey) if err != nil { return err } signerInfos[i] = &tx.SignerInfo{ - PublicKey: pk, + PublicKey: any, ModeInfo: modeInfo, Sequence: sig.Sequence, } @@ -345,8 +332,6 @@ func (w *wrapper) setSignerInfos(infos []*tx.SignerInfo) { w.tx.AuthInfo.SignerInfos = infos // set authInfoBz to nil because the cached authInfoBz no longer matches tx.AuthInfo w.authInfoBz = nil - // set cached pubKeys to nil because they no longer match tx.AuthInfo - w.pubKeys = nil } func (w *wrapper) setSignatures(sigs [][]byte) { @@ -363,10 +348,9 @@ func (w *wrapper) GetProtoTx() *tx.Tx { } // WrapTx creates a TxBuilder wrapper around a tx.Tx proto message. -func WrapTx(protoTx *tx.Tx, pubkeyCodec types.PublicKeyCodec) client.TxBuilder { +func WrapTx(protoTx *tx.Tx) client.TxBuilder { return &wrapper{ - tx: protoTx, - pubkeyCodec: pubkeyCodec, + tx: protoTx, } } @@ -387,3 +371,12 @@ func (w *wrapper) SetNonCriticalExtensionOptions(extOpts ...*codectypes.Any) { w.tx.Body.NonCriticalExtensionOptions = extOpts w.bodyBz = nil } + +// PubKeyToAny converts a crypto.PubKey to a proto Any. +func PubKeyToAny(key crypto.PubKey) (*codectypes.Any, error) { + protoMsg, ok := key.(proto.Message) + if !ok { + return nil, errors.Wrap(sdkerrors.ErrInvalidPubKey, fmt.Sprintf("can't proto encode %T", protoMsg)) + } + return codectypes.NewAnyWithValue(protoMsg) +} diff --git a/x/auth/tx/builder_test.go b/x/auth/tx/builder_test.go index 42f4e7627813..88e803123c3f 100644 --- a/x/auth/tx/builder_test.go +++ b/x/auth/tx/builder_test.go @@ -8,7 +8,6 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/legacy" codectypes "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/std" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -20,20 +19,18 @@ func TestTxBuilder(t *testing.T) { _, pubkey, addr := testdata.KeyTestPubAddr() marshaler := codec.NewProtoCodec(codectypes.NewInterfaceRegistry()) - txBuilder := newBuilder(std.DefaultPublicKeyCodec{}) - - cdc := std.DefaultPublicKeyCodec{} + txBuilder := newBuilder() memo := "sometestmemo" msgs := []sdk.Msg{testdata.NewTestMsg(addr)} accSeq := uint64(2) // Arbitrary account sequence - pk, err := cdc.Encode(pubkey) + any, err := PubKeyToAny(pubkey) require.NoError(t, err) var signerInfo []*txtypes.SignerInfo signerInfo = append(signerInfo, &txtypes.SignerInfo{ - PublicKey: pk, + PublicKey: any, ModeInfo: &txtypes.ModeInfo{ Sum: &txtypes.ModeInfo_Single_{ Single: &txtypes.ModeInfo_Single{ @@ -111,7 +108,7 @@ func TestTxBuilder(t *testing.T) { require.Equal(t, 1, len(txBuilder.GetPubKeys())) require.Equal(t, legacy.Cdc.MustMarshalBinaryBare(pubkey), legacy.Cdc.MustMarshalBinaryBare(txBuilder.GetPubKeys()[0])) - any, err := codectypes.NewAnyWithValue(testdata.NewTestMsg()) + any, err = codectypes.NewAnyWithValue(testdata.NewTestMsg()) require.NoError(t, err) txBuilder.SetExtensionOptions(any) require.Equal(t, []*codectypes.Any{any}, txBuilder.GetExtensionOptions()) @@ -137,7 +134,7 @@ func TestBuilderValidateBasic(t *testing.T) { // require to fail validation upon invalid fee badFeeAmount := testdata.NewTestFeeAmount() badFeeAmount[0].Amount = sdk.NewInt(-5) - txBuilder := newBuilder(std.DefaultPublicKeyCodec{}) + txBuilder := newBuilder() var sig1, sig2 signing.SignatureV2 sig1 = signing.SignatureV2{ diff --git a/x/auth/tx/config.go b/x/auth/tx/config.go index b78359b93016..5b6fc5abf618 100644 --- a/x/auth/tx/config.go +++ b/x/auth/tx/config.go @@ -8,13 +8,11 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/signing" ) type config struct { - pubkeyCodec types.PublicKeyCodec handler signing.SignModeHandler decoder sdk.TxDecoder encoder sdk.TxEncoder @@ -23,22 +21,21 @@ type config struct { protoCodec *codec.ProtoCodec } -// NewTxConfig returns a new protobuf TxConfig using the provided ProtoCodec, PublicKeyCodec and sign modes. The +// NewTxConfig returns a new protobuf TxConfig using the provided ProtoCodec and sign modes. The // first enabled sign mode will become the default sign mode. -func NewTxConfig(protoCodec *codec.ProtoCodec, pubkeyCodec types.PublicKeyCodec, enabledSignModes []signingtypes.SignMode) client.TxConfig { +func NewTxConfig(protoCodec *codec.ProtoCodec, enabledSignModes []signingtypes.SignMode) client.TxConfig { return &config{ - pubkeyCodec: pubkeyCodec, handler: makeSignModeHandler(enabledSignModes), - decoder: DefaultTxDecoder(protoCodec, pubkeyCodec), + decoder: DefaultTxDecoder(protoCodec), encoder: DefaultTxEncoder(), - jsonDecoder: DefaultJSONTxDecoder(protoCodec, pubkeyCodec), + jsonDecoder: DefaultJSONTxDecoder(protoCodec), jsonEncoder: DefaultJSONTxEncoder(), protoCodec: protoCodec, } } func (g config) NewTxBuilder() client.TxBuilder { - return newBuilder(g.pubkeyCodec) + return newBuilder() } // WrapTxBuilder returns a builder from provided transaction diff --git a/x/auth/tx/config_test.go b/x/auth/tx/config_test.go index e3d9d5d2be55..5dd5cf62a969 100644 --- a/x/auth/tx/config_test.go +++ b/x/auth/tx/config_test.go @@ -12,13 +12,11 @@ import ( "github.com/cosmos/cosmos-sdk/client/testutil" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/std" ) func TestGenerator(t *testing.T) { interfaceRegistry := codectypes.NewInterfaceRegistry() interfaceRegistry.RegisterImplementations((*sdk.Msg)(nil), &testdata.TestMsg{}) marshaler := codec.NewProtoCodec(interfaceRegistry) - pubKeyCodec := std.DefaultPublicKeyCodec{} - suite.Run(t, testutil.NewTxConfigTestSuite(NewTxConfig(marshaler, pubKeyCodec, DefaultSignModes))) + suite.Run(t, testutil.NewTxConfigTestSuite(NewTxConfig(marshaler, DefaultSignModes))) } diff --git a/x/auth/tx/decoder.go b/x/auth/tx/decoder.go index c502e0b38022..76129a3a1f2c 100644 --- a/x/auth/tx/decoder.go +++ b/x/auth/tx/decoder.go @@ -1,18 +1,15 @@ package tx import ( - "github.com/tendermint/tendermint/crypto" - "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/unknownproto" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/tx" ) -// DefaultTxDecoder returns a default protobuf TxDecoder using the provided Marshaler and PublicKeyCodec -func DefaultTxDecoder(cdc *codec.ProtoCodec, keyCodec cryptotypes.PublicKeyCodec) sdk.TxDecoder { +// DefaultTxDecoder returns a default protobuf TxDecoder using the provided Marshaler. +func DefaultTxDecoder(cdc *codec.ProtoCodec) sdk.TxDecoder { return func(txBytes []byte) (sdk.Tx, error) { var raw tx.TxRaw @@ -59,24 +56,17 @@ func DefaultTxDecoder(cdc *codec.ProtoCodec, keyCodec cryptotypes.PublicKeyCodec Signatures: raw.Signatures, } - pks, err := extractPubKeys(theTx, keyCodec) - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrTxDecode, err.Error()) - } - return &wrapper{ tx: theTx, bodyBz: raw.BodyBytes, authInfoBz: raw.AuthInfoBytes, - pubKeys: pks, - pubkeyCodec: keyCodec, txBodyHasUnknownNonCriticals: txBodyHasUnknownNonCriticals, }, nil } } -// DefaultTxDecoder returns a default protobuf JSON TxDecoder using the provided Marshaler and PublicKeyCodec -func DefaultJSONTxDecoder(cdc *codec.ProtoCodec, keyCodec cryptotypes.PublicKeyCodec) sdk.TxDecoder { +// DefaultJSONTxDecoder returns a default protobuf JSON TxDecoder using the provided Marshaler. +func DefaultJSONTxDecoder(cdc *codec.ProtoCodec) sdk.TxDecoder { return func(txBytes []byte) (sdk.Tx, error) { var theTx tx.Tx err := cdc.UnmarshalJSON(txBytes, &theTx) @@ -84,32 +74,8 @@ func DefaultJSONTxDecoder(cdc *codec.ProtoCodec, keyCodec cryptotypes.PublicKeyC return nil, sdkerrors.Wrap(sdkerrors.ErrTxDecode, err.Error()) } - pks, err := extractPubKeys(&theTx, keyCodec) - if err != nil { - return nil, sdkerrors.Wrap(sdkerrors.ErrTxDecode, err.Error()) - } - return &wrapper{ - tx: &theTx, - pubKeys: pks, - pubkeyCodec: keyCodec, + tx: &theTx, }, nil } } - -func extractPubKeys(tx *tx.Tx, keyCodec cryptotypes.PublicKeyCodec) ([]crypto.PubKey, error) { - if tx.AuthInfo == nil { - return []crypto.PubKey{}, nil - } - - signerInfos := tx.AuthInfo.SignerInfos - pks := make([]crypto.PubKey, len(signerInfos)) - for i, si := range signerInfos { - pk, err := keyCodec.Decode(si.PublicKey) - if err != nil { - return nil, err - } - pks[i] = pk - } - return pks, nil -} diff --git a/x/auth/tx/direct_test.go b/x/auth/tx/direct_test.go index 8d665a07875b..286b5c15e2ef 100644 --- a/x/auth/tx/direct_test.go +++ b/x/auth/tx/direct_test.go @@ -8,7 +8,6 @@ import ( "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/std" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" txtypes "github.com/cosmos/cosmos-sdk/types/tx" @@ -21,21 +20,20 @@ func TestDirectModeHandler(t *testing.T) { interfaceRegistry := codectypes.NewInterfaceRegistry() interfaceRegistry.RegisterImplementations((*sdk.Msg)(nil), &testdata.TestMsg{}) marshaler := codec.NewProtoCodec(interfaceRegistry) - pubKeyCdc := std.DefaultPublicKeyCodec{} - txConfig := NewTxConfig(marshaler, pubKeyCdc, []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_DIRECT}) + txConfig := NewTxConfig(marshaler, []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_DIRECT}) txBuilder := txConfig.NewTxBuilder() memo := "sometestmemo" msgs := []sdk.Msg{testdata.NewTestMsg(addr)} accSeq := uint64(2) // Arbitrary account sequence - pk, err := pubKeyCdc.Encode(pubkey) + any, err := PubKeyToAny(pubkey) require.NoError(t, err) var signerInfo []*txtypes.SignerInfo signerInfo = append(signerInfo, &txtypes.SignerInfo{ - PublicKey: pk, + PublicKey: any, ModeInfo: &txtypes.ModeInfo{ Sum: &txtypes.ModeInfo_Single_{ Single: &txtypes.ModeInfo_Single{ diff --git a/x/auth/tx/encode_decode_test.go b/x/auth/tx/encode_decode_test.go index 43d47a981796..a509704ef4b3 100644 --- a/x/auth/tx/encode_decode_test.go +++ b/x/auth/tx/encode_decode_test.go @@ -14,7 +14,6 @@ import ( "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/std" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -22,11 +21,10 @@ import ( func TestDefaultTxDecoderError(t *testing.T) { registry := codectypes.NewInterfaceRegistry() cdc := codec.NewProtoCodec(registry) - pubKeyCdc := std.DefaultPublicKeyCodec{} encoder := DefaultTxEncoder() - decoder := DefaultTxDecoder(cdc, pubKeyCdc) + decoder := DefaultTxDecoder(cdc) - builder := newBuilder(pubKeyCdc) + builder := newBuilder() err := builder.SetMsgs(testdata.NewTestMsg()) require.NoError(t, err) @@ -44,8 +42,7 @@ func TestDefaultTxDecoderError(t *testing.T) { func TestUnknownFields(t *testing.T) { registry := codectypes.NewInterfaceRegistry() cdc := codec.NewProtoCodec(registry) - pubKeyCdc := std.DefaultPublicKeyCodec{} - decoder := DefaultTxDecoder(cdc, pubKeyCdc) + decoder := DefaultTxDecoder(cdc) tests := []struct { name string @@ -128,7 +125,7 @@ func TestUnknownFields(t *testing.T) { if tt.shouldAminoErr != "" { handler := signModeLegacyAminoJSONHandler{} - decoder := DefaultTxDecoder(codec.NewProtoCodec(codectypes.NewInterfaceRegistry()), std.DefaultPublicKeyCodec{}) + decoder := DefaultTxDecoder(codec.NewProtoCodec(codectypes.NewInterfaceRegistry())) theTx, err := decoder(txBz) require.NoError(t, err) _, err = handler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON, signing.SignerData{}, theTx) diff --git a/x/auth/tx/legacy_amino_json_test.go b/x/auth/tx/legacy_amino_json_test.go index df86a4debfa2..f7e4bb7c75d2 100644 --- a/x/auth/tx/legacy_amino_json_test.go +++ b/x/auth/tx/legacy_amino_json_test.go @@ -6,7 +6,6 @@ import ( "github.com/stretchr/testify/require" cdctypes "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/std" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" @@ -34,7 +33,7 @@ func buildTx(t *testing.T, bldr *wrapper) { } func TestLegacyAminoJSONHandler_GetSignBytes(t *testing.T) { - bldr := newBuilder(std.DefaultPublicKeyCodec{}) + bldr := newBuilder() buildTx(t, bldr) tx := bldr.GetTx() @@ -65,7 +64,7 @@ func TestLegacyAminoJSONHandler_GetSignBytes(t *testing.T) { require.Error(t, err) // expect error with extension options - bldr = newBuilder(std.DefaultPublicKeyCodec{}) + bldr = newBuilder() buildTx(t, bldr) any, err := cdctypes.NewAnyWithValue(testdata.NewTestMsg()) require.NoError(t, err) @@ -75,7 +74,7 @@ func TestLegacyAminoJSONHandler_GetSignBytes(t *testing.T) { require.Error(t, err) // expect error with non-critical extension options - bldr = newBuilder(std.DefaultPublicKeyCodec{}) + bldr = newBuilder() buildTx(t, bldr) bldr.tx.Body.NonCriticalExtensionOptions = []*cdctypes.Any{any} tx = bldr.GetTx() diff --git a/x/auth/tx/sigs.go b/x/auth/tx/sigs.go index 18f8bc49481e..f4bde3ba06b9 100644 --- a/x/auth/tx/sigs.go +++ b/x/auth/tx/sigs.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/cosmos/cosmos-sdk/codec" + "github.com/tendermint/tendermint/crypto" "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/types/tx" @@ -109,15 +110,15 @@ func (g config) MarshalSignatureJSON(sigs []signing.SignatureV2) ([]byte, error) descs := make([]*signing.SignatureDescriptor, len(sigs)) for i, sig := range sigs { - publicKey, err := g.pubkeyCodec.Encode(sig.PubKey) + descData := signing.SignatureDataToProto(sig.Data) + + any, err := PubKeyToAny(sig.PubKey) if err != nil { return nil, err } - descData := signing.SignatureDataToProto(sig.Data) - descs[i] = &signing.SignatureDescriptor{ - PublicKey: publicKey, + PublicKey: any, Data: descData, } } @@ -136,10 +137,7 @@ func (g config) UnmarshalSignatureJSON(bz []byte) ([]signing.SignatureV2, error) sigs := make([]signing.SignatureV2, len(sigDescs.Signatures)) for i, desc := range sigDescs.Signatures { - pubKey, err := g.pubkeyCodec.Decode(desc.PublicKey) - if err != nil { - return nil, err - } + pubKey, _ := desc.PublicKey.GetCachedValue().(crypto.PubKey) data := signing.SignatureDataFromProto(desc.Data) diff --git a/x/ibc/light-clients/solomachine/types/consensus_state.go b/x/ibc/light-clients/solomachine/types/consensus_state.go index 82154a34804e..dc9353a81a7d 100644 --- a/x/ibc/light-clients/solomachine/types/consensus_state.go +++ b/x/ibc/light-clients/solomachine/types/consensus_state.go @@ -3,9 +3,9 @@ package types import ( "strings" + "github.com/tendermint/tendermint/crypto" tmcrypto "github.com/tendermint/tendermint/crypto" - "github.com/cosmos/cosmos-sdk/std" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" "github.com/cosmos/cosmos-sdk/x/ibc/exported" @@ -36,9 +36,9 @@ func (cs ConsensusState) GetRoot() exported.Root { // GetPubKey unmarshals the public key into a tmcrypto.PubKey type. func (cs ConsensusState) GetPubKey() tmcrypto.PubKey { - publicKey, err := std.DefaultPublicKeyCodec{}.Decode(cs.PublicKey) - if err != nil { - panic(err) + publicKey, ok := cs.PublicKey.GetCachedValue().(crypto.PubKey) + if !ok { + panic("ConsensusState PublicKey is not crypto.PubKey") } return publicKey diff --git a/x/ibc/light-clients/solomachine/types/header.go b/x/ibc/light-clients/solomachine/types/header.go index 12af50f2284b..102237d038a4 100644 --- a/x/ibc/light-clients/solomachine/types/header.go +++ b/x/ibc/light-clients/solomachine/types/header.go @@ -3,9 +3,9 @@ package types import ( "strings" + "github.com/tendermint/tendermint/crypto" tmcrypto "github.com/tendermint/tendermint/crypto" - "github.com/cosmos/cosmos-sdk/std" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" "github.com/cosmos/cosmos-sdk/x/ibc/exported" @@ -27,9 +27,9 @@ func (h Header) GetHeight() exported.Height { // GetPubKey unmarshals the new public key into a tmcrypto.PubKey type. func (h Header) GetPubKey() tmcrypto.PubKey { - publicKey, err := std.DefaultPublicKeyCodec{}.Decode(h.NewPublicKey) - if err != nil { - panic(err) + publicKey, ok := h.NewPublicKey.GetCachedValue().(crypto.PubKey) + if !ok { + panic("Header NewPublicKey is not crypto.PubKey") } return publicKey diff --git a/x/ibc/light-clients/solomachine/types/solomachine.pb.go b/x/ibc/light-clients/solomachine/types/solomachine.pb.go index 6dcfd758c505..bdbb9f5ef066 100644 --- a/x/ibc/light-clients/solomachine/types/solomachine.pb.go +++ b/x/ibc/light-clients/solomachine/types/solomachine.pb.go @@ -5,10 +5,15 @@ package types import ( fmt "fmt" +<<<<<<< HEAD types1 "github.com/cosmos/cosmos-sdk/codec/types" types "github.com/cosmos/cosmos-sdk/crypto/types" types2 "github.com/cosmos/cosmos-sdk/x/ibc/03-connection/types" types3 "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/types" +======= + types "github.com/cosmos/cosmos-sdk/codec/types" + _ "github.com/cosmos/cosmos-sdk/crypto/types" +>>>>>>> a23f8fc0a... Remove pubkey codec _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" @@ -77,11 +82,16 @@ var xxx_messageInfo_ClientState proto.InternalMessageInfo // is contained in the "height" key used in storing the consensus state. type ConsensusState struct { // public key of the solo machine +<<<<<<< HEAD PublicKey *types.PublicKey `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty" yaml:"public_key"` // diversifier allows the same public key to be re-used across different solo machine clients // (potentially on different chains) without being considered misbehaviour. Diversifier string `protobuf:"bytes,2,opt,name=diversifier,proto3" json:"diversifier,omitempty"` Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` +======= + PublicKey *types.Any `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty" yaml:"public_key"` + Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` +>>>>>>> a23f8fc0a... Remove pubkey codec } func (m *ConsensusState) Reset() { *m = ConsensusState{} } @@ -120,11 +130,17 @@ var xxx_messageInfo_ConsensusState proto.InternalMessageInfo // Header defines a solo machine consensus header type Header struct { // sequence to update solo machine public key at +<<<<<<< HEAD Sequence uint64 `protobuf:"varint,1,opt,name=sequence,proto3" json:"sequence,omitempty"` Timestamp uint64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` Signature []byte `protobuf:"bytes,3,opt,name=signature,proto3" json:"signature,omitempty"` NewPublicKey *types.PublicKey `protobuf:"bytes,4,opt,name=new_public_key,json=newPublicKey,proto3" json:"new_public_key,omitempty" yaml:"new_public_key"` NewDiversifier string `protobuf:"bytes,5,opt,name=new_diversifier,json=newDiversifier,proto3" json:"new_diversifier,omitempty" yaml:"new_diversifier"` +======= + Sequence uint64 `protobuf:"varint,1,opt,name=sequence,proto3" json:"sequence,omitempty"` + Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` + NewPublicKey *types.Any `protobuf:"bytes,3,opt,name=new_public_key,json=newPublicKey,proto3" json:"new_public_key,omitempty" yaml:"new_public_key"` +>>>>>>> a23f8fc0a... Remove pubkey codec } func (m *Header) Reset() { *m = Header{} } @@ -750,6 +766,7 @@ func init() { } var fileDescriptor_6cc2ee18f7f86d4e = []byte{ +<<<<<<< HEAD // 1030 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x41, 0x6f, 0xe3, 0x44, 0x14, 0xae, 0xb3, 0x61, 0x69, 0x5e, 0xb2, 0x6d, 0xf1, 0x66, 0x97, 0xb4, 0x40, 0x1c, 0x59, 0x02, @@ -816,6 +833,50 @@ var fileDescriptor_6cc2ee18f7f86d4e = []byte{ 0x8b, 0xe2, 0xf3, 0x20, 0xf6, 0x4e, 0xcd, 0x33, 0x73, 0xd9, 0x95, 0x3e, 0xb8, 0xaa, 0x2d, 0x65, 0xb3, 0x10, 0xc7, 0xce, 0x6d, 0x1e, 0xb4, 0xef, 0xfc, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xc5, 0x29, 0x18, 0x98, 0xc3, 0x0a, 0x00, 0x00, +======= + // 654 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0xcf, 0x6e, 0xd3, 0x4e, + 0x10, 0x8e, 0xd3, 0xa8, 0x4a, 0xb6, 0xf9, 0xa5, 0xfd, 0x59, 0x29, 0x4a, 0x43, 0x15, 0x57, 0x3e, + 0x40, 0x2f, 0xf5, 0xca, 0x70, 0xeb, 0xad, 0x2e, 0x07, 0x28, 0x42, 0x54, 0x6e, 0x2b, 0x21, 0x84, + 0x64, 0xad, 0xed, 0xa9, 0x63, 0xd5, 0xd9, 0x35, 0xde, 0x75, 0x82, 0x79, 0x02, 0x8e, 0x1c, 0x39, + 0x20, 0xc1, 0x4b, 0xf0, 0x0e, 0x48, 0x5c, 0x7a, 0xe4, 0x14, 0xa1, 0xf6, 0x0d, 0xf2, 0x04, 0x28, + 0x5e, 0x27, 0x8d, 0xa3, 0xaa, 0xbd, 0x70, 0xf2, 0xce, 0xbf, 0x6f, 0xbe, 0x99, 0x6f, 0x64, 0x64, + 0x86, 0xae, 0x87, 0xa3, 0x30, 0xe8, 0x0b, 0x2f, 0x0a, 0x81, 0x0a, 0x8e, 0x39, 0x8b, 0xd8, 0x80, + 0x78, 0xfd, 0x90, 0x02, 0x1e, 0x9a, 0x8b, 0xa6, 0x11, 0x27, 0x4c, 0x30, 0x55, 0x0b, 0x5d, 0xcf, + 0x58, 0x2c, 0x31, 0x16, 0x73, 0x86, 0x66, 0xf7, 0xb1, 0xc7, 0xf8, 0x80, 0x71, 0xec, 0x12, 0x0e, + 0xd8, 0x4b, 0xb2, 0x58, 0x30, 0x3c, 0x34, 0x5d, 0x10, 0xc4, 0x2c, 0x4c, 0x89, 0xd4, 0x6d, 0x07, + 0x2c, 0x60, 0xf9, 0x13, 0x4f, 0x5f, 0x85, 0x77, 0x2b, 0x60, 0x2c, 0x88, 0x00, 0xe7, 0x96, 0x9b, + 0x9e, 0x63, 0x42, 0x33, 0x19, 0xd2, 0x7f, 0x54, 0xd1, 0xda, 0x61, 0xde, 0xf4, 0x44, 0x10, 0x01, + 0xea, 0x21, 0x5a, 0x3f, 0x4f, 0xd8, 0x47, 0xa0, 0x0e, 0x87, 0xf7, 0x29, 0x50, 0x0f, 0x3a, 0xca, + 0x8e, 0xb2, 0x5b, 0xb3, 0xba, 0x93, 0xb1, 0xf6, 0x20, 0x23, 0x83, 0x68, 0x5f, 0x5f, 0x4a, 0xd0, + 0xed, 0x96, 0xf4, 0x9c, 0x14, 0x0e, 0x55, 0xa0, 0x75, 0x8f, 0x51, 0x0e, 0x94, 0xa7, 0xdc, 0xe1, + 0x53, 0xdc, 0x4e, 0x75, 0x47, 0xd9, 0x5d, 0x7b, 0x82, 0x8d, 0x7b, 0x26, 0x35, 0x0e, 0x67, 0x75, + 0x39, 0x9d, 0xc5, 0xae, 0x4b, 0x88, 0xba, 0xdd, 0xf2, 0x4a, 0xb9, 0x2a, 0xa0, 0x87, 0x24, 0x8a, + 0xd8, 0xc8, 0x49, 0x63, 0x9f, 0x08, 0x70, 0xc8, 0xb9, 0x80, 0xc4, 0x89, 0x13, 0x16, 0x33, 0x4e, + 0xa2, 0xce, 0xca, 0x8e, 0xb2, 0x5b, 0xb7, 0x1e, 0x4d, 0xc6, 0x9a, 0x2e, 0x01, 0xef, 0x48, 0xd6, + 0xed, 0x4e, 0x1e, 0x3d, 0xcb, 0x83, 0x07, 0xd3, 0xd8, 0x71, 0x11, 0xda, 0xaf, 0x7d, 0xfa, 0xae, + 0x55, 0xf4, 0xaf, 0x0a, 0x6a, 0x95, 0xb9, 0xaa, 0x5d, 0x54, 0x2f, 0xef, 0xcc, 0x9e, 0xdb, 0xea, + 0x11, 0x42, 0x71, 0xea, 0x46, 0xa1, 0xe7, 0x5c, 0x40, 0x56, 0x2c, 0xa3, 0x6d, 0x48, 0x59, 0x8c, + 0x99, 0x2c, 0xc6, 0x01, 0xcd, 0xac, 0xcd, 0xc9, 0x58, 0xfb, 0x5f, 0x12, 0xbc, 0xa9, 0xd0, 0xed, + 0x86, 0x34, 0x5e, 0x42, 0xa6, 0x6e, 0xa3, 0x86, 0x08, 0x07, 0xc0, 0x05, 0x19, 0xc4, 0xf9, 0x54, + 0x35, 0xfb, 0xc6, 0x51, 0xd0, 0xfb, 0xa6, 0xa0, 0xd5, 0xe7, 0x40, 0x7c, 0x48, 0xee, 0xa4, 0xb5, + 0x8d, 0x1a, 0x3c, 0x0c, 0x28, 0x11, 0x69, 0x22, 0x25, 0x6a, 0xda, 0x37, 0x0e, 0xf5, 0x0c, 0xb5, + 0x28, 0x8c, 0x9c, 0x05, 0xe2, 0x2b, 0x77, 0x10, 0xdf, 0x9a, 0x8c, 0xb5, 0x4d, 0x49, 0xbc, 0x5c, + 0xa5, 0xdb, 0x4d, 0x0a, 0xa3, 0xe3, 0x19, 0xff, 0x82, 0xe1, 0xaf, 0x2a, 0x6a, 0xbe, 0x0a, 0xb9, + 0x0b, 0x7d, 0x32, 0x0c, 0x59, 0x9a, 0xa8, 0x26, 0x6a, 0xc8, 0x9b, 0x70, 0x42, 0x3f, 0x27, 0xda, + 0xb0, 0xda, 0x93, 0xb1, 0xb6, 0x51, 0xa8, 0x3f, 0x0b, 0xe9, 0x76, 0x5d, 0xbe, 0x5f, 0xf8, 0xa5, + 0xd1, 0xaa, 0x4b, 0xa3, 0xc5, 0xe8, 0xbf, 0xf9, 0x24, 0x0e, 0xa3, 0x50, 0x70, 0x37, 0xef, 0xbd, + 0xc0, 0x93, 0x59, 0xd5, 0x01, 0xf5, 0x9f, 0x11, 0x41, 0xac, 0xce, 0x64, 0xac, 0xb5, 0x25, 0x8b, + 0x12, 0xa2, 0x6e, 0x37, 0xe7, 0xf6, 0x6b, 0xba, 0xd4, 0x51, 0x8c, 0x58, 0xa7, 0xf6, 0x4f, 0x3b, + 0x8a, 0x11, 0x5b, 0xec, 0x78, 0x3a, 0x62, 0xfb, 0xf5, 0xe9, 0x26, 0xbf, 0x4c, 0xb7, 0x79, 0x84, + 0x36, 0x96, 0x51, 0xca, 0xe2, 0x2a, 0xcb, 0xe2, 0xaa, 0xa8, 0xe6, 0x13, 0x41, 0x0a, 0xd5, 0xf3, + 0x77, 0xa1, 0xcc, 0x1b, 0xd4, 0x3e, 0x9d, 0x9d, 0x13, 0xf8, 0x73, 0xd8, 0x7b, 0xf0, 0x4a, 0x57, + 0x59, 0xbd, 0xf5, 0x2a, 0xad, 0x77, 0x3f, 0xaf, 0x7a, 0xca, 0xe5, 0x55, 0x4f, 0xf9, 0x73, 0xd5, + 0x53, 0x3e, 0x5f, 0xf7, 0x2a, 0x97, 0xd7, 0xbd, 0xca, 0xef, 0xeb, 0x5e, 0xe5, 0xad, 0x15, 0x84, + 0xa2, 0x9f, 0xba, 0x86, 0xc7, 0x06, 0xb8, 0xf8, 0xd7, 0xc9, 0xcf, 0x1e, 0xf7, 0x2f, 0xf0, 0x07, + 0x3c, 0xff, 0xa7, 0xee, 0xdd, 0xf6, 0x53, 0x15, 0x59, 0x0c, 0xdc, 0x5d, 0xcd, 0xcf, 0xf1, 0xe9, + 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x15, 0x70, 0x37, 0x21, 0x81, 0x05, 0x00, 0x00, +>>>>>>> a23f8fc0a... Remove pubkey codec } func (m *ClientState) Marshal() (dAtA []byte, err error) { @@ -3319,8 +3380,13 @@ func (m *ConnectionStateData) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } +<<<<<<< HEAD if m.Connection == nil { m.Connection = &types2.ConnectionEnd{} +======= + if m.PublicKey == nil { + m.PublicKey = &types.Any{} +>>>>>>> a23f8fc0a... Remove pubkey codec } if err := m.Connection.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -3442,8 +3508,13 @@ func (m *ChannelStateData) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } +<<<<<<< HEAD if m.Channel == nil { m.Channel = &types3.Channel{} +======= + if m.NewPublicKey == nil { + m.NewPublicKey = &types.Any{} +>>>>>>> a23f8fc0a... Remove pubkey codec } if err := m.Channel.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err diff --git a/x/ibc/testing/solomachine.go b/x/ibc/testing/solomachine.go index 0b6add4979a5..843c480a097d 100644 --- a/x/ibc/testing/solomachine.go +++ b/x/ibc/testing/solomachine.go @@ -8,7 +8,7 @@ import ( "github.com/tendermint/tendermint/crypto/ed25519" "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/std" + "github.com/cosmos/cosmos-sdk/x/auth/tx" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" "github.com/cosmos/cosmos-sdk/x/ibc/exported" solomachinetypes "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/solomachine/types" @@ -53,7 +53,7 @@ func (solo *Solomachine) ClientState() *solomachinetypes.ClientState { // ConsensusState returns a new solo machine ConsensusState instance func (solo *Solomachine) ConsensusState() *solomachinetypes.ConsensusState { - publicKey, err := std.DefaultPublicKeyCodec{}.Encode(solo.PublicKey) + publicKey, err := tx.PubKeyToAny(solo.PublicKey) require.NoError(solo.t, err) return &solomachinetypes.ConsensusState{ @@ -74,7 +74,7 @@ func (solo *Solomachine) CreateHeader() *solomachinetypes.Header { // generate new private key and signature for header newPrivKey := ed25519.GenPrivKey() - publicKey, err := std.DefaultPublicKeyCodec{}.Encode(newPrivKey.PubKey()) + publicKey, err := tx.PubKeyToAny(solo.PublicKey) require.NoError(solo.t, err) data := &solomachinetypes.HeaderData{ From 9a4dc2588637e747316150e4ebf82d6fbbedb86e Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 10 Sep 2020 16:56:23 +0200 Subject: [PATCH 035/128] Make proto-gen --- codec/codec.go | 2 +- proto/cosmos/tx/signing/v1beta1/signing.proto | 1 - .../solomachine/types/solomachine.pb.go | 354 ++++-------------- 3 files changed, 83 insertions(+), 274 deletions(-) diff --git a/codec/codec.go b/codec/codec.go index 0e501aa105c7..1cbc78b7fc0e 100644 --- a/codec/codec.go +++ b/codec/codec.go @@ -56,7 +56,7 @@ type ( } // AminoMarshaler defines an interface where Amino marshalling can be - // overriden by custom marshalling. + // overridden by custom marshalling. AminoMarshaler interface { MarshalAmino() ([]byte, error) UnmarshalAmino([]byte) error diff --git a/proto/cosmos/tx/signing/v1beta1/signing.proto b/proto/cosmos/tx/signing/v1beta1/signing.proto index b49b6d94b156..e07ce73a7bcc 100644 --- a/proto/cosmos/tx/signing/v1beta1/signing.proto +++ b/proto/cosmos/tx/signing/v1beta1/signing.proto @@ -73,5 +73,4 @@ message SignatureDescriptor { repeated Data signatures = 2; } } - } } diff --git a/x/ibc/light-clients/solomachine/types/solomachine.pb.go b/x/ibc/light-clients/solomachine/types/solomachine.pb.go index bdbb9f5ef066..2cc458a3752c 100644 --- a/x/ibc/light-clients/solomachine/types/solomachine.pb.go +++ b/x/ibc/light-clients/solomachine/types/solomachine.pb.go @@ -5,15 +5,10 @@ package types import ( fmt "fmt" -<<<<<<< HEAD - types1 "github.com/cosmos/cosmos-sdk/codec/types" - types "github.com/cosmos/cosmos-sdk/crypto/types" + types "github.com/cosmos/cosmos-sdk/codec/types" + types1 "github.com/cosmos/cosmos-sdk/crypto/types" types2 "github.com/cosmos/cosmos-sdk/x/ibc/03-connection/types" types3 "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/types" -======= - types "github.com/cosmos/cosmos-sdk/codec/types" - _ "github.com/cosmos/cosmos-sdk/crypto/types" ->>>>>>> a23f8fc0a... Remove pubkey codec _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" @@ -82,16 +77,8 @@ var xxx_messageInfo_ClientState proto.InternalMessageInfo // is contained in the "height" key used in storing the consensus state. type ConsensusState struct { // public key of the solo machine -<<<<<<< HEAD - PublicKey *types.PublicKey `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty" yaml:"public_key"` - // diversifier allows the same public key to be re-used across different solo machine clients - // (potentially on different chains) without being considered misbehaviour. - Diversifier string `protobuf:"bytes,2,opt,name=diversifier,proto3" json:"diversifier,omitempty"` - Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` -======= PublicKey *types.Any `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty" yaml:"public_key"` Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` ->>>>>>> a23f8fc0a... Remove pubkey codec } func (m *ConsensusState) Reset() { *m = ConsensusState{} } @@ -130,17 +117,9 @@ var xxx_messageInfo_ConsensusState proto.InternalMessageInfo // Header defines a solo machine consensus header type Header struct { // sequence to update solo machine public key at -<<<<<<< HEAD - Sequence uint64 `protobuf:"varint,1,opt,name=sequence,proto3" json:"sequence,omitempty"` - Timestamp uint64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - Signature []byte `protobuf:"bytes,3,opt,name=signature,proto3" json:"signature,omitempty"` - NewPublicKey *types.PublicKey `protobuf:"bytes,4,opt,name=new_public_key,json=newPublicKey,proto3" json:"new_public_key,omitempty" yaml:"new_public_key"` - NewDiversifier string `protobuf:"bytes,5,opt,name=new_diversifier,json=newDiversifier,proto3" json:"new_diversifier,omitempty" yaml:"new_diversifier"` -======= Sequence uint64 `protobuf:"varint,1,opt,name=sequence,proto3" json:"sequence,omitempty"` Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` NewPublicKey *types.Any `protobuf:"bytes,3,opt,name=new_public_key,json=newPublicKey,proto3" json:"new_public_key,omitempty" yaml:"new_public_key"` ->>>>>>> a23f8fc0a... Remove pubkey codec } func (m *Header) Reset() { *m = Header{} } @@ -342,7 +321,7 @@ var xxx_messageInfo_SignBytes proto.InternalMessageInfo // HeaderData returns the SignBytes data for misbehaviour verification. type HeaderData struct { // header public key - NewPubKey *types.PublicKey `protobuf:"bytes,1,opt,name=new_pub_key,json=newPubKey,proto3" json:"new_pub_key,omitempty" yaml:"new_pub_key"` + NewPubKey *types1.PublicKey `protobuf:"bytes,1,opt,name=new_pub_key,json=newPubKey,proto3" json:"new_pub_key,omitempty" yaml:"new_pub_key"` // header diversifier NewDiversifier string `protobuf:"bytes,2,opt,name=new_diversifier,json=newDiversifier,proto3" json:"new_diversifier,omitempty" yaml:"new_diversifier"` } @@ -382,8 +361,8 @@ var xxx_messageInfo_HeaderData proto.InternalMessageInfo // ClientStateData returns the SignBytes data for client state verification. type ClientStateData struct { - Path []byte `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` - ClientState *types1.Any `protobuf:"bytes,2,opt,name=client_state,json=clientState,proto3" json:"client_state,omitempty" yaml:"client_state"` + Path []byte `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` + ClientState *types.Any `protobuf:"bytes,2,opt,name=client_state,json=clientState,proto3" json:"client_state,omitempty" yaml:"client_state"` } func (m *ClientStateData) Reset() { *m = ClientStateData{} } @@ -421,8 +400,8 @@ var xxx_messageInfo_ClientStateData proto.InternalMessageInfo // ConsensusStateSignBytes returns the SignBytes data for consensus state verification. type ConsensusStateData struct { - Path []byte `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` - ConsensusState *types1.Any `protobuf:"bytes,2,opt,name=consensus_state,json=consensusState,proto3" json:"consensus_state,omitempty" yaml:"consensus_state"` + Path []byte `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` + ConsensusState *types.Any `protobuf:"bytes,2,opt,name=consensus_state,json=consensusState,proto3" json:"consensus_state,omitempty" yaml:"consensus_state"` } func (m *ConsensusStateData) Reset() { *m = ConsensusStateData{} } @@ -766,117 +745,71 @@ func init() { } var fileDescriptor_6cc2ee18f7f86d4e = []byte{ -<<<<<<< HEAD - // 1030 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x41, 0x6f, 0xe3, 0x44, - 0x14, 0xae, 0xb3, 0x61, 0x69, 0x5e, 0xb2, 0x6d, 0xf1, 0x66, 0x97, 0xb4, 0x40, 0x1c, 0x59, 0x02, - 0x7a, 0x59, 0x5b, 0x59, 0x24, 0x0e, 0x15, 0x1c, 0x92, 0x2c, 0x12, 0x2c, 0x02, 0x2a, 0x77, 0x91, - 0x58, 0x58, 0x64, 0x8d, 0xed, 0x49, 0x62, 0xd5, 0x99, 0x31, 0xf6, 0x24, 0x69, 0x90, 0x38, 0x70, - 0x83, 0x1b, 0x12, 0x17, 0x8e, 0xfc, 0x07, 0x24, 0x7e, 0x03, 0x12, 0x97, 0xe5, 0xc6, 0x29, 0x42, - 0xed, 0x3f, 0xc8, 0x2f, 0x40, 0x9e, 0x19, 0x27, 0xb6, 0xdb, 0xa4, 0x2a, 0xec, 0xc9, 0xe3, 0x99, - 0x6f, 0xbe, 0xf7, 0xe6, 0x9b, 0xf7, 0xe6, 0x3d, 0x68, 0xfb, 0x8e, 0x6b, 0x06, 0xfe, 0x60, 0xc8, - 0xdc, 0xc0, 0xc7, 0x84, 0xc5, 0x66, 0x4c, 0x03, 0x3a, 0x42, 0xee, 0xd0, 0x27, 0xd8, 0x9c, 0xb4, - 0xb3, 0xbf, 0x46, 0x18, 0x51, 0x46, 0x55, 0xcd, 0x77, 0x5c, 0x23, 0xbb, 0xc5, 0xc8, 0x62, 0x26, - 0xed, 0x83, 0xb7, 0x5d, 0x1a, 0x8f, 0x68, 0x6c, 0x3a, 0x28, 0xc6, 0xa6, 0x1b, 0xcd, 0x42, 0x46, - 0xcd, 0x49, 0xdb, 0xc1, 0x0c, 0xb5, 0xe5, 0xaf, 0x60, 0x3a, 0x48, 0x98, 0x4c, 0x97, 0x12, 0x82, - 0x5d, 0xe6, 0x53, 0x92, 0x19, 0x4a, 0xc0, 0x3e, 0x07, 0x0c, 0x11, 0x21, 0x38, 0x48, 0xbf, 0x72, - 0xa9, 0x3e, 0xa0, 0x03, 0xca, 0x87, 0x66, 0x32, 0x4a, 0x37, 0x0c, 0x28, 0x1d, 0x04, 0xd8, 0xe4, - 0x7f, 0xce, 0xb8, 0x6f, 0x22, 0x32, 0x13, 0x4b, 0xfa, 0x5f, 0x25, 0xa8, 0xf6, 0xb8, 0xc3, 0x27, - 0x0c, 0x31, 0xac, 0x1e, 0xc0, 0x76, 0x8c, 0xbf, 0x19, 0x63, 0xe2, 0xe2, 0x86, 0xd2, 0x52, 0x0e, - 0xcb, 0xd6, 0xf2, 0x5f, 0xed, 0xc1, 0x6e, 0x3f, 0xa2, 0xdf, 0x62, 0x62, 0x2f, 0x21, 0xa5, 0x04, - 0xd2, 0x3d, 0x58, 0xcc, 0xb5, 0xfb, 0x33, 0x34, 0x0a, 0x8e, 0xf4, 0x02, 0x40, 0xb7, 0x76, 0xc4, - 0xcc, 0x49, 0x4a, 0xc2, 0x60, 0xd7, 0xa5, 0x24, 0xc6, 0x24, 0x1e, 0xc7, 0x76, 0x9c, 0xd8, 0x6c, - 0xdc, 0x6a, 0x29, 0x87, 0xd5, 0x87, 0xa6, 0x71, 0x8d, 0x82, 0x46, 0x2f, 0xdd, 0xc7, 0x5d, 0xcd, - 0x5a, 0x2d, 0x30, 0xea, 0xd6, 0x8e, 0x9b, 0xc3, 0xaa, 0x18, 0x5e, 0x43, 0x41, 0x40, 0xa7, 0xf6, - 0x38, 0xf4, 0x10, 0xc3, 0x36, 0xea, 0x33, 0x1c, 0xd9, 0x61, 0x44, 0x43, 0x1a, 0xa3, 0xa0, 0x51, - 0x6e, 0x29, 0x87, 0xdb, 0xdd, 0xb7, 0x16, 0x73, 0x4d, 0x17, 0x84, 0x1b, 0xc0, 0xba, 0xd5, 0xe0, - 0xab, 0x9f, 0xf3, 0xc5, 0x4e, 0xb2, 0x76, 0x2c, 0x97, 0x8e, 0xca, 0x3f, 0xfc, 0xaa, 0x6d, 0xe9, - 0xbf, 0x29, 0xb0, 0x93, 0xf7, 0x55, 0xfd, 0x0a, 0x20, 0x1c, 0x3b, 0x81, 0xef, 0xda, 0xa7, 0x78, - 0xc6, 0x85, 0xad, 0x3e, 0x7c, 0xd3, 0x10, 0x11, 0x61, 0x24, 0x11, 0x61, 0xc8, 0x10, 0x90, 0x11, - 0x61, 0x1c, 0x73, 0xf4, 0xc7, 0x78, 0xd6, 0xbd, 0xb7, 0x98, 0x6b, 0xaf, 0x08, 0xaf, 0x56, 0x14, - 0xba, 0x55, 0x09, 0x53, 0x84, 0xda, 0x82, 0xaa, 0xe7, 0x4f, 0x70, 0x14, 0xfb, 0x7d, 0x1f, 0x47, - 0xfc, 0x4e, 0x2a, 0x56, 0x76, 0x4a, 0x7d, 0x1d, 0x2a, 0xcc, 0x1f, 0xe1, 0x98, 0xa1, 0x51, 0xc8, - 0xe5, 0x2e, 0x5b, 0xab, 0x09, 0xe9, 0xf5, 0xcf, 0x25, 0xb8, 0xfd, 0x21, 0x46, 0x1e, 0x8e, 0x36, - 0x06, 0x41, 0x8e, 0xaa, 0x54, 0xa0, 0x4a, 0x56, 0x63, 0x7f, 0x40, 0x10, 0x1b, 0x47, 0xe2, 0x5e, - 0x6b, 0xd6, 0x6a, 0x42, 0xed, 0xc3, 0x0e, 0xc1, 0x53, 0x3b, 0xa3, 0x44, 0xf9, 0x26, 0x4a, 0xec, - 0x2f, 0xe6, 0xda, 0x3d, 0xa1, 0x44, 0x9e, 0x46, 0xb7, 0x6a, 0x04, 0x4f, 0x97, 0xc0, 0x24, 0x50, - 0x13, 0x40, 0x56, 0x94, 0x97, 0x12, 0x51, 0xb2, 0x21, 0x53, 0x00, 0xe8, 0x56, 0xe2, 0xda, 0xa3, - 0xd5, 0x84, 0x54, 0xe5, 0xcf, 0x12, 0xd4, 0x3e, 0xf1, 0x63, 0x07, 0x0f, 0xd1, 0xc4, 0xa7, 0xe3, - 0x48, 0x6d, 0x43, 0x45, 0x84, 0xa7, 0xed, 0x7b, 0x5c, 0x9c, 0x4a, 0xb7, 0xbe, 0x98, 0x6b, 0x7b, - 0x32, 0x10, 0xd3, 0x25, 0xdd, 0xda, 0x16, 0xe3, 0x8f, 0xbc, 0x9c, 0x9c, 0xa5, 0x82, 0x9c, 0x21, - 0xdc, 0x59, 0xea, 0x63, 0x53, 0x92, 0x26, 0x43, 0xfb, 0xda, 0x64, 0x38, 0x49, 0x77, 0x75, 0x88, - 0xf7, 0x08, 0x31, 0xd4, 0x6d, 0x2c, 0xe6, 0x5a, 0x5d, 0x78, 0x91, 0x63, 0xd4, 0xad, 0xda, 0xf2, - 0xff, 0x33, 0x52, 0xb0, 0xc8, 0xa6, 0x54, 0xde, 0xc1, 0x8b, 0xb2, 0xc8, 0xa6, 0x34, 0x6b, 0xf1, - 0xc9, 0x94, 0x1e, 0x6d, 0x27, 0x4a, 0xfe, 0x92, 0xa8, 0xf9, 0x18, 0xf6, 0x8a, 0x2c, 0xf9, 0x90, - 0x51, 0x8a, 0x21, 0xa3, 0x42, 0xd9, 0x43, 0x0c, 0x71, 0xdd, 0x6a, 0x16, 0x1f, 0xcb, 0x9b, 0xf9, - 0x02, 0xea, 0x4f, 0xd2, 0xb8, 0xc3, 0xde, 0x92, 0xf6, 0x1a, 0xbe, 0x8d, 0xe1, 0x2b, 0x99, 0xbf, - 0x57, 0xa0, 0x92, 0xf0, 0x75, 0x67, 0x0c, 0xc7, 0xff, 0x23, 0x19, 0x0a, 0x79, 0x79, 0xeb, 0x72, - 0x5e, 0xa6, 0xa7, 0x2b, 0x5f, 0x3a, 0xdd, 0xef, 0x0a, 0x80, 0xc8, 0x46, 0x2e, 0xd2, 0xd7, 0x50, - 0x95, 0x21, 0x7f, 0xf3, 0x07, 0xe4, 0xfe, 0x62, 0xae, 0xa9, 0xb9, 0xb4, 0x91, 0x2f, 0x88, 0xc8, - 0x99, 0x35, 0x09, 0x53, 0xfa, 0x8f, 0x09, 0xf3, 0x1d, 0xec, 0x66, 0xea, 0x09, 0x77, 0x5e, 0x85, - 0x72, 0x88, 0xd8, 0x50, 0x5e, 0x06, 0x1f, 0xab, 0xc7, 0x50, 0x93, 0xb9, 0x22, 0x6a, 0x40, 0x89, - 0x9f, 0xa8, 0x6e, 0x88, 0x4a, 0x65, 0xa4, 0x95, 0xca, 0xe8, 0x90, 0x59, 0xf7, 0xd5, 0xc5, 0x5c, - 0xbb, 0x9b, 0xcb, 0x2f, 0xf9, 0xca, 0x57, 0xdd, 0x95, 0x25, 0x69, 0xfe, 0x47, 0x05, 0xd4, 0xfc, - 0xdb, 0xbb, 0xd6, 0x85, 0xa7, 0x97, 0x2b, 0xd1, 0x26, 0x2f, 0x6e, 0x50, 0x6e, 0xa4, 0x2f, 0x04, - 0xee, 0xf6, 0x96, 0xb5, 0x7b, 0xb3, 0x2f, 0xef, 0x03, 0xac, 0xca, 0xbc, 0x74, 0xe3, 0x0d, 0x9e, - 0x91, 0x99, 0xea, 0xbf, 0x22, 0xfb, 0x80, 0x78, 0x56, 0x66, 0x83, 0xb4, 0xf7, 0x0c, 0xf6, 0x7a, - 0xa2, 0x1b, 0xd8, 0x6c, 0xcc, 0x80, 0x97, 0x65, 0xd7, 0xb0, 0x3c, 0x30, 0xb7, 0x24, 0x3b, 0x09, - 0xc9, 0x61, 0xa5, 0x20, 0xc9, 0xfe, 0x18, 0xea, 0xc7, 0xc8, 0x3d, 0xc5, 0xac, 0x47, 0x47, 0x23, - 0x9f, 0x8d, 0x30, 0x61, 0x6b, 0x2d, 0x34, 0x93, 0xe3, 0xa4, 0x28, 0x99, 0xbb, 0x99, 0x19, 0xfd, - 0x29, 0xec, 0x0b, 0xae, 0x8e, 0x7b, 0x4a, 0xe8, 0x34, 0xc0, 0xde, 0x00, 0x6f, 0x24, 0x3c, 0x84, - 0x5d, 0x94, 0x87, 0x4a, 0xd6, 0xe2, 0xb4, 0xfe, 0x2e, 0xb4, 0xae, 0xa4, 0xee, 0x38, 0xc9, 0x05, - 0xad, 0x15, 0x45, 0x1f, 0x42, 0xfd, 0x53, 0x7c, 0xc6, 0xd2, 0x3e, 0xc5, 0xc2, 0xee, 0x64, 0xad, - 0x37, 0xef, 0xc1, 0x1d, 0x82, 0xcf, 0x58, 0xd2, 0xe5, 0xd8, 0x11, 0x76, 0x27, 0xb2, 0x0d, 0xca, - 0xbc, 0x87, 0xb9, 0x65, 0xdd, 0xaa, 0x12, 0x41, 0x9d, 0xb0, 0x76, 0x9f, 0xfd, 0x71, 0xde, 0x54, - 0x9e, 0x9f, 0x37, 0x95, 0x7f, 0xce, 0x9b, 0xca, 0x4f, 0x17, 0xcd, 0xad, 0xe7, 0x17, 0xcd, 0xad, - 0xbf, 0x2f, 0x9a, 0x5b, 0x5f, 0x76, 0x07, 0x3e, 0x1b, 0x8e, 0x1d, 0xc3, 0xa5, 0x23, 0x53, 0x76, - 0x8b, 0xe2, 0xf3, 0x20, 0xf6, 0x4e, 0xcd, 0x33, 0x73, 0xd9, 0x95, 0x3e, 0xb8, 0xaa, 0x2d, 0x65, - 0xb3, 0x10, 0xc7, 0xce, 0x6d, 0x1e, 0xb4, 0xef, 0xfc, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xc5, 0x29, - 0x18, 0x98, 0xc3, 0x0a, 0x00, 0x00, -======= - // 654 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0xcf, 0x6e, 0xd3, 0x4e, - 0x10, 0x8e, 0xd3, 0xa8, 0x4a, 0xb6, 0xf9, 0xa5, 0xfd, 0x59, 0x29, 0x4a, 0x43, 0x15, 0x57, 0x3e, - 0x40, 0x2f, 0xf5, 0xca, 0x70, 0xeb, 0xad, 0x2e, 0x07, 0x28, 0x42, 0x54, 0x6e, 0x2b, 0x21, 0x84, - 0x64, 0xad, 0xed, 0xa9, 0x63, 0xd5, 0xd9, 0x35, 0xde, 0x75, 0x82, 0x79, 0x02, 0x8e, 0x1c, 0x39, - 0x20, 0xc1, 0x4b, 0xf0, 0x0e, 0x48, 0x5c, 0x7a, 0xe4, 0x14, 0xa1, 0xf6, 0x0d, 0xf2, 0x04, 0x28, - 0x5e, 0x27, 0x8d, 0xa3, 0xaa, 0xbd, 0x70, 0xf2, 0xce, 0xbf, 0x6f, 0xbe, 0x99, 0x6f, 0x64, 0x64, - 0x86, 0xae, 0x87, 0xa3, 0x30, 0xe8, 0x0b, 0x2f, 0x0a, 0x81, 0x0a, 0x8e, 0x39, 0x8b, 0xd8, 0x80, - 0x78, 0xfd, 0x90, 0x02, 0x1e, 0x9a, 0x8b, 0xa6, 0x11, 0x27, 0x4c, 0x30, 0x55, 0x0b, 0x5d, 0xcf, - 0x58, 0x2c, 0x31, 0x16, 0x73, 0x86, 0x66, 0xf7, 0xb1, 0xc7, 0xf8, 0x80, 0x71, 0xec, 0x12, 0x0e, - 0xd8, 0x4b, 0xb2, 0x58, 0x30, 0x3c, 0x34, 0x5d, 0x10, 0xc4, 0x2c, 0x4c, 0x89, 0xd4, 0x6d, 0x07, - 0x2c, 0x60, 0xf9, 0x13, 0x4f, 0x5f, 0x85, 0x77, 0x2b, 0x60, 0x2c, 0x88, 0x00, 0xe7, 0x96, 0x9b, - 0x9e, 0x63, 0x42, 0x33, 0x19, 0xd2, 0x7f, 0x54, 0xd1, 0xda, 0x61, 0xde, 0xf4, 0x44, 0x10, 0x01, - 0xea, 0x21, 0x5a, 0x3f, 0x4f, 0xd8, 0x47, 0xa0, 0x0e, 0x87, 0xf7, 0x29, 0x50, 0x0f, 0x3a, 0xca, - 0x8e, 0xb2, 0x5b, 0xb3, 0xba, 0x93, 0xb1, 0xf6, 0x20, 0x23, 0x83, 0x68, 0x5f, 0x5f, 0x4a, 0xd0, - 0xed, 0x96, 0xf4, 0x9c, 0x14, 0x0e, 0x55, 0xa0, 0x75, 0x8f, 0x51, 0x0e, 0x94, 0xa7, 0xdc, 0xe1, - 0x53, 0xdc, 0x4e, 0x75, 0x47, 0xd9, 0x5d, 0x7b, 0x82, 0x8d, 0x7b, 0x26, 0x35, 0x0e, 0x67, 0x75, - 0x39, 0x9d, 0xc5, 0xae, 0x4b, 0x88, 0xba, 0xdd, 0xf2, 0x4a, 0xb9, 0x2a, 0xa0, 0x87, 0x24, 0x8a, - 0xd8, 0xc8, 0x49, 0x63, 0x9f, 0x08, 0x70, 0xc8, 0xb9, 0x80, 0xc4, 0x89, 0x13, 0x16, 0x33, 0x4e, - 0xa2, 0xce, 0xca, 0x8e, 0xb2, 0x5b, 0xb7, 0x1e, 0x4d, 0xc6, 0x9a, 0x2e, 0x01, 0xef, 0x48, 0xd6, - 0xed, 0x4e, 0x1e, 0x3d, 0xcb, 0x83, 0x07, 0xd3, 0xd8, 0x71, 0x11, 0xda, 0xaf, 0x7d, 0xfa, 0xae, - 0x55, 0xf4, 0xaf, 0x0a, 0x6a, 0x95, 0xb9, 0xaa, 0x5d, 0x54, 0x2f, 0xef, 0xcc, 0x9e, 0xdb, 0xea, - 0x11, 0x42, 0x71, 0xea, 0x46, 0xa1, 0xe7, 0x5c, 0x40, 0x56, 0x2c, 0xa3, 0x6d, 0x48, 0x59, 0x8c, - 0x99, 0x2c, 0xc6, 0x01, 0xcd, 0xac, 0xcd, 0xc9, 0x58, 0xfb, 0x5f, 0x12, 0xbc, 0xa9, 0xd0, 0xed, - 0x86, 0x34, 0x5e, 0x42, 0xa6, 0x6e, 0xa3, 0x86, 0x08, 0x07, 0xc0, 0x05, 0x19, 0xc4, 0xf9, 0x54, - 0x35, 0xfb, 0xc6, 0x51, 0xd0, 0xfb, 0xa6, 0xa0, 0xd5, 0xe7, 0x40, 0x7c, 0x48, 0xee, 0xa4, 0xb5, - 0x8d, 0x1a, 0x3c, 0x0c, 0x28, 0x11, 0x69, 0x22, 0x25, 0x6a, 0xda, 0x37, 0x0e, 0xf5, 0x0c, 0xb5, - 0x28, 0x8c, 0x9c, 0x05, 0xe2, 0x2b, 0x77, 0x10, 0xdf, 0x9a, 0x8c, 0xb5, 0x4d, 0x49, 0xbc, 0x5c, - 0xa5, 0xdb, 0x4d, 0x0a, 0xa3, 0xe3, 0x19, 0xff, 0x82, 0xe1, 0xaf, 0x2a, 0x6a, 0xbe, 0x0a, 0xb9, - 0x0b, 0x7d, 0x32, 0x0c, 0x59, 0x9a, 0xa8, 0x26, 0x6a, 0xc8, 0x9b, 0x70, 0x42, 0x3f, 0x27, 0xda, - 0xb0, 0xda, 0x93, 0xb1, 0xb6, 0x51, 0xa8, 0x3f, 0x0b, 0xe9, 0x76, 0x5d, 0xbe, 0x5f, 0xf8, 0xa5, - 0xd1, 0xaa, 0x4b, 0xa3, 0xc5, 0xe8, 0xbf, 0xf9, 0x24, 0x0e, 0xa3, 0x50, 0x70, 0x37, 0xef, 0xbd, - 0xc0, 0x93, 0x59, 0xd5, 0x01, 0xf5, 0x9f, 0x11, 0x41, 0xac, 0xce, 0x64, 0xac, 0xb5, 0x25, 0x8b, - 0x12, 0xa2, 0x6e, 0x37, 0xe7, 0xf6, 0x6b, 0xba, 0xd4, 0x51, 0x8c, 0x58, 0xa7, 0xf6, 0x4f, 0x3b, - 0x8a, 0x11, 0x5b, 0xec, 0x78, 0x3a, 0x62, 0xfb, 0xf5, 0xe9, 0x26, 0xbf, 0x4c, 0xb7, 0x79, 0x84, - 0x36, 0x96, 0x51, 0xca, 0xe2, 0x2a, 0xcb, 0xe2, 0xaa, 0xa8, 0xe6, 0x13, 0x41, 0x0a, 0xd5, 0xf3, - 0x77, 0xa1, 0xcc, 0x1b, 0xd4, 0x3e, 0x9d, 0x9d, 0x13, 0xf8, 0x73, 0xd8, 0x7b, 0xf0, 0x4a, 0x57, - 0x59, 0xbd, 0xf5, 0x2a, 0xad, 0x77, 0x3f, 0xaf, 0x7a, 0xca, 0xe5, 0x55, 0x4f, 0xf9, 0x73, 0xd5, - 0x53, 0x3e, 0x5f, 0xf7, 0x2a, 0x97, 0xd7, 0xbd, 0xca, 0xef, 0xeb, 0x5e, 0xe5, 0xad, 0x15, 0x84, - 0xa2, 0x9f, 0xba, 0x86, 0xc7, 0x06, 0xb8, 0xf8, 0xd7, 0xc9, 0xcf, 0x1e, 0xf7, 0x2f, 0xf0, 0x07, - 0x3c, 0xff, 0xa7, 0xee, 0xdd, 0xf6, 0x53, 0x15, 0x59, 0x0c, 0xdc, 0x5d, 0xcd, 0xcf, 0xf1, 0xe9, - 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x15, 0x70, 0x37, 0x21, 0x81, 0x05, 0x00, 0x00, ->>>>>>> a23f8fc0a... Remove pubkey codec + // 1017 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4f, 0x8f, 0xdb, 0x44, + 0x14, 0x5f, 0xa7, 0x51, 0xd9, 0xbc, 0xa4, 0x9b, 0xe2, 0xa6, 0x25, 0xbb, 0x94, 0x38, 0xb2, 0x04, + 0xec, 0xa5, 0xb6, 0x52, 0x24, 0x0e, 0x2b, 0x38, 0x24, 0x29, 0x12, 0x2c, 0x02, 0x56, 0xde, 0x56, + 0xa2, 0xa8, 0xc8, 0x1a, 0xdb, 0xb3, 0x89, 0xb5, 0xf6, 0x8c, 0xb1, 0x27, 0xc9, 0x06, 0x09, 0x09, + 0x6e, 0x70, 0xe3, 0xc8, 0x0d, 0x3e, 0x05, 0x9f, 0x01, 0x89, 0x4b, 0xb9, 0x71, 0x8a, 0xd0, 0xee, + 0x37, 0xc8, 0x27, 0x40, 0x9e, 0x19, 0x3b, 0x76, 0xba, 0xc9, 0x0a, 0x89, 0xd3, 0xfc, 0x79, 0x6f, + 0x7e, 0xef, 0x37, 0xef, 0xdf, 0x0c, 0xf4, 0x7c, 0xc7, 0x35, 0x03, 0x7f, 0x34, 0x66, 0x6e, 0xe0, + 0x63, 0xc2, 0x12, 0x33, 0xa1, 0x01, 0x0d, 0x91, 0x3b, 0xf6, 0x09, 0x36, 0xa7, 0xbd, 0xe2, 0xd2, + 0x88, 0x62, 0xca, 0xa8, 0xaa, 0xf9, 0x8e, 0x6b, 0x14, 0x8f, 0x18, 0x45, 0x9d, 0x69, 0xef, 0xe0, + 0x5d, 0x97, 0x26, 0x21, 0x4d, 0x4c, 0x07, 0x25, 0xd8, 0x74, 0xe3, 0x79, 0xc4, 0xa8, 0x39, 0xed, + 0x39, 0x98, 0xa1, 0x9e, 0x5c, 0x0a, 0xa4, 0x83, 0x14, 0xc9, 0x74, 0x29, 0x21, 0xd8, 0x65, 0x3e, + 0x25, 0x85, 0xa9, 0x54, 0xd8, 0xe7, 0x0a, 0x63, 0x44, 0x08, 0x0e, 0xb2, 0x51, 0x8a, 0x5a, 0x23, + 0x3a, 0xa2, 0x7c, 0x6a, 0xa6, 0xb3, 0xec, 0xc0, 0x88, 0xd2, 0x51, 0x80, 0x4d, 0xbe, 0x72, 0x26, + 0x67, 0x26, 0x22, 0x73, 0x21, 0xd2, 0xff, 0xaa, 0x40, 0x7d, 0xc8, 0x09, 0x9f, 0x32, 0xc4, 0xb0, + 0x7a, 0x00, 0xbb, 0x09, 0xfe, 0x66, 0x82, 0x89, 0x8b, 0xdb, 0x4a, 0x57, 0x39, 0xac, 0x5a, 0xf9, + 0x5a, 0x1d, 0x42, 0xf3, 0x2c, 0xa6, 0xdf, 0x62, 0x62, 0xe7, 0x2a, 0x95, 0x54, 0x65, 0x70, 0xb0, + 0x5c, 0x68, 0x0f, 0xe6, 0x28, 0x0c, 0x8e, 0xf4, 0x35, 0x05, 0xdd, 0xda, 0x13, 0x3b, 0xa7, 0x19, + 0x08, 0x83, 0xa6, 0x4b, 0x49, 0x82, 0x49, 0x32, 0x49, 0xec, 0x24, 0xb5, 0xd9, 0xbe, 0xd5, 0x55, + 0x0e, 0xeb, 0x8f, 0x4d, 0xe3, 0x06, 0x0f, 0x1a, 0xc3, 0xec, 0x1c, 0xa7, 0x5a, 0xb4, 0xba, 0x86, + 0xa8, 0x5b, 0x7b, 0x6e, 0x49, 0x57, 0xc5, 0xf0, 0x26, 0x0a, 0x02, 0x3a, 0xb3, 0x27, 0x91, 0x87, + 0x18, 0xb6, 0xd1, 0x19, 0xc3, 0xb1, 0x1d, 0xc5, 0x34, 0xa2, 0x09, 0x0a, 0xda, 0xd5, 0xae, 0x72, + 0xb8, 0x3b, 0x78, 0x67, 0xb9, 0xd0, 0x74, 0x01, 0xb8, 0x45, 0x59, 0xb7, 0xda, 0x5c, 0xfa, 0x8c, + 0x0b, 0xfb, 0xa9, 0xec, 0x44, 0x8a, 0x8e, 0xaa, 0x3f, 0xfe, 0xa6, 0xed, 0xe8, 0xdf, 0x2b, 0xb0, + 0x57, 0xe6, 0xaa, 0x1e, 0x03, 0x44, 0x13, 0x27, 0xf0, 0x5d, 0xfb, 0x1c, 0xcf, 0xb9, 0xd7, 0xea, + 0x8f, 0x5b, 0x86, 0x08, 0x8b, 0x91, 0x85, 0xc5, 0xe8, 0x93, 0xf9, 0xe0, 0xfe, 0x72, 0xa1, 0xbd, + 0x2e, 0x48, 0xac, 0x4e, 0xe8, 0x56, 0x4d, 0x2c, 0x3e, 0xc5, 0x73, 0xf5, 0x21, 0xd4, 0x98, 0x1f, + 0xe2, 0x84, 0xa1, 0x30, 0xe2, 0xbe, 0xab, 0x5a, 0xab, 0x0d, 0x49, 0xe1, 0x57, 0x05, 0x6e, 0x7f, + 0x8c, 0x91, 0x87, 0xe3, 0xad, 0x11, 0x7d, 0x08, 0xb5, 0xc4, 0x1f, 0x11, 0xc4, 0x26, 0xb1, 0x88, + 0x65, 0xc3, 0x5a, 0x6d, 0xa8, 0xcf, 0x60, 0x8f, 0xe0, 0x99, 0x5d, 0x20, 0x7e, 0x6b, 0x0b, 0xf1, + 0xfd, 0xe5, 0x42, 0xbb, 0x2f, 0x88, 0x97, 0x4f, 0xe9, 0x56, 0x83, 0xe0, 0xd9, 0x49, 0xc6, 0x5f, + 0x32, 0xfc, 0xb3, 0x02, 0x8d, 0xcf, 0xfc, 0xc4, 0xc1, 0x63, 0x34, 0xf5, 0xe9, 0x24, 0x56, 0x7b, + 0x50, 0x13, 0x71, 0xb7, 0x7d, 0x8f, 0x13, 0xad, 0x0d, 0x5a, 0xcb, 0x85, 0x76, 0x57, 0x46, 0x38, + 0x13, 0xe9, 0xd6, 0xae, 0x98, 0x7f, 0xe2, 0x95, 0xae, 0x56, 0x59, 0xbb, 0x5a, 0x04, 0x77, 0xf2, + 0x9b, 0xd8, 0x94, 0x64, 0x59, 0xd6, 0xbb, 0x31, 0xcb, 0x4e, 0xb3, 0x53, 0x7d, 0xe2, 0x3d, 0x41, + 0x0c, 0x0d, 0xda, 0xcb, 0x85, 0xd6, 0x12, 0x2c, 0x4a, 0x88, 0xba, 0xd5, 0xc8, 0xd7, 0x5f, 0x90, + 0x35, 0x8b, 0x6c, 0x46, 0x79, 0x56, 0xfd, 0x7f, 0x16, 0xd9, 0x8c, 0x16, 0x2d, 0x3e, 0x9d, 0xd1, + 0xa3, 0xdd, 0xd4, 0x93, 0xbf, 0xa4, 0xde, 0x3c, 0x86, 0xbb, 0xeb, 0x28, 0xe5, 0xe0, 0x2a, 0xeb, + 0xc1, 0x55, 0xa1, 0xea, 0x21, 0x86, 0x64, 0xd4, 0xf9, 0x5c, 0x46, 0xe6, 0x4b, 0x68, 0x3d, 0xcd, + 0xd2, 0x09, 0x7b, 0x39, 0xec, 0x0d, 0x78, 0xa5, 0xac, 0xac, 0x5c, 0x9f, 0x95, 0x3f, 0x28, 0x50, + 0x4b, 0xf1, 0x06, 0x73, 0x86, 0x93, 0x9b, 0x12, 0x73, 0x33, 0x9a, 0xda, 0x85, 0xba, 0xe7, 0x4f, + 0x71, 0x9c, 0xf8, 0x67, 0x3e, 0x8e, 0x79, 0x64, 0x6b, 0x56, 0x71, 0x2b, 0xbf, 0x5d, 0xf5, 0x95, + 0xdb, 0xfd, 0xae, 0x00, 0x88, 0xca, 0xe0, 0x4e, 0xfa, 0x1a, 0xea, 0x32, 0x5b, 0x79, 0x82, 0x2b, + 0x3c, 0x64, 0x6f, 0x1b, 0xa2, 0x57, 0x1b, 0x69, 0xaf, 0x36, 0x64, 0x73, 0x96, 0xbd, 0xda, 0xc8, + 0x13, 0x79, 0xf0, 0x60, 0xb9, 0xd0, 0xd4, 0x52, 0xc6, 0xcb, 0x5a, 0x15, 0xe9, 0x9e, 0xd6, 0xea, + 0x10, 0x9a, 0xa9, 0xa8, 0xc8, 0xb6, 0xc2, 0x53, 0xbb, 0xd0, 0xbc, 0xd6, 0x14, 0x74, 0x2b, 0xad, + 0xba, 0x27, 0xab, 0x0d, 0x49, 0xfc, 0x3b, 0x68, 0x16, 0x1a, 0x35, 0x27, 0xaf, 0x42, 0x35, 0x42, + 0x6c, 0x2c, 0x83, 0xc1, 0xe7, 0xea, 0x09, 0x34, 0x64, 0xad, 0x88, 0xe6, 0xba, 0xad, 0xd7, 0xbc, + 0xb1, 0x5c, 0x68, 0xf7, 0x4a, 0xf5, 0x25, 0xdb, 0x67, 0xdd, 0x5d, 0x59, 0x92, 0xe6, 0x7f, 0x52, + 0x40, 0x2d, 0x37, 0xb5, 0x8d, 0x14, 0x9e, 0xbf, 0xda, 0xe2, 0xb7, 0xb1, 0xf8, 0x0f, 0x7d, 0x5c, + 0x72, 0x21, 0x70, 0x6f, 0x98, 0x3f, 0x8a, 0xdb, 0xb9, 0x7c, 0x08, 0xb0, 0x7a, 0x3f, 0x25, 0x8d, + 0xb7, 0x78, 0x45, 0x16, 0x9e, 0xd5, 0x15, 0xd8, 0x47, 0xc4, 0xb3, 0x0a, 0x07, 0xa4, 0xbd, 0x17, + 0x70, 0x77, 0x28, 0x9e, 0xd9, 0xed, 0xc6, 0x0c, 0x78, 0x4d, 0x3e, 0xc7, 0xf9, 0x85, 0xb9, 0x25, + 0xf9, 0x44, 0x4b, 0x0c, 0x2b, 0x53, 0x92, 0xe8, 0xc7, 0xd0, 0x3a, 0x41, 0xee, 0x39, 0x66, 0x43, + 0x1a, 0x86, 0x3e, 0x0b, 0x31, 0x61, 0x1b, 0x2d, 0x74, 0xd2, 0xeb, 0x64, 0x5a, 0xb2, 0x76, 0x0b, + 0x3b, 0xfa, 0x73, 0xd8, 0x17, 0x58, 0x7d, 0xf7, 0x9c, 0xd0, 0x59, 0x80, 0xbd, 0x11, 0xde, 0x0a, + 0x78, 0x08, 0x4d, 0x54, 0x56, 0x95, 0xa8, 0xeb, 0xdb, 0xfa, 0xfb, 0xd0, 0xbd, 0x16, 0xba, 0xef, + 0xa4, 0x01, 0xda, 0xe8, 0x14, 0x7d, 0x0c, 0xad, 0xcf, 0xf1, 0x05, 0xcb, 0x3e, 0x00, 0x16, 0x76, + 0xa7, 0x1b, 0xd9, 0x7c, 0x00, 0x77, 0x08, 0xbe, 0x60, 0xe9, 0xf7, 0xc1, 0x8e, 0xb1, 0x3b, 0x95, + 0xff, 0x8b, 0x42, 0x3f, 0x2c, 0x89, 0x75, 0xab, 0x4e, 0x04, 0x74, 0x8a, 0x3a, 0x78, 0xf1, 0xc7, + 0x65, 0x47, 0x79, 0x79, 0xd9, 0x51, 0xfe, 0xb9, 0xec, 0x28, 0x3f, 0x5f, 0x75, 0x76, 0x5e, 0x5e, + 0x75, 0x76, 0xfe, 0xbe, 0xea, 0xec, 0x7c, 0x35, 0x18, 0xf9, 0x6c, 0x3c, 0x71, 0x0c, 0x97, 0x86, + 0xa6, 0xfc, 0x86, 0x89, 0xe1, 0x51, 0xe2, 0x9d, 0x9b, 0x17, 0x66, 0xfe, 0xdd, 0x7b, 0x74, 0xdd, + 0x7f, 0x8f, 0xcd, 0x23, 0x9c, 0x38, 0xb7, 0x79, 0xd2, 0xbe, 0xf7, 0x6f, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x7f, 0x0a, 0xb5, 0x76, 0x1c, 0x0a, 0x00, 0x00, } func (m *ClientState) Marshal() (dAtA []byte, err error) { @@ -959,13 +892,6 @@ func (m *ConsensusState) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x18 } - if len(m.Diversifier) > 0 { - i -= len(m.Diversifier) - copy(dAtA[i:], m.Diversifier) - i = encodeVarintSolomachine(dAtA, i, uint64(len(m.Diversifier))) - i-- - dAtA[i] = 0x12 - } if m.PublicKey != nil { { size, err := m.PublicKey.MarshalToSizedBuffer(dAtA[:i]) @@ -976,7 +902,7 @@ func (m *ConsensusState) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintSolomachine(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 } return len(dAtA) - i, nil } @@ -1001,13 +927,6 @@ func (m *Header) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.NewDiversifier) > 0 { - i -= len(m.NewDiversifier) - copy(dAtA[i:], m.NewDiversifier) - i = encodeVarintSolomachine(dAtA, i, uint64(len(m.NewDiversifier))) - i-- - dAtA[i] = 0x2a - } if m.NewPublicKey != nil { { size, err := m.NewPublicKey.MarshalToSizedBuffer(dAtA[:i]) @@ -1018,19 +937,14 @@ func (m *Header) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintSolomachine(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x22 + dAtA[i] = 0x1a } if len(m.Signature) > 0 { i -= len(m.Signature) copy(dAtA[i:], m.Signature) i = encodeVarintSolomachine(dAtA, i, uint64(len(m.Signature))) i-- - dAtA[i] = 0x1a - } - if m.Timestamp != 0 { - i = encodeVarintSolomachine(dAtA, i, uint64(m.Timestamp)) - i-- - dAtA[i] = 0x10 + dAtA[i] = 0x12 } if m.Sequence != 0 { i = encodeVarintSolomachine(dAtA, i, uint64(m.Sequence)) @@ -1610,10 +1524,6 @@ func (m *ConsensusState) Size() (n int) { l = m.PublicKey.Size() n += 1 + l + sovSolomachine(uint64(l)) } - l = len(m.Diversifier) - if l > 0 { - n += 1 + l + sovSolomachine(uint64(l)) - } if m.Timestamp != 0 { n += 1 + sovSolomachine(uint64(m.Timestamp)) } @@ -1629,9 +1539,6 @@ func (m *Header) Size() (n int) { if m.Sequence != 0 { n += 1 + sovSolomachine(uint64(m.Sequence)) } - if m.Timestamp != 0 { - n += 1 + sovSolomachine(uint64(m.Timestamp)) - } l = len(m.Signature) if l > 0 { n += 1 + l + sovSolomachine(uint64(l)) @@ -1640,10 +1547,6 @@ func (m *Header) Size() (n int) { l = m.NewPublicKey.Size() n += 1 + l + sovSolomachine(uint64(l)) } - l = len(m.NewDiversifier) - if l > 0 { - n += 1 + l + sovSolomachine(uint64(l)) - } return n } @@ -2057,7 +1960,7 @@ func (m *ConsensusState) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: ConsensusState: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) } @@ -2087,44 +1990,12 @@ func (m *ConsensusState) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.PublicKey == nil { - m.PublicKey = &types.PublicKey{} + m.PublicKey = &types.Any{} } if err := m.PublicKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Diversifier", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSolomachine - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthSolomachine - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSolomachine - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Diversifier = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) @@ -2217,25 +2088,6 @@ func (m *Header) Unmarshal(dAtA []byte) error { } } case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) - } - m.Timestamp = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSolomachine - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Timestamp |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) } @@ -2269,7 +2121,7 @@ func (m *Header) Unmarshal(dAtA []byte) error { m.Signature = []byte{} } iNdEx = postIndex - case 4: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field NewPublicKey", wireType) } @@ -2299,44 +2151,12 @@ func (m *Header) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.NewPublicKey == nil { - m.NewPublicKey = &types.PublicKey{} + m.NewPublicKey = &types.Any{} } if err := m.NewPublicKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewDiversifier", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowSolomachine - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthSolomachine - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthSolomachine - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.NewDiversifier = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSolomachine(dAtA[iNdEx:]) @@ -2980,7 +2800,7 @@ func (m *HeaderData) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.NewPubKey == nil { - m.NewPubKey = &types.PublicKey{} + m.NewPubKey = &types1.PublicKey{} } if err := m.NewPubKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -3135,7 +2955,7 @@ func (m *ClientStateData) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.ClientState == nil { - m.ClientState = &types1.Any{} + m.ClientState = &types.Any{} } if err := m.ClientState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -3258,7 +3078,7 @@ func (m *ConsensusStateData) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.ConsensusState == nil { - m.ConsensusState = &types1.Any{} + m.ConsensusState = &types.Any{} } if err := m.ConsensusState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -3380,13 +3200,8 @@ func (m *ConnectionStateData) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } -<<<<<<< HEAD if m.Connection == nil { m.Connection = &types2.ConnectionEnd{} -======= - if m.PublicKey == nil { - m.PublicKey = &types.Any{} ->>>>>>> a23f8fc0a... Remove pubkey codec } if err := m.Connection.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -3508,13 +3323,8 @@ func (m *ChannelStateData) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } -<<<<<<< HEAD if m.Channel == nil { m.Channel = &types3.Channel{} -======= - if m.NewPublicKey == nil { - m.NewPublicKey = &types.Any{} ->>>>>>> a23f8fc0a... Remove pubkey codec } if err := m.Channel.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err From fb8e7a93c5f3ad9dcd354a0b393c90e4a0b7a0ae Mon Sep 17 00:00:00 2001 From: blushi Date: Thu, 10 Sep 2020 17:17:08 +0200 Subject: [PATCH 036/128] Start removal of old PubKeyMultisigThreshold references --- client/keys/add.go | 6 +- client/keys/show.go | 6 +- client/keys/show_test.go | 91 ++++++++++++++++--------------- crypto/keyring/info.go | 22 ++++++-- crypto/keyring/keyring_test.go | 27 +++++---- crypto/keys/multisig.go | 42 ++++++++++++++ crypto/keys/multisig_test.go | 28 +++------- crypto/keys/secp256k1.go | 4 ++ testutil/testdata/test_tx.go | 4 +- x/auth/ante/basic.go | 4 +- x/auth/client/cli/tx_multisign.go | 5 +- x/auth/types/stdtx.go | 5 +- 12 files changed, 150 insertions(+), 94 deletions(-) diff --git a/client/keys/add.go b/client/keys/add.go index 7b25ebe3fc54..d5092d1c6897 100644 --- a/client/keys/add.go +++ b/client/keys/add.go @@ -16,7 +16,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/input" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" + "github.com/cosmos/cosmos-sdk/crypto/keys" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -174,8 +174,8 @@ func RunAddCmd(cmd *cobra.Command, args []string, kb keyring.Keyring, inBuf *buf }) } - pk := multisig.NewPubKeyMultisigThreshold(multisigThreshold, pks) - if _, err := kb.SaveMultisig(name, pk); err != nil { + pk := keys.NewLegacyAminoMultisigThresholdPubKey(multisigThreshold, pks) + if _, err := kb.SaveMultisig(name, &pk); err != nil { return err } diff --git a/client/keys/show.go b/client/keys/show.go index 3899e1ea3f9d..05070e9b1940 100644 --- a/client/keys/show.go +++ b/client/keys/show.go @@ -10,8 +10,8 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/crypto/keyring" + "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/ledger" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -83,8 +83,8 @@ func runShowCmd(cmd *cobra.Command, args []string) (err error) { return err } - multikey := multisig.NewPubKeyMultisigThreshold(multisigThreshold, pks) - info = keyring.NewMultiInfo(defaultMultiSigKeyName, multikey) + multikey := keys.NewLegacyAminoMultisigThresholdPubKey(multisigThreshold, pks) + info = keyring.NewMultiInfo(defaultMultiSigKeyName, &multikey) } isShowAddr, _ := cmd.Flags().GetBool(FlagAddress) diff --git a/client/keys/show_test.go b/client/keys/show_test.go index a18644207973..ccfaeab556eb 100644 --- a/client/keys/show_test.go +++ b/client/keys/show_test.go @@ -11,21 +11,24 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" + "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" ) func Test_multiSigKey_Properties(t *testing.T) { tmpKey1 := secp256k1.GenPrivKeyFromSecret([]byte("mySecret")) - pk := multisig.NewPubKeyMultisigThreshold(1, []crypto.PubKey{tmpKey1.PubKey()}) - tmp := keyring.NewMultiInfo("myMultisig", pk) + pk := keys.NewLegacyAminoMultisigThresholdPubKey( + 1, + []crypto.PubKey{&keys.Secp256K1PubKey{Key: tmpKey1.PubKey().(secp256k1.PubKey)}}, + ) + tmp := keyring.NewMultiInfo("myMultisig", &pk) require.Equal(t, "myMultisig", tmp.GetName()) require.Equal(t, keyring.TypeMulti, tmp.GetType()) - require.Equal(t, "D3923267FA8A3DD367BB768FA8BDC8FF7F89DA3F", tmp.GetPubKey().Address().String()) - require.Equal(t, "cosmos16wfryel63g7axeamw68630wglalcnk3l0zuadc", sdk.MustBech32ifyAddressBytes("cosmos", tmp.GetAddress())) + require.Equal(t, "CCEA75F6A6E0D232C9708BF4EA9787B4731FDE9D", tmp.GetPubKey().Address().String()) + require.Equal(t, "cosmos1en48ta4xurfr9jts306w49u8k3e3lh5a94e0vl", sdk.MustBech32ifyAddressBytes("cosmos", tmp.GetAddress())) } func Test_showKeysCmd(t *testing.T) { @@ -68,45 +71,45 @@ func Test_runShowCmd(t *testing.T) { require.NoError(t, err) // Now try single key - cmd.SetArgs([]string{ - fakeKeyName1, - fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome), - fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), - fmt.Sprintf("--%s=", FlagBechPrefix), - }) - require.EqualError(t, cmd.Execute(), "invalid Bech32 prefix encoding provided: ") - - cmd.SetArgs([]string{ - fakeKeyName1, - fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome), - fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), - fmt.Sprintf("--%s=%s", FlagBechPrefix, sdk.PrefixAccount), - }) - - // try fetch by name - require.NoError(t, cmd.Execute()) - - // try fetch by addr - info, err := kb.Key(fakeKeyName1) - cmd.SetArgs([]string{ - info.GetAddress().String(), - fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome), - fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), - fmt.Sprintf("--%s=%s", FlagBechPrefix, sdk.PrefixAccount), - }) - - require.NoError(t, err) - require.NoError(t, cmd.Execute()) - - // Now try multisig key - set bech to acc - cmd.SetArgs([]string{ - fakeKeyName1, fakeKeyName2, - fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome), - fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), - fmt.Sprintf("--%s=%s", FlagBechPrefix, sdk.PrefixAccount), - fmt.Sprintf("--%s=0", flagMultiSigThreshold), - }) - require.EqualError(t, cmd.Execute(), "threshold must be a positive integer") + // cmd.SetArgs([]string{ + // fakeKeyName1, + // fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome), + // fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), + // fmt.Sprintf("--%s=", FlagBechPrefix), + // }) + // require.EqualError(t, cmd.Execute(), "invalid Bech32 prefix encoding provided: ") + + // cmd.SetArgs([]string{ + // fakeKeyName1, + // fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome), + // fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), + // fmt.Sprintf("--%s=%s", FlagBechPrefix, sdk.PrefixAccount), + // }) + + // // try fetch by name + // require.NoError(t, cmd.Execute()) + + // // try fetch by addr + // info, err := kb.Key(fakeKeyName1) + // cmd.SetArgs([]string{ + // info.GetAddress().String(), + // fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome), + // fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), + // fmt.Sprintf("--%s=%s", FlagBechPrefix, sdk.PrefixAccount), + // }) + + // require.NoError(t, err) + // require.NoError(t, cmd.Execute()) + + // // Now try multisig key - set bech to acc + // cmd.SetArgs([]string{ + // fakeKeyName1, fakeKeyName2, + // fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome), + // fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), + // fmt.Sprintf("--%s=%s", FlagBechPrefix, sdk.PrefixAccount), + // fmt.Sprintf("--%s=0", flagMultiSigThreshold), + // }) + // require.EqualError(t, cmd.Execute(), "threshold must be a positive integer") cmd.SetArgs([]string{ fakeKeyName1, fakeKeyName2, diff --git a/crypto/keyring/info.go b/crypto/keyring/info.go index 74bb62d774f2..abe7cd521cef 100644 --- a/crypto/keyring/info.go +++ b/crypto/keyring/info.go @@ -5,8 +5,10 @@ import ( "github.com/tendermint/tendermint/crypto" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/hd" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" + "github.com/cosmos/cosmos-sdk/crypto/keys" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/types" ) @@ -63,7 +65,7 @@ func (i localInfo) GetName() string { // GetType implements Info interface func (i localInfo) GetPubKey() crypto.PubKey { - return i.PubKey + return &keys.Secp256K1PubKey{Key: i.PubKey.(secp256k1.PubKey)} } // GetType implements Info interface @@ -191,10 +193,10 @@ type multiInfo struct { // NewMultiInfo creates a new multiInfo instance func NewMultiInfo(name string, pub crypto.PubKey) Info { - multiPK := pub.(multisig.PubKeyMultisigThreshold) + multiPK := pub.(*keys.LegacyAminoMultisigThresholdPubKey) pubKeys := make([]multisigPubKeyInfo, len(multiPK.PubKeys)) - for i, pk := range multiPK.PubKeys { + for i, pk := range multiPK.GetPubKeys() { // TODO: Recursively check pk for total weight? pubKeys[i] = multisigPubKeyInfo{pk, 1} } @@ -202,7 +204,7 @@ func NewMultiInfo(name string, pub crypto.PubKey) Info { return &multiInfo{ Name: name, PubKey: pub, - Threshold: multiPK.K, + Threshold: uint(multiPK.K), PubKeys: pubKeys, } } @@ -237,6 +239,16 @@ func (i multiInfo) GetPath() (*hd.BIP44Params, error) { return nil, fmt.Errorf("BIP44 Paths are not available for this type") } +// UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces +func (i multiInfo) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { + multiPK := i.PubKey.(*keys.LegacyAminoMultisigThresholdPubKey) + err := codectypes.UnpackInterfaces(multiPK, unpacker) + if err != nil { + return err + } + return nil +} + // encoding info func marshalInfo(i Info) []byte { return CryptoCdc.MustMarshalBinaryLengthPrefixed(i) diff --git a/crypto/keyring/keyring_test.go b/crypto/keyring/keyring_test.go index e586fe38a0b9..19dd5d150f3b 100644 --- a/crypto/keyring/keyring_test.go +++ b/crypto/keyring/keyring_test.go @@ -13,8 +13,8 @@ import ( "github.com/cosmos/cosmos-sdk/crypto" "github.com/cosmos/cosmos-sdk/crypto/hd" + "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/testutil" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -390,11 +390,12 @@ func TestInMemoryLanguage(t *testing.T) { func TestInMemoryCreateMultisig(t *testing.T) { kb, err := New("keybasename", "memory", "", nil) require.NoError(t, err) - multi := multisig.PubKeyMultisigThreshold{ - K: 1, - PubKeys: []tmcrypto.PubKey{secp256k1.GenPrivKey().PubKey()}, - } - _, err = kb.SaveMultisig("multi", multi) + multi := keys.NewLegacyAminoMultisigThresholdPubKey( + 1, []tmcrypto.PubKey{&keys.Secp256K1PubKey{ + Key: secp256k1.GenPrivKey().PubKey().(secp256k1.PubKey), + }}, + ) + _, err = kb.SaveMultisig("multi", &multi) require.NoError(t, err) } @@ -980,11 +981,17 @@ func TestAltKeyring_SaveMultisig(t *testing.T) { require.NoError(t, err) key := "multi" - pub := multisig.NewPubKeyMultisigThreshold(2, []tmcrypto.PubKey{mnemonic1.GetPubKey(), mnemonic2.GetPubKey()}) - - info, err := keyring.SaveMultisig(key, pub) + pub := keys.NewLegacyAminoMultisigThresholdPubKey( + 2, + []tmcrypto.PubKey{ + &keys.Secp256K1PubKey{Key: mnemonic1.GetPubKey().(secp256k1.PubKey)}, + &keys.Secp256K1PubKey{Key: mnemonic2.GetPubKey().(secp256k1.PubKey)}, + }, + ) + + info, err := keyring.SaveMultisig(key, &pub) require.Nil(t, err) - require.Equal(t, pub, info.GetPubKey()) + require.Equal(t, &pub, info.GetPubKey()) require.Equal(t, key, info.GetName()) list, err := keyring.List() diff --git a/crypto/keys/multisig.go b/crypto/keys/multisig.go index 8ed0aceb3dec..0acbba56c17a 100644 --- a/crypto/keys/multisig.go +++ b/crypto/keys/multisig.go @@ -4,6 +4,7 @@ import ( fmt "fmt" "github.com/cosmos/cosmos-sdk/codec" + proto "github.com/gogo/protobuf/proto" "github.com/cosmos/cosmos-sdk/codec/types" crypto "github.com/cosmos/cosmos-sdk/crypto/types" @@ -17,6 +18,22 @@ var cdc = codec.NewProtoCodec(types.NewInterfaceRegistry()) var _ multisig.PubKey = &LegacyAminoMultisigThresholdPubKey{} +// NewLegacyAminoMultisigThresholdPubKey returns a new LegacyAminoMultisigThresholdPubKey. +// Panics if len(pubKeys) < k or 0 >= k. +func NewLegacyAminoMultisigThresholdPubKey(k int, pubKeys []tmcrypto.PubKey) LegacyAminoMultisigThresholdPubKey { + if k <= 0 { + panic("threshold k of n multisignature: k <= 0") + } + if len(pubKeys) < k { + panic("threshold k of n multisignature: len(pubKeys) < k") + } + anyPubKeys, err := PackPubKeys(pubKeys) + if err != nil { + panic(err) + } + return LegacyAminoMultisigThresholdPubKey{K: uint32(k), PubKeys: anyPubKeys} +} + // Address implements crypto.PubKey Address method func (m *LegacyAminoMultisigThresholdPubKey) Address() crypto.Address { return tmcrypto.AddressHash(m.Bytes()) @@ -126,3 +143,28 @@ func (m *LegacyAminoMultisigThresholdPubKey) GetThreshold() uint { func (m *LegacyAminoMultisigThresholdPubKey) Type() string { return "PubKeyMultisigThreshold" } + +// UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces +func (m *LegacyAminoMultisigThresholdPubKey) UnpackInterfaces(unpacker types.AnyUnpacker) error { + for _, any := range m.PubKeys { + var pk crypto.PubKey + err := unpacker.UnpackAny(any, &pk) + if err != nil { + return err + } + } + return nil +} + +func PackPubKeys(pubKeys []tmcrypto.PubKey) ([]*types.Any, error) { + anyPubKeys := make([]*types.Any, len(pubKeys)) + + for i := 0; i < len(pubKeys); i++ { + any, err := types.NewAnyWithValue(pubKeys[i].(proto.Message)) + if err != nil { + return nil, err + } + anyPubKeys[i] = any + } + return anyPubKeys, nil +} diff --git a/crypto/keys/multisig_test.go b/crypto/keys/multisig_test.go index 10b3db8ae61b..e9f270c8d03e 100644 --- a/crypto/keys/multisig_test.go +++ b/crypto/keys/multisig_test.go @@ -7,7 +7,6 @@ import ( keys "github.com/cosmos/cosmos-sdk/crypto/keys" crypto "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" - proto "github.com/gogo/protobuf/proto" tmcrypto "github.com/tendermint/tendermint/crypto" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" @@ -18,7 +17,7 @@ import ( func TestAddress(t *testing.T) { msg := []byte{1, 2, 3, 4} pubKeys, _ := generatePubKeysAndSignatures(5, msg) - anyPubKeys, err := packPubKeys(pubKeys) + anyPubKeys, err := keys.PackPubKeys(pubKeys) require.NoError(t, err) multisigKey := &keys.LegacyAminoMultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys} @@ -31,11 +30,11 @@ func TestEquals(t *testing.T) { pbPubKey1 := &keys.Secp256K1PubKey{Key: pubKey1.(secp256k1.PubKey)} pbPubKey2 := &keys.Secp256K1PubKey{Key: pubKey2.(secp256k1.PubKey)} - anyPubKeys, err := packPubKeys([]tmcrypto.PubKey{pbPubKey1, pbPubKey2}) + anyPubKeys, err := keys.PackPubKeys([]tmcrypto.PubKey{pbPubKey1, pbPubKey2}) require.NoError(t, err) multisigKey := keys.LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys} - otherPubKeys, err := packPubKeys([]tmcrypto.PubKey{pbPubKey1, &multisigKey}) + otherPubKeys, err := keys.PackPubKeys([]tmcrypto.PubKey{pbPubKey1, &multisigKey}) require.NoError(t, err) otherMultisigKey := keys.LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: otherPubKeys} @@ -111,7 +110,7 @@ func TestVerifyMultisignature(t *testing.T) { "wrong size for sig bit array", func() { pubKeys, _ := generatePubKeysAndSignatures(3, msg) - anyPubKeys, err := packPubKeys(pubKeys) + anyPubKeys, err := keys.PackPubKeys(pubKeys) require.NoError(t, err) pk = &keys.LegacyAminoMultisigThresholdPubKey{K: 3, PubKeys: anyPubKeys} sig = multisig.NewMultisig(1) @@ -124,7 +123,7 @@ func TestVerifyMultisignature(t *testing.T) { k := 2 signingIndices := []int{0, 3, 1} pubKeys, sigs := generatePubKeysAndSignatures(5, msg) - anyPubKeys, err := packPubKeys(pubKeys) + anyPubKeys, err := keys.PackPubKeys(pubKeys) require.NoError(t, err) pk = &keys.LegacyAminoMultisigThresholdPubKey{K: uint32(k), PubKeys: anyPubKeys} sig = multisig.NewMultisig(len(pubKeys)) @@ -207,14 +206,14 @@ func generateNestedMultiSignature(n int, msg []byte) (multisig.PubKey, *signing. Signatures: nestedSigs, } signatures[i] = nestedSig - anyNestedPks, err := packPubKeys(nestedPks) + anyNestedPks, err := keys.PackPubKeys(nestedPks) if err != nil { return nil, nil, err } pubKeys[i] = &keys.LegacyAminoMultisigThresholdPubKey{K: 5, PubKeys: anyNestedPks} bitArray.SetIndex(i, true) } - anyPubKeys, err := packPubKeys(pubKeys) + anyPubKeys, err := keys.PackPubKeys(pubKeys) if err != nil { return nil, nil, err } @@ -223,16 +222,3 @@ func generateNestedMultiSignature(n int, msg []byte) (multisig.PubKey, *signing. Signatures: signatures, }, nil } - -func packPubKeys(pubKeys []tmcrypto.PubKey) ([]*types.Any, error) { - anyPubKeys := make([]*types.Any, len(pubKeys)) - - for i := 0; i < len(pubKeys); i++ { - any, err := types.NewAnyWithValue(pubKeys[i].(proto.Message)) - if err != nil { - return nil, err - } - anyPubKeys[i] = any - } - return anyPubKeys, nil -} diff --git a/crypto/keys/secp256k1.go b/crypto/keys/secp256k1.go index 0cc4b7294c59..a480f47d143b 100644 --- a/crypto/keys/secp256k1.go +++ b/crypto/keys/secp256k1.go @@ -51,3 +51,7 @@ func (m *Secp256K1PrivKey) Equals(key tmcrypto.PrivKey) bool { func (m *Secp256K1PrivKey) Type() string { return m.Key.Type() } + +func GenPrivKey() crypto.PrivKey { + return &Secp256K1PrivKey{Key: secp256k1.GenPrivKey()} +} diff --git a/testutil/testdata/test_tx.go b/testutil/testdata/test_tx.go index bbcfde5f8195..7adf8a3d6b80 100644 --- a/testutil/testdata/test_tx.go +++ b/testutil/testdata/test_tx.go @@ -5,13 +5,13 @@ import ( "github.com/tendermint/tendermint/crypto" - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + "github.com/cosmos/cosmos-sdk/crypto/keys" sdk "github.com/cosmos/cosmos-sdk/types" ) // KeyTestPubAddr generates a new secp256k1 keypair. func KeyTestPubAddr() (crypto.PrivKey, crypto.PubKey, sdk.AccAddress) { - key := secp256k1.GenPrivKey() + key := keys.GenPrivKey() pub := key.PubKey() addr := sdk.AccAddress(pub.Address()) return key, pub, addr diff --git a/x/auth/ante/basic.go b/x/auth/ante/basic.go index df874a63b1f4..7ffd37aa8b2b 100644 --- a/x/auth/ante/basic.go +++ b/x/auth/ante/basic.go @@ -4,7 +4,7 @@ import ( "github.com/tendermint/tendermint/crypto" "github.com/cosmos/cosmos-sdk/codec/legacy" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" + "github.com/cosmos/cosmos-sdk/crypto/keys" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/tx/signing" @@ -136,7 +136,7 @@ func (cgts ConsumeTxSizeGasDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, sim // If the pubkey is a multi-signature pubkey, then we estimate for the maximum // number of signers. - if _, ok := pubkey.(multisig.PubKeyMultisigThreshold); ok { + if _, ok := pubkey.(*keys.LegacyAminoMultisigThresholdPubKey); ok { cost *= params.TxSigLimit } diff --git a/x/auth/client/cli/tx_multisign.go b/x/auth/client/cli/tx_multisign.go index a7c866f616fb..bab957e6d0a6 100644 --- a/x/auth/client/cli/tx_multisign.go +++ b/x/auth/client/cli/tx_multisign.go @@ -13,6 +13,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/crypto/keyring" + "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" sdk "github.com/cosmos/cosmos-sdk/types" signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" @@ -97,7 +98,7 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { return fmt.Errorf("%q must be of type %s: %s", args[1], keyring.TypeMulti, multisigInfo.GetType()) } - multisigPub := multisigInfo.GetPubKey().(multisig.PubKeyMultisigThreshold) + multisigPub := multisigInfo.GetPubKey().(*keys.LegacyAminoMultisigThresholdPubKey) multisigSig := multisig.NewMultisig(len(multisigPub.PubKeys)) if !clientCtx.Offline { accnum, seq, err := clientCtx.AccountRetriever.GetAccountNumberSequence(clientCtx, multisigInfo.GetAddress()) @@ -127,7 +128,7 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { return fmt.Errorf("couldn't verify signature: %w", err) } - if err := multisig.AddSignatureV2(multisigSig, sig, multisigPub.PubKeys); err != nil { + if err := multisig.AddSignatureV2(multisigSig, sig, multisigPub.GetPubKeys()); err != nil { return err } } diff --git a/x/auth/types/stdtx.go b/x/auth/types/stdtx.go index 1ba33bc0e56c..57e51bb00939 100644 --- a/x/auth/types/stdtx.go +++ b/x/auth/types/stdtx.go @@ -12,6 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/legacy" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -116,13 +117,13 @@ func (ss StdSignature) MarshalYAML() (interface{}, error) { // CountSubKeys counts the total number of keys for a multi-sig public key. func CountSubKeys(pub crypto.PubKey) int { - v, ok := pub.(multisig.PubKeyMultisigThreshold) + v, ok := pub.(*keys.LegacyAminoMultisigThresholdPubKey) if !ok { return 1 } numKeys := 0 - for _, subkey := range v.PubKeys { + for _, subkey := range v.GetPubKeys() { numKeys += CountSubKeys(subkey) } From 4e4ce4e0b1a21e5112a70d62ccd958f72e278b1a Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 10 Sep 2020 18:51:08 +0200 Subject: [PATCH 037/128] Fix tests --- crypto/keys/secp256k1.go | 10 +++++----- crypto/keys/secp256k1_test.go | 21 +++++++++++++++------ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/crypto/keys/secp256k1.go b/crypto/keys/secp256k1.go index 681339f8f34f..408c5c69ff0e 100644 --- a/crypto/keys/secp256k1.go +++ b/crypto/keys/secp256k1.go @@ -34,12 +34,12 @@ func (m *Secp256K1PubKey) Type() string { return m.Key.Type() } -// MarshalAminoJSON overrides Amino binary marshalling. -func (m *Secp256K1PubKey) MarshalAmino() ([]byte, error) { +// MarshalAmino overrides Amino binary marshalling. +func (m Secp256K1PubKey) MarshalAmino() ([]byte, error) { return m.Key.Bytes(), nil } -// UnmarshalAminoJSON overrides Amino binary marshalling. +// UnmarshalAmino overrides Amino binary marshalling. func (m *Secp256K1PubKey) UnmarshalAmino(bz []byte) error { *m = Secp256K1PubKey{ Key: bz, @@ -78,12 +78,12 @@ func (m *Secp256K1PrivKey) Type() string { return m.Key.Type() } -// MarshalAminoJSON overrides Amino binary marshalling. +// MarshalAmino overrides Amino binary marshalling. func (m Secp256K1PrivKey) MarshalAmino() ([]byte, error) { return m.Key.Bytes(), nil } -// UnmarshalAminoJSON overrides Amino binary marshalling. +// UnmarshalAmino overrides Amino binary marshalling. func (m *Secp256K1PrivKey) UnmarshalAmino(bz []byte) error { *m = Secp256K1PrivKey{ Key: bz, diff --git a/crypto/keys/secp256k1_test.go b/crypto/keys/secp256k1_test.go index b08e5572cf3f..e02cde7af94f 100644 --- a/crypto/keys/secp256k1_test.go +++ b/crypto/keys/secp256k1_test.go @@ -1,6 +1,8 @@ package keys_test import ( + "encoding/base64" + "reflect" "testing" "github.com/cosmos/cosmos-sdk/codec" @@ -157,13 +159,19 @@ func TestMarshalAmino(t *testing.T) { desc string msg codec.AminoMarshaler expBinary []byte - expJSON []byte + expJSON string }{ { "secp256k1 private key", &keys.Secp256K1PrivKey{Key: privKey}, append([]byte{32}, privKey.Bytes()...), // Length-prefixed. - append([]byte{32}, privKey.Bytes()...), // Length-prefixed. + "\"" + base64.StdEncoding.EncodeToString(privKey.Bytes()) + "\"", + }, + { + "secp256k1 public key", + &keys.Secp256K1PubKey{Key: privKey.PubKey().(secp256k1.PubKey)}, + append([]byte{33}, privKey.PubKey().Bytes()...), + "\"" + base64.StdEncoding.EncodeToString(privKey.PubKey().Bytes()) + "\"", }, } @@ -174,7 +182,8 @@ func TestMarshalAmino(t *testing.T) { require.NoError(t, err) require.Equal(t, tc.expBinary, bz) - newMsg := new(keys.Secp256K1PrivKey) + // Create a new empty value of the same type as `tc.msg`. + newMsg := reflect.New(reflect.TypeOf(tc.msg).Elem()).Interface().(codec.AminoMarshaler) err = aminoCdc.UnmarshalBinaryBare(bz, newMsg) require.NoError(t, err) @@ -183,14 +192,14 @@ func TestMarshalAmino(t *testing.T) { // Do a round trip of encoding/decoding JSON. bz, err = aminoCdc.MarshalJSON(tc.msg) require.NoError(t, err) - require.Equal(t, tc.expJSON, bz) + require.Equal(t, tc.expJSON, string(bz)) - newMsg = new(keys.Secp256K1PrivKey) + // Create a new empty value of the same type as `tc.msg`. + newMsg = reflect.New(reflect.TypeOf(tc.msg).Elem()).Interface().(codec.AminoMarshaler) err = aminoCdc.UnmarshalJSON(bz, newMsg) require.NoError(t, err) require.Equal(t, tc.msg, newMsg) }) } - } From d3c76f56c5dbb9959cd9681e1ddc041f6b62c8bd Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 11 Sep 2020 13:29:52 +0200 Subject: [PATCH 038/128] Fix solomachine --- .../solomachine/v1/solomachine.proto | 19 +- .../solomachine/types/solomachine.pb.go | 286 +++++++++++++----- 2 files changed, 213 insertions(+), 92 deletions(-) diff --git a/proto/ibc/lightclients/solomachine/v1/solomachine.proto b/proto/ibc/lightclients/solomachine/v1/solomachine.proto index 6d55eb6995d2..9281c907c371 100644 --- a/proto/ibc/lightclients/solomachine/v1/solomachine.proto +++ b/proto/ibc/lightclients/solomachine/v1/solomachine.proto @@ -28,19 +28,22 @@ message ClientState { message ConsensusState { option (gogoproto.goproto_getters) = false; // public key of the solo machine - google.protobuf.Any public_key = 2 - [(gogoproto.moretags) = "yaml:\"public_key\""]; - uint64 timestamp = 3; + google.protobuf.Any public_key = 1 [(gogoproto.moretags) = "yaml:\"public_key\""]; + // diversifier allows the same public key to be re-used across different solo machine clients + // (potentially on different chains) without being considered misbehaviour. + string diversifier = 2; + uint64 timestamp = 3; } // Header defines a solo machine consensus header message Header { option (gogoproto.goproto_getters) = false; // sequence to update solo machine public key at - uint64 sequence = 1; - bytes signature = 2; - google.protobuf.Any new_public_key = 3 - [(gogoproto.moretags) = "yaml:\"new_public_key\""]; + uint64 sequence = 1; + uint64 timestamp = 2; + bytes signature = 3; + google.protobuf.Any new_public_key = 4 [(gogoproto.moretags) = "yaml:\"new_public_key\""]; + string new_diversifier = 5 [(gogoproto.moretags) = "yaml:\"new_diversifier\""]; } // Misbehaviour defines misbehaviour for a solo machine which consists @@ -86,7 +89,7 @@ message HeaderData { option (gogoproto.goproto_getters) = false; // header public key - cosmos.base.crypto.v1beta1.PublicKey new_pub_key = 1 [(gogoproto.moretags) = "yaml:\"new_pub_key\""]; + google.protobuf.Any new_pub_key = 1 [(gogoproto.moretags) = "yaml:\"new_pub_key\""]; // header diversifier string new_diversifier = 2 [(gogoproto.moretags) = "yaml:\"new_diversifier\""]; } diff --git a/x/ibc/light-clients/solomachine/types/solomachine.pb.go b/x/ibc/light-clients/solomachine/types/solomachine.pb.go index 2cc458a3752c..a841a398f826 100644 --- a/x/ibc/light-clients/solomachine/types/solomachine.pb.go +++ b/x/ibc/light-clients/solomachine/types/solomachine.pb.go @@ -6,9 +6,9 @@ package types import ( fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" - types1 "github.com/cosmos/cosmos-sdk/crypto/types" - types2 "github.com/cosmos/cosmos-sdk/x/ibc/03-connection/types" - types3 "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/types" + _ "github.com/cosmos/cosmos-sdk/crypto/types" + types1 "github.com/cosmos/cosmos-sdk/x/ibc/03-connection/types" + types2 "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/types" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" io "io" @@ -77,8 +77,11 @@ var xxx_messageInfo_ClientState proto.InternalMessageInfo // is contained in the "height" key used in storing the consensus state. type ConsensusState struct { // public key of the solo machine - PublicKey *types.Any `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty" yaml:"public_key"` - Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + PublicKey *types.Any `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty" yaml:"public_key"` + // diversifier allows the same public key to be re-used across different solo machine clients + // (potentially on different chains) without being considered misbehaviour. + Diversifier string `protobuf:"bytes,2,opt,name=diversifier,proto3" json:"diversifier,omitempty"` + Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (m *ConsensusState) Reset() { *m = ConsensusState{} } @@ -117,9 +120,11 @@ var xxx_messageInfo_ConsensusState proto.InternalMessageInfo // Header defines a solo machine consensus header type Header struct { // sequence to update solo machine public key at - Sequence uint64 `protobuf:"varint,1,opt,name=sequence,proto3" json:"sequence,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` - NewPublicKey *types.Any `protobuf:"bytes,3,opt,name=new_public_key,json=newPublicKey,proto3" json:"new_public_key,omitempty" yaml:"new_public_key"` + Sequence uint64 `protobuf:"varint,1,opt,name=sequence,proto3" json:"sequence,omitempty"` + Timestamp uint64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Signature []byte `protobuf:"bytes,3,opt,name=signature,proto3" json:"signature,omitempty"` + NewPublicKey *types.Any `protobuf:"bytes,4,opt,name=new_public_key,json=newPublicKey,proto3" json:"new_public_key,omitempty" yaml:"new_public_key"` + NewDiversifier string `protobuf:"bytes,5,opt,name=new_diversifier,json=newDiversifier,proto3" json:"new_diversifier,omitempty" yaml:"new_diversifier"` } func (m *Header) Reset() { *m = Header{} } @@ -321,7 +326,7 @@ var xxx_messageInfo_SignBytes proto.InternalMessageInfo // HeaderData returns the SignBytes data for misbehaviour verification. type HeaderData struct { // header public key - NewPubKey *types1.PublicKey `protobuf:"bytes,1,opt,name=new_pub_key,json=newPubKey,proto3" json:"new_pub_key,omitempty" yaml:"new_pub_key"` + NewPubKey *types.Any `protobuf:"bytes,1,opt,name=new_pub_key,json=newPubKey,proto3" json:"new_pub_key,omitempty" yaml:"new_pub_key"` // header diversifier NewDiversifier string `protobuf:"bytes,2,opt,name=new_diversifier,json=newDiversifier,proto3" json:"new_diversifier,omitempty" yaml:"new_diversifier"` } @@ -440,7 +445,7 @@ var xxx_messageInfo_ConsensusStateData proto.InternalMessageInfo // ConnectionStateSignBytes returns the SignBytes data for connection state verification. type ConnectionStateData struct { Path []byte `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` - Connection *types2.ConnectionEnd `protobuf:"bytes,2,opt,name=connection,proto3" json:"connection,omitempty"` + Connection *types1.ConnectionEnd `protobuf:"bytes,2,opt,name=connection,proto3" json:"connection,omitempty"` } func (m *ConnectionStateData) Reset() { *m = ConnectionStateData{} } @@ -479,7 +484,7 @@ var xxx_messageInfo_ConnectionStateData proto.InternalMessageInfo // ChannelStateSignBytes returns the SignBytes data for channel state verification. type ChannelStateData struct { Path []byte `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` - Channel *types3.Channel `protobuf:"bytes,2,opt,name=channel,proto3" json:"channel,omitempty"` + Channel *types2.Channel `protobuf:"bytes,2,opt,name=channel,proto3" json:"channel,omitempty"` } func (m *ChannelStateData) Reset() { *m = ChannelStateData{} } @@ -745,71 +750,71 @@ func init() { } var fileDescriptor_6cc2ee18f7f86d4e = []byte{ - // 1017 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4f, 0x8f, 0xdb, 0x44, - 0x14, 0x5f, 0xa7, 0x51, 0xd9, 0xbc, 0xa4, 0x9b, 0xe2, 0xa6, 0x25, 0xbb, 0x94, 0x38, 0xb2, 0x04, - 0xec, 0xa5, 0xb6, 0x52, 0x24, 0x0e, 0x2b, 0x38, 0x24, 0x29, 0x12, 0x2c, 0x02, 0x56, 0xde, 0x56, - 0xa2, 0xa8, 0xc8, 0x1a, 0xdb, 0xb3, 0x89, 0xb5, 0xf6, 0x8c, 0xb1, 0x27, 0xc9, 0x06, 0x09, 0x09, - 0x6e, 0x70, 0xe3, 0xc8, 0x0d, 0x3e, 0x05, 0x9f, 0x01, 0x89, 0x4b, 0xb9, 0x71, 0x8a, 0xd0, 0xee, - 0x37, 0xc8, 0x27, 0x40, 0x9e, 0x19, 0x3b, 0x76, 0xba, 0xc9, 0x0a, 0x89, 0xd3, 0xfc, 0x79, 0x6f, - 0x7e, 0xef, 0x37, 0xef, 0xdf, 0x0c, 0xf4, 0x7c, 0xc7, 0x35, 0x03, 0x7f, 0x34, 0x66, 0x6e, 0xe0, - 0x63, 0xc2, 0x12, 0x33, 0xa1, 0x01, 0x0d, 0x91, 0x3b, 0xf6, 0x09, 0x36, 0xa7, 0xbd, 0xe2, 0xd2, - 0x88, 0x62, 0xca, 0xa8, 0xaa, 0xf9, 0x8e, 0x6b, 0x14, 0x8f, 0x18, 0x45, 0x9d, 0x69, 0xef, 0xe0, - 0x5d, 0x97, 0x26, 0x21, 0x4d, 0x4c, 0x07, 0x25, 0xd8, 0x74, 0xe3, 0x79, 0xc4, 0xa8, 0x39, 0xed, - 0x39, 0x98, 0xa1, 0x9e, 0x5c, 0x0a, 0xa4, 0x83, 0x14, 0xc9, 0x74, 0x29, 0x21, 0xd8, 0x65, 0x3e, - 0x25, 0x85, 0xa9, 0x54, 0xd8, 0xe7, 0x0a, 0x63, 0x44, 0x08, 0x0e, 0xb2, 0x51, 0x8a, 0x5a, 0x23, - 0x3a, 0xa2, 0x7c, 0x6a, 0xa6, 0xb3, 0xec, 0xc0, 0x88, 0xd2, 0x51, 0x80, 0x4d, 0xbe, 0x72, 0x26, - 0x67, 0x26, 0x22, 0x73, 0x21, 0xd2, 0xff, 0xaa, 0x40, 0x7d, 0xc8, 0x09, 0x9f, 0x32, 0xc4, 0xb0, - 0x7a, 0x00, 0xbb, 0x09, 0xfe, 0x66, 0x82, 0x89, 0x8b, 0xdb, 0x4a, 0x57, 0x39, 0xac, 0x5a, 0xf9, - 0x5a, 0x1d, 0x42, 0xf3, 0x2c, 0xa6, 0xdf, 0x62, 0x62, 0xe7, 0x2a, 0x95, 0x54, 0x65, 0x70, 0xb0, - 0x5c, 0x68, 0x0f, 0xe6, 0x28, 0x0c, 0x8e, 0xf4, 0x35, 0x05, 0xdd, 0xda, 0x13, 0x3b, 0xa7, 0x19, - 0x08, 0x83, 0xa6, 0x4b, 0x49, 0x82, 0x49, 0x32, 0x49, 0xec, 0x24, 0xb5, 0xd9, 0xbe, 0xd5, 0x55, - 0x0e, 0xeb, 0x8f, 0x4d, 0xe3, 0x06, 0x0f, 0x1a, 0xc3, 0xec, 0x1c, 0xa7, 0x5a, 0xb4, 0xba, 0x86, - 0xa8, 0x5b, 0x7b, 0x6e, 0x49, 0x57, 0xc5, 0xf0, 0x26, 0x0a, 0x02, 0x3a, 0xb3, 0x27, 0x91, 0x87, - 0x18, 0xb6, 0xd1, 0x19, 0xc3, 0xb1, 0x1d, 0xc5, 0x34, 0xa2, 0x09, 0x0a, 0xda, 0xd5, 0xae, 0x72, - 0xb8, 0x3b, 0x78, 0x67, 0xb9, 0xd0, 0x74, 0x01, 0xb8, 0x45, 0x59, 0xb7, 0xda, 0x5c, 0xfa, 0x8c, - 0x0b, 0xfb, 0xa9, 0xec, 0x44, 0x8a, 0x8e, 0xaa, 0x3f, 0xfe, 0xa6, 0xed, 0xe8, 0xdf, 0x2b, 0xb0, - 0x57, 0xe6, 0xaa, 0x1e, 0x03, 0x44, 0x13, 0x27, 0xf0, 0x5d, 0xfb, 0x1c, 0xcf, 0xb9, 0xd7, 0xea, - 0x8f, 0x5b, 0x86, 0x08, 0x8b, 0x91, 0x85, 0xc5, 0xe8, 0x93, 0xf9, 0xe0, 0xfe, 0x72, 0xa1, 0xbd, - 0x2e, 0x48, 0xac, 0x4e, 0xe8, 0x56, 0x4d, 0x2c, 0x3e, 0xc5, 0x73, 0xf5, 0x21, 0xd4, 0x98, 0x1f, - 0xe2, 0x84, 0xa1, 0x30, 0xe2, 0xbe, 0xab, 0x5a, 0xab, 0x0d, 0x49, 0xe1, 0x57, 0x05, 0x6e, 0x7f, - 0x8c, 0x91, 0x87, 0xe3, 0xad, 0x11, 0x7d, 0x08, 0xb5, 0xc4, 0x1f, 0x11, 0xc4, 0x26, 0xb1, 0x88, - 0x65, 0xc3, 0x5a, 0x6d, 0xa8, 0xcf, 0x60, 0x8f, 0xe0, 0x99, 0x5d, 0x20, 0x7e, 0x6b, 0x0b, 0xf1, - 0xfd, 0xe5, 0x42, 0xbb, 0x2f, 0x88, 0x97, 0x4f, 0xe9, 0x56, 0x83, 0xe0, 0xd9, 0x49, 0xc6, 0x5f, - 0x32, 0xfc, 0xb3, 0x02, 0x8d, 0xcf, 0xfc, 0xc4, 0xc1, 0x63, 0x34, 0xf5, 0xe9, 0x24, 0x56, 0x7b, - 0x50, 0x13, 0x71, 0xb7, 0x7d, 0x8f, 0x13, 0xad, 0x0d, 0x5a, 0xcb, 0x85, 0x76, 0x57, 0x46, 0x38, - 0x13, 0xe9, 0xd6, 0xae, 0x98, 0x7f, 0xe2, 0x95, 0xae, 0x56, 0x59, 0xbb, 0x5a, 0x04, 0x77, 0xf2, - 0x9b, 0xd8, 0x94, 0x64, 0x59, 0xd6, 0xbb, 0x31, 0xcb, 0x4e, 0xb3, 0x53, 0x7d, 0xe2, 0x3d, 0x41, - 0x0c, 0x0d, 0xda, 0xcb, 0x85, 0xd6, 0x12, 0x2c, 0x4a, 0x88, 0xba, 0xd5, 0xc8, 0xd7, 0x5f, 0x90, - 0x35, 0x8b, 0x6c, 0x46, 0x79, 0x56, 0xfd, 0x7f, 0x16, 0xd9, 0x8c, 0x16, 0x2d, 0x3e, 0x9d, 0xd1, - 0xa3, 0xdd, 0xd4, 0x93, 0xbf, 0xa4, 0xde, 0x3c, 0x86, 0xbb, 0xeb, 0x28, 0xe5, 0xe0, 0x2a, 0xeb, - 0xc1, 0x55, 0xa1, 0xea, 0x21, 0x86, 0x64, 0xd4, 0xf9, 0x5c, 0x46, 0xe6, 0x4b, 0x68, 0x3d, 0xcd, - 0xd2, 0x09, 0x7b, 0x39, 0xec, 0x0d, 0x78, 0xa5, 0xac, 0xac, 0x5c, 0x9f, 0x95, 0x3f, 0x28, 0x50, - 0x4b, 0xf1, 0x06, 0x73, 0x86, 0x93, 0x9b, 0x12, 0x73, 0x33, 0x9a, 0xda, 0x85, 0xba, 0xe7, 0x4f, - 0x71, 0x9c, 0xf8, 0x67, 0x3e, 0x8e, 0x79, 0x64, 0x6b, 0x56, 0x71, 0x2b, 0xbf, 0x5d, 0xf5, 0x95, - 0xdb, 0xfd, 0xae, 0x00, 0x88, 0xca, 0xe0, 0x4e, 0xfa, 0x1a, 0xea, 0x32, 0x5b, 0x79, 0x82, 0x2b, - 0x3c, 0x64, 0x6f, 0x1b, 0xa2, 0x57, 0x1b, 0x69, 0xaf, 0x36, 0x64, 0x73, 0x96, 0xbd, 0xda, 0xc8, - 0x13, 0x79, 0xf0, 0x60, 0xb9, 0xd0, 0xd4, 0x52, 0xc6, 0xcb, 0x5a, 0x15, 0xe9, 0x9e, 0xd6, 0xea, - 0x10, 0x9a, 0xa9, 0xa8, 0xc8, 0xb6, 0xc2, 0x53, 0xbb, 0xd0, 0xbc, 0xd6, 0x14, 0x74, 0x2b, 0xad, - 0xba, 0x27, 0xab, 0x0d, 0x49, 0xfc, 0x3b, 0x68, 0x16, 0x1a, 0x35, 0x27, 0xaf, 0x42, 0x35, 0x42, - 0x6c, 0x2c, 0x83, 0xc1, 0xe7, 0xea, 0x09, 0x34, 0x64, 0xad, 0x88, 0xe6, 0xba, 0xad, 0xd7, 0xbc, - 0xb1, 0x5c, 0x68, 0xf7, 0x4a, 0xf5, 0x25, 0xdb, 0x67, 0xdd, 0x5d, 0x59, 0x92, 0xe6, 0x7f, 0x52, - 0x40, 0x2d, 0x37, 0xb5, 0x8d, 0x14, 0x9e, 0xbf, 0xda, 0xe2, 0xb7, 0xb1, 0xf8, 0x0f, 0x7d, 0x5c, - 0x72, 0x21, 0x70, 0x6f, 0x98, 0x3f, 0x8a, 0xdb, 0xb9, 0x7c, 0x08, 0xb0, 0x7a, 0x3f, 0x25, 0x8d, - 0xb7, 0x78, 0x45, 0x16, 0x9e, 0xd5, 0x15, 0xd8, 0x47, 0xc4, 0xb3, 0x0a, 0x07, 0xa4, 0xbd, 0x17, - 0x70, 0x77, 0x28, 0x9e, 0xd9, 0xed, 0xc6, 0x0c, 0x78, 0x4d, 0x3e, 0xc7, 0xf9, 0x85, 0xb9, 0x25, - 0xf9, 0x44, 0x4b, 0x0c, 0x2b, 0x53, 0x92, 0xe8, 0xc7, 0xd0, 0x3a, 0x41, 0xee, 0x39, 0x66, 0x43, - 0x1a, 0x86, 0x3e, 0x0b, 0x31, 0x61, 0x1b, 0x2d, 0x74, 0xd2, 0xeb, 0x64, 0x5a, 0xb2, 0x76, 0x0b, - 0x3b, 0xfa, 0x73, 0xd8, 0x17, 0x58, 0x7d, 0xf7, 0x9c, 0xd0, 0x59, 0x80, 0xbd, 0x11, 0xde, 0x0a, - 0x78, 0x08, 0x4d, 0x54, 0x56, 0x95, 0xa8, 0xeb, 0xdb, 0xfa, 0xfb, 0xd0, 0xbd, 0x16, 0xba, 0xef, - 0xa4, 0x01, 0xda, 0xe8, 0x14, 0x7d, 0x0c, 0xad, 0xcf, 0xf1, 0x05, 0xcb, 0x3e, 0x00, 0x16, 0x76, - 0xa7, 0x1b, 0xd9, 0x7c, 0x00, 0x77, 0x08, 0xbe, 0x60, 0xe9, 0xf7, 0xc1, 0x8e, 0xb1, 0x3b, 0x95, - 0xff, 0x8b, 0x42, 0x3f, 0x2c, 0x89, 0x75, 0xab, 0x4e, 0x04, 0x74, 0x8a, 0x3a, 0x78, 0xf1, 0xc7, - 0x65, 0x47, 0x79, 0x79, 0xd9, 0x51, 0xfe, 0xb9, 0xec, 0x28, 0x3f, 0x5f, 0x75, 0x76, 0x5e, 0x5e, - 0x75, 0x76, 0xfe, 0xbe, 0xea, 0xec, 0x7c, 0x35, 0x18, 0xf9, 0x6c, 0x3c, 0x71, 0x0c, 0x97, 0x86, - 0xa6, 0xfc, 0x86, 0x89, 0xe1, 0x51, 0xe2, 0x9d, 0x9b, 0x17, 0x66, 0xfe, 0xdd, 0x7b, 0x74, 0xdd, - 0x7f, 0x8f, 0xcd, 0x23, 0x9c, 0x38, 0xb7, 0x79, 0xd2, 0xbe, 0xf7, 0x6f, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x7f, 0x0a, 0xb5, 0x76, 0x1c, 0x0a, 0x00, 0x00, + // 1012 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4f, 0x6f, 0xe3, 0x44, + 0x14, 0xaf, 0xb3, 0x61, 0x69, 0x5e, 0xb2, 0x6d, 0xf1, 0x66, 0x97, 0xb4, 0x40, 0x1c, 0xf9, 0x00, + 0xbd, 0xac, 0xad, 0x2c, 0x12, 0x87, 0x0a, 0x0e, 0x49, 0x16, 0x09, 0xca, 0xbf, 0xca, 0xdd, 0x95, + 0x58, 0xb4, 0x92, 0x35, 0xb6, 0xa7, 0x89, 0x55, 0x67, 0xc6, 0xd8, 0x93, 0xa4, 0x41, 0xe2, 0x00, + 0x27, 0xb8, 0x71, 0xe4, 0x88, 0x90, 0xf8, 0x2e, 0x48, 0x5c, 0x96, 0x1b, 0xa7, 0x08, 0xb5, 0xdf, + 0x20, 0x9f, 0x00, 0x79, 0x66, 0x9c, 0xd8, 0xee, 0xc6, 0x15, 0xb0, 0xa7, 0xf9, 0xf3, 0xde, 0xfc, + 0xde, 0x7b, 0xbf, 0x79, 0x6f, 0xe6, 0x41, 0xd7, 0x77, 0x5c, 0x33, 0xf0, 0x87, 0x23, 0xe6, 0x06, + 0x3e, 0x26, 0x2c, 0x36, 0x63, 0x1a, 0xd0, 0x31, 0x72, 0x47, 0x3e, 0xc1, 0xe6, 0xb4, 0x9b, 0x5d, + 0x1a, 0x61, 0x44, 0x19, 0x55, 0x35, 0xdf, 0x71, 0x8d, 0xec, 0x11, 0x23, 0xab, 0x33, 0xed, 0x1e, + 0xbc, 0xe3, 0xd2, 0x78, 0x4c, 0x63, 0xd3, 0x41, 0x31, 0x36, 0xdd, 0x68, 0x1e, 0x32, 0x6a, 0x4e, + 0xbb, 0x0e, 0x66, 0xa8, 0x2b, 0x97, 0x02, 0xe9, 0x20, 0x41, 0x32, 0x5d, 0x4a, 0x08, 0x76, 0x99, + 0x4f, 0x49, 0x66, 0x2a, 0x15, 0xf6, 0xb9, 0xc2, 0x08, 0x11, 0x82, 0x83, 0x74, 0x94, 0xa2, 0xe6, + 0x90, 0x0e, 0x29, 0x9f, 0x9a, 0xc9, 0x2c, 0x3d, 0x30, 0xa4, 0x74, 0x18, 0x60, 0x93, 0xaf, 0x9c, + 0xc9, 0x99, 0x89, 0xc8, 0x5c, 0x88, 0xf4, 0x3f, 0x2b, 0x50, 0x1f, 0x70, 0x87, 0x4f, 0x19, 0x62, + 0x58, 0x3d, 0x80, 0xed, 0x18, 0x7f, 0x3d, 0xc1, 0xc4, 0xc5, 0x2d, 0xa5, 0xa3, 0x1c, 0x56, 0xad, + 0xd5, 0x5a, 0x1d, 0xc0, 0xee, 0x59, 0x44, 0xbf, 0xc1, 0xc4, 0x5e, 0xa9, 0x54, 0x12, 0x95, 0xfe, + 0xc1, 0x72, 0xa1, 0xdd, 0x9f, 0xa3, 0x71, 0x70, 0xa4, 0x17, 0x14, 0x74, 0x6b, 0x47, 0xec, 0x9c, + 0xa6, 0x20, 0x0c, 0x76, 0x5d, 0x4a, 0x62, 0x4c, 0xe2, 0x49, 0x6c, 0xc7, 0x89, 0xcd, 0xd6, 0xad, + 0x8e, 0x72, 0x58, 0x7f, 0x68, 0x1a, 0x37, 0x30, 0x68, 0x0c, 0xd2, 0x73, 0xdc, 0xd5, 0xac, 0xd5, + 0x02, 0xa2, 0x6e, 0xed, 0xb8, 0x39, 0x5d, 0x15, 0xc3, 0x1b, 0x28, 0x08, 0xe8, 0xcc, 0x9e, 0x84, + 0x1e, 0x62, 0xd8, 0x46, 0x67, 0x0c, 0x47, 0x76, 0x18, 0xd1, 0x90, 0xc6, 0x28, 0x68, 0x55, 0x3b, + 0xca, 0xe1, 0x76, 0xff, 0xed, 0xe5, 0x42, 0xd3, 0x05, 0x60, 0x89, 0xb2, 0x6e, 0xb5, 0xb8, 0xf4, + 0x09, 0x17, 0xf6, 0x12, 0xd9, 0x89, 0x14, 0x1d, 0x55, 0x7f, 0xf8, 0x45, 0xdb, 0xd2, 0x7f, 0x55, + 0x60, 0x27, 0xef, 0xab, 0x7a, 0x0c, 0x10, 0x4e, 0x9c, 0xc0, 0x77, 0xed, 0x73, 0x3c, 0xe7, 0xc4, + 0xd6, 0x1f, 0x36, 0x0d, 0x71, 0x2d, 0x46, 0x7a, 0x2d, 0x46, 0x8f, 0xcc, 0xfb, 0xf7, 0x96, 0x0b, + 0xed, 0x35, 0xe1, 0xc4, 0xfa, 0x84, 0x6e, 0xd5, 0xc4, 0xe2, 0x13, 0x3c, 0x57, 0x3b, 0x50, 0xf7, + 0xfc, 0x29, 0x8e, 0x62, 0xff, 0xcc, 0xc7, 0x11, 0xbf, 0x82, 0x9a, 0x95, 0xdd, 0x52, 0xdf, 0x84, + 0x1a, 0xf3, 0xc7, 0x38, 0x66, 0x68, 0x1c, 0x72, 0x76, 0xab, 0xd6, 0x7a, 0x43, 0x3a, 0xf9, 0x7d, + 0x05, 0x6e, 0x7f, 0x84, 0x91, 0x87, 0xa3, 0xd2, 0x3b, 0xcf, 0x41, 0x55, 0x0a, 0x50, 0x89, 0x34, + 0xf6, 0x87, 0x04, 0xb1, 0x49, 0x24, 0xae, 0xb1, 0x61, 0xad, 0x37, 0xd4, 0x27, 0xb0, 0x43, 0xf0, + 0xcc, 0xce, 0x04, 0x5e, 0x2d, 0x09, 0x7c, 0x7f, 0xb9, 0xd0, 0xee, 0x89, 0xc0, 0xf3, 0xa7, 0x74, + 0xab, 0x41, 0xf0, 0xec, 0x64, 0x15, 0xff, 0x00, 0x76, 0x13, 0x85, 0x2c, 0x07, 0xaf, 0x24, 0x1c, + 0x64, 0x13, 0xa2, 0xa0, 0xa0, 0x5b, 0x89, 0x27, 0x8f, 0xd6, 0x1b, 0x92, 0x84, 0x3f, 0x2a, 0xd0, + 0xf8, 0xcc, 0x8f, 0x1d, 0x3c, 0x42, 0x53, 0x9f, 0x4e, 0x22, 0xb5, 0x0b, 0x35, 0x91, 0x7c, 0xb6, + 0xef, 0x71, 0x2e, 0x6a, 0xfd, 0xe6, 0x72, 0xa1, 0xed, 0xc9, 0x34, 0x4b, 0x45, 0xba, 0xb5, 0x2d, + 0xe6, 0x1f, 0x7b, 0x39, 0xf6, 0x2a, 0x05, 0xf6, 0x42, 0xb8, 0xb3, 0xa2, 0xc3, 0xa6, 0x24, 0x4d, + 0xf5, 0xee, 0x8d, 0xa9, 0x7e, 0x9a, 0x9e, 0xea, 0x11, 0xef, 0x11, 0x62, 0xa8, 0xdf, 0x5a, 0x2e, + 0xb4, 0xa6, 0xf0, 0x22, 0x87, 0xa8, 0x5b, 0x8d, 0xd5, 0xfa, 0x0b, 0x52, 0xb0, 0xc8, 0x66, 0x54, + 0x52, 0xfe, 0xb2, 0x2c, 0xb2, 0x19, 0xcd, 0x5a, 0x7c, 0x3c, 0xa3, 0x47, 0xdb, 0x09, 0x93, 0x3f, + 0x27, 0x6c, 0x1e, 0xc3, 0x5e, 0x11, 0x25, 0x9f, 0x21, 0x4a, 0x31, 0x43, 0x54, 0xa8, 0x7a, 0x88, + 0x21, 0xce, 0x5b, 0xc3, 0xe2, 0x73, 0x79, 0x33, 0x5f, 0x42, 0xf3, 0x71, 0x9a, 0x66, 0xd8, 0x5b, + 0xc1, 0xde, 0x80, 0x57, 0x9a, 0xad, 0x12, 0xf9, 0x3b, 0x05, 0x6a, 0x09, 0x5e, 0x7f, 0xce, 0x70, + 0xfc, 0x3f, 0x72, 0xbf, 0x50, 0x86, 0xb7, 0xae, 0x97, 0x61, 0x1a, 0x5d, 0xf5, 0x5a, 0x74, 0xbf, + 0x29, 0x00, 0xa2, 0xf8, 0x38, 0x49, 0x9f, 0x42, 0x5d, 0xa6, 0xfc, 0x8d, 0xcf, 0xc3, 0xfd, 0xe5, + 0x42, 0x53, 0x73, 0x55, 0x22, 0xdf, 0x07, 0x51, 0x22, 0x1b, 0xea, 0xa3, 0xf2, 0x1f, 0xeb, 0xe3, + 0x5b, 0xd8, 0xcd, 0x7c, 0x0e, 0xdc, 0x57, 0x15, 0xaa, 0x21, 0x62, 0x23, 0xc9, 0x3d, 0x9f, 0xab, + 0x27, 0xd0, 0x90, 0xa5, 0x21, 0x1e, 0xf4, 0x4a, 0x49, 0x00, 0xaf, 0x2f, 0x17, 0xda, 0xdd, 0x5c, + 0x39, 0xc9, 0x27, 0xbb, 0xee, 0xae, 0x2d, 0x49, 0xf3, 0x3f, 0x2a, 0xa0, 0xe6, 0x1f, 0xd2, 0x8d, + 0x2e, 0x3c, 0xbd, 0xfe, 0xad, 0x94, 0x79, 0xf1, 0x2f, 0xfe, 0x0e, 0xe9, 0x0b, 0x81, 0xbb, 0x83, + 0xd5, 0x47, 0x5c, 0xee, 0xcb, 0x07, 0x00, 0xeb, 0x3f, 0x5b, 0xba, 0xf1, 0x16, 0x2f, 0xc0, 0xcc, + 0x57, 0xbe, 0x06, 0xfb, 0x90, 0x78, 0x56, 0xe6, 0x80, 0xb4, 0xf7, 0x0c, 0xf6, 0x06, 0xe2, 0x6b, + 0x2f, 0x37, 0x66, 0xc0, 0xab, 0xb2, 0x05, 0x58, 0x05, 0xcc, 0x2d, 0xc9, 0xb6, 0x40, 0x62, 0x58, + 0xa9, 0x92, 0x44, 0x3f, 0x86, 0xe6, 0x09, 0x72, 0xcf, 0x31, 0x1b, 0xd0, 0xf1, 0xd8, 0x67, 0x63, + 0x4c, 0xd8, 0x46, 0x0b, 0xed, 0x24, 0x9c, 0x54, 0x4b, 0x96, 0x6a, 0x66, 0x47, 0x7f, 0x0a, 0xfb, + 0x02, 0xab, 0xe7, 0x9e, 0x13, 0x3a, 0x0b, 0xb0, 0x37, 0xc4, 0xa5, 0x80, 0x87, 0xb0, 0x8b, 0xf2, + 0xaa, 0x12, 0xb5, 0xb8, 0xad, 0xbf, 0x07, 0x9d, 0x17, 0x42, 0xf7, 0x9c, 0xe4, 0x82, 0x36, 0x92, + 0xa2, 0x8f, 0xa0, 0xf9, 0x39, 0xbe, 0x60, 0x69, 0xd3, 0x61, 0x61, 0x77, 0xba, 0xd1, 0x9b, 0xf7, + 0xe1, 0x0e, 0xc1, 0x17, 0x2c, 0x69, 0x59, 0xec, 0x08, 0xbb, 0x53, 0xd9, 0xd3, 0x64, 0x9e, 0xbf, + 0x9c, 0x58, 0xb7, 0xea, 0x44, 0x40, 0x27, 0xa8, 0xfd, 0x67, 0xbf, 0x5f, 0xb6, 0x95, 0xe7, 0x97, + 0x6d, 0xe5, 0xef, 0xcb, 0xb6, 0xf2, 0xd3, 0x55, 0x7b, 0xeb, 0xf9, 0x55, 0x7b, 0xeb, 0xaf, 0xab, + 0xf6, 0xd6, 0x57, 0xfd, 0xa1, 0xcf, 0x46, 0x13, 0xc7, 0x70, 0xe9, 0xd8, 0x94, 0xad, 0x9f, 0x18, + 0x1e, 0xc4, 0xde, 0xb9, 0x79, 0x61, 0xae, 0x5a, 0xcc, 0x07, 0x2f, 0xea, 0x31, 0xd9, 0x3c, 0xc4, + 0xb1, 0x73, 0x9b, 0x27, 0xed, 0xbb, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x7f, 0x34, 0x99, 0x52, + 0x90, 0x0a, 0x00, 0x00, } func (m *ClientState) Marshal() (dAtA []byte, err error) { @@ -892,6 +897,13 @@ func (m *ConsensusState) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x18 } + if len(m.Diversifier) > 0 { + i -= len(m.Diversifier) + copy(dAtA[i:], m.Diversifier) + i = encodeVarintSolomachine(dAtA, i, uint64(len(m.Diversifier))) + i-- + dAtA[i] = 0x12 + } if m.PublicKey != nil { { size, err := m.PublicKey.MarshalToSizedBuffer(dAtA[:i]) @@ -902,7 +914,7 @@ func (m *ConsensusState) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintSolomachine(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -927,6 +939,13 @@ func (m *Header) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.NewDiversifier) > 0 { + i -= len(m.NewDiversifier) + copy(dAtA[i:], m.NewDiversifier) + i = encodeVarintSolomachine(dAtA, i, uint64(len(m.NewDiversifier))) + i-- + dAtA[i] = 0x2a + } if m.NewPublicKey != nil { { size, err := m.NewPublicKey.MarshalToSizedBuffer(dAtA[:i]) @@ -937,14 +956,19 @@ func (m *Header) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintSolomachine(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a + dAtA[i] = 0x22 } if len(m.Signature) > 0 { i -= len(m.Signature) copy(dAtA[i:], m.Signature) i = encodeVarintSolomachine(dAtA, i, uint64(len(m.Signature))) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a + } + if m.Timestamp != 0 { + i = encodeVarintSolomachine(dAtA, i, uint64(m.Timestamp)) + i-- + dAtA[i] = 0x10 } if m.Sequence != 0 { i = encodeVarintSolomachine(dAtA, i, uint64(m.Sequence)) @@ -1524,6 +1548,10 @@ func (m *ConsensusState) Size() (n int) { l = m.PublicKey.Size() n += 1 + l + sovSolomachine(uint64(l)) } + l = len(m.Diversifier) + if l > 0 { + n += 1 + l + sovSolomachine(uint64(l)) + } if m.Timestamp != 0 { n += 1 + sovSolomachine(uint64(m.Timestamp)) } @@ -1539,6 +1567,9 @@ func (m *Header) Size() (n int) { if m.Sequence != 0 { n += 1 + sovSolomachine(uint64(m.Sequence)) } + if m.Timestamp != 0 { + n += 1 + sovSolomachine(uint64(m.Timestamp)) + } l = len(m.Signature) if l > 0 { n += 1 + l + sovSolomachine(uint64(l)) @@ -1547,6 +1578,10 @@ func (m *Header) Size() (n int) { l = m.NewPublicKey.Size() n += 1 + l + sovSolomachine(uint64(l)) } + l = len(m.NewDiversifier) + if l > 0 { + n += 1 + l + sovSolomachine(uint64(l)) + } return n } @@ -1960,7 +1995,7 @@ func (m *ConsensusState) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: ConsensusState: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 2: + case 1: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field PublicKey", wireType) } @@ -1996,6 +2031,38 @@ func (m *ConsensusState) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Diversifier", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSolomachine + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSolomachine + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSolomachine + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Diversifier = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) @@ -2088,6 +2155,25 @@ func (m *Header) Unmarshal(dAtA []byte) error { } } case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + m.Timestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSolomachine + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Timestamp |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Signature", wireType) } @@ -2121,7 +2207,7 @@ func (m *Header) Unmarshal(dAtA []byte) error { m.Signature = []byte{} } iNdEx = postIndex - case 3: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field NewPublicKey", wireType) } @@ -2157,6 +2243,38 @@ func (m *Header) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NewDiversifier", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSolomachine + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthSolomachine + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthSolomachine + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NewDiversifier = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSolomachine(dAtA[iNdEx:]) @@ -2800,7 +2918,7 @@ func (m *HeaderData) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.NewPubKey == nil { - m.NewPubKey = &types1.PublicKey{} + m.NewPubKey = &types.Any{} } if err := m.NewPubKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -3201,7 +3319,7 @@ func (m *ConnectionStateData) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Connection == nil { - m.Connection = &types2.ConnectionEnd{} + m.Connection = &types1.ConnectionEnd{} } if err := m.Connection.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -3324,7 +3442,7 @@ func (m *ChannelStateData) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Channel == nil { - m.Channel = &types3.Channel{} + m.Channel = &types2.Channel{} } if err := m.Channel.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err From 01175d321c65f716e44ee6fba556eb390007d6f3 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 4 Sep 2020 15:39:52 +0200 Subject: [PATCH 039/128] Fix ante handler tests --- testutil/testdata/test_tx.go | 5 +++-- types/tx/types.go | 37 +++++++++++++++++++++++++++++++++-- x/auth/ante/ante_test.go | 3 ++- x/auth/ante/sigverify.go | 3 ++- x/auth/ante/sigverify_test.go | 9 +++++++-- 5 files changed, 49 insertions(+), 8 deletions(-) diff --git a/testutil/testdata/test_tx.go b/testutil/testdata/test_tx.go index bbcfde5f8195..ccc3cc816482 100644 --- a/testutil/testdata/test_tx.go +++ b/testutil/testdata/test_tx.go @@ -5,16 +5,17 @@ import ( "github.com/tendermint/tendermint/crypto" + "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" sdk "github.com/cosmos/cosmos-sdk/types" ) // KeyTestPubAddr generates a new secp256k1 keypair. func KeyTestPubAddr() (crypto.PrivKey, crypto.PubKey, sdk.AccAddress) { - key := secp256k1.GenPrivKey() + key := keys.Secp256K1PrivKey{Key: secp256k1.GenPrivKey()} pub := key.PubKey() addr := sdk.AccAddress(pub.Address()) - return key, pub, addr + return &key, pub, addr } // NewTestFeeAmount is a test fee amount. diff --git a/types/tx/types.go b/types/tx/types.go index ed56de13e4bc..dcb9a9314678 100644 --- a/types/tx/types.go +++ b/types/tx/types.go @@ -1,17 +1,27 @@ package tx import ( + fmt "fmt" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/tendermint/tendermint/crypto" ) -var _, _ codectypes.UnpackInterfacesMessage = &Tx{}, &TxBody{} +var _, _, _, _ codectypes.UnpackInterfacesMessage = &Tx{}, &TxBody{}, &AuthInfo{}, &SignerInfo{} // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method func (m *Tx) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { if m.Body != nil { - return m.Body.UnpackInterfaces(unpacker) + if err := m.Body.UnpackInterfaces(unpacker); err != nil { + return err + } + } + + if m.AuthInfo != nil { + return m.AuthInfo.UnpackInterfaces(unpacker) } + return nil } @@ -26,3 +36,26 @@ func (m *TxBody) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { } return nil } + +// UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method +func (m *AuthInfo) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { + for _, signerInfo := range m.SignerInfos { + err := signerInfo.UnpackInterfaces(unpacker) + if err != nil { + return err + } + } + return nil +} + +// UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method +func (m *SignerInfo) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { + fmt.Println("SignerInfo UnpackInterfaces m.PublicKey=", m.PublicKey) + var pubKey crypto.PubKey + err := unpacker.UnpackAny(m.PublicKey, &pubKey) + if err != nil { + return err + } + + return nil +} diff --git a/x/auth/ante/ante_test.go b/x/auth/ante/ante_test.go index 84602abcb98f..2f973a8531ed 100644 --- a/x/auth/ante/ante_test.go +++ b/x/auth/ante/ante_test.go @@ -11,6 +11,7 @@ import ( "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/testutil/testdata" @@ -893,7 +894,7 @@ func generatePubKeysAndSignatures(n int, msg []byte, _ bool) (pubkeys []crypto.P signatures = make([][]byte, n) for i := 0; i < n; i++ { var privkey crypto.PrivKey - privkey = secp256k1.GenPrivKey() + privkey = &keys.Secp256K1PrivKey{Key: secp256k1.GenPrivKey()} // TODO: also generate ed25519 keys as below when ed25519 keys are // actually supported, https://github.com/cosmos/cosmos-sdk/issues/4789 diff --git a/x/auth/ante/sigverify.go b/x/auth/ante/sigverify.go index 7d1fea1ebec9..345e004a79a2 100644 --- a/x/auth/ante/sigverify.go +++ b/x/auth/ante/sigverify.go @@ -7,6 +7,7 @@ import ( "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" sdk "github.com/cosmos/cosmos-sdk/types" @@ -337,7 +338,7 @@ func DefaultSigVerificationGasConsumer( meter.ConsumeGas(params.SigVerifyCostED25519, "ante verify: ed25519") return sdkerrors.Wrap(sdkerrors.ErrInvalidPubKey, "ED25519 public keys are unsupported") - case secp256k1.PubKey: + case *keys.Secp256K1PubKey: meter.ConsumeGas(params.SigVerifyCostSecp256k1, "ante verify: secp256k1") return nil diff --git a/x/auth/ante/sigverify_test.go b/x/auth/ante/sigverify_test.go index 54554f5b95ca..8f45e322e84d 100644 --- a/x/auth/ante/sigverify_test.go +++ b/x/auth/ante/sigverify_test.go @@ -8,6 +8,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/simapp" @@ -94,7 +95,7 @@ func (suite *AnteTestSuite) TestConsumeSignatureVerificationGas() { shouldErr bool }{ {"PubKeyEd25519", args{sdk.NewInfiniteGasMeter(), nil, ed25519.GenPrivKey().PubKey(), params}, types.DefaultSigVerifyCostED25519, true}, - {"PubKeySecp256k1", args{sdk.NewInfiniteGasMeter(), nil, secp256k1.GenPrivKey().PubKey(), params}, types.DefaultSigVerifyCostSecp256k1, false}, + {"PubKeySecp256k1", args{sdk.NewInfiniteGasMeter(), nil, &keys.Secp256K1PubKey{Key: secp256k1.GenPrivKey().PubKey().(secp256k1.PubKey)}, params}, types.DefaultSigVerifyCostSecp256k1, false}, {"Multisig", args{sdk.NewInfiniteGasMeter(), multisignature1, multisigKey1, params}, expectedCost1, false}, {"unknown key", args{sdk.NewInfiniteGasMeter(), nil, nil, params}, 0, true}, } @@ -269,7 +270,11 @@ func (suite *AnteTestSuite) TestSigVerification_ExplicitAmino() { func (suite *AnteTestSuite) TestSigIntegration() { // generate private keys - privs := []crypto.PrivKey{secp256k1.GenPrivKey(), secp256k1.GenPrivKey(), secp256k1.GenPrivKey()} + privs := []crypto.PrivKey{ + &keys.Secp256K1PrivKey{Key: secp256k1.GenPrivKey()}, + &keys.Secp256K1PrivKey{Key: secp256k1.GenPrivKey()}, + &keys.Secp256K1PrivKey{Key: secp256k1.GenPrivKey()}, + } params := types.DefaultParams() initialSigCost := params.SigVerifyCostSecp256k1 From 3c4ddbb5a04d35af4da92c1b90582735390512ac Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 11 Sep 2020 13:40:25 +0200 Subject: [PATCH 040/128] Pull latest go-amino --- codec/amino.go | 1 - go.mod | 2 +- go.sum | 2 ++ 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/codec/amino.go b/codec/amino.go index d0e78bab5e1d..f34713a9b0f0 100644 --- a/codec/amino.go +++ b/codec/amino.go @@ -156,7 +156,6 @@ func (cdc *LegacyAmino) MustMarshalJSON(o interface{}) []byte { } func (cdc *LegacyAmino) UnmarshalJSON(bz []byte, ptr interface{}) error { - fmt.Println(bz, ptr) err := cdc.Amino.UnmarshalJSON(bz, ptr) if err != nil { return err diff --git a/go.mod b/go.mod index 6bebf5be4f44..46712458c95e 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/stretchr/testify v1.6.1 github.com/tendermint/btcd v0.1.1 github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 - github.com/tendermint/go-amino v0.15.1-0.20200910131452-a7241d6f4149 + github.com/tendermint/go-amino v0.15.2-0.20200911100919-76914392a906 github.com/tendermint/tendermint v0.34.0-rc3.0.20200907055413-3359e0bf2f84 github.com/tendermint/tm-db v0.6.2 golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a diff --git a/go.sum b/go.sum index 33d0fbd484a7..8cb005942fa8 100644 --- a/go.sum +++ b/go.sum @@ -581,6 +581,8 @@ github.com/tendermint/go-amino v0.15.1-0.20200910131452-a7241d6f4149 h1:PtWgyl8p github.com/tendermint/go-amino v0.15.1-0.20200910131452-a7241d6f4149/go.mod h1:odo+dN1h2dkEoTFQaN/Qmdb4FAdvIu/E4YwijJJOeYc= github.com/tendermint/go-amino v0.15.1 h1:D2uk35eT4iTsvJd9jWIetzthE5C0/k2QmMFkCN+4JgQ= github.com/tendermint/go-amino v0.15.1/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/tendermint/go-amino v0.15.2-0.20200911100919-76914392a906 h1:LQkTDO6WsDt8aQsTSpwcespWr+n+ovoOild7WiX1ZAY= +github.com/tendermint/go-amino v0.15.2-0.20200911100919-76914392a906/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/tendermint/tendermint v0.33.8 h1:Xxu4QhpqcomSE0iQDw1MqLgfsa8fqtPtWFJK6zZOVso= github.com/tendermint/tendermint v0.34.0-rc3 h1:d7Fsd5rdbxq4GmJ0kRfx7l7LesQM7e70f0ytWLTQ/Go= github.com/tendermint/tendermint v0.34.0-rc3/go.mod h1:BoHcEpjfpBHc1Be7RQz3AHaXFNObcDG7SNHCev6Or4g= From cee8f30d32266b6d186512ee8a063958ea9c3f3b Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 11 Sep 2020 13:41:30 +0200 Subject: [PATCH 041/128] Remove ed25519 --- types/tx/types.go | 3 --- x/auth/ante/ante_test.go | 19 ------------------- 2 files changed, 22 deletions(-) diff --git a/types/tx/types.go b/types/tx/types.go index dcb9a9314678..85050f76b0d4 100644 --- a/types/tx/types.go +++ b/types/tx/types.go @@ -1,8 +1,6 @@ package tx import ( - fmt "fmt" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/tendermint/tendermint/crypto" @@ -50,7 +48,6 @@ func (m *AuthInfo) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method func (m *SignerInfo) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { - fmt.Println("SignerInfo UnpackInterfaces m.PublicKey=", m.PublicKey) var pubKey crypto.PubKey err := unpacker.UnpackAny(m.PublicKey, &pubKey) if err != nil { diff --git a/x/auth/ante/ante_test.go b/x/auth/ante/ante_test.go index 2f973a8531ed..645b0fd989ea 100644 --- a/x/auth/ante/ante_test.go +++ b/x/auth/ante/ante_test.go @@ -1035,25 +1035,6 @@ func (suite *AnteTestSuite) TestCustomSignatureVerificationGasConsumer() { false, sdkerrors.ErrInvalidPubKey, }, - { - "verify that an ed25519 account gets accepted", - func() { - priv1 := ed25519.GenPrivKey() - pub1 := priv1.PubKey() - addr1 := sdk.AccAddress(pub1.Address()) - acc1 := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr1) - - suite.Require().NoError(suite.app.BankKeeper.SetBalances(suite.ctx, addr1, sdk.NewCoins(sdk.NewInt64Coin("atom", 150)))) - suite.Require().NoError(acc1.SetAccountNumber(1)) - suite.app.AccountKeeper.SetAccount(suite.ctx, acc1) - msg := testdata.NewTestMsg(addr1) - privs, accNums, accSeqs = []crypto.PrivKey{priv1}, []uint64{1}, []uint64{0} - msgs = []sdk.Msg{msg} - }, - false, - true, - nil, - }, } for _, tc := range testCases { From ba95f503f694d2970344991849443863adb69a2e Mon Sep 17 00:00:00 2001 From: blushi Date: Fri, 11 Sep 2020 14:03:48 +0200 Subject: [PATCH 042/128] Remove old secp256k1 PubKey and PrivKey --- client/keys/add_ledger_test.go | 4 +- client/keys/show_test.go | 4 +- crypto/codec/amino.go | 10 +- crypto/hd/algo.go | 2 +- crypto/hd/fundraiser_test.go | 5 +- crypto/keyring/keyring_ledger_test.go | 8 +- crypto/keyring/types_test.go | 6 +- crypto/keys/keys.pb.go | 720 ------------------ crypto/keys/multisig/keys.pb.go | 365 +++++++++ crypto/keys/{ => multisig}/multisig.go | 2 +- crypto/keys/{ => multisig}/multisig_test.go | 36 +- crypto/keys/secp256k1.go | 53 -- crypto/keys/secp256k1/bench_test.go | 3 +- crypto/keys/secp256k1/keys.pb.go | 504 ++++++++++++ crypto/keys/secp256k1/secp256k1.go | 62 +- crypto/keys/secp256k1/secp256k1_cgo.go | 8 +- crypto/keys/secp256k1/secp256k1_cgo_test.go | 4 +- crypto/keys/secp256k1/secp256k1_nocgo.go | 8 +- crypto/keys/secp256k1/secp256k1_test.go | 88 ++- crypto/keys/secp256k1_test.go | 149 ---- crypto/ledger/ledger_mock.go | 5 +- crypto/ledger/ledger_secp256k1.go | 8 +- crypto/ledger/ledger_test.go | 48 +- crypto/types/multisig/codec.go | 2 +- .../types/multisig/threshold_pubkey_test.go | 30 +- .../crypto/{ => multisig}/v1/keys.proto | 12 +- proto/cosmos/crypto/secp256k1/v1/keys.proto | 22 + std/pubkey.go | 8 +- x/auth/ante/sigverify.go | 8 +- 29 files changed, 1103 insertions(+), 1081 deletions(-) delete mode 100644 crypto/keys/keys.pb.go create mode 100644 crypto/keys/multisig/keys.pb.go rename crypto/keys/{ => multisig}/multisig.go (99%) rename crypto/keys/{ => multisig}/multisig_test.go (78%) delete mode 100644 crypto/keys/secp256k1.go create mode 100644 crypto/keys/secp256k1/keys.pb.go delete mode 100644 crypto/keys/secp256k1_test.go rename proto/cosmos/crypto/{ => multisig}/v1/keys.proto (58%) create mode 100644 proto/cosmos/crypto/secp256k1/v1/keys.proto diff --git a/client/keys/add_ledger_test.go b/client/keys/add_ledger_test.go index bd433b1330e3..8848022dd7f2 100644 --- a/client/keys/add_ledger_test.go +++ b/client/keys/add_ledger_test.go @@ -72,7 +72,7 @@ func Test_runAddCmdLedgerWithCustomCoinType(t *testing.T) { require.Equal(t, "keyname1", key1.GetName()) require.Equal(t, keyring.TypeLedger, key1.GetType()) require.Equal(t, - "terrapub1addwnpepqvpg7r26nl2pvqqern00m6s9uaax3hauu2rzg8qpjzq9hy6xve7sw0d84m6", + "terrapub1addwnpc2yyps9rcdt20ag9sqrywdal02qhnh56xlhn3gvfquqxggqkungen86pcn2nzzw", sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, key1.GetPubKey())) config.SetCoinType(118) @@ -121,6 +121,6 @@ func Test_runAddCmdLedger(t *testing.T) { require.Equal(t, "keyname1", key1.GetName()) require.Equal(t, keyring.TypeLedger, key1.GetType()) require.Equal(t, - "cosmospub1addwnpepqd87l8xhcnrrtzxnkql7k55ph8fr9jarf4hn6udwukfprlalu8lgw0urza0", + "cosmospub1addwnpc2yyp5lmuu6lzvvdvg6wcrl66jsxuayvkt5dxk70t34mjeyy0lhlslapcuuuc4e", sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, key1.GetPubKey())) } diff --git a/client/keys/show_test.go b/client/keys/show_test.go index a18644207973..51846deaaec1 100644 --- a/client/keys/show_test.go +++ b/client/keys/show_test.go @@ -24,8 +24,8 @@ func Test_multiSigKey_Properties(t *testing.T) { require.Equal(t, "myMultisig", tmp.GetName()) require.Equal(t, keyring.TypeMulti, tmp.GetType()) - require.Equal(t, "D3923267FA8A3DD367BB768FA8BDC8FF7F89DA3F", tmp.GetPubKey().Address().String()) - require.Equal(t, "cosmos16wfryel63g7axeamw68630wglalcnk3l0zuadc", sdk.MustBech32ifyAddressBytes("cosmos", tmp.GetAddress())) + require.Equal(t, "15C3EB7FAF7021D4FD21AEA021FEDFCB7304F184", tmp.GetPubKey().Address().String()) + require.Equal(t, "cosmos1zhp7kla0wqsaflfp46szrlkledesfuvyz3l5d0", sdk.MustBech32ifyAddressBytes("cosmos", tmp.GetAddress())) } func Test_showKeysCmd(t *testing.T) { diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index a80aede72707..cb83ee5f6b1f 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -6,7 +6,7 @@ import ( "github.com/tendermint/tendermint/crypto/sr25519" "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/crypto/keys" + kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" ) @@ -26,13 +26,11 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { ed25519.PubKeyName, nil) cdc.RegisterConcrete(sr25519.PubKey{}, sr25519.PubKeyName, nil) - cdc.RegisterConcrete(secp256k1.PubKey{}, + cdc.RegisterConcrete(&secp256k1.PubKey{}, secp256k1.PubKeyName, nil) cdc.RegisterConcrete(multisig.PubKeyMultisigThreshold{}, multisig.PubKeyAminoRoute, nil) - cdc.RegisterConcrete(&keys.Secp256K1PubKey{}, - "cosmos-sdk/Secp256K1PubKey", nil) - cdc.RegisterConcrete(&keys.LegacyAminoMultisigThresholdPubKey{}, + cdc.RegisterConcrete(&kmultisig.LegacyAminoMultisigThresholdPubKey{}, "cosmos-sdk/LegacyAminoMultisigThresholdPubKey", nil) cdc.RegisterInterface((*crypto.PrivKey)(nil), nil) @@ -40,7 +38,7 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { ed25519.PrivKeyName, nil) cdc.RegisterConcrete(sr25519.PrivKey{}, sr25519.PrivKeyName, nil) - cdc.RegisterConcrete(secp256k1.PrivKey{}, + cdc.RegisterConcrete(&secp256k1.PrivKey{}, secp256k1.PrivKeyName, nil) } diff --git a/crypto/hd/algo.go b/crypto/hd/algo.go index d88b88e4aba2..30636c56df06 100644 --- a/crypto/hd/algo.go +++ b/crypto/hd/algo.go @@ -66,6 +66,6 @@ func (s secp256k1Algo) Generate() GenerateFn { var bzArr = make([]byte, secp256k1.PrivKeySize) copy(bzArr, bz) - return secp256k1.PrivKey(bzArr) + return &secp256k1.PrivKey{Key: bzArr} } } diff --git a/crypto/hd/fundraiser_test.go b/crypto/hd/fundraiser_test.go index 2bc396721cb2..e8649a0086d9 100644 --- a/crypto/hd/fundraiser_test.go +++ b/crypto/hd/fundraiser_test.go @@ -65,7 +65,8 @@ func TestFundraiserCompatibility(t *testing.T) { master, ch := hd.ComputeMastersFromSeed(seed) priv, err := hd.DerivePrivateKeyForPath(master, ch, "44'/118'/0'/0/0") require.NoError(t, err) - pub := secp256k1.PrivKey(priv).PubKey() + privKey := &secp256k1.PrivKey{Key: priv} + pub := privKey.PubKey() t.Log("\tNODEJS GOLANG\n") t.Logf("SEED \t%X %X\n", seedB, seed) @@ -78,7 +79,7 @@ func TestFundraiserCompatibility(t *testing.T) { require.Equal(t, priv[:], privB, "Expected priv keys to match") pubBFixed := make([]byte, secp256k1.PubKeySize) copy(pubBFixed, pubB) - require.Equal(t, pub, secp256k1.PubKey(pubBFixed), fmt.Sprintf("Expected pub keys to match for %d", i)) + require.Equal(t, pub, &secp256k1.PubKey{Key: pubBFixed}, fmt.Sprintf("Expected pub keys to match for %d", i)) addr := pub.Address() t.Logf("ADDR \t%X %X\n", addrB, addr) diff --git a/crypto/keyring/keyring_ledger_test.go b/crypto/keyring/keyring_ledger_test.go index dd193d9d5002..d52b664b7c63 100644 --- a/crypto/keyring/keyring_ledger_test.go +++ b/crypto/keyring/keyring_ledger_test.go @@ -31,7 +31,7 @@ func TestInMemoryCreateLedger(t *testing.T) { pubKey := ledger.GetPubKey() pk, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, pubKey) require.NoError(t, err) - require.Equal(t, "cosmospub1addwnpepqdszcr95mrqqs8lw099aa9h8h906zmet22pmwe9vquzcgvnm93eqygufdlv", pk) + require.Equal(t, "cosmospub1addwnpc2yypkqtqvknvvqzqlaeu5hh5ku7u4lgt09dfg8dmy4srstppj0vk8yqss26rwu", pk) // Check that restoring the key gets the same results restoredKey, err := kb.Key("some_account") @@ -42,7 +42,7 @@ func TestInMemoryCreateLedger(t *testing.T) { pubKey = restoredKey.GetPubKey() pk, err = sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, pubKey) require.NoError(t, err) - require.Equal(t, "cosmospub1addwnpepqdszcr95mrqqs8lw099aa9h8h906zmet22pmwe9vquzcgvnm93eqygufdlv", pk) + require.Equal(t, "cosmospub1addwnpc2yypkqtqvknvvqzqlaeu5hh5ku7u4lgt09dfg8dmy4srstppj0vk8yqss26rwu", pk) path, err := restoredKey.GetPath() require.NoError(t, err) @@ -110,7 +110,7 @@ func TestAltKeyring_SaveLedgerKey(t *testing.T) { pubKey := ledger.GetPubKey() pk, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, pubKey) require.NoError(t, err) - require.Equal(t, "cosmospub1addwnpepqdszcr95mrqqs8lw099aa9h8h906zmet22pmwe9vquzcgvnm93eqygufdlv", pk) + require.Equal(t, "cosmospub1addwnpc2yypkqtqvknvvqzqlaeu5hh5ku7u4lgt09dfg8dmy4srstppj0vk8yqss26rwu", pk) // Check that restoring the key gets the same results restoredKey, err := keyring.Key("some_account") @@ -121,7 +121,7 @@ func TestAltKeyring_SaveLedgerKey(t *testing.T) { pubKey = restoredKey.GetPubKey() pk, err = sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, pubKey) require.NoError(t, err) - require.Equal(t, "cosmospub1addwnpepqdszcr95mrqqs8lw099aa9h8h906zmet22pmwe9vquzcgvnm93eqygufdlv", pk) + require.Equal(t, "cosmospub1addwnpc2yypkqtqvknvvqzqlaeu5hh5ku7u4lgt09dfg8dmy4srstppj0vk8yqss26rwu", pk) path, err := restoredKey.GetPath() require.NoError(t, err) diff --git a/crypto/keyring/types_test.go b/crypto/keyring/types_test.go index 18e818c0d17a..ef58c255bb52 100644 --- a/crypto/keyring/types_test.go +++ b/crypto/keyring/types_test.go @@ -12,18 +12,18 @@ import ( ) func Test_writeReadLedgerInfo(t *testing.T) { - tmpKey := make(secp256k1.PubKey, secp256k1.PubKeySize) + tmpKey := make([]byte, secp256k1.PubKeySize) bz, _ := hex.DecodeString("035AD6810A47F073553FF30D2FCC7E0D3B1C0B74B61A1AAA2582344037151E143A") copy(tmpKey[:], bz) - lInfo := newLedgerInfo("some_name", tmpKey, *hd.NewFundraiserParams(5, sdk.CoinType, 1), hd.Secp256k1Type) + lInfo := newLedgerInfo("some_name", &secp256k1.PubKey{Key: tmpKey}, *hd.NewFundraiserParams(5, sdk.CoinType, 1), hd.Secp256k1Type) assert.Equal(t, TypeLedger, lInfo.GetType()) path, err := lInfo.GetPath() assert.NoError(t, err) assert.Equal(t, "44'/118'/5'/0/1", path.String()) assert.Equal(t, - "cosmospub1addwnpepqddddqg2glc8x4fl7vxjlnr7p5a3czm5kcdp4239sg6yqdc4rc2r5wmxv8p", + "cosmospub1addwnpc2yyp4445ppfrlqu648les6t7v0cxnk8qtwjmp5x42ykprgsphz50pgws4pntz5", sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, lInfo.GetPubKey())) // Serialize and restore diff --git a/crypto/keys/keys.pb.go b/crypto/keys/keys.pb.go deleted file mode 100644 index 32f40eb5868a..000000000000 --- a/crypto/keys/keys.pb.go +++ /dev/null @@ -1,720 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: cosmos/crypto/v1/keys.proto - -package keys - -import ( - fmt "fmt" - types "github.com/cosmos/cosmos-sdk/codec/types" - github_com_cosmos_cosmos_sdk_crypto_keys_secp256k1 "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// LegacyAminoMultisigThresholdPubKey specifies a public key type -// which nests multiple public keys and a threshold, -// it uses legacy amino address rules -type LegacyAminoMultisigThresholdPubKey struct { - K uint32 `protobuf:"varint,1,opt,name=threshold,proto3" json:"threshold,omitempty" yaml:"threshold"` - PubKeys []*types.Any `protobuf:"bytes,2,rep,name=public_keys,json=publicKeys,proto3" json:"public_keys,omitempty" yaml:"pubkeys"` -} - -func (m *LegacyAminoMultisigThresholdPubKey) Reset() { *m = LegacyAminoMultisigThresholdPubKey{} } -func (m *LegacyAminoMultisigThresholdPubKey) String() string { return proto.CompactTextString(m) } -func (*LegacyAminoMultisigThresholdPubKey) ProtoMessage() {} -func (*LegacyAminoMultisigThresholdPubKey) Descriptor() ([]byte, []int) { - return fileDescriptor_eeb831e3a63b6aad, []int{0} -} -func (m *LegacyAminoMultisigThresholdPubKey) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *LegacyAminoMultisigThresholdPubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_LegacyAminoMultisigThresholdPubKey.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *LegacyAminoMultisigThresholdPubKey) XXX_Merge(src proto.Message) { - xxx_messageInfo_LegacyAminoMultisigThresholdPubKey.Merge(m, src) -} -func (m *LegacyAminoMultisigThresholdPubKey) XXX_Size() int { - return m.Size() -} -func (m *LegacyAminoMultisigThresholdPubKey) XXX_DiscardUnknown() { - xxx_messageInfo_LegacyAminoMultisigThresholdPubKey.DiscardUnknown(m) -} - -var xxx_messageInfo_LegacyAminoMultisigThresholdPubKey proto.InternalMessageInfo - -// Secp256K1PubKey defines a secp256k1 public key -type Secp256K1PubKey struct { - Key github_com_cosmos_cosmos_sdk_crypto_keys_secp256k1.PubKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1.PubKey" json:"key,omitempty"` -} - -func (m *Secp256K1PubKey) Reset() { *m = Secp256K1PubKey{} } -func (m *Secp256K1PubKey) String() string { return proto.CompactTextString(m) } -func (*Secp256K1PubKey) ProtoMessage() {} -func (*Secp256K1PubKey) Descriptor() ([]byte, []int) { - return fileDescriptor_eeb831e3a63b6aad, []int{1} -} -func (m *Secp256K1PubKey) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Secp256K1PubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Secp256K1PubKey.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Secp256K1PubKey) XXX_Merge(src proto.Message) { - xxx_messageInfo_Secp256K1PubKey.Merge(m, src) -} -func (m *Secp256K1PubKey) XXX_Size() int { - return m.Size() -} -func (m *Secp256K1PubKey) XXX_DiscardUnknown() { - xxx_messageInfo_Secp256K1PubKey.DiscardUnknown(m) -} - -var xxx_messageInfo_Secp256K1PubKey proto.InternalMessageInfo - -func (m *Secp256K1PubKey) GetKey() github_com_cosmos_cosmos_sdk_crypto_keys_secp256k1.PubKey { - if m != nil { - return m.Key - } - return nil -} - -// Secp256K1PrivKey defines a secp256k1 private key -type Secp256K1PrivKey struct { - Key github_com_cosmos_cosmos_sdk_crypto_keys_secp256k1.PrivKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1.PrivKey" json:"key,omitempty"` -} - -func (m *Secp256K1PrivKey) Reset() { *m = Secp256K1PrivKey{} } -func (m *Secp256K1PrivKey) String() string { return proto.CompactTextString(m) } -func (*Secp256K1PrivKey) ProtoMessage() {} -func (*Secp256K1PrivKey) Descriptor() ([]byte, []int) { - return fileDescriptor_eeb831e3a63b6aad, []int{2} -} -func (m *Secp256K1PrivKey) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Secp256K1PrivKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Secp256K1PrivKey.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Secp256K1PrivKey) XXX_Merge(src proto.Message) { - xxx_messageInfo_Secp256K1PrivKey.Merge(m, src) -} -func (m *Secp256K1PrivKey) XXX_Size() int { - return m.Size() -} -func (m *Secp256K1PrivKey) XXX_DiscardUnknown() { - xxx_messageInfo_Secp256K1PrivKey.DiscardUnknown(m) -} - -var xxx_messageInfo_Secp256K1PrivKey proto.InternalMessageInfo - -func (m *Secp256K1PrivKey) GetKey() github_com_cosmos_cosmos_sdk_crypto_keys_secp256k1.PrivKey { - if m != nil { - return m.Key - } - return nil -} - -func init() { - proto.RegisterType((*LegacyAminoMultisigThresholdPubKey)(nil), "cosmos.crypto.v1.LegacyAminoMultisigThresholdPubKey") - proto.RegisterType((*Secp256K1PubKey)(nil), "cosmos.crypto.v1.Secp256K1PubKey") - proto.RegisterType((*Secp256K1PrivKey)(nil), "cosmos.crypto.v1.Secp256K1PrivKey") -} - -func init() { proto.RegisterFile("cosmos/crypto/v1/keys.proto", fileDescriptor_eeb831e3a63b6aad) } - -var fileDescriptor_eeb831e3a63b6aad = []byte{ - // 366 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x90, 0x3f, 0x4f, 0xf2, 0x40, - 0x1c, 0xc7, 0xdb, 0x87, 0x27, 0x1a, 0x0f, 0xff, 0x10, 0xc2, 0x00, 0x18, 0x5b, 0xd2, 0x89, 0xc5, - 0xbb, 0x14, 0xa3, 0x46, 0x12, 0x4d, 0xe8, 0x8a, 0x46, 0x82, 0x4c, 0x2e, 0x86, 0x96, 0xf3, 0x68, - 0xda, 0x72, 0x4d, 0xaf, 0x25, 0xb9, 0x77, 0xe0, 0xe8, 0x4b, 0xf0, 0x6d, 0xf8, 0x0e, 0x1c, 0x19, - 0x9d, 0x1a, 0x53, 0xde, 0x01, 0x23, 0x93, 0xb9, 0x9e, 0x15, 0x47, 0xe3, 0xd4, 0xde, 0x7d, 0x7f, - 0xf7, 0xf9, 0x7c, 0xf3, 0x03, 0x87, 0x0e, 0x65, 0x01, 0x65, 0xc8, 0x89, 0x78, 0x18, 0x53, 0x34, - 0x37, 0x91, 0x87, 0x39, 0x83, 0x61, 0x44, 0x63, 0x5a, 0xad, 0xc8, 0x10, 0xca, 0x10, 0xce, 0xcd, - 0x66, 0x8d, 0x50, 0x42, 0xf3, 0x10, 0x89, 0x3f, 0x39, 0xd7, 0x6c, 0x10, 0x4a, 0x89, 0x8f, 0x51, - 0x7e, 0xb2, 0x93, 0x47, 0x34, 0x9e, 0x71, 0x19, 0x19, 0xaf, 0x2a, 0x30, 0xae, 0x31, 0x19, 0x3b, - 0xbc, 0x17, 0xb8, 0x33, 0x7a, 0x93, 0xf8, 0xb1, 0xcb, 0x5c, 0x32, 0x9a, 0x46, 0x98, 0x4d, 0xa9, - 0x3f, 0x19, 0x24, 0x76, 0x1f, 0xf3, 0xea, 0x39, 0xd8, 0x89, 0x8b, 0xab, 0xba, 0xda, 0x52, 0xdb, - 0x7b, 0x56, 0x23, 0x4b, 0x75, 0xb5, 0xbf, 0x4a, 0xf5, 0x0a, 0x1f, 0x07, 0x7e, 0xd7, 0xf8, 0xce, - 0x8d, 0xe1, 0x66, 0xb6, 0x3a, 0x02, 0xe5, 0x30, 0xb1, 0x7d, 0xd7, 0x79, 0x10, 0xbd, 0xeb, 0xff, - 0x5a, 0xa5, 0x76, 0xb9, 0x53, 0x83, 0xb2, 0x10, 0x2c, 0x0a, 0xc1, 0xde, 0x8c, 0x5b, 0x47, 0x59, - 0xaa, 0x6f, 0x4b, 0x1f, 0x5b, 0xa5, 0xfa, 0xbe, 0xc4, 0x86, 0x89, 0x2d, 0x5e, 0x1a, 0x43, 0x20, - 0x39, 0x22, 0xed, 0xfe, 0x7f, 0x7a, 0xd1, 0x15, 0xc3, 0x06, 0x07, 0x77, 0xd8, 0x09, 0x3b, 0xa7, - 0x67, 0x7d, 0xf3, 0xab, 0xe7, 0x2d, 0x28, 0x79, 0x98, 0xe7, 0x0d, 0x77, 0xad, 0xcb, 0x75, 0xaa, - 0x5f, 0x10, 0x37, 0x9e, 0x26, 0x36, 0x74, 0x68, 0x80, 0x8a, 0x55, 0xe6, 0x9f, 0x63, 0x36, 0xf1, - 0x8a, 0xad, 0x0a, 0x01, 0x62, 0x12, 0xe5, 0x99, 0x50, 0xb2, 0x86, 0x82, 0x64, 0x4c, 0x40, 0x65, - 0xe3, 0x88, 0xdc, 0xb9, 0x90, 0x0c, 0x7e, 0x4a, 0xae, 0xd6, 0xa9, 0xde, 0xfd, 0x8b, 0x44, 0xc2, - 0x72, 0x8b, 0x65, 0xbd, 0x65, 0x9a, 0xba, 0xc8, 0x34, 0xf5, 0x23, 0xd3, 0xd4, 0xe7, 0xa5, 0xa6, - 0x2c, 0x96, 0x9a, 0xf2, 0xbe, 0xd4, 0x94, 0xfb, 0xf6, 0x6f, 0xd1, 0xf6, 0x56, 0xbe, 0xcc, 0x93, - 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1b, 0xae, 0x95, 0x7c, 0x32, 0x02, 0x00, 0x00, -} - -func (m *LegacyAminoMultisigThresholdPubKey) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *LegacyAminoMultisigThresholdPubKey) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *LegacyAminoMultisigThresholdPubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.PubKeys) > 0 { - for iNdEx := len(m.PubKeys) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.PubKeys[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintKeys(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if m.K != 0 { - i = encodeVarintKeys(dAtA, i, uint64(m.K)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *Secp256K1PubKey) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Secp256K1PubKey) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Secp256K1PubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Secp256K1PrivKey) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Secp256K1PrivKey) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Secp256K1PrivKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintKeys(dAtA []byte, offset int, v uint64) int { - offset -= sovKeys(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *LegacyAminoMultisigThresholdPubKey) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.K != 0 { - n += 1 + sovKeys(uint64(m.K)) - } - if len(m.PubKeys) > 0 { - for _, e := range m.PubKeys { - l = e.Size() - n += 1 + l + sovKeys(uint64(l)) - } - } - return n -} - -func (m *Secp256K1PubKey) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovKeys(uint64(l)) - } - return n -} - -func (m *Secp256K1PrivKey) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovKeys(uint64(l)) - } - return n -} - -func sovKeys(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozKeys(x uint64) (n int) { - return sovKeys(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *LegacyAminoMultisigThresholdPubKey) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: LegacyAminoMultisigThresholdPubKey: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: LegacyAminoMultisigThresholdPubKey: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field K", wireType) - } - m.K = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.K |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PubKeys", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthKeys - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthKeys - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PubKeys = append(m.PubKeys, &types.Any{}) - if err := m.PubKeys[len(m.PubKeys)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipKeys(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Secp256K1PubKey) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Secp256K1PubKey: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Secp256K1PubKey: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthKeys - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthKeys - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) - if m.Key == nil { - m.Key = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipKeys(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Secp256K1PrivKey) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Secp256K1PrivKey: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Secp256K1PrivKey: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowKeys - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthKeys - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthKeys - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) - if m.Key == nil { - m.Key = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipKeys(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthKeys - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipKeys(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowKeys - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowKeys - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowKeys - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthKeys - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupKeys - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthKeys - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthKeys = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowKeys = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupKeys = fmt.Errorf("proto: unexpected end of group") -) diff --git a/crypto/keys/multisig/keys.pb.go b/crypto/keys/multisig/keys.pb.go new file mode 100644 index 000000000000..ca52a0e364a8 --- /dev/null +++ b/crypto/keys/multisig/keys.pb.go @@ -0,0 +1,365 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: cosmos/crypto/multisig/v1/keys.proto + +package multisig + +import ( + fmt "fmt" + types "github.com/cosmos/cosmos-sdk/codec/types" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// LegacyAminoMultisigThresholdPubKey specifies a public key type +// which nests multiple public keys and a threshold, +// it uses legacy amino address rules +type LegacyAminoMultisigThresholdPubKey struct { + K uint32 `protobuf:"varint,1,opt,name=threshold,proto3" json:"threshold,omitempty" yaml:"threshold"` + PubKeys []*types.Any `protobuf:"bytes,2,rep,name=public_keys,json=publicKeys,proto3" json:"public_keys,omitempty" yaml:"pubkeys"` +} + +func (m *LegacyAminoMultisigThresholdPubKey) Reset() { *m = LegacyAminoMultisigThresholdPubKey{} } +func (m *LegacyAminoMultisigThresholdPubKey) String() string { return proto.CompactTextString(m) } +func (*LegacyAminoMultisigThresholdPubKey) ProtoMessage() {} +func (*LegacyAminoMultisigThresholdPubKey) Descriptor() ([]byte, []int) { + return fileDescriptor_7090cf2b1c5dca0f, []int{0} +} +func (m *LegacyAminoMultisigThresholdPubKey) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *LegacyAminoMultisigThresholdPubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_LegacyAminoMultisigThresholdPubKey.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *LegacyAminoMultisigThresholdPubKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_LegacyAminoMultisigThresholdPubKey.Merge(m, src) +} +func (m *LegacyAminoMultisigThresholdPubKey) XXX_Size() int { + return m.Size() +} +func (m *LegacyAminoMultisigThresholdPubKey) XXX_DiscardUnknown() { + xxx_messageInfo_LegacyAminoMultisigThresholdPubKey.DiscardUnknown(m) +} + +var xxx_messageInfo_LegacyAminoMultisigThresholdPubKey proto.InternalMessageInfo + +func init() { + proto.RegisterType((*LegacyAminoMultisigThresholdPubKey)(nil), "cosmos.crypto.v1.LegacyAminoMultisigThresholdPubKey") +} + +func init() { + proto.RegisterFile("cosmos/crypto/multisig/v1/keys.proto", fileDescriptor_7090cf2b1c5dca0f) +} + +var fileDescriptor_7090cf2b1c5dca0f = []byte{ + // 301 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x49, 0xce, 0x2f, 0xce, + 0xcd, 0x2f, 0xd6, 0x4f, 0x2e, 0xaa, 0x2c, 0x28, 0xc9, 0xd7, 0xcf, 0x2d, 0xcd, 0x29, 0xc9, 0x2c, + 0xce, 0x4c, 0xd7, 0x2f, 0x33, 0xd4, 0xcf, 0x4e, 0xad, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, + 0x17, 0x12, 0x80, 0xa8, 0xd2, 0x83, 0xa8, 0xd2, 0x2b, 0x33, 0x94, 0x12, 0x49, 0xcf, 0x4f, 0xcf, + 0x07, 0x4b, 0xea, 0x83, 0x58, 0x10, 0x75, 0x52, 0x92, 0xe9, 0xf9, 0xf9, 0xe9, 0x39, 0xa9, 0xfa, + 0x60, 0x5e, 0x52, 0x69, 0x9a, 0x7e, 0x62, 0x5e, 0x25, 0x44, 0x4a, 0x69, 0x27, 0x23, 0x97, 0x92, + 0x4f, 0x6a, 0x7a, 0x62, 0x72, 0xa5, 0x63, 0x6e, 0x66, 0x5e, 0xbe, 0x2f, 0xd4, 0xa2, 0x90, 0x8c, + 0xa2, 0xd4, 0xe2, 0x8c, 0xfc, 0x9c, 0x94, 0x80, 0xd2, 0x24, 0xef, 0xd4, 0x4a, 0x21, 0x73, 0x2e, + 0xce, 0x12, 0x98, 0x90, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0xaf, 0x93, 0xe4, 0xa3, 0x7b, 0xf2, 0x8c, + 0xde, 0x9f, 0xee, 0xc9, 0x0b, 0x54, 0x26, 0xe6, 0xe6, 0x58, 0x29, 0xc1, 0xe5, 0x95, 0x82, 0x10, + 0x6a, 0x85, 0x42, 0xb8, 0xb8, 0x0b, 0x4a, 0x93, 0x72, 0x32, 0x93, 0xe3, 0x41, 0xee, 0x96, 0x60, + 0x52, 0x60, 0xd6, 0xe0, 0x36, 0x12, 0xd1, 0x83, 0x38, 0x48, 0x0f, 0xe6, 0x20, 0x3d, 0xc7, 0xbc, + 0x4a, 0x27, 0xd9, 0x47, 0xf7, 0xe4, 0xd9, 0x21, 0xf6, 0x15, 0x7f, 0xba, 0x27, 0xcf, 0x07, 0x31, + 0xb6, 0xa0, 0x34, 0x09, 0xa4, 0x53, 0x29, 0x88, 0x0b, 0x62, 0x0e, 0x48, 0xd6, 0x8a, 0xa5, 0x63, + 0x81, 0x3c, 0x83, 0x93, 0xf7, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, 0x24, + 0xc7, 0x38, 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, 0x0c, 0x37, 0x1e, 0xcb, 0x31, 0x44, 0x19, + 0xa6, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0xc3, 0x42, 0x12, 0x4c, 0xe9, + 0x16, 0xa7, 0x64, 0xc3, 0x02, 0x15, 0x64, 0x2c, 0x3c, 0x64, 0x93, 0xd8, 0xc0, 0x6e, 0x31, 0x06, + 0x04, 0x00, 0x00, 0xff, 0xff, 0x25, 0x8d, 0x36, 0x4b, 0x7a, 0x01, 0x00, 0x00, +} + +func (m *LegacyAminoMultisigThresholdPubKey) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LegacyAminoMultisigThresholdPubKey) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *LegacyAminoMultisigThresholdPubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.PubKeys) > 0 { + for iNdEx := len(m.PubKeys) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.PubKeys[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintKeys(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if m.K != 0 { + i = encodeVarintKeys(dAtA, i, uint64(m.K)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func encodeVarintKeys(dAtA []byte, offset int, v uint64) int { + offset -= sovKeys(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *LegacyAminoMultisigThresholdPubKey) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.K != 0 { + n += 1 + sovKeys(uint64(m.K)) + } + if len(m.PubKeys) > 0 { + for _, e := range m.PubKeys { + l = e.Size() + n += 1 + l + sovKeys(uint64(l)) + } + } + return n +} + +func sovKeys(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozKeys(x uint64) (n int) { + return sovKeys(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *LegacyAminoMultisigThresholdPubKey) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LegacyAminoMultisigThresholdPubKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LegacyAminoMultisigThresholdPubKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field K", wireType) + } + m.K = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.K |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PubKeys", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthKeys + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthKeys + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PubKeys = append(m.PubKeys, &types.Any{}) + if err := m.PubKeys[len(m.PubKeys)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipKeys(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipKeys(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKeys + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKeys + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKeys + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthKeys + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupKeys + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthKeys + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthKeys = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowKeys = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupKeys = fmt.Errorf("proto: unexpected end of group") +) diff --git a/crypto/keys/multisig.go b/crypto/keys/multisig/multisig.go similarity index 99% rename from crypto/keys/multisig.go rename to crypto/keys/multisig/multisig.go index 8ed0aceb3dec..8b1d2655b441 100644 --- a/crypto/keys/multisig.go +++ b/crypto/keys/multisig/multisig.go @@ -1,4 +1,4 @@ -package keys +package multisig import ( fmt "fmt" diff --git a/crypto/keys/multisig_test.go b/crypto/keys/multisig/multisig_test.go similarity index 78% rename from crypto/keys/multisig_test.go rename to crypto/keys/multisig/multisig_test.go index 10b3db8ae61b..cec65791a211 100644 --- a/crypto/keys/multisig_test.go +++ b/crypto/keys/multisig/multisig_test.go @@ -1,10 +1,9 @@ -package keys_test +package multisig import ( "testing" "github.com/cosmos/cosmos-sdk/codec/types" - keys "github.com/cosmos/cosmos-sdk/crypto/keys" crypto "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" proto "github.com/gogo/protobuf/proto" @@ -20,7 +19,7 @@ func TestAddress(t *testing.T) { pubKeys, _ := generatePubKeysAndSignatures(5, msg) anyPubKeys, err := packPubKeys(pubKeys) require.NoError(t, err) - multisigKey := &keys.LegacyAminoMultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys} + multisigKey := &LegacyAminoMultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys} require.Len(t, multisigKey.Address().Bytes(), 20) } @@ -29,15 +28,13 @@ func TestEquals(t *testing.T) { pubKey1 := secp256k1.GenPrivKey().PubKey() pubKey2 := secp256k1.GenPrivKey().PubKey() - pbPubKey1 := &keys.Secp256K1PubKey{Key: pubKey1.(secp256k1.PubKey)} - pbPubKey2 := &keys.Secp256K1PubKey{Key: pubKey2.(secp256k1.PubKey)} - anyPubKeys, err := packPubKeys([]tmcrypto.PubKey{pbPubKey1, pbPubKey2}) + anyPubKeys, err := packPubKeys([]tmcrypto.PubKey{pubKey1, pubKey2}) require.NoError(t, err) - multisigKey := keys.LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys} + multisigKey := &LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys} - otherPubKeys, err := packPubKeys([]tmcrypto.PubKey{pbPubKey1, &multisigKey}) + otherPubKeys, err := packPubKeys([]tmcrypto.PubKey{pubKey1, multisigKey}) require.NoError(t, err) - otherMultisigKey := keys.LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: otherPubKeys} + otherMultisigKey := LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: otherPubKeys} testCases := []struct { msg string @@ -46,17 +43,17 @@ func TestEquals(t *testing.T) { }{ { "equals with proto pub key", - &keys.LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys}, + &LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys}, true, }, { "different threshold", - &keys.LegacyAminoMultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys}, + &LegacyAminoMultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys}, false, }, { "different pub keys length", - &keys.LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: []*types.Any{anyPubKeys[0]}}, + &LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: []*types.Any{anyPubKeys[0]}}, false, }, { @@ -69,11 +66,6 @@ func TestEquals(t *testing.T) { secp256k1.GenPrivKey().PubKey(), false, }, - { - "equals with amino pub key", - multisig.NewPubKeyMultisigThreshold(1, []tmcrypto.PubKey{pubKey1, pubKey2}), - true, - }, } for _, tc := range testCases { @@ -113,7 +105,7 @@ func TestVerifyMultisignature(t *testing.T) { pubKeys, _ := generatePubKeysAndSignatures(3, msg) anyPubKeys, err := packPubKeys(pubKeys) require.NoError(t, err) - pk = &keys.LegacyAminoMultisigThresholdPubKey{K: 3, PubKeys: anyPubKeys} + pk = &LegacyAminoMultisigThresholdPubKey{K: 3, PubKeys: anyPubKeys} sig = multisig.NewMultisig(1) }, false, @@ -126,7 +118,7 @@ func TestVerifyMultisignature(t *testing.T) { pubKeys, sigs := generatePubKeysAndSignatures(5, msg) anyPubKeys, err := packPubKeys(pubKeys) require.NoError(t, err) - pk = &keys.LegacyAminoMultisigThresholdPubKey{K: uint32(k), PubKeys: anyPubKeys} + pk = &LegacyAminoMultisigThresholdPubKey{K: uint32(k), PubKeys: anyPubKeys} sig = multisig.NewMultisig(len(pubKeys)) signBytesFn := func(mode signing.SignMode) ([]byte, error) { return msg, nil } @@ -183,7 +175,7 @@ func generatePubKeysAndSignatures(n int, msg []byte) (pubKeys []tmcrypto.PubKey, signatures = make([]signing.SignatureData, n) for i := 0; i < n; i++ { - privkey := &keys.Secp256K1PrivKey{Key: secp256k1.GenPrivKey()} + privkey := secp256k1.GenPrivKey() pubKeys[i] = privkey.PubKey() sig, _ := privkey.Sign(msg) @@ -211,14 +203,14 @@ func generateNestedMultiSignature(n int, msg []byte) (multisig.PubKey, *signing. if err != nil { return nil, nil, err } - pubKeys[i] = &keys.LegacyAminoMultisigThresholdPubKey{K: 5, PubKeys: anyNestedPks} + pubKeys[i] = &LegacyAminoMultisigThresholdPubKey{K: 5, PubKeys: anyNestedPks} bitArray.SetIndex(i, true) } anyPubKeys, err := packPubKeys(pubKeys) if err != nil { return nil, nil, err } - return &keys.LegacyAminoMultisigThresholdPubKey{K: uint32(n), PubKeys: anyPubKeys}, &signing.MultiSignatureData{ + return &LegacyAminoMultisigThresholdPubKey{K: uint32(n), PubKeys: anyPubKeys}, &signing.MultiSignatureData{ BitArray: bitArray, Signatures: signatures, }, nil diff --git a/crypto/keys/secp256k1.go b/crypto/keys/secp256k1.go deleted file mode 100644 index 0cc4b7294c59..000000000000 --- a/crypto/keys/secp256k1.go +++ /dev/null @@ -1,53 +0,0 @@ -package keys - -import ( - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - crypto "github.com/cosmos/cosmos-sdk/crypto/types" - tmcrypto "github.com/tendermint/tendermint/crypto" -) - -// asserting interface implementation -var ( - _ crypto.PubKey = &Secp256K1PubKey{} - _ crypto.PrivKey = &Secp256K1PrivKey{} -) - -func (m *Secp256K1PubKey) Address() crypto.Address { - return m.Key.Address() -} - -func (m *Secp256K1PubKey) Bytes() []byte { - return m.Key.Bytes() -} - -func (m *Secp256K1PubKey) VerifySignature(msg []byte, sig []byte) bool { - return m.Key.VerifySignature(msg, sig) -} - -func (m *Secp256K1PubKey) Equals(key tmcrypto.PubKey) bool { - return m.Key.Equals(key) -} - -func (m *Secp256K1PubKey) Type() string { - return m.Key.Type() -} - -func (m *Secp256K1PrivKey) Bytes() []byte { - return m.Key.Bytes() -} - -func (m *Secp256K1PrivKey) Sign(msg []byte) ([]byte, error) { - return m.Key.Sign(msg) -} - -func (m *Secp256K1PrivKey) PubKey() tmcrypto.PubKey { - return &Secp256K1PubKey{Key: m.Key.PubKey().(secp256k1.PubKey)} -} - -func (m *Secp256K1PrivKey) Equals(key tmcrypto.PrivKey) bool { - return m.Key.Equals(key) -} - -func (m *Secp256K1PrivKey) Type() string { - return m.Key.Type() -} diff --git a/crypto/keys/secp256k1/bench_test.go b/crypto/keys/secp256k1/bench_test.go index acd3693bfd15..e36f2df4b6e7 100644 --- a/crypto/keys/secp256k1/bench_test.go +++ b/crypto/keys/secp256k1/bench_test.go @@ -11,7 +11,8 @@ import ( func BenchmarkKeyGeneration(b *testing.B) { benchmarkKeygenWrapper := func(reader io.Reader) crypto.PrivKey { - return genPrivKey(reader) + priv := genPrivKey(reader) + return &PrivKey{Key: priv} } benchmarking.BenchmarkKeyGeneration(b, benchmarkKeygenWrapper) } diff --git a/crypto/keys/secp256k1/keys.pb.go b/crypto/keys/secp256k1/keys.pb.go new file mode 100644 index 000000000000..f29012107a2d --- /dev/null +++ b/crypto/keys/secp256k1/keys.pb.go @@ -0,0 +1,504 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: cosmos/crypto/secp256k1/v1/keys.proto + +package secp256k1 + +import ( + fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// PubKey defines a secp256k1 public key +// Key is the compressed form of the pubkey. The first byte depends is a 0x02 byte +// if the y-coordinate is the lexicographically largest of the two associated with +// the x-coordinate. Otherwise the first byte is a 0x03. +// This prefix is followed with the x-coordinate. +type PubKey struct { + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` +} + +func (m *PubKey) Reset() { *m = PubKey{} } +func (*PubKey) ProtoMessage() {} +func (*PubKey) Descriptor() ([]byte, []int) { + return fileDescriptor_ab22a3f15d2b8ddc, []int{0} +} +func (m *PubKey) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PubKey.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PubKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_PubKey.Merge(m, src) +} +func (m *PubKey) XXX_Size() int { + return m.Size() +} +func (m *PubKey) XXX_DiscardUnknown() { + xxx_messageInfo_PubKey.DiscardUnknown(m) +} + +var xxx_messageInfo_PubKey proto.InternalMessageInfo + +func (m *PubKey) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +// PrivKey defines a secp256k1 private key +type PrivKey struct { + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` +} + +func (m *PrivKey) Reset() { *m = PrivKey{} } +func (m *PrivKey) String() string { return proto.CompactTextString(m) } +func (*PrivKey) ProtoMessage() {} +func (*PrivKey) Descriptor() ([]byte, []int) { + return fileDescriptor_ab22a3f15d2b8ddc, []int{1} +} +func (m *PrivKey) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PrivKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PrivKey.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PrivKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_PrivKey.Merge(m, src) +} +func (m *PrivKey) XXX_Size() int { + return m.Size() +} +func (m *PrivKey) XXX_DiscardUnknown() { + xxx_messageInfo_PrivKey.DiscardUnknown(m) +} + +var xxx_messageInfo_PrivKey proto.InternalMessageInfo + +func (m *PrivKey) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func init() { + proto.RegisterType((*PubKey)(nil), "cosmos.crypto.secp256k1.v1.PubKey") + proto.RegisterType((*PrivKey)(nil), "cosmos.crypto.secp256k1.v1.PrivKey") +} + +func init() { + proto.RegisterFile("cosmos/crypto/secp256k1/v1/keys.proto", fileDescriptor_ab22a3f15d2b8ddc) +} + +var fileDescriptor_ab22a3f15d2b8ddc = []byte{ + // 191 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4d, 0xce, 0x2f, 0xce, + 0xcd, 0x2f, 0xd6, 0x4f, 0x2e, 0xaa, 0x2c, 0x28, 0xc9, 0xd7, 0x2f, 0x4e, 0x4d, 0x2e, 0x30, 0x32, + 0x35, 0xcb, 0x36, 0xd4, 0x2f, 0x33, 0xd4, 0xcf, 0x4e, 0xad, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, + 0xc9, 0x17, 0x92, 0x82, 0x28, 0xd3, 0x83, 0x28, 0xd3, 0x83, 0x2b, 0xd3, 0x2b, 0x33, 0x94, 0x12, + 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0x2b, 0xd3, 0x07, 0xb1, 0x20, 0x3a, 0x94, 0x14, 0xb8, 0xd8, 0x02, + 0x4a, 0x93, 0xbc, 0x53, 0x2b, 0x85, 0x04, 0xb8, 0x98, 0xb3, 0x53, 0x2b, 0x25, 0x18, 0x15, 0x18, + 0x35, 0x78, 0x82, 0x40, 0x4c, 0x2b, 0x96, 0x19, 0x0b, 0xe4, 0x19, 0x94, 0xa4, 0xb9, 0xd8, 0x03, + 0x8a, 0x32, 0xcb, 0xb0, 0x2a, 0x71, 0xf2, 0x39, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, + 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, + 0x86, 0x28, 0xa3, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0x98, 0xe3, + 0xc1, 0x94, 0x6e, 0x71, 0x4a, 0x36, 0xcc, 0x1f, 0x20, 0xa7, 0x23, 0x3c, 0x93, 0xc4, 0x06, 0x76, + 0x93, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0xa0, 0x87, 0xb2, 0xc3, 0xee, 0x00, 0x00, 0x00, +} + +func (m *PubKey) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PubKey) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *PrivKey) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PrivKey) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PrivKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintKeys(dAtA []byte, offset int, v uint64) int { + offset -= sovKeys(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *PubKey) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovKeys(uint64(l)) + } + return n +} + +func (m *PrivKey) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovKeys(uint64(l)) + } + return n +} + +func sovKeys(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozKeys(x uint64) (n int) { + return sovKeys(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *PubKey) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PubKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PubKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthKeys + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthKeys + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipKeys(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PrivKey) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PrivKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PrivKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthKeys + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthKeys + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipKeys(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipKeys(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKeys + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKeys + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKeys + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthKeys + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupKeys + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthKeys + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthKeys = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowKeys = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupKeys = fmt.Errorf("proto: unexpected end of group") +) diff --git a/crypto/keys/secp256k1/secp256k1.go b/crypto/keys/secp256k1/secp256k1.go index 1f3018fe4be9..0c92c91af29d 100644 --- a/crypto/keys/secp256k1/secp256k1.go +++ b/crypto/keys/secp256k1/secp256k1.go @@ -9,12 +9,13 @@ import ( "math/big" secp256k1 "github.com/btcsuite/btcd/btcec" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "golang.org/x/crypto/ripemd160" // nolint: staticcheck // necessary for Bitcoin address format "github.com/tendermint/tendermint/crypto" ) -var _ crypto.PrivKey = PrivKey{} +var _ cryptotypes.PrivKey = &PrivKey{} const ( PrivKeySize = 32 @@ -23,39 +24,37 @@ const ( PubKeyName = "tendermint/PubKeySecp256k1" ) -// PrivKey implements PrivKey. -type PrivKey []byte - // Bytes returns the byte representation of the Private Key. -func (privKey PrivKey) Bytes() []byte { - return []byte(privKey) +func (privKey *PrivKey) Bytes() []byte { + return []byte(privKey.Key) } // PubKey performs the point-scalar multiplication from the privKey on the // generator point to get the pubkey. -func (privKey PrivKey) PubKey() crypto.PubKey { - _, pubkeyObject := secp256k1.PrivKeyFromBytes(secp256k1.S256(), privKey) - return PubKey(pubkeyObject.SerializeCompressed()) +func (privKey *PrivKey) PubKey() crypto.PubKey { + _, pubkeyObject := secp256k1.PrivKeyFromBytes(secp256k1.S256(), privKey.Key) + pk := pubkeyObject.SerializeCompressed() + return &PubKey{Key: pk} } // Equals - you probably don't need to use this. -// Runs in constant time based on length of the keys. -func (privKey PrivKey) Equals(other crypto.PrivKey) bool { +// Runs in constant time based on length of the +func (privKey *PrivKey) Equals(other crypto.PrivKey) bool { return privKey.Type() == other.Type() && subtle.ConstantTimeCompare(privKey.Bytes(), other.Bytes()) == 1 } -func (privKey PrivKey) Type() string { +func (privKey *PrivKey) Type() string { return keyType } // GenPrivKey generates a new ECDSA private key on curve secp256k1 private key. // It uses OS randomness to generate the private key. -func GenPrivKey() PrivKey { - return genPrivKey(crypto.CReader()) +func GenPrivKey() *PrivKey { + return &PrivKey{Key: genPrivKey(crypto.CReader())} } // genPrivKey generates a new secp256k1 private key using the provided reader. -func genPrivKey(rand io.Reader) PrivKey { +func genPrivKey(rand io.Reader) []byte { var privKeyBytes [PrivKeySize]byte d := new(big.Int) for { @@ -73,7 +72,7 @@ func genPrivKey(rand io.Reader) PrivKey { } } - return PrivKey(privKeyBytes[:]) + return privKeyBytes[:] } var one = new(big.Int).SetInt64(1) @@ -88,7 +87,7 @@ var one = new(big.Int).SetInt64(1) // // NOTE: secret should be the output of a KDF like bcrypt, // if it's derived from user input. -func GenPrivKeyFromSecret(secret []byte) PrivKey { +func GenPrivKeyFromSecret(secret []byte) *PrivKey { secHash := sha256.Sum256(secret) // to guarantee that we have a valid field element, we use the approach of: // "Suite B Implementer’s Guide to FIPS 186-3", A.2.1 @@ -104,32 +103,25 @@ func GenPrivKeyFromSecret(secret []byte) PrivKey { // copy feB over to fixed 32 byte privKey32 and pad (if necessary) copy(privKey32[32-len(feB):32], feB) - return PrivKey(privKey32) + return &PrivKey{Key: privKey32} } //------------------------------------- -var _ crypto.PubKey = PubKey{} +var _ cryptotypes.PubKey = &PubKey{} // PubKeySize is comprised of 32 bytes for one field element // (the x-coordinate), plus one byte for the parity of the y-coordinate. const PubKeySize = 33 -// PubKey implements crypto.PubKey. -// It is the compressed form of the pubkey. The first byte depends is a 0x02 byte -// if the y-coordinate is the lexicographically largest of the two associated with -// the x-coordinate. Otherwise the first byte is a 0x03. -// This prefix is followed with the x-coordinate. -type PubKey []byte - // Address returns a Bitcoin style addresses: RIPEMD160(SHA256(pubkey)) -func (pubKey PubKey) Address() crypto.Address { - if len(pubKey) != PubKeySize { +func (pubKey *PubKey) Address() crypto.Address { + if len(pubKey.Key) != PubKeySize { panic("length of pubkey is incorrect") } hasherSHA256 := sha256.New() - hasherSHA256.Write(pubKey) // does not error + hasherSHA256.Write(pubKey.Key) // does not error sha := hasherSHA256.Sum(nil) hasherRIPEMD160 := ripemd160.New() @@ -138,18 +130,18 @@ func (pubKey PubKey) Address() crypto.Address { } // Bytes returns the pubkey byte format. -func (pubKey PubKey) Bytes() []byte { - return []byte(pubKey) +func (pubKey *PubKey) Bytes() []byte { + return []byte(pubKey.Key) } -func (pubKey PubKey) String() string { - return fmt.Sprintf("PubKeySecp256k1{%X}", []byte(pubKey)) +func (pubKey *PubKey) String() string { + return fmt.Sprintf("PubKeySecp256k1{%X}", []byte(pubKey.Key)) } -func (pubKey PubKey) Type() string { +func (pubKey *PubKey) Type() string { return keyType } -func (pubKey PubKey) Equals(other crypto.PubKey) bool { +func (pubKey *PubKey) Equals(other crypto.PubKey) bool { return pubKey.Type() == other.Type() && bytes.Equal(pubKey.Bytes(), other.Bytes()) } diff --git a/crypto/keys/secp256k1/secp256k1_cgo.go b/crypto/keys/secp256k1/secp256k1_cgo.go index 416c22c1dd55..f1c4f2eeafb6 100644 --- a/crypto/keys/secp256k1/secp256k1_cgo.go +++ b/crypto/keys/secp256k1/secp256k1_cgo.go @@ -9,8 +9,8 @@ import ( ) // Sign creates an ECDSA signature on curve Secp256k1, using SHA256 on the msg. -func (privKey PrivKey) Sign(msg []byte) ([]byte, error) { - rsv, err := secp256k1.Sign(crypto.Sha256(msg), privKey[:]) +func (privKey *PrivKey) Sign(msg []byte) ([]byte, error) { + rsv, err := secp256k1.Sign(crypto.Sha256(msg), privKey.Key[:]) if err != nil { return nil, err } @@ -19,6 +19,6 @@ func (privKey PrivKey) Sign(msg []byte) ([]byte, error) { return rs, nil } -func (pubKey PubKey) VerifySignature(msg []byte, sig []byte) bool { - return secp256k1.VerifySignature(pubKey[:], crypto.Sha256(msg), sig) +func (pubKey *PrivKey) VerifySignature(msg []byte, sig []byte) bool { + return secp256k1.VerifySignature(pubKey.Key[:], crypto.Sha256(msg), sig) } diff --git a/crypto/keys/secp256k1/secp256k1_cgo_test.go b/crypto/keys/secp256k1/secp256k1_cgo_test.go index 8793e8010c6a..bfaa76caf9db 100644 --- a/crypto/keys/secp256k1/secp256k1_cgo_test.go +++ b/crypto/keys/secp256k1/secp256k1_cgo_test.go @@ -15,12 +15,12 @@ func TestPrivKeySecp256k1SignVerify(t *testing.T) { priv := GenPrivKey() tests := []struct { name string - privKey PrivKey + privKey *PrivKey wantSignErr bool wantVerifyPasses bool }{ {name: "valid sign-verify round", privKey: priv, wantSignErr: false, wantVerifyPasses: true}, - {name: "invalid private key", privKey: [32]byte{}, wantSignErr: true, wantVerifyPasses: false}, + {name: "invalid private key", privKey: &*PrivKey{Key: [32]byte{}}, wantSignErr: true, wantVerifyPasses: false}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/crypto/keys/secp256k1/secp256k1_nocgo.go b/crypto/keys/secp256k1/secp256k1_nocgo.go index 29e5d36b7b53..6ed9c0eb42b3 100644 --- a/crypto/keys/secp256k1/secp256k1_nocgo.go +++ b/crypto/keys/secp256k1/secp256k1_nocgo.go @@ -18,8 +18,8 @@ var secp256k1halfN = new(big.Int).Rsh(secp256k1.S256().N, 1) // Sign creates an ECDSA signature on curve Secp256k1, using SHA256 on the msg. // The returned signature will be of the form R || S (in lower-S form). -func (privKey PrivKey) Sign(msg []byte) ([]byte, error) { - priv, _ := secp256k1.PrivKeyFromBytes(secp256k1.S256(), privKey[:]) +func (privKey *PrivKey) Sign(msg []byte) ([]byte, error) { + priv, _ := secp256k1.PrivKeyFromBytes(secp256k1.S256(), privKey.Key[:]) sig, err := priv.Sign(crypto.Sha256(msg)) if err != nil { return nil, err @@ -30,11 +30,11 @@ func (privKey PrivKey) Sign(msg []byte) ([]byte, error) { // VerifyBytes verifies a signature of the form R || S. // It rejects signatures which are not in lower-S form. -func (pubKey PubKey) VerifySignature(msg []byte, sigStr []byte) bool { +func (pubKey *PubKey) VerifySignature(msg []byte, sigStr []byte) bool { if len(sigStr) != 64 { return false } - pub, err := secp256k1.ParsePubKey(pubKey[:], secp256k1.S256()) + pub, err := secp256k1.ParsePubKey(pubKey.Key[:], secp256k1.S256()) if err != nil { return false } diff --git a/crypto/keys/secp256k1/secp256k1_test.go b/crypto/keys/secp256k1/secp256k1_test.go index 8f7b9bc4e93a..31237a37f991 100644 --- a/crypto/keys/secp256k1/secp256k1_test.go +++ b/crypto/keys/secp256k1/secp256k1_test.go @@ -10,10 +10,12 @@ import ( "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto" + "github.com/tendermint/tendermint/crypto/sr25519" underlyingSecp256k1 "github.com/btcsuite/btcd/btcec" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" ) type keyData struct { @@ -37,13 +39,13 @@ func TestPubKeySecp256k1Address(t *testing.T) { addrBbz, _, _ := base58.CheckDecode(d.addr) addrB := crypto.Address(addrBbz) - var priv secp256k1.PrivKey = privB + var priv secp256k1.PrivKey = secp256k1.PrivKey{Key: privB} pubKey := priv.PubKey() - pubT, _ := pubKey.(secp256k1.PubKey) + pubT, _ := pubKey.(*secp256k1.PubKey) addr := pubKey.Address() - assert.Equal(t, pubT, secp256k1.PubKey(pubB), "Expected pub keys to match") + assert.Equal(t, pubT, &secp256k1.PubKey{Key: pubB}, "Expected pub keys to match") assert.Equal(t, addr, addrB, "Expected addresses to match") } } @@ -108,9 +110,87 @@ func TestGenPrivKeyFromSecret(t *testing.T) { gotPrivKey := secp256k1.GenPrivKeyFromSecret(tt.secret) require.NotNil(t, gotPrivKey) // interpret as a big.Int and make sure it is a valid field element: - fe := new(big.Int).SetBytes(gotPrivKey[:]) + fe := new(big.Int).SetBytes(gotPrivKey.Key[:]) require.True(t, fe.Cmp(N) < 0) require.True(t, fe.Sign() > 0) }) } } + +func TestPubKeyEquals(t *testing.T) { + secp256K1PubKey := secp256k1.GenPrivKey().PubKey().(*secp256k1.PubKey) + + testCases := []struct { + msg string + pubKey cryptotypes.PubKey + other crypto.PubKey + expectEq bool + }{ + { + "different bytes", + secp256K1PubKey, + secp256k1.GenPrivKey().PubKey(), + false, + }, + { + "equals", + secp256K1PubKey, + &secp256k1.PubKey{ + Key: secp256K1PubKey.Key, + }, + true, + }, + { + "different types", + secp256K1PubKey, + sr25519.GenPrivKey().PubKey(), + false, + }, + } + + for _, tc := range testCases { + t.Run(tc.msg, func(t *testing.T) { + eq := tc.pubKey.Equals(tc.other) + require.Equal(t, eq, tc.expectEq) + }) + } +} + +func TestPrivKeyEquals(t *testing.T) { + secp256K1PrivKey := secp256k1.GenPrivKey() + + testCases := []struct { + msg string + privKey cryptotypes.PrivKey + other crypto.PrivKey + expectEq bool + }{ + { + "different bytes", + secp256K1PrivKey, + secp256k1.GenPrivKey(), + false, + }, + { + "equals", + secp256K1PrivKey, + &secp256k1.PrivKey{ + Key: secp256K1PrivKey.Key, + }, + true, + }, + { + "different types", + secp256K1PrivKey, + sr25519.GenPrivKey(), + false, + }, + } + + for _, tc := range testCases { + t.Run(tc.msg, func(t *testing.T) { + eq := tc.privKey.Equals(tc.other) + require.Equal(t, eq, tc.expectEq) + }) + } +} diff --git a/crypto/keys/secp256k1_test.go b/crypto/keys/secp256k1_test.go deleted file mode 100644 index 8aff46258446..000000000000 --- a/crypto/keys/secp256k1_test.go +++ /dev/null @@ -1,149 +0,0 @@ -package keys_test - -import ( - "testing" - - "github.com/cosmos/cosmos-sdk/crypto/keys" - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - crypto "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - tmcrypto "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/sr25519" -) - -func TestPubKeyEquals(t *testing.T) { - secp256K1PubKey := secp256k1.GenPrivKey().PubKey().(secp256k1.PubKey) - secp256K1PbPubKey := &keys.Secp256K1PubKey{Key: secp256K1PubKey} - - testCases := []struct { - msg string - pubKey crypto.PubKey - other tmcrypto.PubKey - expectEq bool - }{ - { - "secp256k1 pb different bytes", - secp256K1PbPubKey, - &keys.Secp256K1PubKey{ - Key: secp256k1.GenPrivKey().PubKey().(secp256k1.PubKey), - }, - false, - }, - { - "secp256k1 pb equals", - secp256K1PbPubKey, - &keys.Secp256K1PubKey{ - Key: secp256K1PubKey, - }, - true, - }, - { - "secp256k1 different types", - secp256K1PbPubKey, - sr25519.GenPrivKey().PubKey(), - false, - }, - { - "secp256k1 different bytes", - secp256K1PbPubKey, - secp256k1.GenPrivKey().PubKey(), - false, - }, - { - "secp256k1 equals", - secp256K1PbPubKey, - secp256K1PubKey, - true, - }, - } - - for _, tc := range testCases { - t.Run(tc.msg, func(t *testing.T) { - eq := tc.pubKey.Equals(tc.other) - require.Equal(t, eq, tc.expectEq) - }) - } -} - -func TestPrivKeyEquals(t *testing.T) { - secp256K1PrivKey := secp256k1.GenPrivKey() - secp256K1PbPrivKey := &keys.Secp256K1PrivKey{Key: secp256K1PrivKey} - - testCases := []struct { - msg string - privKey crypto.PrivKey - other tmcrypto.PrivKey - expectEq bool - }{ - { - "secp256k1 pb different bytes", - secp256K1PbPrivKey, - &keys.Secp256K1PrivKey{ - Key: secp256k1.GenPrivKey(), - }, - false, - }, - { - "secp256k1 pb equals", - secp256K1PbPrivKey, - &keys.Secp256K1PrivKey{ - Key: secp256K1PrivKey, - }, - true, - }, - { - "secp256k1 different types", - secp256K1PbPrivKey, - sr25519.GenPrivKey(), - false, - }, - { - "secp256k1 different bytes", - secp256K1PbPrivKey, - secp256k1.GenPrivKey(), - false, - }, - { - "secp256k1 equals", - secp256K1PbPrivKey, - secp256K1PrivKey, - true, - }, - } - - for _, tc := range testCases { - t.Run(tc.msg, func(t *testing.T) { - eq := tc.privKey.Equals(tc.other) - require.Equal(t, eq, tc.expectEq) - }) - } -} - -func TestSignAndVerifySignature(t *testing.T) { - testCases := []struct { - msg string - privKey crypto.PrivKey - }{ - { - "secp256k1", - &keys.Secp256K1PrivKey{Key: secp256k1.GenPrivKey()}, - }, - } - - for _, tc := range testCases { - t.Run(tc.msg, func(t *testing.T) { - pubKey := tc.privKey.PubKey() - msg := tmcrypto.CRandBytes(128) - sig, err := tc.privKey.Sign(msg) - require.Nil(t, err) - - assert.True(t, pubKey.VerifySignature(msg, sig)) - - sig[7] ^= byte(0x01) - - assert.False(t, pubKey.VerifySignature(msg, sig)) - }) - } - -} diff --git a/crypto/ledger/ledger_mock.go b/crypto/ledger/ledger_mock.go index 45efc5c3010d..4f7feb2c52de 100644 --- a/crypto/ledger/ledger_mock.go +++ b/crypto/ledger/ledger_mock.go @@ -77,11 +77,12 @@ func (mock LedgerSECP256K1Mock) GetAddressPubKeySECP256K1(derivationPath []uint3 return nil, "", fmt.Errorf("error parsing public key: %v", err) } - compressedPublicKey := make(csecp256k1.PubKey, csecp256k1.PubKeySize) + compressedPublicKey := make([]byte, csecp256k1.PubKeySize) copy(compressedPublicKey, cmp.SerializeCompressed()) // Generate the bech32 addr using existing tmcrypto/etc. - addr := sdk.AccAddress(compressedPublicKey.Address()).String() + pub := &csecp256k1.PubKey{Key: compressedPublicKey} + addr := sdk.AccAddress(pub.Address()).String() return pk, addr, err } diff --git a/crypto/ledger/ledger_secp256k1.go b/crypto/ledger/ledger_secp256k1.go index 0884e36eb449..3afdbac5f321 100644 --- a/crypto/ledger/ledger_secp256k1.go +++ b/crypto/ledger/ledger_secp256k1.go @@ -246,10 +246,10 @@ func getPubKeyUnsafe(device SECP256K1, path hd.BIP44Params) (tmcrypto.PubKey, er return nil, fmt.Errorf("error parsing public key: %v", err) } - compressedPublicKey := make(secp256k1.PubKey, secp256k1.PubKeySize) + compressedPublicKey := make([]byte, secp256k1.PubKeySize) copy(compressedPublicKey, cmp.SerializeCompressed()) - return compressedPublicKey, nil + return &secp256k1.PubKey{Key: compressedPublicKey}, nil } // getPubKeyAddr reads the pubkey and the address from a ledger device. @@ -270,8 +270,8 @@ func getPubKeyAddrSafe(device SECP256K1, path hd.BIP44Params, hrp string) (tmcry return nil, "", fmt.Errorf("error parsing public key: %v", err) } - compressedPublicKey := make(secp256k1.PubKey, secp256k1.PubKeySize) + compressedPublicKey := make([]byte, secp256k1.PubKeySize) copy(compressedPublicKey, cmp.SerializeCompressed()) - return compressedPublicKey, addr, nil + return &secp256k1.PubKey{Key: compressedPublicKey}, addr, nil } diff --git a/crypto/ledger/ledger_test.go b/crypto/ledger/ledger_test.go index 9b21e464bcdb..c94a53a3de5b 100644 --- a/crypto/ledger/ledger_test.go +++ b/crypto/ledger/ledger_test.go @@ -28,13 +28,13 @@ func TestPublicKeyUnsafe(t *testing.T) { require.Nil(t, err, "%s", err) require.NotNil(t, priv) - require.Equal(t, "eb5ae98721034fef9cd7c4c63588d3b03feb5281b9d232cba34d6f3d71aee59211ffbfe1fe87", + require.Equal(t, "eb5ae9870a21034fef9cd7c4c63588d3b03feb5281b9d232cba34d6f3d71aee59211ffbfe1fe87", fmt.Sprintf("%x", cdc.Amino.MustMarshalBinaryBare(priv.PubKey())), "Is your device using test mnemonic: %s ?", testutil.TestMnemonic) pubKeyAddr, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, priv.PubKey()) require.NoError(t, err) - require.Equal(t, "cosmospub1addwnpepqd87l8xhcnrrtzxnkql7k55ph8fr9jarf4hn6udwukfprlalu8lgw0urza0", + require.Equal(t, "cosmospub1addwnpc2yyp5lmuu6lzvvdvg6wcrl66jsxuayvkt5dxk70t34mjeyy0lhlslapcuuuc4e", pubKeyAddr, "Is your device using test mnemonic: %s ?", testutil.TestMnemonic) addr := sdk.AccAddress(priv.PubKey().Address()).String() @@ -44,16 +44,16 @@ func TestPublicKeyUnsafe(t *testing.T) { func TestPublicKeyUnsafeHDPath(t *testing.T) { expectedAnswers := []string{ - "cosmospub1addwnpepqd87l8xhcnrrtzxnkql7k55ph8fr9jarf4hn6udwukfprlalu8lgw0urza0", - "cosmospub1addwnpepqfsdqjr68h7wjg5wacksmqaypasnra232fkgu5sxdlnlu8j22ztxvlqvd65", - "cosmospub1addwnpepqw3xwqun6q43vtgw6p4qspq7srvxhcmvq4jrx5j5ma6xy3r7k6dtxmrkh3d", - "cosmospub1addwnpepqvez9lrp09g8w7gkv42y4yr5p6826cu28ydrhrujv862yf4njmqyyjr4pjs", - "cosmospub1addwnpepq06hw3enfrtmq8n67teytcmtnrgcr0yntmyt25kdukfjkerdc7lqg32rcz7", - "cosmospub1addwnpepqg3trf2gd0s2940nckrxherwqhgmm6xd5h4pcnrh4x7y35h6yafmcpk5qns", - "cosmospub1addwnpepqdm6rjpx6wsref8wjn7ym6ntejet430j4szpngfgc20caz83lu545vuv8hp", - "cosmospub1addwnpepqvdhtjzy2wf44dm03jxsketxc07vzqwvt3vawqqtljgsr9s7jvydjmt66ew", - "cosmospub1addwnpepqwystfpyxwcava7v3t7ndps5xzu6s553wxcxzmmnxevlzvwrlqpzz695nw9", - "cosmospub1addwnpepqw970u6gjqkccg9u3rfj99857wupj2z9fqfzy2w7e5dd7xn7kzzgkgqch0r", + "cosmospub1addwnpc2yyp5lmuu6lzvvdvg6wcrl66jsxuayvkt5dxk70t34mjeyy0lhlslapcuuuc4e", + "cosmospub1addwnpc2yypxp5zg0g7le6fz3mhz6rvr5s8kzv0429fxerjjqeh70ls7ffgfveswmjqjd", + "cosmospub1addwnpc2yyp6yecrj0gzk93dpmgx5zqyr6qds6lrdszkgv6j2n0hgcjy06mf4vce4r7kc", + "cosmospub1addwnpc2yypnyghuv9u4qamezej4gj5sws8gattr3gu35wu0jfslfg3xkwtvqssersfgs", + "cosmospub1addwnpc2yypl2a68xdyd0vq70te0y30rdwvdrqdujd0v3d2jehjex2mydhrmupq6s3ks3", + "cosmospub1addwnpc2yypz9vd9fp47pgk470zcv6lydczar00gekj758zvw75mcjxjlgn480qppwn5p", + "cosmospub1addwnpc2yyph0gwgymf6q09ya620cn02d0xt9wk972kqgxdp9rpflr5g78ljjks4aax42", + "cosmospub1addwnpc2yyp3kawgg3fexk4hd7xg6zm9vmplesgpe3w9n4cqp07fzqvkr6fs3kgfmf902", + "cosmospub1addwnpc2yypcjpdyysemr4nhej906d5xzsctn2zjj9cmqct0wvm9nuf3c0uqyggfn76lm", + "cosmospub1addwnpc2yypchelnfzgzmrpqhjydxg557nemsxfgg4ypyg3fmmx34hc606cgfzcr2rhhp", } const numIters = 10 @@ -106,13 +106,13 @@ func TestPublicKeySafe(t *testing.T) { require.Nil(t, ShowAddress(path, priv.PubKey(), sdk.GetConfig().GetBech32AccountAddrPrefix())) - require.Equal(t, "eb5ae98721034fef9cd7c4c63588d3b03feb5281b9d232cba34d6f3d71aee59211ffbfe1fe87", + require.Equal(t, "eb5ae9870a21034fef9cd7c4c63588d3b03feb5281b9d232cba34d6f3d71aee59211ffbfe1fe87", fmt.Sprintf("%x", cdc.Amino.MustMarshalBinaryBare(priv.PubKey())), "Is your device using test mnemonic: %s ?", testutil.TestMnemonic) pubKeyAddr, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, priv.PubKey()) require.NoError(t, err) - require.Equal(t, "cosmospub1addwnpepqd87l8xhcnrrtzxnkql7k55ph8fr9jarf4hn6udwukfprlalu8lgw0urza0", + require.Equal(t, "cosmospub1addwnpc2yyp5lmuu6lzvvdvg6wcrl66jsxuayvkt5dxk70t34mjeyy0lhlslapcuuuc4e", pubKeyAddr, "Is your device using test mnemonic: %s ?", testutil.TestMnemonic) require.Equal(t, "cosmos1w34k53py5v5xyluazqpq65agyajavep2rflq6h", @@ -124,16 +124,16 @@ func TestPublicKeySafe(t *testing.T) { func TestPublicKeyHDPath(t *testing.T) { expectedPubKeys := []string{ - "cosmospub1addwnpepqd87l8xhcnrrtzxnkql7k55ph8fr9jarf4hn6udwukfprlalu8lgw0urza0", - "cosmospub1addwnpepqfsdqjr68h7wjg5wacksmqaypasnra232fkgu5sxdlnlu8j22ztxvlqvd65", - "cosmospub1addwnpepqw3xwqun6q43vtgw6p4qspq7srvxhcmvq4jrx5j5ma6xy3r7k6dtxmrkh3d", - "cosmospub1addwnpepqvez9lrp09g8w7gkv42y4yr5p6826cu28ydrhrujv862yf4njmqyyjr4pjs", - "cosmospub1addwnpepq06hw3enfrtmq8n67teytcmtnrgcr0yntmyt25kdukfjkerdc7lqg32rcz7", - "cosmospub1addwnpepqg3trf2gd0s2940nckrxherwqhgmm6xd5h4pcnrh4x7y35h6yafmcpk5qns", - "cosmospub1addwnpepqdm6rjpx6wsref8wjn7ym6ntejet430j4szpngfgc20caz83lu545vuv8hp", - "cosmospub1addwnpepqvdhtjzy2wf44dm03jxsketxc07vzqwvt3vawqqtljgsr9s7jvydjmt66ew", - "cosmospub1addwnpepqwystfpyxwcava7v3t7ndps5xzu6s553wxcxzmmnxevlzvwrlqpzz695nw9", - "cosmospub1addwnpepqw970u6gjqkccg9u3rfj99857wupj2z9fqfzy2w7e5dd7xn7kzzgkgqch0r", + "cosmospub1addwnpc2yyp5lmuu6lzvvdvg6wcrl66jsxuayvkt5dxk70t34mjeyy0lhlslapcuuuc4e", + "cosmospub1addwnpc2yypxp5zg0g7le6fz3mhz6rvr5s8kzv0429fxerjjqeh70ls7ffgfveswmjqjd", + "cosmospub1addwnpc2yyp6yecrj0gzk93dpmgx5zqyr6qds6lrdszkgv6j2n0hgcjy06mf4vce4r7kc", + "cosmospub1addwnpc2yypnyghuv9u4qamezej4gj5sws8gattr3gu35wu0jfslfg3xkwtvqssersfgs", + "cosmospub1addwnpc2yypl2a68xdyd0vq70te0y30rdwvdrqdujd0v3d2jehjex2mydhrmupq6s3ks3", + "cosmospub1addwnpc2yypz9vd9fp47pgk470zcv6lydczar00gekj758zvw75mcjxjlgn480qppwn5p", + "cosmospub1addwnpc2yyph0gwgymf6q09ya620cn02d0xt9wk972kqgxdp9rpflr5g78ljjks4aax42", + "cosmospub1addwnpc2yyp3kawgg3fexk4hd7xg6zm9vmplesgpe3w9n4cqp07fzqvkr6fs3kgfmf902", + "cosmospub1addwnpc2yypcjpdyysemr4nhej906d5xzsctn2zjj9cmqct0wvm9nuf3c0uqyggfn76lm", + "cosmospub1addwnpc2yypchelnfzgzmrpqhjydxg557nemsxfgg4ypyg3fmmx34hc606cgfzcr2rhhp", } expectedAddrs := []string{ diff --git a/crypto/types/multisig/codec.go b/crypto/types/multisig/codec.go index 54bd0f225a96..8358cb55265a 100644 --- a/crypto/types/multisig/codec.go +++ b/crypto/types/multisig/codec.go @@ -25,6 +25,6 @@ func init() { ed25519.PubKeyName, nil) Cdc.RegisterConcrete(sr25519.PubKey{}, sr25519.PubKeyName, nil) - Cdc.RegisterConcrete(secp256k1.PubKey{}, + Cdc.RegisterConcrete(&secp256k1.PubKey{}, secp256k1.PubKeyName, nil) } diff --git a/crypto/types/multisig/threshold_pubkey_test.go b/crypto/types/multisig/threshold_pubkey_test.go index 71ed9147100b..eadb589f5e9e 100644 --- a/crypto/types/multisig/threshold_pubkey_test.go +++ b/crypto/types/multisig/threshold_pubkey_test.go @@ -13,7 +13,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/crypto/keys" + kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" @@ -146,15 +146,15 @@ func TestMultiSigPubKeyEquality(t *testing.T) { malleate func() expectEq bool }{ - { - "equals", - func() { - var otherPubKey multisig.PubKeyMultisigThreshold - multisig.Cdc.MustUnmarshalBinaryBare(multisigKey.Bytes(), &otherPubKey) - other = otherPubKey - }, - true, - }, + // { + // "equals", + // func() { + // var otherPubKey multisig.PubKeyMultisigThreshold + // multisig.Cdc.MustUnmarshalBinaryBare(multisigKey.Bytes(), &otherPubKey) + // other = otherPubKey + // }, + // true, + // }, { "ensure that reordering pubkeys is treated as a different pubkey", func() { @@ -169,18 +169,14 @@ func TestMultiSigPubKeyEquality(t *testing.T) { { "equals with proto pub key", func() { - pbPubkeys := []crypto.PubKey{ - &keys.Secp256K1PubKey{Key: pubKey1.(secp256k1.PubKey)}, - &keys.Secp256K1PubKey{Key: pubKey2.(secp256k1.PubKey)}, - } - anyPubKeys := make([]*codectypes.Any, len(pbPubkeys)) + anyPubKeys := make([]*codectypes.Any, len(pubkeys)) for i := 0; i < len(pubkeys); i++ { - any, err := codectypes.NewAnyWithValue(pbPubkeys[i].(proto.Message)) + any, err := codectypes.NewAnyWithValue(pubkeys[i].(proto.Message)) require.NoError(t, err) anyPubKeys[i] = any } - other = &keys.LegacyAminoMultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys} + other = &kmultisig.LegacyAminoMultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys} }, true, }, diff --git a/proto/cosmos/crypto/v1/keys.proto b/proto/cosmos/crypto/multisig/v1/keys.proto similarity index 58% rename from proto/cosmos/crypto/v1/keys.proto rename to proto/cosmos/crypto/multisig/v1/keys.proto index 26e9fd1b849e..605d5e85d98f 100644 --- a/proto/cosmos/crypto/v1/keys.proto +++ b/proto/cosmos/crypto/multisig/v1/keys.proto @@ -4,7 +4,7 @@ package cosmos.crypto.v1; import "gogoproto/gogo.proto"; import "google/protobuf/any.proto"; -option go_package = "github.com/cosmos/cosmos-sdk/crypto/keys"; +option go_package = "github.com/cosmos/cosmos-sdk/crypto/keys/multisig"; // LegacyAminoMultisigThresholdPubKey specifies a public key type // which nests multiple public keys and a threshold, @@ -14,14 +14,4 @@ message LegacyAminoMultisigThresholdPubKey { uint32 threshold = 1 [(gogoproto.customname) = "K", (gogoproto.moretags) = "yaml:\"threshold\""]; repeated google.protobuf.Any public_keys = 2 [(gogoproto.customname) = "PubKeys", (gogoproto.moretags) = "yaml:\"pubkeys\""]; -} - -// Secp256K1PubKey defines a secp256k1 public key -message Secp256K1PubKey { - bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1.PubKey"]; -} - -// Secp256K1PrivKey defines a secp256k1 private key -message Secp256K1PrivKey { - bytes key = 1 [(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1.PrivKey"]; } \ No newline at end of file diff --git a/proto/cosmos/crypto/secp256k1/v1/keys.proto b/proto/cosmos/crypto/secp256k1/v1/keys.proto new file mode 100644 index 000000000000..dc0b868d2807 --- /dev/null +++ b/proto/cosmos/crypto/secp256k1/v1/keys.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; +package cosmos.crypto.secp256k1.v1; + +import "gogoproto/gogo.proto"; + +option go_package = "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"; + +// PubKey defines a secp256k1 public key +// Key is the compressed form of the pubkey. The first byte depends is a 0x02 byte +// if the y-coordinate is the lexicographically largest of the two associated with +// the x-coordinate. Otherwise the first byte is a 0x03. +// This prefix is followed with the x-coordinate. +message PubKey { + option (gogoproto.goproto_stringer) = false; + + bytes key = 1; +} + +// PrivKey defines a secp256k1 private key +message PrivKey { + bytes key = 1; +} \ No newline at end of file diff --git a/std/pubkey.go b/std/pubkey.go index 72f71933af4e..76d5a257a9b4 100644 --- a/std/pubkey.go +++ b/std/pubkey.go @@ -34,9 +34,9 @@ func (cdc DefaultPublicKeyCodec) Decode(key *types.PublicKey) (crypto.PubKey, er return nil, fmt.Errorf("wrong length %d for secp256k1 public key", n) } - res := make(secp256k1.PubKey, secp256k1.PubKeySize) + res := make([]byte, secp256k1.PubKeySize) copy(res, key.Secp256K1) - return res, nil + return &secp256k1.PubKey{Key: res}, nil case *types.PublicKey_Ed25519: n := len(key.Ed25519) if n != ed25519.PubKeySize { @@ -79,8 +79,8 @@ func (cdc DefaultPublicKeyCodec) Encode(key crypto.PubKey) (*types.PublicKey, er return &types.PublicKey{}, nil } switch key := key.(type) { - case secp256k1.PubKey: - return &types.PublicKey{Sum: &types.PublicKey_Secp256K1{Secp256K1: key}}, nil + case *secp256k1.PubKey: + return &types.PublicKey{Sum: &types.PublicKey_Secp256K1{Secp256K1: key.Key}}, nil case ed25519.PubKey: return &types.PublicKey{Sum: &types.PublicKey_Ed25519{Ed25519: key}}, nil case sr25519.PubKey: diff --git a/x/auth/ante/sigverify.go b/x/auth/ante/sigverify.go index 7d1fea1ebec9..914ee20b07eb 100644 --- a/x/auth/ante/sigverify.go +++ b/x/auth/ante/sigverify.go @@ -18,7 +18,8 @@ import ( var ( // simulation signature values used to estimate gas consumption - simSecp256k1Pubkey = make(secp256k1.PubKey, secp256k1.PubKeySize) + key = make([]byte, secp256k1.PubKeySize) + simSecp256k1Pubkey = &secp256k1.PubKey{Key: key} simSecp256k1Sig [64]byte _ authsigning.SigVerifiableTx = (*types.StdTx)(nil) // assert StdTx implements SigVerifiableTx @@ -27,7 +28,8 @@ var ( func init() { // This decodes a valid hex string into a sepc256k1Pubkey for use in transaction simulation bz, _ := hex.DecodeString("035AD6810A47F073553FF30D2FCC7E0D3B1C0B74B61A1AAA2582344037151E143A") - copy(simSecp256k1Pubkey, bz) + copy(key, bz) + simSecp256k1Pubkey.Key = key } // SignatureVerificationGasConsumer is the type of function that is used to both @@ -337,7 +339,7 @@ func DefaultSigVerificationGasConsumer( meter.ConsumeGas(params.SigVerifyCostED25519, "ante verify: ed25519") return sdkerrors.Wrap(sdkerrors.ErrInvalidPubKey, "ED25519 public keys are unsupported") - case secp256k1.PubKey: + case *secp256k1.PubKey: meter.ConsumeGas(params.SigVerifyCostSecp256k1, "ante verify: secp256k1") return nil From 330a0be701e2e09bb60018bc947098ce69248914 Mon Sep 17 00:00:00 2001 From: blushi Date: Fri, 11 Sep 2020 14:04:57 +0200 Subject: [PATCH 043/128] Uncomment test case --- crypto/types/multisig/threshold_pubkey_test.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/crypto/types/multisig/threshold_pubkey_test.go b/crypto/types/multisig/threshold_pubkey_test.go index eadb589f5e9e..65cd161d1f0f 100644 --- a/crypto/types/multisig/threshold_pubkey_test.go +++ b/crypto/types/multisig/threshold_pubkey_test.go @@ -146,15 +146,15 @@ func TestMultiSigPubKeyEquality(t *testing.T) { malleate func() expectEq bool }{ - // { - // "equals", - // func() { - // var otherPubKey multisig.PubKeyMultisigThreshold - // multisig.Cdc.MustUnmarshalBinaryBare(multisigKey.Bytes(), &otherPubKey) - // other = otherPubKey - // }, - // true, - // }, + { + "equals", + func() { + var otherPubKey multisig.PubKeyMultisigThreshold + multisig.Cdc.MustUnmarshalBinaryBare(multisigKey.Bytes(), &otherPubKey) + other = otherPubKey + }, + true, + }, { "ensure that reordering pubkeys is treated as a different pubkey", func() { From e88c126b8f8ec8ceb94d8c13ca4e9ece1d1357b5 Mon Sep 17 00:00:00 2001 From: blushi Date: Fri, 11 Sep 2020 16:14:09 +0200 Subject: [PATCH 044/128] Fix linting issues --- crypto/keys/multisig/keys.pb.go | 36 +++++++++++----------- crypto/keys/secp256k1/secp256k1.go | 6 ++-- crypto/keys/secp256k1/secp256k1_cgo.go | 2 +- crypto/keys/secp256k1/secp256k1_nocgo.go | 2 +- proto/cosmos/crypto/multisig/v1/keys.proto | 2 +- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/crypto/keys/multisig/keys.pb.go b/crypto/keys/multisig/keys.pb.go index ca52a0e364a8..d9be3297c224 100644 --- a/crypto/keys/multisig/keys.pb.go +++ b/crypto/keys/multisig/keys.pb.go @@ -66,7 +66,7 @@ func (m *LegacyAminoMultisigThresholdPubKey) XXX_DiscardUnknown() { var xxx_messageInfo_LegacyAminoMultisigThresholdPubKey proto.InternalMessageInfo func init() { - proto.RegisterType((*LegacyAminoMultisigThresholdPubKey)(nil), "cosmos.crypto.v1.LegacyAminoMultisigThresholdPubKey") + proto.RegisterType((*LegacyAminoMultisigThresholdPubKey)(nil), "cosmos.crypto.multisig.v1.LegacyAminoMultisigThresholdPubKey") } func init() { @@ -74,26 +74,26 @@ func init() { } var fileDescriptor_7090cf2b1c5dca0f = []byte{ - // 301 bytes of a gzipped FileDescriptorProto + // 304 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x49, 0xce, 0x2f, 0xce, 0xcd, 0x2f, 0xd6, 0x4f, 0x2e, 0xaa, 0x2c, 0x28, 0xc9, 0xd7, 0xcf, 0x2d, 0xcd, 0x29, 0xc9, 0x2c, 0xce, 0x4c, 0xd7, 0x2f, 0x33, 0xd4, 0xcf, 0x4e, 0xad, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, - 0x17, 0x12, 0x80, 0xa8, 0xd2, 0x83, 0xa8, 0xd2, 0x2b, 0x33, 0x94, 0x12, 0x49, 0xcf, 0x4f, 0xcf, - 0x07, 0x4b, 0xea, 0x83, 0x58, 0x10, 0x75, 0x52, 0x92, 0xe9, 0xf9, 0xf9, 0xe9, 0x39, 0xa9, 0xfa, - 0x60, 0x5e, 0x52, 0x69, 0x9a, 0x7e, 0x62, 0x5e, 0x25, 0x44, 0x4a, 0x69, 0x27, 0x23, 0x97, 0x92, - 0x4f, 0x6a, 0x7a, 0x62, 0x72, 0xa5, 0x63, 0x6e, 0x66, 0x5e, 0xbe, 0x2f, 0xd4, 0xa2, 0x90, 0x8c, - 0xa2, 0xd4, 0xe2, 0x8c, 0xfc, 0x9c, 0x94, 0x80, 0xd2, 0x24, 0xef, 0xd4, 0x4a, 0x21, 0x73, 0x2e, - 0xce, 0x12, 0x98, 0x90, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0xaf, 0x93, 0xe4, 0xa3, 0x7b, 0xf2, 0x8c, - 0xde, 0x9f, 0xee, 0xc9, 0x0b, 0x54, 0x26, 0xe6, 0xe6, 0x58, 0x29, 0xc1, 0xe5, 0x95, 0x82, 0x10, - 0x6a, 0x85, 0x42, 0xb8, 0xb8, 0x0b, 0x4a, 0x93, 0x72, 0x32, 0x93, 0xe3, 0x41, 0xee, 0x96, 0x60, - 0x52, 0x60, 0xd6, 0xe0, 0x36, 0x12, 0xd1, 0x83, 0x38, 0x48, 0x0f, 0xe6, 0x20, 0x3d, 0xc7, 0xbc, - 0x4a, 0x27, 0xd9, 0x47, 0xf7, 0xe4, 0xd9, 0x21, 0xf6, 0x15, 0x7f, 0xba, 0x27, 0xcf, 0x07, 0x31, - 0xb6, 0xa0, 0x34, 0x09, 0xa4, 0x53, 0x29, 0x88, 0x0b, 0x62, 0x0e, 0x48, 0xd6, 0x8a, 0xa5, 0x63, - 0x81, 0x3c, 0x83, 0x93, 0xf7, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, 0x24, - 0xc7, 0x38, 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, 0x0c, 0x37, 0x1e, 0xcb, 0x31, 0x44, 0x19, - 0xa6, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, 0xe7, 0xea, 0xc3, 0x42, 0x12, 0x4c, 0xe9, - 0x16, 0xa7, 0x64, 0xc3, 0x02, 0x15, 0x64, 0x2c, 0x3c, 0x64, 0x93, 0xd8, 0xc0, 0x6e, 0x31, 0x06, - 0x04, 0x00, 0x00, 0xff, 0xff, 0x25, 0x8d, 0x36, 0x4b, 0x7a, 0x01, 0x00, 0x00, + 0x17, 0x92, 0x84, 0xa8, 0xd2, 0x83, 0xa8, 0xd2, 0x83, 0xa9, 0xd2, 0x2b, 0x33, 0x94, 0x12, 0x49, + 0xcf, 0x4f, 0xcf, 0x07, 0xab, 0xd2, 0x07, 0xb1, 0x20, 0x1a, 0xa4, 0x24, 0xd3, 0xf3, 0xf3, 0xd3, + 0x73, 0x52, 0xf5, 0xc1, 0xbc, 0xa4, 0xd2, 0x34, 0xfd, 0xc4, 0xbc, 0x4a, 0x88, 0x94, 0xd2, 0x4e, + 0x46, 0x2e, 0x25, 0x9f, 0xd4, 0xf4, 0xc4, 0xe4, 0x4a, 0xc7, 0xdc, 0xcc, 0xbc, 0x7c, 0x5f, 0xa8, + 0x59, 0x21, 0x19, 0x45, 0xa9, 0xc5, 0x19, 0xf9, 0x39, 0x29, 0x01, 0xa5, 0x49, 0xde, 0xa9, 0x95, + 0x42, 0xe6, 0x5c, 0x9c, 0x25, 0x30, 0x21, 0x09, 0x46, 0x05, 0x46, 0x0d, 0x5e, 0x27, 0xc9, 0x47, + 0xf7, 0xe4, 0x19, 0xbd, 0x3f, 0xdd, 0x93, 0x17, 0xa8, 0x4c, 0xcc, 0xcd, 0xb1, 0x52, 0x82, 0xcb, + 0x2b, 0x05, 0x21, 0xd4, 0x0a, 0x85, 0x70, 0x71, 0x17, 0x94, 0x26, 0xe5, 0x64, 0x26, 0xc7, 0x83, + 0x3c, 0x20, 0xc1, 0xa4, 0xc0, 0xac, 0xc1, 0x6d, 0x24, 0xa2, 0x07, 0x71, 0x90, 0x1e, 0xcc, 0x41, + 0x7a, 0x8e, 0x79, 0x95, 0x4e, 0xb2, 0x8f, 0xee, 0xc9, 0xb3, 0x43, 0xec, 0x2b, 0xfe, 0x74, 0x4f, + 0x9e, 0x0f, 0x62, 0x6c, 0x41, 0x69, 0x12, 0x48, 0xa7, 0x52, 0x10, 0x17, 0xc4, 0x1c, 0x90, 0xac, + 0x15, 0x4b, 0xc7, 0x02, 0x79, 0x06, 0x27, 0xef, 0x13, 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, + 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, 0x0b, 0x8f, 0xe5, 0x18, 0x6e, 0x3c, 0x96, + 0x63, 0x88, 0x32, 0x4c, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x87, 0x05, + 0x29, 0x98, 0xd2, 0x2d, 0x4e, 0xc9, 0x86, 0x85, 0x2e, 0xc8, 0x58, 0x78, 0x10, 0x27, 0xb1, 0x81, + 0xdd, 0x62, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0xbb, 0xd6, 0x98, 0x75, 0x83, 0x01, 0x00, 0x00, } func (m *LegacyAminoMultisigThresholdPubKey) Marshal() (dAtA []byte, err error) { diff --git a/crypto/keys/secp256k1/secp256k1.go b/crypto/keys/secp256k1/secp256k1.go index 0c92c91af29d..6c046be2591c 100644 --- a/crypto/keys/secp256k1/secp256k1.go +++ b/crypto/keys/secp256k1/secp256k1.go @@ -26,7 +26,7 @@ const ( // Bytes returns the byte representation of the Private Key. func (privKey *PrivKey) Bytes() []byte { - return []byte(privKey.Key) + return privKey.Key } // PubKey performs the point-scalar multiplication from the privKey on the @@ -131,11 +131,11 @@ func (pubKey *PubKey) Address() crypto.Address { // Bytes returns the pubkey byte format. func (pubKey *PubKey) Bytes() []byte { - return []byte(pubKey.Key) + return pubKey.Key } func (pubKey *PubKey) String() string { - return fmt.Sprintf("PubKeySecp256k1{%X}", []byte(pubKey.Key)) + return fmt.Sprintf("PubKeySecp256k1{%X}", pubKey.Key) } func (pubKey *PubKey) Type() string { diff --git a/crypto/keys/secp256k1/secp256k1_cgo.go b/crypto/keys/secp256k1/secp256k1_cgo.go index f1c4f2eeafb6..1596d5685dbf 100644 --- a/crypto/keys/secp256k1/secp256k1_cgo.go +++ b/crypto/keys/secp256k1/secp256k1_cgo.go @@ -10,7 +10,7 @@ import ( // Sign creates an ECDSA signature on curve Secp256k1, using SHA256 on the msg. func (privKey *PrivKey) Sign(msg []byte) ([]byte, error) { - rsv, err := secp256k1.Sign(crypto.Sha256(msg), privKey.Key[:]) + rsv, err := secp256k1.Sign(crypto.Sha256(msg), privKey.Key) if err != nil { return nil, err } diff --git a/crypto/keys/secp256k1/secp256k1_nocgo.go b/crypto/keys/secp256k1/secp256k1_nocgo.go index 6ed9c0eb42b3..6454cd3809f2 100644 --- a/crypto/keys/secp256k1/secp256k1_nocgo.go +++ b/crypto/keys/secp256k1/secp256k1_nocgo.go @@ -19,7 +19,7 @@ var secp256k1halfN = new(big.Int).Rsh(secp256k1.S256().N, 1) // Sign creates an ECDSA signature on curve Secp256k1, using SHA256 on the msg. // The returned signature will be of the form R || S (in lower-S form). func (privKey *PrivKey) Sign(msg []byte) ([]byte, error) { - priv, _ := secp256k1.PrivKeyFromBytes(secp256k1.S256(), privKey.Key[:]) + priv, _ := secp256k1.PrivKeyFromBytes(secp256k1.S256(), privKey.Key) sig, err := priv.Sign(crypto.Sha256(msg)) if err != nil { return nil, err diff --git a/proto/cosmos/crypto/multisig/v1/keys.proto b/proto/cosmos/crypto/multisig/v1/keys.proto index 605d5e85d98f..929e282870a4 100644 --- a/proto/cosmos/crypto/multisig/v1/keys.proto +++ b/proto/cosmos/crypto/multisig/v1/keys.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -package cosmos.crypto.v1; +package cosmos.crypto.multisig.v1; import "gogoproto/gogo.proto"; import "google/protobuf/any.proto"; From 54fb9a333a5f2d1714c9746cdefe00e8b71819f7 Mon Sep 17 00:00:00 2001 From: blushi Date: Fri, 11 Sep 2020 16:26:45 +0200 Subject: [PATCH 045/128] More linting --- crypto/keys/secp256k1/secp256k1_cgo.go | 2 +- crypto/keys/secp256k1/secp256k1_nocgo.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto/keys/secp256k1/secp256k1_cgo.go b/crypto/keys/secp256k1/secp256k1_cgo.go index 1596d5685dbf..0c028c68750a 100644 --- a/crypto/keys/secp256k1/secp256k1_cgo.go +++ b/crypto/keys/secp256k1/secp256k1_cgo.go @@ -20,5 +20,5 @@ func (privKey *PrivKey) Sign(msg []byte) ([]byte, error) { } func (pubKey *PrivKey) VerifySignature(msg []byte, sig []byte) bool { - return secp256k1.VerifySignature(pubKey.Key[:], crypto.Sha256(msg), sig) + return secp256k1.VerifySignature(pubKey.Key, crypto.Sha256(msg), sig) } diff --git a/crypto/keys/secp256k1/secp256k1_nocgo.go b/crypto/keys/secp256k1/secp256k1_nocgo.go index 6454cd3809f2..2d605447f421 100644 --- a/crypto/keys/secp256k1/secp256k1_nocgo.go +++ b/crypto/keys/secp256k1/secp256k1_nocgo.go @@ -34,7 +34,7 @@ func (pubKey *PubKey) VerifySignature(msg []byte, sigStr []byte) bool { if len(sigStr) != 64 { return false } - pub, err := secp256k1.ParsePubKey(pubKey.Key[:], secp256k1.S256()) + pub, err := secp256k1.ParsePubKey(pubKey.Key, secp256k1.S256()) if err != nil { return false } From 34ed4a0b78fd3490e84507f86f7c589a1cc5e6bf Mon Sep 17 00:00:00 2001 From: blushi Date: Sat, 12 Sep 2020 12:33:11 +0200 Subject: [PATCH 046/128] Revert tests keys values --- client/keys/add_ledger_test.go | 4 +-- client/keys/show_test.go | 4 +-- crypto/keyring/keyring_ledger_test.go | 8 ++--- crypto/keyring/types_test.go | 2 +- crypto/ledger/ledger_test.go | 48 +++++++++++++-------------- 5 files changed, 33 insertions(+), 33 deletions(-) diff --git a/client/keys/add_ledger_test.go b/client/keys/add_ledger_test.go index 8848022dd7f2..bd433b1330e3 100644 --- a/client/keys/add_ledger_test.go +++ b/client/keys/add_ledger_test.go @@ -72,7 +72,7 @@ func Test_runAddCmdLedgerWithCustomCoinType(t *testing.T) { require.Equal(t, "keyname1", key1.GetName()) require.Equal(t, keyring.TypeLedger, key1.GetType()) require.Equal(t, - "terrapub1addwnpc2yyps9rcdt20ag9sqrywdal02qhnh56xlhn3gvfquqxggqkungen86pcn2nzzw", + "terrapub1addwnpepqvpg7r26nl2pvqqern00m6s9uaax3hauu2rzg8qpjzq9hy6xve7sw0d84m6", sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, key1.GetPubKey())) config.SetCoinType(118) @@ -121,6 +121,6 @@ func Test_runAddCmdLedger(t *testing.T) { require.Equal(t, "keyname1", key1.GetName()) require.Equal(t, keyring.TypeLedger, key1.GetType()) require.Equal(t, - "cosmospub1addwnpc2yyp5lmuu6lzvvdvg6wcrl66jsxuayvkt5dxk70t34mjeyy0lhlslapcuuuc4e", + "cosmospub1addwnpepqd87l8xhcnrrtzxnkql7k55ph8fr9jarf4hn6udwukfprlalu8lgw0urza0", sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, key1.GetPubKey())) } diff --git a/client/keys/show_test.go b/client/keys/show_test.go index 51846deaaec1..a18644207973 100644 --- a/client/keys/show_test.go +++ b/client/keys/show_test.go @@ -24,8 +24,8 @@ func Test_multiSigKey_Properties(t *testing.T) { require.Equal(t, "myMultisig", tmp.GetName()) require.Equal(t, keyring.TypeMulti, tmp.GetType()) - require.Equal(t, "15C3EB7FAF7021D4FD21AEA021FEDFCB7304F184", tmp.GetPubKey().Address().String()) - require.Equal(t, "cosmos1zhp7kla0wqsaflfp46szrlkledesfuvyz3l5d0", sdk.MustBech32ifyAddressBytes("cosmos", tmp.GetAddress())) + require.Equal(t, "D3923267FA8A3DD367BB768FA8BDC8FF7F89DA3F", tmp.GetPubKey().Address().String()) + require.Equal(t, "cosmos16wfryel63g7axeamw68630wglalcnk3l0zuadc", sdk.MustBech32ifyAddressBytes("cosmos", tmp.GetAddress())) } func Test_showKeysCmd(t *testing.T) { diff --git a/crypto/keyring/keyring_ledger_test.go b/crypto/keyring/keyring_ledger_test.go index d52b664b7c63..dd193d9d5002 100644 --- a/crypto/keyring/keyring_ledger_test.go +++ b/crypto/keyring/keyring_ledger_test.go @@ -31,7 +31,7 @@ func TestInMemoryCreateLedger(t *testing.T) { pubKey := ledger.GetPubKey() pk, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, pubKey) require.NoError(t, err) - require.Equal(t, "cosmospub1addwnpc2yypkqtqvknvvqzqlaeu5hh5ku7u4lgt09dfg8dmy4srstppj0vk8yqss26rwu", pk) + require.Equal(t, "cosmospub1addwnpepqdszcr95mrqqs8lw099aa9h8h906zmet22pmwe9vquzcgvnm93eqygufdlv", pk) // Check that restoring the key gets the same results restoredKey, err := kb.Key("some_account") @@ -42,7 +42,7 @@ func TestInMemoryCreateLedger(t *testing.T) { pubKey = restoredKey.GetPubKey() pk, err = sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, pubKey) require.NoError(t, err) - require.Equal(t, "cosmospub1addwnpc2yypkqtqvknvvqzqlaeu5hh5ku7u4lgt09dfg8dmy4srstppj0vk8yqss26rwu", pk) + require.Equal(t, "cosmospub1addwnpepqdszcr95mrqqs8lw099aa9h8h906zmet22pmwe9vquzcgvnm93eqygufdlv", pk) path, err := restoredKey.GetPath() require.NoError(t, err) @@ -110,7 +110,7 @@ func TestAltKeyring_SaveLedgerKey(t *testing.T) { pubKey := ledger.GetPubKey() pk, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, pubKey) require.NoError(t, err) - require.Equal(t, "cosmospub1addwnpc2yypkqtqvknvvqzqlaeu5hh5ku7u4lgt09dfg8dmy4srstppj0vk8yqss26rwu", pk) + require.Equal(t, "cosmospub1addwnpepqdszcr95mrqqs8lw099aa9h8h906zmet22pmwe9vquzcgvnm93eqygufdlv", pk) // Check that restoring the key gets the same results restoredKey, err := keyring.Key("some_account") @@ -121,7 +121,7 @@ func TestAltKeyring_SaveLedgerKey(t *testing.T) { pubKey = restoredKey.GetPubKey() pk, err = sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, pubKey) require.NoError(t, err) - require.Equal(t, "cosmospub1addwnpc2yypkqtqvknvvqzqlaeu5hh5ku7u4lgt09dfg8dmy4srstppj0vk8yqss26rwu", pk) + require.Equal(t, "cosmospub1addwnpepqdszcr95mrqqs8lw099aa9h8h906zmet22pmwe9vquzcgvnm93eqygufdlv", pk) path, err := restoredKey.GetPath() require.NoError(t, err) diff --git a/crypto/keyring/types_test.go b/crypto/keyring/types_test.go index ef58c255bb52..ca99d9b7c55a 100644 --- a/crypto/keyring/types_test.go +++ b/crypto/keyring/types_test.go @@ -23,7 +23,7 @@ func Test_writeReadLedgerInfo(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "44'/118'/5'/0/1", path.String()) assert.Equal(t, - "cosmospub1addwnpc2yyp4445ppfrlqu648les6t7v0cxnk8qtwjmp5x42ykprgsphz50pgws4pntz5", + "cosmospub1addwnpepqddddqg2glc8x4fl7vxjlnr7p5a3czm5kcdp4239sg6yqdc4rc2r5wmxv8p", sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, lInfo.GetPubKey())) // Serialize and restore diff --git a/crypto/ledger/ledger_test.go b/crypto/ledger/ledger_test.go index c94a53a3de5b..9b21e464bcdb 100644 --- a/crypto/ledger/ledger_test.go +++ b/crypto/ledger/ledger_test.go @@ -28,13 +28,13 @@ func TestPublicKeyUnsafe(t *testing.T) { require.Nil(t, err, "%s", err) require.NotNil(t, priv) - require.Equal(t, "eb5ae9870a21034fef9cd7c4c63588d3b03feb5281b9d232cba34d6f3d71aee59211ffbfe1fe87", + require.Equal(t, "eb5ae98721034fef9cd7c4c63588d3b03feb5281b9d232cba34d6f3d71aee59211ffbfe1fe87", fmt.Sprintf("%x", cdc.Amino.MustMarshalBinaryBare(priv.PubKey())), "Is your device using test mnemonic: %s ?", testutil.TestMnemonic) pubKeyAddr, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, priv.PubKey()) require.NoError(t, err) - require.Equal(t, "cosmospub1addwnpc2yyp5lmuu6lzvvdvg6wcrl66jsxuayvkt5dxk70t34mjeyy0lhlslapcuuuc4e", + require.Equal(t, "cosmospub1addwnpepqd87l8xhcnrrtzxnkql7k55ph8fr9jarf4hn6udwukfprlalu8lgw0urza0", pubKeyAddr, "Is your device using test mnemonic: %s ?", testutil.TestMnemonic) addr := sdk.AccAddress(priv.PubKey().Address()).String() @@ -44,16 +44,16 @@ func TestPublicKeyUnsafe(t *testing.T) { func TestPublicKeyUnsafeHDPath(t *testing.T) { expectedAnswers := []string{ - "cosmospub1addwnpc2yyp5lmuu6lzvvdvg6wcrl66jsxuayvkt5dxk70t34mjeyy0lhlslapcuuuc4e", - "cosmospub1addwnpc2yypxp5zg0g7le6fz3mhz6rvr5s8kzv0429fxerjjqeh70ls7ffgfveswmjqjd", - "cosmospub1addwnpc2yyp6yecrj0gzk93dpmgx5zqyr6qds6lrdszkgv6j2n0hgcjy06mf4vce4r7kc", - "cosmospub1addwnpc2yypnyghuv9u4qamezej4gj5sws8gattr3gu35wu0jfslfg3xkwtvqssersfgs", - "cosmospub1addwnpc2yypl2a68xdyd0vq70te0y30rdwvdrqdujd0v3d2jehjex2mydhrmupq6s3ks3", - "cosmospub1addwnpc2yypz9vd9fp47pgk470zcv6lydczar00gekj758zvw75mcjxjlgn480qppwn5p", - "cosmospub1addwnpc2yyph0gwgymf6q09ya620cn02d0xt9wk972kqgxdp9rpflr5g78ljjks4aax42", - "cosmospub1addwnpc2yyp3kawgg3fexk4hd7xg6zm9vmplesgpe3w9n4cqp07fzqvkr6fs3kgfmf902", - "cosmospub1addwnpc2yypcjpdyysemr4nhej906d5xzsctn2zjj9cmqct0wvm9nuf3c0uqyggfn76lm", - "cosmospub1addwnpc2yypchelnfzgzmrpqhjydxg557nemsxfgg4ypyg3fmmx34hc606cgfzcr2rhhp", + "cosmospub1addwnpepqd87l8xhcnrrtzxnkql7k55ph8fr9jarf4hn6udwukfprlalu8lgw0urza0", + "cosmospub1addwnpepqfsdqjr68h7wjg5wacksmqaypasnra232fkgu5sxdlnlu8j22ztxvlqvd65", + "cosmospub1addwnpepqw3xwqun6q43vtgw6p4qspq7srvxhcmvq4jrx5j5ma6xy3r7k6dtxmrkh3d", + "cosmospub1addwnpepqvez9lrp09g8w7gkv42y4yr5p6826cu28ydrhrujv862yf4njmqyyjr4pjs", + "cosmospub1addwnpepq06hw3enfrtmq8n67teytcmtnrgcr0yntmyt25kdukfjkerdc7lqg32rcz7", + "cosmospub1addwnpepqg3trf2gd0s2940nckrxherwqhgmm6xd5h4pcnrh4x7y35h6yafmcpk5qns", + "cosmospub1addwnpepqdm6rjpx6wsref8wjn7ym6ntejet430j4szpngfgc20caz83lu545vuv8hp", + "cosmospub1addwnpepqvdhtjzy2wf44dm03jxsketxc07vzqwvt3vawqqtljgsr9s7jvydjmt66ew", + "cosmospub1addwnpepqwystfpyxwcava7v3t7ndps5xzu6s553wxcxzmmnxevlzvwrlqpzz695nw9", + "cosmospub1addwnpepqw970u6gjqkccg9u3rfj99857wupj2z9fqfzy2w7e5dd7xn7kzzgkgqch0r", } const numIters = 10 @@ -106,13 +106,13 @@ func TestPublicKeySafe(t *testing.T) { require.Nil(t, ShowAddress(path, priv.PubKey(), sdk.GetConfig().GetBech32AccountAddrPrefix())) - require.Equal(t, "eb5ae9870a21034fef9cd7c4c63588d3b03feb5281b9d232cba34d6f3d71aee59211ffbfe1fe87", + require.Equal(t, "eb5ae98721034fef9cd7c4c63588d3b03feb5281b9d232cba34d6f3d71aee59211ffbfe1fe87", fmt.Sprintf("%x", cdc.Amino.MustMarshalBinaryBare(priv.PubKey())), "Is your device using test mnemonic: %s ?", testutil.TestMnemonic) pubKeyAddr, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, priv.PubKey()) require.NoError(t, err) - require.Equal(t, "cosmospub1addwnpc2yyp5lmuu6lzvvdvg6wcrl66jsxuayvkt5dxk70t34mjeyy0lhlslapcuuuc4e", + require.Equal(t, "cosmospub1addwnpepqd87l8xhcnrrtzxnkql7k55ph8fr9jarf4hn6udwukfprlalu8lgw0urza0", pubKeyAddr, "Is your device using test mnemonic: %s ?", testutil.TestMnemonic) require.Equal(t, "cosmos1w34k53py5v5xyluazqpq65agyajavep2rflq6h", @@ -124,16 +124,16 @@ func TestPublicKeySafe(t *testing.T) { func TestPublicKeyHDPath(t *testing.T) { expectedPubKeys := []string{ - "cosmospub1addwnpc2yyp5lmuu6lzvvdvg6wcrl66jsxuayvkt5dxk70t34mjeyy0lhlslapcuuuc4e", - "cosmospub1addwnpc2yypxp5zg0g7le6fz3mhz6rvr5s8kzv0429fxerjjqeh70ls7ffgfveswmjqjd", - "cosmospub1addwnpc2yyp6yecrj0gzk93dpmgx5zqyr6qds6lrdszkgv6j2n0hgcjy06mf4vce4r7kc", - "cosmospub1addwnpc2yypnyghuv9u4qamezej4gj5sws8gattr3gu35wu0jfslfg3xkwtvqssersfgs", - "cosmospub1addwnpc2yypl2a68xdyd0vq70te0y30rdwvdrqdujd0v3d2jehjex2mydhrmupq6s3ks3", - "cosmospub1addwnpc2yypz9vd9fp47pgk470zcv6lydczar00gekj758zvw75mcjxjlgn480qppwn5p", - "cosmospub1addwnpc2yyph0gwgymf6q09ya620cn02d0xt9wk972kqgxdp9rpflr5g78ljjks4aax42", - "cosmospub1addwnpc2yyp3kawgg3fexk4hd7xg6zm9vmplesgpe3w9n4cqp07fzqvkr6fs3kgfmf902", - "cosmospub1addwnpc2yypcjpdyysemr4nhej906d5xzsctn2zjj9cmqct0wvm9nuf3c0uqyggfn76lm", - "cosmospub1addwnpc2yypchelnfzgzmrpqhjydxg557nemsxfgg4ypyg3fmmx34hc606cgfzcr2rhhp", + "cosmospub1addwnpepqd87l8xhcnrrtzxnkql7k55ph8fr9jarf4hn6udwukfprlalu8lgw0urza0", + "cosmospub1addwnpepqfsdqjr68h7wjg5wacksmqaypasnra232fkgu5sxdlnlu8j22ztxvlqvd65", + "cosmospub1addwnpepqw3xwqun6q43vtgw6p4qspq7srvxhcmvq4jrx5j5ma6xy3r7k6dtxmrkh3d", + "cosmospub1addwnpepqvez9lrp09g8w7gkv42y4yr5p6826cu28ydrhrujv862yf4njmqyyjr4pjs", + "cosmospub1addwnpepq06hw3enfrtmq8n67teytcmtnrgcr0yntmyt25kdukfjkerdc7lqg32rcz7", + "cosmospub1addwnpepqg3trf2gd0s2940nckrxherwqhgmm6xd5h4pcnrh4x7y35h6yafmcpk5qns", + "cosmospub1addwnpepqdm6rjpx6wsref8wjn7ym6ntejet430j4szpngfgc20caz83lu545vuv8hp", + "cosmospub1addwnpepqvdhtjzy2wf44dm03jxsketxc07vzqwvt3vawqqtljgsr9s7jvydjmt66ew", + "cosmospub1addwnpepqwystfpyxwcava7v3t7ndps5xzu6s553wxcxzmmnxevlzvwrlqpzz695nw9", + "cosmospub1addwnpepqw970u6gjqkccg9u3rfj99857wupj2z9fqfzy2w7e5dd7xn7kzzgkgqch0r", } expectedAddrs := []string{ From 34e3f89ba4bc4740de3f7f275b3d470125dc4a8c Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 14 Sep 2020 11:56:06 +0200 Subject: [PATCH 047/128] Add Amino overrides to proto keys --- codec/codec.go | 9 +++++ crypto/keys/secp256k1/secp256k1.go | 51 +++++++++++++++++++++++++ crypto/keys/secp256k1/secp256k1_test.go | 47 +++++++++++++++++++++++ 3 files changed, 107 insertions(+) diff --git a/codec/codec.go b/codec/codec.go index a0bf5a598b9d..1cbc78b7fc0e 100644 --- a/codec/codec.go +++ b/codec/codec.go @@ -54,4 +54,13 @@ type ( Size() int Unmarshal(data []byte) error } + + // AminoMarshaler defines an interface where Amino marshalling can be + // overridden by custom marshalling. + AminoMarshaler interface { + MarshalAmino() ([]byte, error) + UnmarshalAmino([]byte) error + MarshalAminoJSON() ([]byte, error) + UnmarshalAminoJSON([]byte) error + } ) diff --git a/crypto/keys/secp256k1/secp256k1.go b/crypto/keys/secp256k1/secp256k1.go index 6c046be2591c..1451376c0aa9 100644 --- a/crypto/keys/secp256k1/secp256k1.go +++ b/crypto/keys/secp256k1/secp256k1.go @@ -9,6 +9,7 @@ import ( "math/big" secp256k1 "github.com/btcsuite/btcd/btcec" + "github.com/cosmos/cosmos-sdk/codec" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "golang.org/x/crypto/ripemd160" // nolint: staticcheck // necessary for Bitcoin address format @@ -16,6 +17,7 @@ import ( ) var _ cryptotypes.PrivKey = &PrivKey{} +var _ codec.AminoMarshaler = &PrivKey{} const ( PrivKeySize = 32 @@ -47,6 +49,30 @@ func (privKey *PrivKey) Type() string { return keyType } +// MarshalAmino overrides Amino binary marshalling. +func (privKey PrivKey) MarshalAmino() ([]byte, error) { + return privKey.Key, nil +} + +// UnmarshalAmino overrides Amino binary marshalling. +func (privKey *PrivKey) UnmarshalAmino(bz []byte) error { + *privKey = PrivKey{ + Key: bz, + } + + return nil +} + +// MarshalAminoJSON overrides Amino JSON marshalling. +func (privKey PrivKey) MarshalAminoJSON() ([]byte, error) { + return privKey.MarshalAmino() +} + +// UnmarshalAminoJSON overrides Amino JSON marshalling. +func (privKey *PrivKey) UnmarshalAminoJSON(bz []byte) error { + return privKey.UnmarshalAmino(bz) +} + // GenPrivKey generates a new ECDSA private key on curve secp256k1 private key. // It uses OS randomness to generate the private key. func GenPrivKey() *PrivKey { @@ -109,6 +135,7 @@ func GenPrivKeyFromSecret(secret []byte) *PrivKey { //------------------------------------- var _ cryptotypes.PubKey = &PubKey{} +var _ codec.AminoMarshaler = &PubKey{} // PubKeySize is comprised of 32 bytes for one field element // (the x-coordinate), plus one byte for the parity of the y-coordinate. @@ -145,3 +172,27 @@ func (pubKey *PubKey) Type() string { func (pubKey *PubKey) Equals(other crypto.PubKey) bool { return pubKey.Type() == other.Type() && bytes.Equal(pubKey.Bytes(), other.Bytes()) } + +// MarshalAmino overrides Amino binary marshalling. +func (pubKey *PubKey) MarshalAmino() ([]byte, error) { + return pubKey.Key, nil +} + +// UnmarshalAmino overrides Amino binary marshalling. +func (pubKey *PubKey) UnmarshalAmino(bz []byte) error { + *pubKey = PubKey{ + Key: bz, + } + + return nil +} + +// MarshalAminoJSON overrides Amino JSON marshalling. +func (pubKey *PubKey) MarshalAminoJSON() ([]byte, error) { + return pubKey.MarshalAmino() +} + +// UnmarshalAminoJSON overrides Amino JSON marshalling. +func (pubKey *PubKey) UnmarshalAminoJSON(bz []byte) error { + return pubKey.UnmarshalAmino(bz) +} diff --git a/crypto/keys/secp256k1/secp256k1_test.go b/crypto/keys/secp256k1/secp256k1_test.go index 31237a37f991..d6290019a98d 100644 --- a/crypto/keys/secp256k1/secp256k1_test.go +++ b/crypto/keys/secp256k1/secp256k1_test.go @@ -1,6 +1,7 @@ package secp256k1_test import ( + "encoding/base64" "encoding/hex" "math/big" "testing" @@ -14,6 +15,7 @@ import ( underlyingSecp256k1 "github.com/btcsuite/btcd/btcec" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" ) @@ -194,3 +196,48 @@ func TestPrivKeyEquals(t *testing.T) { }) } } + +func TestMarshalAmino(t *testing.T) { + aminoCdc := codec.NewLegacyAmino() + privKey := secp256k1.GenPrivKey() + + testCases := []struct { + desc string + msg codec.AminoMarshaler + expBinary []byte + expJSON string + }{ + { + "secp256k1 private key", + privKey, + append([]byte{32}, privKey.Bytes()...), // Length-prefixed. + "\"" + base64.StdEncoding.EncodeToString(privKey.Bytes()) + "\"", + }, + } + + for _, tc := range testCases { + t.Run(tc.desc, func(t *testing.T) { + // Do a round trip of encoding/decoding binary. + bz, err := aminoCdc.MarshalBinaryBare(tc.msg) + require.NoError(t, err) + require.Equal(t, tc.expBinary, bz) + + newMsg := new(secp256k1.PrivKey) + err = aminoCdc.UnmarshalBinaryBare(bz, newMsg) + require.NoError(t, err) + + require.Equal(t, tc.msg, newMsg) + + // Do a round trip of encoding/decoding JSON. + bz, err = aminoCdc.MarshalJSON(tc.msg) + require.NoError(t, err) + require.Equal(t, tc.expJSON, string(bz)) + + newMsg = new(secp256k1.PrivKey) + err = aminoCdc.UnmarshalJSON(bz, newMsg) + require.NoError(t, err) + + require.Equal(t, tc.msg, newMsg) + }) + } +} From ddd1a72cdf8fc286b543401588086c1ae3b5b962 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 14 Sep 2020 12:03:47 +0200 Subject: [PATCH 048/128] Add pubkey test --- crypto/keys/secp256k1/secp256k1_test.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/crypto/keys/secp256k1/secp256k1_test.go b/crypto/keys/secp256k1/secp256k1_test.go index d6290019a98d..9b54e017800e 100644 --- a/crypto/keys/secp256k1/secp256k1_test.go +++ b/crypto/keys/secp256k1/secp256k1_test.go @@ -200,19 +200,29 @@ func TestPrivKeyEquals(t *testing.T) { func TestMarshalAmino(t *testing.T) { aminoCdc := codec.NewLegacyAmino() privKey := secp256k1.GenPrivKey() + pubKey := privKey.PubKey().(*secp256k1.PubKey) testCases := []struct { desc string msg codec.AminoMarshaler + typ interface{} expBinary []byte expJSON string }{ { "secp256k1 private key", privKey, + &secp256k1.PrivKey{}, append([]byte{32}, privKey.Bytes()...), // Length-prefixed. "\"" + base64.StdEncoding.EncodeToString(privKey.Bytes()) + "\"", }, + { + "secp256k1 public key", + pubKey, + &secp256k1.PubKey{}, + append([]byte{0xa, 0x21}, pubKey.Bytes()...), // Length-prefixed. + "\"" + base64.StdEncoding.EncodeToString(pubKey.Bytes()) + "\"", + }, } for _, tc := range testCases { @@ -222,22 +232,20 @@ func TestMarshalAmino(t *testing.T) { require.NoError(t, err) require.Equal(t, tc.expBinary, bz) - newMsg := new(secp256k1.PrivKey) - err = aminoCdc.UnmarshalBinaryBare(bz, newMsg) + err = aminoCdc.UnmarshalBinaryBare(bz, tc.typ) require.NoError(t, err) - require.Equal(t, tc.msg, newMsg) + require.Equal(t, tc.msg, tc.typ) // Do a round trip of encoding/decoding JSON. bz, err = aminoCdc.MarshalJSON(tc.msg) require.NoError(t, err) require.Equal(t, tc.expJSON, string(bz)) - newMsg = new(secp256k1.PrivKey) - err = aminoCdc.UnmarshalJSON(bz, newMsg) + err = aminoCdc.UnmarshalJSON(bz, tc.typ) require.NoError(t, err) - require.Equal(t, tc.msg, newMsg) + require.Equal(t, tc.msg, tc.typ) }) } } From 935c51b24405b312c3220470290a085d7f2c24f5 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 14 Sep 2020 12:15:01 +0200 Subject: [PATCH 049/128] Fix tests --- crypto/keys/secp256k1/secp256k1.go | 4 ++-- crypto/keys/secp256k1/secp256k1_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crypto/keys/secp256k1/secp256k1.go b/crypto/keys/secp256k1/secp256k1.go index 1451376c0aa9..db03b2740f00 100644 --- a/crypto/keys/secp256k1/secp256k1.go +++ b/crypto/keys/secp256k1/secp256k1.go @@ -174,7 +174,7 @@ func (pubKey *PubKey) Equals(other crypto.PubKey) bool { } // MarshalAmino overrides Amino binary marshalling. -func (pubKey *PubKey) MarshalAmino() ([]byte, error) { +func (pubKey PubKey) MarshalAmino() ([]byte, error) { return pubKey.Key, nil } @@ -188,7 +188,7 @@ func (pubKey *PubKey) UnmarshalAmino(bz []byte) error { } // MarshalAminoJSON overrides Amino JSON marshalling. -func (pubKey *PubKey) MarshalAminoJSON() ([]byte, error) { +func (pubKey PubKey) MarshalAminoJSON() ([]byte, error) { return pubKey.MarshalAmino() } diff --git a/crypto/keys/secp256k1/secp256k1_test.go b/crypto/keys/secp256k1/secp256k1_test.go index 9b54e017800e..e4ac58111996 100644 --- a/crypto/keys/secp256k1/secp256k1_test.go +++ b/crypto/keys/secp256k1/secp256k1_test.go @@ -220,7 +220,7 @@ func TestMarshalAmino(t *testing.T) { "secp256k1 public key", pubKey, &secp256k1.PubKey{}, - append([]byte{0xa, 0x21}, pubKey.Bytes()...), // Length-prefixed. + append([]byte{33}, pubKey.Bytes()...), // Length-prefixed. "\"" + base64.StdEncoding.EncodeToString(pubKey.Bytes()) + "\"", }, } From f31d62579c0f8877e1f115e20bcde57dc5229deb Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 14 Sep 2020 12:30:40 +0200 Subject: [PATCH 050/128] Use threshold isntead of K --- crypto/keys/multisig/keys.pb.go | 44 +++++++++---------- crypto/keys/multisig/multisig.go | 8 ++-- crypto/keys/multisig/multisig_test.go | 20 ++++----- crypto/keys/secp256k1/secp256k1.go | 4 ++ .../types/multisig/threshold_pubkey_test.go | 2 +- proto/cosmos/crypto/multisig/v1/keys.proto | 2 +- 6 files changed, 42 insertions(+), 38 deletions(-) diff --git a/crypto/keys/multisig/keys.pb.go b/crypto/keys/multisig/keys.pb.go index d9be3297c224..9e63e67a93ba 100644 --- a/crypto/keys/multisig/keys.pb.go +++ b/crypto/keys/multisig/keys.pb.go @@ -28,8 +28,8 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // which nests multiple public keys and a threshold, // it uses legacy amino address rules type LegacyAminoMultisigThresholdPubKey struct { - K uint32 `protobuf:"varint,1,opt,name=threshold,proto3" json:"threshold,omitempty" yaml:"threshold"` - PubKeys []*types.Any `protobuf:"bytes,2,rep,name=public_keys,json=publicKeys,proto3" json:"public_keys,omitempty" yaml:"pubkeys"` + Threshold uint32 `protobuf:"varint,1,opt,name=threshold,proto3" json:"threshold,omitempty" yaml:"threshold"` + PubKeys []*types.Any `protobuf:"bytes,2,rep,name=public_keys,json=publicKeys,proto3" json:"public_keys,omitempty" yaml:"pubkeys"` } func (m *LegacyAminoMultisigThresholdPubKey) Reset() { *m = LegacyAminoMultisigThresholdPubKey{} } @@ -74,26 +74,26 @@ func init() { } var fileDescriptor_7090cf2b1c5dca0f = []byte{ - // 304 bytes of a gzipped FileDescriptorProto + // 299 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x49, 0xce, 0x2f, 0xce, 0xcd, 0x2f, 0xd6, 0x4f, 0x2e, 0xaa, 0x2c, 0x28, 0xc9, 0xd7, 0xcf, 0x2d, 0xcd, 0x29, 0xc9, 0x2c, 0xce, 0x4c, 0xd7, 0x2f, 0x33, 0xd4, 0xcf, 0x4e, 0xad, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x84, 0xa8, 0xd2, 0x83, 0xa8, 0xd2, 0x83, 0xa9, 0xd2, 0x2b, 0x33, 0x94, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0xab, 0xd2, 0x07, 0xb1, 0x20, 0x1a, 0xa4, 0x24, 0xd3, 0xf3, 0xf3, 0xd3, - 0x73, 0x52, 0xf5, 0xc1, 0xbc, 0xa4, 0xd2, 0x34, 0xfd, 0xc4, 0xbc, 0x4a, 0x88, 0x94, 0xd2, 0x4e, + 0x73, 0x52, 0xf5, 0xc1, 0xbc, 0xa4, 0xd2, 0x34, 0xfd, 0xc4, 0xbc, 0x4a, 0x88, 0x94, 0xd2, 0x16, 0x46, 0x2e, 0x25, 0x9f, 0xd4, 0xf4, 0xc4, 0xe4, 0x4a, 0xc7, 0xdc, 0xcc, 0xbc, 0x7c, 0x5f, 0xa8, 0x59, 0x21, 0x19, 0x45, 0xa9, 0xc5, 0x19, 0xf9, 0x39, 0x29, 0x01, 0xa5, 0x49, 0xde, 0xa9, 0x95, - 0x42, 0xe6, 0x5c, 0x9c, 0x25, 0x30, 0x21, 0x09, 0x46, 0x05, 0x46, 0x0d, 0x5e, 0x27, 0xc9, 0x47, - 0xf7, 0xe4, 0x19, 0xbd, 0x3f, 0xdd, 0x93, 0x17, 0xa8, 0x4c, 0xcc, 0xcd, 0xb1, 0x52, 0x82, 0xcb, - 0x2b, 0x05, 0x21, 0xd4, 0x0a, 0x85, 0x70, 0x71, 0x17, 0x94, 0x26, 0xe5, 0x64, 0x26, 0xc7, 0x83, - 0x3c, 0x20, 0xc1, 0xa4, 0xc0, 0xac, 0xc1, 0x6d, 0x24, 0xa2, 0x07, 0x71, 0x90, 0x1e, 0xcc, 0x41, - 0x7a, 0x8e, 0x79, 0x95, 0x4e, 0xb2, 0x8f, 0xee, 0xc9, 0xb3, 0x43, 0xec, 0x2b, 0xfe, 0x74, 0x4f, - 0x9e, 0x0f, 0x62, 0x6c, 0x41, 0x69, 0x12, 0x48, 0xa7, 0x52, 0x10, 0x17, 0xc4, 0x1c, 0x90, 0xac, - 0x15, 0x4b, 0xc7, 0x02, 0x79, 0x06, 0x27, 0xef, 0x13, 0x8f, 0xe4, 0x18, 0x2f, 0x3c, 0x92, 0x63, - 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, 0x0b, 0x8f, 0xe5, 0x18, 0x6e, 0x3c, 0x96, - 0x63, 0x88, 0x32, 0x4c, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x87, 0x05, - 0x29, 0x98, 0xd2, 0x2d, 0x4e, 0xc9, 0x86, 0x85, 0x2e, 0xc8, 0x58, 0x78, 0x10, 0x27, 0xb1, 0x81, - 0xdd, 0x62, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0xbb, 0xd6, 0x98, 0x75, 0x83, 0x01, 0x00, 0x00, + 0x42, 0x46, 0x5c, 0x9c, 0x25, 0x30, 0x21, 0x09, 0x46, 0x05, 0x46, 0x0d, 0x5e, 0x27, 0x91, 0x4f, + 0xf7, 0xe4, 0x05, 0x2a, 0x13, 0x73, 0x73, 0xac, 0x94, 0xe0, 0x52, 0x4a, 0x41, 0x08, 0x65, 0x42, + 0x21, 0x5c, 0xdc, 0x05, 0xa5, 0x49, 0x39, 0x99, 0xc9, 0xf1, 0x20, 0xb7, 0x4b, 0x30, 0x29, 0x30, + 0x6b, 0x70, 0x1b, 0x89, 0xe8, 0x41, 0xdc, 0xa2, 0x07, 0x73, 0x8b, 0x9e, 0x63, 0x5e, 0xa5, 0x93, + 0xec, 0xa3, 0x7b, 0xf2, 0xec, 0x10, 0xab, 0x8a, 0x3f, 0xdd, 0x93, 0xe7, 0x83, 0x18, 0x5b, 0x50, + 0x9a, 0x04, 0xd2, 0xa9, 0x14, 0xc4, 0x05, 0x31, 0x07, 0x24, 0x6b, 0xc5, 0xd2, 0xb1, 0x40, 0x9e, + 0xc1, 0xc9, 0xfb, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, + 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0x0c, 0xd3, 0x33, + 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xf5, 0x61, 0xa1, 0x09, 0xa6, 0x74, 0x8b, 0x53, + 0xb2, 0x61, 0x01, 0x0b, 0x32, 0x16, 0x1e, 0xba, 0x49, 0x6c, 0x60, 0xb7, 0x18, 0x03, 0x02, 0x00, + 0x00, 0xff, 0xff, 0x5f, 0x5f, 0x0b, 0x42, 0x7e, 0x01, 0x00, 0x00, } func (m *LegacyAminoMultisigThresholdPubKey) Marshal() (dAtA []byte, err error) { @@ -130,8 +130,8 @@ func (m *LegacyAminoMultisigThresholdPubKey) MarshalToSizedBuffer(dAtA []byte) ( dAtA[i] = 0x12 } } - if m.K != 0 { - i = encodeVarintKeys(dAtA, i, uint64(m.K)) + if m.Threshold != 0 { + i = encodeVarintKeys(dAtA, i, uint64(m.Threshold)) i-- dAtA[i] = 0x8 } @@ -155,8 +155,8 @@ func (m *LegacyAminoMultisigThresholdPubKey) Size() (n int) { } var l int _ = l - if m.K != 0 { - n += 1 + sovKeys(uint64(m.K)) + if m.Threshold != 0 { + n += 1 + sovKeys(uint64(m.Threshold)) } if len(m.PubKeys) > 0 { for _, e := range m.PubKeys { @@ -204,9 +204,9 @@ func (m *LegacyAminoMultisigThresholdPubKey) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field K", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Threshold", wireType) } - m.K = 0 + m.Threshold = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowKeys @@ -216,7 +216,7 @@ func (m *LegacyAminoMultisigThresholdPubKey) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.K |= uint32(b&0x7F) << shift + m.Threshold |= uint32(b&0x7F) << shift if b < 0x80 { break } diff --git a/crypto/keys/multisig/multisig.go b/crypto/keys/multisig/multisig.go index 8b1d2655b441..6a302e9899fe 100644 --- a/crypto/keys/multisig/multisig.go +++ b/crypto/keys/multisig/multisig.go @@ -38,12 +38,12 @@ func (m *LegacyAminoMultisigThresholdPubKey) VerifyMultisignature(getSignBytes m return fmt.Errorf("bit array size is incorrect %d", len(pubKeys)) } // ensure size of signature list - if len(sigs) < int(m.K) || len(sigs) > size { + if len(sigs) < int(m.Threshold) || len(sigs) > size { return fmt.Errorf("signature size is incorrect %d", len(sigs)) } // ensure at least k signatures are set - if bitarray.NumTrueBitsBefore(size) < int(m.K) { - return fmt.Errorf("minimum number of signatures not set, have %d, expected %d", bitarray.NumTrueBitsBefore(size), int(m.K)) + if bitarray.NumTrueBitsBefore(size) < int(m.Threshold) { + return fmt.Errorf("minimum number of signatures not set, have %d, expected %d", bitarray.NumTrueBitsBefore(size), int(m.Threshold)) } // index in the list of signatures which we are concerned with. sigIndex := 0 @@ -119,7 +119,7 @@ func (m *LegacyAminoMultisigThresholdPubKey) Equals(key tmcrypto.PubKey) bool { // GetThreshold implements the PubKey.GetThreshold method func (m *LegacyAminoMultisigThresholdPubKey) GetThreshold() uint { - return uint(m.K) + return uint(m.Threshold) } // Type returns multisig type diff --git a/crypto/keys/multisig/multisig_test.go b/crypto/keys/multisig/multisig_test.go index cec65791a211..690f1cf79aa4 100644 --- a/crypto/keys/multisig/multisig_test.go +++ b/crypto/keys/multisig/multisig_test.go @@ -19,7 +19,7 @@ func TestAddress(t *testing.T) { pubKeys, _ := generatePubKeysAndSignatures(5, msg) anyPubKeys, err := packPubKeys(pubKeys) require.NoError(t, err) - multisigKey := &LegacyAminoMultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys} + multisigKey := &LegacyAminoMultisigThresholdPubKey{Threshold: 2, PubKeys: anyPubKeys} require.Len(t, multisigKey.Address().Bytes(), 20) } @@ -30,11 +30,11 @@ func TestEquals(t *testing.T) { anyPubKeys, err := packPubKeys([]tmcrypto.PubKey{pubKey1, pubKey2}) require.NoError(t, err) - multisigKey := &LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys} + multisigKey := &LegacyAminoMultisigThresholdPubKey{Threshold: 1, PubKeys: anyPubKeys} otherPubKeys, err := packPubKeys([]tmcrypto.PubKey{pubKey1, multisigKey}) require.NoError(t, err) - otherMultisigKey := LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: otherPubKeys} + otherMultisigKey := LegacyAminoMultisigThresholdPubKey{Threshold: 1, PubKeys: otherPubKeys} testCases := []struct { msg string @@ -43,17 +43,17 @@ func TestEquals(t *testing.T) { }{ { "equals with proto pub key", - &LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: anyPubKeys}, + &LegacyAminoMultisigThresholdPubKey{Threshold: 1, PubKeys: anyPubKeys}, true, }, { "different threshold", - &LegacyAminoMultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys}, + &LegacyAminoMultisigThresholdPubKey{Threshold: 2, PubKeys: anyPubKeys}, false, }, { "different pub keys length", - &LegacyAminoMultisigThresholdPubKey{K: 1, PubKeys: []*types.Any{anyPubKeys[0]}}, + &LegacyAminoMultisigThresholdPubKey{Threshold: 1, PubKeys: []*types.Any{anyPubKeys[0]}}, false, }, { @@ -105,7 +105,7 @@ func TestVerifyMultisignature(t *testing.T) { pubKeys, _ := generatePubKeysAndSignatures(3, msg) anyPubKeys, err := packPubKeys(pubKeys) require.NoError(t, err) - pk = &LegacyAminoMultisigThresholdPubKey{K: 3, PubKeys: anyPubKeys} + pk = &LegacyAminoMultisigThresholdPubKey{Threshold: 3, PubKeys: anyPubKeys} sig = multisig.NewMultisig(1) }, false, @@ -118,7 +118,7 @@ func TestVerifyMultisignature(t *testing.T) { pubKeys, sigs := generatePubKeysAndSignatures(5, msg) anyPubKeys, err := packPubKeys(pubKeys) require.NoError(t, err) - pk = &LegacyAminoMultisigThresholdPubKey{K: uint32(k), PubKeys: anyPubKeys} + pk = &LegacyAminoMultisigThresholdPubKey{Threshold: uint32(k), PubKeys: anyPubKeys} sig = multisig.NewMultisig(len(pubKeys)) signBytesFn := func(mode signing.SignMode) ([]byte, error) { return msg, nil } @@ -203,14 +203,14 @@ func generateNestedMultiSignature(n int, msg []byte) (multisig.PubKey, *signing. if err != nil { return nil, nil, err } - pubKeys[i] = &LegacyAminoMultisigThresholdPubKey{K: 5, PubKeys: anyNestedPks} + pubKeys[i] = &LegacyAminoMultisigThresholdPubKey{Threshold: 5, PubKeys: anyNestedPks} bitArray.SetIndex(i, true) } anyPubKeys, err := packPubKeys(pubKeys) if err != nil { return nil, nil, err } - return &LegacyAminoMultisigThresholdPubKey{K: uint32(n), PubKeys: anyPubKeys}, &signing.MultiSignatureData{ + return &LegacyAminoMultisigThresholdPubKey{Threshold: uint32(n), PubKeys: anyPubKeys}, &signing.MultiSignatureData{ BitArray: bitArray, Signatures: signatures, }, nil diff --git a/crypto/keys/secp256k1/secp256k1.go b/crypto/keys/secp256k1/secp256k1.go index db03b2740f00..a19b6c830d4e 100644 --- a/crypto/keys/secp256k1/secp256k1.go +++ b/crypto/keys/secp256k1/secp256k1.go @@ -65,6 +65,8 @@ func (privKey *PrivKey) UnmarshalAmino(bz []byte) error { // MarshalAminoJSON overrides Amino JSON marshalling. func (privKey PrivKey) MarshalAminoJSON() ([]byte, error) { + // When we marshal to Amino JSON, we don't marshal the "key" field itself, + // just its contents (i.e. the key bytes). return privKey.MarshalAmino() } @@ -189,6 +191,8 @@ func (pubKey *PubKey) UnmarshalAmino(bz []byte) error { // MarshalAminoJSON overrides Amino JSON marshalling. func (pubKey PubKey) MarshalAminoJSON() ([]byte, error) { + // When we marshal to Amino JSON, we don't marshal the "key" field itself, + // just its contents (i.e. the key bytes). return pubKey.MarshalAmino() } diff --git a/crypto/types/multisig/threshold_pubkey_test.go b/crypto/types/multisig/threshold_pubkey_test.go index 65cd161d1f0f..023a3148c983 100644 --- a/crypto/types/multisig/threshold_pubkey_test.go +++ b/crypto/types/multisig/threshold_pubkey_test.go @@ -176,7 +176,7 @@ func TestMultiSigPubKeyEquality(t *testing.T) { require.NoError(t, err) anyPubKeys[i] = any } - other = &kmultisig.LegacyAminoMultisigThresholdPubKey{K: 2, PubKeys: anyPubKeys} + other = &kmultisig.LegacyAminoMultisigThresholdPubKey{Threshold: 2, PubKeys: anyPubKeys} }, true, }, diff --git a/proto/cosmos/crypto/multisig/v1/keys.proto b/proto/cosmos/crypto/multisig/v1/keys.proto index 929e282870a4..308b9771e235 100644 --- a/proto/cosmos/crypto/multisig/v1/keys.proto +++ b/proto/cosmos/crypto/multisig/v1/keys.proto @@ -12,6 +12,6 @@ option go_package = "github.com/cosmos/cosmos-sdk/crypto/keys/multisig"; message LegacyAminoMultisigThresholdPubKey { option (gogoproto.goproto_getters) = false; - uint32 threshold = 1 [(gogoproto.customname) = "K", (gogoproto.moretags) = "yaml:\"threshold\""]; + uint32 threshold = 1 [(gogoproto.moretags) = "yaml:\"threshold\""]; repeated google.protobuf.Any public_keys = 2 [(gogoproto.customname) = "PubKeys", (gogoproto.moretags) = "yaml:\"pubkeys\""]; } \ No newline at end of file From 4114ce9a001619289ee473b01b34de57e498032a Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 14 Sep 2020 15:38:57 +0200 Subject: [PATCH 051/128] Standardize Type --- crypto/keys/multisig/multisig.go | 2 +- crypto/keys/secp256k1/secp256k1.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crypto/keys/multisig/multisig.go b/crypto/keys/multisig/multisig.go index 6a302e9899fe..a70c1b250a9c 100644 --- a/crypto/keys/multisig/multisig.go +++ b/crypto/keys/multisig/multisig.go @@ -124,5 +124,5 @@ func (m *LegacyAminoMultisigThresholdPubKey) GetThreshold() uint { // Type returns multisig type func (m *LegacyAminoMultisigThresholdPubKey) Type() string { - return "PubKeyMultisigThreshold" + return "cosmos/LegacyAminoMultisigThresholdPubKey" } diff --git a/crypto/keys/secp256k1/secp256k1.go b/crypto/keys/secp256k1/secp256k1.go index a19b6c830d4e..2becb7a9f9a4 100644 --- a/crypto/keys/secp256k1/secp256k1.go +++ b/crypto/keys/secp256k1/secp256k1.go @@ -22,8 +22,8 @@ var _ codec.AminoMarshaler = &PrivKey{} const ( PrivKeySize = 32 keyType = "secp256k1" - PrivKeyName = "tendermint/PrivKeySecp256k1" - PubKeyName = "tendermint/PubKeySecp256k1" + PrivKeyName = "cosmos/Secp256k1PrivKey" + PubKeyName = "cosmos/Secp256k1PubKey" ) // Bytes returns the byte representation of the Private Key. From af415fcbbb8e98a6edc68b366a69a5af68e409b0 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 14 Sep 2020 15:58:31 +0200 Subject: [PATCH 052/128] Revert standardize types commit --- crypto/keys/multisig/multisig.go | 2 +- crypto/keys/secp256k1/secp256k1.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crypto/keys/multisig/multisig.go b/crypto/keys/multisig/multisig.go index a70c1b250a9c..6a302e9899fe 100644 --- a/crypto/keys/multisig/multisig.go +++ b/crypto/keys/multisig/multisig.go @@ -124,5 +124,5 @@ func (m *LegacyAminoMultisigThresholdPubKey) GetThreshold() uint { // Type returns multisig type func (m *LegacyAminoMultisigThresholdPubKey) Type() string { - return "cosmos/LegacyAminoMultisigThresholdPubKey" + return "PubKeyMultisigThreshold" } diff --git a/crypto/keys/secp256k1/secp256k1.go b/crypto/keys/secp256k1/secp256k1.go index 2becb7a9f9a4..a19b6c830d4e 100644 --- a/crypto/keys/secp256k1/secp256k1.go +++ b/crypto/keys/secp256k1/secp256k1.go @@ -22,8 +22,8 @@ var _ codec.AminoMarshaler = &PrivKey{} const ( PrivKeySize = 32 keyType = "secp256k1" - PrivKeyName = "cosmos/Secp256k1PrivKey" - PubKeyName = "cosmos/Secp256k1PubKey" + PrivKeyName = "tendermint/PrivKeySecp256k1" + PubKeyName = "tendermint/PubKeySecp256k1" ) // Bytes returns the byte representation of the Private Key. From 7177df5300c7734aca55e764c2492776126a80df Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 14 Sep 2020 16:46:55 +0200 Subject: [PATCH 053/128] Fix build --- testutil/testdata/test_tx.go | 5 ++--- types/tx/types.go | 16 ++++++++-------- x/auth/ante/ante_test.go | 3 +-- x/auth/ante/sigverify_test.go | 9 ++++----- .../solomachine/types/update_test.go | 4 ++-- 5 files changed, 17 insertions(+), 20 deletions(-) diff --git a/testutil/testdata/test_tx.go b/testutil/testdata/test_tx.go index ccc3cc816482..bbcfde5f8195 100644 --- a/testutil/testdata/test_tx.go +++ b/testutil/testdata/test_tx.go @@ -5,17 +5,16 @@ import ( "github.com/tendermint/tendermint/crypto" - "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" sdk "github.com/cosmos/cosmos-sdk/types" ) // KeyTestPubAddr generates a new secp256k1 keypair. func KeyTestPubAddr() (crypto.PrivKey, crypto.PubKey, sdk.AccAddress) { - key := keys.Secp256K1PrivKey{Key: secp256k1.GenPrivKey()} + key := secp256k1.GenPrivKey() pub := key.PubKey() addr := sdk.AccAddress(pub.Address()) - return &key, pub, addr + return key, pub, addr } // NewTestFeeAmount is a test fee amount. diff --git a/types/tx/types.go b/types/tx/types.go index fc596912a9ab..11b43947d38b 100644 --- a/types/tx/types.go +++ b/types/tx/types.go @@ -5,14 +5,12 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/tendermint/tendermint/crypto" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/tendermint/tendermint/crypto" ) var _, _, _, _ codectypes.UnpackInterfacesMessage = &Tx{}, &TxBody{}, &AuthInfo{}, &SignerInfo{} - - // MaxGasWanted defines the max gas allowed. const MaxGasWanted = uint64((1 << 63) - 1) @@ -103,13 +101,15 @@ func (t *Tx) GetSigners() []sdk.AccAddress { } // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method -func (m *Tx) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { - if m.Body != nil { - if err := m.Body.UnpackInterfaces(unpacker); err != nil { +func (t *Tx) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { + if t.Body != nil { + if err := t.Body.UnpackInterfaces(unpacker); err != nil { return err } - if m.AuthInfo != nil { - return m.AuthInfo.UnpackInterfaces(unpacker) + } + + if t.AuthInfo != nil { + return t.AuthInfo.UnpackInterfaces(unpacker) } return nil diff --git a/x/auth/ante/ante_test.go b/x/auth/ante/ante_test.go index 645b0fd989ea..d7a580cf8119 100644 --- a/x/auth/ante/ante_test.go +++ b/x/auth/ante/ante_test.go @@ -11,7 +11,6 @@ import ( "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/ed25519" - "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/testutil/testdata" @@ -894,7 +893,7 @@ func generatePubKeysAndSignatures(n int, msg []byte, _ bool) (pubkeys []crypto.P signatures = make([][]byte, n) for i := 0; i < n; i++ { var privkey crypto.PrivKey - privkey = &keys.Secp256K1PrivKey{Key: secp256k1.GenPrivKey()} + privkey = secp256k1.GenPrivKey() // TODO: also generate ed25519 keys as below when ed25519 keys are // actually supported, https://github.com/cosmos/cosmos-sdk/issues/4789 diff --git a/x/auth/ante/sigverify_test.go b/x/auth/ante/sigverify_test.go index 8f45e322e84d..667ccaa36462 100644 --- a/x/auth/ante/sigverify_test.go +++ b/x/auth/ante/sigverify_test.go @@ -8,7 +8,6 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/simapp" @@ -95,7 +94,7 @@ func (suite *AnteTestSuite) TestConsumeSignatureVerificationGas() { shouldErr bool }{ {"PubKeyEd25519", args{sdk.NewInfiniteGasMeter(), nil, ed25519.GenPrivKey().PubKey(), params}, types.DefaultSigVerifyCostED25519, true}, - {"PubKeySecp256k1", args{sdk.NewInfiniteGasMeter(), nil, &keys.Secp256K1PubKey{Key: secp256k1.GenPrivKey().PubKey().(secp256k1.PubKey)}, params}, types.DefaultSigVerifyCostSecp256k1, false}, + {"PubKeySecp256k1", args{sdk.NewInfiniteGasMeter(), nil, secp256k1.GenPrivKey().PubKey(), params}, types.DefaultSigVerifyCostSecp256k1, false}, {"Multisig", args{sdk.NewInfiniteGasMeter(), multisignature1, multisigKey1, params}, expectedCost1, false}, {"unknown key", args{sdk.NewInfiniteGasMeter(), nil, nil, params}, 0, true}, } @@ -271,9 +270,9 @@ func (suite *AnteTestSuite) TestSigVerification_ExplicitAmino() { func (suite *AnteTestSuite) TestSigIntegration() { // generate private keys privs := []crypto.PrivKey{ - &keys.Secp256K1PrivKey{Key: secp256k1.GenPrivKey()}, - &keys.Secp256K1PrivKey{Key: secp256k1.GenPrivKey()}, - &keys.Secp256K1PrivKey{Key: secp256k1.GenPrivKey()}, + secp256k1.GenPrivKey(), + secp256k1.GenPrivKey(), + secp256k1.GenPrivKey(), } params := types.DefaultParams() diff --git a/x/ibc/light-clients/solomachine/types/update_test.go b/x/ibc/light-clients/solomachine/types/update_test.go index b1ebf889c58a..f58a740e6d44 100644 --- a/x/ibc/light-clients/solomachine/types/update_test.go +++ b/x/ibc/light-clients/solomachine/types/update_test.go @@ -1,8 +1,8 @@ package types_test import ( - "github.com/cosmos/cosmos-sdk/std" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth/tx" ibctmtypes "github.com/cosmos/cosmos-sdk/x/ibc/07-tendermint/types" "github.com/cosmos/cosmos-sdk/x/ibc/exported" "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/solomachine/types" @@ -70,7 +70,7 @@ func (suite *SoloMachineTestSuite) TestCheckHeaderAndUpdateState() { cs := suite.solomachine.ClientState() h := suite.solomachine.CreateHeader() - publicKey, err := std.DefaultPublicKeyCodec{}.Encode(suite.solomachine.PublicKey) + publicKey, err := tx.PubKeyToAny(suite.solomachine.PublicKey) suite.NoError(err) data := &types.HeaderData{ From 794bc35bd4a1edbf9e42a5e71932a09b2dd47117 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 14 Sep 2020 16:53:24 +0200 Subject: [PATCH 054/128] Fix lint --- go.sum | 1 - x/auth/tx/builder.go | 3 +-- x/ibc/light-clients/solomachine/types/consensus_state.go | 3 +-- x/ibc/light-clients/solomachine/types/header.go | 3 +-- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/go.sum b/go.sum index bf57422631d8..f5672910bdca 100644 --- a/go.sum +++ b/go.sum @@ -562,7 +562,6 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH 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/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= diff --git a/x/auth/tx/builder.go b/x/auth/tx/builder.go index a07dbae01371..155b2abc8af6 100644 --- a/x/auth/tx/builder.go +++ b/x/auth/tx/builder.go @@ -9,7 +9,6 @@ import ( "github.com/cosmos/cosmos-sdk/client" codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/errors" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/tx" "github.com/cosmos/cosmos-sdk/types/tx/signing" @@ -307,7 +306,7 @@ func (w *wrapper) SetNonCriticalExtensionOptions(extOpts ...*codectypes.Any) { func PubKeyToAny(key crypto.PubKey) (*codectypes.Any, error) { protoMsg, ok := key.(proto.Message) if !ok { - return nil, errors.Wrap(sdkerrors.ErrInvalidPubKey, fmt.Sprintf("can't proto encode %T", protoMsg)) + return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidPubKey, fmt.Sprintf("can't proto encode %T", protoMsg)) } return codectypes.NewAnyWithValue(protoMsg) } diff --git a/x/ibc/light-clients/solomachine/types/consensus_state.go b/x/ibc/light-clients/solomachine/types/consensus_state.go index dc9353a81a7d..9369760376b7 100644 --- a/x/ibc/light-clients/solomachine/types/consensus_state.go +++ b/x/ibc/light-clients/solomachine/types/consensus_state.go @@ -3,7 +3,6 @@ package types import ( "strings" - "github.com/tendermint/tendermint/crypto" tmcrypto "github.com/tendermint/tendermint/crypto" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -36,7 +35,7 @@ func (cs ConsensusState) GetRoot() exported.Root { // GetPubKey unmarshals the public key into a tmcrypto.PubKey type. func (cs ConsensusState) GetPubKey() tmcrypto.PubKey { - publicKey, ok := cs.PublicKey.GetCachedValue().(crypto.PubKey) + publicKey, ok := cs.PublicKey.GetCachedValue().(tmcrypto.PubKey) if !ok { panic("ConsensusState PublicKey is not crypto.PubKey") } diff --git a/x/ibc/light-clients/solomachine/types/header.go b/x/ibc/light-clients/solomachine/types/header.go index 102237d038a4..e3d384fe07da 100644 --- a/x/ibc/light-clients/solomachine/types/header.go +++ b/x/ibc/light-clients/solomachine/types/header.go @@ -3,7 +3,6 @@ package types import ( "strings" - "github.com/tendermint/tendermint/crypto" tmcrypto "github.com/tendermint/tendermint/crypto" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -27,7 +26,7 @@ func (h Header) GetHeight() exported.Height { // GetPubKey unmarshals the new public key into a tmcrypto.PubKey type. func (h Header) GetPubKey() tmcrypto.PubKey { - publicKey, ok := h.NewPublicKey.GetCachedValue().(crypto.PubKey) + publicKey, ok := h.NewPublicKey.GetCachedValue().(tmcrypto.PubKey) if !ok { panic("Header NewPublicKey is not crypto.PubKey") } From 8001673b4f6d5f7c03b8687f9c10d67eb4ed4b12 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 14 Sep 2020 16:57:24 +0200 Subject: [PATCH 055/128] Fix lint --- crypto/types/multisig/threshold_pubkey.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto/types/multisig/threshold_pubkey.go b/crypto/types/multisig/threshold_pubkey.go index dfad7776a208..7a3c410b7b30 100644 --- a/crypto/types/multisig/threshold_pubkey.go +++ b/crypto/types/multisig/threshold_pubkey.go @@ -22,7 +22,7 @@ func NewPubKeyMultisigThreshold(k int, pubkeys []crypto.PubKey) PubKey { if k <= 0 { panic("threshold k of n multisignature: k <= 0") } - if len(pubkeys) < int(k) { + if len(pubkeys) < k { panic("threshold k of n multisignature: len(pubkeys) < k") } for _, pubkey := range pubkeys { From ee712f110b705e0ea99a6d79f3ade4e0488163d1 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 14 Sep 2020 17:25:06 +0200 Subject: [PATCH 056/128] Add comment --- crypto/codec/amino.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index cb83ee5f6b1f..b183d113e6cb 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -28,6 +28,9 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { sr25519.PubKeyName, nil) cdc.RegisterConcrete(&secp256k1.PubKey{}, secp256k1.PubKeyName, nil) + // TODO Follow-up in https://github.com/cosmos/cosmos-sdk/pull/7284 + // Remove `multisig.PubKeyMultisigThreshold{}`, and register instead + // kmultisig.LegacyAminoMultisigThresholdPubKey{} on `PubKeyAminoRoute`. cdc.RegisterConcrete(multisig.PubKeyMultisigThreshold{}, multisig.PubKeyAminoRoute, nil) cdc.RegisterConcrete(&kmultisig.LegacyAminoMultisigThresholdPubKey{}, From 56ecf470da2f39073ad6e33d13b1da1cc4c9cf27 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 14 Sep 2020 17:59:38 +0200 Subject: [PATCH 057/128] Register crypto.PubKey --- crypto/keys/codec.go | 14 ++++++++++++++ std/codec.go | 2 ++ 2 files changed, 16 insertions(+) create mode 100644 crypto/keys/codec.go diff --git a/crypto/keys/codec.go b/crypto/keys/codec.go new file mode 100644 index 000000000000..da8d6a75bc58 --- /dev/null +++ b/crypto/keys/codec.go @@ -0,0 +1,14 @@ +package keys + +import ( + "github.com/tendermint/tendermint/crypto" + + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" +) + +// RegisterInterfaces registers the sdk.Tx interface. +func RegisterInterfaces(registry codectypes.InterfaceRegistry) { + registry.RegisterInterface("crypto.Pubkey", (*crypto.PubKey)(nil)) + registry.RegisterImplementations((*crypto.PubKey)(nil), &secp256k1.PubKey{}) +} diff --git a/std/codec.go b/std/codec.go index 22a5db408d60..3a4e78a72ce6 100644 --- a/std/codec.go +++ b/std/codec.go @@ -4,6 +4,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + cryptokeys "github.com/cosmos/cosmos-sdk/crypto/keys" sdk "github.com/cosmos/cosmos-sdk/types" txtypes "github.com/cosmos/cosmos-sdk/types/tx" vesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" @@ -19,5 +20,6 @@ func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { func RegisterInterfaces(interfaceRegistry types.InterfaceRegistry) { sdk.RegisterInterfaces(interfaceRegistry) txtypes.RegisterInterfaces(interfaceRegistry) + cryptokeys.RegisterInterfaces(interfaceRegistry) vesting.RegisterInterfaces(interfaceRegistry) } From d3e4d1e49624b69f801e315b2361554e52a958b5 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 14 Sep 2020 18:34:26 +0200 Subject: [PATCH 058/128] Add empty key in BuildSimTx --- client/tx/tx.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/tx/tx.go b/client/tx/tx.go index b5f9e2900cd0..43f2235b1b9b 100644 --- a/client/tx/tx.go +++ b/client/tx/tx.go @@ -15,6 +15,7 @@ import ( sim "github.com/cosmos/cosmos-sdk/client/grpc/simulate" "github.com/cosmos/cosmos-sdk/client/input" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/rest" @@ -257,6 +258,7 @@ func BuildSimTx(txf Factory, msgs ...sdk.Msg) ([]byte, error) { // Create an empty signature literal as the ante handler will populate with a // sentinel pubkey. sig := signing.SignatureV2{ + PubKey: &secp256k1.PubKey{}, Data: &signing.SingleSignatureData{ SignMode: txf.signMode, }, From c5d5c81beadfdb4cf27091a6debcca1e8d573d95 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Tue, 15 Sep 2020 10:48:58 +0200 Subject: [PATCH 059/128] Simplify proto names --- crypto/codec/amino.go | 6 +- crypto/keys/multisig/keys.pb.go | 95 +++++++++---------- crypto/keys/multisig/multisig.go | 20 ++-- crypto/keys/multisig/multisig_test.go | 20 ++-- crypto/keys/secp256k1/keys.pb.go | 40 ++++---- .../types/multisig/threshold_pubkey_test.go | 2 +- .../crypto/multisig/{v1 => }/keys.proto | 10 +- .../crypto/secp256k1/{v1 => }/keys.proto | 6 +- 8 files changed, 98 insertions(+), 101 deletions(-) rename proto/cosmos/crypto/multisig/{v1 => }/keys.proto (71%) rename proto/cosmos/crypto/secp256k1/{v1 => }/keys.proto (87%) diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index b183d113e6cb..abc33137787d 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -30,11 +30,11 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { secp256k1.PubKeyName, nil) // TODO Follow-up in https://github.com/cosmos/cosmos-sdk/pull/7284 // Remove `multisig.PubKeyMultisigThreshold{}`, and register instead - // kmultisig.LegacyAminoMultisigThresholdPubKey{} on `PubKeyAminoRoute`. + // kmultisig.LegacyAminoPubKey{} on `PubKeyAminoRoute`. cdc.RegisterConcrete(multisig.PubKeyMultisigThreshold{}, multisig.PubKeyAminoRoute, nil) - cdc.RegisterConcrete(&kmultisig.LegacyAminoMultisigThresholdPubKey{}, - "cosmos-sdk/LegacyAminoMultisigThresholdPubKey", nil) + cdc.RegisterConcrete(&kmultisig.LegacyAminoPubKey{}, + "cosmos-sdk/LegacyAminoPubKey", nil) cdc.RegisterInterface((*crypto.PrivKey)(nil), nil) cdc.RegisterConcrete(ed25519.PrivKey{}, diff --git a/crypto/keys/multisig/keys.pb.go b/crypto/keys/multisig/keys.pb.go index 9e63e67a93ba..0dd70ae220bd 100644 --- a/crypto/keys/multisig/keys.pb.go +++ b/crypto/keys/multisig/keys.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: cosmos/crypto/multisig/v1/keys.proto +// source: cosmos/crypto/multisig/keys.proto package multisig @@ -24,26 +24,26 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// LegacyAminoMultisigThresholdPubKey specifies a public key type +// LegacyAminoPubKey specifies a public key type // which nests multiple public keys and a threshold, -// it uses legacy amino address rules -type LegacyAminoMultisigThresholdPubKey struct { +// it uses legacy amino address rules. +type LegacyAminoPubKey struct { Threshold uint32 `protobuf:"varint,1,opt,name=threshold,proto3" json:"threshold,omitempty" yaml:"threshold"` PubKeys []*types.Any `protobuf:"bytes,2,rep,name=public_keys,json=publicKeys,proto3" json:"public_keys,omitempty" yaml:"pubkeys"` } -func (m *LegacyAminoMultisigThresholdPubKey) Reset() { *m = LegacyAminoMultisigThresholdPubKey{} } -func (m *LegacyAminoMultisigThresholdPubKey) String() string { return proto.CompactTextString(m) } -func (*LegacyAminoMultisigThresholdPubKey) ProtoMessage() {} -func (*LegacyAminoMultisigThresholdPubKey) Descriptor() ([]byte, []int) { - return fileDescriptor_7090cf2b1c5dca0f, []int{0} +func (m *LegacyAminoPubKey) Reset() { *m = LegacyAminoPubKey{} } +func (m *LegacyAminoPubKey) String() string { return proto.CompactTextString(m) } +func (*LegacyAminoPubKey) ProtoMessage() {} +func (*LegacyAminoPubKey) Descriptor() ([]byte, []int) { + return fileDescriptor_46b57537e097d47d, []int{0} } -func (m *LegacyAminoMultisigThresholdPubKey) XXX_Unmarshal(b []byte) error { +func (m *LegacyAminoPubKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *LegacyAminoMultisigThresholdPubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *LegacyAminoPubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_LegacyAminoMultisigThresholdPubKey.Marshal(b, m, deterministic) + return xxx_messageInfo_LegacyAminoPubKey.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -53,50 +53,47 @@ func (m *LegacyAminoMultisigThresholdPubKey) XXX_Marshal(b []byte, deterministic return b[:n], nil } } -func (m *LegacyAminoMultisigThresholdPubKey) XXX_Merge(src proto.Message) { - xxx_messageInfo_LegacyAminoMultisigThresholdPubKey.Merge(m, src) +func (m *LegacyAminoPubKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_LegacyAminoPubKey.Merge(m, src) } -func (m *LegacyAminoMultisigThresholdPubKey) XXX_Size() int { +func (m *LegacyAminoPubKey) XXX_Size() int { return m.Size() } -func (m *LegacyAminoMultisigThresholdPubKey) XXX_DiscardUnknown() { - xxx_messageInfo_LegacyAminoMultisigThresholdPubKey.DiscardUnknown(m) +func (m *LegacyAminoPubKey) XXX_DiscardUnknown() { + xxx_messageInfo_LegacyAminoPubKey.DiscardUnknown(m) } -var xxx_messageInfo_LegacyAminoMultisigThresholdPubKey proto.InternalMessageInfo +var xxx_messageInfo_LegacyAminoPubKey proto.InternalMessageInfo func init() { - proto.RegisterType((*LegacyAminoMultisigThresholdPubKey)(nil), "cosmos.crypto.multisig.v1.LegacyAminoMultisigThresholdPubKey") + proto.RegisterType((*LegacyAminoPubKey)(nil), "cosmos.crypto.multisig.LegacyAminoPubKey") } -func init() { - proto.RegisterFile("cosmos/crypto/multisig/v1/keys.proto", fileDescriptor_7090cf2b1c5dca0f) -} +func init() { proto.RegisterFile("cosmos/crypto/multisig/keys.proto", fileDescriptor_46b57537e097d47d) } -var fileDescriptor_7090cf2b1c5dca0f = []byte{ - // 299 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x49, 0xce, 0x2f, 0xce, +var fileDescriptor_46b57537e097d47d = []byte{ + // 287 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4c, 0xce, 0x2f, 0xce, 0xcd, 0x2f, 0xd6, 0x4f, 0x2e, 0xaa, 0x2c, 0x28, 0xc9, 0xd7, 0xcf, 0x2d, 0xcd, 0x29, 0xc9, 0x2c, - 0xce, 0x4c, 0xd7, 0x2f, 0x33, 0xd4, 0xcf, 0x4e, 0xad, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, - 0x17, 0x92, 0x84, 0xa8, 0xd2, 0x83, 0xa8, 0xd2, 0x83, 0xa9, 0xd2, 0x2b, 0x33, 0x94, 0x12, 0x49, - 0xcf, 0x4f, 0xcf, 0x07, 0xab, 0xd2, 0x07, 0xb1, 0x20, 0x1a, 0xa4, 0x24, 0xd3, 0xf3, 0xf3, 0xd3, - 0x73, 0x52, 0xf5, 0xc1, 0xbc, 0xa4, 0xd2, 0x34, 0xfd, 0xc4, 0xbc, 0x4a, 0x88, 0x94, 0xd2, 0x16, - 0x46, 0x2e, 0x25, 0x9f, 0xd4, 0xf4, 0xc4, 0xe4, 0x4a, 0xc7, 0xdc, 0xcc, 0xbc, 0x7c, 0x5f, 0xa8, - 0x59, 0x21, 0x19, 0x45, 0xa9, 0xc5, 0x19, 0xf9, 0x39, 0x29, 0x01, 0xa5, 0x49, 0xde, 0xa9, 0x95, - 0x42, 0x46, 0x5c, 0x9c, 0x25, 0x30, 0x21, 0x09, 0x46, 0x05, 0x46, 0x0d, 0x5e, 0x27, 0x91, 0x4f, - 0xf7, 0xe4, 0x05, 0x2a, 0x13, 0x73, 0x73, 0xac, 0x94, 0xe0, 0x52, 0x4a, 0x41, 0x08, 0x65, 0x42, - 0x21, 0x5c, 0xdc, 0x05, 0xa5, 0x49, 0x39, 0x99, 0xc9, 0xf1, 0x20, 0xb7, 0x4b, 0x30, 0x29, 0x30, - 0x6b, 0x70, 0x1b, 0x89, 0xe8, 0x41, 0xdc, 0xa2, 0x07, 0x73, 0x8b, 0x9e, 0x63, 0x5e, 0xa5, 0x93, - 0xec, 0xa3, 0x7b, 0xf2, 0xec, 0x10, 0xab, 0x8a, 0x3f, 0xdd, 0x93, 0xe7, 0x83, 0x18, 0x5b, 0x50, - 0x9a, 0x04, 0xd2, 0xa9, 0x14, 0xc4, 0x05, 0x31, 0x07, 0x24, 0x6b, 0xc5, 0xd2, 0xb1, 0x40, 0x9e, - 0xc1, 0xc9, 0xfb, 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, - 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0x0c, 0xd3, 0x33, - 0x4b, 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xf5, 0x61, 0xa1, 0x09, 0xa6, 0x74, 0x8b, 0x53, - 0xb2, 0x61, 0x01, 0x0b, 0x32, 0x16, 0x1e, 0xba, 0x49, 0x6c, 0x60, 0xb7, 0x18, 0x03, 0x02, 0x00, - 0x00, 0xff, 0xff, 0x5f, 0x5f, 0x0b, 0x42, 0x7e, 0x01, 0x00, 0x00, + 0xce, 0x4c, 0xd7, 0xcf, 0x4e, 0xad, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x83, + 0x28, 0xd1, 0x83, 0x28, 0xd1, 0x83, 0x29, 0x91, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0x2b, 0xd1, + 0x07, 0xb1, 0x20, 0xaa, 0xa5, 0x24, 0xd3, 0xf3, 0xf3, 0xd3, 0x73, 0x52, 0xf5, 0xc1, 0xbc, 0xa4, + 0xd2, 0x34, 0xfd, 0xc4, 0xbc, 0x4a, 0x88, 0x94, 0xd2, 0x62, 0x46, 0x2e, 0x41, 0x9f, 0xd4, 0xf4, + 0xc4, 0xe4, 0x4a, 0xc7, 0xdc, 0xcc, 0xbc, 0xfc, 0x80, 0xd2, 0x24, 0xef, 0xd4, 0x4a, 0x21, 0x23, + 0x2e, 0xce, 0x92, 0x8c, 0xa2, 0xd4, 0xe2, 0x8c, 0xfc, 0x9c, 0x14, 0x09, 0x46, 0x05, 0x46, 0x0d, + 0x5e, 0x27, 0x91, 0x4f, 0xf7, 0xe4, 0x05, 0x2a, 0x13, 0x73, 0x73, 0xac, 0x94, 0xe0, 0x52, 0x4a, + 0x41, 0x08, 0x65, 0x42, 0x21, 0x5c, 0xdc, 0x05, 0xa5, 0x49, 0x39, 0x99, 0xc9, 0xf1, 0x20, 0x77, + 0x4a, 0x30, 0x29, 0x30, 0x6b, 0x70, 0x1b, 0x89, 0xe8, 0x41, 0xac, 0xd6, 0x83, 0x59, 0xad, 0xe7, + 0x98, 0x57, 0xe9, 0x24, 0xfb, 0xe8, 0x9e, 0x3c, 0x3b, 0xc4, 0xaa, 0xe2, 0x4f, 0xf7, 0xe4, 0xf9, + 0x20, 0xc6, 0x16, 0x94, 0x26, 0x81, 0x74, 0x2a, 0x05, 0x71, 0x41, 0xcc, 0x01, 0xc9, 0x5a, 0xb1, + 0x74, 0x2c, 0x90, 0x67, 0x70, 0xf2, 0x3e, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, + 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, + 0x28, 0xc3, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0x58, 0xb0, 0x81, + 0x29, 0xdd, 0xe2, 0x94, 0x6c, 0x58, 0x08, 0x82, 0x8c, 0x85, 0x07, 0x63, 0x12, 0x1b, 0xd8, 0x2d, + 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x76, 0x6e, 0xbf, 0x3c, 0x67, 0x01, 0x00, 0x00, } -func (m *LegacyAminoMultisigThresholdPubKey) Marshal() (dAtA []byte, err error) { +func (m *LegacyAminoPubKey) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -106,12 +103,12 @@ func (m *LegacyAminoMultisigThresholdPubKey) Marshal() (dAtA []byte, err error) return dAtA[:n], nil } -func (m *LegacyAminoMultisigThresholdPubKey) MarshalTo(dAtA []byte) (int, error) { +func (m *LegacyAminoPubKey) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *LegacyAminoMultisigThresholdPubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *LegacyAminoPubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -149,7 +146,7 @@ func encodeVarintKeys(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } -func (m *LegacyAminoMultisigThresholdPubKey) Size() (n int) { +func (m *LegacyAminoPubKey) Size() (n int) { if m == nil { return 0 } @@ -173,7 +170,7 @@ func sovKeys(x uint64) (n int) { func sozKeys(x uint64) (n int) { return sovKeys(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (m *LegacyAminoMultisigThresholdPubKey) Unmarshal(dAtA []byte) error { +func (m *LegacyAminoPubKey) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -196,10 +193,10 @@ func (m *LegacyAminoMultisigThresholdPubKey) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: LegacyAminoMultisigThresholdPubKey: wiretype end group for non-group") + return fmt.Errorf("proto: LegacyAminoPubKey: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: LegacyAminoMultisigThresholdPubKey: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: LegacyAminoPubKey: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: diff --git a/crypto/keys/multisig/multisig.go b/crypto/keys/multisig/multisig.go index 6a302e9899fe..f7460ac81098 100644 --- a/crypto/keys/multisig/multisig.go +++ b/crypto/keys/multisig/multisig.go @@ -15,20 +15,20 @@ import ( var cdc = codec.NewProtoCodec(types.NewInterfaceRegistry()) -var _ multisig.PubKey = &LegacyAminoMultisigThresholdPubKey{} +var _ multisig.PubKey = &LegacyAminoPubKey{} // Address implements crypto.PubKey Address method -func (m *LegacyAminoMultisigThresholdPubKey) Address() crypto.Address { +func (m *LegacyAminoPubKey) Address() crypto.Address { return tmcrypto.AddressHash(m.Bytes()) } -// Bytes returns the proto encoded version of the LegacyAminoMultisigThresholdPubKey -func (m *LegacyAminoMultisigThresholdPubKey) Bytes() []byte { +// Bytes returns the proto encoded version of the LegacyAminoPubKey +func (m *LegacyAminoPubKey) Bytes() []byte { return cdc.MustMarshalBinaryBare(m) } // VerifyMultisignature implements the multisig.PubKey VerifyMultisignature method -func (m *LegacyAminoMultisigThresholdPubKey) VerifyMultisignature(getSignBytes multisig.GetSignBytesFunc, sig *signing.MultiSignatureData) error { +func (m *LegacyAminoPubKey) VerifyMultisignature(getSignBytes multisig.GetSignBytesFunc, sig *signing.MultiSignatureData) error { bitarray := sig.BitArray sigs := sig.Signatures size := bitarray.Count() @@ -79,12 +79,12 @@ func (m *LegacyAminoMultisigThresholdPubKey) VerifyMultisignature(getSignBytes m // VerifySignature implements crypto.PubKey VerifySignature method, // it panics because it can't handle MultiSignatureData // cf. https://github.com/cosmos/cosmos-sdk/issues/7109#issuecomment-686329936 -func (m *LegacyAminoMultisigThresholdPubKey) VerifySignature(msg []byte, sig []byte) bool { +func (m *LegacyAminoPubKey) VerifySignature(msg []byte, sig []byte) bool { panic("not implemented") } // GetPubKeys implements the PubKey.GetPubKeys method -func (m *LegacyAminoMultisigThresholdPubKey) GetPubKeys() []tmcrypto.PubKey { +func (m *LegacyAminoPubKey) GetPubKeys() []tmcrypto.PubKey { if m != nil { pubKeys := make([]tmcrypto.PubKey, len(m.PubKeys)) for i := 0; i < len(m.PubKeys); i++ { @@ -98,7 +98,7 @@ func (m *LegacyAminoMultisigThresholdPubKey) GetPubKeys() []tmcrypto.PubKey { // Equals returns true if m and other both have the same number of keys, and // all constituent keys are the same, and in the same order. -func (m *LegacyAminoMultisigThresholdPubKey) Equals(key tmcrypto.PubKey) bool { +func (m *LegacyAminoPubKey) Equals(key tmcrypto.PubKey) bool { otherKey, ok := key.(multisig.PubKey) if !ok { return false @@ -118,11 +118,11 @@ func (m *LegacyAminoMultisigThresholdPubKey) Equals(key tmcrypto.PubKey) bool { } // GetThreshold implements the PubKey.GetThreshold method -func (m *LegacyAminoMultisigThresholdPubKey) GetThreshold() uint { +func (m *LegacyAminoPubKey) GetThreshold() uint { return uint(m.Threshold) } // Type returns multisig type -func (m *LegacyAminoMultisigThresholdPubKey) Type() string { +func (m *LegacyAminoPubKey) Type() string { return "PubKeyMultisigThreshold" } diff --git a/crypto/keys/multisig/multisig_test.go b/crypto/keys/multisig/multisig_test.go index 690f1cf79aa4..946720776364 100644 --- a/crypto/keys/multisig/multisig_test.go +++ b/crypto/keys/multisig/multisig_test.go @@ -19,7 +19,7 @@ func TestAddress(t *testing.T) { pubKeys, _ := generatePubKeysAndSignatures(5, msg) anyPubKeys, err := packPubKeys(pubKeys) require.NoError(t, err) - multisigKey := &LegacyAminoMultisigThresholdPubKey{Threshold: 2, PubKeys: anyPubKeys} + multisigKey := &LegacyAminoPubKey{Threshold: 2, PubKeys: anyPubKeys} require.Len(t, multisigKey.Address().Bytes(), 20) } @@ -30,11 +30,11 @@ func TestEquals(t *testing.T) { anyPubKeys, err := packPubKeys([]tmcrypto.PubKey{pubKey1, pubKey2}) require.NoError(t, err) - multisigKey := &LegacyAminoMultisigThresholdPubKey{Threshold: 1, PubKeys: anyPubKeys} + multisigKey := &LegacyAminoPubKey{Threshold: 1, PubKeys: anyPubKeys} otherPubKeys, err := packPubKeys([]tmcrypto.PubKey{pubKey1, multisigKey}) require.NoError(t, err) - otherMultisigKey := LegacyAminoMultisigThresholdPubKey{Threshold: 1, PubKeys: otherPubKeys} + otherMultisigKey := LegacyAminoPubKey{Threshold: 1, PubKeys: otherPubKeys} testCases := []struct { msg string @@ -43,17 +43,17 @@ func TestEquals(t *testing.T) { }{ { "equals with proto pub key", - &LegacyAminoMultisigThresholdPubKey{Threshold: 1, PubKeys: anyPubKeys}, + &LegacyAminoPubKey{Threshold: 1, PubKeys: anyPubKeys}, true, }, { "different threshold", - &LegacyAminoMultisigThresholdPubKey{Threshold: 2, PubKeys: anyPubKeys}, + &LegacyAminoPubKey{Threshold: 2, PubKeys: anyPubKeys}, false, }, { "different pub keys length", - &LegacyAminoMultisigThresholdPubKey{Threshold: 1, PubKeys: []*types.Any{anyPubKeys[0]}}, + &LegacyAminoPubKey{Threshold: 1, PubKeys: []*types.Any{anyPubKeys[0]}}, false, }, { @@ -105,7 +105,7 @@ func TestVerifyMultisignature(t *testing.T) { pubKeys, _ := generatePubKeysAndSignatures(3, msg) anyPubKeys, err := packPubKeys(pubKeys) require.NoError(t, err) - pk = &LegacyAminoMultisigThresholdPubKey{Threshold: 3, PubKeys: anyPubKeys} + pk = &LegacyAminoPubKey{Threshold: 3, PubKeys: anyPubKeys} sig = multisig.NewMultisig(1) }, false, @@ -118,7 +118,7 @@ func TestVerifyMultisignature(t *testing.T) { pubKeys, sigs := generatePubKeysAndSignatures(5, msg) anyPubKeys, err := packPubKeys(pubKeys) require.NoError(t, err) - pk = &LegacyAminoMultisigThresholdPubKey{Threshold: uint32(k), PubKeys: anyPubKeys} + pk = &LegacyAminoPubKey{Threshold: uint32(k), PubKeys: anyPubKeys} sig = multisig.NewMultisig(len(pubKeys)) signBytesFn := func(mode signing.SignMode) ([]byte, error) { return msg, nil } @@ -203,14 +203,14 @@ func generateNestedMultiSignature(n int, msg []byte) (multisig.PubKey, *signing. if err != nil { return nil, nil, err } - pubKeys[i] = &LegacyAminoMultisigThresholdPubKey{Threshold: 5, PubKeys: anyNestedPks} + pubKeys[i] = &LegacyAminoPubKey{Threshold: 5, PubKeys: anyNestedPks} bitArray.SetIndex(i, true) } anyPubKeys, err := packPubKeys(pubKeys) if err != nil { return nil, nil, err } - return &LegacyAminoMultisigThresholdPubKey{Threshold: uint32(n), PubKeys: anyPubKeys}, &signing.MultiSignatureData{ + return &LegacyAminoPubKey{Threshold: uint32(n), PubKeys: anyPubKeys}, &signing.MultiSignatureData{ BitArray: bitArray, Signatures: signatures, }, nil diff --git a/crypto/keys/secp256k1/keys.pb.go b/crypto/keys/secp256k1/keys.pb.go index f29012107a2d..6dd45721bf4b 100644 --- a/crypto/keys/secp256k1/keys.pb.go +++ b/crypto/keys/secp256k1/keys.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: cosmos/crypto/secp256k1/v1/keys.proto +// source: cosmos/crypto/secp256k1/keys.proto package secp256k1 @@ -35,7 +35,7 @@ type PubKey struct { func (m *PubKey) Reset() { *m = PubKey{} } func (*PubKey) ProtoMessage() {} func (*PubKey) Descriptor() ([]byte, []int) { - return fileDescriptor_ab22a3f15d2b8ddc, []int{0} + return fileDescriptor_e0835e68ebdcb224, []int{0} } func (m *PubKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -71,7 +71,7 @@ func (m *PubKey) GetKey() []byte { return nil } -// PrivKey defines a secp256k1 private key +// PrivKey defines a secp256k1 private key. type PrivKey struct { Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` } @@ -80,7 +80,7 @@ func (m *PrivKey) Reset() { *m = PrivKey{} } func (m *PrivKey) String() string { return proto.CompactTextString(m) } func (*PrivKey) ProtoMessage() {} func (*PrivKey) Descriptor() ([]byte, []int) { - return fileDescriptor_ab22a3f15d2b8ddc, []int{1} + return fileDescriptor_e0835e68ebdcb224, []int{1} } func (m *PrivKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -117,28 +117,28 @@ func (m *PrivKey) GetKey() []byte { } func init() { - proto.RegisterType((*PubKey)(nil), "cosmos.crypto.secp256k1.v1.PubKey") - proto.RegisterType((*PrivKey)(nil), "cosmos.crypto.secp256k1.v1.PrivKey") + proto.RegisterType((*PubKey)(nil), "cosmos.crypto.secp256k1.PubKey") + proto.RegisterType((*PrivKey)(nil), "cosmos.crypto.secp256k1.PrivKey") } func init() { - proto.RegisterFile("cosmos/crypto/secp256k1/v1/keys.proto", fileDescriptor_ab22a3f15d2b8ddc) + proto.RegisterFile("cosmos/crypto/secp256k1/keys.proto", fileDescriptor_e0835e68ebdcb224) } -var fileDescriptor_ab22a3f15d2b8ddc = []byte{ - // 191 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4d, 0xce, 0x2f, 0xce, +var fileDescriptor_e0835e68ebdcb224 = []byte{ + // 185 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4a, 0xce, 0x2f, 0xce, 0xcd, 0x2f, 0xd6, 0x4f, 0x2e, 0xaa, 0x2c, 0x28, 0xc9, 0xd7, 0x2f, 0x4e, 0x4d, 0x2e, 0x30, 0x32, - 0x35, 0xcb, 0x36, 0xd4, 0x2f, 0x33, 0xd4, 0xcf, 0x4e, 0xad, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, - 0xc9, 0x17, 0x92, 0x82, 0x28, 0xd3, 0x83, 0x28, 0xd3, 0x83, 0x2b, 0xd3, 0x2b, 0x33, 0x94, 0x12, - 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0x2b, 0xd3, 0x07, 0xb1, 0x20, 0x3a, 0x94, 0x14, 0xb8, 0xd8, 0x02, - 0x4a, 0x93, 0xbc, 0x53, 0x2b, 0x85, 0x04, 0xb8, 0x98, 0xb3, 0x53, 0x2b, 0x25, 0x18, 0x15, 0x18, - 0x35, 0x78, 0x82, 0x40, 0x4c, 0x2b, 0x96, 0x19, 0x0b, 0xe4, 0x19, 0x94, 0xa4, 0xb9, 0xd8, 0x03, - 0x8a, 0x32, 0xcb, 0xb0, 0x2a, 0x71, 0xf2, 0x39, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, - 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, - 0x86, 0x28, 0xa3, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0x98, 0xe3, - 0xc1, 0x94, 0x6e, 0x71, 0x4a, 0x36, 0xcc, 0x1f, 0x20, 0xa7, 0x23, 0x3c, 0x93, 0xc4, 0x06, 0x76, - 0x93, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0xa0, 0x87, 0xb2, 0xc3, 0xee, 0x00, 0x00, 0x00, + 0x35, 0xcb, 0x36, 0xd4, 0xcf, 0x4e, 0xad, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, + 0x87, 0xa8, 0xd1, 0x83, 0xa8, 0xd1, 0x83, 0xab, 0x91, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0xab, + 0xd1, 0x07, 0xb1, 0x20, 0xca, 0x95, 0x14, 0xb8, 0xd8, 0x02, 0x4a, 0x93, 0xbc, 0x53, 0x2b, 0x85, + 0x04, 0xb8, 0x98, 0xb3, 0x53, 0x2b, 0x25, 0x18, 0x15, 0x18, 0x35, 0x78, 0x82, 0x40, 0x4c, 0x2b, + 0x96, 0x19, 0x0b, 0xe4, 0x19, 0x94, 0xa4, 0xb9, 0xd8, 0x03, 0x8a, 0x32, 0xcb, 0xb0, 0x2a, 0x71, + 0xf2, 0x39, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, + 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0xa3, 0xf4, 0xcc, 0x92, + 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0x98, 0xb3, 0xc1, 0x94, 0x6e, 0x71, 0x4a, 0x36, + 0xcc, 0x07, 0x20, 0x77, 0x23, 0xbc, 0x91, 0xc4, 0x06, 0x76, 0x93, 0x31, 0x20, 0x00, 0x00, 0xff, + 0xff, 0x63, 0x00, 0x68, 0x16, 0xe8, 0x00, 0x00, 0x00, } func (m *PubKey) Marshal() (dAtA []byte, err error) { diff --git a/crypto/types/multisig/threshold_pubkey_test.go b/crypto/types/multisig/threshold_pubkey_test.go index 023a3148c983..4d753675cf77 100644 --- a/crypto/types/multisig/threshold_pubkey_test.go +++ b/crypto/types/multisig/threshold_pubkey_test.go @@ -176,7 +176,7 @@ func TestMultiSigPubKeyEquality(t *testing.T) { require.NoError(t, err) anyPubKeys[i] = any } - other = &kmultisig.LegacyAminoMultisigThresholdPubKey{Threshold: 2, PubKeys: anyPubKeys} + other = &kmultisig.LegacyAminoPubKey{Threshold: 2, PubKeys: anyPubKeys} }, true, }, diff --git a/proto/cosmos/crypto/multisig/v1/keys.proto b/proto/cosmos/crypto/multisig/keys.proto similarity index 71% rename from proto/cosmos/crypto/multisig/v1/keys.proto rename to proto/cosmos/crypto/multisig/keys.proto index 308b9771e235..5fb2fe6f03c8 100644 --- a/proto/cosmos/crypto/multisig/v1/keys.proto +++ b/proto/cosmos/crypto/multisig/keys.proto @@ -1,17 +1,17 @@ syntax = "proto3"; -package cosmos.crypto.multisig.v1; +package cosmos.crypto.multisig; import "gogoproto/gogo.proto"; import "google/protobuf/any.proto"; option go_package = "github.com/cosmos/cosmos-sdk/crypto/keys/multisig"; -// LegacyAminoMultisigThresholdPubKey specifies a public key type +// LegacyAminoPubKey specifies a public key type // which nests multiple public keys and a threshold, -// it uses legacy amino address rules -message LegacyAminoMultisigThresholdPubKey { +// it uses legacy amino address rules. +message LegacyAminoPubKey { option (gogoproto.goproto_getters) = false; uint32 threshold = 1 [(gogoproto.moretags) = "yaml:\"threshold\""]; repeated google.protobuf.Any public_keys = 2 [(gogoproto.customname) = "PubKeys", (gogoproto.moretags) = "yaml:\"pubkeys\""]; -} \ No newline at end of file +} diff --git a/proto/cosmos/crypto/secp256k1/v1/keys.proto b/proto/cosmos/crypto/secp256k1/keys.proto similarity index 87% rename from proto/cosmos/crypto/secp256k1/v1/keys.proto rename to proto/cosmos/crypto/secp256k1/keys.proto index dc0b868d2807..c1ba7db34d86 100644 --- a/proto/cosmos/crypto/secp256k1/v1/keys.proto +++ b/proto/cosmos/crypto/secp256k1/keys.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -package cosmos.crypto.secp256k1.v1; +package cosmos.crypto.secp256k1; import "gogoproto/gogo.proto"; @@ -16,7 +16,7 @@ message PubKey { bytes key = 1; } -// PrivKey defines a secp256k1 private key +// PrivKey defines a secp256k1 private key. message PrivKey { bytes key = 1; -} \ No newline at end of file +} From afddbc9f4baf1e71cef961cca2210a126bdd83a6 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Tue, 15 Sep 2020 12:53:36 +0200 Subject: [PATCH 060/128] Unpack interfaces for signing desc --- types/tx/signing/signature.go | 27 +++++++++++++++++++++++++++ types/tx/types.go | 4 +--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/types/tx/signing/signature.go b/types/tx/signing/signature.go index f8f9a8d3bf3a..6804b1836b93 100644 --- a/types/tx/signing/signature.go +++ b/types/tx/signing/signature.go @@ -3,6 +3,7 @@ package signing import ( "fmt" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/tendermint/tendermint/crypto" ) @@ -98,3 +99,29 @@ func SignatureDataFromProto(descData *SignatureDescriptor_Data) SignatureData { panic(fmt.Errorf("unexpected case %+v", descData)) } } + +var _, _ codectypes.UnpackInterfacesMessage = &SignatureDescriptors{}, &SignatureDescriptor{} + +// UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method +func (sds *SignatureDescriptors) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { + for _, sig := range sds.Signatures { + err := sig.UnpackInterfaces(unpacker) + + if err != nil { + return err + } + } + + return nil +} + +// UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method +func (sd *SignatureDescriptor) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { + var pubKey crypto.PubKey + err := unpacker.UnpackAny(sd.PublicKey, &pubKey) + if err != nil { + return err + } + + return nil +} diff --git a/types/tx/types.go b/types/tx/types.go index 11b43947d38b..e328f30cf5ec 100644 --- a/types/tx/types.go +++ b/types/tx/types.go @@ -9,12 +9,10 @@ import ( "github.com/tendermint/tendermint/crypto" ) -var _, _, _, _ codectypes.UnpackInterfacesMessage = &Tx{}, &TxBody{}, &AuthInfo{}, &SignerInfo{} - // MaxGasWanted defines the max gas allowed. const MaxGasWanted = uint64((1 << 63) - 1) -var _, _ codectypes.UnpackInterfacesMessage = &Tx{}, &TxBody{} +var _, _, _, _ codectypes.UnpackInterfacesMessage = &Tx{}, &TxBody{}, &AuthInfo{}, &SignerInfo{} var _ sdk.Tx = &Tx{} // GetMsgs implements the GetMsgs method on sdk.Tx. From f70ab560c1610f273d03e9134956ce45a2cf7cff Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Tue, 15 Sep 2020 13:07:58 +0200 Subject: [PATCH 061/128] Fix IBC tests? --- x/ibc/testing/solomachine.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x/ibc/testing/solomachine.go b/x/ibc/testing/solomachine.go index 843c480a097d..12fd31dbeea0 100644 --- a/x/ibc/testing/solomachine.go +++ b/x/ibc/testing/solomachine.go @@ -8,6 +8,7 @@ import ( "github.com/tendermint/tendermint/crypto/ed25519" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/x/auth/tx" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" "github.com/cosmos/cosmos-sdk/x/ibc/exported" @@ -31,7 +32,7 @@ type Solomachine struct { // NewSolomachine returns a new solomachine instance with a generated private/public // key pair and a sequence starting at 1. func NewSolomachine(t *testing.T, cdc codec.BinaryMarshaler, clientID, diversifier string) *Solomachine { - privKey := ed25519.GenPrivKey() + privKey := secp256k1.GenPrivKey() return &Solomachine{ t: t, From 9d0ac0a48a464ccd41c38779e7cef9961c837d87 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Tue, 15 Sep 2020 13:08:09 +0200 Subject: [PATCH 062/128] Format proto --- proto/ibc/lightclients/solomachine/v1/solomachine.proto | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/proto/ibc/lightclients/solomachine/v1/solomachine.proto b/proto/ibc/lightclients/solomachine/v1/solomachine.proto index 9281c907c371..4209bfed6d00 100644 --- a/proto/ibc/lightclients/solomachine/v1/solomachine.proto +++ b/proto/ibc/lightclients/solomachine/v1/solomachine.proto @@ -42,7 +42,7 @@ message Header { uint64 sequence = 1; uint64 timestamp = 2; bytes signature = 3; - google.protobuf.Any new_public_key = 4 [(gogoproto.moretags) = "yaml:\"new_public_key\""]; + google.protobuf.Any new_public_key = 4 [(gogoproto.moretags) = "yaml:\"new_public_key\""]; string new_diversifier = 5 [(gogoproto.moretags) = "yaml:\"new_diversifier\""]; } @@ -89,7 +89,7 @@ message HeaderData { option (gogoproto.goproto_getters) = false; // header public key - google.protobuf.Any new_pub_key = 1 [(gogoproto.moretags) = "yaml:\"new_pub_key\""]; + google.protobuf.Any new_pub_key = 1 [(gogoproto.moretags) = "yaml:\"new_pub_key\""]; // header diversifier string new_diversifier = 2 [(gogoproto.moretags) = "yaml:\"new_diversifier\""]; } From d3b2896b6f29cddc1760575bd928806e95a5236f Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Tue, 15 Sep 2020 13:16:20 +0200 Subject: [PATCH 063/128] Use secp256k1 in ibc --- x/ibc/testing/solomachine.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x/ibc/testing/solomachine.go b/x/ibc/testing/solomachine.go index 12fd31dbeea0..412e0f644f03 100644 --- a/x/ibc/testing/solomachine.go +++ b/x/ibc/testing/solomachine.go @@ -5,7 +5,6 @@ import ( "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" @@ -73,7 +72,7 @@ func (solo *Solomachine) GetHeight() exported.Height { // necessary signature to construct a valid solo machine header. func (solo *Solomachine) CreateHeader() *solomachinetypes.Header { // generate new private key and signature for header - newPrivKey := ed25519.GenPrivKey() + newPrivKey := secp256k1.GenPrivKey() publicKey, err := tx.PubKeyToAny(solo.PublicKey) require.NoError(solo.t, err) From 96c27ece5ec6901fdc28071fc2e56e5defd58f44 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Tue, 15 Sep 2020 14:03:07 +0200 Subject: [PATCH 064/128] Fixed merge issues --- client/keys/add.go | 2 +- client/keys/show.go | 2 +- client/keys/show_test.go | 2 +- crypto/keyring/info.go | 6 +++--- crypto/keyring/keyring_test.go | 8 ++++---- crypto/keys/multisig/multisig.go | 9 +++++---- crypto/keys/multisig/multisig_test.go | 8 ++++---- x/auth/ante/basic.go | 2 +- x/auth/client/cli/tx_multisign.go | 2 +- x/auth/types/stdtx.go | 2 +- 10 files changed, 22 insertions(+), 21 deletions(-) diff --git a/client/keys/add.go b/client/keys/add.go index 5adad50b57a2..a2bd2b494828 100644 --- a/client/keys/add.go +++ b/client/keys/add.go @@ -174,7 +174,7 @@ func RunAddCmd(cmd *cobra.Command, args []string, kb keyring.Keyring, inBuf *buf }) } - pk := multisig.NewLegacyAminoMultisigThresholdPubKey(multisigThreshold, pks) + pk := multisig.NewLegacyAminoPubKey(multisigThreshold, pks) if _, err := kb.SaveMultisig(name, &pk); err != nil { return err } diff --git a/client/keys/show.go b/client/keys/show.go index d8f6dbeac8e9..0f522e061c8f 100644 --- a/client/keys/show.go +++ b/client/keys/show.go @@ -83,7 +83,7 @@ func runShowCmd(cmd *cobra.Command, args []string) (err error) { return err } - multikey := multisig.NewLegacyAminoMultisigThresholdPubKey(multisigThreshold, pks) + multikey := multisig.NewLegacyAminoPubKey(multisigThreshold, pks) info = keyring.NewMultiInfo(defaultMultiSigKeyName, &multikey) } diff --git a/client/keys/show_test.go b/client/keys/show_test.go index c31ce8f4d073..c3b90950ce1a 100644 --- a/client/keys/show_test.go +++ b/client/keys/show_test.go @@ -19,7 +19,7 @@ import ( func Test_multiSigKey_Properties(t *testing.T) { tmpKey1 := secp256k1.GenPrivKeyFromSecret([]byte("mySecret")) - pk := multisig.NewLegacyAminoMultisigThresholdPubKey( + pk := multisig.NewLegacyAminoPubKey( 1, []crypto.PubKey{tmpKey1.PubKey()}, ) diff --git a/crypto/keyring/info.go b/crypto/keyring/info.go index d5a53ec1eee8..6bb7b60a8a20 100644 --- a/crypto/keyring/info.go +++ b/crypto/keyring/info.go @@ -192,7 +192,7 @@ type multiInfo struct { // NewMultiInfo creates a new multiInfo instance func NewMultiInfo(name string, pub crypto.PubKey) Info { - multiPK := pub.(*multisig.LegacyAminoMultisigThresholdPubKey) + multiPK := pub.(*multisig.LegacyAminoPubKey) pubKeys := make([]multisigPubKeyInfo, len(multiPK.PubKeys)) for i, pk := range multiPK.GetPubKeys() { @@ -203,7 +203,7 @@ func NewMultiInfo(name string, pub crypto.PubKey) Info { return &multiInfo{ Name: name, PubKey: pub, - Threshold: uint(multiPK.K), + Threshold: uint(multiPK.Threshold), PubKeys: pubKeys, } } @@ -240,7 +240,7 @@ func (i multiInfo) GetPath() (*hd.BIP44Params, error) { // UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces func (i multiInfo) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { - multiPK := i.PubKey.(*multisig.LegacyAminoMultisigThresholdPubKey) + multiPK := i.PubKey.(*multisig.LegacyAminoPubKey) err := codectypes.UnpackInterfaces(multiPK, unpacker) if err != nil { return err diff --git a/crypto/keyring/keyring_test.go b/crypto/keyring/keyring_test.go index 319853654414..7cfd9a04f521 100644 --- a/crypto/keyring/keyring_test.go +++ b/crypto/keyring/keyring_test.go @@ -390,7 +390,7 @@ func TestInMemoryLanguage(t *testing.T) { func TestInMemoryCreateMultisig(t *testing.T) { kb, err := New("keybasename", "memory", "", nil) require.NoError(t, err) - multi := multisig.NewLegacyAminoMultisigThresholdPubKey( + multi := multisig.NewLegacyAminoPubKey( 1, []tmcrypto.PubKey{ secp256k1.GenPrivKey().PubKey(), }, @@ -981,11 +981,11 @@ func TestAltKeyring_SaveMultisig(t *testing.T) { require.NoError(t, err) key := "multi" - pub := multisig.NewLegacyAminoMultisigThresholdPubKey( + pub := multisig.NewLegacyAminoPubKey( 2, []tmcrypto.PubKey{ - &secp256k1.PubKey{Key: mnemonic1.GetPubKey()}, - &secp256k1.PubKey{Key: mnemonic2.GetPubKey()}, + &secp256k1.PubKey{Key: mnemonic1.GetPubKey().Bytes()}, + &secp256k1.PubKey{Key: mnemonic2.GetPubKey().Bytes()}, }, ) diff --git a/crypto/keys/multisig/multisig.go b/crypto/keys/multisig/multisig.go index 6c53c3960494..a108801ac094 100644 --- a/crypto/keys/multisig/multisig.go +++ b/crypto/keys/multisig/multisig.go @@ -17,10 +17,11 @@ import ( var cdc = codec.NewProtoCodec(types.NewInterfaceRegistry()) var _ multisig.PubKey = &LegacyAminoPubKey{} +var _ types.UnpackInterfacesMessage = &LegacyAminoPubKey{} -// NewLegacyAminoMultisigThresholdPubKey returns a new LegacyAminoMultisigThresholdPubKey. +// NewLegacyAminoPubKey returns a new LegacyAminoPubKey. // Panics if len(pubKeys) < k or 0 >= k. -func NewLegacyAminoMultisigThresholdPubKey(k int, pubKeys []tmcrypto.PubKey) LegacyAminoMultisigThresholdPubKey { +func NewLegacyAminoPubKey(k int, pubKeys []tmcrypto.PubKey) LegacyAminoPubKey { if k <= 0 { panic("threshold k of n multisignature: k <= 0") } @@ -31,7 +32,7 @@ func NewLegacyAminoMultisigThresholdPubKey(k int, pubKeys []tmcrypto.PubKey) Leg if err != nil { panic(err) } - return LegacyAminoMultisigThresholdPubKey{K: uint32(k), PubKeys: anyPubKeys} + return LegacyAminoPubKey{Threshold: uint32(k), PubKeys: anyPubKeys} } // Address implements crypto.PubKey Address method @@ -145,7 +146,7 @@ func (m *LegacyAminoPubKey) Type() string { } // UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces -func (m *LegacyAminoMultisigThresholdPubKey) UnpackInterfaces(unpacker types.AnyUnpacker) error { +func (m *LegacyAminoPubKey) UnpackInterfaces(unpacker types.AnyUnpacker) error { for _, any := range m.PubKeys { var pk crypto.PubKey err := unpacker.UnpackAny(any, &pk) diff --git a/crypto/keys/multisig/multisig_test.go b/crypto/keys/multisig/multisig_test.go index 3a0a50dd4678..3ee021c0f012 100644 --- a/crypto/keys/multisig/multisig_test.go +++ b/crypto/keys/multisig/multisig_test.go @@ -102,7 +102,7 @@ func TestVerifyMultisignature(t *testing.T) { "wrong size for sig bit array", func() { pubKeys, _ := generatePubKeysAndSignatures(3, msg) - anyPubKeys, err := keys.packPubKeys(pubKeys) + anyPubKeys, err := packPubKeys(pubKeys) require.NoError(t, err) pk = &LegacyAminoPubKey{Threshold: 3, PubKeys: anyPubKeys} sig = multisig.NewMultisig(1) @@ -115,7 +115,7 @@ func TestVerifyMultisignature(t *testing.T) { k := 2 signingIndices := []int{0, 3, 1} pubKeys, sigs := generatePubKeysAndSignatures(5, msg) - anyPubKeys, err := keys.packPubKeys(pubKeys) + anyPubKeys, err := packPubKeys(pubKeys) require.NoError(t, err) pk = &LegacyAminoPubKey{Threshold: uint32(k), PubKeys: anyPubKeys} sig = multisig.NewMultisig(len(pubKeys)) @@ -198,14 +198,14 @@ func generateNestedMultiSignature(n int, msg []byte) (multisig.PubKey, *signing. Signatures: nestedSigs, } signatures[i] = nestedSig - anyNestedPks, err := keys.packPubKeys(nestedPks) + anyNestedPks, err := packPubKeys(nestedPks) if err != nil { return nil, nil, err } pubKeys[i] = &LegacyAminoPubKey{Threshold: 5, PubKeys: anyNestedPks} bitArray.SetIndex(i, true) } - anyPubKeys, err := keys.packPubKeys(pubKeys) + anyPubKeys, err := packPubKeys(pubKeys) if err != nil { return nil, nil, err } diff --git a/x/auth/ante/basic.go b/x/auth/ante/basic.go index 6339579167c9..b73b95656f04 100644 --- a/x/auth/ante/basic.go +++ b/x/auth/ante/basic.go @@ -136,7 +136,7 @@ func (cgts ConsumeTxSizeGasDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, sim // If the pubkey is a multi-signature pubkey, then we estimate for the maximum // number of signers. - if _, ok := pubkey.(*multisig.LegacyAminoMultisigThresholdPubKey); ok { + if _, ok := pubkey.(*multisig.LegacyAminoPubKey); ok { cost *= params.TxSigLimit } diff --git a/x/auth/client/cli/tx_multisign.go b/x/auth/client/cli/tx_multisign.go index 3a1488b5cb8c..e3ef24b42eec 100644 --- a/x/auth/client/cli/tx_multisign.go +++ b/x/auth/client/cli/tx_multisign.go @@ -98,7 +98,7 @@ func makeMultiSignCmd() func(cmd *cobra.Command, args []string) error { return fmt.Errorf("%q must be of type %s: %s", args[1], keyring.TypeMulti, multisigInfo.GetType()) } - multisigPub := multisigInfo.GetPubKey().(*kmultisig.LegacyAminoMultisigThresholdPubKey) + multisigPub := multisigInfo.GetPubKey().(*kmultisig.LegacyAminoPubKey) multisigSig := multisig.NewMultisig(len(multisigPub.PubKeys)) if !clientCtx.Offline { accnum, seq, err := clientCtx.AccountRetriever.GetAccountNumberSequence(clientCtx, multisigInfo.GetAddress()) diff --git a/x/auth/types/stdtx.go b/x/auth/types/stdtx.go index fb4f56a5b267..34933819171f 100644 --- a/x/auth/types/stdtx.go +++ b/x/auth/types/stdtx.go @@ -117,7 +117,7 @@ func (ss StdSignature) MarshalYAML() (interface{}, error) { // CountSubKeys counts the total number of keys for a multi-sig public key. func CountSubKeys(pub crypto.PubKey) int { - v, ok := pub.(*kmultisig.LegacyAminoMultisigThresholdPubKey) + v, ok := pub.(*kmultisig.LegacyAminoPubKey) if !ok { return 1 } From 9e0a4bb2293dc8547e80a151b08ea6a7c0370d39 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Tue, 15 Sep 2020 14:06:02 +0200 Subject: [PATCH 065/128] Uncomment tests --- client/keys/show_test.go | 78 ++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/client/keys/show_test.go b/client/keys/show_test.go index c3b90950ce1a..3a81fa2e545c 100644 --- a/client/keys/show_test.go +++ b/client/keys/show_test.go @@ -71,45 +71,45 @@ func Test_runShowCmd(t *testing.T) { require.NoError(t, err) // Now try single key - // cmd.SetArgs([]string{ - // fakeKeyName1, - // fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome), - // fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), - // fmt.Sprintf("--%s=", FlagBechPrefix), - // }) - // require.EqualError(t, cmd.Execute(), "invalid Bech32 prefix encoding provided: ") - - // cmd.SetArgs([]string{ - // fakeKeyName1, - // fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome), - // fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), - // fmt.Sprintf("--%s=%s", FlagBechPrefix, sdk.PrefixAccount), - // }) - - // // try fetch by name - // require.NoError(t, cmd.Execute()) - - // // try fetch by addr - // info, err := kb.Key(fakeKeyName1) - // cmd.SetArgs([]string{ - // info.GetAddress().String(), - // fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome), - // fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), - // fmt.Sprintf("--%s=%s", FlagBechPrefix, sdk.PrefixAccount), - // }) - - // require.NoError(t, err) - // require.NoError(t, cmd.Execute()) - - // // Now try multisig key - set bech to acc - // cmd.SetArgs([]string{ - // fakeKeyName1, fakeKeyName2, - // fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome), - // fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), - // fmt.Sprintf("--%s=%s", FlagBechPrefix, sdk.PrefixAccount), - // fmt.Sprintf("--%s=0", flagMultiSigThreshold), - // }) - // require.EqualError(t, cmd.Execute(), "threshold must be a positive integer") + cmd.SetArgs([]string{ + fakeKeyName1, + fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome), + fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), + fmt.Sprintf("--%s=", FlagBechPrefix), + }) + require.EqualError(t, cmd.Execute(), "invalid Bech32 prefix encoding provided: ") + + cmd.SetArgs([]string{ + fakeKeyName1, + fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome), + fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), + fmt.Sprintf("--%s=%s", FlagBechPrefix, sdk.PrefixAccount), + }) + + // try fetch by name + require.NoError(t, cmd.Execute()) + + // try fetch by addr + info, err := kb.Key(fakeKeyName1) + cmd.SetArgs([]string{ + info.GetAddress().String(), + fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome), + fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), + fmt.Sprintf("--%s=%s", FlagBechPrefix, sdk.PrefixAccount), + }) + + require.NoError(t, err) + require.NoError(t, cmd.Execute()) + + // Now try multisig key - set bech to acc + cmd.SetArgs([]string{ + fakeKeyName1, fakeKeyName2, + fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome), + fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest), + fmt.Sprintf("--%s=%s", FlagBechPrefix, sdk.PrefixAccount), + fmt.Sprintf("--%s=0", flagMultiSigThreshold), + }) + require.EqualError(t, cmd.Execute(), "threshold must be a positive integer") cmd.SetArgs([]string{ fakeKeyName1, fakeKeyName2, From f2dafe727becc105d3b7c68ed1d6f7e72b67b922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?colin=20axn=C3=A9r?= <25233464+colin-axner@users.noreply.github.com> Date: Tue, 15 Sep 2020 16:04:41 +0200 Subject: [PATCH 066/128] Update x/ibc/testing/solomachine.go --- x/ibc/testing/solomachine.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/ibc/testing/solomachine.go b/x/ibc/testing/solomachine.go index 412e0f644f03..547ab5a91a7d 100644 --- a/x/ibc/testing/solomachine.go +++ b/x/ibc/testing/solomachine.go @@ -74,7 +74,7 @@ func (solo *Solomachine) CreateHeader() *solomachinetypes.Header { // generate new private key and signature for header newPrivKey := secp256k1.GenPrivKey() - publicKey, err := tx.PubKeyToAny(solo.PublicKey) + publicKey, err := tx.PubKeyToAny(newPrivKey.PubKey()) require.NoError(solo.t, err) data := &solomachinetypes.HeaderData{ From e5778a01c570d213e0226f86ac84bfb65b129447 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Tue, 15 Sep 2020 16:14:34 +0200 Subject: [PATCH 067/128] UnpackInterfaces for solomachine types --- .../solomachine/types/solomachine.go | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 x/ibc/light-clients/solomachine/types/solomachine.go diff --git a/x/ibc/light-clients/solomachine/types/solomachine.go b/x/ibc/light-clients/solomachine/types/solomachine.go new file mode 100644 index 000000000000..23033c118c36 --- /dev/null +++ b/x/ibc/light-clients/solomachine/types/solomachine.go @@ -0,0 +1,47 @@ +package types + +import ( + "github.com/tendermint/tendermint/crypto" + + codectypes "github.com/cosmos/cosmos-sdk/codec/types" +) + +var _, _, _, _ codectypes.UnpackInterfacesMessage = &ClientState{}, &ConsensusState{}, &Header{}, &HeaderData{} + +// UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method +func (cs *ClientState) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { + return cs.ConsensusState.UnpackInterfaces(unpacker) +} + +// UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method +func (cs *ConsensusState) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { + var pubKey crypto.PubKey + err := unpacker.UnpackAny(cs.PublicKey, &pubKey) + if err != nil { + return err + } + + return nil +} + +// UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method +func (h *Header) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { + var pubKey crypto.PubKey + err := unpacker.UnpackAny(h.NewPublicKey, &pubKey) + if err != nil { + return err + } + + return nil +} + +// UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method +func (hd *HeaderData) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { + var pubKey crypto.PubKey + err := unpacker.UnpackAny(hd.NewPubKey, &pubKey) + if err != nil { + return err + } + + return nil +} From 0a47ff339bd6ece7b6db2d56e003e332d380b912 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Tue, 15 Sep 2020 16:33:10 +0200 Subject: [PATCH 068/128] Remove old multisig --- client/keys/add.go | 2 +- client/keys/show.go | 2 +- client/keys/show_test.go | 2 +- crypto/codec/amino.go | 14 +- crypto/keyring/keyring_test.go | 4 +- crypto/keyring/output_test.go | 4 +- crypto/keys/multisig/multisig.go | 18 +- crypto/types/multisig/codec.go | 30 -- crypto/types/multisig/threshold_pubkey.go | 164 --------- .../types/multisig/threshold_pubkey_test.go | 311 ------------------ std/pubkey.go | 14 +- std/pubkey_test.go | 14 +- x/auth/ante/ante_test.go | 10 +- x/auth/ante/sigverify_test.go | 3 +- x/auth/client/cli/cli_test.go | 4 +- x/auth/signing/verify_test.go | 3 +- x/auth/testutil/suite.go | 9 +- x/auth/types/stdtx_test.go | 4 +- 18 files changed, 52 insertions(+), 560 deletions(-) delete mode 100644 crypto/types/multisig/codec.go delete mode 100644 crypto/types/multisig/threshold_pubkey.go delete mode 100644 crypto/types/multisig/threshold_pubkey_test.go diff --git a/client/keys/add.go b/client/keys/add.go index a2bd2b494828..0be9b4970f68 100644 --- a/client/keys/add.go +++ b/client/keys/add.go @@ -175,7 +175,7 @@ func RunAddCmd(cmd *cobra.Command, args []string, kb keyring.Keyring, inBuf *buf } pk := multisig.NewLegacyAminoPubKey(multisigThreshold, pks) - if _, err := kb.SaveMultisig(name, &pk); err != nil { + if _, err := kb.SaveMultisig(name, pk); err != nil { return err } diff --git a/client/keys/show.go b/client/keys/show.go index 0f522e061c8f..ffc30342bf14 100644 --- a/client/keys/show.go +++ b/client/keys/show.go @@ -84,7 +84,7 @@ func runShowCmd(cmd *cobra.Command, args []string) (err error) { } multikey := multisig.NewLegacyAminoPubKey(multisigThreshold, pks) - info = keyring.NewMultiInfo(defaultMultiSigKeyName, &multikey) + info = keyring.NewMultiInfo(defaultMultiSigKeyName, multikey) } isShowAddr, _ := cmd.Flags().GetBool(FlagAddress) diff --git a/client/keys/show_test.go b/client/keys/show_test.go index 3a81fa2e545c..9760b92d7099 100644 --- a/client/keys/show_test.go +++ b/client/keys/show_test.go @@ -23,7 +23,7 @@ func Test_multiSigKey_Properties(t *testing.T) { 1, []crypto.PubKey{tmpKey1.PubKey()}, ) - tmp := keyring.NewMultiInfo("myMultisig", &pk) + tmp := keyring.NewMultiInfo("myMultisig", pk) require.Equal(t, "myMultisig", tmp.GetName()) require.Equal(t, keyring.TypeMulti, tmp.GetType()) diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index abc33137787d..4b2afb9ad486 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -8,7 +8,6 @@ import ( "github.com/cosmos/cosmos-sdk/codec" kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" ) var amino *codec.LegacyAmino @@ -18,6 +17,12 @@ func init() { RegisterCrypto(amino) } +// TODO: Figure out API for others to either add their own pubkey types, or +// to make verify / marshal accept a Cdc. +const ( + PubKeyAminoRoute = "tendermint/PubKeyMultisigThreshold" +) + // RegisterCrypto registers all crypto dependency types with the provided Amino // codec. func RegisterCrypto(cdc *codec.LegacyAmino) { @@ -28,13 +33,8 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { sr25519.PubKeyName, nil) cdc.RegisterConcrete(&secp256k1.PubKey{}, secp256k1.PubKeyName, nil) - // TODO Follow-up in https://github.com/cosmos/cosmos-sdk/pull/7284 - // Remove `multisig.PubKeyMultisigThreshold{}`, and register instead - // kmultisig.LegacyAminoPubKey{} on `PubKeyAminoRoute`. - cdc.RegisterConcrete(multisig.PubKeyMultisigThreshold{}, - multisig.PubKeyAminoRoute, nil) cdc.RegisterConcrete(&kmultisig.LegacyAminoPubKey{}, - "cosmos-sdk/LegacyAminoPubKey", nil) + PubKeyAminoRoute, nil) cdc.RegisterInterface((*crypto.PrivKey)(nil), nil) cdc.RegisterConcrete(ed25519.PrivKey{}, diff --git a/crypto/keyring/keyring_test.go b/crypto/keyring/keyring_test.go index 7cfd9a04f521..c01a9a32e395 100644 --- a/crypto/keyring/keyring_test.go +++ b/crypto/keyring/keyring_test.go @@ -395,7 +395,7 @@ func TestInMemoryCreateMultisig(t *testing.T) { secp256k1.GenPrivKey().PubKey(), }, ) - _, err = kb.SaveMultisig("multi", &multi) + _, err = kb.SaveMultisig("multi", multi) require.NoError(t, err) } @@ -989,7 +989,7 @@ func TestAltKeyring_SaveMultisig(t *testing.T) { }, ) - info, err := keyring.SaveMultisig(key, &pub) + info, err := keyring.SaveMultisig(key, pub) require.Nil(t, err) require.Equal(t, &pub, info.GetPubKey()) require.Equal(t, key, info.GetName()) diff --git a/crypto/keyring/output_test.go b/crypto/keyring/output_test.go index dd92a0e1d0eb..dc98ad62bc8a 100644 --- a/crypto/keyring/output_test.go +++ b/crypto/keyring/output_test.go @@ -6,8 +6,8 @@ import ( "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto" + kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -16,7 +16,7 @@ func TestBech32KeysOutput(t *testing.T) { bechTmpKey := sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, tmpKey) tmpAddr := sdk.AccAddress(tmpKey.Address().Bytes()) - multisigPks := multisig.NewPubKeyMultisigThreshold(1, []crypto.PubKey{tmpKey}) + multisigPks := kmultisig.NewLegacyAminoPubKey(1, []crypto.PubKey{tmpKey}) multiInfo := NewMultiInfo("multisig", multisigPks) accAddr := sdk.AccAddress(multiInfo.GetPubKey().Address().Bytes()) bechPubKey := sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, multiInfo.GetPubKey()) diff --git a/crypto/keys/multisig/multisig.go b/crypto/keys/multisig/multisig.go index a108801ac094..73d8d41ebfc7 100644 --- a/crypto/keys/multisig/multisig.go +++ b/crypto/keys/multisig/multisig.go @@ -11,17 +11,17 @@ import ( "github.com/cosmos/cosmos-sdk/types/tx/signing" tmcrypto "github.com/tendermint/tendermint/crypto" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" + multisigtypes "github.com/cosmos/cosmos-sdk/crypto/types/multisig" ) var cdc = codec.NewProtoCodec(types.NewInterfaceRegistry()) -var _ multisig.PubKey = &LegacyAminoPubKey{} +var _ multisigtypes.PubKey = &LegacyAminoPubKey{} var _ types.UnpackInterfacesMessage = &LegacyAminoPubKey{} // NewLegacyAminoPubKey returns a new LegacyAminoPubKey. // Panics if len(pubKeys) < k or 0 >= k. -func NewLegacyAminoPubKey(k int, pubKeys []tmcrypto.PubKey) LegacyAminoPubKey { +func NewLegacyAminoPubKey(k int, pubKeys []tmcrypto.PubKey) *LegacyAminoPubKey { if k <= 0 { panic("threshold k of n multisignature: k <= 0") } @@ -32,11 +32,11 @@ func NewLegacyAminoPubKey(k int, pubKeys []tmcrypto.PubKey) LegacyAminoPubKey { if err != nil { panic(err) } - return LegacyAminoPubKey{Threshold: uint32(k), PubKeys: anyPubKeys} + return &LegacyAminoPubKey{Threshold: uint32(k), PubKeys: anyPubKeys} } // Address implements crypto.PubKey Address method -func (m *LegacyAminoPubKey) Address() crypto.Address { +func (m *LegacyAminoPubKey) Address() tmcrypto.Address { return tmcrypto.AddressHash(m.Bytes()) } @@ -45,8 +45,8 @@ func (m *LegacyAminoPubKey) Bytes() []byte { return cdc.MustMarshalBinaryBare(m) } -// VerifyMultisignature implements the multisig.PubKey VerifyMultisignature method -func (m *LegacyAminoPubKey) VerifyMultisignature(getSignBytes multisig.GetSignBytesFunc, sig *signing.MultiSignatureData) error { +// VerifyMultisignature implements the multisigtypes.PubKey VerifyMultisignature method +func (m *LegacyAminoPubKey) VerifyMultisignature(getSignBytes multisigtypes.GetSignBytesFunc, sig *signing.MultiSignatureData) error { bitarray := sig.BitArray sigs := sig.Signatures size := bitarray.Count() @@ -78,7 +78,7 @@ func (m *LegacyAminoPubKey) VerifyMultisignature(getSignBytes multisig.GetSignBy return err } case *signing.MultiSignatureData: - nestedMultisigPk, ok := pubKeys[i].(multisig.PubKey) + nestedMultisigPk, ok := pubKeys[i].(multisigtypes.PubKey) if !ok { return fmt.Errorf("unable to parse pubkey of index %d", i) } @@ -117,7 +117,7 @@ func (m *LegacyAminoPubKey) GetPubKeys() []tmcrypto.PubKey { // Equals returns true if m and other both have the same number of keys, and // all constituent keys are the same, and in the same order. func (m *LegacyAminoPubKey) Equals(key tmcrypto.PubKey) bool { - otherKey, ok := key.(multisig.PubKey) + otherKey, ok := key.(multisigtypes.PubKey) if !ok { return false } diff --git a/crypto/types/multisig/codec.go b/crypto/types/multisig/codec.go deleted file mode 100644 index 8358cb55265a..000000000000 --- a/crypto/types/multisig/codec.go +++ /dev/null @@ -1,30 +0,0 @@ -package multisig - -import ( - amino "github.com/tendermint/go-amino" - "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" - "github.com/tendermint/tendermint/crypto/sr25519" - - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" -) - -// TODO: Figure out API for others to either add their own pubkey types, or -// to make verify / marshal accept a Cdc. -const ( - PubKeyAminoRoute = "tendermint/PubKeyMultisigThreshold" -) - -var Cdc = amino.NewCodec() - -func init() { - Cdc.RegisterInterface((*crypto.PubKey)(nil), nil) - Cdc.RegisterConcrete(PubKeyMultisigThreshold{}, - PubKeyAminoRoute, nil) - Cdc.RegisterConcrete(ed25519.PubKey{}, - ed25519.PubKeyName, nil) - Cdc.RegisterConcrete(sr25519.PubKey{}, - sr25519.PubKeyName, nil) - Cdc.RegisterConcrete(&secp256k1.PubKey{}, - secp256k1.PubKeyName, nil) -} diff --git a/crypto/types/multisig/threshold_pubkey.go b/crypto/types/multisig/threshold_pubkey.go deleted file mode 100644 index 7a3c410b7b30..000000000000 --- a/crypto/types/multisig/threshold_pubkey.go +++ /dev/null @@ -1,164 +0,0 @@ -package multisig - -import ( - "fmt" - - "github.com/tendermint/tendermint/crypto" - - "github.com/cosmos/cosmos-sdk/types/tx/signing" -) - -// PubKeyMultisigThreshold implements a K of N threshold multisig. -type PubKeyMultisigThreshold struct { - K uint `json:"threshold"` - PubKeys []crypto.PubKey `json:"pubkeys"` -} - -var _ PubKey = PubKeyMultisigThreshold{} - -// NewPubKeyMultisigThreshold returns a new PubKeyMultisigThreshold. -// Panics if len(pubkeys) < k or 0 >= k. -func NewPubKeyMultisigThreshold(k int, pubkeys []crypto.PubKey) PubKey { - if k <= 0 { - panic("threshold k of n multisignature: k <= 0") - } - if len(pubkeys) < k { - panic("threshold k of n multisignature: len(pubkeys) < k") - } - for _, pubkey := range pubkeys { - if pubkey == nil { - panic("nil pubkey") - } - } - return PubKeyMultisigThreshold{uint(k), pubkeys} -} - -// VerifySignature expects sig to be an amino encoded version of a MultiSignature. -// Returns true iff the multisignature contains k or more signatures -// for the correct corresponding keys, -// and all signatures are valid. (Not just k of the signatures) -// The multisig uses a bitarray, so multiple signatures for the same key is not -// a concern. -// -// NOTE: VerifyMultisignature should preferred to VerifySignature which only works -// with amino multisignatures. -func (pk PubKeyMultisigThreshold) VerifySignature(msg []byte, marshalledSig []byte) bool { - var sig AminoMultisignature - err := Cdc.UnmarshalBinaryBare(marshalledSig, &sig) - if err != nil { - return false - } - size := sig.BitArray.Count() - // ensure bit array is the correct size - if len(pk.PubKeys) != size { - return false - } - // ensure size of signature list - if len(sig.Sigs) < int(pk.K) || len(sig.Sigs) > size { - return false - } - // ensure at least k signatures are set - if sig.BitArray.NumTrueBitsBefore(size) < int(pk.K) { - return false - } - // index in the list of signatures which we are concerned with. - sigIndex := 0 - for i := 0; i < size; i++ { - if sig.BitArray.GetIndex(i) { - if !pk.PubKeys[i].VerifySignature(msg, sig.Sigs[sigIndex]) { - return false - } - sigIndex++ - } - } - return true -} - -// VerifyMultisignature implements the PubKey.VerifyMultisignature method -func (pk PubKeyMultisigThreshold) VerifyMultisignature(getSignBytes GetSignBytesFunc, sig *signing.MultiSignatureData) error { - bitarray := sig.BitArray - sigs := sig.Signatures - size := bitarray.Count() - // ensure bit array is the correct size - if len(pk.PubKeys) != size { - return fmt.Errorf("bit array size is incorrect %d", len(pk.PubKeys)) - } - // ensure size of signature list - if len(sigs) < int(pk.K) || len(sigs) > size { - return fmt.Errorf("signature size is incorrect %d", len(sigs)) - } - // ensure at least k signatures are set - if bitarray.NumTrueBitsBefore(size) < int(pk.K) { - return fmt.Errorf("minimum number of signatures not set, have %d, expected %d", bitarray.NumTrueBitsBefore(size), int(pk.K)) - } - // index in the list of signatures which we are concerned with. - sigIndex := 0 - for i := 0; i < size; i++ { - if bitarray.GetIndex(i) { - si := sig.Signatures[sigIndex] - switch si := si.(type) { - case *signing.SingleSignatureData: - msg, err := getSignBytes(si.SignMode) - if err != nil { - return err - } - if !pk.PubKeys[i].VerifySignature(msg, si.Signature) { - return err - } - case *signing.MultiSignatureData: - nestedMultisigPk, ok := pk.PubKeys[i].(PubKey) - if !ok { - return fmt.Errorf("unable to parse pubkey of index %d", i) - } - if err := nestedMultisigPk.VerifyMultisignature(getSignBytes, si); err != nil { - return err - } - default: - return fmt.Errorf("improper signature data type for index %d", sigIndex) - } - sigIndex++ - } - } - return nil -} - -// GetPubKeys implements the PubKey.GetPubKeys method -func (pk PubKeyMultisigThreshold) GetPubKeys() []crypto.PubKey { - return pk.PubKeys -} - -// Bytes returns the amino encoded version of the PubKeyMultisigThreshold -func (pk PubKeyMultisigThreshold) Bytes() []byte { - return Cdc.MustMarshalBinaryBare(pk) -} - -// Address returns tmhash(PubKeyMultisigThreshold.Bytes()) -func (pk PubKeyMultisigThreshold) Address() crypto.Address { - return crypto.AddressHash(pk.Bytes()) -} - -// Equals returns true iff pk and other both have the same number of keys, and -// all constituent keys are the same, and in the same order. -func (pk PubKeyMultisigThreshold) Equals(other crypto.PubKey) bool { - otherKey, sameType := other.(PubKey) - if !sameType { - return false - } - otherPubKeys := otherKey.GetPubKeys() - if pk.GetThreshold() != otherKey.GetThreshold() || len(pk.PubKeys) != len(otherPubKeys) { - return false - } - for i := 0; i < len(pk.PubKeys); i++ { - if !pk.PubKeys[i].Equals(otherPubKeys[i]) { - return false - } - } - return true -} - -// GetThreshold implements the PubKey.GetThreshold method -func (pk PubKeyMultisigThreshold) GetThreshold() uint { - return pk.K -} - -func (pk PubKeyMultisigThreshold) Type() string { return "PubKeyMultisigThreshold" } diff --git a/crypto/types/multisig/threshold_pubkey_test.go b/crypto/types/multisig/threshold_pubkey_test.go deleted file mode 100644 index 4d753675cf77..000000000000 --- a/crypto/types/multisig/threshold_pubkey_test.go +++ /dev/null @@ -1,311 +0,0 @@ -package multisig_test - -import ( - "math/rand" - "testing" - - proto "github.com/gogo/protobuf/proto" - "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" - "github.com/tendermint/tendermint/crypto/sr25519" - - "github.com/cosmos/cosmos-sdk/codec" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - - kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" - "github.com/cosmos/cosmos-sdk/types/tx/signing" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" -) - -// This tests multisig functionality, but it expects the first k signatures to be valid -// TODO: Adapt it to give more flexibility about first k signatures being valid -func TestThresholdMultisigValidCases(t *testing.T) { - pkSet1, sigSet1 := generatePubKeysAndSignatures(5, []byte{1, 2, 3, 4}) - cases := []struct { - msg []byte - k int - pubkeys []crypto.PubKey - signingIndices []int - // signatures should be the same size as signingIndices. - signatures []signing.SignatureData - passAfterKSignatures []bool - }{ - { - msg: []byte{1, 2, 3, 4}, - k: 2, - pubkeys: pkSet1, - signingIndices: []int{0, 3, 1}, - signatures: sigSet1, - passAfterKSignatures: []bool{false}, - }, - } - for tcIndex, tc := range cases { - multisigKey := multisig.NewPubKeyMultisigThreshold(tc.k, tc.pubkeys) - multisignature := multisig.NewMultisig(len(tc.pubkeys)) - signBytesFn := func(mode signing.SignMode) ([]byte, error) { return tc.msg, nil } - - for i := 0; i < tc.k-1; i++ { - signingIndex := tc.signingIndices[i] - require.NoError( - t, - multisig.AddSignatureFromPubKey(multisignature, tc.signatures[signingIndex], tc.pubkeys[signingIndex], tc.pubkeys), - ) - require.Error( - t, - multisigKey.VerifyMultisignature(signBytesFn, multisignature), - "multisig passed when i < k, tc %d, i %d", tcIndex, i, - ) - require.NoError( - t, - multisig.AddSignatureFromPubKey(multisignature, tc.signatures[signingIndex], tc.pubkeys[signingIndex], tc.pubkeys), - ) - require.Equal( - t, - i+1, - len(multisignature.Signatures), - "adding a signature for the same pubkey twice increased signature count by 2, tc %d", tcIndex, - ) - } - require.Error( - t, - multisigKey.VerifyMultisignature(signBytesFn, multisignature), - "multisig passed with k - 1 sigs, tc %d", tcIndex, - ) - require.NoError( - t, - multisig.AddSignatureFromPubKey( - multisignature, - tc.signatures[tc.signingIndices[tc.k]], - tc.pubkeys[tc.signingIndices[tc.k]], - tc.pubkeys, - ), - ) - require.NoError( - t, - multisigKey.VerifyMultisignature(signBytesFn, multisignature), - "multisig failed after k good signatures, tc %d", tcIndex, - ) - - for i := tc.k + 1; i < len(tc.signingIndices); i++ { - signingIndex := tc.signingIndices[i] - - require.NoError( - t, - multisig.AddSignatureFromPubKey(multisignature, tc.signatures[signingIndex], tc.pubkeys[signingIndex], tc.pubkeys), - ) - require.Equal( - t, - tc.passAfterKSignatures[i-(tc.k)-1], - multisigKey.VerifyMultisignature(func(mode signing.SignMode) ([]byte, error) { - return tc.msg, nil - }, multisignature), - "multisig didn't verify as expected after k sigs, tc %d, i %d", tcIndex, i, - ) - require.NoError( - t, - multisig.AddSignatureFromPubKey(multisignature, tc.signatures[signingIndex], tc.pubkeys[signingIndex], tc.pubkeys), - ) - require.Equal( - t, - i+1, - len(multisignature.Signatures), - "adding a signature for the same pubkey twice increased signature count by 2, tc %d", tcIndex, - ) - } - } -} - -// TODO: Fully replace this test with table driven tests -func TestThresholdMultisigDuplicateSignatures(t *testing.T) { - msg := []byte{1, 2, 3, 4, 5} - pubkeys, sigs := generatePubKeysAndSignatures(5, msg) - multisigKey := multisig.NewPubKeyMultisigThreshold(2, pubkeys) - multisignature := multisig.NewMultisig(5) - signBytesFn := func(mode signing.SignMode) ([]byte, error) { return msg, nil } - - require.Error(t, multisigKey.VerifyMultisignature(signBytesFn, multisignature)) - multisig.AddSignatureFromPubKey(multisignature, sigs[0], pubkeys[0], pubkeys) - // Add second signature manually - multisignature.Signatures = append(multisignature.Signatures, sigs[0]) - require.Error(t, multisigKey.VerifyMultisignature(signBytesFn, multisignature)) -} - -func TestMultiSigPubKeyEquality(t *testing.T) { - pubKey1 := secp256k1.GenPrivKey().PubKey() - pubKey2 := secp256k1.GenPrivKey().PubKey() - pubkeys := []crypto.PubKey{pubKey1, pubKey2} - multisigKey := multisig.NewPubKeyMultisigThreshold(2, pubkeys) - var other multisig.PubKey - - testCases := []struct { - msg string - malleate func() - expectEq bool - }{ - { - "equals", - func() { - var otherPubKey multisig.PubKeyMultisigThreshold - multisig.Cdc.MustUnmarshalBinaryBare(multisigKey.Bytes(), &otherPubKey) - other = otherPubKey - }, - true, - }, - { - "ensure that reordering pubkeys is treated as a different pubkey", - func() { - pubkeysCpy := make([]crypto.PubKey, 2) - copy(pubkeysCpy, pubkeys) - pubkeysCpy[0] = pubkeys[1] - pubkeysCpy[1] = pubkeys[0] - other = multisig.NewPubKeyMultisigThreshold(2, pubkeysCpy) - }, - false, - }, - { - "equals with proto pub key", - func() { - anyPubKeys := make([]*codectypes.Any, len(pubkeys)) - - for i := 0; i < len(pubkeys); i++ { - any, err := codectypes.NewAnyWithValue(pubkeys[i].(proto.Message)) - require.NoError(t, err) - anyPubKeys[i] = any - } - other = &kmultisig.LegacyAminoPubKey{Threshold: 2, PubKeys: anyPubKeys} - }, - true, - }, - } - - for _, tc := range testCases { - t.Run(tc.msg, func(t *testing.T) { - tc.malleate() - eq := multisigKey.Equals(other) - require.Equal(t, eq, tc.expectEq) - }) - } -} - -func TestAddress(t *testing.T) { - msg := []byte{1, 2, 3, 4} - pubkeys, _ := generatePubKeysAndSignatures(5, msg) - multisigKey := multisig.NewPubKeyMultisigThreshold(2, pubkeys) - require.Len(t, multisigKey.Address().Bytes(), 20) -} - -func TestPubKeyMultisigThresholdAminoToIface(t *testing.T) { - msg := []byte{1, 2, 3, 4} - pubkeys, _ := generatePubKeysAndSignatures(5, msg) - multisigKey := multisig.NewPubKeyMultisigThreshold(2, pubkeys) - - ab, err := multisig.Cdc.MarshalBinaryLengthPrefixed(multisigKey) - require.NoError(t, err) - // like other crypto.Pubkey implementations (e.g. ed25519.PubKeyMultisigThreshold), - // PubKeyMultisigThreshold should be deserializable into a crypto.PubKeyMultisigThreshold: - var pubKey crypto.PubKey - err = multisig.Cdc.UnmarshalBinaryLengthPrefixed(ab, &pubKey) - require.NoError(t, err) - - require.Equal(t, multisigKey, pubKey) -} - -func TestMultiSignature(t *testing.T) { - msg := []byte{1, 2, 3, 4} - pk, sig := generateNestedMultiSignature(3, msg) - signBytesFn := func(mode signing.SignMode) ([]byte, error) { return msg, nil } - err := pk.VerifyMultisignature(signBytesFn, sig) - require.NoError(t, err) -} - -func TestMultiSigMigration(t *testing.T) { - msg := []byte{1, 2, 3, 4} - pkSet, sigs := generatePubKeysAndSignatures(2, msg) - multisignature := multisig.NewMultisig(2) - - multisigKey := multisig.NewPubKeyMultisigThreshold(2, pkSet) - signBytesFn := func(mode signing.SignMode) ([]byte, error) { return msg, nil } - - cdc := codec.NewLegacyAmino() - - err := multisig.AddSignatureFromPubKey(multisignature, sigs[0], pkSet[0], pkSet) - - // create a StdSignature for msg, and convert it to sigV2 - sig := authtypes.StdSignature{PubKey: pkSet[1], Signature: msg} - sigV2, err := authtypes.StdSignatureToSignatureV2(cdc, sig) - require.NoError(t, multisig.AddSignatureV2(multisignature, sigV2, pkSet)) - - require.NoError(t, err) - require.NotNil(t, sigV2) - - require.NoError(t, multisigKey.VerifyMultisignature(signBytesFn, multisignature)) -} - -func TestAddSignatureFromPubKeyNilCheck(t *testing.T) { - pkSet, sigs := generatePubKeysAndSignatures(5, []byte{1, 2, 3, 4}) - multisignature := multisig.NewMultisig(5) - - //verify no error is returned with all non-nil values - err := multisig.AddSignatureFromPubKey(multisignature, sigs[0], pkSet[0], pkSet) - require.NoError(t, err) - //verify error is returned when key value is nil - err = multisig.AddSignatureFromPubKey(multisignature, sigs[0], pkSet[0], nil) - require.Error(t, err) - //verify error is returned when pubkey value is nil - err = multisig.AddSignatureFromPubKey(multisignature, sigs[0], nil, pkSet) - require.Error(t, err) - //verify error is returned when signature value is nil - err = multisig.AddSignatureFromPubKey(multisignature, nil, pkSet[0], pkSet) - require.Error(t, err) - //verify error is returned when multisignature value is nil - err = multisig.AddSignatureFromPubKey(nil, sigs[0], pkSet[0], pkSet) - require.Error(t, err) -} - -func generatePubKeysAndSignatures(n int, msg []byte) (pubkeys []crypto.PubKey, signatures []signing.SignatureData) { - pubkeys = make([]crypto.PubKey, n) - signatures = make([]signing.SignatureData, n) - for i := 0; i < n; i++ { - var privkey crypto.PrivKey - switch rand.Int63() % 3 { - case 0: - privkey = ed25519.GenPrivKey() - case 1: - privkey = secp256k1.GenPrivKey() - case 2: - privkey = sr25519.GenPrivKey() - } - pubkeys[i] = privkey.PubKey() - sig, _ := privkey.Sign(msg) - signatures[i] = &signing.SingleSignatureData{Signature: sig} - } - return -} - -func generateNestedMultiSignature(n int, msg []byte) (multisig.PubKey, *signing.MultiSignatureData) { - pubkeys := make([]crypto.PubKey, n) - signatures := make([]signing.SignatureData, n) - bitArray := types.NewCompactBitArray(n) - for i := 0; i < n; i++ { - nestedPks, nestedSigs := generatePubKeysAndSignatures(5, msg) - nestedBitArray := types.NewCompactBitArray(5) - for j := 0; j < 5; j++ { - nestedBitArray.SetIndex(j, true) - } - nestedSig := &signing.MultiSignatureData{ - BitArray: nestedBitArray, - Signatures: nestedSigs, - } - signatures[i] = nestedSig - pubkeys[i] = multisig.NewPubKeyMultisigThreshold(5, nestedPks) - bitArray.SetIndex(i, true) - } - return multisig.NewPubKeyMultisigThreshold(n, pubkeys), &signing.MultiSignatureData{ - BitArray: bitArray, - Signatures: signatures, - } -} diff --git a/std/pubkey.go b/std/pubkey.go index 76d5a257a9b4..b928b15fd818 100644 --- a/std/pubkey.go +++ b/std/pubkey.go @@ -7,9 +7,9 @@ import ( "github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/crypto/sr25519" + kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" ) // DefaultPublicKeyCodec implements the standard PublicKeyCodec for the SDK which @@ -19,6 +19,7 @@ type DefaultPublicKeyCodec struct{} var _ types.PublicKeyCodec = DefaultPublicKeyCodec{} // Decode implements the PublicKeyCodec.Decode method +// TODO To be removed in https://github.com/cosmos/cosmos-sdk/pull/7276 func (cdc DefaultPublicKeyCodec) Decode(key *types.PublicKey) (crypto.PubKey, error) { // key being nil is allowed as all fields in proto are optional if key == nil { @@ -67,13 +68,15 @@ func (cdc DefaultPublicKeyCodec) Decode(key *types.PublicKey) (crypto.PubKey, er resKeys[i] = dk } - return multisig.NewPubKeyMultisigThreshold(int(key.Multisig.K), resKeys), nil + return kmultisig.NewLegacyAminoPubKey(int(key.Multisig.K), resKeys), nil default: return nil, fmt.Errorf("can't decode PubKey of type %T. Use a custom PublicKeyCodec instead", key) } } // Encode implements the PublicKeyCodec.Encode method +// TODO To be removed in https://github.com/cosmos/cosmos-sdk/pull/7276 + func (cdc DefaultPublicKeyCodec) Encode(key crypto.PubKey) (*types.PublicKey, error) { if key == nil { return &types.PublicKey{}, nil @@ -85,10 +88,11 @@ func (cdc DefaultPublicKeyCodec) Encode(key crypto.PubKey) (*types.PublicKey, er return &types.PublicKey{Sum: &types.PublicKey_Ed25519{Ed25519: key}}, nil case sr25519.PubKey: return &types.PublicKey{Sum: &types.PublicKey_Sr25519{Sr25519: key}}, nil - case multisig.PubKeyMultisigThreshold: + case *kmultisig.LegacyAminoPubKey: pubKeys := key.PubKeys resKeys := make([]*types.PublicKey, len(pubKeys)) - for i, k := range pubKeys { + for i, any := range pubKeys { + k := any.GetCachedValue().(crypto.PubKey) dk, err := cdc.Encode(k) if err != nil { return nil, err @@ -96,7 +100,7 @@ func (cdc DefaultPublicKeyCodec) Encode(key crypto.PubKey) (*types.PublicKey, er resKeys[i] = dk } return &types.PublicKey{Sum: &types.PublicKey_Multisig{Multisig: &types.PubKeyMultisigThreshold{ - K: uint32(key.K), + K: uint32(key.Threshold), PubKeys: resKeys, }}}, nil default: diff --git a/std/pubkey_test.go b/std/pubkey_test.go index 302ba2238799..cda15459bc3d 100644 --- a/std/pubkey_test.go +++ b/std/pubkey_test.go @@ -5,11 +5,9 @@ import ( "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" - "github.com/tendermint/tendermint/crypto/sr25519" + kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/std" ) @@ -31,14 +29,8 @@ func TestDefaultPublicKeyCodec(t *testing.T) { pubKeySecp256k1 := secp256k1.GenPrivKey().PubKey() roundTripTest(t, pubKeySecp256k1) - pubKeyEd25519 := ed25519.GenPrivKey().PubKey() - roundTripTest(t, pubKeyEd25519) - - pubKeySr25519 := sr25519.GenPrivKey().PubKey() - roundTripTest(t, pubKeySr25519) - - pubKeyMultisig := multisig.NewPubKeyMultisigThreshold(2, []crypto.PubKey{ - pubKeySecp256k1, pubKeyEd25519, pubKeySr25519, + pubKeyMultisig := kmultisig.NewLegacyAminoPubKey(2, []crypto.PubKey{ + pubKeySecp256k1, secp256k1.GenPrivKey().PubKey(), secp256k1.GenPrivKey().PubKey(), }) roundTripTest(t, pubKeyMultisig) } diff --git a/x/auth/ante/ante_test.go b/x/auth/ante/ante_test.go index 84602abcb98f..5a49ebfe07be 100644 --- a/x/auth/ante/ante_test.go +++ b/x/auth/ante/ante_test.go @@ -11,8 +11,8 @@ import ( "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/ed25519" + kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -935,10 +935,10 @@ func TestCountSubkeys(t *testing.T) { return ret } singleKey := secp256k1.GenPrivKey().PubKey() - singleLevelMultiKey := multisig.NewPubKeyMultisigThreshold(4, genPubKeys(5)) - multiLevelSubKey1 := multisig.NewPubKeyMultisigThreshold(4, genPubKeys(5)) - multiLevelSubKey2 := multisig.NewPubKeyMultisigThreshold(4, genPubKeys(5)) - multiLevelMultiKey := multisig.NewPubKeyMultisigThreshold(2, []crypto.PubKey{ + singleLevelMultiKey := kmultisig.NewLegacyAminoPubKey(4, genPubKeys(5)) + multiLevelSubKey1 := kmultisig.NewLegacyAminoPubKey(4, genPubKeys(5)) + multiLevelSubKey2 := kmultisig.NewLegacyAminoPubKey(4, genPubKeys(5)) + multiLevelMultiKey := kmultisig.NewLegacyAminoPubKey(2, []crypto.PubKey{ multiLevelSubKey1, multiLevelSubKey2, secp256k1.GenPrivKey().PubKey()}) type args struct { pub crypto.PubKey diff --git a/x/auth/ante/sigverify_test.go b/x/auth/ante/sigverify_test.go index 54554f5b95ca..266951081e5c 100644 --- a/x/auth/ante/sigverify_test.go +++ b/x/auth/ante/sigverify_test.go @@ -8,6 +8,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" + kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/simapp" @@ -70,7 +71,7 @@ func (suite *AnteTestSuite) TestConsumeSignatureVerificationGas() { _, cdc := simapp.MakeCodecs() pkSet1, sigSet1 := generatePubKeysAndSignatures(5, msg, false) - multisigKey1 := multisig.NewPubKeyMultisigThreshold(2, pkSet1) + multisigKey1 := kmultisig.NewLegacyAminoPubKey(2, pkSet1) multisignature1 := multisig.NewMultisig(len(pkSet1)) expectedCost1 := expectedGasCostByKeys(pkSet1) for i := 0; i < len(pkSet1); i++ { diff --git a/x/auth/client/cli/cli_test.go b/x/auth/client/cli/cli_test.go index 57a9bc6f1c40..9ad440760b76 100644 --- a/x/auth/client/cli/cli_test.go +++ b/x/auth/client/cli/cli_test.go @@ -19,7 +19,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" + kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/testutil" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" @@ -59,7 +59,7 @@ func (s *IntegrationTestSuite) SetupSuite() { account2, _, err := kb.NewMnemonic("newAccount2", keyring.English, sdk.FullFundraiserPath, hd.Secp256k1) s.Require().NoError(err) - multi := multisig.NewPubKeyMultisigThreshold(2, []tmcrypto.PubKey{account1.GetPubKey(), account2.GetPubKey()}) + multi := kmultisig.NewLegacyAminoPubKey(2, []tmcrypto.PubKey{account1.GetPubKey(), account2.GetPubKey()}) _, err = kb.SaveMultisig("multi", multi) s.Require().NoError(err) diff --git a/x/auth/signing/verify_test.go b/x/auth/signing/verify_test.go index 198536111a1e..c5bc0be31605 100644 --- a/x/auth/signing/verify_test.go +++ b/x/auth/signing/verify_test.go @@ -8,6 +8,7 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/codec" + kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/testutil/testdata" @@ -64,7 +65,7 @@ func TestVerifySignature(t *testing.T) { require.NoError(t, err) pkSet := []crypto.PubKey{pubKey, pubKey1} - multisigKey := multisig.NewPubKeyMultisigThreshold(2, pkSet) + multisigKey := kmultisig.NewLegacyAminoPubKey(2, pkSet) multisignature := multisig.NewMultisig(2) msgs = []sdk.Msg{testdata.NewTestMsg(addr, addr1)} multiSignBytes := types.StdSignBytes(signerData.ChainID, signerData.AccountNumber, signerData.Sequence, 10, fee, msgs, memo) diff --git a/x/auth/testutil/suite.go b/x/auth/testutil/suite.go index b7fe6dc18be5..ec938f17c73a 100644 --- a/x/auth/testutil/suite.go +++ b/x/auth/testutil/suite.go @@ -7,13 +7,12 @@ import ( "github.com/tendermint/tendermint/crypto" "github.com/cosmos/cosmos-sdk/client" + kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/testutil/testdata" - "github.com/cosmos/cosmos-sdk/x/auth/signing" - - signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" - sdk "github.com/cosmos/cosmos-sdk/types" + signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing" + "github.com/cosmos/cosmos-sdk/x/auth/signing" ) // TxConfigTestSuite provides a test suite that can be used to test that a TxConfig implementation is correct @@ -82,7 +81,7 @@ func (s *TxConfigTestSuite) TestTxBuilderSetMsgs() { func (s *TxConfigTestSuite) TestTxBuilderSetSignatures() { privKey, pubkey, addr := testdata.KeyTestPubAddr() privKey2, pubkey2, _ := testdata.KeyTestPubAddr() - multisigPk := multisig.NewPubKeyMultisigThreshold(2, []crypto.PubKey{pubkey, pubkey2}) + multisigPk := kmultisig.NewLegacyAminoPubKey(2, []crypto.PubKey{pubkey, pubkey2}) txBuilder := s.TxConfig.NewTxBuilder() diff --git a/x/auth/types/stdtx_test.go b/x/auth/types/stdtx_test.go index 9f01c39fd342..86bf72441d23 100644 --- a/x/auth/types/stdtx_test.go +++ b/x/auth/types/stdtx_test.go @@ -13,8 +13,8 @@ import ( "github.com/cosmos/cosmos-sdk/codec" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -225,7 +225,7 @@ func TestSignatureV2Conversions(t *testing.T) { // multisigs _, pubKey2, _ := testdata.KeyTestPubAddr() - multiPK := multisig.NewPubKeyMultisigThreshold(1, []crypto.PubKey{ + multiPK := kmultisig.NewLegacyAminoPubKey(1, []crypto.PubKey{ pubKey, pubKey2, }) dummy2 := []byte("dummySig2") From bb0b56d779058742953ac74aeaf8ec0cf859f387 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Tue, 15 Sep 2020 18:46:20 +0200 Subject: [PATCH 069/128] Add amino marshal for multisig --- crypto/codec/amino.go | 8 +- crypto/keys/multisig/codec.go | 30 ++ crypto/keys/multisig/multisig.go | 77 ++++- crypto/keys/multisig/threshold_pubkey_test.go | 309 ++++++++++++++++++ 4 files changed, 411 insertions(+), 13 deletions(-) create mode 100644 crypto/keys/multisig/codec.go create mode 100644 crypto/keys/multisig/threshold_pubkey_test.go diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index 4b2afb9ad486..2b73698c6aa5 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -17,12 +17,6 @@ func init() { RegisterCrypto(amino) } -// TODO: Figure out API for others to either add their own pubkey types, or -// to make verify / marshal accept a Cdc. -const ( - PubKeyAminoRoute = "tendermint/PubKeyMultisigThreshold" -) - // RegisterCrypto registers all crypto dependency types with the provided Amino // codec. func RegisterCrypto(cdc *codec.LegacyAmino) { @@ -34,7 +28,7 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&secp256k1.PubKey{}, secp256k1.PubKeyName, nil) cdc.RegisterConcrete(&kmultisig.LegacyAminoPubKey{}, - PubKeyAminoRoute, nil) + kmultisig.PubKeyAminoRoute, nil) cdc.RegisterInterface((*crypto.PrivKey)(nil), nil) cdc.RegisterConcrete(ed25519.PrivKey{}, diff --git a/crypto/keys/multisig/codec.go b/crypto/keys/multisig/codec.go new file mode 100644 index 000000000000..1a77e844360e --- /dev/null +++ b/crypto/keys/multisig/codec.go @@ -0,0 +1,30 @@ +package multisig + +import ( + "github.com/tendermint/tendermint/crypto" + "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/tendermint/tendermint/crypto/sr25519" + + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" +) + +// TODO: Figure out API for others to either add their own pubkey types, or +// to make verify / marshal accept a AminoCdc. +const ( + PubKeyAminoRoute = "tendermint/PubKeyMultisigThreshold" +) + +var AminoCdc = codec.NewLegacyAmino() + +func init() { + AminoCdc.RegisterInterface((*crypto.PubKey)(nil), nil) + AminoCdc.RegisterConcrete(LegacyAminoPubKey{}, + PubKeyAminoRoute, nil) + AminoCdc.RegisterConcrete(ed25519.PubKey{}, + ed25519.PubKeyName, nil) + AminoCdc.RegisterConcrete(sr25519.PubKey{}, + sr25519.PubKeyName, nil) + AminoCdc.RegisterConcrete(secp256k1.PubKey{}, + secp256k1.PubKeyName, nil) +} diff --git a/crypto/keys/multisig/multisig.go b/crypto/keys/multisig/multisig.go index 73d8d41ebfc7..a1dbe6f1ce20 100644 --- a/crypto/keys/multisig/multisig.go +++ b/crypto/keys/multisig/multisig.go @@ -4,21 +4,20 @@ import ( fmt "fmt" "github.com/cosmos/cosmos-sdk/codec" - proto "github.com/gogo/protobuf/proto" - "github.com/cosmos/cosmos-sdk/codec/types" crypto "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/types/tx/signing" - tmcrypto "github.com/tendermint/tendermint/crypto" + proto "github.com/gogo/protobuf/proto" multisigtypes "github.com/cosmos/cosmos-sdk/crypto/types/multisig" + tmcrypto "github.com/tendermint/tendermint/crypto" ) -var cdc = codec.NewProtoCodec(types.NewInterfaceRegistry()) - var _ multisigtypes.PubKey = &LegacyAminoPubKey{} var _ types.UnpackInterfacesMessage = &LegacyAminoPubKey{} +var _ codec.AminoMarshaler = &LegacyAminoPubKey{} + // NewLegacyAminoPubKey returns a new LegacyAminoPubKey. // Panics if len(pubKeys) < k or 0 >= k. func NewLegacyAminoPubKey(k int, pubKeys []tmcrypto.PubKey) *LegacyAminoPubKey { @@ -42,7 +41,7 @@ func (m *LegacyAminoPubKey) Address() tmcrypto.Address { // Bytes returns the proto encoded version of the LegacyAminoPubKey func (m *LegacyAminoPubKey) Bytes() []byte { - return cdc.MustMarshalBinaryBare(m) + return AminoCdc.MustMarshalBinaryBare(m) } // VerifyMultisignature implements the multisigtypes.PubKey VerifyMultisignature method @@ -157,6 +156,72 @@ func (m *LegacyAminoPubKey) UnpackInterfaces(unpacker types.AnyUnpacker) error { return nil } +// pubKeyMultisigThreshold represents the old PubKeyMultisigThreshold. Now, we +// convert the new one (LegacyAminoPubKey) to this one, and marshal this one. +type pubKeyMultisigThreshold struct { + K uint `json:"threshold"` + PubKeys []crypto.PubKey `json:"pubkeys"` +} + +func toProto(old pubKeyMultisigThreshold) LegacyAminoPubKey { + anys := make([]*types.Any, len(old.PubKeys)) + for i, pk := range old.PubKeys { + anys[i] = types.UnsafePackAny(pk) + + } + return LegacyAminoPubKey{ + Threshold: uint32(old.K), + PubKeys: anys, + } +} + +func fromProto(pubKey LegacyAminoPubKey) pubKeyMultisigThreshold { + pks := make([]crypto.PubKey, len(pubKey.PubKeys)) + for i, any := range pubKey.PubKeys { + pks[i] = any.GetCachedValue().(crypto.PubKey) + } + return pubKeyMultisigThreshold{ + K: uint(pubKey.Threshold), + PubKeys: pks, + } +} + +// MarshalAmino overrides Amino binary marshalling. +func (m LegacyAminoPubKey) MarshalAmino() ([]byte, error) { + old := fromProto(m) + return AminoCdc.MustMarshalBinaryBare(old), nil +} + +// UnmarshalAmino overrides Amino binary marshalling. +func (m *LegacyAminoPubKey) UnmarshalAmino(bz []byte) error { + old := pubKeyMultisigThreshold{} + err := AminoCdc.UnmarshalBinaryBare(bz, &old) + if err != nil { + return err + } + + *m = toProto(old) + return nil +} + +// MarshalAminoJSON overrides Amino binary marshalling. +func (m LegacyAminoPubKey) MarshalAminoJSON() ([]byte, error) { + old := fromProto(m) + return AminoCdc.MustMarshalJSON(old), nil +} + +// UnmarshalAminoJSON overrides Amino binary marshalling. +func (m *LegacyAminoPubKey) UnmarshalAminoJSON(bz []byte) error { + old := pubKeyMultisigThreshold{} + err := AminoCdc.UnmarshalJSON(bz, &old) + if err != nil { + return err + } + + *m = toProto(old) + return nil +} + func packPubKeys(pubKeys []tmcrypto.PubKey) ([]*types.Any, error) { anyPubKeys := make([]*types.Any, len(pubKeys)) diff --git a/crypto/keys/multisig/threshold_pubkey_test.go b/crypto/keys/multisig/threshold_pubkey_test.go new file mode 100644 index 000000000000..b78684626395 --- /dev/null +++ b/crypto/keys/multisig/threshold_pubkey_test.go @@ -0,0 +1,309 @@ +package multisig_test + +import ( + "testing" + + proto "github.com/gogo/protobuf/proto" + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/crypto" + + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + "github.com/cosmos/cosmos-sdk/crypto/types" + "github.com/cosmos/cosmos-sdk/crypto/types/multisig" + "github.com/cosmos/cosmos-sdk/types/tx/signing" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" +) + +// This tests multisig functionality, but it expects the first k signatures to be valid +// TODO: Adapt it to give more flexibility about first k signatures being valid +func TestThresholdMultisigValidCases(t *testing.T) { + pkSet1, sigSet1 := generatePubKeysAndSignatures(5, []byte{1, 2, 3, 4}) + cases := []struct { + msg []byte + k int + pubkeys []crypto.PubKey + signingIndices []int + // signatures should be the same size as signingIndices. + signatures []signing.SignatureData + passAfterKSignatures []bool + }{ + { + msg: []byte{1, 2, 3, 4}, + k: 2, + pubkeys: pkSet1, + signingIndices: []int{0, 3, 1}, + signatures: sigSet1, + passAfterKSignatures: []bool{false}, + }, + } + for tcIndex, tc := range cases { + multisigKey := kmultisig.NewLegacyAminoPubKey(tc.k, tc.pubkeys) + multisignature := multisig.NewMultisig(len(tc.pubkeys)) + signBytesFn := func(mode signing.SignMode) ([]byte, error) { return tc.msg, nil } + + for i := 0; i < tc.k-1; i++ { + signingIndex := tc.signingIndices[i] + require.NoError( + t, + multisig.AddSignatureFromPubKey(multisignature, tc.signatures[signingIndex], tc.pubkeys[signingIndex], tc.pubkeys), + ) + require.Error( + t, + multisigKey.VerifyMultisignature(signBytesFn, multisignature), + "multisig passed when i < k, tc %d, i %d", tcIndex, i, + ) + require.NoError( + t, + multisig.AddSignatureFromPubKey(multisignature, tc.signatures[signingIndex], tc.pubkeys[signingIndex], tc.pubkeys), + ) + require.Equal( + t, + i+1, + len(multisignature.Signatures), + "adding a signature for the same pubkey twice increased signature count by 2, tc %d", tcIndex, + ) + } + require.Error( + t, + multisigKey.VerifyMultisignature(signBytesFn, multisignature), + "multisig passed with k - 1 sigs, tc %d", tcIndex, + ) + require.NoError( + t, + multisig.AddSignatureFromPubKey( + multisignature, + tc.signatures[tc.signingIndices[tc.k]], + tc.pubkeys[tc.signingIndices[tc.k]], + tc.pubkeys, + ), + ) + require.NoError( + t, + multisigKey.VerifyMultisignature(signBytesFn, multisignature), + "multisig failed after k good signatures, tc %d", tcIndex, + ) + + for i := tc.k + 1; i < len(tc.signingIndices); i++ { + signingIndex := tc.signingIndices[i] + + require.NoError( + t, + multisig.AddSignatureFromPubKey(multisignature, tc.signatures[signingIndex], tc.pubkeys[signingIndex], tc.pubkeys), + ) + require.Equal( + t, + tc.passAfterKSignatures[i-(tc.k)-1], + multisigKey.VerifyMultisignature(func(mode signing.SignMode) ([]byte, error) { + return tc.msg, nil + }, multisignature), + "multisig didn't verify as expected after k sigs, tc %d, i %d", tcIndex, i, + ) + require.NoError( + t, + multisig.AddSignatureFromPubKey(multisignature, tc.signatures[signingIndex], tc.pubkeys[signingIndex], tc.pubkeys), + ) + require.Equal( + t, + i+1, + len(multisignature.Signatures), + "adding a signature for the same pubkey twice increased signature count by 2, tc %d", tcIndex, + ) + } + } +} + +// TODO: Fully replace this test with table driven tests +func TestThresholdMultisigDuplicateSignatures(t *testing.T) { + msg := []byte{1, 2, 3, 4, 5} + pubkeys, sigs := generatePubKeysAndSignatures(5, msg) + multisigKey := kmultisig.NewLegacyAminoPubKey(2, pubkeys) + multisignature := multisig.NewMultisig(5) + signBytesFn := func(mode signing.SignMode) ([]byte, error) { return msg, nil } + + require.Error(t, multisigKey.VerifyMultisignature(signBytesFn, multisignature)) + multisig.AddSignatureFromPubKey(multisignature, sigs[0], pubkeys[0], pubkeys) + // Add second signature manually + multisignature.Signatures = append(multisignature.Signatures, sigs[0]) + require.Error(t, multisigKey.VerifyMultisignature(signBytesFn, multisignature)) +} + +func TestMultiSigPubKeyEquality(t *testing.T) { + aminoCdc := createAmino() + pubKey1 := secp256k1.GenPrivKey().PubKey() + pubKey2 := secp256k1.GenPrivKey().PubKey() + pubkeys := []crypto.PubKey{pubKey1, pubKey2} + multisigKey := kmultisig.NewLegacyAminoPubKey(2, pubkeys) + var other multisig.PubKey + + testCases := []struct { + msg string + malleate func() + expectEq bool + }{ + { + "equals", + func() { + var otherPubKey kmultisig.LegacyAminoPubKey + aminoCdc.MustUnmarshalBinaryBare(multisigKey.Bytes(), &otherPubKey) + other = &otherPubKey + }, + true, + }, + { + "ensure that reordering pubkeys is treated as a different pubkey", + func() { + pubkeysCpy := make([]crypto.PubKey, 2) + copy(pubkeysCpy, pubkeys) + pubkeysCpy[0] = pubkeys[1] + pubkeysCpy[1] = pubkeys[0] + other = kmultisig.NewLegacyAminoPubKey(2, pubkeysCpy) + }, + false, + }, + { + "equals with proto pub key", + func() { + anyPubKeys := make([]*codectypes.Any, len(pubkeys)) + + for i := 0; i < len(pubkeys); i++ { + any, err := codectypes.NewAnyWithValue(pubkeys[i].(proto.Message)) + require.NoError(t, err) + anyPubKeys[i] = any + } + other = &kmultisig.LegacyAminoPubKey{Threshold: 2, PubKeys: anyPubKeys} + }, + true, + }, + } + + for _, tc := range testCases { + t.Run(tc.msg, func(t *testing.T) { + tc.malleate() + eq := multisigKey.Equals(other) + require.Equal(t, eq, tc.expectEq) + }) + } +} + +func TestAddress(t *testing.T) { + msg := []byte{1, 2, 3, 4} + pubkeys, _ := generatePubKeysAndSignatures(5, msg) + multisigKey := kmultisig.NewLegacyAminoPubKey(2, pubkeys) + require.Len(t, multisigKey.Address().Bytes(), 20) +} + +func TestPubKeyMultisigThresholdAminoToIface(t *testing.T) { + aminoCdc := createAmino() + msg := []byte{1, 2, 3, 4} + pubkeys, _ := generatePubKeysAndSignatures(5, msg) + multisigKey := kmultisig.NewLegacyAminoPubKey(2, pubkeys) + + ab, err := aminoCdc.MarshalBinaryLengthPrefixed(multisigKey) + require.NoError(t, err) + // like other crypto.Pubkey implementations (e.g. ed25519.PubKeyMultisigThreshold), + // PubKeyMultisigThreshold should be deserializable into a crypto.PubKeyMultisigThreshold: + var pubKey crypto.PubKey + err = aminoCdc.UnmarshalBinaryLengthPrefixed(ab, &pubKey) + require.NoError(t, err) + + require.Equal(t, multisigKey, pubKey) +} + +func TestMultiSignature(t *testing.T) { + msg := []byte{1, 2, 3, 4} + pk, sig := generateNestedMultiSignature(3, msg) + signBytesFn := func(mode signing.SignMode) ([]byte, error) { return msg, nil } + err := pk.VerifyMultisignature(signBytesFn, sig) + require.NoError(t, err) +} + +func TestMultiSigMigration(t *testing.T) { + msg := []byte{1, 2, 3, 4} + pkSet, sigs := generatePubKeysAndSignatures(2, msg) + multisignature := multisig.NewMultisig(2) + + multisigKey := kmultisig.NewLegacyAminoPubKey(2, pkSet) + signBytesFn := func(mode signing.SignMode) ([]byte, error) { return msg, nil } + + cdc := codec.NewLegacyAmino() + + err := multisig.AddSignatureFromPubKey(multisignature, sigs[0], pkSet[0], pkSet) + + // create a StdSignature for msg, and convert it to sigV2 + sig := authtypes.StdSignature{PubKey: pkSet[1], Signature: msg} + sigV2, err := authtypes.StdSignatureToSignatureV2(cdc, sig) + require.NoError(t, multisig.AddSignatureV2(multisignature, sigV2, pkSet)) + + require.NoError(t, err) + require.NotNil(t, sigV2) + + require.NoError(t, multisigKey.VerifyMultisignature(signBytesFn, multisignature)) +} + +func TestAddSignatureFromPubKeyNilCheck(t *testing.T) { + pkSet, sigs := generatePubKeysAndSignatures(5, []byte{1, 2, 3, 4}) + multisignature := multisig.NewMultisig(5) + + //verify no error is returned with all non-nil values + err := multisig.AddSignatureFromPubKey(multisignature, sigs[0], pkSet[0], pkSet) + require.NoError(t, err) + //verify error is returned when key value is nil + err = multisig.AddSignatureFromPubKey(multisignature, sigs[0], pkSet[0], nil) + require.Error(t, err) + //verify error is returned when pubkey value is nil + err = multisig.AddSignatureFromPubKey(multisignature, sigs[0], nil, pkSet) + require.Error(t, err) + //verify error is returned when signature value is nil + err = multisig.AddSignatureFromPubKey(multisignature, nil, pkSet[0], pkSet) + require.Error(t, err) + //verify error is returned when multisignature value is nil + err = multisig.AddSignatureFromPubKey(nil, sigs[0], pkSet[0], pkSet) + require.Error(t, err) +} + +func createAmino() *codec.LegacyAmino { + aminoCdc := codec.NewLegacyAmino() + cryptocodec.RegisterCrypto(aminoCdc) + + return aminoCdc +} + +func generatePubKeysAndSignatures(n int, msg []byte) (pubkeys []crypto.PubKey, signatures []signing.SignatureData) { + pubkeys = make([]crypto.PubKey, n) + signatures = make([]signing.SignatureData, n) + for i := 0; i < n; i++ { + privkey := secp256k1.GenPrivKey() + pubkeys[i] = privkey.PubKey() + sig, _ := privkey.Sign(msg) + signatures[i] = &signing.SingleSignatureData{Signature: sig} + } + return +} + +func generateNestedMultiSignature(n int, msg []byte) (multisig.PubKey, *signing.MultiSignatureData) { + pubkeys := make([]crypto.PubKey, n) + signatures := make([]signing.SignatureData, n) + bitArray := types.NewCompactBitArray(n) + for i := 0; i < n; i++ { + nestedPks, nestedSigs := generatePubKeysAndSignatures(5, msg) + nestedBitArray := types.NewCompactBitArray(5) + for j := 0; j < 5; j++ { + nestedBitArray.SetIndex(j, true) + } + nestedSig := &signing.MultiSignatureData{ + BitArray: nestedBitArray, + Signatures: nestedSigs, + } + signatures[i] = nestedSig + pubkeys[i] = kmultisig.NewLegacyAminoPubKey(5, nestedPks) + bitArray.SetIndex(i, true) + } + return kmultisig.NewLegacyAminoPubKey(n, pubkeys), &signing.MultiSignatureData{ + BitArray: bitArray, + Signatures: signatures, + } +} From 9f9921e429fe9c19e2b5b1856ccf825f0cf4606b Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Tue, 15 Sep 2020 18:56:43 +0200 Subject: [PATCH 070/128] Fix lint --- std/pubkey.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/std/pubkey.go b/std/pubkey.go index b928b15fd818..53647e537ce1 100644 --- a/std/pubkey.go +++ b/std/pubkey.go @@ -100,7 +100,7 @@ func (cdc DefaultPublicKeyCodec) Encode(key crypto.PubKey) (*types.PublicKey, er resKeys[i] = dk } return &types.PublicKey{Sum: &types.PublicKey_Multisig{Multisig: &types.PubKeyMultisigThreshold{ - K: uint32(key.Threshold), + K: key.Threshold, PubKeys: resKeys, }}}, nil default: From f5d37016444ce49b7e75467c32281fee0f92da1c Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Wed, 16 Sep 2020 11:19:58 +0200 Subject: [PATCH 071/128] Correctly register amino --- crypto/keys/multisig/codec.go | 10 +++++----- crypto/keys/multisig/threshold_pubkey_test.go | 16 +++------------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/crypto/keys/multisig/codec.go b/crypto/keys/multisig/codec.go index 1a77e844360e..57faba426865 100644 --- a/crypto/keys/multisig/codec.go +++ b/crypto/keys/multisig/codec.go @@ -1,12 +1,12 @@ package multisig import ( - "github.com/tendermint/tendermint/crypto" + "github.com/tendermint/go-amino" "github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/crypto/sr25519" - "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" ) // TODO: Figure out API for others to either add their own pubkey types, or @@ -15,16 +15,16 @@ const ( PubKeyAminoRoute = "tendermint/PubKeyMultisigThreshold" ) -var AminoCdc = codec.NewLegacyAmino() +var AminoCdc = amino.NewCodec() func init() { - AminoCdc.RegisterInterface((*crypto.PubKey)(nil), nil) + AminoCdc.RegisterInterface((*cryptotypes.PubKey)(nil), nil) AminoCdc.RegisterConcrete(LegacyAminoPubKey{}, PubKeyAminoRoute, nil) AminoCdc.RegisterConcrete(ed25519.PubKey{}, ed25519.PubKeyName, nil) AminoCdc.RegisterConcrete(sr25519.PubKey{}, sr25519.PubKeyName, nil) - AminoCdc.RegisterConcrete(secp256k1.PubKey{}, + AminoCdc.RegisterConcrete(&secp256k1.PubKey{}, secp256k1.PubKeyName, nil) } diff --git a/crypto/keys/multisig/threshold_pubkey_test.go b/crypto/keys/multisig/threshold_pubkey_test.go index b78684626395..4ea2c31a2c2d 100644 --- a/crypto/keys/multisig/threshold_pubkey_test.go +++ b/crypto/keys/multisig/threshold_pubkey_test.go @@ -9,7 +9,6 @@ import ( "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" - cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types" @@ -132,7 +131,6 @@ func TestThresholdMultisigDuplicateSignatures(t *testing.T) { } func TestMultiSigPubKeyEquality(t *testing.T) { - aminoCdc := createAmino() pubKey1 := secp256k1.GenPrivKey().PubKey() pubKey2 := secp256k1.GenPrivKey().PubKey() pubkeys := []crypto.PubKey{pubKey1, pubKey2} @@ -148,7 +146,7 @@ func TestMultiSigPubKeyEquality(t *testing.T) { "equals", func() { var otherPubKey kmultisig.LegacyAminoPubKey - aminoCdc.MustUnmarshalBinaryBare(multisigKey.Bytes(), &otherPubKey) + kmultisig.AminoCdc.MustUnmarshalBinaryBare(multisigKey.Bytes(), &otherPubKey) other = &otherPubKey }, true, @@ -197,17 +195,16 @@ func TestAddress(t *testing.T) { } func TestPubKeyMultisigThresholdAminoToIface(t *testing.T) { - aminoCdc := createAmino() msg := []byte{1, 2, 3, 4} pubkeys, _ := generatePubKeysAndSignatures(5, msg) multisigKey := kmultisig.NewLegacyAminoPubKey(2, pubkeys) - ab, err := aminoCdc.MarshalBinaryLengthPrefixed(multisigKey) + ab, err := kmultisig.AminoCdc.MarshalBinaryLengthPrefixed(multisigKey) require.NoError(t, err) // like other crypto.Pubkey implementations (e.g. ed25519.PubKeyMultisigThreshold), // PubKeyMultisigThreshold should be deserializable into a crypto.PubKeyMultisigThreshold: var pubKey crypto.PubKey - err = aminoCdc.UnmarshalBinaryLengthPrefixed(ab, &pubKey) + err = kmultisig.AminoCdc.UnmarshalBinaryLengthPrefixed(ab, &pubKey) require.NoError(t, err) require.Equal(t, multisigKey, pubKey) @@ -265,13 +262,6 @@ func TestAddSignatureFromPubKeyNilCheck(t *testing.T) { require.Error(t, err) } -func createAmino() *codec.LegacyAmino { - aminoCdc := codec.NewLegacyAmino() - cryptocodec.RegisterCrypto(aminoCdc) - - return aminoCdc -} - func generatePubKeysAndSignatures(n int, msg []byte) (pubkeys []crypto.PubKey, signatures []signing.SignatureData) { pubkeys = make([]crypto.PubKey, n) signatures = make([]signing.SignatureData, n) From 18eeb6798ffb5dbdcfed88a59a8959318c2023a8 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Wed, 16 Sep 2020 11:28:47 +0200 Subject: [PATCH 072/128] One test left! --- crypto/keyring/keyring_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto/keyring/keyring_test.go b/crypto/keyring/keyring_test.go index c01a9a32e395..ac2ba0381c12 100644 --- a/crypto/keyring/keyring_test.go +++ b/crypto/keyring/keyring_test.go @@ -991,7 +991,7 @@ func TestAltKeyring_SaveMultisig(t *testing.T) { info, err := keyring.SaveMultisig(key, pub) require.Nil(t, err) - require.Equal(t, &pub, info.GetPubKey()) + require.Equal(t, pub, info.GetPubKey()) require.Equal(t, key, info.GetName()) list, err := keyring.List() From bf72fbd15127541ce6ddf960b59091fc05e81cb6 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Wed, 16 Sep 2020 11:44:34 +0200 Subject: [PATCH 073/128] Remove old struct --- crypto/keys/multisig/codec.go | 6 +-- crypto/keys/multisig/multisig.go | 69 -------------------------------- 2 files changed, 3 insertions(+), 72 deletions(-) diff --git a/crypto/keys/multisig/codec.go b/crypto/keys/multisig/codec.go index 57faba426865..5da49bf19050 100644 --- a/crypto/keys/multisig/codec.go +++ b/crypto/keys/multisig/codec.go @@ -1,10 +1,10 @@ package multisig import ( - "github.com/tendermint/go-amino" "github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/crypto/sr25519" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" ) @@ -15,11 +15,11 @@ const ( PubKeyAminoRoute = "tendermint/PubKeyMultisigThreshold" ) -var AminoCdc = amino.NewCodec() +var AminoCdc = codec.NewLegacyAmino() func init() { AminoCdc.RegisterInterface((*cryptotypes.PubKey)(nil), nil) - AminoCdc.RegisterConcrete(LegacyAminoPubKey{}, + AminoCdc.RegisterConcrete(&LegacyAminoPubKey{}, PubKeyAminoRoute, nil) AminoCdc.RegisterConcrete(ed25519.PubKey{}, ed25519.PubKeyName, nil) diff --git a/crypto/keys/multisig/multisig.go b/crypto/keys/multisig/multisig.go index a1dbe6f1ce20..0f30dfea35c9 100644 --- a/crypto/keys/multisig/multisig.go +++ b/crypto/keys/multisig/multisig.go @@ -3,7 +3,6 @@ package multisig import ( fmt "fmt" - "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" crypto "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/types/tx/signing" @@ -16,8 +15,6 @@ import ( var _ multisigtypes.PubKey = &LegacyAminoPubKey{} var _ types.UnpackInterfacesMessage = &LegacyAminoPubKey{} -var _ codec.AminoMarshaler = &LegacyAminoPubKey{} - // NewLegacyAminoPubKey returns a new LegacyAminoPubKey. // Panics if len(pubKeys) < k or 0 >= k. func NewLegacyAminoPubKey(k int, pubKeys []tmcrypto.PubKey) *LegacyAminoPubKey { @@ -156,72 +153,6 @@ func (m *LegacyAminoPubKey) UnpackInterfaces(unpacker types.AnyUnpacker) error { return nil } -// pubKeyMultisigThreshold represents the old PubKeyMultisigThreshold. Now, we -// convert the new one (LegacyAminoPubKey) to this one, and marshal this one. -type pubKeyMultisigThreshold struct { - K uint `json:"threshold"` - PubKeys []crypto.PubKey `json:"pubkeys"` -} - -func toProto(old pubKeyMultisigThreshold) LegacyAminoPubKey { - anys := make([]*types.Any, len(old.PubKeys)) - for i, pk := range old.PubKeys { - anys[i] = types.UnsafePackAny(pk) - - } - return LegacyAminoPubKey{ - Threshold: uint32(old.K), - PubKeys: anys, - } -} - -func fromProto(pubKey LegacyAminoPubKey) pubKeyMultisigThreshold { - pks := make([]crypto.PubKey, len(pubKey.PubKeys)) - for i, any := range pubKey.PubKeys { - pks[i] = any.GetCachedValue().(crypto.PubKey) - } - return pubKeyMultisigThreshold{ - K: uint(pubKey.Threshold), - PubKeys: pks, - } -} - -// MarshalAmino overrides Amino binary marshalling. -func (m LegacyAminoPubKey) MarshalAmino() ([]byte, error) { - old := fromProto(m) - return AminoCdc.MustMarshalBinaryBare(old), nil -} - -// UnmarshalAmino overrides Amino binary marshalling. -func (m *LegacyAminoPubKey) UnmarshalAmino(bz []byte) error { - old := pubKeyMultisigThreshold{} - err := AminoCdc.UnmarshalBinaryBare(bz, &old) - if err != nil { - return err - } - - *m = toProto(old) - return nil -} - -// MarshalAminoJSON overrides Amino binary marshalling. -func (m LegacyAminoPubKey) MarshalAminoJSON() ([]byte, error) { - old := fromProto(m) - return AminoCdc.MustMarshalJSON(old), nil -} - -// UnmarshalAminoJSON overrides Amino binary marshalling. -func (m *LegacyAminoPubKey) UnmarshalAminoJSON(bz []byte) error { - old := pubKeyMultisigThreshold{} - err := AminoCdc.UnmarshalJSON(bz, &old) - if err != nil { - return err - } - - *m = toProto(old) - return nil -} - func packPubKeys(pubKeys []tmcrypto.PubKey) ([]*types.Any, error) { anyPubKeys := make([]*types.Any, len(pubKeys)) From 9c07e688678e3a6c9386e7cebfdebd22dfd04f88 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Wed, 16 Sep 2020 11:53:51 +0200 Subject: [PATCH 074/128] Fix test --- crypto/keys/multisig/codec.go | 2 +- crypto/keys/multisig/threshold_pubkey_test.go | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/crypto/keys/multisig/codec.go b/crypto/keys/multisig/codec.go index 5da49bf19050..6f82f5e4d0a5 100644 --- a/crypto/keys/multisig/codec.go +++ b/crypto/keys/multisig/codec.go @@ -19,7 +19,7 @@ var AminoCdc = codec.NewLegacyAmino() func init() { AminoCdc.RegisterInterface((*cryptotypes.PubKey)(nil), nil) - AminoCdc.RegisterConcrete(&LegacyAminoPubKey{}, + AminoCdc.RegisterConcrete(LegacyAminoPubKey{}, PubKeyAminoRoute, nil) AminoCdc.RegisterConcrete(ed25519.PubKey{}, ed25519.PubKeyName, nil) diff --git a/crypto/keys/multisig/threshold_pubkey_test.go b/crypto/keys/multisig/threshold_pubkey_test.go index 4ea2c31a2c2d..3cacf33badd3 100644 --- a/crypto/keys/multisig/threshold_pubkey_test.go +++ b/crypto/keys/multisig/threshold_pubkey_test.go @@ -12,6 +12,7 @@ import ( kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/types/tx/signing" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -202,8 +203,8 @@ func TestPubKeyMultisigThresholdAminoToIface(t *testing.T) { ab, err := kmultisig.AminoCdc.MarshalBinaryLengthPrefixed(multisigKey) require.NoError(t, err) // like other crypto.Pubkey implementations (e.g. ed25519.PubKeyMultisigThreshold), - // PubKeyMultisigThreshold should be deserializable into a crypto.PubKeyMultisigThreshold: - var pubKey crypto.PubKey + // LegacyAminoPubKey should be deserializable into a crypto.LegacyAminoPubKey: + var pubKey cryptotypes.PubKey err = kmultisig.AminoCdc.UnmarshalBinaryLengthPrefixed(ab, &pubKey) require.NoError(t, err) From 66f78cd8e3841669cd8dc9cd62eec906b275b35c Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Wed, 16 Sep 2020 12:06:38 +0200 Subject: [PATCH 075/128] Fix test --- crypto/keys/multisig/codec.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto/keys/multisig/codec.go b/crypto/keys/multisig/codec.go index 6f82f5e4d0a5..42b5412f44b4 100644 --- a/crypto/keys/multisig/codec.go +++ b/crypto/keys/multisig/codec.go @@ -19,12 +19,12 @@ var AminoCdc = codec.NewLegacyAmino() func init() { AminoCdc.RegisterInterface((*cryptotypes.PubKey)(nil), nil) - AminoCdc.RegisterConcrete(LegacyAminoPubKey{}, - PubKeyAminoRoute, nil) AminoCdc.RegisterConcrete(ed25519.PubKey{}, ed25519.PubKeyName, nil) AminoCdc.RegisterConcrete(sr25519.PubKey{}, sr25519.PubKeyName, nil) AminoCdc.RegisterConcrete(&secp256k1.PubKey{}, secp256k1.PubKeyName, nil) + AminoCdc.RegisterConcrete(&LegacyAminoPubKey{}, + PubKeyAminoRoute, nil) } From 9f8aab7275c604a033414d3c1828a3467b09b39b Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Wed, 16 Sep 2020 12:59:16 +0200 Subject: [PATCH 076/128] Unpack into tmcrypto --- crypto/codec/amino.go | 5 +++++ crypto/keys/multisig/codec.go | 5 +++++ crypto/keys/multisig/multisig.go | 9 ++++----- crypto/keys/multisig/threshold_pubkey_test.go | 3 +-- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index 2b73698c6aa5..c3ef815d4002 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -8,6 +8,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" ) var amino *codec.LegacyAmino @@ -20,7 +21,11 @@ func init() { // RegisterCrypto registers all crypto dependency types with the provided Amino // codec. func RegisterCrypto(cdc *codec.LegacyAmino) { + // TODO We now register both Tendermint's PubKey and our own PubKey. In the + // long-term, we should move away from Tendermint's PubKey, and delete this + // first line. cdc.RegisterInterface((*crypto.PubKey)(nil), nil) + cdc.RegisterInterface((*cryptotypes.PubKey)(nil), nil) cdc.RegisterConcrete(ed25519.PubKey{}, ed25519.PubKeyName, nil) cdc.RegisterConcrete(sr25519.PubKey{}, diff --git a/crypto/keys/multisig/codec.go b/crypto/keys/multisig/codec.go index 42b5412f44b4..aedb6bc0ac65 100644 --- a/crypto/keys/multisig/codec.go +++ b/crypto/keys/multisig/codec.go @@ -1,6 +1,7 @@ package multisig import ( + "github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/crypto/sr25519" @@ -18,6 +19,10 @@ const ( var AminoCdc = codec.NewLegacyAmino() func init() { + // TODO We now register both Tendermint's PubKey and our own PubKey. In the + // long-term, we should move away from Tendermint's PubKey, and delete this + // first line. + AminoCdc.RegisterInterface((*crypto.PubKey)(nil), nil) AminoCdc.RegisterInterface((*cryptotypes.PubKey)(nil), nil) AminoCdc.RegisterConcrete(ed25519.PubKey{}, ed25519.PubKeyName, nil) diff --git a/crypto/keys/multisig/multisig.go b/crypto/keys/multisig/multisig.go index 0f30dfea35c9..1cc4fa444a66 100644 --- a/crypto/keys/multisig/multisig.go +++ b/crypto/keys/multisig/multisig.go @@ -3,13 +3,12 @@ package multisig import ( fmt "fmt" + tmcrypto "github.com/tendermint/tendermint/crypto" + "github.com/cosmos/cosmos-sdk/codec/types" - crypto "github.com/cosmos/cosmos-sdk/crypto/types" + multisigtypes "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/types/tx/signing" proto "github.com/gogo/protobuf/proto" - - multisigtypes "github.com/cosmos/cosmos-sdk/crypto/types/multisig" - tmcrypto "github.com/tendermint/tendermint/crypto" ) var _ multisigtypes.PubKey = &LegacyAminoPubKey{} @@ -144,7 +143,7 @@ func (m *LegacyAminoPubKey) Type() string { // UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces func (m *LegacyAminoPubKey) UnpackInterfaces(unpacker types.AnyUnpacker) error { for _, any := range m.PubKeys { - var pk crypto.PubKey + var pk tmcrypto.PubKey err := unpacker.UnpackAny(any, &pk) if err != nil { return err diff --git a/crypto/keys/multisig/threshold_pubkey_test.go b/crypto/keys/multisig/threshold_pubkey_test.go index 3cacf33badd3..eb08505c1051 100644 --- a/crypto/keys/multisig/threshold_pubkey_test.go +++ b/crypto/keys/multisig/threshold_pubkey_test.go @@ -12,7 +12,6 @@ import ( kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/types/tx/signing" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" @@ -204,7 +203,7 @@ func TestPubKeyMultisigThresholdAminoToIface(t *testing.T) { require.NoError(t, err) // like other crypto.Pubkey implementations (e.g. ed25519.PubKeyMultisigThreshold), // LegacyAminoPubKey should be deserializable into a crypto.LegacyAminoPubKey: - var pubKey cryptotypes.PubKey + var pubKey crypto.PubKey err = kmultisig.AminoCdc.UnmarshalBinaryLengthPrefixed(ab, &pubKey) require.NoError(t, err) From 7a596dcb56b0967bc56349cdb04c583863a910ae Mon Sep 17 00:00:00 2001 From: blushi Date: Wed, 16 Sep 2020 15:45:35 +0200 Subject: [PATCH 077/128] Remove old threshold pubkey tests --- crypto/keys/multisig/multisig_test.go | 190 ++++++++--- crypto/keys/multisig/threshold_pubkey_test.go | 299 ------------------ 2 files changed, 154 insertions(+), 335 deletions(-) delete mode 100644 crypto/keys/multisig/threshold_pubkey_test.go diff --git a/crypto/keys/multisig/multisig_test.go b/crypto/keys/multisig/multisig_test.go index 3ee021c0f012..c418d42ceb06 100644 --- a/crypto/keys/multisig/multisig_test.go +++ b/crypto/keys/multisig/multisig_test.go @@ -1,4 +1,4 @@ -package multisig +package multisig_test import ( "testing" @@ -6,8 +6,11 @@ import ( "github.com/cosmos/cosmos-sdk/codec/types" crypto "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" tmcrypto "github.com/tendermint/tendermint/crypto" + "github.com/cosmos/cosmos-sdk/codec" + kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/types/tx/signing" "github.com/stretchr/testify/require" @@ -16,9 +19,7 @@ import ( func TestAddress(t *testing.T) { msg := []byte{1, 2, 3, 4} pubKeys, _ := generatePubKeysAndSignatures(5, msg) - anyPubKeys, err := packPubKeys(pubKeys) - require.NoError(t, err) - multisigKey := &LegacyAminoPubKey{Threshold: 2, PubKeys: anyPubKeys} + multisigKey := kmultisig.NewLegacyAminoPubKey(2, pubKeys) require.Len(t, multisigKey.Address().Bytes(), 20) } @@ -27,13 +28,8 @@ func TestEquals(t *testing.T) { pubKey1 := secp256k1.GenPrivKey().PubKey() pubKey2 := secp256k1.GenPrivKey().PubKey() - anyPubKeys, err := packPubKeys([]tmcrypto.PubKey{pubKey1, pubKey2}) - require.NoError(t, err) - multisigKey := &LegacyAminoPubKey{Threshold: 1, PubKeys: anyPubKeys} - - otherPubKeys, err := packPubKeys([]tmcrypto.PubKey{pubKey1, multisigKey}) - require.NoError(t, err) - otherMultisigKey := LegacyAminoPubKey{Threshold: 1, PubKeys: otherPubKeys} + multisigKey := kmultisig.NewLegacyAminoPubKey(1, []tmcrypto.PubKey{pubKey1, pubKey2}) + otherMultisigKey := kmultisig.NewLegacyAminoPubKey(1, []tmcrypto.PubKey{pubKey1, multisigKey}) testCases := []struct { msg string @@ -42,22 +38,22 @@ func TestEquals(t *testing.T) { }{ { "equals with proto pub key", - &LegacyAminoPubKey{Threshold: 1, PubKeys: anyPubKeys}, + &kmultisig.LegacyAminoPubKey{Threshold: 1, PubKeys: multisigKey.PubKeys}, true, }, { "different threshold", - &LegacyAminoPubKey{Threshold: 2, PubKeys: anyPubKeys}, + &kmultisig.LegacyAminoPubKey{Threshold: 2, PubKeys: multisigKey.PubKeys}, false, }, { "different pub keys length", - &LegacyAminoPubKey{Threshold: 1, PubKeys: []*types.Any{anyPubKeys[0]}}, + &kmultisig.LegacyAminoPubKey{Threshold: 1, PubKeys: []*types.Any{multisigKey.PubKeys[0]}}, false, }, { "different pub keys", - &otherMultisigKey, + otherMultisigKey, false, }, { @@ -65,6 +61,11 @@ func TestEquals(t *testing.T) { secp256k1.GenPrivKey().PubKey(), false, }, + { + "ensure that reordering pubkeys is treated as a different pubkey", + reorderPubKey(multisigKey), + false, + }, } for _, tc := range testCases { @@ -91,8 +92,7 @@ func TestVerifyMultisignature(t *testing.T) { { "nested multisignature", func() { - genPk, genSig, err := generateNestedMultiSignature(3, msg) - require.NoError(t, err) + genPk, genSig := generateNestedMultiSignature(3, msg) sig = genSig pk = genPk }, @@ -102,22 +102,18 @@ func TestVerifyMultisignature(t *testing.T) { "wrong size for sig bit array", func() { pubKeys, _ := generatePubKeysAndSignatures(3, msg) - anyPubKeys, err := packPubKeys(pubKeys) - require.NoError(t, err) - pk = &LegacyAminoPubKey{Threshold: 3, PubKeys: anyPubKeys} + pk = kmultisig.NewLegacyAminoPubKey(3, pubKeys) sig = multisig.NewMultisig(1) }, false, }, { - "single signature data", + "single signature data, expects the first k signatures to be valid", func() { k := 2 signingIndices := []int{0, 3, 1} pubKeys, sigs := generatePubKeysAndSignatures(5, msg) - anyPubKeys, err := packPubKeys(pubKeys) - require.NoError(t, err) - pk = &LegacyAminoPubKey{Threshold: uint32(k), PubKeys: anyPubKeys} + pk = kmultisig.NewLegacyAminoPubKey(k, pubKeys) sig = multisig.NewMultisig(len(pubKeys)) signBytesFn := func(mode signing.SignMode) ([]byte, error) { return msg, nil } @@ -136,6 +132,12 @@ func TestVerifyMultisignature(t *testing.T) { t, multisig.AddSignatureFromPubKey(sig, sigs[signingIndex], pubKeys[signingIndex], pubKeys), ) + require.Equal( + t, + i+1, + len(sig.Signatures), + "adding a signature for the same pubkey twice increased signature count by 2, index %d", i, + ) } require.Error( t, @@ -151,9 +153,64 @@ func TestVerifyMultisignature(t *testing.T) { pubKeys, ), ) + require.NoError( + t, + pk.VerifyMultisignature(signBytesFn, sig), + "multisig failed after k good signatures", + ) + + for i := k + 1; i < len(signingIndices); i++ { + signingIndex := signingIndices[i] + + require.NoError( + t, + multisig.AddSignatureFromPubKey( + sig, + sigs[signingIndex], + pubKeys[signingIndex], + pubKeys, + ), + ) + require.Equal( + t, + false, + pk.VerifyMultisignature(func(mode signing.SignMode) ([]byte, error) { + return msg, nil + }, sig), + "multisig didn't verify as expected after k sigs, i %d", i, + ) + require.NoError( + t, + multisig.AddSignatureFromPubKey( + sig, + sigs[signingIndex], + pubKeys[signingIndex], + pubKeys), + ) + require.Equal( + t, + i+1, + len(sig.Signatures), + "adding a signature for the same pubkey twice increased signature count by 2", + ) + } }, true, }, + { + "duplicate signatures", + func() { + pubKeys, sigs := generatePubKeysAndSignatures(5, msg) + pk = kmultisig.NewLegacyAminoPubKey(2, pubKeys) + sig = multisig.NewMultisig(5) + + require.Error(t, pk.VerifyMultisignature(signBytesFn, sig)) + multisig.AddSignatureFromPubKey(sig, sigs[0], pubKeys[0], pubKeys) + // Add second signature manually + sig.Signatures = append(sig.Signatures, sigs[0]) + }, + false, + }, } for _, tc := range testCases { @@ -169,6 +226,66 @@ func TestVerifyMultisignature(t *testing.T) { } } +func TestAddSignatureFromPubKeyNilCheck(t *testing.T) { + pkSet, sigs := generatePubKeysAndSignatures(5, []byte{1, 2, 3, 4}) + multisignature := multisig.NewMultisig(5) + + // verify no error is returned with all non-nil values + err := multisig.AddSignatureFromPubKey(multisignature, sigs[0], pkSet[0], pkSet) + require.NoError(t, err) + // verify error is returned when key value is nil + err = multisig.AddSignatureFromPubKey(multisignature, sigs[0], pkSet[0], nil) + require.Error(t, err) + // verify error is returned when pubkey value is nil + err = multisig.AddSignatureFromPubKey(multisignature, sigs[0], nil, pkSet) + require.Error(t, err) + // verify error is returned when signature value is nil + err = multisig.AddSignatureFromPubKey(multisignature, nil, pkSet[0], pkSet) + require.Error(t, err) + // verify error is returned when multisignature value is nil + err = multisig.AddSignatureFromPubKey(nil, sigs[0], pkSet[0], pkSet) + require.Error(t, err) +} + +func TestMultiSigMigration(t *testing.T) { + msg := []byte{1, 2, 3, 4} + pkSet, sigs := generatePubKeysAndSignatures(2, msg) + multisignature := multisig.NewMultisig(2) + + multisigKey := kmultisig.NewLegacyAminoPubKey(2, pkSet) + signBytesFn := func(mode signing.SignMode) ([]byte, error) { return msg, nil } + + cdc := codec.NewLegacyAmino() + + err := multisig.AddSignatureFromPubKey(multisignature, sigs[0], pkSet[0], pkSet) + + // create a StdSignature for msg, and convert it to sigV2 + sig := authtypes.StdSignature{PubKey: pkSet[1], Signature: msg} + sigV2, err := authtypes.StdSignatureToSignatureV2(cdc, sig) + require.NoError(t, multisig.AddSignatureV2(multisignature, sigV2, pkSet)) + + require.NoError(t, err) + require.NotNil(t, sigV2) + + require.NoError(t, multisigKey.VerifyMultisignature(signBytesFn, multisignature)) +} + +func TestPubKeyMultisigThresholdAminoToIface(t *testing.T) { + msg := []byte{1, 2, 3, 4} + pubkeys, _ := generatePubKeysAndSignatures(5, msg) + multisigKey := kmultisig.NewLegacyAminoPubKey(2, pubkeys) + + ab, err := kmultisig.AminoCdc.MarshalBinaryLengthPrefixed(multisigKey) + require.NoError(t, err) + // like other crypto.Pubkey implementations (e.g. ed25519.PubKeyMultisigThreshold), + // LegacyAminoPubKey should be deserializable into a crypto.LegacyAminoPubKey: + var pubKey kmultisig.LegacyAminoPubKey + err = kmultisig.AminoCdc.UnmarshalBinaryLengthPrefixed(ab, &pubKey) + require.NoError(t, err) + + require.Equal(t, multisigKey.Equals(&pubKey), true) +} + func generatePubKeysAndSignatures(n int, msg []byte) (pubKeys []tmcrypto.PubKey, signatures []signing.SignatureData) { pubKeys = make([]tmcrypto.PubKey, n) signatures = make([]signing.SignatureData, n) @@ -183,7 +300,7 @@ func generatePubKeysAndSignatures(n int, msg []byte) (pubKeys []tmcrypto.PubKey, return } -func generateNestedMultiSignature(n int, msg []byte) (multisig.PubKey, *signing.MultiSignatureData, error) { +func generateNestedMultiSignature(n int, msg []byte) (multisig.PubKey, *signing.MultiSignatureData) { pubKeys := make([]tmcrypto.PubKey, n) signatures := make([]signing.SignatureData, n) bitArray := crypto.NewCompactBitArray(n) @@ -198,19 +315,20 @@ func generateNestedMultiSignature(n int, msg []byte) (multisig.PubKey, *signing. Signatures: nestedSigs, } signatures[i] = nestedSig - anyNestedPks, err := packPubKeys(nestedPks) - if err != nil { - return nil, nil, err - } - pubKeys[i] = &LegacyAminoPubKey{Threshold: 5, PubKeys: anyNestedPks} + pubKeys[i] = kmultisig.NewLegacyAminoPubKey(5, nestedPks) bitArray.SetIndex(i, true) } - anyPubKeys, err := packPubKeys(pubKeys) - if err != nil { - return nil, nil, err - } - return &LegacyAminoPubKey{Threshold: uint32(n), PubKeys: anyPubKeys}, &signing.MultiSignatureData{ + return kmultisig.NewLegacyAminoPubKey(n, pubKeys), &signing.MultiSignatureData{ BitArray: bitArray, Signatures: signatures, - }, nil + } +} + +func reorderPubKey(pk *kmultisig.LegacyAminoPubKey) (other *kmultisig.LegacyAminoPubKey) { + pubkeysCpy := make([]*types.Any, len(pk.PubKeys)) + copy(pubkeysCpy, pk.PubKeys) + pubkeysCpy[0] = pk.PubKeys[1] + pubkeysCpy[1] = pk.PubKeys[0] + other = &kmultisig.LegacyAminoPubKey{Threshold: 2, PubKeys: pubkeysCpy} + return } diff --git a/crypto/keys/multisig/threshold_pubkey_test.go b/crypto/keys/multisig/threshold_pubkey_test.go deleted file mode 100644 index eb08505c1051..000000000000 --- a/crypto/keys/multisig/threshold_pubkey_test.go +++ /dev/null @@ -1,299 +0,0 @@ -package multisig_test - -import ( - "testing" - - proto "github.com/gogo/protobuf/proto" - "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto" - - "github.com/cosmos/cosmos-sdk/codec" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - "github.com/cosmos/cosmos-sdk/crypto/types" - "github.com/cosmos/cosmos-sdk/crypto/types/multisig" - "github.com/cosmos/cosmos-sdk/types/tx/signing" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" -) - -// This tests multisig functionality, but it expects the first k signatures to be valid -// TODO: Adapt it to give more flexibility about first k signatures being valid -func TestThresholdMultisigValidCases(t *testing.T) { - pkSet1, sigSet1 := generatePubKeysAndSignatures(5, []byte{1, 2, 3, 4}) - cases := []struct { - msg []byte - k int - pubkeys []crypto.PubKey - signingIndices []int - // signatures should be the same size as signingIndices. - signatures []signing.SignatureData - passAfterKSignatures []bool - }{ - { - msg: []byte{1, 2, 3, 4}, - k: 2, - pubkeys: pkSet1, - signingIndices: []int{0, 3, 1}, - signatures: sigSet1, - passAfterKSignatures: []bool{false}, - }, - } - for tcIndex, tc := range cases { - multisigKey := kmultisig.NewLegacyAminoPubKey(tc.k, tc.pubkeys) - multisignature := multisig.NewMultisig(len(tc.pubkeys)) - signBytesFn := func(mode signing.SignMode) ([]byte, error) { return tc.msg, nil } - - for i := 0; i < tc.k-1; i++ { - signingIndex := tc.signingIndices[i] - require.NoError( - t, - multisig.AddSignatureFromPubKey(multisignature, tc.signatures[signingIndex], tc.pubkeys[signingIndex], tc.pubkeys), - ) - require.Error( - t, - multisigKey.VerifyMultisignature(signBytesFn, multisignature), - "multisig passed when i < k, tc %d, i %d", tcIndex, i, - ) - require.NoError( - t, - multisig.AddSignatureFromPubKey(multisignature, tc.signatures[signingIndex], tc.pubkeys[signingIndex], tc.pubkeys), - ) - require.Equal( - t, - i+1, - len(multisignature.Signatures), - "adding a signature for the same pubkey twice increased signature count by 2, tc %d", tcIndex, - ) - } - require.Error( - t, - multisigKey.VerifyMultisignature(signBytesFn, multisignature), - "multisig passed with k - 1 sigs, tc %d", tcIndex, - ) - require.NoError( - t, - multisig.AddSignatureFromPubKey( - multisignature, - tc.signatures[tc.signingIndices[tc.k]], - tc.pubkeys[tc.signingIndices[tc.k]], - tc.pubkeys, - ), - ) - require.NoError( - t, - multisigKey.VerifyMultisignature(signBytesFn, multisignature), - "multisig failed after k good signatures, tc %d", tcIndex, - ) - - for i := tc.k + 1; i < len(tc.signingIndices); i++ { - signingIndex := tc.signingIndices[i] - - require.NoError( - t, - multisig.AddSignatureFromPubKey(multisignature, tc.signatures[signingIndex], tc.pubkeys[signingIndex], tc.pubkeys), - ) - require.Equal( - t, - tc.passAfterKSignatures[i-(tc.k)-1], - multisigKey.VerifyMultisignature(func(mode signing.SignMode) ([]byte, error) { - return tc.msg, nil - }, multisignature), - "multisig didn't verify as expected after k sigs, tc %d, i %d", tcIndex, i, - ) - require.NoError( - t, - multisig.AddSignatureFromPubKey(multisignature, tc.signatures[signingIndex], tc.pubkeys[signingIndex], tc.pubkeys), - ) - require.Equal( - t, - i+1, - len(multisignature.Signatures), - "adding a signature for the same pubkey twice increased signature count by 2, tc %d", tcIndex, - ) - } - } -} - -// TODO: Fully replace this test with table driven tests -func TestThresholdMultisigDuplicateSignatures(t *testing.T) { - msg := []byte{1, 2, 3, 4, 5} - pubkeys, sigs := generatePubKeysAndSignatures(5, msg) - multisigKey := kmultisig.NewLegacyAminoPubKey(2, pubkeys) - multisignature := multisig.NewMultisig(5) - signBytesFn := func(mode signing.SignMode) ([]byte, error) { return msg, nil } - - require.Error(t, multisigKey.VerifyMultisignature(signBytesFn, multisignature)) - multisig.AddSignatureFromPubKey(multisignature, sigs[0], pubkeys[0], pubkeys) - // Add second signature manually - multisignature.Signatures = append(multisignature.Signatures, sigs[0]) - require.Error(t, multisigKey.VerifyMultisignature(signBytesFn, multisignature)) -} - -func TestMultiSigPubKeyEquality(t *testing.T) { - pubKey1 := secp256k1.GenPrivKey().PubKey() - pubKey2 := secp256k1.GenPrivKey().PubKey() - pubkeys := []crypto.PubKey{pubKey1, pubKey2} - multisigKey := kmultisig.NewLegacyAminoPubKey(2, pubkeys) - var other multisig.PubKey - - testCases := []struct { - msg string - malleate func() - expectEq bool - }{ - { - "equals", - func() { - var otherPubKey kmultisig.LegacyAminoPubKey - kmultisig.AminoCdc.MustUnmarshalBinaryBare(multisigKey.Bytes(), &otherPubKey) - other = &otherPubKey - }, - true, - }, - { - "ensure that reordering pubkeys is treated as a different pubkey", - func() { - pubkeysCpy := make([]crypto.PubKey, 2) - copy(pubkeysCpy, pubkeys) - pubkeysCpy[0] = pubkeys[1] - pubkeysCpy[1] = pubkeys[0] - other = kmultisig.NewLegacyAminoPubKey(2, pubkeysCpy) - }, - false, - }, - { - "equals with proto pub key", - func() { - anyPubKeys := make([]*codectypes.Any, len(pubkeys)) - - for i := 0; i < len(pubkeys); i++ { - any, err := codectypes.NewAnyWithValue(pubkeys[i].(proto.Message)) - require.NoError(t, err) - anyPubKeys[i] = any - } - other = &kmultisig.LegacyAminoPubKey{Threshold: 2, PubKeys: anyPubKeys} - }, - true, - }, - } - - for _, tc := range testCases { - t.Run(tc.msg, func(t *testing.T) { - tc.malleate() - eq := multisigKey.Equals(other) - require.Equal(t, eq, tc.expectEq) - }) - } -} - -func TestAddress(t *testing.T) { - msg := []byte{1, 2, 3, 4} - pubkeys, _ := generatePubKeysAndSignatures(5, msg) - multisigKey := kmultisig.NewLegacyAminoPubKey(2, pubkeys) - require.Len(t, multisigKey.Address().Bytes(), 20) -} - -func TestPubKeyMultisigThresholdAminoToIface(t *testing.T) { - msg := []byte{1, 2, 3, 4} - pubkeys, _ := generatePubKeysAndSignatures(5, msg) - multisigKey := kmultisig.NewLegacyAminoPubKey(2, pubkeys) - - ab, err := kmultisig.AminoCdc.MarshalBinaryLengthPrefixed(multisigKey) - require.NoError(t, err) - // like other crypto.Pubkey implementations (e.g. ed25519.PubKeyMultisigThreshold), - // LegacyAminoPubKey should be deserializable into a crypto.LegacyAminoPubKey: - var pubKey crypto.PubKey - err = kmultisig.AminoCdc.UnmarshalBinaryLengthPrefixed(ab, &pubKey) - require.NoError(t, err) - - require.Equal(t, multisigKey, pubKey) -} - -func TestMultiSignature(t *testing.T) { - msg := []byte{1, 2, 3, 4} - pk, sig := generateNestedMultiSignature(3, msg) - signBytesFn := func(mode signing.SignMode) ([]byte, error) { return msg, nil } - err := pk.VerifyMultisignature(signBytesFn, sig) - require.NoError(t, err) -} - -func TestMultiSigMigration(t *testing.T) { - msg := []byte{1, 2, 3, 4} - pkSet, sigs := generatePubKeysAndSignatures(2, msg) - multisignature := multisig.NewMultisig(2) - - multisigKey := kmultisig.NewLegacyAminoPubKey(2, pkSet) - signBytesFn := func(mode signing.SignMode) ([]byte, error) { return msg, nil } - - cdc := codec.NewLegacyAmino() - - err := multisig.AddSignatureFromPubKey(multisignature, sigs[0], pkSet[0], pkSet) - - // create a StdSignature for msg, and convert it to sigV2 - sig := authtypes.StdSignature{PubKey: pkSet[1], Signature: msg} - sigV2, err := authtypes.StdSignatureToSignatureV2(cdc, sig) - require.NoError(t, multisig.AddSignatureV2(multisignature, sigV2, pkSet)) - - require.NoError(t, err) - require.NotNil(t, sigV2) - - require.NoError(t, multisigKey.VerifyMultisignature(signBytesFn, multisignature)) -} - -func TestAddSignatureFromPubKeyNilCheck(t *testing.T) { - pkSet, sigs := generatePubKeysAndSignatures(5, []byte{1, 2, 3, 4}) - multisignature := multisig.NewMultisig(5) - - //verify no error is returned with all non-nil values - err := multisig.AddSignatureFromPubKey(multisignature, sigs[0], pkSet[0], pkSet) - require.NoError(t, err) - //verify error is returned when key value is nil - err = multisig.AddSignatureFromPubKey(multisignature, sigs[0], pkSet[0], nil) - require.Error(t, err) - //verify error is returned when pubkey value is nil - err = multisig.AddSignatureFromPubKey(multisignature, sigs[0], nil, pkSet) - require.Error(t, err) - //verify error is returned when signature value is nil - err = multisig.AddSignatureFromPubKey(multisignature, nil, pkSet[0], pkSet) - require.Error(t, err) - //verify error is returned when multisignature value is nil - err = multisig.AddSignatureFromPubKey(nil, sigs[0], pkSet[0], pkSet) - require.Error(t, err) -} - -func generatePubKeysAndSignatures(n int, msg []byte) (pubkeys []crypto.PubKey, signatures []signing.SignatureData) { - pubkeys = make([]crypto.PubKey, n) - signatures = make([]signing.SignatureData, n) - for i := 0; i < n; i++ { - privkey := secp256k1.GenPrivKey() - pubkeys[i] = privkey.PubKey() - sig, _ := privkey.Sign(msg) - signatures[i] = &signing.SingleSignatureData{Signature: sig} - } - return -} - -func generateNestedMultiSignature(n int, msg []byte) (multisig.PubKey, *signing.MultiSignatureData) { - pubkeys := make([]crypto.PubKey, n) - signatures := make([]signing.SignatureData, n) - bitArray := types.NewCompactBitArray(n) - for i := 0; i < n; i++ { - nestedPks, nestedSigs := generatePubKeysAndSignatures(5, msg) - nestedBitArray := types.NewCompactBitArray(5) - for j := 0; j < 5; j++ { - nestedBitArray.SetIndex(j, true) - } - nestedSig := &signing.MultiSignatureData{ - BitArray: nestedBitArray, - Signatures: nestedSigs, - } - signatures[i] = nestedSig - pubkeys[i] = kmultisig.NewLegacyAminoPubKey(5, nestedPks) - bitArray.SetIndex(i, true) - } - return kmultisig.NewLegacyAminoPubKey(n, pubkeys), &signing.MultiSignatureData{ - BitArray: bitArray, - Signatures: signatures, - } -} From 04b86d9890732f5db56f1fd77b3a0146acdd1339 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Wed, 16 Sep 2020 15:49:47 +0200 Subject: [PATCH 078/128] Fix register amino --- crypto/codec/amino.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index 896bbf0a21fb..390e7815b6f4 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -6,6 +6,7 @@ import ( "github.com/tendermint/tendermint/crypto/sr25519" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" @@ -33,7 +34,7 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&secp256k1.PubKey{}, secp256k1.PubKeyName, nil) cdc.RegisterConcrete(&kmultisig.LegacyAminoPubKey{}, - "cosmos-sdk/LegacyAminoPubKey", nil) + multisig.PubKeyAminoRoute, nil) cdc.RegisterInterface((*crypto.PrivKey)(nil), nil) cdc.RegisterConcrete(ed25519.PrivKey{}, From 3211baa26c839c18b9b101f8681392a3796429d0 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Wed, 16 Sep 2020 15:53:46 +0200 Subject: [PATCH 079/128] Fix lint --- crypto/codec/amino.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index 390e7815b6f4..c3ef815d4002 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -6,7 +6,6 @@ import ( "github.com/tendermint/tendermint/crypto/sr25519" "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" @@ -34,7 +33,7 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&secp256k1.PubKey{}, secp256k1.PubKeyName, nil) cdc.RegisterConcrete(&kmultisig.LegacyAminoPubKey{}, - multisig.PubKeyAminoRoute, nil) + kmultisig.PubKeyAminoRoute, nil) cdc.RegisterInterface((*crypto.PrivKey)(nil), nil) cdc.RegisterConcrete(ed25519.PrivKey{}, From 2103eca61ef6abcc979b25d371216ac05d9b2cdc Mon Sep 17 00:00:00 2001 From: blushi Date: Wed, 16 Sep 2020 16:06:00 +0200 Subject: [PATCH 080/128] Use sdk crypto PubKey in multisig UnpackInterfaces --- crypto/keys/multisig/multisig.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crypto/keys/multisig/multisig.go b/crypto/keys/multisig/multisig.go index 1cc4fa444a66..b4b3eb870d56 100644 --- a/crypto/keys/multisig/multisig.go +++ b/crypto/keys/multisig/multisig.go @@ -6,6 +6,7 @@ import ( tmcrypto "github.com/tendermint/tendermint/crypto" "github.com/cosmos/cosmos-sdk/codec/types" + crypto "github.com/cosmos/cosmos-sdk/crypto/types" multisigtypes "github.com/cosmos/cosmos-sdk/crypto/types/multisig" "github.com/cosmos/cosmos-sdk/types/tx/signing" proto "github.com/gogo/protobuf/proto" @@ -143,7 +144,7 @@ func (m *LegacyAminoPubKey) Type() string { // UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces func (m *LegacyAminoPubKey) UnpackInterfaces(unpacker types.AnyUnpacker) error { for _, any := range m.PubKeys { - var pk tmcrypto.PubKey + var pk crypto.PubKey err := unpacker.UnpackAny(any, &pk) if err != nil { return err From 421f948ba69998c096358228b5cb2748de935ed7 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 17 Sep 2020 08:50:35 +0200 Subject: [PATCH 081/128] Potential fix? --- crypto/keyring/info.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/crypto/keyring/info.go b/crypto/keyring/info.go index 6bb7b60a8a20..93958aba3780 100644 --- a/crypto/keyring/info.go +++ b/crypto/keyring/info.go @@ -241,11 +241,8 @@ func (i multiInfo) GetPath() (*hd.BIP44Params, error) { // UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces func (i multiInfo) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { multiPK := i.PubKey.(*multisig.LegacyAminoPubKey) - err := codectypes.UnpackInterfaces(multiPK, unpacker) - if err != nil { - return err - } - return nil + + return codectypes.UnpackInterfaces(multiPK, unpacker) } // encoding info @@ -255,6 +252,16 @@ func marshalInfo(i Info) []byte { // decoding info func unmarshalInfo(bz []byte) (info Info, err error) { + // We first try to unmarshal into a multiInfo. This allows the unmarshal + // functions to unmarshal Anys correctly too. + var multi multiInfo + err = CryptoCdc.UnmarshalBinaryLengthPrefixed(bz, &multi) + if err == nil { + return multi, nil + } + + // The above might fail, e.g. when Info is a local, offline or ledger info. + // In this case, we just unmarshal into the interface. err = CryptoCdc.UnmarshalBinaryLengthPrefixed(bz, &info) return } From c63f3e7dd4483cadc3027342c034fd581a0fd5de Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 17 Sep 2020 09:35:49 +0200 Subject: [PATCH 082/128] Register LegacyAminoPubKey --- crypto/keys/codec.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crypto/keys/codec.go b/crypto/keys/codec.go index da8d6a75bc58..e13cfd4289a9 100644 --- a/crypto/keys/codec.go +++ b/crypto/keys/codec.go @@ -4,6 +4,7 @@ import ( "github.com/tendermint/tendermint/crypto" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" ) @@ -11,4 +12,5 @@ import ( func RegisterInterfaces(registry codectypes.InterfaceRegistry) { registry.RegisterInterface("crypto.Pubkey", (*crypto.PubKey)(nil)) registry.RegisterImplementations((*crypto.PubKey)(nil), &secp256k1.PubKey{}) + registry.RegisterImplementations((*crypto.PubKey)(nil), &multisig.LegacyAminoPubKey{}) } From d195542a43e0b54d2e78ebe7820b286c1e045d4f Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 17 Sep 2020 10:15:35 +0200 Subject: [PATCH 083/128] Register our own PubKey --- crypto/keys/codec.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/crypto/keys/codec.go b/crypto/keys/codec.go index e13cfd4289a9..94413e283c0b 100644 --- a/crypto/keys/codec.go +++ b/crypto/keys/codec.go @@ -1,16 +1,15 @@ package keys import ( - "github.com/tendermint/tendermint/crypto" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" ) // RegisterInterfaces registers the sdk.Tx interface. func RegisterInterfaces(registry codectypes.InterfaceRegistry) { - registry.RegisterInterface("crypto.Pubkey", (*crypto.PubKey)(nil)) - registry.RegisterImplementations((*crypto.PubKey)(nil), &secp256k1.PubKey{}) - registry.RegisterImplementations((*crypto.PubKey)(nil), &multisig.LegacyAminoPubKey{}) + registry.RegisterInterface("crypto.Pubkey", (*cryptotypes.PubKey)(nil)) + registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &secp256k1.PubKey{}) + registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &multisig.LegacyAminoPubKey{}) } From b35c35e4bb9973adfb11ec774fa23e1951f1e139 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 17 Sep 2020 10:22:40 +0200 Subject: [PATCH 084/128] Register tmcrypto PubKey --- crypto/keys/codec.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/crypto/keys/codec.go b/crypto/keys/codec.go index 94413e283c0b..8cb745486394 100644 --- a/crypto/keys/codec.go +++ b/crypto/keys/codec.go @@ -1,15 +1,16 @@ package keys import ( + tmcrypto "github.com/tendermint/tendermint/crypto" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" ) // RegisterInterfaces registers the sdk.Tx interface. func RegisterInterfaces(registry codectypes.InterfaceRegistry) { - registry.RegisterInterface("crypto.Pubkey", (*cryptotypes.PubKey)(nil)) - registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &secp256k1.PubKey{}) - registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &multisig.LegacyAminoPubKey{}) + registry.RegisterInterface("crypto.Pubkey", (*tmcrypto.PubKey)(nil)) + registry.RegisterImplementations((*tmcrypto.PubKey)(nil), &secp256k1.PubKey{}) + registry.RegisterImplementations((*tmcrypto.PubKey)(nil), &multisig.LegacyAminoPubKey{}) } From b19450f394cbcb894868ba496709401312072864 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 17 Sep 2020 10:36:48 +0200 Subject: [PATCH 085/128] Register both PubKeys --- crypto/keys/codec.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/crypto/keys/codec.go b/crypto/keys/codec.go index 8cb745486394..a0b94c59673d 100644 --- a/crypto/keys/codec.go +++ b/crypto/keys/codec.go @@ -6,11 +6,16 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" ) // RegisterInterfaces registers the sdk.Tx interface. func RegisterInterfaces(registry codectypes.InterfaceRegistry) { - registry.RegisterInterface("crypto.Pubkey", (*tmcrypto.PubKey)(nil)) + registry.RegisterInterface("tendermint.crypto.Pubkey", (*tmcrypto.PubKey)(nil)) registry.RegisterImplementations((*tmcrypto.PubKey)(nil), &secp256k1.PubKey{}) registry.RegisterImplementations((*tmcrypto.PubKey)(nil), &multisig.LegacyAminoPubKey{}) + + registry.RegisterInterface("crypto.Pubkey", (*cryptotypes.PubKey)(nil)) + registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &secp256k1.PubKey{}) + registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &multisig.LegacyAminoPubKey{}) } From 7175814c0766443d86cb8d11123d82c6868e99f5 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 17 Sep 2020 10:51:49 +0200 Subject: [PATCH 086/128] Register interfaces in test --- x/auth/tx/config_test.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/x/auth/tx/config_test.go b/x/auth/tx/config_test.go index 9a39f79b322c..b20cf1ce4e85 100644 --- a/x/auth/tx/config_test.go +++ b/x/auth/tx/config_test.go @@ -7,6 +7,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/std" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/testutil" @@ -14,7 +15,8 @@ import ( func TestGenerator(t *testing.T) { interfaceRegistry := codectypes.NewInterfaceRegistry() + std.RegisterInterfaces(interfaceRegistry) interfaceRegistry.RegisterImplementations((*sdk.Msg)(nil), &testdata.TestMsg{}) - marshaler := codec.NewProtoCodec(interfaceRegistry) - suite.Run(t, testutil.NewTxConfigTestSuite(NewTxConfig(marshaler, DefaultSignModes))) + protoCodec := codec.NewProtoCodec(interfaceRegistry) + suite.Run(t, testutil.NewTxConfigTestSuite(NewTxConfig(protoCodec, DefaultSignModes))) } From bf2347dfa047f5fb501c44383e0e12c931a70939 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 17 Sep 2020 10:54:55 +0200 Subject: [PATCH 087/128] Refactor fiels --- crypto/{keys/codec.go => codec/proto.go} | 2 +- std/codec.go | 6 +++--- x/auth/client/cli/cli_test.go | 2 -- 3 files changed, 4 insertions(+), 6 deletions(-) rename crypto/{keys/codec.go => codec/proto.go} (98%) diff --git a/crypto/keys/codec.go b/crypto/codec/proto.go similarity index 98% rename from crypto/keys/codec.go rename to crypto/codec/proto.go index a0b94c59673d..c43b8332e77d 100644 --- a/crypto/keys/codec.go +++ b/crypto/codec/proto.go @@ -1,4 +1,4 @@ -package keys +package codec import ( tmcrypto "github.com/tendermint/tendermint/crypto" diff --git a/std/codec.go b/std/codec.go index 3a4e78a72ce6..423a2add5b4a 100644 --- a/std/codec.go +++ b/std/codec.go @@ -4,22 +4,22 @@ import ( "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" - cryptokeys "github.com/cosmos/cosmos-sdk/crypto/keys" sdk "github.com/cosmos/cosmos-sdk/types" txtypes "github.com/cosmos/cosmos-sdk/types/tx" vesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" ) +// RegisterLegacyAminoCodec registers types with the Amino codec. func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { vesting.RegisterLegacyAminoCodec(cdc) sdk.RegisterLegacyAminoCodec(cdc) cryptocodec.RegisterCrypto(cdc) } -// RegisterInterfaces registers Interfaces from sdk/types and vesting +// RegisterInterfaces registers Interfaces from sdk/types, vesting, crypto, tx. func RegisterInterfaces(interfaceRegistry types.InterfaceRegistry) { sdk.RegisterInterfaces(interfaceRegistry) txtypes.RegisterInterfaces(interfaceRegistry) - cryptokeys.RegisterInterfaces(interfaceRegistry) + cryptocodec.RegisterInterfaces(interfaceRegistry) vesting.RegisterInterfaces(interfaceRegistry) } diff --git a/x/auth/client/cli/cli_test.go b/x/auth/client/cli/cli_test.go index ce3edb994fd4..9ad440760b76 100644 --- a/x/auth/client/cli/cli_test.go +++ b/x/auth/client/cli/cli_test.go @@ -1,5 +1,3 @@ -// +build norace - package cli_test import ( From 09e1fbc944052551c0ebefcdabfd3671f90ea649 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 17 Sep 2020 10:56:55 +0200 Subject: [PATCH 088/128] Add comments --- crypto/codec/proto.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crypto/codec/proto.go b/crypto/codec/proto.go index c43b8332e77d..5cf1abb38830 100644 --- a/crypto/codec/proto.go +++ b/crypto/codec/proto.go @@ -11,11 +11,14 @@ import ( // RegisterInterfaces registers the sdk.Tx interface. func RegisterInterfaces(registry codectypes.InterfaceRegistry) { + // TODO We now register both Tendermint's PubKey and our own PubKey. In the + // long-term, we should move away from Tendermint's PubKey, and delete + // these lines registry.RegisterInterface("tendermint.crypto.Pubkey", (*tmcrypto.PubKey)(nil)) registry.RegisterImplementations((*tmcrypto.PubKey)(nil), &secp256k1.PubKey{}) registry.RegisterImplementations((*tmcrypto.PubKey)(nil), &multisig.LegacyAminoPubKey{}) - registry.RegisterInterface("crypto.Pubkey", (*cryptotypes.PubKey)(nil)) + registry.RegisterInterface("cosmos.crypto.Pubkey", (*cryptotypes.PubKey)(nil)) registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &secp256k1.PubKey{}) registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &multisig.LegacyAminoPubKey{}) } From ed016206faedbcad9e5ac8705add5456036e8262 Mon Sep 17 00:00:00 2001 From: blushi Date: Thu, 17 Sep 2020 11:20:04 +0200 Subject: [PATCH 089/128] Remove old cosmos-sdk/crypto/keys reference --- testutil/testdata/test_tx.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/testutil/testdata/test_tx.go b/testutil/testdata/test_tx.go index 2a8cab662818..bbcfde5f8195 100644 --- a/testutil/testdata/test_tx.go +++ b/testutil/testdata/test_tx.go @@ -5,7 +5,6 @@ import ( "github.com/tendermint/tendermint/crypto" - "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -13,7 +12,7 @@ import ( // KeyTestPubAddr generates a new secp256k1 keypair. func KeyTestPubAddr() (crypto.PrivKey, crypto.PubKey, sdk.AccAddress) { key := secp256k1.GenPrivKey() - pub := &keys.Secp256K1PubKey{Key: key.PubKey().(secp256k1.PubKey)} + pub := key.PubKey() addr := sdk.AccAddress(pub.Address()) return key, pub, addr } From 8f1fda16736421b6a2493a411587f676f6138237 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 17 Sep 2020 17:56:11 +0200 Subject: [PATCH 090/128] Use anil's suggestion --- crypto/keyring/info.go | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/crypto/keyring/info.go b/crypto/keyring/info.go index 93958aba3780..366e474d227e 100644 --- a/crypto/keyring/info.go +++ b/crypto/keyring/info.go @@ -252,16 +252,25 @@ func marshalInfo(i Info) []byte { // decoding info func unmarshalInfo(bz []byte) (info Info, err error) { - // We first try to unmarshal into a multiInfo. This allows the unmarshal - // functions to unmarshal Anys correctly too. - var multi multiInfo - err = CryptoCdc.UnmarshalBinaryLengthPrefixed(bz, &multi) - if err == nil { - return multi, nil + err = CryptoCdc.UnmarshalBinaryLengthPrefixed(bz, &info) + if err != nil { + return nil, err + } + + // After unmarshalling into &info, if we notice that the info is a + // multiInfo, then we unmarshal again, explicitly in a multiInfo this time. + // Since multiInfo implements UnpackInterfacesMessage, this will correctly + // unpack the underlying anys inside the multiInfo. + // + // This is a workaround, as go cannot check that an interface (Info) + // implements another interface (UnpackInterfacesMessage). + _, ok := info.(multiInfo) + if ok { + var multi multiInfo + err = CryptoCdc.UnmarshalBinaryLengthPrefixed(bz, &multi) + + return multi, err } - // The above might fail, e.g. when Info is a local, offline or ledger info. - // In this case, we just unmarshal into the interface. - err = CryptoCdc.UnmarshalBinaryLengthPrefixed(bz, &info) return } From 27ae6075ea83ce2bceac6c57c53145a0481f51d3 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Thu, 17 Sep 2020 19:07:34 +0200 Subject: [PATCH 091/128] Add norace back --- x/auth/client/cli/cli_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/x/auth/client/cli/cli_test.go b/x/auth/client/cli/cli_test.go index 9ad440760b76..ce3edb994fd4 100644 --- a/x/auth/client/cli/cli_test.go +++ b/x/auth/client/cli/cli_test.go @@ -1,3 +1,5 @@ +// +build norace + package cli_test import ( From 006d5966a32738b43ccbc965a6fe0be7b3f1e534 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 Sep 2020 11:57:53 +0200 Subject: [PATCH 092/128] Use our own ed25519 --- client/debug/main.go | 4 +- crypto/codec/amino.go | 2 +- crypto/keyring/keyring_test.go | 2 +- crypto/keys/ed25519/ed25519.go | 158 +++++++ crypto/keys/ed25519/ed25519_test.go | 30 ++ crypto/keys/ed25519/keys.pb.go | 502 ++++++++++++++++++++++ crypto/keys/multisig/codec.go | 2 +- proto/cosmos/crypto/ed25519/keys.proto | 22 + simapp/test_helpers.go | 2 +- types/address_bench_test.go | 2 +- types/address_test.go | 2 +- types/simulation/account.go | 2 +- x/auth/ante/ante_test.go | 2 +- x/auth/ante/sigverify.go | 3 +- x/auth/ante/sigverify_test.go | 2 +- x/auth/client/tx_test.go | 15 +- x/auth/simulation/decoder_test.go | 2 +- x/auth/types/genesis_test.go | 2 +- x/auth/types/stdtx_test.go | 2 +- x/auth/vesting/types/genesis_test.go | 2 +- x/distribution/proposal_handler_test.go | 2 +- x/distribution/simulation/decoder_test.go | 2 +- x/distribution/types/common_test.go | 2 +- x/evidence/genesis_test.go | 2 +- x/evidence/handler_test.go | 2 +- x/evidence/keeper/keeper_test.go | 2 +- x/evidence/simulation/decoder_test.go | 2 +- x/evidence/types/genesis_test.go | 2 +- x/evidence/types/msgs_test.go | 5 +- x/genutil/types/genesis_state_test.go | 2 +- x/gov/common_test.go | 2 +- x/gov/simulation/decoder_test.go | 2 +- x/gov/types/keys_test.go | 2 +- x/ibc/testing/mock/privval.go | 3 +- x/slashing/app_test.go | 2 +- x/slashing/simulation/decoder_test.go | 2 +- x/staking/client/cli/cli_test.go | 2 +- x/staking/common_test.go | 2 +- x/staking/genesis_test.go | 2 +- x/staking/simulation/decoder_test.go | 2 +- x/staking/types/keys_test.go | 2 +- x/staking/types/test_utils.go | 2 +- x/staking/types/validator_test.go | 3 +- 43 files changed, 759 insertions(+), 52 deletions(-) create mode 100644 crypto/keys/ed25519/ed25519.go create mode 100644 crypto/keys/ed25519/ed25519_test.go create mode 100644 crypto/keys/ed25519/keys.pb.go create mode 100644 proto/cosmos/crypto/ed25519/keys.proto diff --git a/client/debug/main.go b/client/debug/main.go index a35fdecf01ab..f79329e00c6b 100644 --- a/client/debug/main.go +++ b/client/debug/main.go @@ -7,9 +7,9 @@ import ( "strconv" "strings" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/spf13/cobra" "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" "github.com/cosmos/cosmos-sdk/client" sdk "github.com/cosmos/cosmos-sdk/types" @@ -34,7 +34,7 @@ func Cmd() *cobra.Command { // to decode the pubkey string from hex, base64, and finally bech32. If all // encodings fail, an error is returned. func getPubKeyFromString(pkstr string) (crypto.PubKey, error) { - pubKey := make(ed25519.PubKey, ed25519.PubKeySize) + pubKey := make([]byte, ed25519.PubKeySize) bz, err := hex.DecodeString(pkstr) if err == nil { diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index c3ef815d4002..c989e6ff1cd3 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -2,10 +2,10 @@ package codec import ( "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/crypto/sr25519" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" diff --git a/crypto/keyring/keyring_test.go b/crypto/keyring/keyring_test.go index ac2ba0381c12..bd13b699bcc6 100644 --- a/crypto/keyring/keyring_test.go +++ b/crypto/keyring/keyring_test.go @@ -9,10 +9,10 @@ import ( bip39 "github.com/cosmos/go-bip39" "github.com/stretchr/testify/require" tmcrypto "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" "github.com/cosmos/cosmos-sdk/crypto" "github.com/cosmos/cosmos-sdk/crypto/hd" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/testutil" diff --git a/crypto/keys/ed25519/ed25519.go b/crypto/keys/ed25519/ed25519.go new file mode 100644 index 000000000000..9c2d7c3b16e1 --- /dev/null +++ b/crypto/keys/ed25519/ed25519.go @@ -0,0 +1,158 @@ +package ed25519 + +import ( + "crypto/subtle" + "fmt" + "io" + + "golang.org/x/crypto/ed25519" + + "github.com/tendermint/tendermint/crypto" + "github.com/tendermint/tendermint/crypto/tmhash" +) + +//------------------------------------- + +var _ crypto.PrivKey = PrivKey{} + +const ( + PrivKeyName = "tendermint/PrivKeyEd25519" + PubKeyName = "tendermint/PubKeyEd25519" + // PubKeySize is is the size, in bytes, of public keys as used in this package. + PubKeySize = 32 + // PrivateKeySize is the size, in bytes, of private keys as used in this package. + PrivateKeySize = 64 + // Size of an Edwards25519 signature. Namely the size of a compressed + // Edwards25519 point, and a field element. Both of which are 32 bytes. + SignatureSize = 64 + // SeedSize is the size, in bytes, of private key seeds. These are the + // private key representations used by RFC 8032. + SeedSize = 32 + + keyType = "ed25519" +) + +// Bytes returns the privkey byte format. +func (privKey PrivKey) Bytes() []byte { + return privKey.Key +} + +// Sign produces a signature on the provided message. +// This assumes the privkey is wellformed in the golang format. +// The first 32 bytes should be random, +// corresponding to the normal ed25519 private key. +// The latter 32 bytes should be the compressed public key. +// If these conditions aren't met, Sign will panic or produce an +// incorrect signature. +func (privKey PrivKey) Sign(msg []byte) ([]byte, error) { + signatureBytes := ed25519.Sign(ed25519.PrivateKey(privKey.Key), msg) + return signatureBytes, nil +} + +// PubKey gets the corresponding public key from the private key. +// +// Panics if the private key is not initialized. +func (privKey PrivKey) PubKey() crypto.PubKey { + // If the latter 32 bytes of the privkey are all zero, privkey is not + // initialized. + initialized := false + for _, v := range privKey.Key[32:] { + if v != 0 { + initialized = true + break + } + } + + if !initialized { + panic("Expected ed25519 PrivKey to include concatenated pubkey bytes") + } + + pubkeyBytes := make([]byte, PubKeySize) + copy(pubkeyBytes, privKey.Key[32:]) + return PubKey{Key: pubkeyBytes} +} + +// Equals - you probably don't need to use this. +// Runs in constant time based on length of the keys. +func (privKey PrivKey) Equals(other crypto.PrivKey) bool { + if privKey.Type() != other.Type() { + return false + } + + return subtle.ConstantTimeCompare(privKey.Bytes(), other.Bytes()) == 1 +} + +func (privKey PrivKey) Type() string { + return PrivKeyName +} + +// GenPrivKey generates a new ed25519 private key. +// It uses OS randomness in conjunction with the current global random seed +// in tendermint/libs/common to generate the private key. +func GenPrivKey() PrivKey { + return genPrivKey(crypto.CReader()) +} + +// genPrivKey generates a new ed25519 private key using the provided reader. +func genPrivKey(rand io.Reader) PrivKey { + seed := make([]byte, SeedSize) + + _, err := io.ReadFull(rand, seed) + if err != nil { + panic(err) + } + + return PrivKey{Key: ed25519.NewKeyFromSeed(seed)} +} + +// GenPrivKeyFromSecret hashes the secret with SHA2, and uses +// that 32 byte output to create the private key. +// NOTE: secret should be the output of a KDF like bcrypt, +// if it's derived from user input. +func GenPrivKeyFromSecret(secret []byte) PrivKey { + seed := crypto.Sha256(secret) // Not Ripemd160 because we want 32 bytes. + + return PrivKey{Key: ed25519.NewKeyFromSeed(seed)} +} + +//------------------------------------- + +var _ crypto.PubKey = PubKey{} + +// Address is the SHA256-20 of the raw pubkey bytes. +func (pubKey PubKey) Address() crypto.Address { + if len(pubKey.Key) != PubKeySize { + panic("pubkey is incorrect size") + } + return crypto.Address(tmhash.SumTruncated(pubKey.Key)) +} + +// Bytes returns the PubKey byte format. +func (pubKey PubKey) Bytes() []byte { + return pubKey.Key +} + +func (pubKey PubKey) VerifySignature(msg []byte, sig []byte) bool { + // make sure we use the same algorithm to sign + if len(sig) != SignatureSize { + return false + } + + return ed25519.Verify(ed25519.PublicKey(pubKey.Key), msg, sig) +} + +func (pubKey PubKey) String() string { + return fmt.Sprintf("PubKeyEd25519{%X}", pubKey.Key) +} + +func (pubKey PubKey) Type() string { + return PubKeyName +} + +func (pubKey PubKey) Equals(other crypto.PubKey) bool { + if pubKey.Type() != other.Type() { + return false + } + + return subtle.ConstantTimeCompare(pubKey.Bytes(), other.Bytes()) == 1 +} diff --git a/crypto/keys/ed25519/ed25519_test.go b/crypto/keys/ed25519/ed25519_test.go new file mode 100644 index 000000000000..487097692804 --- /dev/null +++ b/crypto/keys/ed25519/ed25519_test.go @@ -0,0 +1,30 @@ +package ed25519_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/crypto" + + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" +) + +func TestSignAndValidateEd25519(t *testing.T) { + + privKey := ed25519.GenPrivKey() + pubKey := privKey.PubKey() + + msg := crypto.CRandBytes(128) + sig, err := privKey.Sign(msg) + require.Nil(t, err) + + // Test the signature + assert.True(t, pubKey.VerifySignature(msg, sig)) + + // Mutate the signature, just one bit. + // TODO: Replace this with a much better fuzzer, tendermint/ed25519/issues/10 + sig[7] ^= byte(0x01) + + assert.False(t, pubKey.VerifySignature(msg, sig)) +} diff --git a/crypto/keys/ed25519/keys.pb.go b/crypto/keys/ed25519/keys.pb.go new file mode 100644 index 000000000000..2951e0ae28db --- /dev/null +++ b/crypto/keys/ed25519/keys.pb.go @@ -0,0 +1,502 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: cosmos/crypto/ed25519/keys.proto + +package ed25519 + +import ( + fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// PubKey defines a ed25519 public key +// Key is the compressed form of the pubkey. The first byte depends is a 0x02 byte +// if the y-coordinate is the lexicographically largest of the two associated with +// the x-coordinate. Otherwise the first byte is a 0x03. +// This prefix is followed with the x-coordinate. +type PubKey struct { + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` +} + +func (m *PubKey) Reset() { *m = PubKey{} } +func (*PubKey) ProtoMessage() {} +func (*PubKey) Descriptor() ([]byte, []int) { + return fileDescriptor_48fe3336771e732d, []int{0} +} +func (m *PubKey) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PubKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PubKey.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PubKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_PubKey.Merge(m, src) +} +func (m *PubKey) XXX_Size() int { + return m.Size() +} +func (m *PubKey) XXX_DiscardUnknown() { + xxx_messageInfo_PubKey.DiscardUnknown(m) +} + +var xxx_messageInfo_PubKey proto.InternalMessageInfo + +func (m *PubKey) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +// PrivKey defines a ed25519 private key. +type PrivKey struct { + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` +} + +func (m *PrivKey) Reset() { *m = PrivKey{} } +func (m *PrivKey) String() string { return proto.CompactTextString(m) } +func (*PrivKey) ProtoMessage() {} +func (*PrivKey) Descriptor() ([]byte, []int) { + return fileDescriptor_48fe3336771e732d, []int{1} +} +func (m *PrivKey) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PrivKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PrivKey.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PrivKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_PrivKey.Merge(m, src) +} +func (m *PrivKey) XXX_Size() int { + return m.Size() +} +func (m *PrivKey) XXX_DiscardUnknown() { + xxx_messageInfo_PrivKey.DiscardUnknown(m) +} + +var xxx_messageInfo_PrivKey proto.InternalMessageInfo + +func (m *PrivKey) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func init() { + proto.RegisterType((*PubKey)(nil), "cosmos.crypto.ed25519.PubKey") + proto.RegisterType((*PrivKey)(nil), "cosmos.crypto.ed25519.PrivKey") +} + +func init() { proto.RegisterFile("cosmos/crypto/ed25519/keys.proto", fileDescriptor_48fe3336771e732d) } + +var fileDescriptor_48fe3336771e732d = []byte{ + // 183 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x48, 0xce, 0x2f, 0xce, + 0xcd, 0x2f, 0xd6, 0x4f, 0x2e, 0xaa, 0x2c, 0x28, 0xc9, 0xd7, 0x4f, 0x4d, 0x31, 0x32, 0x35, 0x35, + 0xb4, 0xd4, 0xcf, 0x4e, 0xad, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x85, 0xa8, + 0xd0, 0x83, 0xa8, 0xd0, 0x83, 0xaa, 0x90, 0x12, 0x49, 0xcf, 0x4f, 0xcf, 0x07, 0xab, 0xd0, 0x07, + 0xb1, 0x20, 0x8a, 0x95, 0x14, 0xb8, 0xd8, 0x02, 0x4a, 0x93, 0xbc, 0x53, 0x2b, 0x85, 0x04, 0xb8, + 0x98, 0xb3, 0x53, 0x2b, 0x25, 0x18, 0x15, 0x18, 0x35, 0x78, 0x82, 0x40, 0x4c, 0x2b, 0x96, 0x19, + 0x0b, 0xe4, 0x19, 0x94, 0xa4, 0xb9, 0xd8, 0x03, 0x8a, 0x32, 0xcb, 0xb0, 0x2a, 0x71, 0xf2, 0x3a, + 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, + 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, 0x28, 0x83, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, + 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0x98, 0x93, 0xc1, 0x94, 0x6e, 0x71, 0x4a, 0x36, 0xcc, 0xf5, + 0x20, 0x57, 0xc3, 0xbc, 0x90, 0xc4, 0x06, 0x76, 0x91, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0xcc, + 0xf3, 0x11, 0x99, 0xe2, 0x00, 0x00, 0x00, +} + +func (m *PubKey) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PubKey) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PubKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *PrivKey) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PrivKey) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PrivKey) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintKeys(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintKeys(dAtA []byte, offset int, v uint64) int { + offset -= sovKeys(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *PubKey) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovKeys(uint64(l)) + } + return n +} + +func (m *PrivKey) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovKeys(uint64(l)) + } + return n +} + +func sovKeys(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozKeys(x uint64) (n int) { + return sovKeys(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *PubKey) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PubKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PubKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthKeys + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthKeys + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipKeys(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PrivKey) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PrivKey: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PrivKey: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKeys + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthKeys + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthKeys + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipKeys(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthKeys + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipKeys(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKeys + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKeys + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowKeys + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthKeys + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupKeys + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthKeys + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthKeys = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowKeys = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupKeys = fmt.Errorf("proto: unexpected end of group") +) diff --git a/crypto/keys/multisig/codec.go b/crypto/keys/multisig/codec.go index aedb6bc0ac65..d76dc83ba1d3 100644 --- a/crypto/keys/multisig/codec.go +++ b/crypto/keys/multisig/codec.go @@ -1,8 +1,8 @@ package multisig import ( + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/crypto/sr25519" "github.com/cosmos/cosmos-sdk/codec" diff --git a/proto/cosmos/crypto/ed25519/keys.proto b/proto/cosmos/crypto/ed25519/keys.proto new file mode 100644 index 000000000000..abf6f98d8e49 --- /dev/null +++ b/proto/cosmos/crypto/ed25519/keys.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; +package cosmos.crypto.ed25519; + +import "gogoproto/gogo.proto"; + +option go_package = "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"; + +// PubKey defines a ed25519 public key +// Key is the compressed form of the pubkey. The first byte depends is a 0x02 byte +// if the y-coordinate is the lexicographically largest of the two associated with +// the x-coordinate. Otherwise the first byte is a 0x03. +// This prefix is followed with the x-coordinate. +message PubKey { + option (gogoproto.goproto_stringer) = false; + + bytes key = 1; +} + +// PrivKey defines a ed25519 private key. +message PrivKey { + bytes key = 1; +} diff --git a/simapp/test_helpers.go b/simapp/test_helpers.go index 28ad7e0bda5d..718e8e64c092 100644 --- a/simapp/test_helpers.go +++ b/simapp/test_helpers.go @@ -12,7 +12,6 @@ import ( "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" @@ -20,6 +19,7 @@ import ( bam "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp/helpers" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" diff --git a/types/address_bench_test.go b/types/address_bench_test.go index d9c1aa7325cd..e6ddc506740a 100644 --- a/types/address_bench_test.go +++ b/types/address_bench_test.go @@ -6,8 +6,8 @@ import ( "time" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/types" ) diff --git a/types/address_test.go b/types/address_test.go index 67e3add6c0ba..2a89425ff5e9 100644 --- a/types/address_test.go +++ b/types/address_test.go @@ -10,9 +10,9 @@ import ( "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" yaml "gopkg.in/yaml.v2" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/types" ) diff --git a/types/simulation/account.go b/types/simulation/account.go index 2f45ad43d688..b0c6b7bd687a 100644 --- a/types/simulation/account.go +++ b/types/simulation/account.go @@ -4,8 +4,8 @@ import ( "math/rand" "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/auth/ante/ante_test.go b/x/auth/ante/ante_test.go index 670985f781ed..9b0cbbf3abcc 100644 --- a/x/auth/ante/ante_test.go +++ b/x/auth/ante/ante_test.go @@ -9,8 +9,8 @@ import ( "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/testutil/testdata" diff --git a/x/auth/ante/sigverify.go b/x/auth/ante/sigverify.go index 8d30d54d0649..68646db32c34 100644 --- a/x/auth/ante/sigverify.go +++ b/x/auth/ante/sigverify.go @@ -5,8 +5,7 @@ import ( "encoding/hex" "fmt" - "github.com/tendermint/tendermint/crypto/ed25519" - + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/auth/ante/sigverify_test.go b/x/auth/ante/sigverify_test.go index 58d1dea8b337..0b721505a430 100644 --- a/x/auth/ante/sigverify_test.go +++ b/x/auth/ante/sigverify_test.go @@ -4,10 +4,10 @@ import ( "fmt" "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" diff --git a/x/auth/client/tx_test.go b/x/auth/client/tx_test.go index bf433f1e332b..1fcf13afe335 100644 --- a/x/auth/client/tx_test.go +++ b/x/auth/client/tx_test.go @@ -5,20 +5,17 @@ import ( "strings" "testing" - "github.com/tendermint/tendermint/crypto/ed25519" - - "github.com/cosmos/cosmos-sdk/simapp" - "github.com/cosmos/cosmos-sdk/testutil" - "github.com/cosmos/cosmos-sdk/testutil/testdata" - authclient "github.com/cosmos/cosmos-sdk/x/auth/client" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/stretchr/testify/require" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + "github.com/cosmos/cosmos-sdk/simapp" + "github.com/cosmos/cosmos-sdk/testutil" + "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" + authclient "github.com/cosmos/cosmos-sdk/x/auth/client" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) diff --git a/x/auth/simulation/decoder_test.go b/x/auth/simulation/decoder_test.go index 453966a1fd8b..c7ececcf95cc 100644 --- a/x/auth/simulation/decoder_test.go +++ b/x/auth/simulation/decoder_test.go @@ -6,8 +6,8 @@ import ( gogotypes "github.com/gogo/protobuf/types" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/kv" diff --git a/x/auth/types/genesis_test.go b/x/auth/types/genesis_test.go index 2c4d5cea002a..1030885e799e 100644 --- a/x/auth/types/genesis_test.go +++ b/x/auth/types/genesis_test.go @@ -6,9 +6,9 @@ import ( proto "github.com/gogo/protobuf/proto" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/types" ) diff --git a/x/auth/types/stdtx_test.go b/x/auth/types/stdtx_test.go index 86bf72441d23..f221891cbf01 100644 --- a/x/auth/types/stdtx_test.go +++ b/x/auth/types/stdtx_test.go @@ -6,13 +6,13 @@ import ( "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" yaml "gopkg.in/yaml.v2" "github.com/cosmos/cosmos-sdk/codec" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/testutil/testdata" diff --git a/x/auth/vesting/types/genesis_test.go b/x/auth/vesting/types/genesis_test.go index 79913adf7de5..98aabb15cfde 100644 --- a/x/auth/vesting/types/genesis_test.go +++ b/x/auth/vesting/types/genesis_test.go @@ -4,8 +4,8 @@ import ( "testing" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) diff --git a/x/distribution/proposal_handler_test.go b/x/distribution/proposal_handler_test.go index 34e99fb27bd3..575dbb199cbe 100644 --- a/x/distribution/proposal_handler_test.go +++ b/x/distribution/proposal_handler_test.go @@ -4,9 +4,9 @@ import ( "testing" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/distribution" diff --git a/x/distribution/simulation/decoder_test.go b/x/distribution/simulation/decoder_test.go index 8b65d08a09e5..7a705f97da10 100644 --- a/x/distribution/simulation/decoder_test.go +++ b/x/distribution/simulation/decoder_test.go @@ -5,8 +5,8 @@ import ( "testing" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/kv" diff --git a/x/distribution/types/common_test.go b/x/distribution/types/common_test.go index c9dbfde6f0b1..a8301b4e42bd 100644 --- a/x/distribution/types/common_test.go +++ b/x/distribution/types/common_test.go @@ -2,8 +2,8 @@ package types import ( "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/evidence/genesis_test.go b/x/evidence/genesis_test.go index dbd69dca34c5..bbe8a529e9b3 100644 --- a/x/evidence/genesis_test.go +++ b/x/evidence/genesis_test.go @@ -5,10 +5,10 @@ import ( "testing" "github.com/stretchr/testify/suite" - "github.com/tendermint/tendermint/crypto/ed25519" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/tendermint/tendermint/types/time" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/evidence" diff --git a/x/evidence/handler_test.go b/x/evidence/handler_test.go index 1d5388b7c88e..e30950bf7875 100644 --- a/x/evidence/handler_test.go +++ b/x/evidence/handler_test.go @@ -7,9 +7,9 @@ import ( "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" - "github.com/tendermint/tendermint/crypto/ed25519" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/evidence" diff --git a/x/evidence/keeper/keeper_test.go b/x/evidence/keeper/keeper_test.go index e6096f7fecaf..8efc6c6da622 100644 --- a/x/evidence/keeper/keeper_test.go +++ b/x/evidence/keeper/keeper_test.go @@ -8,10 +8,10 @@ import ( "github.com/stretchr/testify/suite" "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" diff --git a/x/evidence/simulation/decoder_test.go b/x/evidence/simulation/decoder_test.go index b8d1e70c179c..4fca07099903 100644 --- a/x/evidence/simulation/decoder_test.go +++ b/x/evidence/simulation/decoder_test.go @@ -6,8 +6,8 @@ import ( "time" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/kv" diff --git a/x/evidence/types/genesis_test.go b/x/evidence/types/genesis_test.go index 12b99603e5ec..051f21d9092b 100644 --- a/x/evidence/types/genesis_test.go +++ b/x/evidence/types/genesis_test.go @@ -6,11 +6,11 @@ import ( "time" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" tmbytes "github.com/tendermint/tendermint/libs/bytes" "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/x/evidence/exported" "github.com/cosmos/cosmos-sdk/x/evidence/types" ) diff --git a/x/evidence/types/msgs_test.go b/x/evidence/types/msgs_test.go index 5947065a727a..959ceb3ef8c4 100644 --- a/x/evidence/types/msgs_test.go +++ b/x/evidence/types/msgs_test.go @@ -4,13 +4,12 @@ import ( "testing" "time" - "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/stretchr/testify/require" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/evidence/exported" "github.com/cosmos/cosmos-sdk/x/evidence/types" - - "github.com/stretchr/testify/require" ) func testMsgSubmitEvidence(t *testing.T, e exported.Evidence, s sdk.AccAddress) exported.MsgSubmitEvidence { diff --git a/x/genutil/types/genesis_state_test.go b/x/genutil/types/genesis_state_test.go index 8040da552a5f..475a9478f2f1 100644 --- a/x/genutil/types/genesis_state_test.go +++ b/x/genutil/types/genesis_state_test.go @@ -6,9 +6,9 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" diff --git a/x/gov/common_test.go b/x/gov/common_test.go index 81bfd32fd85b..aef391d794aa 100644 --- a/x/gov/common_test.go +++ b/x/gov/common_test.go @@ -8,8 +8,8 @@ import ( "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/gov/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" diff --git a/x/gov/simulation/decoder_test.go b/x/gov/simulation/decoder_test.go index c5c9e720d92e..7a5b0fc1bc9d 100644 --- a/x/gov/simulation/decoder_test.go +++ b/x/gov/simulation/decoder_test.go @@ -7,8 +7,8 @@ import ( "time" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/kv" diff --git a/x/gov/types/keys_test.go b/x/gov/types/keys_test.go index 80d77c66043a..80dfa7d207a3 100644 --- a/x/gov/types/keys_test.go +++ b/x/gov/types/keys_test.go @@ -5,8 +5,8 @@ import ( "time" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/ibc/testing/mock/privval.go b/x/ibc/testing/mock/privval.go index 22aa04c54192..ec40a8aad6ba 100644 --- a/x/ibc/testing/mock/privval.go +++ b/x/ibc/testing/mock/privval.go @@ -2,9 +2,10 @@ package mock import ( "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" + + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" ) var _ tmtypes.PrivValidator = PV{} diff --git a/x/slashing/app_test.go b/x/slashing/app_test.go index bfe8c8b45bee..a8959fb610c3 100644 --- a/x/slashing/app_test.go +++ b/x/slashing/app_test.go @@ -6,9 +6,9 @@ import ( "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/crypto/ed25519" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/slashing/simulation/decoder_test.go b/x/slashing/simulation/decoder_test.go index 493645392f1f..e6122f0e0a98 100644 --- a/x/slashing/simulation/decoder_test.go +++ b/x/slashing/simulation/decoder_test.go @@ -7,8 +7,8 @@ import ( gogotypes "github.com/gogo/protobuf/types" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/kv" diff --git a/x/staking/client/cli/cli_test.go b/x/staking/client/cli/cli_test.go index 88945a10fb15..23772a80ccba 100644 --- a/x/staking/client/cli/cli_test.go +++ b/x/staking/client/cli/cli_test.go @@ -10,12 +10,12 @@ import ( "github.com/gogo/protobuf/proto" "github.com/stretchr/testify/suite" - "github.com/tendermint/tendermint/crypto/ed25519" tmcli "github.com/tendermint/tendermint/libs/cli" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/staking/common_test.go b/x/staking/common_test.go index 948159d138e2..f7bca291b869 100644 --- a/x/staking/common_test.go +++ b/x/staking/common_test.go @@ -2,10 +2,10 @@ package staking_test import ( "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/x/staking/genesis_test.go b/x/staking/genesis_test.go index 989bf56bf00d..55daa7935a50 100644 --- a/x/staking/genesis_test.go +++ b/x/staking/genesis_test.go @@ -7,8 +7,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" - "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" diff --git a/x/staking/simulation/decoder_test.go b/x/staking/simulation/decoder_test.go index 05ba5798cde7..dc5ddaf216cf 100644 --- a/x/staking/simulation/decoder_test.go +++ b/x/staking/simulation/decoder_test.go @@ -6,10 +6,10 @@ import ( "time" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" "github.com/cosmos/cosmos-sdk/codec" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/kv" diff --git a/x/staking/types/keys_test.go b/x/staking/types/keys_test.go index 0f11cf27f7f6..725438707c76 100644 --- a/x/staking/types/keys_test.go +++ b/x/staking/types/keys_test.go @@ -8,8 +8,8 @@ import ( "time" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/staking/types/test_utils.go b/x/staking/types/test_utils.go index 9ab8aabfe82c..a65a0ee9e078 100644 --- a/x/staking/types/test_utils.go +++ b/x/staking/types/test_utils.go @@ -2,8 +2,8 @@ package types import ( "github.com/tendermint/tendermint/crypto" - "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/staking/types/validator_test.go b/x/staking/types/validator_test.go index 62b0bb5826f0..021bae3d1854 100644 --- a/x/staking/types/validator_test.go +++ b/x/staking/types/validator_test.go @@ -8,12 +8,11 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/crypto/ed25519" - "github.com/tendermint/tendermint/crypto/encoding" tmtypes "github.com/tendermint/tendermint/types" "github.com/cosmos/cosmos-sdk/codec/legacy" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" ) From 57850e71b08245f294af9756179bace533b99841 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 Sep 2020 12:18:13 +0200 Subject: [PATCH 093/128] Fix pubkey types --- client/debug/main.go | 8 +++---- crypto/codec/amino.go | 8 +++---- crypto/codec/proto.go | 7 ++++-- crypto/keys/ed25519/ed25519.go | 38 ++++++++++++++++---------------- simapp/test_helpers.go | 4 ++-- types/address_bench_test.go | 10 +++++---- types/address_test.go | 30 +++++++++++++++---------- x/auth/ante/ante_test.go | 2 +- x/auth/ante/sigverify.go | 2 +- x/evidence/keeper/keeper_test.go | 3 +-- 10 files changed, 61 insertions(+), 51 deletions(-) diff --git a/client/debug/main.go b/client/debug/main.go index f79329e00c6b..cebb9073b6ec 100644 --- a/client/debug/main.go +++ b/client/debug/main.go @@ -39,13 +39,13 @@ func getPubKeyFromString(pkstr string) (crypto.PubKey, error) { bz, err := hex.DecodeString(pkstr) if err == nil { copy(pubKey[:], bz) - return pubKey, nil + return &ed25519.PubKey{Key: pubKey}, nil } bz, err = base64.StdEncoding.DecodeString(pkstr) if err == nil { copy(pubKey[:], bz) - return pubKey, nil + return &ed25519.PubKey{Key: pubKey}, nil } pk, err := sdk.GetPubKeyFromBech32(sdk.Bech32PubKeyTypeAccPub, pkstr) @@ -85,7 +85,7 @@ $ %s debug pubkey cosmos1e0jnq2sun3dzjh8p2xq95kk0expwmd7shwjpfg return err } - edPK, ok := pk.(ed25519.PubKey) + edPK, ok := pk.(*ed25519.PubKey) if !ok { return fmt.Errorf("invalid pubkey type; expected ED25519") } @@ -108,7 +108,7 @@ $ %s debug pubkey cosmos1e0jnq2sun3dzjh8p2xq95kk0expwmd7shwjpfg } cmd.Println("Address:", edPK.Address()) - cmd.Printf("Hex: %X\n", edPK[:]) + cmd.Printf("Hex: %X\n", edPK.Key[:]) cmd.Println("JSON (base64):", string(pubKeyJSONBytes)) cmd.Println("Bech32 Acc:", accPub) cmd.Println("Bech32 Validator Operator:", valPub) diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index c989e6ff1cd3..27ccda57df4e 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -26,20 +26,20 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { // first line. cdc.RegisterInterface((*crypto.PubKey)(nil), nil) cdc.RegisterInterface((*cryptotypes.PubKey)(nil), nil) - cdc.RegisterConcrete(ed25519.PubKey{}, - ed25519.PubKeyName, nil) cdc.RegisterConcrete(sr25519.PubKey{}, sr25519.PubKeyName, nil) + cdc.RegisterConcrete(&ed25519.PubKey{}, + ed25519.PubKeyName, nil) cdc.RegisterConcrete(&secp256k1.PubKey{}, secp256k1.PubKeyName, nil) cdc.RegisterConcrete(&kmultisig.LegacyAminoPubKey{}, kmultisig.PubKeyAminoRoute, nil) cdc.RegisterInterface((*crypto.PrivKey)(nil), nil) - cdc.RegisterConcrete(ed25519.PrivKey{}, - ed25519.PrivKeyName, nil) cdc.RegisterConcrete(sr25519.PrivKey{}, sr25519.PrivKeyName, nil) + cdc.RegisterConcrete(&ed25519.PrivKey{}, + ed25519.PrivKeyName, nil) cdc.RegisterConcrete(&secp256k1.PrivKey{}, secp256k1.PrivKeyName, nil) } diff --git a/crypto/codec/proto.go b/crypto/codec/proto.go index 5cf1abb38830..3f200f074d44 100644 --- a/crypto/codec/proto.go +++ b/crypto/codec/proto.go @@ -4,6 +4,7 @@ import ( tmcrypto "github.com/tendermint/tendermint/crypto" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" @@ -13,12 +14,14 @@ import ( func RegisterInterfaces(registry codectypes.InterfaceRegistry) { // TODO We now register both Tendermint's PubKey and our own PubKey. In the // long-term, we should move away from Tendermint's PubKey, and delete - // these lines + // these lines. registry.RegisterInterface("tendermint.crypto.Pubkey", (*tmcrypto.PubKey)(nil)) - registry.RegisterImplementations((*tmcrypto.PubKey)(nil), &secp256k1.PubKey{}) + registry.RegisterImplementations((*tmcrypto.PubKey)(nil), &ed25519.PubKey{}) + registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &secp256k1.PubKey{}) registry.RegisterImplementations((*tmcrypto.PubKey)(nil), &multisig.LegacyAminoPubKey{}) registry.RegisterInterface("cosmos.crypto.Pubkey", (*cryptotypes.PubKey)(nil)) + registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &ed25519.PubKey{}) registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &secp256k1.PubKey{}) registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &multisig.LegacyAminoPubKey{}) } diff --git a/crypto/keys/ed25519/ed25519.go b/crypto/keys/ed25519/ed25519.go index 9c2d7c3b16e1..676d7d205d41 100644 --- a/crypto/keys/ed25519/ed25519.go +++ b/crypto/keys/ed25519/ed25519.go @@ -13,7 +13,7 @@ import ( //------------------------------------- -var _ crypto.PrivKey = PrivKey{} +var _ crypto.PrivKey = &PrivKey{} const ( PrivKeyName = "tendermint/PrivKeyEd25519" @@ -33,7 +33,7 @@ const ( ) // Bytes returns the privkey byte format. -func (privKey PrivKey) Bytes() []byte { +func (privKey *PrivKey) Bytes() []byte { return privKey.Key } @@ -44,7 +44,7 @@ func (privKey PrivKey) Bytes() []byte { // The latter 32 bytes should be the compressed public key. // If these conditions aren't met, Sign will panic or produce an // incorrect signature. -func (privKey PrivKey) Sign(msg []byte) ([]byte, error) { +func (privKey *PrivKey) Sign(msg []byte) ([]byte, error) { signatureBytes := ed25519.Sign(ed25519.PrivateKey(privKey.Key), msg) return signatureBytes, nil } @@ -52,7 +52,7 @@ func (privKey PrivKey) Sign(msg []byte) ([]byte, error) { // PubKey gets the corresponding public key from the private key. // // Panics if the private key is not initialized. -func (privKey PrivKey) PubKey() crypto.PubKey { +func (privKey *PrivKey) PubKey() crypto.PubKey { // If the latter 32 bytes of the privkey are all zero, privkey is not // initialized. initialized := false @@ -69,12 +69,12 @@ func (privKey PrivKey) PubKey() crypto.PubKey { pubkeyBytes := make([]byte, PubKeySize) copy(pubkeyBytes, privKey.Key[32:]) - return PubKey{Key: pubkeyBytes} + return &PubKey{Key: pubkeyBytes} } // Equals - you probably don't need to use this. // Runs in constant time based on length of the keys. -func (privKey PrivKey) Equals(other crypto.PrivKey) bool { +func (privKey *PrivKey) Equals(other crypto.PrivKey) bool { if privKey.Type() != other.Type() { return false } @@ -82,19 +82,19 @@ func (privKey PrivKey) Equals(other crypto.PrivKey) bool { return subtle.ConstantTimeCompare(privKey.Bytes(), other.Bytes()) == 1 } -func (privKey PrivKey) Type() string { +func (privKey *PrivKey) Type() string { return PrivKeyName } // GenPrivKey generates a new ed25519 private key. // It uses OS randomness in conjunction with the current global random seed // in tendermint/libs/common to generate the private key. -func GenPrivKey() PrivKey { +func GenPrivKey() *PrivKey { return genPrivKey(crypto.CReader()) } // genPrivKey generates a new ed25519 private key using the provided reader. -func genPrivKey(rand io.Reader) PrivKey { +func genPrivKey(rand io.Reader) *PrivKey { seed := make([]byte, SeedSize) _, err := io.ReadFull(rand, seed) @@ -102,25 +102,25 @@ func genPrivKey(rand io.Reader) PrivKey { panic(err) } - return PrivKey{Key: ed25519.NewKeyFromSeed(seed)} + return &PrivKey{Key: ed25519.NewKeyFromSeed(seed)} } // GenPrivKeyFromSecret hashes the secret with SHA2, and uses // that 32 byte output to create the private key. // NOTE: secret should be the output of a KDF like bcrypt, // if it's derived from user input. -func GenPrivKeyFromSecret(secret []byte) PrivKey { +func GenPrivKeyFromSecret(secret []byte) *PrivKey { seed := crypto.Sha256(secret) // Not Ripemd160 because we want 32 bytes. - return PrivKey{Key: ed25519.NewKeyFromSeed(seed)} + return &PrivKey{Key: ed25519.NewKeyFromSeed(seed)} } //------------------------------------- -var _ crypto.PubKey = PubKey{} +var _ crypto.PubKey = &PubKey{} // Address is the SHA256-20 of the raw pubkey bytes. -func (pubKey PubKey) Address() crypto.Address { +func (pubKey *PubKey) Address() crypto.Address { if len(pubKey.Key) != PubKeySize { panic("pubkey is incorrect size") } @@ -128,11 +128,11 @@ func (pubKey PubKey) Address() crypto.Address { } // Bytes returns the PubKey byte format. -func (pubKey PubKey) Bytes() []byte { +func (pubKey *PubKey) Bytes() []byte { return pubKey.Key } -func (pubKey PubKey) VerifySignature(msg []byte, sig []byte) bool { +func (pubKey *PubKey) VerifySignature(msg []byte, sig []byte) bool { // make sure we use the same algorithm to sign if len(sig) != SignatureSize { return false @@ -141,15 +141,15 @@ func (pubKey PubKey) VerifySignature(msg []byte, sig []byte) bool { return ed25519.Verify(ed25519.PublicKey(pubKey.Key), msg, sig) } -func (pubKey PubKey) String() string { +func (pubKey *PubKey) String() string { return fmt.Sprintf("PubKeyEd25519{%X}", pubKey.Key) } -func (pubKey PubKey) Type() string { +func (pubKey *PubKey) Type() string { return PubKeyName } -func (pubKey PubKey) Equals(other crypto.PubKey) bool { +func (pubKey *PubKey) Equals(other crypto.PubKey) bool { if pubKey.Type() != other.Type() { return false } diff --git a/simapp/test_helpers.go b/simapp/test_helpers.go index 718e8e64c092..3cacb5194d29 100644 --- a/simapp/test_helpers.go +++ b/simapp/test_helpers.go @@ -420,7 +420,7 @@ func NewPubKeyFromHex(pk string) (res crypto.PubKey) { if err != nil { panic(err) } - pkEd := make(ed25519.PubKey, ed25519.PubKeySize) + pkEd := make([]byte, ed25519.PubKeySize) copy(pkEd, pkBytes) - return pkEd + return &ed25519.PubKey{Key: pkEd} } diff --git a/types/address_bench_test.go b/types/address_bench_test.go index e6ddc506740a..59222dacf9b7 100644 --- a/types/address_bench_test.go +++ b/types/address_bench_test.go @@ -12,14 +12,15 @@ import ( ) func BenchmarkBech32ifyPubKey(b *testing.B) { - pk := make(ed25519.PubKey, ed25519.PubKeySize) + pkBz := make([]byte, ed25519.PubKeySize) + pk := &ed25519.PubKey{Key: pkBz} rng := rand.New(rand.NewSource(time.Now().Unix())) b.ResetTimer() for i := 0; i < b.N; i++ { b.StopTimer() - rng.Read(pk) + rng.Read(pk.Key) b.StartTimer() _, err := types.Bech32ifyPubKey(types.Bech32PubKeyTypeConsPub, pk) @@ -28,14 +29,15 @@ func BenchmarkBech32ifyPubKey(b *testing.B) { } func BenchmarkGetPubKeyFromBech32(b *testing.B) { - pk := make(ed25519.PubKey, ed25519.PubKeySize) + pkBz := make([]byte, ed25519.PubKeySize) + pk := &ed25519.PubKey{Key: pkBz} rng := rand.New(rand.NewSource(time.Now().Unix())) b.ResetTimer() for i := 0; i < b.N; i++ { b.StopTimer() - rng.Read(pk) + rng.Read(pk.Key) pkStr, err := types.Bech32ifyPubKey(types.Bech32PubKeyTypeConsPub, pk) require.NoError(b, err) diff --git a/types/address_test.go b/types/address_test.go index 2a89425ff5e9..ac258a2836bf 100644 --- a/types/address_test.go +++ b/types/address_test.go @@ -57,10 +57,11 @@ func TestEmptyAddresses(t *testing.T) { } func TestRandBech32PubkeyConsistency(t *testing.T) { - pub := make(ed25519.PubKey, ed25519.PubKeySize) + pubBz := make([]byte, ed25519.PubKeySize) + pub := &ed25519.PubKey{Key: pubBz} for i := 0; i < 1000; i++ { - rand.Read(pub) + rand.Read(pub.Key) mustBech32AccPub := types.MustBech32ifyPubKey(types.Bech32PubKeyTypeAccPub, pub) bech32AccPub, err := types.Bech32ifyPubKey(types.Bech32PubKeyTypeAccPub, pub) @@ -115,10 +116,11 @@ func TestYAMLMarshalers(t *testing.T) { } func TestRandBech32AccAddrConsistency(t *testing.T) { - pub := make(ed25519.PubKey, ed25519.PubKeySize) + pubBz := make([]byte, ed25519.PubKeySize) + pub := &ed25519.PubKey{Key: pubBz} for i := 0; i < 1000; i++ { - rand.Read(pub) + rand.Read(pub.Key) acc := types.AccAddress(pub.Address()) res := types.AccAddress{} @@ -153,10 +155,11 @@ func TestRandBech32AccAddrConsistency(t *testing.T) { } func TestValAddr(t *testing.T) { - pub := make(ed25519.PubKey, ed25519.PubKeySize) + pubBz := make([]byte, ed25519.PubKeySize) + pub := &ed25519.PubKey{Key: pubBz} for i := 0; i < 20; i++ { - rand.Read(pub[:]) + rand.Read(pub.Key) acc := types.ValAddress(pub.Address()) res := types.ValAddress{} @@ -193,10 +196,11 @@ func TestValAddr(t *testing.T) { } func TestConsAddress(t *testing.T) { - pub := make(ed25519.PubKey, ed25519.PubKeySize) + pubBz := make([]byte, ed25519.PubKeySize) + pub := &ed25519.PubKey{Key: pubBz} for i := 0; i < 20; i++ { - rand.Read(pub[:]) + rand.Read(pub.Key[:]) acc := types.ConsAddress(pub.Address()) res := types.ConsAddress{} @@ -242,10 +246,11 @@ func RandString(n int) string { } func TestConfiguredPrefix(t *testing.T) { - pub := make(ed25519.PubKey, ed25519.PubKeySize) + pubBz := make([]byte, ed25519.PubKeySize) + pub := &ed25519.PubKey{Key: pubBz} for length := 1; length < 10; length++ { for times := 1; times < 20; times++ { - rand.Read(pub[:]) + rand.Read(pub.Key[:]) // Test if randomly generated prefix of a given length works prefix := RandString(length) @@ -297,8 +302,9 @@ func TestConfiguredPrefix(t *testing.T) { } func TestAddressInterface(t *testing.T) { - pub := make(ed25519.PubKey, ed25519.PubKeySize) - rand.Read(pub) + pubBz := make([]byte, ed25519.PubKeySize) + pub := &ed25519.PubKey{Key: pubBz} + rand.Read(pub.Key) addrs := []types.Address{ types.ConsAddress(pub.Address()), diff --git a/x/auth/ante/ante_test.go b/x/auth/ante/ante_test.go index 9b0cbbf3abcc..9ca8c24a65c1 100644 --- a/x/auth/ante/ante_test.go +++ b/x/auth/ante/ante_test.go @@ -1002,7 +1002,7 @@ func (suite *AnteTestSuite) TestCustomSignatureVerificationGasConsumer() { // setup an ante handler that only accepts PubKeyEd25519 suite.anteHandler = ante.NewAnteHandler(suite.app.AccountKeeper, suite.app.BankKeeper, func(meter sdk.GasMeter, sig signing.SignatureV2, params types.Params) error { switch pubkey := sig.PubKey.(type) { - case ed25519.PubKey: + case *ed25519.PubKey: meter.ConsumeGas(params.SigVerifyCostED25519, "ante verify: ed25519") return nil default: diff --git a/x/auth/ante/sigverify.go b/x/auth/ante/sigverify.go index 68646db32c34..e34adc379a01 100644 --- a/x/auth/ante/sigverify.go +++ b/x/auth/ante/sigverify.go @@ -333,7 +333,7 @@ func DefaultSigVerificationGasConsumer( ) error { pubkey := sig.PubKey switch pubkey := pubkey.(type) { - case ed25519.PubKey: + case *ed25519.PubKey: meter.ConsumeGas(params.SigVerifyCostED25519, "ante verify: ed25519") return sdkerrors.Wrap(sdkerrors.ErrInvalidPubKey, "ED25519 public keys are unsupported") diff --git a/x/evidence/keeper/keeper_test.go b/x/evidence/keeper/keeper_test.go index 8efc6c6da622..3bc26cda9a9e 100644 --- a/x/evidence/keeper/keeper_test.go +++ b/x/evidence/keeper/keeper_test.go @@ -44,8 +44,7 @@ func newPubKey(pk string) (res crypto.PubKey) { panic(err) } - pubkey := make(ed25519.PubKey, ed25519.PubKeySize) - copy(pubkey, pkBytes) + pubkey := &ed25519.PubKey{Key: pkBytes} return pubkey } From 56f5ec37ec3dd7e75acff71f81ce666bf73365fa Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 Sep 2020 13:05:19 +0200 Subject: [PATCH 094/128] Fix network tests --- crypto/codec/proto.go | 2 +- crypto/keys/ed25519/ed25519.go | 28 ++++++++++++++++++++++++++-- x/genutil/utils.go | 8 +++++++- x/staking/types/validator.go | 5 +++-- 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/crypto/codec/proto.go b/crypto/codec/proto.go index 3f200f074d44..0afdc6c706bb 100644 --- a/crypto/codec/proto.go +++ b/crypto/codec/proto.go @@ -17,7 +17,7 @@ func RegisterInterfaces(registry codectypes.InterfaceRegistry) { // these lines. registry.RegisterInterface("tendermint.crypto.Pubkey", (*tmcrypto.PubKey)(nil)) registry.RegisterImplementations((*tmcrypto.PubKey)(nil), &ed25519.PubKey{}) - registry.RegisterImplementations((*cryptotypes.PubKey)(nil), &secp256k1.PubKey{}) + registry.RegisterImplementations((*tmcrypto.PubKey)(nil), &secp256k1.PubKey{}) registry.RegisterImplementations((*tmcrypto.PubKey)(nil), &multisig.LegacyAminoPubKey{}) registry.RegisterInterface("cosmos.crypto.Pubkey", (*cryptotypes.PubKey)(nil)) diff --git a/crypto/keys/ed25519/ed25519.go b/crypto/keys/ed25519/ed25519.go index 676d7d205d41..c9e302299b37 100644 --- a/crypto/keys/ed25519/ed25519.go +++ b/crypto/keys/ed25519/ed25519.go @@ -8,6 +8,7 @@ import ( "golang.org/x/crypto/ed25519" "github.com/tendermint/tendermint/crypto" + tmed25519 "github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/crypto/tmhash" ) @@ -83,7 +84,7 @@ func (privKey *PrivKey) Equals(other crypto.PrivKey) bool { } func (privKey *PrivKey) Type() string { - return PrivKeyName + return keyType } // GenPrivKey generates a new ed25519 private key. @@ -117,7 +118,14 @@ func GenPrivKeyFromSecret(secret []byte) *PrivKey { //------------------------------------- +// IntoTmPubKey allows our own PubKey types be converted into Tendermint's +// pubkey types. +type IntoTmPubKey interface { + AsTmPubKey() crypto.PubKey +} + var _ crypto.PubKey = &PubKey{} +var _ IntoTmPubKey = &PubKey{} // Address is the SHA256-20 of the raw pubkey bytes. func (pubKey *PubKey) Address() crypto.Address { @@ -146,7 +154,7 @@ func (pubKey *PubKey) String() string { } func (pubKey *PubKey) Type() string { - return PubKeyName + return keyType } func (pubKey *PubKey) Equals(other crypto.PubKey) bool { @@ -156,3 +164,19 @@ func (pubKey *PubKey) Equals(other crypto.PubKey) bool { return subtle.ConstantTimeCompare(pubKey.Bytes(), other.Bytes()) == 1 } + +// AsTmPubKey converts our own PubKey into a Tendermint ED25519 pubkey. +func (pubKey *PubKey) AsTmPubKey() crypto.PubKey { + return tmed25519.PubKey(pubKey.Key) +} + +// FromTmEd25519 converts a Tendermint ED25519 pubkey into our own ED25519 +// PubKey. +func FromTmEd25519(pubKey crypto.PubKey) (*PubKey, error) { + tmPk, ok := pubKey.(tmed25519.PubKey) + if !ok { + return nil, fmt.Errorf("expected %T, got %T", tmed25519.PubKey{}, pubKey) + } + + return &PubKey{Key: []byte(tmPk)}, nil +} diff --git a/x/genutil/utils.go b/x/genutil/utils.go index 4aea9d9fd500..1daf76c1b715 100644 --- a/x/genutil/utils.go +++ b/x/genutil/utils.go @@ -5,6 +5,7 @@ import ( "path/filepath" "time" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" cfg "github.com/tendermint/tendermint/config" "github.com/tendermint/tendermint/crypto" tmos "github.com/tendermint/tendermint/libs/os" @@ -63,7 +64,12 @@ func InitializeNodeValidatorFiles(config *cfg.Config) (nodeID string, valPubKey return "", nil, err } - valPubKey, err = privval.LoadOrGenFilePV(pvKeyFile, pvStateFile).GetPubKey() + tmValPubKey, err := privval.LoadOrGenFilePV(pvKeyFile, pvStateFile).GetPubKey() + if err != nil { + return "", nil, err + } + + valPubKey, err = ed25519.FromTmEd25519(tmValPubKey) if err != nil { return "", nil, err } diff --git a/x/staking/types/validator.go b/x/staking/types/validator.go index 7328bfbc80a2..6181ae787a50 100644 --- a/x/staking/types/validator.go +++ b/x/staking/types/validator.go @@ -14,6 +14,7 @@ import ( "gopkg.in/yaml.v2" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/staking/exported" @@ -224,7 +225,7 @@ func (d Description) EnsureLength() (Description, error) { // ABCIValidatorUpdate returns an abci.ValidatorUpdate from a staking validator type // with the full validator power func (v Validator) ABCIValidatorUpdate() abci.ValidatorUpdate { - pk, err := encoding.PubKeyToProto(v.GetConsPubKey()) + pk, err := encoding.PubKeyToProto(v.GetConsPubKey().(ed25519.IntoTmPubKey).AsTmPubKey()) if err != nil { panic(err) } @@ -238,7 +239,7 @@ func (v Validator) ABCIValidatorUpdate() abci.ValidatorUpdate { // ABCIValidatorUpdateZero returns an abci.ValidatorUpdate from a staking validator type // with zero power used for validator updates. func (v Validator) ABCIValidatorUpdateZero() abci.ValidatorUpdate { - pk, err := encoding.PubKeyToProto(v.GetConsPubKey()) + pk, err := encoding.PubKeyToProto(v.GetConsPubKey().(ed25519.IntoTmPubKey).AsTmPubKey()) if err != nil { panic(err) } From fe58118339d82b56f35f77b5ee83b1598191dc2b Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 Sep 2020 13:24:14 +0200 Subject: [PATCH 095/128] Fix more tests --- crypto/keys/ed25519/ed25519.go | 61 ++++++++++++++++++++++++++++++- x/staking/types/validator_test.go | 4 +- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/crypto/keys/ed25519/ed25519.go b/crypto/keys/ed25519/ed25519.go index c9e302299b37..70318674158d 100644 --- a/crypto/keys/ed25519/ed25519.go +++ b/crypto/keys/ed25519/ed25519.go @@ -7,14 +7,18 @@ import ( "golang.org/x/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/codec" "github.com/tendermint/tendermint/crypto" tmed25519 "github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/crypto/tmhash" + + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" ) //------------------------------------- -var _ crypto.PrivKey = &PrivKey{} +var _ cryptotypes.PrivKey = &PrivKey{} +var _ codec.AminoMarshaler = &PubKey{} const ( PrivKeyName = "tendermint/PrivKeyEd25519" @@ -87,6 +91,32 @@ func (privKey *PrivKey) Type() string { return keyType } +// MarshalAmino overrides Amino binary marshalling. +func (privKey PrivKey) MarshalAmino() ([]byte, error) { + return privKey.Key, nil +} + +// UnmarshalAmino overrides Amino binary marshalling. +func (privKey *PrivKey) UnmarshalAmino(bz []byte) error { + *privKey = PrivKey{ + Key: bz, + } + + return nil +} + +// MarshalAminoJSON overrides Amino JSON marshalling. +func (privKey PrivKey) MarshalAminoJSON() ([]byte, error) { + // When we marshal to Amino JSON, we don't marshal the "key" field itself, + // just its contents (i.e. the key bytes). + return privKey.MarshalAmino() +} + +// UnmarshalAminoJSON overrides Amino JSON marshalling. +func (privKey *PrivKey) UnmarshalAminoJSON(bz []byte) error { + return privKey.UnmarshalAmino(bz) +} + // GenPrivKey generates a new ed25519 private key. // It uses OS randomness in conjunction with the current global random seed // in tendermint/libs/common to generate the private key. @@ -118,6 +148,9 @@ func GenPrivKeyFromSecret(secret []byte) *PrivKey { //------------------------------------- +var _ cryptotypes.PubKey = &PubKey{} +var _ codec.AminoMarshaler = &PubKey{} + // IntoTmPubKey allows our own PubKey types be converted into Tendermint's // pubkey types. type IntoTmPubKey interface { @@ -165,6 +198,32 @@ func (pubKey *PubKey) Equals(other crypto.PubKey) bool { return subtle.ConstantTimeCompare(pubKey.Bytes(), other.Bytes()) == 1 } +// MarshalAmino overrides Amino binary marshalling. +func (pubKey PubKey) MarshalAmino() ([]byte, error) { + return pubKey.Key, nil +} + +// UnmarshalAmino overrides Amino binary marshalling. +func (pubKey *PubKey) UnmarshalAmino(bz []byte) error { + *pubKey = PubKey{ + Key: bz, + } + + return nil +} + +// MarshalAminoJSON overrides Amino JSON marshalling. +func (pubKey PubKey) MarshalAminoJSON() ([]byte, error) { + // When we marshal to Amino JSON, we don't marshal the "key" field itself, + // just its contents (i.e. the key bytes). + return pubKey.MarshalAmino() +} + +// UnmarshalAminoJSON overrides Amino JSON marshalling. +func (pubKey *PubKey) UnmarshalAminoJSON(bz []byte) error { + return pubKey.UnmarshalAmino(bz) +} + // AsTmPubKey converts our own PubKey into a Tendermint ED25519 pubkey. func (pubKey *PubKey) AsTmPubKey() crypto.PubKey { return tmed25519.PubKey(pubKey.Key) diff --git a/x/staking/types/validator_test.go b/x/staking/types/validator_test.go index 021bae3d1854..6912d11468d3 100644 --- a/x/staking/types/validator_test.go +++ b/x/staking/types/validator_test.go @@ -62,7 +62,7 @@ func TestABCIValidatorUpdate(t *testing.T) { validator := NewValidator(valAddr1, pk1, Description{}) abciVal := validator.ABCIValidatorUpdate() - pk, err := encoding.PubKeyToProto(validator.GetConsPubKey()) + pk, err := encoding.PubKeyToProto(validator.GetConsPubKey().(ed25519.IntoTmPubKey).AsTmPubKey()) require.NoError(t, err) require.Equal(t, pk, abciVal.PubKey) require.Equal(t, validator.BondedTokens().Int64(), abciVal.Power) @@ -72,7 +72,7 @@ func TestABCIValidatorUpdateZero(t *testing.T) { validator := NewValidator(valAddr1, pk1, Description{}) abciVal := validator.ABCIValidatorUpdateZero() - pk, err := encoding.PubKeyToProto(validator.GetConsPubKey()) + pk, err := encoding.PubKeyToProto(validator.GetConsPubKey().(ed25519.IntoTmPubKey).AsTmPubKey()) require.NoError(t, err) require.Equal(t, pk, abciVal.PubKey) require.Equal(t, int64(0), abciVal.Power) From 7218bf6cecf8214c0e6d047a84ef61453f0d46da Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 Sep 2020 14:23:55 +0200 Subject: [PATCH 096/128] Make ibc work? --- crypto/codec/amino.go | 6 ++++++ x/ibc/testing/chain.go | 3 ++- x/staking/types/validator.go | 17 ++++++++++++++--- x/staking/types/validator_test.go | 4 ++-- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index 27ccda57df4e..8379d8874fe0 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -2,6 +2,7 @@ package codec import ( "github.com/tendermint/tendermint/crypto" + tmed25519 "github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/crypto/sr25519" "github.com/cosmos/cosmos-sdk/codec" @@ -28,6 +29,9 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { cdc.RegisterInterface((*cryptotypes.PubKey)(nil), nil) cdc.RegisterConcrete(sr25519.PubKey{}, sr25519.PubKeyName, nil) + // TODO Same as above, for ED25519 + cdc.RegisterConcrete(tmed25519.PubKey{}, + "legacy/"+ed25519.PubKeyName, nil) cdc.RegisterConcrete(&ed25519.PubKey{}, ed25519.PubKeyName, nil) cdc.RegisterConcrete(&secp256k1.PubKey{}, @@ -38,6 +42,8 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { cdc.RegisterInterface((*crypto.PrivKey)(nil), nil) cdc.RegisterConcrete(sr25519.PrivKey{}, sr25519.PrivKeyName, nil) + cdc.RegisterConcrete(tmed25519.PrivKey{}, + "legacy/"+ed25519.PrivKeyName, nil) cdc.RegisterConcrete(&ed25519.PrivKey{}, ed25519.PrivKeyName, nil) cdc.RegisterConcrete(&secp256k1.PrivKey{}, diff --git a/x/ibc/testing/chain.go b/x/ibc/testing/chain.go index 72c2b527f2dc..be492d331836 100644 --- a/x/ibc/testing/chain.go +++ b/x/ibc/testing/chain.go @@ -16,6 +16,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" @@ -110,7 +111,7 @@ func NewTestChain(t *testing.T, chainID string) *TestChain { require.NoError(t, err) // create validator set with single validator - validator := tmtypes.NewValidator(pubKey, 1) + validator := tmtypes.NewValidator(pubKey.(ed25519.IntoTmPubKey).AsTmPubKey(), 1) valSet := tmtypes.NewValidatorSet([]*tmtypes.Validator{validator}) signers := []tmtypes.PrivValidator{privVal} diff --git a/x/staking/types/validator.go b/x/staking/types/validator.go index 6181ae787a50..5d40c142663e 100644 --- a/x/staking/types/validator.go +++ b/x/staking/types/validator.go @@ -225,7 +225,7 @@ func (d Description) EnsureLength() (Description, error) { // ABCIValidatorUpdate returns an abci.ValidatorUpdate from a staking validator type // with the full validator power func (v Validator) ABCIValidatorUpdate() abci.ValidatorUpdate { - pk, err := encoding.PubKeyToProto(v.GetConsPubKey().(ed25519.IntoTmPubKey).AsTmPubKey()) + pk, err := encoding.PubKeyToProto(v.GetConsPubKey()) if err != nil { panic(err) } @@ -239,7 +239,7 @@ func (v Validator) ABCIValidatorUpdate() abci.ValidatorUpdate { // ABCIValidatorUpdateZero returns an abci.ValidatorUpdate from a staking validator type // with zero power used for validator updates. func (v Validator) ABCIValidatorUpdateZero() abci.ValidatorUpdate { - pk, err := encoding.PubKeyToProto(v.GetConsPubKey().(ed25519.IntoTmPubKey).AsTmPubKey()) + pk, err := encoding.PubKeyToProto(v.GetConsPubKey()) if err != nil { panic(err) } @@ -422,7 +422,18 @@ func (v Validator) GetMoniker() string { return v.Description.Moniker } func (v Validator) GetStatus() sdk.BondStatus { return v.Status } func (v Validator) GetOperator() sdk.ValAddress { return v.OperatorAddress } func (v Validator) GetConsPubKey() crypto.PubKey { - return sdk.MustGetPubKeyFromBech32(sdk.Bech32PubKeyTypeConsPub, v.ConsensusPubkey) + // The way things are refactored now, v.ConsensusPubkey is sometimes a TM + // ed25519 pubkey, sometimes our own ed25519 pubkey. This is very ugly and + // inconsistent. + // Luckily, here we coerce it into a TM ed25519 pubkey always, as this + // pubkey will be passed into TM. + pk := sdk.MustGetPubKeyFromBech32(sdk.Bech32PubKeyTypeConsPub, v.ConsensusPubkey) + + if intoTmPk, ok := pk.(ed25519.IntoTmPubKey); ok { + return intoTmPk.AsTmPubKey() + } + + return pk } func (v Validator) GetConsAddr() sdk.ConsAddress { return sdk.ConsAddress(v.GetConsPubKey().Address()) } func (v Validator) GetTokens() sdk.Int { return v.Tokens } diff --git a/x/staking/types/validator_test.go b/x/staking/types/validator_test.go index 6912d11468d3..021bae3d1854 100644 --- a/x/staking/types/validator_test.go +++ b/x/staking/types/validator_test.go @@ -62,7 +62,7 @@ func TestABCIValidatorUpdate(t *testing.T) { validator := NewValidator(valAddr1, pk1, Description{}) abciVal := validator.ABCIValidatorUpdate() - pk, err := encoding.PubKeyToProto(validator.GetConsPubKey().(ed25519.IntoTmPubKey).AsTmPubKey()) + pk, err := encoding.PubKeyToProto(validator.GetConsPubKey()) require.NoError(t, err) require.Equal(t, pk, abciVal.PubKey) require.Equal(t, validator.BondedTokens().Int64(), abciVal.Power) @@ -72,7 +72,7 @@ func TestABCIValidatorUpdateZero(t *testing.T) { validator := NewValidator(valAddr1, pk1, Description{}) abciVal := validator.ABCIValidatorUpdateZero() - pk, err := encoding.PubKeyToProto(validator.GetConsPubKey().(ed25519.IntoTmPubKey).AsTmPubKey()) + pk, err := encoding.PubKeyToProto(validator.GetConsPubKey()) require.NoError(t, err) require.Equal(t, pk, abciVal.PubKey) require.Equal(t, int64(0), abciVal.Power) From 92454ea7d302e675b9e45e173534e2456d5f1be6 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 Sep 2020 14:55:31 +0200 Subject: [PATCH 097/128] Use TM pubkey in NewValidator --- client/debug/main.go | 2 +- crypto/codec/amino.go | 8 ++++---- x/ibc/02-client/keeper/client_test.go | 3 ++- x/ibc/02-client/keeper/keeper_test.go | 3 ++- x/ibc/02-client/types/genesis_test.go | 3 ++- x/ibc/07-tendermint/types/misbehaviour_handle_test.go | 3 ++- x/ibc/07-tendermint/types/misbehaviour_test.go | 3 ++- x/ibc/07-tendermint/types/tendermint_test.go | 3 ++- x/ibc/07-tendermint/types/update_test.go | 3 ++- x/ibc/genesis_test.go | 6 ++++++ x/ibc/ibc_test.go | 3 ++- x/staking/types/validator_test.go | 2 +- 12 files changed, 28 insertions(+), 14 deletions(-) diff --git a/client/debug/main.go b/client/debug/main.go index cebb9073b6ec..8581fcc42edd 100644 --- a/client/debug/main.go +++ b/client/debug/main.go @@ -108,7 +108,7 @@ $ %s debug pubkey cosmos1e0jnq2sun3dzjh8p2xq95kk0expwmd7shwjpfg } cmd.Println("Address:", edPK.Address()) - cmd.Printf("Hex: %X\n", edPK.Key[:]) + cmd.Printf("Hex: %X\n", edPK.Key) cmd.Println("JSON (base64):", string(pubKeyJSONBytes)) cmd.Println("Bech32 Acc:", accPub) cmd.Println("Bech32 Validator Operator:", valPub) diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index 8379d8874fe0..cdd866a74efc 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -31,9 +31,9 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { sr25519.PubKeyName, nil) // TODO Same as above, for ED25519 cdc.RegisterConcrete(tmed25519.PubKey{}, - "legacy/"+ed25519.PubKeyName, nil) - cdc.RegisterConcrete(&ed25519.PubKey{}, ed25519.PubKeyName, nil) + cdc.RegisterConcrete(&ed25519.PubKey{}, + "cosmos/"+ed25519.PubKeyName, nil) cdc.RegisterConcrete(&secp256k1.PubKey{}, secp256k1.PubKeyName, nil) cdc.RegisterConcrete(&kmultisig.LegacyAminoPubKey{}, @@ -43,9 +43,9 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(sr25519.PrivKey{}, sr25519.PrivKeyName, nil) cdc.RegisterConcrete(tmed25519.PrivKey{}, - "legacy/"+ed25519.PrivKeyName, nil) - cdc.RegisterConcrete(&ed25519.PrivKey{}, ed25519.PrivKeyName, nil) + cdc.RegisterConcrete(&ed25519.PrivKey{}, + "cosmos/"+ed25519.PrivKeyName, nil) cdc.RegisterConcrete(&secp256k1.PrivKey{}, secp256k1.PrivKeyName, nil) } diff --git a/x/ibc/02-client/keeper/client_test.go b/x/ibc/02-client/keeper/client_test.go index 2c92ebe02ac9..edd850cd03b9 100644 --- a/x/ibc/02-client/keeper/client_test.go +++ b/x/ibc/02-client/keeper/client_test.go @@ -6,6 +6,7 @@ import ( tmtypes "github.com/tendermint/tendermint/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" ibctmtypes "github.com/cosmos/cosmos-sdk/x/ibc/07-tendermint/types" @@ -255,7 +256,7 @@ func (suite *KeeperTestSuite) TestCheckMisbehaviourAndUpdateState() { altPrivVal := ibctestingmock.NewPV() altPubKey, err := altPrivVal.GetPubKey() suite.Require().NoError(err) - altVal := tmtypes.NewValidator(altPubKey, 4) + altVal := tmtypes.NewValidator(altPubKey.(ed25519.IntoTmPubKey).AsTmPubKey(), 4) // Set valSet here with suite.valSet so it doesn't get reset on each testcase valSet := suite.valSet diff --git a/x/ibc/02-client/keeper/keeper_test.go b/x/ibc/02-client/keeper/keeper_test.go index 1297a65003d7..42e8249fd0bf 100644 --- a/x/ibc/02-client/keeper/keeper_test.go +++ b/x/ibc/02-client/keeper/keeper_test.go @@ -12,6 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/ibc/02-client/keeper" @@ -87,7 +88,7 @@ func (suite *KeeperTestSuite) SetupTest() { testClientHeightMinus1 := types.NewHeight(0, height-1) - validator := tmtypes.NewValidator(pubKey, 1) + validator := tmtypes.NewValidator(pubKey.(ed25519.IntoTmPubKey).AsTmPubKey(), 1) suite.valSet = tmtypes.NewValidatorSet([]*tmtypes.Validator{validator}) suite.valSetHash = suite.valSet.Hash() suite.header = ibctmtypes.CreateTestHeader(testChainID, testClientHeight, testClientHeightMinus1, now2, suite.valSet, suite.valSet, []tmtypes.PrivValidator{suite.privVal}) diff --git a/x/ibc/02-client/types/genesis_test.go b/x/ibc/02-client/types/genesis_test.go index 29af455a9334..0f89e7546473 100644 --- a/x/ibc/02-client/types/genesis_test.go +++ b/x/ibc/02-client/types/genesis_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/require" tmtypes "github.com/tendermint/tendermint/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" client "github.com/cosmos/cosmos-sdk/x/ibc/02-client" "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" channeltypes "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/types" @@ -50,7 +51,7 @@ func TestValidateGenesis(t *testing.T) { now := time.Now().UTC() - val := tmtypes.NewValidator(pubKey, 10) + val := tmtypes.NewValidator(pubKey.(ed25519.IntoTmPubKey).AsTmPubKey(), 10) valSet := tmtypes.NewValidatorSet([]*tmtypes.Validator{val}) heightMinus1 := types.NewHeight(0, height-1) diff --git a/x/ibc/07-tendermint/types/misbehaviour_handle_test.go b/x/ibc/07-tendermint/types/misbehaviour_handle_test.go index dde65cfbbdca..766b0c5d9a2d 100644 --- a/x/ibc/07-tendermint/types/misbehaviour_handle_test.go +++ b/x/ibc/07-tendermint/types/misbehaviour_handle_test.go @@ -7,6 +7,7 @@ import ( "github.com/tendermint/tendermint/crypto/tmhash" tmtypes "github.com/tendermint/tendermint/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" "github.com/cosmos/cosmos-sdk/x/ibc/07-tendermint/types" @@ -20,7 +21,7 @@ func (suite *TendermintTestSuite) TestCheckMisbehaviourAndUpdateState() { altPubKey, err := altPrivVal.GetPubKey() suite.Require().NoError(err) - altVal := tmtypes.NewValidator(altPubKey, 4) + altVal := tmtypes.NewValidator(altPubKey.(ed25519.IntoTmPubKey).AsTmPubKey(), 4) // Create bothValSet with both suite validator and altVal bothValSet := tmtypes.NewValidatorSet(append(suite.valSet.Validators, altVal)) diff --git a/x/ibc/07-tendermint/types/misbehaviour_test.go b/x/ibc/07-tendermint/types/misbehaviour_test.go index 661b825adb29..c7ce028cb624 100644 --- a/x/ibc/07-tendermint/types/misbehaviour_test.go +++ b/x/ibc/07-tendermint/types/misbehaviour_test.go @@ -7,6 +7,7 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" "github.com/cosmos/cosmos-sdk/x/ibc/07-tendermint/types" "github.com/cosmos/cosmos-sdk/x/ibc/exported" @@ -36,7 +37,7 @@ func (suite *TendermintTestSuite) TestMisbehaviourValidateBasic() { epochHeight := int64(height.EpochHeight) - altVal := tmtypes.NewValidator(altPubKey, epochHeight) + altVal := tmtypes.NewValidator(altPubKey.(ed25519.IntoTmPubKey).AsTmPubKey(), epochHeight) // Create bothValSet with both suite validator and altVal bothValSet := tmtypes.NewValidatorSet(append(suite.valSet.Validators, altVal)) diff --git a/x/ibc/07-tendermint/types/tendermint_test.go b/x/ibc/07-tendermint/types/tendermint_test.go index fedb59663381..dcd2507442b9 100644 --- a/x/ibc/07-tendermint/types/tendermint_test.go +++ b/x/ibc/07-tendermint/types/tendermint_test.go @@ -10,6 +10,7 @@ import ( tmtypes "github.com/tendermint/tendermint/types" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" @@ -76,7 +77,7 @@ func (suite *TendermintTestSuite) SetupTest() { heightMinus1 := clienttypes.NewHeight(0, height.EpochHeight-1) - val := tmtypes.NewValidator(pubKey, 10) + val := tmtypes.NewValidator(pubKey.(ed25519.IntoTmPubKey).AsTmPubKey(), 10) suite.valSet = tmtypes.NewValidatorSet([]*tmtypes.Validator{val}) suite.valsHash = suite.valSet.Hash() suite.header = ibctmtypes.CreateTestHeader(chainID, height, heightMinus1, suite.now, suite.valSet, suite.valSet, []tmtypes.PrivValidator{suite.privVal}) diff --git a/x/ibc/07-tendermint/types/update_test.go b/x/ibc/07-tendermint/types/update_test.go index 26717971f4a8..5dc472454c13 100644 --- a/x/ibc/07-tendermint/types/update_test.go +++ b/x/ibc/07-tendermint/types/update_test.go @@ -5,6 +5,7 @@ import ( tmtypes "github.com/tendermint/tendermint/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" types "github.com/cosmos/cosmos-sdk/x/ibc/07-tendermint/types" commitmenttypes "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment/types" @@ -33,7 +34,7 @@ func (suite *TendermintTestSuite) TestCheckHeaderAndUpdateState() { heightMinus3 := clienttypes.NewHeight(height.EpochNumber, height.EpochHeight-3) heightPlus5 := clienttypes.NewHeight(height.EpochNumber, height.EpochHeight+5) - altVal := tmtypes.NewValidator(altPubKey, epochHeight) + altVal := tmtypes.NewValidator(altPubKey.(ed25519.IntoTmPubKey).AsTmPubKey(), epochHeight) // Create bothValSet with both suite validator and altVal. Would be valid update bothValSet := tmtypes.NewValidatorSet(append(suite.valSet.Validators, altVal)) diff --git a/x/ibc/genesis_test.go b/x/ibc/genesis_test.go index f01b2aa496dd..75c2d0103935 100644 --- a/x/ibc/genesis_test.go +++ b/x/ibc/genesis_test.go @@ -2,7 +2,9 @@ package ibc_test import ( "fmt" + "testing" + "github.com/stretchr/testify/suite" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/codec" @@ -283,3 +285,7 @@ func (suite *HandlerTestSuite) TestExportGenesis() { }) } } + +func TestIBCTestSuite2(t *testing.T) { + suite.Run(t, new(IBCTestSuite)) +} diff --git a/x/ibc/ibc_test.go b/x/ibc/ibc_test.go index 225e07009c49..d99c7730f338 100644 --- a/x/ibc/ibc_test.go +++ b/x/ibc/ibc_test.go @@ -8,6 +8,7 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" @@ -60,7 +61,7 @@ func (suite *IBCTestSuite) SetupTest() { now := time.Now().UTC() - val := tmtypes.NewValidator(pubKey, 10) + val := tmtypes.NewValidator(pubKey.(ed25519.IntoTmPubKey).AsTmPubKey(), 10) valSet := tmtypes.NewValidatorSet([]*tmtypes.Validator{val}) clientHeightMinus1 := clienttypes.NewHeight(0, height-1) diff --git a/x/staking/types/validator_test.go b/x/staking/types/validator_test.go index 021bae3d1854..5afcf030afad 100644 --- a/x/staking/types/validator_test.go +++ b/x/staking/types/validator_test.go @@ -317,7 +317,7 @@ func TestValidatorToTm(t *testing.T) { val.Status = sdk.Bonded val.Tokens = sdk.NewInt(rand.Int63()) vals[i] = val - expected[i] = tmtypes.NewValidator(pk, val.ConsensusPower()) + expected[i] = tmtypes.NewValidator(pk.(ed25519.IntoTmPubKey).AsTmPubKey(), val.ConsensusPower()) } require.Equal(t, expected, vals.ToTmValidators()) From 5fe532c18db6df04e712b00a332e3e4c0a880f01 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 Sep 2020 14:56:29 +0200 Subject: [PATCH 098/128] Fix lint --- client/debug/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/debug/main.go b/client/debug/main.go index 8581fcc42edd..b2cb76c30c3a 100644 --- a/client/debug/main.go +++ b/client/debug/main.go @@ -38,13 +38,13 @@ func getPubKeyFromString(pkstr string) (crypto.PubKey, error) { bz, err := hex.DecodeString(pkstr) if err == nil { - copy(pubKey[:], bz) + copy(pubKey, bz) return &ed25519.PubKey{Key: pubKey}, nil } bz, err = base64.StdEncoding.DecodeString(pkstr) if err == nil { - copy(pubKey[:], bz) + copy(pubKey, bz) return &ed25519.PubKey{Key: pubKey}, nil } From 7a423d897b71d0a13af2f4be423c39ee7b0d7e47 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 Sep 2020 15:11:05 +0200 Subject: [PATCH 099/128] Put interface in tpyes --- crypto/keys/ed25519/ed25519.go | 13 +++---------- crypto/types/types.go | 6 ++++++ x/ibc/02-client/keeper/client_test.go | 4 ++-- x/ibc/02-client/keeper/keeper_test.go | 4 ++-- x/ibc/02-client/types/genesis_test.go | 4 ++-- .../07-tendermint/types/misbehaviour_handle_test.go | 4 ++-- x/ibc/07-tendermint/types/misbehaviour_test.go | 4 ++-- x/ibc/07-tendermint/types/tendermint_test.go | 4 ++-- x/ibc/07-tendermint/types/update_test.go | 4 ++-- x/ibc/ibc_test.go | 4 ++-- x/ibc/testing/chain.go | 4 ++-- x/staking/handler_test.go | 5 +++-- x/staking/types/validator.go | 4 ++-- x/staking/types/validator_test.go | 3 ++- 14 files changed, 34 insertions(+), 33 deletions(-) diff --git a/crypto/keys/ed25519/ed25519.go b/crypto/keys/ed25519/ed25519.go index 70318674158d..86ff67392fb2 100644 --- a/crypto/keys/ed25519/ed25519.go +++ b/crypto/keys/ed25519/ed25519.go @@ -5,13 +5,12 @@ import ( "fmt" "io" - "golang.org/x/crypto/ed25519" - - "github.com/cosmos/cosmos-sdk/codec" "github.com/tendermint/tendermint/crypto" tmed25519 "github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/crypto/tmhash" + "golang.org/x/crypto/ed25519" + "github.com/cosmos/cosmos-sdk/codec" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" ) @@ -151,14 +150,8 @@ func GenPrivKeyFromSecret(secret []byte) *PrivKey { var _ cryptotypes.PubKey = &PubKey{} var _ codec.AminoMarshaler = &PubKey{} -// IntoTmPubKey allows our own PubKey types be converted into Tendermint's -// pubkey types. -type IntoTmPubKey interface { - AsTmPubKey() crypto.PubKey -} - var _ crypto.PubKey = &PubKey{} -var _ IntoTmPubKey = &PubKey{} +var _ cryptotypes.IntoTmPubKey = &PubKey{} // Address is the SHA256-20 of the raw pubkey bytes. func (pubKey *PubKey) Address() crypto.Address { diff --git a/crypto/types/types.go b/crypto/types/types.go index f6873b5e7565..bce35d716d3f 100644 --- a/crypto/types/types.go +++ b/crypto/types/types.go @@ -22,3 +22,9 @@ type PrivKey interface { type ( Address = tmcrypto.Address ) + +// IntoTmPubKey allows our own PubKey types be converted into Tendermint's +// pubkey types. +type IntoTmPubKey interface { + AsTmPubKey() tmcrypto.PubKey +} diff --git a/x/ibc/02-client/keeper/client_test.go b/x/ibc/02-client/keeper/client_test.go index edd850cd03b9..2c9a6c09f3da 100644 --- a/x/ibc/02-client/keeper/client_test.go +++ b/x/ibc/02-client/keeper/client_test.go @@ -6,7 +6,7 @@ import ( tmtypes "github.com/tendermint/tendermint/types" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" ibctmtypes "github.com/cosmos/cosmos-sdk/x/ibc/07-tendermint/types" @@ -256,7 +256,7 @@ func (suite *KeeperTestSuite) TestCheckMisbehaviourAndUpdateState() { altPrivVal := ibctestingmock.NewPV() altPubKey, err := altPrivVal.GetPubKey() suite.Require().NoError(err) - altVal := tmtypes.NewValidator(altPubKey.(ed25519.IntoTmPubKey).AsTmPubKey(), 4) + altVal := tmtypes.NewValidator(altPubKey.(cryptotypes.IntoTmPubKey).AsTmPubKey(), 4) // Set valSet here with suite.valSet so it doesn't get reset on each testcase valSet := suite.valSet diff --git a/x/ibc/02-client/keeper/keeper_test.go b/x/ibc/02-client/keeper/keeper_test.go index 42e8249fd0bf..2163a4e40310 100644 --- a/x/ibc/02-client/keeper/keeper_test.go +++ b/x/ibc/02-client/keeper/keeper_test.go @@ -12,7 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/ibc/02-client/keeper" @@ -88,7 +88,7 @@ func (suite *KeeperTestSuite) SetupTest() { testClientHeightMinus1 := types.NewHeight(0, height-1) - validator := tmtypes.NewValidator(pubKey.(ed25519.IntoTmPubKey).AsTmPubKey(), 1) + validator := tmtypes.NewValidator(pubKey.(cryptotypes.IntoTmPubKey).AsTmPubKey(), 1) suite.valSet = tmtypes.NewValidatorSet([]*tmtypes.Validator{validator}) suite.valSetHash = suite.valSet.Hash() suite.header = ibctmtypes.CreateTestHeader(testChainID, testClientHeight, testClientHeightMinus1, now2, suite.valSet, suite.valSet, []tmtypes.PrivValidator{suite.privVal}) diff --git a/x/ibc/02-client/types/genesis_test.go b/x/ibc/02-client/types/genesis_test.go index 0f89e7546473..72fe3ca3f852 100644 --- a/x/ibc/02-client/types/genesis_test.go +++ b/x/ibc/02-client/types/genesis_test.go @@ -7,7 +7,7 @@ import ( "github.com/stretchr/testify/require" tmtypes "github.com/tendermint/tendermint/types" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" client "github.com/cosmos/cosmos-sdk/x/ibc/02-client" "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" channeltypes "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/types" @@ -51,7 +51,7 @@ func TestValidateGenesis(t *testing.T) { now := time.Now().UTC() - val := tmtypes.NewValidator(pubKey.(ed25519.IntoTmPubKey).AsTmPubKey(), 10) + val := tmtypes.NewValidator(pubKey.(cryptotypes.IntoTmPubKey).AsTmPubKey(), 10) valSet := tmtypes.NewValidatorSet([]*tmtypes.Validator{val}) heightMinus1 := types.NewHeight(0, height-1) diff --git a/x/ibc/07-tendermint/types/misbehaviour_handle_test.go b/x/ibc/07-tendermint/types/misbehaviour_handle_test.go index 766b0c5d9a2d..604a56ec46d7 100644 --- a/x/ibc/07-tendermint/types/misbehaviour_handle_test.go +++ b/x/ibc/07-tendermint/types/misbehaviour_handle_test.go @@ -7,7 +7,7 @@ import ( "github.com/tendermint/tendermint/crypto/tmhash" tmtypes "github.com/tendermint/tendermint/types" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/simapp" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" "github.com/cosmos/cosmos-sdk/x/ibc/07-tendermint/types" @@ -21,7 +21,7 @@ func (suite *TendermintTestSuite) TestCheckMisbehaviourAndUpdateState() { altPubKey, err := altPrivVal.GetPubKey() suite.Require().NoError(err) - altVal := tmtypes.NewValidator(altPubKey.(ed25519.IntoTmPubKey).AsTmPubKey(), 4) + altVal := tmtypes.NewValidator(altPubKey.(cryptotypes.IntoTmPubKey).AsTmPubKey(), 4) // Create bothValSet with both suite validator and altVal bothValSet := tmtypes.NewValidatorSet(append(suite.valSet.Validators, altVal)) diff --git a/x/ibc/07-tendermint/types/misbehaviour_test.go b/x/ibc/07-tendermint/types/misbehaviour_test.go index c7ce028cb624..989cc4120746 100644 --- a/x/ibc/07-tendermint/types/misbehaviour_test.go +++ b/x/ibc/07-tendermint/types/misbehaviour_test.go @@ -7,7 +7,7 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" "github.com/cosmos/cosmos-sdk/x/ibc/07-tendermint/types" "github.com/cosmos/cosmos-sdk/x/ibc/exported" @@ -37,7 +37,7 @@ func (suite *TendermintTestSuite) TestMisbehaviourValidateBasic() { epochHeight := int64(height.EpochHeight) - altVal := tmtypes.NewValidator(altPubKey.(ed25519.IntoTmPubKey).AsTmPubKey(), epochHeight) + altVal := tmtypes.NewValidator(altPubKey.(cryptotypes.IntoTmPubKey).AsTmPubKey(), epochHeight) // Create bothValSet with both suite validator and altVal bothValSet := tmtypes.NewValidatorSet(append(suite.valSet.Validators, altVal)) diff --git a/x/ibc/07-tendermint/types/tendermint_test.go b/x/ibc/07-tendermint/types/tendermint_test.go index dcd2507442b9..39216abd2ad7 100644 --- a/x/ibc/07-tendermint/types/tendermint_test.go +++ b/x/ibc/07-tendermint/types/tendermint_test.go @@ -10,7 +10,7 @@ import ( tmtypes "github.com/tendermint/tendermint/types" "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" @@ -77,7 +77,7 @@ func (suite *TendermintTestSuite) SetupTest() { heightMinus1 := clienttypes.NewHeight(0, height.EpochHeight-1) - val := tmtypes.NewValidator(pubKey.(ed25519.IntoTmPubKey).AsTmPubKey(), 10) + val := tmtypes.NewValidator(pubKey.(cryptotypes.IntoTmPubKey).AsTmPubKey(), 10) suite.valSet = tmtypes.NewValidatorSet([]*tmtypes.Validator{val}) suite.valsHash = suite.valSet.Hash() suite.header = ibctmtypes.CreateTestHeader(chainID, height, heightMinus1, suite.now, suite.valSet, suite.valSet, []tmtypes.PrivValidator{suite.privVal}) diff --git a/x/ibc/07-tendermint/types/update_test.go b/x/ibc/07-tendermint/types/update_test.go index 5dc472454c13..673539e87974 100644 --- a/x/ibc/07-tendermint/types/update_test.go +++ b/x/ibc/07-tendermint/types/update_test.go @@ -5,7 +5,7 @@ import ( tmtypes "github.com/tendermint/tendermint/types" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" types "github.com/cosmos/cosmos-sdk/x/ibc/07-tendermint/types" commitmenttypes "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment/types" @@ -34,7 +34,7 @@ func (suite *TendermintTestSuite) TestCheckHeaderAndUpdateState() { heightMinus3 := clienttypes.NewHeight(height.EpochNumber, height.EpochHeight-3) heightPlus5 := clienttypes.NewHeight(height.EpochNumber, height.EpochHeight+5) - altVal := tmtypes.NewValidator(altPubKey.(ed25519.IntoTmPubKey).AsTmPubKey(), epochHeight) + altVal := tmtypes.NewValidator(altPubKey.(cryptotypes.IntoTmPubKey).AsTmPubKey(), epochHeight) // Create bothValSet with both suite validator and altVal. Would be valid update bothValSet := tmtypes.NewValidatorSet(append(suite.valSet.Validators, altVal)) diff --git a/x/ibc/ibc_test.go b/x/ibc/ibc_test.go index d99c7730f338..ebc511afbca1 100644 --- a/x/ibc/ibc_test.go +++ b/x/ibc/ibc_test.go @@ -8,7 +8,7 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmtypes "github.com/tendermint/tendermint/types" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/02-client/types" @@ -61,7 +61,7 @@ func (suite *IBCTestSuite) SetupTest() { now := time.Now().UTC() - val := tmtypes.NewValidator(pubKey.(ed25519.IntoTmPubKey).AsTmPubKey(), 10) + val := tmtypes.NewValidator(pubKey.(cryptotypes.IntoTmPubKey).AsTmPubKey(), 10) valSet := tmtypes.NewValidatorSet([]*tmtypes.Validator{val}) clientHeightMinus1 := clienttypes.NewHeight(0, height-1) diff --git a/x/ibc/testing/chain.go b/x/ibc/testing/chain.go index be492d331836..4d46cc58ac42 100644 --- a/x/ibc/testing/chain.go +++ b/x/ibc/testing/chain.go @@ -16,8 +16,8 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -111,7 +111,7 @@ func NewTestChain(t *testing.T, chainID string) *TestChain { require.NoError(t, err) // create validator set with single validator - validator := tmtypes.NewValidator(pubKey.(ed25519.IntoTmPubKey).AsTmPubKey(), 1) + validator := tmtypes.NewValidator(pubKey.(cryptotypes.IntoTmPubKey).AsTmPubKey(), 1) valSet := tmtypes.NewValidatorSet([]*tmtypes.Validator{validator}) signers := []tmtypes.PrivValidator{privVal} diff --git a/x/staking/handler_test.go b/x/staking/handler_test.go index 481484ad92f0..9ac3e10e6a86 100644 --- a/x/staking/handler_test.go +++ b/x/staking/handler_test.go @@ -13,6 +13,7 @@ import ( tmtypes "github.com/tendermint/tendermint/types" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/simapp" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" @@ -153,7 +154,7 @@ func TestDuplicatesMsgCreateValidator(t *testing.T) { require.True(t, found) assert.Equal(t, sdk.Bonded, validator.Status) assert.Equal(t, addr1, validator.OperatorAddress) - assert.Equal(t, pk1, validator.GetConsPubKey()) + assert.Equal(t, pk1.(cryptotypes.IntoTmPubKey).AsTmPubKey(), validator.GetConsPubKey()) assert.Equal(t, valTokens, validator.BondedTokens()) assert.Equal(t, valTokens.ToDec(), validator.DelegatorShares) assert.Equal(t, types.Description{}, validator.Description) @@ -185,7 +186,7 @@ func TestDuplicatesMsgCreateValidator(t *testing.T) { require.True(t, found) assert.Equal(t, sdk.Bonded, validator.Status) assert.Equal(t, addr2, validator.OperatorAddress) - assert.Equal(t, pk2, validator.GetConsPubKey()) + assert.Equal(t, pk2.(cryptotypes.IntoTmPubKey).AsTmPubKey(), validator.GetConsPubKey()) assert.True(sdk.IntEq(t, valTokens, validator.Tokens)) assert.True(sdk.DecEq(t, valTokens.ToDec(), validator.DelegatorShares)) assert.Equal(t, types.Description{}, validator.Description) diff --git a/x/staking/types/validator.go b/x/staking/types/validator.go index 5d40c142663e..5b8a9af892eb 100644 --- a/x/staking/types/validator.go +++ b/x/staking/types/validator.go @@ -14,7 +14,7 @@ import ( "gopkg.in/yaml.v2" "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/x/staking/exported" @@ -429,7 +429,7 @@ func (v Validator) GetConsPubKey() crypto.PubKey { // pubkey will be passed into TM. pk := sdk.MustGetPubKeyFromBech32(sdk.Bech32PubKeyTypeConsPub, v.ConsensusPubkey) - if intoTmPk, ok := pk.(ed25519.IntoTmPubKey); ok { + if intoTmPk, ok := pk.(cryptotypes.IntoTmPubKey); ok { return intoTmPk.AsTmPubKey() } diff --git a/x/staking/types/validator_test.go b/x/staking/types/validator_test.go index 5afcf030afad..e2f3813e7539 100644 --- a/x/staking/types/validator_test.go +++ b/x/staking/types/validator_test.go @@ -13,6 +13,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec/legacy" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -317,7 +318,7 @@ func TestValidatorToTm(t *testing.T) { val.Status = sdk.Bonded val.Tokens = sdk.NewInt(rand.Int63()) vals[i] = val - expected[i] = tmtypes.NewValidator(pk.(ed25519.IntoTmPubKey).AsTmPubKey(), val.ConsensusPower()) + expected[i] = tmtypes.NewValidator(pk.(cryptotypes.IntoTmPubKey).AsTmPubKey(), val.ConsensusPower()) } require.Equal(t, expected, vals.ToTmValidators()) From f2e47fbbd3c16ca3f579c5639b1896cb37f02716 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 Sep 2020 15:17:43 +0200 Subject: [PATCH 100/128] rerun CI From 99ae23170e52ff3347d3e4ee1c0b9961d736e461 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 Sep 2020 15:20:00 +0200 Subject: [PATCH 101/128] Better name register --- crypto/codec/amino.go | 8 ++++---- crypto/keys/ed25519/ed25519.go | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index cdd866a74efc..20578988facc 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -31,9 +31,9 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { sr25519.PubKeyName, nil) // TODO Same as above, for ED25519 cdc.RegisterConcrete(tmed25519.PubKey{}, - ed25519.PubKeyName, nil) + tmed25519.PubKeyName, nil) cdc.RegisterConcrete(&ed25519.PubKey{}, - "cosmos/"+ed25519.PubKeyName, nil) + ed25519.PubKeyName, nil) cdc.RegisterConcrete(&secp256k1.PubKey{}, secp256k1.PubKeyName, nil) cdc.RegisterConcrete(&kmultisig.LegacyAminoPubKey{}, @@ -43,9 +43,9 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(sr25519.PrivKey{}, sr25519.PrivKeyName, nil) cdc.RegisterConcrete(tmed25519.PrivKey{}, - ed25519.PrivKeyName, nil) + tmed25519.PrivKeyName, nil) cdc.RegisterConcrete(&ed25519.PrivKey{}, - "cosmos/"+ed25519.PrivKeyName, nil) + ed25519.PrivKeyName, nil) cdc.RegisterConcrete(&secp256k1.PrivKey{}, secp256k1.PrivKeyName, nil) } diff --git a/crypto/keys/ed25519/ed25519.go b/crypto/keys/ed25519/ed25519.go index 86ff67392fb2..45220c283910 100644 --- a/crypto/keys/ed25519/ed25519.go +++ b/crypto/keys/ed25519/ed25519.go @@ -20,8 +20,8 @@ var _ cryptotypes.PrivKey = &PrivKey{} var _ codec.AminoMarshaler = &PubKey{} const ( - PrivKeyName = "tendermint/PrivKeyEd25519" - PubKeyName = "tendermint/PubKeyEd25519" + PrivKeyName = "cosmos/PrivKeyEd25519" + PubKeyName = "cosmos/PubKeyEd25519" // PubKeySize is is the size, in bytes, of public keys as used in this package. PubKeySize = 32 // PrivateKeySize is the size, in bytes, of private keys as used in this package. From 8ceb11f30fefd090434c841a3675c501a0e7d747 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 Sep 2020 15:25:07 +0200 Subject: [PATCH 102/128] Remove stray code --- x/ibc/genesis_test.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/x/ibc/genesis_test.go b/x/ibc/genesis_test.go index 75c2d0103935..f01b2aa496dd 100644 --- a/x/ibc/genesis_test.go +++ b/x/ibc/genesis_test.go @@ -2,9 +2,7 @@ package ibc_test import ( "fmt" - "testing" - "github.com/stretchr/testify/suite" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/codec" @@ -285,7 +283,3 @@ func (suite *HandlerTestSuite) TestExportGenesis() { }) } } - -func TestIBCTestSuite2(t *testing.T) { - suite.Run(t, new(IBCTestSuite)) -} From 07c181d701175c85ff121cfb6be18eac6b158d04 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 Sep 2020 15:48:38 +0200 Subject: [PATCH 103/128] Add ed25519 tests --- crypto/keys/ed25519/ed25519_test.go | 135 ++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) diff --git a/crypto/keys/ed25519/ed25519_test.go b/crypto/keys/ed25519/ed25519_test.go index 487097692804..17ec12ed6b7e 100644 --- a/crypto/keys/ed25519/ed25519_test.go +++ b/crypto/keys/ed25519/ed25519_test.go @@ -1,13 +1,17 @@ package ed25519_test import ( + "encoding/base64" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto" + "github.com/tendermint/tendermint/crypto/sr25519" + "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" ) func TestSignAndValidateEd25519(t *testing.T) { @@ -28,3 +32,134 @@ func TestSignAndValidateEd25519(t *testing.T) { assert.False(t, pubKey.VerifySignature(msg, sig)) } + +func TestPubKeyEquals(t *testing.T) { + ed25519PubKey := ed25519.GenPrivKey().PubKey().(*ed25519.PubKey) + + testCases := []struct { + msg string + pubKey cryptotypes.PubKey + other crypto.PubKey + expectEq bool + }{ + { + "different bytes", + ed25519PubKey, + ed25519.GenPrivKey().PubKey(), + false, + }, + { + "equals", + ed25519PubKey, + &ed25519.PubKey{ + Key: ed25519PubKey.Key, + }, + true, + }, + { + "different types", + ed25519PubKey, + sr25519.GenPrivKey().PubKey(), + false, + }, + } + + for _, tc := range testCases { + t.Run(tc.msg, func(t *testing.T) { + eq := tc.pubKey.Equals(tc.other) + require.Equal(t, eq, tc.expectEq) + }) + } +} + +func TestPrivKeyEquals(t *testing.T) { + ed25519PrivKey := ed25519.GenPrivKey() + + testCases := []struct { + msg string + privKey cryptotypes.PrivKey + other crypto.PrivKey + expectEq bool + }{ + { + "different bytes", + ed25519PrivKey, + ed25519.GenPrivKey(), + false, + }, + { + "equals", + ed25519PrivKey, + &ed25519.PrivKey{ + Key: ed25519PrivKey.Key, + }, + true, + }, + { + "different types", + ed25519PrivKey, + sr25519.GenPrivKey(), + false, + }, + } + + for _, tc := range testCases { + t.Run(tc.msg, func(t *testing.T) { + eq := tc.privKey.Equals(tc.other) + require.Equal(t, eq, tc.expectEq) + }) + } +} + +func TestMarshalAmino(t *testing.T) { + aminoCdc := codec.NewLegacyAmino() + privKey := ed25519.GenPrivKey() + pubKey := privKey.PubKey().(*ed25519.PubKey) + + testCases := []struct { + desc string + msg codec.AminoMarshaler + typ interface{} + expBinary []byte + expJSON string + }{ + { + "ed25519 private key", + privKey, + &ed25519.PrivKey{}, + append([]byte{64}, privKey.Bytes()...), // Length-prefixed. + "\"" + base64.StdEncoding.EncodeToString(privKey.Bytes()) + "\"", + }, + { + "ed25519 public key", + pubKey, + &ed25519.PubKey{}, + append([]byte{32}, pubKey.Bytes()...), // Length-prefixed. + "\"" + base64.StdEncoding.EncodeToString(pubKey.Bytes()) + "\"", + }, + } + + for _, tc := range testCases { + t.Run(tc.desc, func(t *testing.T) { + // Do a round trip of encoding/decoding binary. + bz, err := aminoCdc.MarshalBinaryBare(tc.msg) + require.NoError(t, err) + require.Equal(t, tc.expBinary, bz) + + err = aminoCdc.UnmarshalBinaryBare(bz, tc.typ) + require.NoError(t, err) + + require.Equal(t, tc.msg, tc.typ) + + // Do a round trip of encoding/decoding JSON. + bz, err = aminoCdc.MarshalJSON(tc.msg) + require.NoError(t, err) + require.Equal(t, tc.expJSON, string(bz)) + + err = aminoCdc.UnmarshalJSON(bz, tc.typ) + require.NoError(t, err) + + require.Equal(t, tc.msg, tc.typ) + }) + } +} From 3d90dd653be47224fed13cd8b9362141ee36fc3a Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 Sep 2020 16:49:02 +0200 Subject: [PATCH 104/128] Check nil --- x/auth/tx/builder.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/x/auth/tx/builder.go b/x/auth/tx/builder.go index 155b2abc8af6..a1c12f631854 100644 --- a/x/auth/tx/builder.go +++ b/x/auth/tx/builder.go @@ -108,9 +108,13 @@ func (w *wrapper) GetPubKeys() []crypto.PubKey { pks := make([]crypto.PubKey, len(signerInfos)) for i, si := range signerInfos { - pk, ok := si.PublicKey.GetCachedValue().(crypto.PubKey) // NOTE: it is okay to leave this nil if there is no PubKey in the SignerInfo. // PubKey's can be left unset in SignerInfo. + if si.PublicKey == nil { + continue + } + + pk, ok := si.PublicKey.GetCachedValue().(crypto.PubKey) if ok { pks[i] = pk } From 7bd4538c83ab8f2e0acdd24cc6aa88ef101b41bd Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 Sep 2020 16:53:19 +0200 Subject: [PATCH 105/128] Correct interface impl assert --- crypto/keys/ed25519/ed25519.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/crypto/keys/ed25519/ed25519.go b/crypto/keys/ed25519/ed25519.go index 45220c283910..90d713d457ef 100644 --- a/crypto/keys/ed25519/ed25519.go +++ b/crypto/keys/ed25519/ed25519.go @@ -16,9 +16,6 @@ import ( //------------------------------------- -var _ cryptotypes.PrivKey = &PrivKey{} -var _ codec.AminoMarshaler = &PubKey{} - const ( PrivKeyName = "cosmos/PrivKeyEd25519" PubKeyName = "cosmos/PubKeyEd25519" @@ -36,6 +33,9 @@ const ( keyType = "ed25519" ) +var _ cryptotypes.PrivKey = &PrivKey{} +var _ codec.AminoMarshaler = &PrivKey{} + // Bytes returns the privkey byte format. func (privKey *PrivKey) Bytes() []byte { return privKey.Key @@ -149,8 +149,6 @@ func GenPrivKeyFromSecret(secret []byte) *PrivKey { var _ cryptotypes.PubKey = &PubKey{} var _ codec.AminoMarshaler = &PubKey{} - -var _ crypto.PubKey = &PubKey{} var _ cryptotypes.IntoTmPubKey = &PubKey{} // Address is the SHA256-20 of the raw pubkey bytes. From ecaac5e026ecacd20ba823924f9423c7cd618ae4 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 Sep 2020 16:58:20 +0200 Subject: [PATCH 106/128] rerun CI From 2d35e5ed83f23cfdf4d751c123b833a4849ea13f Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Fri, 18 Sep 2020 18:30:48 +0200 Subject: [PATCH 107/128] Add fix for Bech32 --- types/address.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/types/address.go b/types/address.go index 4ade2a11bcd6..67e82057c858 100644 --- a/types/address.go +++ b/types/address.go @@ -13,6 +13,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec/legacy" cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/types/bech32" ) @@ -626,7 +627,18 @@ func Bech32ifyPubKey(pkt Bech32PubKeyType, pubkey crypto.PubKey) (string, error) } - return bech32.ConvertAndEncode(bech32Prefix, legacy.Cdc.MustMarshalBinaryBare(pubkey)) + // This piece of code is to keep backwards-compatibility. + // For ed25519 keys, our own ed25519 is registered in Amino under a + // different name than TM's ed25519. But since users are already using + // TM's ed25519 bech32 encoding, we explicitly say to bech32-encode our own + // ed25519 the same way as TM's ed25519. + pkToMarshal := pubkey + switch pubkey.(type) { + case *ed25519.PubKey: + pkToMarshal = pubkey.(*ed25519.PubKey).AsTmPubKey() + } + + return bech32.ConvertAndEncode(bech32Prefix, legacy.Cdc.MustMarshalBinaryBare(pkToMarshal)) } // MustBech32ifyPubKey calls Bech32ifyPubKey except it panics on error. From 6f6f3f2f7fc2e77ae54d0211b4290e46343e8662 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 21 Sep 2020 10:45:33 +0200 Subject: [PATCH 108/128] Address comments --- types/tx/signing/signature.go | 8 +----- types/tx/types.go | 9 ++----- .../solomachine/types/solomachine.go | 25 +++---------------- 3 files changed, 7 insertions(+), 35 deletions(-) diff --git a/types/tx/signing/signature.go b/types/tx/signing/signature.go index ff72c0866f26..e0b9b5c75145 100644 --- a/types/tx/signing/signature.go +++ b/types/tx/signing/signature.go @@ -103,11 +103,5 @@ func (sds *SignatureDescriptors) UnpackInterfaces(unpacker codectypes.AnyUnpacke // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method func (sd *SignatureDescriptor) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { - var pubKey crypto.PubKey - err := unpacker.UnpackAny(sd.PublicKey, &pubKey) - if err != nil { - return err - } - - return nil + return unpacker.UnpackAny(sd.PublicKey, new(crypto.PubKey)) } diff --git a/types/tx/types.go b/types/tx/types.go index e328f30cf5ec..dad6ec74645d 100644 --- a/types/tx/types.go +++ b/types/tx/types.go @@ -12,6 +12,7 @@ import ( // MaxGasWanted defines the max gas allowed. const MaxGasWanted = uint64((1 << 63) - 1) +// Interface implementation checks. var _, _, _, _ codectypes.UnpackInterfacesMessage = &Tx{}, &TxBody{}, &AuthInfo{}, &SignerInfo{} var _ sdk.Tx = &Tx{} @@ -138,13 +139,7 @@ func (m *AuthInfo) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method func (m *SignerInfo) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { - var pubKey crypto.PubKey - err := unpacker.UnpackAny(m.PublicKey, &pubKey) - if err != nil { - return err - } - - return nil + return unpacker.UnpackAny(sd.PublicKey, new(crypto.PubKey)) } // RegisterInterfaces registers the sdk.Tx interface. diff --git a/x/ibc/light-clients/solomachine/types/solomachine.go b/x/ibc/light-clients/solomachine/types/solomachine.go index 23033c118c36..b83b7721e483 100644 --- a/x/ibc/light-clients/solomachine/types/solomachine.go +++ b/x/ibc/light-clients/solomachine/types/solomachine.go @@ -6,6 +6,7 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" ) +// Interface implementation checks. var _, _, _, _ codectypes.UnpackInterfacesMessage = &ClientState{}, &ConsensusState{}, &Header{}, &HeaderData{} // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method @@ -15,33 +16,15 @@ func (cs *ClientState) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method func (cs *ConsensusState) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { - var pubKey crypto.PubKey - err := unpacker.UnpackAny(cs.PublicKey, &pubKey) - if err != nil { - return err - } - - return nil + return unpacker.UnpackAny(sd.PublicKey, new(crypto.PubKey)) } // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method func (h *Header) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { - var pubKey crypto.PubKey - err := unpacker.UnpackAny(h.NewPublicKey, &pubKey) - if err != nil { - return err - } - - return nil + return unpacker.UnpackAny(sd.PublicKey, new(crypto.PubKey)) } // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method func (hd *HeaderData) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { - var pubKey crypto.PubKey - err := unpacker.UnpackAny(hd.NewPubKey, &pubKey) - if err != nil { - return err - } - - return nil + return unpacker.UnpackAny(sd.PublicKey, new(crypto.PubKey)) } From 451e4906abe06b92e59b078a5ebd8af49821f1c0 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 21 Sep 2020 10:50:04 +0200 Subject: [PATCH 109/128] FIx lint --- types/tx/types.go | 2 +- x/ibc/light-clients/solomachine/types/solomachine.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/types/tx/types.go b/types/tx/types.go index dad6ec74645d..204a7cd06754 100644 --- a/types/tx/types.go +++ b/types/tx/types.go @@ -139,7 +139,7 @@ func (m *AuthInfo) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method func (m *SignerInfo) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { - return unpacker.UnpackAny(sd.PublicKey, new(crypto.PubKey)) + return unpacker.UnpackAny(m.PublicKey, new(crypto.PubKey)) } // RegisterInterfaces registers the sdk.Tx interface. diff --git a/x/ibc/light-clients/solomachine/types/solomachine.go b/x/ibc/light-clients/solomachine/types/solomachine.go index b83b7721e483..a08d5baf04a9 100644 --- a/x/ibc/light-clients/solomachine/types/solomachine.go +++ b/x/ibc/light-clients/solomachine/types/solomachine.go @@ -16,15 +16,15 @@ func (cs *ClientState) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method func (cs *ConsensusState) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { - return unpacker.UnpackAny(sd.PublicKey, new(crypto.PubKey)) + return unpacker.UnpackAny(cs.PublicKey, new(crypto.PubKey)) } // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method func (h *Header) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { - return unpacker.UnpackAny(sd.PublicKey, new(crypto.PubKey)) + return unpacker.UnpackAny(h.NewPublicKey, new(crypto.PubKey)) } // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method func (hd *HeaderData) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { - return unpacker.UnpackAny(sd.PublicKey, new(crypto.PubKey)) + return unpacker.UnpackAny(hd.NewPubKey, new(crypto.PubKey)) } From 00f6a67953b14c9a654b457cfc84c8251ffac399 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 21 Sep 2020 11:21:51 +0200 Subject: [PATCH 110/128] Add tests for solomachine unpack interfaces --- baseapp/grpcrouter_test.go | 3 +- .../solomachine/types/solomachine.go | 8 +-- .../solomachine/types/solomachine_test.go | 54 +++++++++++++++++++ 3 files changed, 59 insertions(+), 6 deletions(-) diff --git a/baseapp/grpcrouter_test.go b/baseapp/grpcrouter_test.go index 778d2e4fd531..8761780f9f8a 100644 --- a/baseapp/grpcrouter_test.go +++ b/baseapp/grpcrouter_test.go @@ -4,10 +4,9 @@ import ( "context" "testing" - "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/stretchr/testify/require" + "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/ibc/light-clients/solomachine/types/solomachine.go b/x/ibc/light-clients/solomachine/types/solomachine.go index a08d5baf04a9..7615b22c2d14 100644 --- a/x/ibc/light-clients/solomachine/types/solomachine.go +++ b/x/ibc/light-clients/solomachine/types/solomachine.go @@ -10,21 +10,21 @@ import ( var _, _, _, _ codectypes.UnpackInterfacesMessage = &ClientState{}, &ConsensusState{}, &Header{}, &HeaderData{} // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method -func (cs *ClientState) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { +func (cs ClientState) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { return cs.ConsensusState.UnpackInterfaces(unpacker) } // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method -func (cs *ConsensusState) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { +func (cs ConsensusState) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { return unpacker.UnpackAny(cs.PublicKey, new(crypto.PubKey)) } // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method -func (h *Header) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { +func (h Header) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { return unpacker.UnpackAny(h.NewPublicKey, new(crypto.PubKey)) } // UnpackInterfaces implements the UnpackInterfaceMessages.UnpackInterfaces method -func (hd *HeaderData) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { +func (hd HeaderData) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { return unpacker.UnpackAny(hd.NewPubKey, new(crypto.PubKey)) } diff --git a/x/ibc/light-clients/solomachine/types/solomachine_test.go b/x/ibc/light-clients/solomachine/types/solomachine_test.go index dbfddd6f5f77..2ede5f4e468b 100644 --- a/x/ibc/light-clients/solomachine/types/solomachine_test.go +++ b/x/ibc/light-clients/solomachine/types/solomachine_test.go @@ -3,9 +3,15 @@ package types_test import ( "testing" + "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" host "github.com/cosmos/cosmos-sdk/x/ibc/24-host" "github.com/cosmos/cosmos-sdk/x/ibc/exported" @@ -59,3 +65,51 @@ func (suite *SoloMachineTestSuite) GetInvalidProof() []byte { return invalidProof } + +func TestUnpackInterfaces_Header(t *testing.T) { + registry := testdata.NewTestInterfaceRegistry() + cryptocodec.RegisterInterfaces(registry) + + pk := secp256k1.GenPrivKey().PubKey().(cryptotypes.PubKey) + any, err := codectypes.NewAnyWithValue(pk) + require.NoError(t, err) + + header := types.Header{ + NewPublicKey: any, + } + bz, err := header.Marshal() + require.NoError(t, err) + + var header2 types.Header + err = header2.Unmarshal(bz) + require.NoError(t, err) + + err = codectypes.UnpackInterfaces(header2, registry) + require.NoError(t, err) + + require.Equal(t, pk, header2.NewPublicKey.GetCachedValue()) +} + +func TestUnpackInterfaces_HeaderData(t *testing.T) { + registry := testdata.NewTestInterfaceRegistry() + cryptocodec.RegisterInterfaces(registry) + + pk := secp256k1.GenPrivKey().PubKey().(cryptotypes.PubKey) + any, err := codectypes.NewAnyWithValue(pk) + require.NoError(t, err) + + hd := types.HeaderData{ + NewPubKey: any, + } + bz, err := hd.Marshal() + require.NoError(t, err) + + var hd2 types.HeaderData + err = hd2.Unmarshal(bz) + require.NoError(t, err) + + err = codectypes.UnpackInterfaces(hd2, registry) + require.NoError(t, err) + + require.Equal(t, pk, hd2.NewPubKey.GetCachedValue()) +} From cb16dbcb0c8bdf47b5ee7b46a88876a097fff4f9 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 21 Sep 2020 12:50:40 +0200 Subject: [PATCH 111/128] Fix query tx by hash --- std/codec.go | 3 +- types/tx/types.go | 12 ++++ x/auth/client/rest/query.go | 2 +- x/auth/client/rest/rest_test.go | 114 ++++++++++++++++++++------------ 4 files changed, 85 insertions(+), 46 deletions(-) diff --git a/std/codec.go b/std/codec.go index 423a2add5b4a..94d5ee088b53 100644 --- a/std/codec.go +++ b/std/codec.go @@ -11,9 +11,10 @@ import ( // RegisterLegacyAminoCodec registers types with the Amino codec. func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { - vesting.RegisterLegacyAminoCodec(cdc) sdk.RegisterLegacyAminoCodec(cdc) + txtypes.RegisterLegacyAminoCodec(cdc) cryptocodec.RegisterCrypto(cdc) + vesting.RegisterLegacyAminoCodec(cdc) } // RegisterInterfaces registers Interfaces from sdk/types, vesting, crypto, tx. diff --git a/types/tx/types.go b/types/tx/types.go index 204a7cd06754..4f35bfcf7492 100644 --- a/types/tx/types.go +++ b/types/tx/types.go @@ -3,6 +3,7 @@ package tx import ( fmt "fmt" + "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -142,6 +143,17 @@ func (m *SignerInfo) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { return unpacker.UnpackAny(m.PublicKey, new(crypto.PubKey)) } +// RegisterLegacyAminoCodec registers interfaces to make them work with Amino. +func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { + // This is used when we want to marshal a pubkey using Amino. + // ref: https://github.com/cosmos/cosmos-sdk/issues/7281 + cdc.RegisterInterface((*isModeInfo_Sum)(nil), nil) + cdc.RegisterConcrete(ModeInfo_Single_{}, + "ModeInfo_Single_", nil) + cdc.RegisterConcrete(ModeInfo_Multi_{}, + "ModeInfo_Multi_", nil) +} + // RegisterInterfaces registers the sdk.Tx interface. func RegisterInterfaces(registry codectypes.InterfaceRegistry) { registry.RegisterInterface("cosmos.tx.v1beta1.Tx", (*sdk.Tx)(nil)) diff --git a/x/auth/client/rest/query.go b/x/auth/client/rest/query.go index cc676f359599..bdd755c7183e 100644 --- a/x/auth/client/rest/query.go +++ b/x/auth/client/rest/query.go @@ -53,7 +53,7 @@ func QueryAccountRequestHandlerFn(storeName string, clientCtx client.Context) ht } } -// QueryTxsHandlerFn implements a REST handler that searches for transactions. +// QueryTxsRequestHandlerFn implements a REST handler that searches for transactions. // Genesis transactions are returned if the height parameter is set to zero, // otherwise the transactions are searched for by events. func QueryTxsRequestHandlerFn(clientCtx client.Context) http.HandlerFunc { diff --git a/x/auth/client/rest/rest_test.go b/x/auth/client/rest/rest_test.go index dd407fbef879..2536f262cb1e 100644 --- a/x/auth/client/rest/rest_test.go +++ b/x/auth/client/rest/rest_test.go @@ -1,25 +1,22 @@ -// +build norace - package rest_test import ( "fmt" - "github.com/cosmos/cosmos-sdk/client/tx" - "github.com/cosmos/cosmos-sdk/testutil/testdata" - "github.com/cosmos/cosmos-sdk/types/tx/signing" - authclient "github.com/cosmos/cosmos-sdk/x/auth/client" + "strings" "testing" - sdk "github.com/cosmos/cosmos-sdk/types" - rest2 "github.com/cosmos/cosmos-sdk/x/auth/client/rest" - "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/stretchr/testify/suite" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/cosmos/cosmos-sdk/testutil/network" + "github.com/cosmos/cosmos-sdk/testutil/testdata" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/rest" + "github.com/cosmos/cosmos-sdk/types/tx/signing" + authclient "github.com/cosmos/cosmos-sdk/x/auth/client" + rest2 "github.com/cosmos/cosmos-sdk/x/auth/client/rest" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - - "github.com/cosmos/cosmos-sdk/testutil/network" + "github.com/cosmos/cosmos-sdk/x/bank/types" ) type IntegrationTestSuite struct { @@ -33,7 +30,7 @@ func (s *IntegrationTestSuite) SetupSuite() { s.T().Log("setting up integration test suite") cfg := network.DefaultConfig() - cfg.NumValidators = 1 + cfg.NumValidators = 2 s.cfg = cfg s.network = network.New(s.T(), cfg) @@ -109,11 +106,33 @@ func (s *IntegrationTestSuite) TestBroadcastTxRequest() { s.Require().NotEmpty(txRes.TxHash) } -func (s *IntegrationTestSuite) TestMultipleSyncBroadcastTxRequests() { - +func (s *IntegrationTestSuite) TestQueryTxByHash() { val0 := s.network.Validators[0] - txConfig := authtypes.StdTxConfig{Cdc: s.cfg.LegacyAmino} + // val1 := s.network.Validators[1] + // Create and broadcast a tx. + stdTx := s.createTestStdTx(val0, 1) // Validator's sequence starts at 1. + res, err := s.broadcastReq(stdTx, "sync") + s.Require().NoError(err) + var txRes sdk.TxResponse + // NOTE: this uses amino explicitly, don't migrate it! + s.Require().NoError(s.cfg.LegacyAmino.UnmarshalJSON(res, &txRes)) + // we just check for a non-empty TxHash here, the actual hash will depend on the underlying tx configuration + s.Require().NotEmpty(txRes.TxHash) + + s.network.WaitForNextBlock() + s.network.WaitForNextBlock() + + // We now fetch the tx by has on the `/tx/{hash}` route. + txJSON, err := rest.GetRequest(fmt.Sprintf("%s/txs/%s", val0.APIAddress, txRes.TxHash)) + s.Require().NoError(err) + + // txJSON should contain the whole tx, we just make sure that our custom + // memo is there. + s.Require().True(strings.Contains(string(txJSON), stdTx.Memo)) +} + +func (s *IntegrationTestSuite) TestMultipleSyncBroadcastTxRequests() { // First test transaction from validator should have sequence=1 (non-genesis tx) testCases := []struct { desc string @@ -139,35 +158,8 @@ func (s *IntegrationTestSuite) TestMultipleSyncBroadcastTxRequests() { for _, tc := range testCases { s.Run(fmt.Sprintf("Case %s", tc.desc), func() { - msg := &types.MsgSend{ - val0.Address, - val0.Address, - sdk.Coins{sdk.NewInt64Coin("foo", 100)}, - } - - // prepare txBuilder with msg - txBuilder := txConfig.NewTxBuilder() - feeAmount := sdk.Coins{sdk.NewInt64Coin(s.cfg.BondDenom, 10)} - gasLimit := testdata.NewTestGasLimit() - txBuilder.SetMsgs(msg) - txBuilder.SetFeeAmount(feeAmount) - txBuilder.SetGasLimit(gasLimit) - - // setup txFactory - txFactory := tx.Factory{} - txFactory = txFactory. - WithChainID(val0.ClientCtx.ChainID). - WithKeybase(val0.ClientCtx.Keyring). - WithTxConfig(txConfig). - WithSignMode(signing.SignMode_SIGN_MODE_LEGACY_AMINO_JSON). - WithSequence(tc.sequence) - - // sign Tx (offline mode so we can manually set sequence number) - err := authclient.SignTx(txFactory, val0.ClientCtx, val0.Moniker, txBuilder, true) - s.Require().NoError(err) - // broadcast test with sync mode, as we want to run CheckTx to verify account sequence is correct - stdTx := txBuilder.GetTx().(authtypes.StdTx) + stdTx := s.createTestStdTx(s.network.Validators[0], tc.sequence) res, err := s.broadcastReq(stdTx, "sync") s.Require().NoError(err) @@ -190,7 +182,41 @@ func (s *IntegrationTestSuite) TestMultipleSyncBroadcastTxRequests() { } }) } +} + +func (s *IntegrationTestSuite) createTestStdTx(val *network.Validator, sequence uint64) authtypes.StdTx { + txConfig := authtypes.StdTxConfig{Cdc: s.cfg.LegacyAmino} + + msg := &types.MsgSend{ + FromAddress: val.Address, + ToAddress: val.Address, + Amount: sdk.Coins{sdk.NewInt64Coin(fmt.Sprintf("%stoken", val.Moniker), 100)}, + } + + // prepare txBuilder with msg + txBuilder := txConfig.NewTxBuilder() + feeAmount := sdk.Coins{sdk.NewInt64Coin(s.cfg.BondDenom, 10)} + gasLimit := testdata.NewTestGasLimit() + txBuilder.SetMsgs(msg) + txBuilder.SetFeeAmount(feeAmount) + txBuilder.SetGasLimit(gasLimit) + txBuilder.SetMemo("foobar") + + // setup txFactory + txFactory := tx.Factory{}. + WithChainID(val.ClientCtx.ChainID). + WithKeybase(val.ClientCtx.Keyring). + WithTxConfig(txConfig). + WithSignMode(signing.SignMode_SIGN_MODE_LEGACY_AMINO_JSON). + WithSequence(sequence) + + // sign Tx (offline mode so we can manually set sequence number) + err := authclient.SignTx(txFactory, val.ClientCtx, val.Moniker, txBuilder, true) + s.Require().NoError(err) + + stdTx := txBuilder.GetTx().(authtypes.StdTx) + return stdTx } func (s *IntegrationTestSuite) broadcastReq(stdTx authtypes.StdTx, mode string) ([]byte, error) { From edba7cbf6d5369f2bedb18b71611eb34ef2df53e Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 21 Sep 2020 12:55:04 +0200 Subject: [PATCH 112/128] Better name in amino register --- types/tx/types.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/types/tx/types.go b/types/tx/types.go index 4f35bfcf7492..33857710c4f5 100644 --- a/types/tx/types.go +++ b/types/tx/types.go @@ -149,9 +149,9 @@ func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { // ref: https://github.com/cosmos/cosmos-sdk/issues/7281 cdc.RegisterInterface((*isModeInfo_Sum)(nil), nil) cdc.RegisterConcrete(ModeInfo_Single_{}, - "ModeInfo_Single_", nil) + "cosmos.tx.v1beta1.ModeInfo_Single", nil) cdc.RegisterConcrete(ModeInfo_Multi_{}, - "ModeInfo_Multi_", nil) + "cosmos.tx.v1beta1.ModeInfo_Multi", nil) } // RegisterInterfaces registers the sdk.Tx interface. From a5a866ea6be2067c5e6f1d19b0aad0b83785733e Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 21 Sep 2020 15:22:48 +0200 Subject: [PATCH 113/128] Fix lint --- types/address.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/types/address.go b/types/address.go index 67e82057c858..e84bf94f6cde 100644 --- a/types/address.go +++ b/types/address.go @@ -633,9 +633,8 @@ func Bech32ifyPubKey(pkt Bech32PubKeyType, pubkey crypto.PubKey) (string, error) // TM's ed25519 bech32 encoding, we explicitly say to bech32-encode our own // ed25519 the same way as TM's ed25519. pkToMarshal := pubkey - switch pubkey.(type) { - case *ed25519.PubKey: - pkToMarshal = pubkey.(*ed25519.PubKey).AsTmPubKey() + if ed25519Pk, ok := pubkey.(*ed25519.PubKey); ok { + pkToMarshal = ed25519Pk.AsTmPubKey() } return bech32.ConvertAndEncode(bech32Prefix, legacy.Cdc.MustMarshalBinaryBare(pkToMarshal)) From 990ef4864f2a148355aee2744d4e09138b01a626 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 21 Sep 2020 18:42:51 +0200 Subject: [PATCH 114/128] Add back ed25519 test (fixes #7352) --- x/auth/ante/ante_test.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/x/auth/ante/ante_test.go b/x/auth/ante/ante_test.go index 9ca8c24a65c1..cef7ca29153a 100644 --- a/x/auth/ante/ante_test.go +++ b/x/auth/ante/ante_test.go @@ -1034,6 +1034,25 @@ func (suite *AnteTestSuite) TestCustomSignatureVerificationGasConsumer() { false, sdkerrors.ErrInvalidPubKey, }, + { + "verify that an ed25519 account gets accepted", + func() { + priv1 := ed25519.GenPrivKey() + pub1 := priv1.PubKey() + addr1 := sdk.AccAddress(pub1.Address()) + acc1 := suite.app.AccountKeeper.NewAccountWithAddress(suite.ctx, addr1) + + suite.Require().NoError(suite.app.BankKeeper.SetBalances(suite.ctx, addr1, sdk.NewCoins(sdk.NewInt64Coin("atom", 150)))) + suite.Require().NoError(acc1.SetAccountNumber(1)) + suite.app.AccountKeeper.SetAccount(suite.ctx, acc1) + msg := testdata.NewTestMsg(addr1) + privs, accNums, accSeqs = []crypto.PrivKey{priv1}, []uint64{1}, []uint64{0} + msgs = []sdk.Msg{msg} + }, + false, + true, + nil, + }, } for _, tc := range testCases { From 572ea4fbcdb9643d8563aa5819fb3c6fd6b76b79 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 21 Sep 2020 18:52:47 +0200 Subject: [PATCH 115/128] go mod tidy --- go.sum | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/go.sum b/go.sum index f530d84e573c..b2d9ab8d617e 100644 --- a/go.sum +++ b/go.sum @@ -273,8 +273,6 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.5 h1:UImYN5qQ8tuGpGE16ZmjvcTtTw24zw1 github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.14.7 h1:Nk5kuHrnWUTf/0GL1a/vchH/om9Ap2/HnVna+jYZgTY= github.com/grpc-ecosystem/grpc-gateway v1.14.7/go.mod h1:oYZKL012gGh6LMyg/xA7Q2yq6j8bu0wa+9w14EEthWU= -github.com/grpc-ecosystem/grpc-gateway v1.14.8 h1:hXClj+iFpmLM8i3lkO6i4Psli4P2qObQuQReiII26U8= -github.com/grpc-ecosystem/grpc-gateway v1.14.8/go.mod h1:NZE8t6vs6TnwLL/ITkaK8W3ecMLGAbh2jXTclvpiwYo= github.com/grpc-ecosystem/grpc-gateway v1.15.0 h1:ntPNC9TD/6l2XDenJZe6T5lSMg95thpV9sGAqHX4WU8= github.com/grpc-ecosystem/grpc-gateway v1.15.0/go.mod h1:vO11I9oWA+KsxmfFQPhLnnIb1VDE24M+pdxZFiuZcA8= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= @@ -516,18 +514,22 @@ github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR 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/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sasha-s/go-deadlock v0.2.0 h1:lMqc+fUb7RrFS3gQLtoQsJ7/6TV/pAIFvBsqX73DK8Y= github.com/sasha-s/go-deadlock v0.2.0/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= @@ -555,6 +557,7 @@ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3 github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -566,6 +569,7 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69 github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca h1:Ld/zXl5t4+D69SiV4JoN7kkfvJdOWlPpfxrzxpLMoUk= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= +github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s= github.com/tendermint/btcd v0.1.1/go.mod h1:DC6/m53jtQzr/NFmMNEu0rxf18/ktVoVtMrnDD5pN+U= @@ -590,9 +594,11 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/zondax/hid v0.9.0 h1:eiT3P6vNxAEVxXMw66eZUAAnU2zD33JBkfG/EnfAKl8= github.com/zondax/hid v0.9.0/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -757,6 +763,7 @@ golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapK golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -821,6 +828,7 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= @@ -829,6 +837,7 @@ gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= From 0e0e11fbbb8d91cb012fecc0cacd77a86656bdb8 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Mon, 21 Sep 2020 18:53:31 +0200 Subject: [PATCH 116/128] Fix merge issues --- std/codec.go | 1 - 1 file changed, 1 deletion(-) diff --git a/std/codec.go b/std/codec.go index 94d5ee088b53..7cd633b41231 100644 --- a/std/codec.go +++ b/std/codec.go @@ -12,7 +12,6 @@ import ( // RegisterLegacyAminoCodec registers types with the Amino codec. func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { sdk.RegisterLegacyAminoCodec(cdc) - txtypes.RegisterLegacyAminoCodec(cdc) cryptocodec.RegisterCrypto(cdc) vesting.RegisterLegacyAminoCodec(cdc) } From afbaec07f8961763833d595a7e94470e6ce9cf0b Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Tue, 22 Sep 2020 15:00:18 +0200 Subject: [PATCH 117/128] Sort import --- client/debug/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/debug/main.go b/client/debug/main.go index b2cb76c30c3a..bb465e97bfd6 100644 --- a/client/debug/main.go +++ b/client/debug/main.go @@ -7,11 +7,11 @@ import ( "strconv" "strings" - "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/spf13/cobra" "github.com/tendermint/tendermint/crypto" "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/version" ) From 69212c373e6f42c41216af908a339af6e901aa95 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Tue, 22 Sep 2020 15:19:55 +0200 Subject: [PATCH 118/128] Add test for backwards-compatibility --- crypto/keys/ed25519/ed25519_test.go | 55 ++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/crypto/keys/ed25519/ed25519_test.go b/crypto/keys/ed25519/ed25519_test.go index 17ec12ed6b7e..339a1c1f7506 100644 --- a/crypto/keys/ed25519/ed25519_test.go +++ b/crypto/keys/ed25519/ed25519_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/crypto" + tmed25519 "github.com/tendermint/tendermint/crypto/ed25519" "github.com/tendermint/tendermint/crypto/sr25519" "github.com/cosmos/cosmos-sdk/codec" @@ -15,7 +16,6 @@ import ( ) func TestSignAndValidateEd25519(t *testing.T) { - privKey := ed25519.GenPrivKey() pubKey := privKey.PubKey() @@ -163,3 +163,56 @@ func TestMarshalAmino(t *testing.T) { }) } } + +func TestMarshalAmino_BackwardsCompatibility(t *testing.T) { + aminoCdc := codec.NewLegacyAmino() + // Create Tendermint keys. + tmPrivKey := tmed25519.GenPrivKey() + tmPubKey := tmPrivKey.PubKey() + // Create our own keys, with the same private key as Tendermint's. + privKey := &ed25519.PrivKey{Key: []byte(tmPrivKey)} + pubKey := privKey.PubKey().(*ed25519.PubKey) + + testCases := []struct { + desc string + tmKey interface{} + ourKey interface{} + marshalFn func(o interface{}) ([]byte, error) + }{ + { + "ed25519 private key, binary", + tmPrivKey, + privKey, + aminoCdc.MarshalBinaryBare, + }, + { + "ed25519 private key, JSON", + tmPrivKey, + privKey, + aminoCdc.MarshalBinaryBare, + }, + { + "ed25519 public key, binary", + tmPubKey, + pubKey, + aminoCdc.MarshalJSON, + }, + { + "ed25519 public key, JSON", + tmPubKey, + pubKey, + aminoCdc.MarshalJSON, + }, + } + + for _, tc := range testCases { + t.Run(tc.desc, func(t *testing.T) { + // Make sure Amino encoding override is not breaking backwards compatibility. + bz1, err := tc.marshalFn(tc.tmKey) + require.NoError(t, err) + bz2, err := tc.marshalFn(tc.ourKey) + require.NoError(t, err) + require.Equal(t, bz1, bz2) + }) + } +} From ca916defa558874943f4fcf770c1e5cc1e80b31d Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Tue, 22 Sep 2020 15:36:30 +0200 Subject: [PATCH 119/128] Fix tests --- crypto/keys/ed25519/ed25519_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto/keys/ed25519/ed25519_test.go b/crypto/keys/ed25519/ed25519_test.go index 339a1c1f7506..f2c3d7ba3883 100644 --- a/crypto/keys/ed25519/ed25519_test.go +++ b/crypto/keys/ed25519/ed25519_test.go @@ -189,13 +189,13 @@ func TestMarshalAmino_BackwardsCompatibility(t *testing.T) { "ed25519 private key, JSON", tmPrivKey, privKey, - aminoCdc.MarshalBinaryBare, + aminoCdc.MarshalJSON, }, { "ed25519 public key, binary", tmPubKey, pubKey, - aminoCdc.MarshalJSON, + aminoCdc.MarshalBinaryBare, }, { "ed25519 public key, JSON", From a849010f8ae4df10e23bdc1f0fc827c936ef6c44 Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Tue, 22 Sep 2020 17:59:47 +0200 Subject: [PATCH 120/128] Fix merge issue --- x/auth/ante/sigverify.go | 1 + 1 file changed, 1 insertion(+) diff --git a/x/auth/ante/sigverify.go b/x/auth/ante/sigverify.go index 3e5ec6d060e7..ad859eb2bb63 100644 --- a/x/auth/ante/sigverify.go +++ b/x/auth/ante/sigverify.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" + kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" "github.com/cosmos/cosmos-sdk/crypto/types/multisig" sdk "github.com/cosmos/cosmos-sdk/types" From 13937d38f399154a8b32e1c84f64152fe5e967b9 Mon Sep 17 00:00:00 2001 From: Marie Gauthier Date: Thu, 24 Sep 2020 10:59:56 +0200 Subject: [PATCH 121/128] Update client/context.go Co-authored-by: Cory --- client/context.go | 1 - 1 file changed, 1 deletion(-) diff --git a/client/context.go b/client/context.go index 1b45adeee485..ef8ccee9b5a2 100644 --- a/client/context.go +++ b/client/context.go @@ -7,7 +7,6 @@ import ( "github.com/gogo/protobuf/proto" "gopkg.in/yaml.v2" - "github.com/pkg/errors" rpcclient "github.com/tendermint/tendermint/rpc/client" rpchttp "github.com/tendermint/tendermint/rpc/client/http" From 1df85130021ec71230858ffc5f2f3d9b43fbeb44 Mon Sep 17 00:00:00 2001 From: Marie Gauthier Date: Thu, 24 Sep 2020 11:02:16 +0200 Subject: [PATCH 122/128] Update types/address.go Co-authored-by: Cory --- types/address.go | 1 + 1 file changed, 1 insertion(+) diff --git a/types/address.go b/types/address.go index e84bf94f6cde..47edbd95266e 100644 --- a/types/address.go +++ b/types/address.go @@ -632,6 +632,7 @@ func Bech32ifyPubKey(pkt Bech32PubKeyType, pubkey crypto.PubKey) (string, error) // different name than TM's ed25519. But since users are already using // TM's ed25519 bech32 encoding, we explicitly say to bech32-encode our own // ed25519 the same way as TM's ed25519. + // TODO: Remove Bech32ifyPubKey and all usages (cosmos/cosmos-sdk/issues/#7357) pkToMarshal := pubkey if ed25519Pk, ok := pubkey.(*ed25519.PubKey); ok { pkToMarshal = ed25519Pk.AsTmPubKey() From 8df6054ab525573a57c95bc27c4651ea91cb5619 Mon Sep 17 00:00:00 2001 From: blushi Date: Thu, 24 Sep 2020 11:29:55 +0200 Subject: [PATCH 123/128] Address feedback --- client/debug/main.go | 3 ++- codec/yaml.go | 10 ++++------ x/auth/ante/sigverify.go | 3 ++- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/client/debug/main.go b/client/debug/main.go index bb465e97bfd6..85f1bc92c1be 100644 --- a/client/debug/main.go +++ b/client/debug/main.go @@ -13,6 +13,7 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/version" ) @@ -87,7 +88,7 @@ $ %s debug pubkey cosmos1e0jnq2sun3dzjh8p2xq95kk0expwmd7shwjpfg edPK, ok := pk.(*ed25519.PubKey) if !ok { - return fmt.Errorf("invalid pubkey type; expected ED25519") + return errors.Wrapf(errors.ErrInvalidType, "invalid pubkey type; expected ED25519") } pubKeyJSONBytes, err := clientCtx.LegacyAmino.MarshalJSON(edPK) diff --git a/codec/yaml.go b/codec/yaml.go index 817fb8e4c0bc..184b539a8ab4 100644 --- a/codec/yaml.go +++ b/codec/yaml.go @@ -10,6 +10,9 @@ import ( // MarshalYAML marshals the provided toPrint content with the provided JSON marshaler // by encoding JSON, decoding JSON, and then encoding YAML. func MarshalYAML(jsonMarshaler JSONMarshaler, toPrint proto.Message) ([]byte, error) { + // only the JSONMarshaler has full context as to how the JSON + // mashalling should look (which may be different for amino & proto codecs) + // so we need to use it to marshal toPrint first bz, err := jsonMarshaler.MarshalJSON(toPrint) if err != nil { return nil, err @@ -23,10 +26,5 @@ func MarshalYAML(jsonMarshaler JSONMarshaler, toPrint proto.Message) ([]byte, er return nil, err } - bz, err = yaml.Marshal(j) - if err != nil { - return nil, err - } - - return bz, nil + return yaml.Marshal(j) } diff --git a/x/auth/ante/sigverify.go b/x/auth/ante/sigverify.go index ad859eb2bb63..80ea9317e1c7 100644 --- a/x/auth/ante/sigverify.go +++ b/x/auth/ante/sigverify.go @@ -5,6 +5,8 @@ import ( "encoding/hex" "fmt" + "github.com/tendermint/tendermint/crypto" + "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" @@ -15,7 +17,6 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/legacy/legacytx" authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing" "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/tendermint/tendermint/crypto" ) var ( From 3cf6ba098ced4bf34f01743ebad8fb30d67935d7 Mon Sep 17 00:00:00 2001 From: blushi Date: Thu, 24 Sep 2020 11:55:13 +0200 Subject: [PATCH 124/128] Add comment --- crypto/codec/amino.go | 1 + 1 file changed, 1 insertion(+) diff --git a/crypto/codec/amino.go b/crypto/codec/amino.go index 20578988facc..5a98acbac364 100644 --- a/crypto/codec/amino.go +++ b/crypto/codec/amino.go @@ -42,6 +42,7 @@ func RegisterCrypto(cdc *codec.LegacyAmino) { cdc.RegisterInterface((*crypto.PrivKey)(nil), nil) cdc.RegisterConcrete(sr25519.PrivKey{}, sr25519.PrivKeyName, nil) + // TODO Same as above cdc.RegisterConcrete(tmed25519.PrivKey{}, tmed25519.PrivKeyName, nil) cdc.RegisterConcrete(&ed25519.PrivKey{}, From 3a664d5b55ad1c2ec146c4fbafb3db19e9328747 Mon Sep 17 00:00:00 2001 From: blushi Date: Thu, 24 Sep 2020 13:22:30 +0200 Subject: [PATCH 125/128] Fix BaseAccount SetPubKey and address further comments --- crypto/keys/ed25519/ed25519.go | 18 ++++++++++-------- crypto/keys/secp256k1/secp256k1.go | 11 +++++++---- simapp/test_helpers.go | 8 +++++--- x/auth/types/account.go | 8 +++----- 4 files changed, 25 insertions(+), 20 deletions(-) diff --git a/crypto/keys/ed25519/ed25519.go b/crypto/keys/ed25519/ed25519.go index 90d713d457ef..2a94a2e8020c 100644 --- a/crypto/keys/ed25519/ed25519.go +++ b/crypto/keys/ed25519/ed25519.go @@ -12,6 +12,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + "github.com/cosmos/cosmos-sdk/types/errors" ) //------------------------------------- @@ -21,8 +22,8 @@ const ( PubKeyName = "cosmos/PubKeyEd25519" // PubKeySize is is the size, in bytes, of public keys as used in this package. PubKeySize = 32 - // PrivateKeySize is the size, in bytes, of private keys as used in this package. - PrivateKeySize = 64 + // PrivKeySize is the size, in bytes, of private keys as used in this package. + PrivKeySize = 64 // Size of an Edwards25519 signature. Namely the size of a compressed // Edwards25519 point, and a field element. Both of which are 32 bytes. SignatureSize = 64 @@ -49,8 +50,7 @@ func (privKey *PrivKey) Bytes() []byte { // If these conditions aren't met, Sign will panic or produce an // incorrect signature. func (privKey *PrivKey) Sign(msg []byte) ([]byte, error) { - signatureBytes := ed25519.Sign(ed25519.PrivateKey(privKey.Key), msg) - return signatureBytes, nil + return ed25519.Sign(ed25519.PrivateKey(privKey.Key), msg), nil } // PubKey gets the corresponding public key from the private key. @@ -97,9 +97,10 @@ func (privKey PrivKey) MarshalAmino() ([]byte, error) { // UnmarshalAmino overrides Amino binary marshalling. func (privKey *PrivKey) UnmarshalAmino(bz []byte) error { - *privKey = PrivKey{ - Key: bz, + if len(bz) != PrivKeySize { + return fmt.Errorf("invalid privkey size") } + privKey.Key = bz return nil } @@ -196,9 +197,10 @@ func (pubKey PubKey) MarshalAmino() ([]byte, error) { // UnmarshalAmino overrides Amino binary marshalling. func (pubKey *PubKey) UnmarshalAmino(bz []byte) error { - *pubKey = PubKey{ - Key: bz, + if len(bz) != PubKeySize { + return errors.Wrap(errors.ErrInvalidPubKey, "invalid pubkey size") } + pubKey.Key = bz return nil } diff --git a/crypto/keys/secp256k1/secp256k1.go b/crypto/keys/secp256k1/secp256k1.go index a19b6c830d4e..0cb403ff80d9 100644 --- a/crypto/keys/secp256k1/secp256k1.go +++ b/crypto/keys/secp256k1/secp256k1.go @@ -11,6 +11,7 @@ import ( secp256k1 "github.com/btcsuite/btcd/btcec" "github.com/cosmos/cosmos-sdk/codec" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" + "github.com/cosmos/cosmos-sdk/types/errors" "golang.org/x/crypto/ripemd160" // nolint: staticcheck // necessary for Bitcoin address format "github.com/tendermint/tendermint/crypto" @@ -56,9 +57,10 @@ func (privKey PrivKey) MarshalAmino() ([]byte, error) { // UnmarshalAmino overrides Amino binary marshalling. func (privKey *PrivKey) UnmarshalAmino(bz []byte) error { - *privKey = PrivKey{ - Key: bz, + if len(bz) != PrivKeySize { + return fmt.Errorf("invalid privkey size") } + privKey.Key = bz return nil } @@ -182,9 +184,10 @@ func (pubKey PubKey) MarshalAmino() ([]byte, error) { // UnmarshalAmino overrides Amino binary marshalling. func (pubKey *PubKey) UnmarshalAmino(bz []byte) error { - *pubKey = PubKey{ - Key: bz, + if len(bz) != PubKeySize { + return errors.Wrap(errors.ErrInvalidPubKey, "invalid pubkey size") } + pubKey.Key = bz return nil } diff --git a/simapp/test_helpers.go b/simapp/test_helpers.go index 3cacb5194d29..f4cccbf87db3 100644 --- a/simapp/test_helpers.go +++ b/simapp/test_helpers.go @@ -22,6 +22,7 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/keys/ed25519" "github.com/cosmos/cosmos-sdk/simapp/helpers" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/errors" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -420,7 +421,8 @@ func NewPubKeyFromHex(pk string) (res crypto.PubKey) { if err != nil { panic(err) } - pkEd := make([]byte, ed25519.PubKeySize) - copy(pkEd, pkBytes) - return &ed25519.PubKey{Key: pkEd} + if len(pkBytes) != ed25519.PubKeySize { + panic(errors.Wrap(errors.ErrInvalidPubKey, "invalid pubkey size")) + } + return &ed25519.PubKey{Key: pkBytes} } diff --git a/x/auth/types/account.go b/x/auth/types/account.go index e2b1a82d5569..d243e74a78e4 100644 --- a/x/auth/types/account.go +++ b/x/auth/types/account.go @@ -7,17 +7,15 @@ import ( "fmt" "strings" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/gogo/protobuf/proto" "github.com/tendermint/tendermint/crypto" yaml "gopkg.in/yaml.v2" "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) var ( @@ -94,7 +92,7 @@ func (acc *BaseAccount) SetPubKey(pubKey crypto.PubKey) error { any, err := codectypes.NewAnyWithValue(protoMsg) if err != nil { - return nil + return err } acc.PubKey = any From f282cff86956c8fb25882a556cb2b1e41bde70e9 Mon Sep 17 00:00:00 2001 From: blushi Date: Thu, 24 Sep 2020 13:51:14 +0200 Subject: [PATCH 126/128] Lint --- client/context.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/context.go b/client/context.go index ef8ccee9b5a2..71ee6891accc 100644 --- a/client/context.go +++ b/client/context.go @@ -5,8 +5,9 @@ import ( "io" "os" - "github.com/gogo/protobuf/proto" "gopkg.in/yaml.v2" + + "github.com/gogo/protobuf/proto" "github.com/pkg/errors" rpcclient "github.com/tendermint/tendermint/rpc/client" rpchttp "github.com/tendermint/tendermint/rpc/client/http" From ec9b0b1439dae81c138ce5c0db61aab6c7c8dffc Mon Sep 17 00:00:00 2001 From: blushi Date: Thu, 24 Sep 2020 14:12:36 +0200 Subject: [PATCH 127/128] Remove unnecessary use of copy in getPubKeyFromString --- client/debug/main.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/client/debug/main.go b/client/debug/main.go index 85f1bc92c1be..feb1f30d92f2 100644 --- a/client/debug/main.go +++ b/client/debug/main.go @@ -35,18 +35,18 @@ func Cmd() *cobra.Command { // to decode the pubkey string from hex, base64, and finally bech32. If all // encodings fail, an error is returned. func getPubKeyFromString(pkstr string) (crypto.PubKey, error) { - pubKey := make([]byte, ed25519.PubKeySize) - bz, err := hex.DecodeString(pkstr) if err == nil { - copy(pubKey, bz) - return &ed25519.PubKey{Key: pubKey}, nil + if len(bz) == ed25519.PubKeySize { + return &ed25519.PubKey{Key: bz}, nil + } } bz, err = base64.StdEncoding.DecodeString(pkstr) if err == nil { - copy(pubKey, bz) - return &ed25519.PubKey{Key: pubKey}, nil + if len(bz) == ed25519.PubKeySize { + return &ed25519.PubKey{Key: bz}, nil + } } pk, err := sdk.GetPubKeyFromBech32(sdk.Bech32PubKeyTypeAccPub, pkstr) @@ -64,7 +64,7 @@ func getPubKeyFromString(pkstr string) (crypto.PubKey, error) { return pk, nil } - return nil, fmt.Errorf("pubkey '%s' invalid; expected hex, base64, or bech32", pubKey) + return nil, fmt.Errorf("pubkey '%s' invalid; expected hex, base64, or bech32 of correct size", pkstr) } func PubkeyCmd() *cobra.Command { From bc034923b1c806fdbde292e724fbed0be28df36a Mon Sep 17 00:00:00 2001 From: blushi Date: Thu, 24 Sep 2020 14:15:31 +0200 Subject: [PATCH 128/128] Update comment --- x/staking/types/validator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/staking/types/validator.go b/x/staking/types/validator.go index 5b8a9af892eb..e64cd52b2700 100644 --- a/x/staking/types/validator.go +++ b/x/staking/types/validator.go @@ -426,7 +426,7 @@ func (v Validator) GetConsPubKey() crypto.PubKey { // ed25519 pubkey, sometimes our own ed25519 pubkey. This is very ugly and // inconsistent. // Luckily, here we coerce it into a TM ed25519 pubkey always, as this - // pubkey will be passed into TM. + // pubkey will be passed into TM (eg calling encoding.PubKeyToProto). pk := sdk.MustGetPubKeyFromBech32(sdk.Bech32PubKeyTypeConsPub, v.ConsensusPubkey) if intoTmPk, ok := pk.(cryptotypes.IntoTmPubKey); ok {