From 15b285dd0d707bbf941c535698f3b5bc0b3a84cc Mon Sep 17 00:00:00 2001 From: Amaury Martiny Date: Tue, 10 Nov 2020 14:01:55 +0100 Subject: [PATCH 1/4] Fix creation of local RPC node in clientCtx (#7840) * server: only register the Tx service if the API or gRPC are enabled Only registers the Tx service on an app, if either API or gRPC are enabled. This is because, enabling the service starts a local Tendermint node, which is unnecessary and expensive, if neither of those operations are explicitly enabled. * Fix lint Co-authored-by: Alessio Treglia --- server/start.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/server/start.go b/server/start.go index 2a2a1af88..b8565a87a 100644 --- a/server/start.go +++ b/server/start.go @@ -252,12 +252,20 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App } ctx.Logger.Debug("Initialization: tmNode started") - // Add the tx service to the gRPC router. - app.RegisterTxService(clientCtx) + config := config.GetConfig(ctx.Viper) + + // Add the tx service to the gRPC router. We only need to register this + // service if API or gRPC is enabled, and avoid doing so in the general + // case, because it spawns a new local tendermint RPC client. + if config.API.Enable || config.GRPC.Enable { + clientCtx = clientCtx. + WithClient(local.New(tmNode)) + + app.RegisterTxService(clientCtx) + } var apiSrv *api.Server - config := config.GetConfig(ctx.Viper) if config.API.Enable { genDoc, err := genDocProvider() if err != nil { @@ -266,8 +274,7 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App clientCtx := clientCtx. WithHomeDir(home). - WithChainID(genDoc.ChainID). - WithClient(local.New(tmNode)) + WithChainID(genDoc.ChainID) apiSrv = api.New(clientCtx, ctx.Logger.With("module", "api-server")) app.RegisterAPIRoutes(apiSrv, config.API) From fdcb028636c940b94387ad86b83959aab4b92cde Mon Sep 17 00:00:00 2001 From: Aditya Date: Tue, 10 Nov 2020 14:39:09 +0000 Subject: [PATCH 2/4] ibc: proof fixes (#7869) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * change proof proto def * progress fixing tests * complete proof restructure * remove use of KeyPath * improve error msgs * docs and lint * Apply suggestions from code review Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com> Co-authored-by: colin axnér <25233464+colin-axner@users.noreply.github.com> * address code review * fix string tests * add ConvertProofs tests * Apply suggestions from code review Co-authored-by: colin axnér <25233464+colin-axner@users.noreply.github.com> Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com> Co-authored-by: colin axnér <25233464+colin-axner@users.noreply.github.com> --- proto/ibc/core/commitment/v1/commitment.proto | 38 +- x/ibc/core/03-connection/types/msgs_test.go | 5 +- x/ibc/core/04-channel/keeper/keeper_test.go | 3 + x/ibc/core/04-channel/types/msgs_test.go | 5 +- .../core/23-commitment/types/commitment.pb.go | 524 +------- x/ibc/core/23-commitment/types/key_path.go | 40 - x/ibc/core/23-commitment/types/merkle.go | 187 +-- x/ibc/core/23-commitment/types/merkle_test.go | 58 +- x/ibc/core/23-commitment/types/utils.go | 27 + x/ibc/core/23-commitment/types/utils_test.go | 97 ++ x/ibc/core/client/query.go | 5 +- x/ibc/core/keeper/msg_server_test.go | 3 + .../06-solomachine/types/client_state.go | 22 +- .../07-tendermint/types/client_state.go | 22 +- .../07-tendermint/types/tendermint_test.go | 3 + .../07-tendermint/types/upgrade.go | 2 +- x/ibc/testing/chain.go | 10 +- x/ibc/testing/solomachine.go | 22 +- x/staking/types/staking.pb.go | 1184 +++++++++-------- 19 files changed, 980 insertions(+), 1277 deletions(-) delete mode 100644 x/ibc/core/23-commitment/types/key_path.go create mode 100644 x/ibc/core/23-commitment/types/utils.go create mode 100644 x/ibc/core/23-commitment/types/utils_test.go diff --git a/proto/ibc/core/commitment/v1/commitment.proto b/proto/ibc/core/commitment/v1/commitment.proto index 0ed6be0f2..9e9d22f08 100644 --- a/proto/ibc/core/commitment/v1/commitment.proto +++ b/proto/ibc/core/commitment/v1/commitment.proto @@ -4,7 +4,7 @@ package ibc.core.commitment.v1; option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/core/23-commitment/types"; import "gogoproto/gogo.proto"; -import "tendermint/crypto/proof.proto"; +import "confio/proofs.proto"; // MerkleRoot defines a merkle root hash. // In the Cosmos SDK, the AppHash of a block header becomes the root. @@ -23,42 +23,18 @@ message MerklePrefix { // MerklePath is the path used to verify commitment proofs, which can be an // arbitrary structured object (defined by a commitment type). +// MerklePath is represented from root-to-leaf message MerklePath { option (gogoproto.goproto_stringer) = false; - KeyPath key_path = 1 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"key_path\""]; + repeated string key_path = 1 [(gogoproto.moretags) = "yaml:\"key_path\""]; } -// MerkleProof is a wrapper type that contains a merkle proof. +// MerkleProof is a wrapper type over a chain of CommitmentProofs. // It demonstrates membership or non-membership for an element or set of // elements, verifiable in conjunction with a known commitment root. Proofs // should be succinct. +// MerkleProofs are ordered from leaf-to-root message MerkleProof { - tendermint.crypto.ProofOps proof = 1; -} - -// KeyPath defines a slice of keys -message KeyPath { - option (gogoproto.goproto_stringer) = false; - option (gogoproto.goproto_getters) = false; - - repeated Key keys = 1; -} - -// Key defines a proof Key -message Key { - option (gogoproto.goproto_getters) = false; - - bytes name = 1; - KeyEncoding enc = 2; -} - -// KeyEncoding defines the encoding format of a key's bytes. -enum KeyEncoding { - option (gogoproto.goproto_enum_prefix) = false; - - // URL encoding - KEY_ENCODING_URL_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "URL"]; - // Hex encoding - KEY_ENCODING_HEX = 1 [(gogoproto.enumvalue_customname) = "HEX"]; -} + repeated ics23.CommitmentProof proofs = 1; +} \ No newline at end of file diff --git a/x/ibc/core/03-connection/types/msgs_test.go b/x/ibc/core/03-connection/types/msgs_test.go index cfb8ce735..f83963790 100644 --- a/x/ibc/core/03-connection/types/msgs_test.go +++ b/x/ibc/core/03-connection/types/msgs_test.go @@ -62,9 +62,10 @@ func (suite *MsgTestSuite) SetupTest() { Prove: true, }) - merkleProof := commitmenttypes.MerkleProof{Proof: res.ProofOps} + merkleProof, err := commitmenttypes.ConvertProofs(res.ProofOps) + suite.Require().NoError(err) proof, err := app.AppCodec().MarshalBinaryBare(&merkleProof) - suite.NoError(err) + suite.Require().NoError(err) suite.proof = proof diff --git a/x/ibc/core/04-channel/keeper/keeper_test.go b/x/ibc/core/04-channel/keeper/keeper_test.go index 9fcc9e20d..01f7a7584 100644 --- a/x/ibc/core/04-channel/keeper/keeper_test.go +++ b/x/ibc/core/04-channel/keeper/keeper_test.go @@ -30,6 +30,9 @@ func (suite *KeeperTestSuite) SetupTest() { suite.coordinator = ibctesting.NewCoordinator(suite.T(), 2) suite.chainA = suite.coordinator.GetChain(ibctesting.GetChainID(0)) suite.chainB = suite.coordinator.GetChain(ibctesting.GetChainID(1)) + // commit some blocks so that QueryProof returns valid proof (cannot return valid query if height <= 1) + suite.coordinator.CommitNBlocks(suite.chainA, 2) + suite.coordinator.CommitNBlocks(suite.chainB, 2) } // TestSetChannel create clients and connections on both chains. It tests for the non-existence diff --git a/x/ibc/core/04-channel/types/msgs_test.go b/x/ibc/core/04-channel/types/msgs_test.go index 9cf466840..f7004df68 100644 --- a/x/ibc/core/04-channel/types/msgs_test.go +++ b/x/ibc/core/04-channel/types/msgs_test.go @@ -93,9 +93,10 @@ func (suite *TypesTestSuite) SetupTest() { Prove: true, }) - merkleProof := commitmenttypes.MerkleProof{Proof: res.ProofOps} + merkleProof, err := commitmenttypes.ConvertProofs(res.ProofOps) + suite.Require().NoError(err) proof, err := app.AppCodec().MarshalBinaryBare(&merkleProof) - suite.NoError(err) + suite.Require().NoError(err) suite.proof = proof } diff --git a/x/ibc/core/23-commitment/types/commitment.pb.go b/x/ibc/core/23-commitment/types/commitment.pb.go index ac7212711..bb28053e7 100644 --- a/x/ibc/core/23-commitment/types/commitment.pb.go +++ b/x/ibc/core/23-commitment/types/commitment.pb.go @@ -5,9 +5,9 @@ package types import ( fmt "fmt" + _go "github.com/confio/ics23/go" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" - crypto "github.com/tendermint/tendermint/proto/tendermint/crypto" io "io" math "math" math_bits "math/bits" @@ -24,34 +24,6 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// KeyEncoding defines the encoding format of a key's bytes. -type KeyEncoding int32 - -const ( - // URL encoding - URL KeyEncoding = 0 - // Hex encoding - HEX KeyEncoding = 1 -) - -var KeyEncoding_name = map[int32]string{ - 0: "KEY_ENCODING_URL_UNSPECIFIED", - 1: "KEY_ENCODING_HEX", -} - -var KeyEncoding_value = map[string]int32{ - "KEY_ENCODING_URL_UNSPECIFIED": 0, - "KEY_ENCODING_HEX": 1, -} - -func (x KeyEncoding) String() string { - return proto.EnumName(KeyEncoding_name, int32(x)) -} - -func (KeyEncoding) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_7921d88972a41469, []int{0} -} - // MerkleRoot defines a merkle root hash. // In the Cosmos SDK, the AppHash of a block header becomes the root. type MerkleRoot struct { @@ -141,7 +113,7 @@ func (m *MerklePrefix) GetKeyPrefix() []byte { // MerklePath is the path used to verify commitment proofs, which can be an // arbitrary structured object (defined by a commitment type). type MerklePath struct { - KeyPath KeyPath `protobuf:"bytes,1,opt,name=key_path,json=keyPath,proto3" json:"key_path" yaml:"key_path"` + KeyPath []string `protobuf:"bytes,1,rep,name=key_path,json=keyPath,proto3" json:"key_path,omitempty" yaml:"key_path"` } func (m *MerklePath) Reset() { *m = MerklePath{} } @@ -176,19 +148,19 @@ func (m *MerklePath) XXX_DiscardUnknown() { var xxx_messageInfo_MerklePath proto.InternalMessageInfo -func (m *MerklePath) GetKeyPath() KeyPath { +func (m *MerklePath) GetKeyPath() []string { if m != nil { return m.KeyPath } - return KeyPath{} + return nil } -// MerkleProof is a wrapper type that contains a merkle proof. +// MerkleProof is a wrapper type over a chain of CommitmentProofs. // It demonstrates membership or non-membership for an element or set of // elements, verifiable in conjunction with a known commitment root. Proofs // should be succinct. type MerkleProof struct { - Proof *crypto.ProofOps `protobuf:"bytes,1,opt,name=proof,proto3" json:"proof,omitempty"` + Proofs []*_go.CommitmentProof `protobuf:"bytes,1,rep,name=proofs,proto3" json:"proofs,omitempty"` } func (m *MerkleProof) Reset() { *m = MerkleProof{} } @@ -224,97 +196,18 @@ func (m *MerkleProof) XXX_DiscardUnknown() { var xxx_messageInfo_MerkleProof proto.InternalMessageInfo -func (m *MerkleProof) GetProof() *crypto.ProofOps { +func (m *MerkleProof) GetProofs() []*_go.CommitmentProof { if m != nil { - return m.Proof + return m.Proofs } return nil } -// KeyPath defines a slice of keys -type KeyPath struct { - Keys []*Key `protobuf:"bytes,1,rep,name=keys,proto3" json:"keys,omitempty"` -} - -func (m *KeyPath) Reset() { *m = KeyPath{} } -func (*KeyPath) ProtoMessage() {} -func (*KeyPath) Descriptor() ([]byte, []int) { - return fileDescriptor_7921d88972a41469, []int{4} -} -func (m *KeyPath) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *KeyPath) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_KeyPath.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 *KeyPath) XXX_Merge(src proto.Message) { - xxx_messageInfo_KeyPath.Merge(m, src) -} -func (m *KeyPath) XXX_Size() int { - return m.Size() -} -func (m *KeyPath) XXX_DiscardUnknown() { - xxx_messageInfo_KeyPath.DiscardUnknown(m) -} - -var xxx_messageInfo_KeyPath proto.InternalMessageInfo - -// Key defines a proof Key -type Key struct { - Name []byte `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Enc KeyEncoding `protobuf:"varint,2,opt,name=enc,proto3,enum=ibc.core.commitment.v1.KeyEncoding" json:"enc,omitempty"` -} - -func (m *Key) Reset() { *m = Key{} } -func (m *Key) String() string { return proto.CompactTextString(m) } -func (*Key) ProtoMessage() {} -func (*Key) Descriptor() ([]byte, []int) { - return fileDescriptor_7921d88972a41469, []int{5} -} -func (m *Key) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Key) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Key.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 *Key) XXX_Merge(src proto.Message) { - xxx_messageInfo_Key.Merge(m, src) -} -func (m *Key) XXX_Size() int { - return m.Size() -} -func (m *Key) XXX_DiscardUnknown() { - xxx_messageInfo_Key.DiscardUnknown(m) -} - -var xxx_messageInfo_Key proto.InternalMessageInfo - func init() { - proto.RegisterEnum("ibc.core.commitment.v1.KeyEncoding", KeyEncoding_name, KeyEncoding_value) proto.RegisterType((*MerkleRoot)(nil), "ibc.core.commitment.v1.MerkleRoot") proto.RegisterType((*MerklePrefix)(nil), "ibc.core.commitment.v1.MerklePrefix") proto.RegisterType((*MerklePath)(nil), "ibc.core.commitment.v1.MerklePath") proto.RegisterType((*MerkleProof)(nil), "ibc.core.commitment.v1.MerkleProof") - proto.RegisterType((*KeyPath)(nil), "ibc.core.commitment.v1.KeyPath") - proto.RegisterType((*Key)(nil), "ibc.core.commitment.v1.Key") } func init() { @@ -322,39 +215,28 @@ func init() { } var fileDescriptor_7921d88972a41469 = []byte{ - // 499 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0x4f, 0x6f, 0xd3, 0x30, - 0x18, 0xc6, 0x13, 0x5a, 0xe8, 0x70, 0x27, 0x28, 0x16, 0x7f, 0xaa, 0xc2, 0x92, 0x2a, 0x48, 0x30, - 0x90, 0x16, 0xab, 0x1d, 0x5c, 0xca, 0x05, 0x75, 0x0d, 0xac, 0xea, 0xe8, 0x2a, 0x4f, 0x45, 0x03, - 0x09, 0x55, 0x69, 0xea, 0x26, 0x51, 0x96, 0x38, 0x4a, 0xcc, 0xb4, 0x7c, 0x83, 0x89, 0x13, 0x47, - 0x2e, 0x48, 0x48, 0x7c, 0x99, 0x1d, 0x77, 0xe4, 0x54, 0xa1, 0xf6, 0x1b, 0xec, 0x13, 0x20, 0xdb, - 0x2d, 0x0b, 0x12, 0x70, 0xca, 0x6b, 0xbd, 0xbf, 0x37, 0xcf, 0xe3, 0xc7, 0x2f, 0x78, 0xec, 0x8f, - 0x1d, 0xe4, 0xd0, 0x84, 0x20, 0x87, 0x86, 0xa1, 0xcf, 0x42, 0x12, 0x31, 0x74, 0xdc, 0xc8, 0x9d, - 0xcc, 0x38, 0xa1, 0x8c, 0xc2, 0xbb, 0xfe, 0xd8, 0x31, 0x39, 0x68, 0xe6, 0x5a, 0xc7, 0x8d, 0xda, - 0x6d, 0x97, 0xba, 0x54, 0x20, 0x88, 0x57, 0x92, 0xae, 0x6d, 0x30, 0x12, 0x4d, 0x48, 0x12, 0xfa, - 0x11, 0x43, 0x4e, 0x92, 0xc5, 0x8c, 0xa2, 0x38, 0xa1, 0x74, 0x2a, 0xdb, 0xc6, 0x23, 0x00, 0xde, - 0x90, 0x24, 0x38, 0x22, 0x98, 0x52, 0x06, 0x21, 0x28, 0x7a, 0x76, 0xea, 0x55, 0xd5, 0xba, 0xba, - 0xb9, 0x8e, 0x45, 0xdd, 0x2a, 0x9e, 0x7e, 0xd3, 0x15, 0xa3, 0x03, 0xd6, 0x25, 0x37, 0x48, 0xc8, - 0xd4, 0x3f, 0x81, 0xcf, 0x00, 0x08, 0x48, 0x36, 0x8a, 0xc5, 0x49, 0xf2, 0xed, 0x3b, 0x17, 0x33, - 0xfd, 0x56, 0x66, 0x87, 0x47, 0x2d, 0xe3, 0xb2, 0x67, 0xe0, 0xeb, 0x01, 0xc9, 0xe4, 0x94, 0xe1, - 0xae, 0xd4, 0x06, 0x36, 0xf3, 0xe0, 0x01, 0x58, 0x13, 0x9c, 0xcd, 0xa4, 0x62, 0xb9, 0xa9, 0x9b, - 0x7f, 0xbf, 0x9b, 0xd9, 0x23, 0x19, 0x1f, 0x69, 0xdf, 0x3b, 0x9b, 0xe9, 0xca, 0xc5, 0x4c, 0xbf, - 0x99, 0x93, 0xb1, 0x99, 0x67, 0xe0, 0x52, 0x20, 0x89, 0x56, 0xf1, 0x0b, 0xb7, 0xfb, 0x12, 0x94, - 0x57, 0x76, 0x29, 0x9d, 0xc2, 0x06, 0xb8, 0x2a, 0x2e, 0xbd, 0x94, 0xb9, 0x6f, 0x5e, 0x86, 0x62, - 0xca, 0x50, 0x4c, 0x01, 0xee, 0xc7, 0x29, 0x96, 0xa4, 0xd1, 0x01, 0xa5, 0xa5, 0x28, 0x44, 0xa0, - 0x18, 0x90, 0x2c, 0xad, 0xaa, 0xf5, 0x82, 0x18, 0xfe, 0xb7, 0x47, 0x2c, 0xc0, 0xd6, 0x1a, 0x8f, - 0x4c, 0xf8, 0x78, 0x0b, 0x0a, 0x3d, 0x92, 0xf1, 0x5c, 0x23, 0x3b, 0x24, 0xab, 0x5c, 0x79, 0x0d, - 0x9f, 0x83, 0x02, 0x89, 0x9c, 0xea, 0x95, 0xba, 0xba, 0x79, 0xa3, 0xf9, 0xf0, 0x3f, 0x3f, 0xb5, - 0x22, 0x87, 0x4e, 0xfc, 0xc8, 0xc5, 0x9c, 0x97, 0xcf, 0xf1, 0xf4, 0x03, 0x28, 0xe7, 0x3a, 0xf0, - 0x09, 0x78, 0xd0, 0xb3, 0xde, 0x8d, 0xac, 0xfe, 0xce, 0x7e, 0xa7, 0xdb, 0x7f, 0x3d, 0x1a, 0xe2, - 0xbd, 0xd1, 0xb0, 0x7f, 0x30, 0xb0, 0x76, 0xba, 0xaf, 0xba, 0x56, 0xa7, 0xa2, 0xd4, 0x4a, 0x9f, - 0xbe, 0xd6, 0x0b, 0x43, 0xbc, 0x07, 0x37, 0x40, 0xe5, 0x0f, 0x74, 0xd7, 0x3a, 0xac, 0xa8, 0xb2, - 0xbd, 0x6b, 0x1d, 0xd6, 0x8a, 0xa7, 0xdf, 0x35, 0xa5, 0x3d, 0x3c, 0x9b, 0x6b, 0xea, 0xf9, 0x5c, - 0x53, 0x7f, 0xce, 0x35, 0xf5, 0xf3, 0x42, 0x53, 0xce, 0x17, 0x9a, 0xf2, 0x63, 0xa1, 0x29, 0xef, - 0x5f, 0xb8, 0x3e, 0xf3, 0x3e, 0x8e, 0xb9, 0x4b, 0xe4, 0xd0, 0x34, 0xa4, 0xe9, 0xf2, 0xb3, 0x95, - 0x4e, 0x02, 0x74, 0x82, 0x7e, 0x2f, 0x71, 0x73, 0x7b, 0x2b, 0xb7, 0xc7, 0x2c, 0x8b, 0x49, 0x3a, - 0xbe, 0x26, 0x76, 0x6e, 0xfb, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8a, 0x78, 0x4b, 0x97, 0xeb, - 0x02, 0x00, 0x00, + // 334 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0x91, 0xcf, 0x4e, 0xfa, 0x40, + 0x10, 0xc7, 0xdb, 0xfc, 0x08, 0x3f, 0x59, 0x48, 0x8c, 0x45, 0x89, 0xe1, 0x50, 0x4c, 0x0f, 0xca, + 0x85, 0xdd, 0x00, 0x9e, 0x30, 0x5e, 0xaa, 0x57, 0x13, 0xd2, 0xc4, 0x8b, 0x17, 0xd3, 0xae, 0x5b, + 0xba, 0x29, 0x65, 0x9a, 0xee, 0x4a, 0xe8, 0x1b, 0x78, 0xf4, 0xe8, 0xd1, 0xc7, 0xf1, 0xc8, 0xd1, + 0x13, 0x31, 0xf0, 0x06, 0x3c, 0x81, 0xe9, 0x2e, 0x60, 0x4f, 0x3b, 0xb3, 0xf3, 0x99, 0x7f, 0xdf, + 0x41, 0x57, 0x3c, 0xa0, 0x84, 0x42, 0xc6, 0x08, 0x85, 0x24, 0xe1, 0x32, 0x61, 0x33, 0x49, 0xe6, + 0xfd, 0x92, 0x87, 0xd3, 0x0c, 0x24, 0x58, 0x2d, 0x1e, 0x50, 0x5c, 0x80, 0xb8, 0x14, 0x9a, 0xf7, + 0xdb, 0xa7, 0x13, 0x98, 0x80, 0x42, 0x48, 0x61, 0x69, 0xba, 0xdd, 0xa4, 0x30, 0x0b, 0x39, 0x90, + 0x34, 0x03, 0x08, 0x85, 0xfe, 0x74, 0x2e, 0x11, 0x7a, 0x60, 0x59, 0x3c, 0x65, 0x1e, 0x80, 0xb4, + 0x2c, 0x54, 0x89, 0x7c, 0x11, 0x9d, 0x9b, 0x17, 0x66, 0xb7, 0xe1, 0x29, 0x7b, 0x54, 0x79, 0xfb, + 0xec, 0x18, 0xce, 0x3d, 0x6a, 0x68, 0x6e, 0x9c, 0xb1, 0x90, 0x2f, 0xac, 0x6b, 0x84, 0x62, 0x96, + 0x3f, 0xa7, 0xca, 0xd3, 0xbc, 0x7b, 0xb6, 0x5d, 0x75, 0x4e, 0x72, 0x3f, 0x99, 0x8e, 0x9c, 0xbf, + 0x98, 0xe3, 0xd5, 0x62, 0x96, 0xeb, 0x2c, 0xc7, 0xdd, 0x77, 0x1b, 0xfb, 0x32, 0xb2, 0x30, 0x3a, + 0x52, 0x9c, 0x2f, 0x8b, 0x8e, 0xff, 0xba, 0x35, 0xb7, 0xb9, 0x5d, 0x75, 0x8e, 0x4b, 0x15, 0x7c, + 0x19, 0x39, 0xde, 0xff, 0x22, 0xdf, 0x97, 0xd1, 0xa8, 0xf2, 0x51, 0x4c, 0x72, 0x8b, 0xea, 0xfb, + 0x49, 0x00, 0x42, 0x0b, 0xa3, 0xaa, 0x5e, 0x48, 0x95, 0xa8, 0x0f, 0x5a, 0x98, 0x53, 0x31, 0x18, + 0xe2, 0xbb, 0x83, 0x22, 0x8a, 0xf3, 0x76, 0x94, 0xfb, 0xf8, 0xb5, 0xb6, 0xcd, 0xe5, 0xda, 0x36, + 0x7f, 0xd6, 0xb6, 0xf9, 0xbe, 0xb1, 0x8d, 0xe5, 0xc6, 0x36, 0xbe, 0x37, 0xb6, 0xf1, 0x74, 0x33, + 0xe1, 0x32, 0x7a, 0x0d, 0x0a, 0x2d, 0x09, 0x05, 0x91, 0x80, 0xd8, 0x3d, 0x3d, 0xf1, 0x12, 0x93, + 0x05, 0x39, 0x5c, 0x65, 0x30, 0xec, 0x95, 0x0e, 0x23, 0xf3, 0x94, 0x89, 0xa0, 0xaa, 0xe4, 0x1c, + 0xfe, 0x06, 0x00, 0x00, 0xff, 0xff, 0x1b, 0xe7, 0x68, 0xd0, 0xbc, 0x01, 0x00, 0x00, } func (m *MerkleRoot) Marshal() (dAtA []byte, err error) { @@ -437,16 +319,15 @@ func (m *MerklePath) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - { - size, err := m.KeyPath.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err + if len(m.KeyPath) > 0 { + for iNdEx := len(m.KeyPath) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.KeyPath[iNdEx]) + copy(dAtA[i:], m.KeyPath[iNdEx]) + i = encodeVarintCommitment(dAtA, i, uint64(len(m.KeyPath[iNdEx]))) + i-- + dAtA[i] = 0xa } - i -= size - i = encodeVarintCommitment(dAtA, i, uint64(size)) } - i-- - dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -470,45 +351,10 @@ func (m *MerkleProof) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.Proof != nil { - { - size, err := m.Proof.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintCommitment(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *KeyPath) 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 *KeyPath) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *KeyPath) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Keys) > 0 { - for iNdEx := len(m.Keys) - 1; iNdEx >= 0; iNdEx-- { + if len(m.Proofs) > 0 { + for iNdEx := len(m.Proofs) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.Keys[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Proofs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -522,41 +368,6 @@ func (m *KeyPath) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *Key) 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 *Key) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Key) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Enc != 0 { - i = encodeVarintCommitment(dAtA, i, uint64(m.Enc)) - i-- - dAtA[i] = 0x10 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintCommitment(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func encodeVarintCommitment(dAtA []byte, offset int, v uint64) int { offset -= sovCommitment(v) base := offset @@ -600,8 +411,12 @@ func (m *MerklePath) Size() (n int) { } var l int _ = l - l = m.KeyPath.Size() - n += 1 + l + sovCommitment(uint64(l)) + if len(m.KeyPath) > 0 { + for _, s := range m.KeyPath { + l = len(s) + n += 1 + l + sovCommitment(uint64(l)) + } + } return n } @@ -611,21 +426,8 @@ func (m *MerkleProof) Size() (n int) { } var l int _ = l - if m.Proof != nil { - l = m.Proof.Size() - n += 1 + l + sovCommitment(uint64(l)) - } - return n -} - -func (m *KeyPath) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Keys) > 0 { - for _, e := range m.Keys { + if len(m.Proofs) > 0 { + for _, e := range m.Proofs { l = e.Size() n += 1 + l + sovCommitment(uint64(l)) } @@ -633,22 +435,6 @@ func (m *KeyPath) Size() (n int) { return n } -func (m *Key) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovCommitment(uint64(l)) - } - if m.Enc != 0 { - n += 1 + sovCommitment(uint64(m.Enc)) - } - return n -} - func sovCommitment(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -862,7 +648,7 @@ func (m *MerklePath) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field KeyPath", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowCommitment @@ -872,24 +658,23 @@ func (m *MerklePath) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthCommitment } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthCommitment } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.KeyPath.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.KeyPath = append(m.KeyPath, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex @@ -946,7 +731,7 @@ func (m *MerkleProof) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Proof", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Proofs", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -973,10 +758,8 @@ func (m *MerkleProof) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Proof == nil { - m.Proof = &crypto.ProofOps{} - } - if err := m.Proof.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Proofs = append(m.Proofs, &_go.CommitmentProof{}) + if err := m.Proofs[len(m.Proofs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -1004,199 +787,6 @@ func (m *MerkleProof) Unmarshal(dAtA []byte) error { } return nil } -func (m *KeyPath) 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 ErrIntOverflowCommitment - } - 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: KeyPath: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: KeyPath: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Keys", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCommitment - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthCommitment - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthCommitment - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Keys = append(m.Keys, &Key{}) - if err := m.Keys[len(m.Keys)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipCommitment(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthCommitment - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthCommitment - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Key) 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 ErrIntOverflowCommitment - } - 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: Key: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Key: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCommitment - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthCommitment - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthCommitment - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = append(m.Name[:0], dAtA[iNdEx:postIndex]...) - if m.Name == nil { - m.Name = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Enc", wireType) - } - m.Enc = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowCommitment - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Enc |= KeyEncoding(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipCommitment(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthCommitment - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthCommitment - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func skipCommitment(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/ibc/core/23-commitment/types/key_path.go b/x/ibc/core/23-commitment/types/key_path.go deleted file mode 100644 index 589406b90..000000000 --- a/x/ibc/core/23-commitment/types/key_path.go +++ /dev/null @@ -1,40 +0,0 @@ -package types - -import ( - fmt "fmt" - "net/url" -) - -// AppendKey appends a new key to a KeyPath -func (pth KeyPath) AppendKey(key []byte, enc KeyEncoding) KeyPath { - pth.Keys = append(pth.Keys, &Key{Name: key, Enc: enc}) - return pth -} - -// String implements the fmt.Stringer interface -func (pth *KeyPath) String() string { - res := "" - for _, key := range pth.Keys { - switch key.Enc { - case URL: - res += "/" + url.PathEscape(string(key.Name)) - case HEX: - res += "/x:" + fmt.Sprintf("%X", key.Name) - default: - panic("unexpected key encoding type") - } - } - return res -} - -// GetKey returns the bytes representation of key at given index -// Passing in a positive index return the key at index in forward order -// from the highest key to the lowest key -// Passing in a negative index will return the key at index in reverse order -// from the lowest key to the highest key. This is the order for proof verification, -// since we prove lowest key first before moving to key of higher subtrees -func (pth *KeyPath) GetKey(i int) []byte { - total := len(pth.Keys) - index := (total + i) % total - return pth.Keys[index].Name -} diff --git a/x/ibc/core/23-commitment/types/merkle.go b/x/ibc/core/23-commitment/types/merkle.go index 87a830e29..fe7d5c302 100644 --- a/x/ibc/core/23-commitment/types/merkle.go +++ b/x/ibc/core/23-commitment/types/merkle.go @@ -2,6 +2,7 @@ package types import ( "bytes" + "fmt" "net/url" ics23 "github.com/confio/ics23/go" @@ -9,7 +10,6 @@ import ( tmcrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - host "github.com/cosmos/cosmos-sdk/x/ibc/core/24-host" "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" ) @@ -68,51 +68,62 @@ func (mp MerklePrefix) Empty() bool { var _ exported.Path = (*MerklePath)(nil) // NewMerklePath creates a new MerklePath instance -func NewMerklePath(keyPathStr []string) MerklePath { - merkleKeyPath := KeyPath{} - for _, keyStr := range keyPathStr { - merkleKeyPath = merkleKeyPath.AppendKey([]byte(keyStr), URL) - } - +// The keys must be passed in from root-to-leaf order +func NewMerklePath(keyPath ...string) MerklePath { return MerklePath{ - KeyPath: merkleKeyPath, + KeyPath: keyPath, } } // String implements fmt.Stringer. +// This represents the path in the same way the tendermint KeyPath will +// represent a key path. The backslashes partition the key path into +// the respective stores they belong to. func (mp MerklePath) String() string { - return mp.KeyPath.String() + pathStr := "" + for _, k := range mp.KeyPath { + pathStr += "/" + url.PathEscape(k) + } + return pathStr } // Pretty returns the unescaped path of the URL string. +// This function will unescape any backslash within a particular store key. +// This makes the keypath more human-readable while removing information +// about the exact partitions in the key path. func (mp MerklePath) Pretty() string { - path, err := url.PathUnescape(mp.KeyPath.String()) + path, err := url.PathUnescape(mp.String()) if err != nil { panic(err) } return path } -// Empty returns true if the path is empty -func (mp MerklePath) Empty() bool { - return len(mp.KeyPath.Keys) == 0 +// GetKey will return a byte representation of the key +// after URL escaping the key element +func (mp MerklePath) GetKey(i uint64) ([]byte, error) { + if i >= uint64(len(mp.KeyPath)) { + return nil, fmt.Errorf("index out of range. %d (index) >= %d (len)", i, len(mp.KeyPath)) + } + key, err := url.PathUnescape(mp.KeyPath[i]) + if err != nil { + return nil, err + } + return []byte(key), nil } -// ApplyPrefix constructs a new commitment path from the arguments. It interprets -// the path argument in the context of the prefix argument. -// -// CONTRACT: provided path string MUST be a well formated path. See ICS24 for -// reference. -func ApplyPrefix(prefix exported.Prefix, path string) (MerklePath, error) { - err := host.PathValidator(path) - if err != nil { - return MerklePath{}, err - } +// Empty returns true if the path is empty +func (mp MerklePath) Empty() bool { + return len(mp.KeyPath) == 0 +} +// ApplyPrefix constructs a new commitment path from the arguments. It prepends the prefix key +// with the given path. +func ApplyPrefix(prefix exported.Prefix, path MerklePath) (MerklePath, error) { if prefix == nil || prefix.Empty() { return MerklePath{}, sdkerrors.Wrap(ErrInvalidPrefix, "prefix can't be empty") } - return NewMerklePath([]string{string(prefix.Bytes()), path}), nil + return NewMerklePath(append([]string{string(prefix.Bytes())}, path.KeyPath...)...), nil } var _ exported.Proof = (*MerkleProof)(nil) @@ -128,22 +139,17 @@ func (proof MerkleProof) VerifyMembership(specs []*ics23.ProofSpec, root exporte if !ok { return sdkerrors.Wrapf(ErrInvalidProof, "path %v is not of type MerklePath", path) } - if len(mpath.KeyPath.Keys) != len(specs) { + if len(mpath.KeyPath) != len(specs) { return sdkerrors.Wrapf(ErrInvalidProof, "path length %d not same as proof %d", - len(mpath.KeyPath.Keys), len(specs)) + len(mpath.KeyPath), len(specs)) } if len(value) == 0 { return sdkerrors.Wrap(ErrInvalidProof, "empty value in membership proof") } - // Convert Proof to []CommitmentProof - proofs, err := convertProofs(proof) - if err != nil { - return err - } - - // Since every proof in chain is a membership proof we can chain from index 0 - if err := verifyChainedMembershipProof(root.GetHash(), specs, proofs, mpath.KeyPath, value, 0); err != nil { + // Since every proof in chain is a membership proof we can use verifyChainedMembershipProof from index 0 + // to validate entire proof + if err := verifyChainedMembershipProof(root.GetHash(), specs, proof.Proofs, mpath, value, 0); err != nil { return err } return nil @@ -162,31 +168,37 @@ func (proof MerkleProof) VerifyNonMembership(specs []*ics23.ProofSpec, root expo if !ok { return sdkerrors.Wrapf(ErrInvalidProof, "path %v is not of type MerkleProof", path) } - if len(mpath.KeyPath.Keys) != len(specs) { + if len(mpath.KeyPath) != len(specs) { return sdkerrors.Wrapf(ErrInvalidProof, "path length %d not same as proof %d", - len(mpath.KeyPath.Keys), len(specs)) + len(mpath.KeyPath), len(specs)) } - // Convert Proof to []CommitmentProof - proofs, err := convertProofs(proof) - if err != nil { - return err - } + switch proof.Proofs[0].Proof.(type) { + case *ics23.CommitmentProof_Nonexist: + // VerifyNonMembership will verify the absence of key in lowest subtree, and then chain inclusion proofs + // of all subroots up to final root + subroot, err := proof.Proofs[0].Calculate() + if err != nil { + return sdkerrors.Wrapf(ErrInvalidProof, "could not calculate root for proof index 0, merkle tree is likely empty. %v", err) + } + key, err := mpath.GetKey(uint64(len(mpath.KeyPath) - 1)) + if err != nil { + return sdkerrors.Wrapf(ErrInvalidProof, "could not retrieve key bytes for key: %s", mpath.KeyPath[len(mpath.KeyPath)-1]) + } + if ok := ics23.VerifyNonMembership(specs[0], subroot, proof.Proofs[0], key); !ok { + return sdkerrors.Wrapf(ErrInvalidProof, "could not verify absence of key %s. Please ensure that the path is correct.", string(key)) + } - // VerifyNonMembership will verify the absence of key in lowest subtree, and then chain inclusion proofs - // of all subroots up to final root - subroot, err := proofs[0].Calculate() - if err != nil { - sdkerrors.Wrapf(ErrInvalidProof, "could not calculate root for proof index 0. %v", err) - } - key := mpath.KeyPath.GetKey(-1) - if ok := ics23.VerifyNonMembership(specs[0], subroot, proofs[0], key); !ok { - return sdkerrors.Wrapf(ErrInvalidProof, "could not verify absence of key %s", string(key)) - } - - // Verify chained membership proof starting from index 1 with value = subroot - if err := verifyChainedMembershipProof(root.GetHash(), specs, proofs, mpath.KeyPath, subroot, 1); err != nil { - return err + // Verify chained membership proof starting from index 1 with value = subroot + if err := verifyChainedMembershipProof(root.GetHash(), specs, proof.Proofs, mpath, subroot, 1); err != nil { + return err + } + case *ics23.CommitmentProof_Exist: + return sdkerrors.Wrapf(ErrInvalidProof, + "got ExistenceProof in VerifyNonMembership. If this is unexpected, please ensure that proof was queried with the correct key.") + default: + return sdkerrors.Wrapf(ErrInvalidProof, + "expected proof type: %T, got: %T", &ics23.CommitmentProof_Exist{}, proof.Proofs[0].Proof) } return nil } @@ -208,7 +220,7 @@ func (proof MerkleProof) BatchVerifyNonMembership(specs []*ics23.ProofSpec, root // The proofs and specs are passed in from lowest subtree to the highest subtree, but the keys are passed in from highest subtree to lowest. // The index specifies what index to start chaining the membership proofs, this is useful since the lowest proof may not be a membership proof, thus we // will want to start the membership proof chaining from index 1 with value being the lowest subroot -func verifyChainedMembershipProof(root []byte, specs []*ics23.ProofSpec, proofs []*ics23.CommitmentProof, keys KeyPath, value []byte, index int) error { +func verifyChainedMembershipProof(root []byte, specs []*ics23.ProofSpec, proofs []*ics23.CommitmentProof, keys MerklePath, value []byte, index int) error { var ( subroot []byte err error @@ -218,42 +230,45 @@ func verifyChainedMembershipProof(root []byte, specs []*ics23.ProofSpec, proofs // In this case, there may be no intermediate proofs to verify and we just check that lowest proof root equals final root subroot = value for i := index; i < len(proofs); i++ { - subroot, err = proofs[i].Calculate() - if err != nil { - return sdkerrors.Wrapf(ErrInvalidProof, "could not calculate proof root at index %d. %v", i, err) + switch proofs[i].Proof.(type) { + case *ics23.CommitmentProof_Exist: + subroot, err = proofs[i].Calculate() + if err != nil { + return sdkerrors.Wrapf(ErrInvalidProof, "could not calculate proof root at index %d, merkle tree may be empty. %v", i, err) + } + // Since keys are passed in from highest to lowest, we must grab their indices in reverse order + // from the proofs and specs which are lowest to highest + key, err := keys.GetKey(uint64(len(keys.KeyPath) - 1 - i)) + if err != nil { + return sdkerrors.Wrapf(ErrInvalidProof, "could not retrieve key bytes for key %s: %v", keys.KeyPath[len(keys.KeyPath)-1-i], err) + } + + // verify membership of the proof at this index with appropriate key and value + if ok := ics23.VerifyMembership(specs[i], subroot, proofs[i], key, value); !ok { + return sdkerrors.Wrapf(ErrInvalidProof, + "chained membership proof failed to verify membership of value: %X in subroot %X at index %d. Please ensure the path and value are both correct.", + value, subroot, i) + } + // Set value to subroot so that we verify next proof in chain commits to this subroot + value = subroot + case *ics23.CommitmentProof_Nonexist: + return sdkerrors.Wrapf(ErrInvalidProof, + "chained membership proof contains nonexistence proof at index %d. If this is unexpected, please ensure that proof was queried from the height that contained the value in store and was queried with the correct key.", + i) + default: + return sdkerrors.Wrapf(ErrInvalidProof, + "expected proof type: %T, got: %T", &ics23.CommitmentProof_Exist{}, proofs[i].Proof) } - // Since keys are passed in from highest to lowest, we must grab their indices in reverse order - // from the proofs and specs which are lowest to highest - key := keys.GetKey(-1 * (i + 1)) - if ok := ics23.VerifyMembership(specs[i], subroot, proofs[i], key, value); !ok { - return sdkerrors.Wrapf(ErrInvalidProof, "chained membership proof failed to verify membership of value: %X in subroot %X at index %d for proof %v", - value, subroot, i, proofs[i]) - } - // Set value to subroot so that we verify next proof in chain commits to this subroot - value = subroot } // Check that chained proof root equals passed-in root if !bytes.Equal(root, subroot) { - return sdkerrors.Wrapf(ErrInvalidProof, "proof did not commit to expected root: %X, got: %X", root, subroot) + return sdkerrors.Wrapf(ErrInvalidProof, + "proof did not commit to expected root: %X, got: %X. Please ensure proof was submitted with correct proofHeight and to the correct chain.", + root, subroot) } return nil } -// convertProofs converts a MerkleProof into []*ics23.CommitmentProof -func convertProofs(mproof MerkleProof) ([]*ics23.CommitmentProof, error) { - // Unmarshal all proof ops to CommitmentProof - proofs := make([]*ics23.CommitmentProof, len(mproof.Proof.Ops)) - for i, op := range mproof.Proof.Ops { - var p ics23.CommitmentProof - err := p.Unmarshal(op.Data) - if err != nil { - return nil, sdkerrors.Wrapf(ErrInvalidMerkleProof, "could not unmarshal proof op into CommitmentProof at index: %d", i) - } - proofs[i] = &p - } - return proofs, nil -} - // Empty returns true if the root is empty func (proof MerkleProof) Empty() bool { return proto.Equal(&proof, nil) || proto.Equal(&proof, &MerkleProof{}) || proto.Equal(&proof, &tmcrypto.ProofOps{}) @@ -277,10 +292,10 @@ func (proof MerkleProof) validateVerificationArgs(specs []*ics23.ProofSpec, root return sdkerrors.Wrap(ErrInvalidMerkleProof, "root cannot be empty") } - if len(specs) != len(proof.Proof.Ops) { + if len(specs) != len(proof.Proofs) { return sdkerrors.Wrapf(ErrInvalidMerkleProof, "length of specs: %d not equal to length of proof: %d", - len(specs), len(proof.Proof.Ops)) + len(specs), len(proof.Proofs)) } for i, spec := range specs { diff --git a/x/ibc/core/23-commitment/types/merkle_test.go b/x/ibc/core/23-commitment/types/merkle_test.go index 4da9099e8..3c53847fa 100644 --- a/x/ibc/core/23-commitment/types/merkle_test.go +++ b/x/ibc/core/23-commitment/types/merkle_test.go @@ -6,8 +6,6 @@ import ( "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" - tmcrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" - tmmerkle "github.com/tendermint/tendermint/proto/tendermint/crypto" "github.com/cosmos/cosmos-sdk/x/ibc/core/23-commitment/types" ) @@ -23,9 +21,9 @@ func (suite *MerkleTestSuite) TestVerifyMembership() { }) require.NotNil(suite.T(), res.ProofOps) - proof := types.MerkleProof{ - Proof: res.ProofOps, - } + proof, err := types.ConvertProofs(res.ProofOps) + require.NoError(suite.T(), err) + suite.Require().NoError(proof.ValidateBasic()) suite.Require().Error(types.MerkleProof{}.ValidateBasic()) @@ -49,9 +47,7 @@ func (suite *MerkleTestSuite) TestVerifyMembership() { {"nil root", []byte(nil), []string{suite.storeKey.Name(), "MYKEY"}, []byte("MYVALUE"), func() {}, false}, // invalid proof with nil root {"proof is wrong length", cid.Hash, []string{suite.storeKey.Name(), "MYKEY"}, []byte("MYVALUE"), func() { proof = types.MerkleProof{ - Proof: &tmmerkle.ProofOps{ - Ops: res.ProofOps.Ops[1:], - }, + Proofs: proof.Proofs[1:], } }, false}, // invalid proof with wrong length @@ -63,7 +59,7 @@ func (suite *MerkleTestSuite) TestVerifyMembership() { tc.malleate() root := types.NewMerkleRoot(tc.root) - path := types.NewMerklePath(tc.pathArr) + path := types.NewMerklePath(tc.pathArr...) err := proof.VerifyMembership(types.GetSDKSpecs(), &root, path, tc.value) @@ -91,9 +87,9 @@ func (suite *MerkleTestSuite) TestVerifyNonMembership() { }) require.NotNil(suite.T(), res.ProofOps) - proof := types.MerkleProof{ - Proof: res.ProofOps, - } + proof, err := types.ConvertProofs(res.ProofOps) + require.NoError(suite.T(), err) + suite.Require().NoError(proof.ValidateBasic()) cases := []struct { @@ -114,9 +110,7 @@ func (suite *MerkleTestSuite) TestVerifyNonMembership() { {"nil root", []byte(nil), []string{suite.storeKey.Name(), "MYABSENTKEY"}, func() {}, false}, // invalid proof with nil root {"proof is wrong length", cid.Hash, []string{suite.storeKey.Name(), "MYKEY"}, func() { proof = types.MerkleProof{ - Proof: &tmcrypto.ProofOps{ - Ops: res.ProofOps.Ops[1:], - }, + Proofs: proof.Proofs[1:], } }, false}, // invalid proof with wrong length @@ -129,7 +123,7 @@ func (suite *MerkleTestSuite) TestVerifyNonMembership() { tc.malleate() root := types.NewMerkleRoot(tc.root) - path := types.NewMerklePath(tc.pathArr) + path := types.NewMerklePath(tc.pathArr...) err := proof.VerifyNonMembership(types.GetSDKSpecs(), &root, path) @@ -149,16 +143,30 @@ func TestApplyPrefix(t *testing.T) { prefix := types.NewMerklePrefix([]byte("storePrefixKey")) pathStr := "pathone/pathtwo/paththree/key" + path := types.MerklePath{ + KeyPath: []string{pathStr}, + } - prefixedPath, err := types.ApplyPrefix(prefix, pathStr) - require.Nil(t, err, "valid prefix returns error") + prefixedPath, err := types.ApplyPrefix(prefix, path) + require.NoError(t, err, "valid prefix returns error") require.Equal(t, "/storePrefixKey/"+pathStr, prefixedPath.Pretty(), "Prefixed path incorrect") - require.Equal(t, "/storePrefixKey/pathone%2Fpathtwo%2Fpaththree%2Fkey", prefixedPath.String(), "Prefixed scaped path incorrect") - - // invalid prefix contains non-alphanumeric character - invalidPathStr := "invalid-path/doesitfail?/hopefully" - invalidPath, err := types.ApplyPrefix(prefix, invalidPathStr) - require.NotNil(t, err, "invalid prefix does not returns error") - require.Equal(t, types.MerklePath{}, invalidPath, "invalid prefix returns valid Path on ApplyPrefix") + require.Equal(t, "/storePrefixKey/pathone%2Fpathtwo%2Fpaththree%2Fkey", prefixedPath.String(), "Prefixed escaped path incorrect") +} + +func TestString(t *testing.T) { + path := types.NewMerklePath("rootKey", "storeKey", "path/to/leaf") + + require.Equal(t, "/rootKey/storeKey/path%2Fto%2Fleaf", path.String(), "path String returns unxpected value") + require.Equal(t, "/rootKey/storeKey/path/to/leaf", path.Pretty(), "path's pretty string representation is incorrect") + + onePath := types.NewMerklePath("path/to/leaf") + + require.Equal(t, "/path%2Fto%2Fleaf", onePath.String(), "one element path does not have correct string representation") + require.Equal(t, "/path/to/leaf", onePath.Pretty(), "one element path has incorrect pretty string representation") + + zeroPath := types.NewMerklePath() + + require.Equal(t, "", zeroPath.String(), "zero element path does not have correct string representation") + require.Equal(t, "", zeroPath.Pretty(), "zero element path does not have correct pretty string representation") } diff --git a/x/ibc/core/23-commitment/types/utils.go b/x/ibc/core/23-commitment/types/utils.go new file mode 100644 index 000000000..7d2937f0f --- /dev/null +++ b/x/ibc/core/23-commitment/types/utils.go @@ -0,0 +1,27 @@ +package types + +import ( + ics23 "github.com/confio/ics23/go" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + crypto "github.com/tendermint/tendermint/proto/tendermint/crypto" +) + +// ConvertProofs converts crypto.ProofOps into MerkleProof +func ConvertProofs(tmProof *crypto.ProofOps) (MerkleProof, error) { + if tmProof == nil { + return MerkleProof{}, sdkerrors.Wrapf(ErrInvalidMerkleProof, "tendermint proof is nil") + } + // Unmarshal all proof ops to CommitmentProof + proofs := make([]*ics23.CommitmentProof, len(tmProof.Ops)) + for i, op := range tmProof.Ops { + var p ics23.CommitmentProof + err := p.Unmarshal(op.Data) + if err != nil || p.Proof == nil { + return MerkleProof{}, sdkerrors.Wrapf(ErrInvalidMerkleProof, "could not unmarshal proof op into CommitmentProof at index %d: %v", i, err) + } + proofs[i] = &p + } + return MerkleProof{ + Proofs: proofs, + }, nil +} diff --git a/x/ibc/core/23-commitment/types/utils_test.go b/x/ibc/core/23-commitment/types/utils_test.go new file mode 100644 index 000000000..a4c08d13f --- /dev/null +++ b/x/ibc/core/23-commitment/types/utils_test.go @@ -0,0 +1,97 @@ +package types_test + +import ( + "fmt" + + "github.com/cosmos/cosmos-sdk/x/ibc/core/23-commitment/types" + "github.com/stretchr/testify/require" + abci "github.com/tendermint/tendermint/abci/types" + crypto "github.com/tendermint/tendermint/proto/tendermint/crypto" +) + +func (suite *MerkleTestSuite) TestConvertProofs() { + suite.iavlStore.Set([]byte("MYKEY"), []byte("MYVALUE")) + cid := suite.store.Commit() + + root := types.NewMerkleRoot(cid.Hash) + existsPath := types.NewMerklePath(suite.storeKey.Name(), "MYKEY") + nonexistPath := types.NewMerklePath(suite.storeKey.Name(), "NOTMYKEY") + value := []byte("MYVALUE") + + var proofOps *crypto.ProofOps + testcases := []struct { + name string + malleate func() + keyExists bool + expPass bool + }{ + { + "success for ExistenceProof", + func() { + res := suite.store.Query(abci.RequestQuery{ + Path: fmt.Sprintf("/%s/key", suite.storeKey.Name()), // required path to get key/value+proof + Data: []byte("MYKEY"), + Prove: true, + }) + require.NotNil(suite.T(), res.ProofOps) + + proofOps = res.ProofOps + }, + true, true, + }, + { + "success for NonexistenceProof", + func() { + res := suite.store.Query(abci.RequestQuery{ + Path: fmt.Sprintf("/%s/key", suite.storeKey.Name()), // required path to get key/value+proof + Data: []byte("NOTMYKEY"), + Prove: true, + }) + require.NotNil(suite.T(), res.ProofOps) + + proofOps = res.ProofOps + }, + false, true, + }, + { + "nil proofOps", + func() { + proofOps = nil + }, + true, false, + }, + { + "proof op data is nil", + func() { + res := suite.store.Query(abci.RequestQuery{ + Path: fmt.Sprintf("/%s/key", suite.storeKey.Name()), // required path to get key/value+proof + Data: []byte("MYKEY"), + Prove: true, + }) + require.NotNil(suite.T(), res.ProofOps) + + proofOps = res.ProofOps + proofOps.Ops[0].Data = nil + }, + true, false, + }, + } + + for _, tc := range testcases { + tc.malleate() + + proof, err := types.ConvertProofs(proofOps) + if tc.expPass { + suite.Require().NoError(err, "ConvertProofs unexpectedly returned error for case: %s", tc.name) + if tc.keyExists { + err := proof.VerifyMembership(types.GetSDKSpecs(), &root, existsPath, value) + suite.Require().NoError(err, "converted proof failed to verify membership for case: %s", tc.name) + } else { + err := proof.VerifyNonMembership(types.GetSDKSpecs(), &root, nonexistPath) + suite.Require().NoError(err, "converted proof failed to verify membership for case: %s", tc.name) + } + } else { + suite.Require().Error(err, "ConvertProofs passed on invalid case for case: %s", tc.name) + } + } +} diff --git a/x/ibc/core/client/query.go b/x/ibc/core/client/query.go index 273e25583..dad0c2899 100644 --- a/x/ibc/core/client/query.go +++ b/x/ibc/core/client/query.go @@ -50,8 +50,9 @@ func QueryTendermintProof(clientCtx client.Context, key []byte) ([]byte, []byte, return nil, nil, clienttypes.Height{}, err } - merkleProof := commitmenttypes.MerkleProof{ - Proof: res.ProofOps, + merkleProof, err := commitmenttypes.ConvertProofs(res.ProofOps) + if err != nil { + return nil, nil, clienttypes.Height{}, err } cdc := codec.NewProtoCodec(clientCtx.InterfaceRegistry) diff --git a/x/ibc/core/keeper/msg_server_test.go b/x/ibc/core/keeper/msg_server_test.go index 0bed10ae7..a80426724 100644 --- a/x/ibc/core/keeper/msg_server_test.go +++ b/x/ibc/core/keeper/msg_server_test.go @@ -41,6 +41,9 @@ func (suite *KeeperTestSuite) SetupTest() { suite.chainA = suite.coordinator.GetChain(ibctesting.GetChainID(0)) suite.chainB = suite.coordinator.GetChain(ibctesting.GetChainID(1)) + // commit some blocks so that QueryProof returns valid proof (cannot return valid query if height <= 1) + suite.coordinator.CommitNBlocks(suite.chainA, 2) + suite.coordinator.CommitNBlocks(suite.chainB, 2) } func TestIBCTestSuite(t *testing.T) { diff --git a/x/ibc/light-clients/06-solomachine/types/client_state.go b/x/ibc/light-clients/06-solomachine/types/client_state.go index f23b6824b..583193f3d 100644 --- a/x/ibc/light-clients/06-solomachine/types/client_state.go +++ b/x/ibc/light-clients/06-solomachine/types/client_state.go @@ -100,7 +100,7 @@ func (cs ClientState) VerifyClientState( return err } - clientPrefixedPath := "clients/" + counterpartyClientIdentifier + "/" + host.ClientStatePath() + clientPrefixedPath := commitmenttypes.NewMerklePath("clients/" + counterpartyClientIdentifier + "/" + host.ClientStatePath()) path, err := commitmenttypes.ApplyPrefix(prefix, clientPrefixedPath) if err != nil { return err @@ -138,7 +138,7 @@ func (cs ClientState) VerifyClientConsensusState( return err } - clientPrefixedPath := "clients/" + counterpartyClientIdentifier + "/" + host.ConsensusStatePath(consensusHeight) + clientPrefixedPath := commitmenttypes.NewMerklePath("clients/" + counterpartyClientIdentifier + "/" + host.ConsensusStatePath(consensusHeight)) path, err := commitmenttypes.ApplyPrefix(prefix, clientPrefixedPath) if err != nil { return err @@ -175,7 +175,8 @@ func (cs ClientState) VerifyConnectionState( return err } - path, err := commitmenttypes.ApplyPrefix(prefix, host.ConnectionPath(connectionID)) + connectionPath := commitmenttypes.NewMerklePath(host.ConnectionPath(connectionID)) + path, err := commitmenttypes.ApplyPrefix(prefix, connectionPath) if err != nil { return err } @@ -212,7 +213,8 @@ func (cs ClientState) VerifyChannelState( return err } - path, err := commitmenttypes.ApplyPrefix(prefix, host.ChannelPath(portID, channelID)) + channelPath := commitmenttypes.NewMerklePath(host.ChannelPath(portID, channelID)) + path, err := commitmenttypes.ApplyPrefix(prefix, channelPath) if err != nil { return err } @@ -250,7 +252,8 @@ func (cs ClientState) VerifyPacketCommitment( return err } - path, err := commitmenttypes.ApplyPrefix(prefix, host.PacketCommitmentPath(portID, channelID, packetSequence)) + commitmentPath := commitmenttypes.NewMerklePath(host.PacketCommitmentPath(portID, channelID, packetSequence)) + path, err := commitmenttypes.ApplyPrefix(prefix, commitmentPath) if err != nil { return err } @@ -288,7 +291,8 @@ func (cs ClientState) VerifyPacketAcknowledgement( return err } - path, err := commitmenttypes.ApplyPrefix(prefix, host.PacketAcknowledgementPath(portID, channelID, packetSequence)) + ackPath := commitmenttypes.NewMerklePath(host.PacketAcknowledgementPath(portID, channelID, packetSequence)) + path, err := commitmenttypes.ApplyPrefix(prefix, ackPath) if err != nil { return err } @@ -326,7 +330,8 @@ func (cs ClientState) VerifyPacketReceiptAbsence( return err } - path, err := commitmenttypes.ApplyPrefix(prefix, host.PacketReceiptPath(portID, channelID, packetSequence)) + receiptPath := commitmenttypes.NewMerklePath(host.PacketReceiptPath(portID, channelID, packetSequence)) + path, err := commitmenttypes.ApplyPrefix(prefix, receiptPath) if err != nil { return err } @@ -363,7 +368,8 @@ func (cs ClientState) VerifyNextSequenceRecv( return err } - path, err := commitmenttypes.ApplyPrefix(prefix, host.NextSequenceRecvPath(portID, channelID)) + nextSequenceRecvPath := commitmenttypes.NewMerklePath(host.NextSequenceRecvPath(portID, channelID)) + path, err := commitmenttypes.ApplyPrefix(prefix, nextSequenceRecvPath) if err != nil { return err } diff --git a/x/ibc/light-clients/07-tendermint/types/client_state.go b/x/ibc/light-clients/07-tendermint/types/client_state.go index 4e4104d8d..65d431245 100644 --- a/x/ibc/light-clients/07-tendermint/types/client_state.go +++ b/x/ibc/light-clients/07-tendermint/types/client_state.go @@ -180,7 +180,7 @@ func (cs ClientState) VerifyClientState( return err } - clientPrefixedPath := "clients/" + counterpartyClientIdentifier + "/" + host.ClientStatePath() + clientPrefixedPath := commitmenttypes.NewMerklePath("clients/" + counterpartyClientIdentifier + "/" + host.ClientStatePath()) path, err := commitmenttypes.ApplyPrefix(prefix, clientPrefixedPath) if err != nil { return err @@ -220,7 +220,7 @@ func (cs ClientState) VerifyClientConsensusState( return err } - clientPrefixedPath := "clients/" + counterpartyClientIdentifier + "/" + host.ConsensusStatePath(consensusHeight) + clientPrefixedPath := commitmenttypes.NewMerklePath("clients/" + counterpartyClientIdentifier + "/" + host.ConsensusStatePath(consensusHeight)) path, err := commitmenttypes.ApplyPrefix(prefix, clientPrefixedPath) if err != nil { return err @@ -263,7 +263,8 @@ func (cs ClientState) VerifyConnectionState( return err } - path, err := commitmenttypes.ApplyPrefix(prefix, host.ConnectionPath(connectionID)) + connectionPath := commitmenttypes.NewMerklePath(host.ConnectionPath(connectionID)) + path, err := commitmenttypes.ApplyPrefix(prefix, connectionPath) if err != nil { return err } @@ -302,7 +303,8 @@ func (cs ClientState) VerifyChannelState( return err } - path, err := commitmenttypes.ApplyPrefix(prefix, host.ChannelPath(portID, channelID)) + channelPath := commitmenttypes.NewMerklePath(host.ChannelPath(portID, channelID)) + path, err := commitmenttypes.ApplyPrefix(prefix, channelPath) if err != nil { return err } @@ -342,7 +344,8 @@ func (cs ClientState) VerifyPacketCommitment( return err } - path, err := commitmenttypes.ApplyPrefix(prefix, host.PacketCommitmentPath(portID, channelID, sequence)) + commitmentPath := commitmenttypes.NewMerklePath(host.PacketCommitmentPath(portID, channelID, sequence)) + path, err := commitmenttypes.ApplyPrefix(prefix, commitmentPath) if err != nil { return err } @@ -372,7 +375,8 @@ func (cs ClientState) VerifyPacketAcknowledgement( return err } - path, err := commitmenttypes.ApplyPrefix(prefix, host.PacketAcknowledgementPath(portID, channelID, sequence)) + ackPath := commitmenttypes.NewMerklePath(host.PacketAcknowledgementPath(portID, channelID, sequence)) + path, err := commitmenttypes.ApplyPrefix(prefix, ackPath) if err != nil { return err } @@ -402,7 +406,8 @@ func (cs ClientState) VerifyPacketReceiptAbsence( return err } - path, err := commitmenttypes.ApplyPrefix(prefix, host.PacketReceiptPath(portID, channelID, sequence)) + receiptPath := commitmenttypes.NewMerklePath(host.PacketReceiptPath(portID, channelID, sequence)) + path, err := commitmenttypes.ApplyPrefix(prefix, receiptPath) if err != nil { return err } @@ -431,7 +436,8 @@ func (cs ClientState) VerifyNextSequenceRecv( return err } - path, err := commitmenttypes.ApplyPrefix(prefix, host.NextSequenceRecvPath(portID, channelID)) + nextSequenceRecvPath := commitmenttypes.NewMerklePath(host.NextSequenceRecvPath(portID, channelID)) + path, err := commitmenttypes.ApplyPrefix(prefix, nextSequenceRecvPath) if err != nil { return err } diff --git a/x/ibc/light-clients/07-tendermint/types/tendermint_test.go b/x/ibc/light-clients/07-tendermint/types/tendermint_test.go index 171d33f56..c30a784a5 100644 --- a/x/ibc/light-clients/07-tendermint/types/tendermint_test.go +++ b/x/ibc/light-clients/07-tendermint/types/tendermint_test.go @@ -60,6 +60,9 @@ func (suite *TendermintTestSuite) SetupTest() { suite.coordinator = ibctesting.NewCoordinator(suite.T(), 2) suite.chainA = suite.coordinator.GetChain(ibctesting.GetChainID(0)) suite.chainB = suite.coordinator.GetChain(ibctesting.GetChainID(1)) + // commit some blocks so that QueryProof returns valid proof (cannot return valid query if height <= 1) + suite.coordinator.CommitNBlocks(suite.chainA, 2) + suite.coordinator.CommitNBlocks(suite.chainB, 2) // TODO: deprecate usage in favor of testing package checkTx := false diff --git a/x/ibc/light-clients/07-tendermint/types/upgrade.go b/x/ibc/light-clients/07-tendermint/types/upgrade.go index 3c096f94a..28f02950d 100644 --- a/x/ibc/light-clients/07-tendermint/types/upgrade.go +++ b/x/ibc/light-clients/07-tendermint/types/upgrade.go @@ -117,5 +117,5 @@ func constructUpgradeMerklePath(upgradePath string, upgradeHeight exported.Heigh // append upgradeHeight to last key in merkle path // this will create the IAVL key that is used to store client in upgrade store upgradeKeys[len(upgradeKeys)-1] = fmt.Sprintf("%s/%d", lastKey, upgradeHeight.GetVersionHeight()) - return commitmenttypes.NewMerklePath(upgradeKeys), nil + return commitmenttypes.NewMerklePath(upgradeKeys...), nil } diff --git a/x/ibc/testing/chain.go b/x/ibc/testing/chain.go index c29c111e8..f43c4d267 100644 --- a/x/ibc/testing/chain.go +++ b/x/ibc/testing/chain.go @@ -197,9 +197,8 @@ func (chain *TestChain) QueryProof(key []byte) ([]byte, clienttypes.Height) { Prove: true, }) - merkleProof := commitmenttypes.MerkleProof{ - Proof: res.ProofOps, - } + merkleProof, err := commitmenttypes.ConvertProofs(res.ProofOps) + require.NoError(chain.t, err) proof, err := chain.App.AppCodec().MarshalBinaryBare(&merkleProof) require.NoError(chain.t, err) @@ -222,9 +221,8 @@ func (chain *TestChain) QueryUpgradeProof(key []byte, height uint64) ([]byte, cl Prove: true, }) - merkleProof := commitmenttypes.MerkleProof{ - Proof: res.ProofOps, - } + merkleProof, err := commitmenttypes.ConvertProofs(res.ProofOps) + require.NoError(chain.t, err) proof, err := chain.App.AppCodec().MarshalBinaryBare(&merkleProof) require.NoError(chain.t, err) diff --git a/x/ibc/testing/solomachine.go b/x/ibc/testing/solomachine.go index 6b2508f30..0d3b35811 100644 --- a/x/ibc/testing/solomachine.go +++ b/x/ibc/testing/solomachine.go @@ -251,7 +251,7 @@ func (solo *Solomachine) GenerateSignature(signBytes []byte) []byte { // GetClientStatePath returns the commitment path for the client state. func (solo *Solomachine) GetClientStatePath(counterpartyClientIdentifier string) commitmenttypes.MerklePath { - clientPrefixedPath := "clients/" + counterpartyClientIdentifier + "/" + host.ClientStatePath() + clientPrefixedPath := commitmenttypes.NewMerklePath("clients/" + counterpartyClientIdentifier + "/" + host.ClientStatePath()) path, err := commitmenttypes.ApplyPrefix(prefix, clientPrefixedPath) require.NoError(solo.t, err) @@ -260,7 +260,7 @@ func (solo *Solomachine) GetClientStatePath(counterpartyClientIdentifier string) // GetConsensusStatePath returns the commitment path for the consensus state. func (solo *Solomachine) GetConsensusStatePath(counterpartyClientIdentifier string, consensusHeight exported.Height) commitmenttypes.MerklePath { - clientPrefixedPath := "clients/" + counterpartyClientIdentifier + "/" + host.ConsensusStatePath(consensusHeight) + clientPrefixedPath := commitmenttypes.NewMerklePath("clients/" + counterpartyClientIdentifier + "/" + host.ConsensusStatePath(consensusHeight)) path, err := commitmenttypes.ApplyPrefix(prefix, clientPrefixedPath) require.NoError(solo.t, err) @@ -269,7 +269,8 @@ func (solo *Solomachine) GetConsensusStatePath(counterpartyClientIdentifier stri // GetConnectionStatePath returns the commitment path for the connection state. func (solo *Solomachine) GetConnectionStatePath(connID string) commitmenttypes.MerklePath { - path, err := commitmenttypes.ApplyPrefix(prefix, host.ConnectionPath(connID)) + connectionPath := commitmenttypes.NewMerklePath(host.ConnectionPath(connID)) + path, err := commitmenttypes.ApplyPrefix(prefix, connectionPath) require.NoError(solo.t, err) return path @@ -277,7 +278,8 @@ func (solo *Solomachine) GetConnectionStatePath(connID string) commitmenttypes.M // GetChannelStatePath returns the commitment path for that channel state. func (solo *Solomachine) GetChannelStatePath(portID, channelID string) commitmenttypes.MerklePath { - path, err := commitmenttypes.ApplyPrefix(prefix, host.ChannelPath(portID, channelID)) + channelPath := commitmenttypes.NewMerklePath(host.ChannelPath(portID, channelID)) + path, err := commitmenttypes.ApplyPrefix(prefix, channelPath) require.NoError(solo.t, err) return path @@ -285,7 +287,8 @@ func (solo *Solomachine) GetChannelStatePath(portID, channelID string) commitmen // GetPacketCommitmentPath returns the commitment path for a packet commitment. func (solo *Solomachine) GetPacketCommitmentPath(portID, channelID string) commitmenttypes.MerklePath { - path, err := commitmenttypes.ApplyPrefix(prefix, host.PacketCommitmentPath(portID, channelID, solo.Sequence)) + commitmentPath := commitmenttypes.NewMerklePath(host.PacketCommitmentPath(portID, channelID, solo.Sequence)) + path, err := commitmenttypes.ApplyPrefix(prefix, commitmentPath) require.NoError(solo.t, err) return path @@ -293,7 +296,8 @@ func (solo *Solomachine) GetPacketCommitmentPath(portID, channelID string) commi // GetPacketAcknowledgementPath returns the commitment path for a packet acknowledgement. func (solo *Solomachine) GetPacketAcknowledgementPath(portID, channelID string) commitmenttypes.MerklePath { - path, err := commitmenttypes.ApplyPrefix(prefix, host.PacketAcknowledgementPath(portID, channelID, solo.Sequence)) + ackPath := commitmenttypes.NewMerklePath(host.PacketAcknowledgementPath(portID, channelID, solo.Sequence)) + path, err := commitmenttypes.ApplyPrefix(prefix, ackPath) require.NoError(solo.t, err) return path @@ -302,7 +306,8 @@ func (solo *Solomachine) GetPacketAcknowledgementPath(portID, channelID string) // GetPacketReceiptPath returns the commitment path for a packet receipt // and an absent receipts. func (solo *Solomachine) GetPacketReceiptPath(portID, channelID string) commitmenttypes.MerklePath { - path, err := commitmenttypes.ApplyPrefix(prefix, host.PacketReceiptPath(portID, channelID, solo.Sequence)) + receiptPath := commitmenttypes.NewMerklePath(host.PacketReceiptPath(portID, channelID, solo.Sequence)) + path, err := commitmenttypes.ApplyPrefix(prefix, receiptPath) require.NoError(solo.t, err) return path @@ -310,7 +315,8 @@ func (solo *Solomachine) GetPacketReceiptPath(portID, channelID string) commitme // GetNextSequenceRecvPath returns the commitment path for the next sequence recv counter. func (solo *Solomachine) GetNextSequenceRecvPath(portID, channelID string) commitmenttypes.MerklePath { - path, err := commitmenttypes.ApplyPrefix(prefix, host.NextSequenceRecvPath(portID, channelID)) + nextSequenceRecvPath := commitmenttypes.NewMerklePath(host.NextSequenceRecvPath(portID, channelID)) + path, err := commitmenttypes.ApplyPrefix(prefix, nextSequenceRecvPath) require.NoError(solo.t, err) return path diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 865953c9d..102fcea42 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -1216,606 +1216,608 @@ 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{ - // 9578 bytes of a gzipped FileDescriptorSet + // 9603 bytes of a gzipped FileDescriptorSet 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xd7, 0x71, 0xd8, 0xcd, 0x7e, 0x00, 0xbb, 0x8d, 0x05, 0xb0, 0x78, 0xc0, 0xdd, 0xed, 0x2d, 0x8f, 0x00, 0x38, 0xfc, 0x3a, 0x1e, 0x49, 0x80, 0x3c, 0xf2, 0x8e, 0xe4, 0x9e, 0x44, 0x1a, 0x0b, 0xec, 0xe1, 0xc0, 0xc3, 0x17, 0x07, 0xc0, 0x91, 0xfa, 0x70, 0xb6, 0x06, 0xb3, 0x0f, 0x8b, 0x21, 0x76, 0x67, - 0x86, 0x33, 0xb3, 0x77, 0x07, 0x4a, 0xaa, 0xa2, 0x25, 0x45, 0x91, 0xe8, 0x38, 0x92, 0x2c, 0x97, - 0x23, 0x51, 0x3a, 0x45, 0xb2, 0x9c, 0xc8, 0x91, 0x95, 0xf8, 0x43, 0x8a, 0x12, 0x27, 0xa9, 0x8a, - 0x9c, 0x8a, 0x63, 0x49, 0xa9, 0xb8, 0xa4, 0x8a, 0x2b, 0x71, 0x5c, 0xc9, 0xd9, 0xa1, 0x54, 0x0e, - 0xa3, 0x28, 0xb1, 0x7c, 0x96, 0x13, 0xa7, 0x54, 0xa9, 0xa4, 0xde, 0xd7, 0x7c, 0xed, 0xc7, 0x2c, - 0xa0, 0x3b, 0x49, 0x8e, 0xf3, 0x0b, 0xfb, 0x7a, 0xba, 0xfb, 0x75, 0xf7, 0xeb, 0xd7, 0xaf, 0x5f, - 0xcf, 0x7b, 0x03, 0xf8, 0xf8, 0x79, 0x98, 0xae, 0x9b, 0x66, 0xbd, 0x81, 0x67, 0x2d, 0xdb, 0x74, - 0xcd, 0xed, 0xd6, 0xce, 0x6c, 0x0d, 0x3b, 0x9a, 0xad, 0x5b, 0xae, 0x69, 0xcf, 0x50, 0x18, 0x1a, - 0x65, 0x18, 0x33, 0x02, 0x43, 0x5e, 0x81, 0xb1, 0x0b, 0x7a, 0x03, 0x2f, 0x78, 0x88, 0x1b, 0xd8, - 0x45, 0x4f, 0x42, 0x6a, 0x47, 0x6f, 0xe0, 0x82, 0x34, 0x9d, 0x3c, 0x35, 0x74, 0xe6, 0x9e, 0x99, - 0x08, 0xd1, 0x4c, 0x98, 0x62, 0x9d, 0x80, 0x15, 0x4a, 0x21, 0x7f, 0x2b, 0x05, 0xe3, 0x1d, 0x9e, + 0x86, 0x33, 0xb3, 0x77, 0x07, 0x4a, 0xaa, 0xa2, 0x25, 0x45, 0x91, 0xe8, 0x38, 0x92, 0x22, 0x97, + 0x23, 0xd1, 0x3a, 0x45, 0xb2, 0x9c, 0xc8, 0x91, 0x95, 0xf8, 0x43, 0x8a, 0x12, 0x27, 0xa9, 0x8a, + 0x94, 0xc4, 0xb1, 0xa4, 0x54, 0x5c, 0x52, 0xc5, 0x95, 0x38, 0xae, 0xe4, 0xec, 0x50, 0x2a, 0x87, + 0x51, 0x94, 0x58, 0x3e, 0xcb, 0x89, 0x53, 0xaa, 0x54, 0x52, 0xef, 0x6b, 0xbe, 0xf6, 0x63, 0x16, + 0xd0, 0x9d, 0x24, 0xc7, 0xf9, 0x85, 0x9d, 0x7e, 0xdd, 0xfd, 0xba, 0xfb, 0xf5, 0xeb, 0xd7, 0xaf, + 0xe7, 0xbd, 0x01, 0xfc, 0xf3, 0xf3, 0x30, 0x5d, 0x37, 0xcd, 0x7a, 0x03, 0xcf, 0x5a, 0xb6, 0xe9, + 0x9a, 0xdb, 0xad, 0x9d, 0xd9, 0x1a, 0x76, 0x34, 0x5b, 0xb7, 0x5c, 0xd3, 0x9e, 0xa1, 0x30, 0x34, + 0xca, 0x30, 0x66, 0x04, 0x86, 0xbc, 0x02, 0x63, 0x17, 0xf4, 0x06, 0x5e, 0xf0, 0x10, 0x37, 0xb0, + 0x8b, 0x9e, 0x84, 0xd4, 0x8e, 0xde, 0xc0, 0x05, 0x69, 0x3a, 0x79, 0x6a, 0xe8, 0xcc, 0x3d, 0x33, + 0x11, 0xa2, 0x99, 0x30, 0xc5, 0x3a, 0x01, 0x2b, 0x94, 0x42, 0xfe, 0x56, 0x0a, 0xc6, 0x3b, 0xb4, 0x22, 0x04, 0x29, 0x43, 0x6d, 0x12, 0x8e, 0xd2, 0xa9, 0xac, 0x42, 0x7f, 0xa3, 0x02, 0x0c, 0x5a, - 0xaa, 0xb6, 0xa7, 0xd6, 0x71, 0x21, 0x41, 0xc1, 0xa2, 0x89, 0x26, 0x01, 0x6a, 0xd8, 0xc2, 0x46, - 0x0d, 0x1b, 0xda, 0x7e, 0x21, 0x39, 0x9d, 0x3c, 0x95, 0x55, 0x02, 0x10, 0xf4, 0x20, 0x8c, 0x59, - 0xad, 0xed, 0x86, 0xae, 0x55, 0x03, 0x68, 0x30, 0x9d, 0x3c, 0x95, 0x56, 0xf2, 0xec, 0xc1, 0x82, + 0xaa, 0xb6, 0xa7, 0xd6, 0x71, 0x21, 0x41, 0xc1, 0xe2, 0x11, 0x4d, 0x02, 0xd4, 0xb0, 0x85, 0x8d, + 0x1a, 0x36, 0xb4, 0xfd, 0x42, 0x72, 0x3a, 0x79, 0x2a, 0xab, 0x04, 0x20, 0xe8, 0x41, 0x18, 0xb3, + 0x5a, 0xdb, 0x0d, 0x5d, 0xab, 0x06, 0xd0, 0x60, 0x3a, 0x79, 0x2a, 0xad, 0xe4, 0x59, 0xc3, 0x82, 0x8f, 0x7c, 0x3f, 0x8c, 0x5e, 0xc5, 0xea, 0x5e, 0x10, 0x75, 0x88, 0xa2, 0x8e, 0x10, 0x70, 0x00, 0x71, 0x1e, 0x72, 0x4d, 0xec, 0x38, 0x6a, 0x1d, 0x57, 0xdd, 0x7d, 0x0b, 0x17, 0x52, 0x54, 0xfb, 0xe9, 0x36, 0xed, 0xa3, 0x9a, 0x0f, 0x71, 0xaa, 0xcd, 0x7d, 0x0b, 0xa3, 0x39, 0xc8, 0x62, 0xa3, 0xd5, 0x64, 0x1c, 0xd2, 0x5d, 0xec, 0x57, 0x31, 0x5a, 0xcd, 0x28, 0x97, 0x0c, 0x21, 0xe3, 0x2c, - 0x06, 0x1d, 0x6c, 0x5f, 0xd1, 0x35, 0x5c, 0x18, 0xa0, 0x0c, 0xee, 0x6f, 0x63, 0xb0, 0xc1, 0x9e, - 0x47, 0x79, 0x08, 0x3a, 0x34, 0x0f, 0x59, 0x7c, 0xcd, 0xc5, 0x86, 0xa3, 0x9b, 0x46, 0x61, 0x90, - 0x32, 0xb9, 0xb7, 0xc3, 0x28, 0xe2, 0x46, 0x2d, 0xca, 0xc2, 0xa7, 0x43, 0xe7, 0x60, 0xd0, 0xb4, - 0x5c, 0xdd, 0x34, 0x9c, 0x42, 0x66, 0x5a, 0x3a, 0x35, 0x74, 0xe6, 0x64, 0x47, 0x47, 0x58, 0x63, - 0x38, 0x8a, 0x40, 0x46, 0x4b, 0x90, 0x77, 0xcc, 0x96, 0xad, 0xe1, 0xaa, 0x66, 0xd6, 0x70, 0x55, - 0x37, 0x76, 0xcc, 0x42, 0x96, 0x32, 0x98, 0x6a, 0x57, 0x84, 0x22, 0xce, 0x9b, 0x35, 0xbc, 0x64, - 0xec, 0x98, 0xca, 0x88, 0x13, 0x6a, 0xa3, 0x63, 0x30, 0xe0, 0xec, 0x1b, 0xae, 0x7a, 0xad, 0x90, - 0xa3, 0x1e, 0xc2, 0x5b, 0xf2, 0x6f, 0x0c, 0xc0, 0x68, 0x3f, 0x2e, 0x76, 0x1e, 0xd2, 0x3b, 0x44, - 0xcb, 0x42, 0xe2, 0x20, 0x36, 0x60, 0x34, 0x61, 0x23, 0x0e, 0x1c, 0xd2, 0x88, 0x73, 0x30, 0x64, - 0x60, 0xc7, 0xc5, 0x35, 0xe6, 0x11, 0xc9, 0x3e, 0x7d, 0x0a, 0x18, 0x51, 0xbb, 0x4b, 0xa5, 0x0e, - 0xe5, 0x52, 0x2f, 0xc0, 0xa8, 0x27, 0x52, 0xd5, 0x56, 0x8d, 0xba, 0xf0, 0xcd, 0xd9, 0x38, 0x49, - 0x66, 0x2a, 0x82, 0x4e, 0x21, 0x64, 0xca, 0x08, 0x0e, 0xb5, 0xd1, 0x02, 0x80, 0x69, 0x60, 0x73, - 0xa7, 0x5a, 0xc3, 0x5a, 0xa3, 0x90, 0xe9, 0x62, 0xa5, 0x35, 0x82, 0xd2, 0x66, 0x25, 0x93, 0x41, - 0xb5, 0x06, 0x7a, 0xca, 0x77, 0xb5, 0xc1, 0x2e, 0x9e, 0xb2, 0xc2, 0x26, 0x59, 0x9b, 0xb7, 0x6d, - 0xc1, 0x88, 0x8d, 0x89, 0xdf, 0xe3, 0x1a, 0xd7, 0x2c, 0x4b, 0x85, 0x98, 0x89, 0xd5, 0x4c, 0xe1, - 0x64, 0x4c, 0xb1, 0x61, 0x3b, 0xd8, 0x44, 0x77, 0x83, 0x07, 0xa8, 0x52, 0xb7, 0x02, 0x1a, 0x85, - 0x72, 0x02, 0xb8, 0xaa, 0x36, 0x71, 0xf1, 0x65, 0x18, 0x09, 0x9b, 0x07, 0x4d, 0x40, 0xda, 0x71, - 0x55, 0xdb, 0xa5, 0x5e, 0x98, 0x56, 0x58, 0x03, 0xe5, 0x21, 0x89, 0x8d, 0x1a, 0x8d, 0x72, 0x69, - 0x85, 0xfc, 0x44, 0x3f, 0xe1, 0x2b, 0x9c, 0xa4, 0x0a, 0xdf, 0xd7, 0x3e, 0xa2, 0x21, 0xce, 0x51, - 0xbd, 0x8b, 0x4f, 0xc0, 0x70, 0x48, 0x81, 0x7e, 0xbb, 0x96, 0xdf, 0x09, 0x47, 0x3b, 0xb2, 0x46, - 0x2f, 0xc0, 0x44, 0xcb, 0xd0, 0x0d, 0x17, 0xdb, 0x96, 0x8d, 0x89, 0xc7, 0xb2, 0xae, 0x0a, 0xff, - 0x79, 0xb0, 0x8b, 0xcf, 0x6d, 0x05, 0xb1, 0x19, 0x17, 0x65, 0xbc, 0xd5, 0x0e, 0x3c, 0x9d, 0xcd, - 0xbc, 0x31, 0x98, 0x7f, 0xe5, 0x95, 0x57, 0x5e, 0x49, 0xc8, 0x1f, 0x1d, 0x80, 0x89, 0x4e, 0x73, - 0xa6, 0xe3, 0xf4, 0x3d, 0x06, 0x03, 0x46, 0xab, 0xb9, 0x8d, 0x6d, 0x6a, 0xa4, 0xb4, 0xc2, 0x5b, - 0x68, 0x0e, 0xd2, 0x0d, 0x75, 0x1b, 0x37, 0x0a, 0xa9, 0x69, 0xe9, 0xd4, 0xc8, 0x99, 0x07, 0xfb, - 0x9a, 0x95, 0x33, 0xcb, 0x84, 0x44, 0x61, 0x94, 0xe8, 0x69, 0x48, 0xf1, 0x10, 0x4d, 0x38, 0x9c, - 0xee, 0x8f, 0x03, 0x99, 0x4b, 0x0a, 0xa5, 0x43, 0x77, 0x40, 0x96, 0xfc, 0x65, 0xbe, 0x31, 0x40, - 0x65, 0xce, 0x10, 0x00, 0xf1, 0x0b, 0x54, 0x84, 0x0c, 0x9d, 0x26, 0x35, 0x2c, 0x96, 0x36, 0xaf, - 0x4d, 0x1c, 0xab, 0x86, 0x77, 0xd4, 0x56, 0xc3, 0xad, 0x5e, 0x51, 0x1b, 0x2d, 0x4c, 0x1d, 0x3e, - 0xab, 0xe4, 0x38, 0xf0, 0x32, 0x81, 0xa1, 0x29, 0x18, 0x62, 0xb3, 0x4a, 0x37, 0x6a, 0xf8, 0x1a, - 0x8d, 0x9e, 0x69, 0x85, 0x4d, 0xb4, 0x25, 0x02, 0x21, 0xdd, 0xbf, 0xe8, 0x98, 0x86, 0x70, 0x4d, - 0xda, 0x05, 0x01, 0xd0, 0xee, 0x9f, 0x88, 0x06, 0xee, 0x3b, 0x3b, 0xab, 0x17, 0xf5, 0x29, 0xf9, - 0x4b, 0x09, 0x48, 0xd1, 0x78, 0x31, 0x0a, 0x43, 0x9b, 0x6f, 0x59, 0xaf, 0x54, 0x17, 0xd6, 0xb6, - 0xca, 0xcb, 0x95, 0xbc, 0x84, 0x46, 0x00, 0x28, 0xe0, 0xc2, 0xf2, 0xda, 0xdc, 0x66, 0x3e, 0xe1, - 0xb5, 0x97, 0x56, 0x37, 0xcf, 0x3d, 0x9e, 0x4f, 0x7a, 0x04, 0x5b, 0x0c, 0x90, 0x0a, 0x22, 0x3c, - 0x76, 0x26, 0x9f, 0x46, 0x79, 0xc8, 0x31, 0x06, 0x4b, 0x2f, 0x54, 0x16, 0xce, 0x3d, 0x9e, 0x1f, - 0x08, 0x43, 0x1e, 0x3b, 0x93, 0x1f, 0x44, 0xc3, 0x90, 0xa5, 0x90, 0xf2, 0xda, 0xda, 0x72, 0x3e, - 0xe3, 0xf1, 0xdc, 0xd8, 0x54, 0x96, 0x56, 0x17, 0xf3, 0x59, 0x8f, 0xe7, 0xa2, 0xb2, 0xb6, 0xb5, - 0x9e, 0x07, 0x8f, 0xc3, 0x4a, 0x65, 0x63, 0x63, 0x6e, 0xb1, 0x92, 0x1f, 0xf2, 0x30, 0xca, 0x6f, - 0xd9, 0xac, 0x6c, 0xe4, 0x73, 0x21, 0xb1, 0x1e, 0x3b, 0x93, 0x1f, 0xf6, 0xba, 0xa8, 0xac, 0x6e, - 0xad, 0xe4, 0x47, 0xd0, 0x18, 0x0c, 0xb3, 0x2e, 0x84, 0x10, 0xa3, 0x11, 0xd0, 0xb9, 0xc7, 0xf3, - 0x79, 0x5f, 0x10, 0xc6, 0x65, 0x2c, 0x04, 0x38, 0xf7, 0x78, 0x1e, 0xc9, 0xf3, 0x90, 0xa6, 0xde, - 0x85, 0x10, 0x8c, 0x2c, 0xcf, 0x95, 0x2b, 0xcb, 0xd5, 0xb5, 0xf5, 0xcd, 0xa5, 0xb5, 0xd5, 0xb9, - 0xe5, 0xbc, 0xe4, 0xc3, 0x94, 0xca, 0x73, 0x5b, 0x4b, 0x4a, 0x65, 0x21, 0x9f, 0x08, 0xc2, 0xd6, - 0x2b, 0x73, 0x9b, 0x95, 0x85, 0x7c, 0x52, 0xd6, 0x60, 0xa2, 0x53, 0x9c, 0xec, 0x38, 0x33, 0x02, - 0x43, 0x9c, 0xe8, 0x32, 0xc4, 0x94, 0x57, 0xdb, 0x10, 0x7f, 0x33, 0x01, 0xe3, 0x1d, 0xd6, 0x8a, - 0x8e, 0x9d, 0x3c, 0x03, 0x69, 0xe6, 0xa2, 0x6c, 0xf5, 0x7c, 0xa0, 0xe3, 0xa2, 0x43, 0x1d, 0xb6, - 0x6d, 0x05, 0xa5, 0x74, 0xc1, 0x0c, 0x22, 0xd9, 0x25, 0x83, 0x20, 0x2c, 0xda, 0x62, 0xfa, 0x4f, - 0xb6, 0xc5, 0x74, 0xb6, 0xec, 0x9d, 0xeb, 0x67, 0xd9, 0xa3, 0xb0, 0x83, 0xc5, 0xf6, 0x74, 0x87, - 0xd8, 0x7e, 0x1e, 0xc6, 0xda, 0x18, 0xf5, 0x1d, 0x63, 0xdf, 0x23, 0x41, 0xa1, 0x9b, 0x71, 0x62, - 0x22, 0x5d, 0x22, 0x14, 0xe9, 0xce, 0x47, 0x2d, 0x78, 0x57, 0xf7, 0x41, 0x68, 0x1b, 0xeb, 0xcf, - 0x4a, 0x70, 0xac, 0x73, 0xa6, 0xd8, 0x51, 0x86, 0xa7, 0x61, 0xa0, 0x89, 0xdd, 0x5d, 0x53, 0x64, - 0x4b, 0xf7, 0x75, 0x58, 0x83, 0xc9, 0xe3, 0xe8, 0x60, 0x73, 0xaa, 0xe0, 0x22, 0x9e, 0xec, 0x96, - 0xee, 0x31, 0x69, 0xda, 0x24, 0xfd, 0x40, 0x02, 0x8e, 0x76, 0x64, 0xde, 0x51, 0xd0, 0x3b, 0x01, - 0x74, 0xc3, 0x6a, 0xb9, 0x2c, 0x23, 0x62, 0x01, 0x36, 0x4b, 0x21, 0x34, 0x78, 0x91, 0xe0, 0xd9, - 0x72, 0xbd, 0xe7, 0x49, 0xfa, 0x1c, 0x18, 0x88, 0x22, 0x3c, 0xe9, 0x0b, 0x9a, 0xa2, 0x82, 0x4e, - 0x76, 0xd1, 0xb4, 0xcd, 0x31, 0x1f, 0x81, 0xbc, 0xd6, 0xd0, 0xb1, 0xe1, 0x56, 0x1d, 0xd7, 0xc6, - 0x6a, 0x53, 0x37, 0xea, 0x74, 0x05, 0xc9, 0x94, 0xd2, 0x3b, 0x6a, 0xc3, 0xc1, 0xca, 0x28, 0x7b, - 0xbc, 0x21, 0x9e, 0x12, 0x0a, 0xea, 0x40, 0x76, 0x80, 0x62, 0x20, 0x44, 0xc1, 0x1e, 0x7b, 0x14, - 0xf2, 0xcf, 0x66, 0x61, 0x28, 0x90, 0x57, 0xa3, 0xbb, 0x20, 0xf7, 0xa2, 0x7a, 0x45, 0xad, 0x8a, - 0xbd, 0x12, 0xb3, 0xc4, 0x10, 0x81, 0xad, 0xf3, 0xfd, 0xd2, 0x23, 0x30, 0x41, 0x51, 0xcc, 0x96, - 0x8b, 0xed, 0xaa, 0xd6, 0x50, 0x1d, 0x87, 0x1a, 0x2d, 0x43, 0x51, 0x11, 0x79, 0xb6, 0x46, 0x1e, - 0xcd, 0x8b, 0x27, 0xe8, 0x2c, 0x8c, 0x53, 0x8a, 0x66, 0xab, 0xe1, 0xea, 0x56, 0x03, 0x57, 0xc9, - 0xee, 0xcd, 0xa1, 0x2b, 0x89, 0x27, 0xd9, 0x18, 0xc1, 0x58, 0xe1, 0x08, 0x44, 0x22, 0x07, 0x2d, - 0xc0, 0x9d, 0x94, 0xac, 0x8e, 0x0d, 0x6c, 0xab, 0x2e, 0xae, 0xe2, 0x97, 0x5a, 0x6a, 0xc3, 0xa9, - 0xaa, 0x46, 0xad, 0xba, 0xab, 0x3a, 0xbb, 0x85, 0x09, 0xc2, 0xa0, 0x9c, 0x28, 0x48, 0xca, 0x09, - 0x82, 0xb8, 0xc8, 0xf1, 0x2a, 0x14, 0x6d, 0xce, 0xa8, 0x5d, 0x54, 0x9d, 0x5d, 0x54, 0x82, 0x63, - 0x94, 0x8b, 0xe3, 0xda, 0xba, 0x51, 0xaf, 0x6a, 0xbb, 0x58, 0xdb, 0xab, 0xb6, 0xdc, 0x9d, 0x27, - 0x0b, 0x77, 0x04, 0xfb, 0xa7, 0x12, 0x6e, 0x50, 0x9c, 0x79, 0x82, 0xb2, 0xe5, 0xee, 0x3c, 0x89, - 0x36, 0x20, 0x47, 0x06, 0xa3, 0xa9, 0xbf, 0x8c, 0xab, 0x3b, 0xa6, 0x4d, 0x97, 0xc6, 0x91, 0x0e, - 0xa1, 0x29, 0x60, 0xc1, 0x99, 0x35, 0x4e, 0xb0, 0x62, 0xd6, 0x70, 0x29, 0xbd, 0xb1, 0x5e, 0xa9, - 0x2c, 0x28, 0x43, 0x82, 0xcb, 0x05, 0xd3, 0x26, 0x0e, 0x55, 0x37, 0x3d, 0x03, 0x0f, 0x31, 0x87, - 0xaa, 0x9b, 0xc2, 0xbc, 0x67, 0x61, 0x5c, 0xd3, 0x98, 0xce, 0xba, 0x56, 0xe5, 0x7b, 0x2c, 0xa7, - 0x90, 0x0f, 0x19, 0x4b, 0xd3, 0x16, 0x19, 0x02, 0xf7, 0x71, 0x07, 0x3d, 0x05, 0x47, 0x7d, 0x63, - 0x05, 0x09, 0xc7, 0xda, 0xb4, 0x8c, 0x92, 0x9e, 0x85, 0x71, 0x6b, 0xbf, 0x9d, 0x10, 0x85, 0x7a, - 0xb4, 0xf6, 0xa3, 0x64, 0x4f, 0xc0, 0x84, 0xb5, 0x6b, 0xb5, 0xd3, 0x9d, 0x0e, 0xd2, 0x21, 0x6b, - 0xd7, 0x8a, 0x12, 0xde, 0x4b, 0x37, 0xdc, 0x36, 0xd6, 0x54, 0x17, 0xd7, 0x0a, 0xc7, 0x83, 0xe8, - 0x81, 0x07, 0x68, 0x16, 0xf2, 0x9a, 0x56, 0xc5, 0x86, 0xba, 0xdd, 0xc0, 0x55, 0xd5, 0xc6, 0x86, - 0xea, 0x14, 0xa6, 0x82, 0xc8, 0x23, 0x9a, 0x56, 0xa1, 0x4f, 0xe7, 0xe8, 0x43, 0x74, 0x1a, 0xc6, - 0xcc, 0xed, 0x17, 0x35, 0xe6, 0x92, 0x55, 0xcb, 0xc6, 0x3b, 0xfa, 0xb5, 0xc2, 0x3d, 0xd4, 0xbe, - 0xa3, 0xe4, 0x01, 0x75, 0xc8, 0x75, 0x0a, 0x46, 0x0f, 0x40, 0x5e, 0x73, 0x76, 0x55, 0xdb, 0xa2, - 0x31, 0xd9, 0xb1, 0x54, 0x0d, 0x17, 0xee, 0x65, 0xa8, 0x0c, 0xbe, 0x2a, 0xc0, 0x64, 0x4a, 0x38, - 0x57, 0xf5, 0x1d, 0x57, 0x70, 0xbc, 0x9f, 0x4d, 0x09, 0x0a, 0xe3, 0xdc, 0x4e, 0x41, 0x9e, 0x98, - 0x22, 0xd4, 0xf1, 0x29, 0x8a, 0x36, 0x62, 0xed, 0x5a, 0xc1, 0x7e, 0xef, 0x86, 0x61, 0x82, 0xe9, - 0x77, 0xfa, 0x00, 0x4b, 0xc8, 0xac, 0xdd, 0x40, 0x8f, 0x8f, 0xc3, 0x31, 0x82, 0xd4, 0xc4, 0xae, - 0x5a, 0x53, 0x5d, 0x35, 0x80, 0xfd, 0x10, 0xc5, 0x26, 0x76, 0x5f, 0xe1, 0x0f, 0x43, 0x72, 0xda, - 0xad, 0xed, 0x7d, 0xcf, 0xb3, 0x1e, 0x66, 0x72, 0x12, 0x98, 0xf0, 0xad, 0xdb, 0x96, 0x74, 0xcb, - 0x25, 0xc8, 0x05, 0x1d, 0x1f, 0x65, 0x81, 0xb9, 0x7e, 0x5e, 0x22, 0x59, 0xd0, 0xfc, 0xda, 0x02, - 0xc9, 0x5f, 0xde, 0x5a, 0xc9, 0x27, 0x48, 0x1e, 0xb5, 0xbc, 0xb4, 0x59, 0xa9, 0x2a, 0x5b, 0xab, - 0x9b, 0x4b, 0x2b, 0x95, 0x7c, 0x32, 0x90, 0xb0, 0x3f, 0x9b, 0xca, 0xdc, 0x97, 0xbf, 0x5f, 0xfe, - 0x46, 0x02, 0x46, 0xc2, 0x3b, 0x30, 0xf4, 0x26, 0x38, 0x2e, 0xca, 0x25, 0x0e, 0x76, 0xab, 0x57, - 0x75, 0x9b, 0xce, 0xc8, 0xa6, 0xca, 0x56, 0x47, 0xcf, 0x27, 0x26, 0x38, 0xd6, 0x06, 0x76, 0x9f, - 0xd7, 0x6d, 0x32, 0xdf, 0x9a, 0xaa, 0x8b, 0x96, 0x61, 0xca, 0x30, 0xab, 0x8e, 0xab, 0x1a, 0x35, - 0xd5, 0xae, 0x55, 0xfd, 0x42, 0x55, 0x55, 0xd5, 0x34, 0xec, 0x38, 0x26, 0x5b, 0x09, 0x3d, 0x2e, - 0x27, 0x0d, 0x73, 0x83, 0x23, 0xfb, 0x4b, 0xc4, 0x1c, 0x47, 0x8d, 0xf8, 0x6f, 0xb2, 0x9b, 0xff, - 0xde, 0x01, 0xd9, 0xa6, 0x6a, 0x55, 0xb1, 0xe1, 0xda, 0xfb, 0x34, 0xef, 0xce, 0x28, 0x99, 0xa6, - 0x6a, 0x55, 0x48, 0xfb, 0x87, 0xb2, 0xfd, 0x79, 0x36, 0x95, 0xc9, 0xe4, 0xb3, 0xcf, 0xa6, 0x32, - 0xd9, 0x3c, 0xc8, 0xaf, 0x27, 0x21, 0x17, 0xcc, 0xc3, 0xc9, 0xb6, 0x46, 0xa3, 0x4b, 0x96, 0x44, - 0x83, 0xda, 0xdd, 0x3d, 0xb3, 0xf6, 0x99, 0x79, 0xb2, 0x96, 0x95, 0x06, 0x58, 0x76, 0xac, 0x30, - 0x4a, 0x92, 0x47, 0x10, 0x67, 0xc3, 0x2c, 0x1b, 0xc9, 0x28, 0xbc, 0x85, 0x16, 0x61, 0xe0, 0x45, - 0x87, 0xf2, 0x1e, 0xa0, 0xbc, 0xef, 0xe9, 0xcd, 0xfb, 0xd9, 0x0d, 0xca, 0x3c, 0xfb, 0xec, 0x46, - 0x75, 0x75, 0x4d, 0x59, 0x99, 0x5b, 0x56, 0x38, 0x39, 0x3a, 0x01, 0xa9, 0x86, 0xfa, 0xf2, 0x7e, - 0x78, 0xd5, 0xa3, 0xa0, 0x7e, 0x07, 0xe1, 0x04, 0xa4, 0xae, 0x62, 0x75, 0x2f, 0xbc, 0xd6, 0x50, - 0xd0, 0x6d, 0x9c, 0x0c, 0xb3, 0x90, 0xa6, 0xf6, 0x42, 0x00, 0xdc, 0x62, 0xf9, 0x23, 0x28, 0x03, - 0xa9, 0xf9, 0x35, 0x85, 0x4c, 0x88, 0x3c, 0xe4, 0x18, 0xb4, 0xba, 0xbe, 0x54, 0x99, 0xaf, 0xe4, - 0x13, 0xf2, 0x59, 0x18, 0x60, 0x46, 0x20, 0x93, 0xc5, 0x33, 0x43, 0xfe, 0x08, 0x6f, 0x72, 0x1e, - 0x92, 0x78, 0xba, 0xb5, 0x52, 0xae, 0x28, 0xf9, 0x44, 0x78, 0xa8, 0x53, 0xf9, 0xb4, 0xec, 0x40, - 0x2e, 0x98, 0x88, 0xff, 0x70, 0x36, 0xd9, 0x5f, 0x96, 0x60, 0x28, 0x90, 0x58, 0x93, 0x8c, 0x48, - 0x6d, 0x34, 0xcc, 0xab, 0x55, 0xb5, 0xa1, 0xab, 0x0e, 0x77, 0x0d, 0xa0, 0xa0, 0x39, 0x02, 0xe9, - 0x77, 0xe8, 0x7e, 0x48, 0x53, 0x24, 0x9d, 0x1f, 0x90, 0x3f, 0x29, 0x41, 0x3e, 0x9a, 0xd9, 0x46, - 0xc4, 0x94, 0x7e, 0x94, 0x62, 0xca, 0x9f, 0x90, 0x60, 0x24, 0x9c, 0xce, 0x46, 0xc4, 0xbb, 0xeb, - 0x47, 0x2a, 0xde, 0x1f, 0x26, 0x60, 0x38, 0x94, 0xc4, 0xf6, 0x2b, 0xdd, 0x4b, 0x30, 0xa6, 0xd7, - 0x70, 0xd3, 0x32, 0x5d, 0x6c, 0x68, 0xfb, 0xd5, 0x06, 0xbe, 0x82, 0x1b, 0x05, 0x99, 0x06, 0x8d, - 0xd9, 0xde, 0x69, 0xf2, 0xcc, 0x92, 0x4f, 0xb7, 0x4c, 0xc8, 0x4a, 0xe3, 0x4b, 0x0b, 0x95, 0x95, - 0xf5, 0xb5, 0xcd, 0xca, 0xea, 0xfc, 0x5b, 0xaa, 0x5b, 0xab, 0x97, 0x56, 0xd7, 0x9e, 0x5f, 0x55, - 0xf2, 0x7a, 0x04, 0xed, 0x36, 0x4e, 0xfb, 0x75, 0xc8, 0x47, 0x85, 0x42, 0xc7, 0xa1, 0x93, 0x58, - 0xf9, 0x23, 0x68, 0x1c, 0x46, 0x57, 0xd7, 0xaa, 0x1b, 0x4b, 0x0b, 0x95, 0x6a, 0xe5, 0xc2, 0x85, - 0xca, 0xfc, 0xe6, 0x06, 0x2b, 0x7c, 0x78, 0xd8, 0x9b, 0xa1, 0x09, 0x2e, 0xbf, 0x96, 0x84, 0xf1, - 0x0e, 0x92, 0xa0, 0x39, 0xbe, 0x65, 0x61, 0xbb, 0xa8, 0x87, 0xfb, 0x91, 0x7e, 0x86, 0xe4, 0x0c, - 0xeb, 0xaa, 0xed, 0xf2, 0x1d, 0xce, 0x03, 0x40, 0xac, 0x64, 0xb8, 0xfa, 0x8e, 0x8e, 0x6d, 0x5e, - 0x27, 0x62, 0xfb, 0x98, 0x51, 0x1f, 0xce, 0x4a, 0x45, 0x0f, 0x01, 0xb2, 0x4c, 0x47, 0x77, 0xf5, - 0x2b, 0xb8, 0xaa, 0x1b, 0xa2, 0xa8, 0x44, 0xf6, 0x35, 0x29, 0x25, 0x2f, 0x9e, 0x2c, 0x19, 0xae, - 0x87, 0x6d, 0xe0, 0xba, 0x1a, 0xc1, 0x26, 0xc1, 0x3c, 0xa9, 0xe4, 0xc5, 0x13, 0x0f, 0xfb, 0x2e, - 0xc8, 0xd5, 0xcc, 0x16, 0x49, 0xf6, 0x18, 0x1e, 0x59, 0x3b, 0x24, 0x65, 0x88, 0xc1, 0x3c, 0x14, - 0x9e, 0xc6, 0xfb, 0xd5, 0xac, 0x9c, 0x32, 0xc4, 0x60, 0x0c, 0xe5, 0x7e, 0x18, 0x55, 0xeb, 0x75, - 0x9b, 0x30, 0x17, 0x8c, 0xd8, 0xc6, 0x64, 0xc4, 0x03, 0x53, 0xc4, 0xe2, 0xb3, 0x90, 0x11, 0x76, - 0x20, 0x4b, 0x35, 0xb1, 0x44, 0xd5, 0x62, 0xbb, 0xed, 0xc4, 0xa9, 0xac, 0x92, 0x31, 0xc4, 0xc3, - 0xbb, 0x20, 0xa7, 0x3b, 0x55, 0xbf, 0x38, 0x9f, 0x98, 0x4e, 0x9c, 0xca, 0x28, 0x43, 0xba, 0xe3, - 0x15, 0x36, 0xe5, 0xcf, 0x26, 0x60, 0x24, 0xfc, 0x72, 0x01, 0x2d, 0x40, 0xa6, 0x61, 0x6a, 0x2a, - 0x75, 0x2d, 0xf6, 0x66, 0xeb, 0x54, 0xcc, 0xfb, 0x88, 0x99, 0x65, 0x8e, 0xaf, 0x78, 0x94, 0xc5, - 0xdf, 0x91, 0x20, 0x23, 0xc0, 0xe8, 0x18, 0xa4, 0x2c, 0xd5, 0xdd, 0xa5, 0xec, 0xd2, 0xe5, 0x44, - 0x5e, 0x52, 0x68, 0x9b, 0xc0, 0x1d, 0x4b, 0x35, 0xa8, 0x0b, 0x70, 0x38, 0x69, 0x93, 0x71, 0x6d, - 0x60, 0xb5, 0x46, 0x77, 0x3d, 0x66, 0xb3, 0x89, 0x0d, 0xd7, 0x11, 0xe3, 0xca, 0xe1, 0xf3, 0x1c, - 0x8c, 0x1e, 0x84, 0x31, 0xd7, 0x56, 0xf5, 0x46, 0x08, 0x37, 0x45, 0x71, 0xf3, 0xe2, 0x81, 0x87, - 0x5c, 0x82, 0x13, 0x82, 0x6f, 0x0d, 0xbb, 0xaa, 0xb6, 0x8b, 0x6b, 0x3e, 0xd1, 0x00, 0xad, 0x6e, - 0x1c, 0xe7, 0x08, 0x0b, 0xfc, 0xb9, 0xa0, 0x95, 0xbf, 0x21, 0xc1, 0x98, 0xd8, 0xa7, 0xd5, 0x3c, - 0x63, 0xad, 0x00, 0xa8, 0x86, 0x61, 0xba, 0x41, 0x73, 0xb5, 0xbb, 0x72, 0x1b, 0xdd, 0xcc, 0x9c, - 0x47, 0xa4, 0x04, 0x18, 0x14, 0x9b, 0x00, 0xfe, 0x93, 0xae, 0x66, 0x9b, 0x82, 0x21, 0xfe, 0xe6, - 0x88, 0xbe, 0x7e, 0x64, 0x3b, 0x7b, 0x60, 0x20, 0xb2, 0xa1, 0x43, 0x13, 0x90, 0xde, 0xc6, 0x75, - 0xdd, 0xe0, 0xf5, 0x60, 0xd6, 0x10, 0xf5, 0x97, 0x94, 0x57, 0x7f, 0x29, 0x7f, 0x50, 0x82, 0x71, - 0xcd, 0x6c, 0x46, 0xe5, 0x2d, 0xe7, 0x23, 0xe5, 0x05, 0xe7, 0xa2, 0xf4, 0xd6, 0xa7, 0xeb, 0xba, - 0xbb, 0xdb, 0xda, 0x9e, 0xd1, 0xcc, 0xe6, 0x6c, 0xdd, 0x6c, 0xa8, 0x46, 0xdd, 0x7f, 0x7f, 0x4a, - 0x7f, 0x68, 0x0f, 0xd7, 0xb1, 0xf1, 0x70, 0xdd, 0x0c, 0xbc, 0x4d, 0x3d, 0xef, 0xff, 0xfc, 0x73, - 0x49, 0xfa, 0x85, 0x44, 0x72, 0x71, 0xbd, 0xfc, 0xb9, 0x44, 0x71, 0x91, 0x75, 0xb7, 0x2e, 0xcc, - 0xa3, 0xe0, 0x9d, 0x06, 0xd6, 0x88, 0xca, 0xf0, 0xed, 0x07, 0x61, 0xa2, 0x6e, 0xd6, 0x4d, 0xca, - 0x71, 0x96, 0xfc, 0xe2, 0x6f, 0x64, 0xb3, 0x1e, 0xb4, 0x18, 0xfb, 0xfa, 0xb6, 0xb4, 0x0a, 0xe3, - 0x1c, 0xb9, 0x4a, 0x5f, 0x09, 0xb1, 0x8d, 0x0d, 0xea, 0x59, 0x56, 0x2b, 0xfc, 0xda, 0xb7, 0xe8, - 0x82, 0xae, 0x8c, 0x71, 0x52, 0xf2, 0x8c, 0xed, 0x7d, 0x4a, 0x0a, 0x1c, 0x0d, 0xf1, 0x63, 0xd3, - 0x16, 0xdb, 0x31, 0x1c, 0x7f, 0x8b, 0x73, 0x1c, 0x0f, 0x70, 0xdc, 0xe0, 0xa4, 0xa5, 0x79, 0x18, - 0x3e, 0x08, 0xaf, 0x7f, 0xc9, 0x79, 0xe5, 0x70, 0x90, 0xc9, 0x22, 0x8c, 0x52, 0x26, 0x5a, 0xcb, - 0x71, 0xcd, 0x26, 0x8d, 0x89, 0xbd, 0xd9, 0xfc, 0xf6, 0xb7, 0xd8, 0x3c, 0x1a, 0x21, 0x64, 0xf3, - 0x1e, 0x55, 0xa9, 0x04, 0xf4, 0x2d, 0x58, 0x0d, 0x6b, 0x8d, 0x18, 0x0e, 0x5f, 0xe1, 0x82, 0x78, - 0xf8, 0xa5, 0xcb, 0x30, 0x41, 0x7e, 0xd3, 0x90, 0x15, 0x94, 0x24, 0xbe, 0x06, 0x57, 0xf8, 0xc6, - 0x7b, 0xd8, 0x54, 0x1d, 0xf7, 0x18, 0x04, 0x64, 0x0a, 0x8c, 0x62, 0x1d, 0xbb, 0x2e, 0xb6, 0x9d, - 0xaa, 0xda, 0xe8, 0x24, 0x5e, 0xa0, 0x88, 0x51, 0xf8, 0xd8, 0x77, 0xc2, 0xa3, 0xb8, 0xc8, 0x28, - 0xe7, 0x1a, 0x8d, 0xd2, 0x16, 0x1c, 0xef, 0xe0, 0x15, 0x7d, 0xf0, 0x7c, 0x8d, 0xf3, 0x9c, 0x68, - 0xf3, 0x0c, 0xc2, 0x76, 0x1d, 0x04, 0xdc, 0x1b, 0xcb, 0x3e, 0x78, 0x7e, 0x9c, 0xf3, 0x44, 0x9c, - 0x56, 0x0c, 0x29, 0xe1, 0xf8, 0x2c, 0x8c, 0x5d, 0xc1, 0xf6, 0xb6, 0xe9, 0xf0, 0xc2, 0x51, 0x1f, - 0xec, 0x3e, 0xc1, 0xd9, 0x8d, 0x72, 0x42, 0x5a, 0x49, 0x22, 0xbc, 0x9e, 0x82, 0xcc, 0x8e, 0xaa, - 0xe1, 0x3e, 0x58, 0x5c, 0xe7, 0x2c, 0x06, 0x09, 0x3e, 0x21, 0x9d, 0x83, 0x5c, 0xdd, 0xe4, 0xab, - 0x56, 0x3c, 0xf9, 0x27, 0x39, 0xf9, 0x90, 0xa0, 0xe1, 0x2c, 0x2c, 0xd3, 0x6a, 0x35, 0xc8, 0x92, - 0x16, 0xcf, 0xe2, 0x6f, 0x09, 0x16, 0x82, 0x86, 0xb3, 0x38, 0x80, 0x59, 0x3f, 0x25, 0x58, 0x38, - 0x01, 0x7b, 0x3e, 0x03, 0x43, 0xa6, 0xd1, 0xd8, 0x37, 0x8d, 0x7e, 0x84, 0xf8, 0x34, 0xe7, 0x00, - 0x9c, 0x84, 0x30, 0x38, 0x0f, 0xd9, 0x7e, 0x07, 0xe2, 0x6f, 0x7f, 0x47, 0x4c, 0x0f, 0x31, 0x02, - 0x8b, 0x30, 0x2a, 0x02, 0x94, 0x6e, 0x1a, 0x7d, 0xb0, 0xf8, 0x3b, 0x9c, 0xc5, 0x48, 0x80, 0x8c, - 0xab, 0xe1, 0x62, 0xc7, 0xad, 0xe3, 0x7e, 0x98, 0x7c, 0x56, 0xa8, 0xc1, 0x49, 0xb8, 0x29, 0xb7, - 0xb1, 0xa1, 0xed, 0xf6, 0xc7, 0xe1, 0x97, 0x84, 0x29, 0x05, 0x0d, 0x61, 0x31, 0x0f, 0xc3, 0x4d, - 0xd5, 0x76, 0x76, 0xd5, 0x46, 0x5f, 0xc3, 0xf1, 0x77, 0x39, 0x8f, 0x9c, 0x47, 0xc4, 0x2d, 0xd2, - 0x32, 0x0e, 0xc2, 0xe6, 0x73, 0xc2, 0x22, 0x01, 0x32, 0x3e, 0xf5, 0x1c, 0x97, 0x56, 0xd9, 0x0e, - 0xc2, 0xed, 0x97, 0xc5, 0xd4, 0x63, 0xb4, 0x2b, 0x41, 0x8e, 0xe7, 0x21, 0xeb, 0xe8, 0x2f, 0xf7, - 0xc5, 0xe6, 0xf3, 0x62, 0xa4, 0x29, 0x01, 0x21, 0x7e, 0x0b, 0x9c, 0xe8, 0xb8, 0x4c, 0xf4, 0xc1, - 0xec, 0xef, 0x71, 0x66, 0xc7, 0x3a, 0x2c, 0x15, 0x3c, 0x24, 0x1c, 0x94, 0xe5, 0xdf, 0x17, 0x21, - 0x01, 0x47, 0x78, 0xad, 0x93, 0x7d, 0x84, 0xa3, 0xee, 0x1c, 0xcc, 0x6a, 0xbf, 0x22, 0xac, 0xc6, - 0x68, 0x43, 0x56, 0xdb, 0x84, 0x63, 0x9c, 0xe3, 0xc1, 0xc6, 0xf5, 0x57, 0x45, 0x60, 0x65, 0xd4, - 0x5b, 0xe1, 0xd1, 0x7d, 0x1b, 0x14, 0x3d, 0x73, 0x8a, 0x84, 0xd5, 0xa9, 0x36, 0x55, 0xab, 0x0f, - 0xce, 0xbf, 0xc6, 0x39, 0x8b, 0x88, 0xef, 0x65, 0xbc, 0xce, 0x8a, 0x6a, 0x11, 0xe6, 0x2f, 0x40, - 0x41, 0x30, 0x6f, 0x19, 0x36, 0xd6, 0xcc, 0xba, 0xa1, 0xbf, 0x8c, 0x6b, 0x7d, 0xb0, 0xfe, 0xf5, - 0xc8, 0x50, 0x6d, 0x05, 0xc8, 0x09, 0xe7, 0x25, 0xc8, 0x7b, 0xb9, 0x4a, 0x55, 0x6f, 0x5a, 0xa6, - 0xed, 0xc6, 0x70, 0xfc, 0x82, 0x18, 0x29, 0x8f, 0x6e, 0x89, 0x92, 0x95, 0x2a, 0x30, 0x42, 0x9b, - 0xfd, 0xba, 0xe4, 0x17, 0x39, 0xa3, 0x61, 0x9f, 0x8a, 0x07, 0x0e, 0xcd, 0x6c, 0x5a, 0xaa, 0xdd, - 0x4f, 0xfc, 0xfb, 0x07, 0x22, 0x70, 0x70, 0x12, 0x1e, 0x38, 0xdc, 0x7d, 0x0b, 0x93, 0xd5, 0xbe, - 0x0f, 0x0e, 0x5f, 0x12, 0x81, 0x43, 0xd0, 0x70, 0x16, 0x22, 0x61, 0xe8, 0x83, 0xc5, 0x3f, 0x14, - 0x2c, 0x04, 0x0d, 0x61, 0xf1, 0x9c, 0xbf, 0xd0, 0xda, 0xb8, 0xae, 0x3b, 0xae, 0xcd, 0xd2, 0xe4, - 0xde, 0xac, 0xfe, 0xd1, 0x77, 0xc2, 0x49, 0x98, 0x12, 0x20, 0x25, 0x91, 0x88, 0x97, 0x5d, 0xe9, - 0x2e, 0x2a, 0x5e, 0xb0, 0xdf, 0x10, 0x91, 0x28, 0x40, 0x46, 0x64, 0x0b, 0x64, 0x88, 0xc4, 0xec, - 0x1a, 0xd9, 0x3b, 0xf4, 0xc1, 0xee, 0x1f, 0x47, 0x84, 0xdb, 0x10, 0xb4, 0x84, 0x67, 0x20, 0xff, - 0x69, 0x19, 0x7b, 0x78, 0xbf, 0x2f, 0xef, 0xfc, 0x27, 0x91, 0xfc, 0x67, 0x8b, 0x51, 0xb2, 0x18, - 0x32, 0x1a, 0xc9, 0xa7, 0x50, 0xdc, 0xf9, 0xa1, 0xc2, 0x4f, 0x7d, 0x8f, 0xeb, 0x1b, 0x4e, 0xa7, - 0x4a, 0xcb, 0xc4, 0xc9, 0xc3, 0x49, 0x4f, 0x3c, 0xb3, 0xf7, 0x7c, 0xcf, 0xf3, 0xf3, 0x50, 0xce, - 0x53, 0xba, 0x00, 0xc3, 0xa1, 0x84, 0x27, 0x9e, 0xd5, 0x7b, 0x39, 0xab, 0x5c, 0x30, 0xdf, 0x29, - 0x9d, 0x85, 0x14, 0x49, 0x5e, 0xe2, 0xc9, 0xff, 0x2a, 0x27, 0xa7, 0xe8, 0xa5, 0x37, 0x43, 0x46, - 0x24, 0x2d, 0xf1, 0xa4, 0xef, 0xe3, 0xa4, 0x1e, 0x09, 0x21, 0x17, 0x09, 0x4b, 0x3c, 0xf9, 0x5f, - 0x13, 0xe4, 0x82, 0x84, 0x90, 0xf7, 0x6f, 0xc2, 0x2f, 0xff, 0x74, 0x8a, 0x2f, 0x3a, 0xc2, 0x76, - 0xe7, 0x61, 0x90, 0x67, 0x2a, 0xf1, 0xd4, 0x1f, 0xe0, 0x9d, 0x0b, 0x8a, 0xd2, 0x13, 0x90, 0xee, - 0xd3, 0xe0, 0x3f, 0xc3, 0x49, 0x19, 0x7e, 0x69, 0x1e, 0x86, 0x02, 0xd9, 0x49, 0x3c, 0xf9, 0xdf, - 0xe0, 0xe4, 0x41, 0x2a, 0x22, 0x3a, 0xcf, 0x4e, 0xe2, 0x19, 0x7c, 0x50, 0x88, 0xce, 0x29, 0x88, - 0xd9, 0x44, 0x62, 0x12, 0x4f, 0xfd, 0x21, 0x61, 0x75, 0x41, 0x52, 0x7a, 0x06, 0xb2, 0xde, 0x62, - 0x13, 0x4f, 0xff, 0x61, 0x4e, 0xef, 0xd3, 0x10, 0x0b, 0x04, 0x16, 0xbb, 0x78, 0x16, 0x3f, 0x2b, - 0x2c, 0x10, 0xa0, 0x22, 0xd3, 0x28, 0x9a, 0xc0, 0xc4, 0x73, 0xfa, 0x88, 0x98, 0x46, 0x91, 0xfc, - 0x85, 0x8c, 0x26, 0x8d, 0xf9, 0xf1, 0x2c, 0x7e, 0x4e, 0x8c, 0x26, 0xc5, 0x27, 0x62, 0x44, 0x33, - 0x82, 0x78, 0x1e, 0x7f, 0x53, 0x88, 0x11, 0x49, 0x08, 0x4a, 0xeb, 0x80, 0xda, 0xb3, 0x81, 0x78, - 0x7e, 0x1f, 0xe5, 0xfc, 0xc6, 0xda, 0x92, 0x81, 0xd2, 0xf3, 0x70, 0xac, 0x73, 0x26, 0x10, 0xcf, - 0xf5, 0x63, 0xdf, 0x8b, 0xec, 0xdd, 0x82, 0x89, 0x40, 0x69, 0xd3, 0x5f, 0x52, 0x82, 0x59, 0x40, - 0x3c, 0xdb, 0xd7, 0xbe, 0x17, 0x0e, 0xdc, 0xc1, 0x24, 0xa0, 0x34, 0x07, 0xe0, 0x2f, 0xc0, 0xf1, - 0xbc, 0x3e, 0xc1, 0x79, 0x05, 0x88, 0xc8, 0xd4, 0xe0, 0xeb, 0x6f, 0x3c, 0xfd, 0x75, 0x31, 0x35, - 0x38, 0x05, 0x99, 0x1a, 0x62, 0xe9, 0x8d, 0xa7, 0xfe, 0xa4, 0x98, 0x1a, 0x82, 0x84, 0x78, 0x76, - 0x60, 0x75, 0x8b, 0xe7, 0xf0, 0x69, 0xe1, 0xd9, 0x01, 0xaa, 0xd2, 0x2a, 0x8c, 0xb5, 0x2d, 0x88, - 0xf1, 0xac, 0x7e, 0x81, 0xb3, 0xca, 0x47, 0xd7, 0xc3, 0xe0, 0xe2, 0xc5, 0x17, 0xc3, 0x78, 0x6e, - 0x9f, 0x89, 0x2c, 0x5e, 0x7c, 0x2d, 0x2c, 0x9d, 0x87, 0x8c, 0xd1, 0x6a, 0x34, 0xc8, 0xe4, 0x41, - 0xbd, 0xcf, 0xfc, 0x15, 0xfe, 0xcb, 0xf7, 0xb9, 0x75, 0x04, 0x41, 0xe9, 0x2c, 0xa4, 0x71, 0x73, - 0x1b, 0xd7, 0xe2, 0x28, 0xbf, 0xfd, 0x7d, 0x11, 0x30, 0x09, 0x76, 0xe9, 0x19, 0x00, 0x56, 0x1a, - 0xa1, 0xaf, 0x07, 0x63, 0x68, 0xff, 0xeb, 0xf7, 0xf9, 0x69, 0x1c, 0x9f, 0xc4, 0x67, 0xc0, 0xce, - 0xf6, 0xf4, 0x66, 0xf0, 0x9d, 0x30, 0x03, 0x3a, 0x22, 0x4f, 0xc1, 0xe0, 0x8b, 0x8e, 0x69, 0xb8, - 0x6a, 0x3d, 0x8e, 0xfa, 0xbf, 0x71, 0x6a, 0x81, 0x4f, 0x0c, 0xd6, 0x34, 0x6d, 0xec, 0xaa, 0x75, - 0x27, 0x8e, 0xf6, 0xbf, 0x73, 0x5a, 0x8f, 0x80, 0x10, 0x6b, 0xaa, 0xe3, 0xf6, 0xa3, 0xf7, 0x1f, - 0x0b, 0x62, 0x41, 0x40, 0x84, 0x26, 0xbf, 0xf7, 0xf0, 0x7e, 0x1c, 0xed, 0x77, 0x85, 0xd0, 0x1c, - 0xbf, 0xf4, 0x66, 0xc8, 0x92, 0x9f, 0xec, 0x88, 0x5d, 0x0c, 0xf1, 0x9f, 0x70, 0x62, 0x9f, 0x82, - 0xf4, 0xec, 0xb8, 0x35, 0x57, 0x8f, 0x37, 0xf6, 0x4d, 0x3e, 0xd2, 0x02, 0xbf, 0x34, 0x07, 0x43, - 0x8e, 0x5b, 0xab, 0xb5, 0x78, 0x7e, 0x1a, 0x43, 0xfe, 0xa7, 0xdf, 0xf7, 0x4a, 0x16, 0x1e, 0x0d, - 0x19, 0xed, 0xab, 0x7b, 0xae, 0x65, 0xd2, 0x57, 0x20, 0x71, 0x1c, 0xbe, 0xc7, 0x39, 0x04, 0x48, - 0x4a, 0xf3, 0x90, 0x23, 0xba, 0xd8, 0xd8, 0xc2, 0xf4, 0x7d, 0x55, 0x0c, 0x8b, 0x3f, 0xe3, 0x06, - 0x08, 0x11, 0x95, 0x7f, 0xf2, 0x2b, 0xaf, 0x4f, 0x4a, 0x5f, 0x7f, 0x7d, 0x52, 0xfa, 0xc3, 0xd7, - 0x27, 0xa5, 0x0f, 0x7d, 0x73, 0xf2, 0xc8, 0xd7, 0xbf, 0x39, 0x79, 0xe4, 0xf7, 0xbe, 0x39, 0x79, - 0xa4, 0x73, 0xd9, 0x18, 0x16, 0xcd, 0x45, 0x93, 0x15, 0x8c, 0xdf, 0x2a, 0x87, 0xca, 0xc5, 0x75, - 0xd3, 0xaf, 0xd6, 0x7a, 0x9b, 0x1c, 0xf8, 0x33, 0x89, 0x6c, 0x98, 0xc3, 0xb5, 0x5c, 0xd5, 0xd8, - 0xef, 0x72, 0x07, 0xa7, 0xd8, 0xb1, 0x30, 0x2c, 0xbf, 0x09, 0x92, 0x73, 0xc6, 0x3e, 0x3a, 0xc1, - 0x62, 0x5e, 0xb5, 0x65, 0x37, 0xf8, 0xd1, 0xaf, 0x41, 0xd2, 0xde, 0xb2, 0x1b, 0x68, 0xc2, 0x3f, - 0x9f, 0x29, 0x9d, 0xca, 0xf1, 0x43, 0x97, 0xa5, 0xd4, 0x77, 0x3f, 0x3d, 0x75, 0xa4, 0xbc, 0x17, - 0xd5, 0xf0, 0xcb, 0xb1, 0x5a, 0x66, 0xe6, 0x8c, 0x7d, 0xaa, 0xe4, 0xba, 0xf4, 0xd6, 0x34, 0xe9, - 0xc3, 0x11, 0x85, 0xed, 0xc9, 0x68, 0x61, 0xfb, 0x79, 0xdc, 0x68, 0x5c, 0x32, 0xcc, 0xab, 0xc6, - 0x26, 0x41, 0xdb, 0x1e, 0xa0, 0x3c, 0x1e, 0x83, 0x0f, 0x25, 0x60, 0x2a, 0xaa, 0x37, 0x71, 0x1c, - 0xc7, 0x55, 0x9b, 0x56, 0xb7, 0x1b, 0x48, 0xe7, 0x21, 0xbb, 0x29, 0x70, 0x50, 0x01, 0x06, 0x1d, - 0xac, 0x99, 0x46, 0xcd, 0xa1, 0xca, 0x26, 0x15, 0xd1, 0x24, 0xca, 0x1a, 0xaa, 0x61, 0x3a, 0xfc, - 0x80, 0x24, 0x6b, 0x94, 0x7f, 0x5e, 0x3a, 0xd8, 0x48, 0x8e, 0x78, 0x5d, 0x09, 0x4d, 0x1f, 0xec, - 0x55, 0xfe, 0xa7, 0x56, 0xf0, 0x55, 0x08, 0xd4, 0xfa, 0xfb, 0x35, 0xc9, 0xbb, 0x93, 0x70, 0x42, - 0x33, 0x9d, 0xa6, 0xe9, 0x54, 0xd9, 0x08, 0xb3, 0x06, 0x37, 0x46, 0x2e, 0xf8, 0xa8, 0x8f, 0xfa, - 0xff, 0x45, 0x18, 0xa1, 0xb3, 0x80, 0x56, 0x3e, 0x69, 0xe0, 0x89, 0x5d, 0x2b, 0xbe, 0xfa, 0x6f, - 0xd3, 0xd4, 0x6b, 0x86, 0x3d, 0x42, 0x7a, 0xb4, 0x63, 0x13, 0x26, 0xf4, 0xa6, 0xd5, 0xc0, 0xf4, - 0x1d, 0x50, 0xd5, 0x7b, 0x16, 0xcf, 0xef, 0x6b, 0x9c, 0xdf, 0xb8, 0x4f, 0xbe, 0x24, 0xa8, 0x4b, - 0xcb, 0x30, 0xa6, 0x6a, 0x1a, 0xb6, 0x42, 0x2c, 0x63, 0x66, 0xa8, 0x10, 0x30, 0xcf, 0x29, 0x3d, - 0x6e, 0xe5, 0x67, 0xba, 0x8d, 0xed, 0x5b, 0xef, 0x0d, 0x0c, 0x9a, 0x8d, 0xeb, 0xd8, 0x78, 0xd8, - 0xc0, 0xee, 0x55, 0xd3, 0xde, 0xe3, 0xe6, 0x7d, 0x98, 0x75, 0x25, 0x06, 0xe1, 0xbd, 0x49, 0x98, - 0x64, 0x0f, 0x66, 0xb7, 0x55, 0x07, 0xcf, 0x5e, 0x79, 0x74, 0x1b, 0xbb, 0xea, 0xa3, 0xb3, 0x9a, - 0xa9, 0x1b, 0x7c, 0x24, 0xc6, 0xf9, 0xb8, 0x90, 0xe7, 0x33, 0xfc, 0x79, 0x97, 0x89, 0xb9, 0x08, - 0xa9, 0x79, 0x53, 0x37, 0x88, 0x47, 0xd6, 0xb0, 0x61, 0x36, 0xf9, 0xb4, 0x64, 0x0d, 0x74, 0x37, - 0x0c, 0xa8, 0x4d, 0xb3, 0x65, 0xb8, 0xec, 0xf5, 0x55, 0x79, 0xe8, 0x2b, 0x37, 0xa6, 0x8e, 0xfc, - 0xfe, 0x8d, 0xa9, 0xe4, 0x92, 0xe1, 0x2a, 0xfc, 0x51, 0x29, 0xf5, 0xc6, 0xa7, 0xa6, 0x24, 0xf9, - 0x59, 0x18, 0x5c, 0xc0, 0xda, 0x61, 0x78, 0x2d, 0x60, 0x2d, 0xc2, 0xeb, 0x01, 0xc8, 0x2c, 0x19, - 0x2e, 0x3b, 0x33, 0x7b, 0x27, 0x24, 0x75, 0x83, 0x9d, 0xc2, 0x8a, 0xf4, 0x4f, 0xe0, 0x04, 0x75, - 0x01, 0x6b, 0x1e, 0x6a, 0x0d, 0x6b, 0x51, 0x54, 0xc2, 0x9e, 0xc0, 0xcb, 0x0b, 0xbf, 0xf7, 0x9f, - 0x26, 0x8f, 0xbc, 0xf2, 0xfa, 0xe4, 0x91, 0xae, 0x23, 0x11, 0x0c, 0x87, 0xdc, 0xc4, 0x7c, 0x08, - 0x9c, 0xda, 0xde, 0xac, 0x1b, 0x9a, 0x0b, 0x7f, 0x3d, 0x01, 0x93, 0x6d, 0x2e, 0xce, 0x17, 0x86, - 0x6e, 0xd1, 0xa1, 0x04, 0x99, 0x05, 0xb1, 0xde, 0x1c, 0x34, 0x38, 0xfc, 0xdc, 0x01, 0x83, 0xc3, - 0xb0, 0xe8, 0x49, 0xc4, 0x86, 0xd3, 0xf1, 0xb1, 0x41, 0xc8, 0x7f, 0x88, 0xd0, 0xf0, 0xb9, 0x14, - 0xdc, 0x49, 0x2f, 0x85, 0xd8, 0x4d, 0xdd, 0x70, 0x67, 0x35, 0x7b, 0xdf, 0x72, 0xe9, 0x72, 0x62, - 0xee, 0x70, 0x6b, 0x8c, 0xf9, 0x8f, 0x67, 0xd8, 0xe3, 0x2e, 0x2e, 0xb9, 0x03, 0xe9, 0x75, 0x42, - 0x47, 0x0c, 0xe1, 0x9a, 0xae, 0xda, 0xe0, 0x06, 0x62, 0x0d, 0x02, 0x65, 0x17, 0x49, 0x12, 0x0c, - 0xaa, 0x8b, 0x3b, 0x24, 0x0d, 0xac, 0xee, 0xb0, 0x83, 0xbb, 0x49, 0xba, 0x84, 0x64, 0x08, 0x80, - 0x9e, 0xd1, 0x9d, 0x80, 0xb4, 0xda, 0x62, 0xaf, 0x9c, 0x93, 0x64, 0x6d, 0xa1, 0x0d, 0xf9, 0x12, - 0x0c, 0xf2, 0xd7, 0x5c, 0x28, 0x0f, 0xc9, 0x3d, 0xbc, 0x4f, 0xfb, 0xc9, 0x29, 0xe4, 0x27, 0x9a, - 0x81, 0x34, 0x15, 0x9e, 0xdf, 0x48, 0x28, 0xcc, 0xb4, 0x49, 0x3f, 0x43, 0x85, 0x54, 0x18, 0x9a, - 0xfc, 0x2c, 0x64, 0x16, 0xcc, 0xa6, 0x6e, 0x98, 0x61, 0x6e, 0x59, 0xc6, 0x8d, 0xca, 0x6c, 0xb5, - 0xb8, 0xeb, 0x2b, 0xac, 0x81, 0x8e, 0xc1, 0x00, 0x3b, 0xc8, 0xcd, 0x5f, 0x9b, 0xf3, 0x96, 0x3c, - 0x0f, 0x83, 0x94, 0xf7, 0x9a, 0x85, 0x10, 0xbf, 0xd9, 0xc3, 0x4f, 0x8c, 0xd3, 0x28, 0xc9, 0xd9, - 0x27, 0x7c, 0x61, 0x11, 0xa4, 0x6a, 0xaa, 0xab, 0x72, 0xbd, 0xe9, 0x6f, 0xf9, 0x69, 0xc8, 0x70, - 0x26, 0x0e, 0x3a, 0x03, 0x49, 0xd3, 0x72, 0xf8, 0x8b, 0xef, 0x62, 0x37, 0x55, 0xd6, 0xac, 0x72, - 0x8a, 0x4c, 0x1a, 0x85, 0x20, 0x97, 0x95, 0xae, 0xb3, 0xe4, 0xc9, 0x80, 0x23, 0x05, 0x86, 0x3c, - 0xf0, 0x93, 0x0d, 0x69, 0x9b, 0x3b, 0x78, 0xce, 0xf2, 0xe9, 0x04, 0x4c, 0x06, 0x9e, 0x5e, 0xc1, - 0x36, 0xd9, 0xeb, 0xb1, 0x09, 0xc6, 0xbd, 0x05, 0x05, 0x84, 0xe4, 0xcf, 0xbb, 0xb8, 0xcb, 0x9b, - 0x21, 0x39, 0x67, 0x59, 0xa8, 0x08, 0x19, 0xf6, 0x82, 0xdb, 0x64, 0xfe, 0x92, 0x52, 0xbc, 0x36, - 0x79, 0xe6, 0x98, 0x3b, 0xee, 0x55, 0xd5, 0xf6, 0xae, 0x30, 0x89, 0xb6, 0xfc, 0x14, 0x64, 0xe7, - 0x4d, 0xc3, 0xc1, 0x86, 0xd3, 0xa2, 0x53, 0x6f, 0xbb, 0x61, 0x6a, 0x7b, 0x9c, 0x03, 0x6b, 0x10, - 0x83, 0xab, 0x96, 0x45, 0x29, 0x53, 0x0a, 0xf9, 0xc9, 0xc2, 0x54, 0x79, 0xa3, 0xab, 0x89, 0x9e, - 0x3a, 0xb8, 0x89, 0xb8, 0x92, 0x9e, 0x8d, 0xfe, 0xb7, 0x04, 0x27, 0xdb, 0x27, 0xd4, 0x1e, 0xde, - 0x77, 0x0e, 0x3a, 0x9f, 0x5e, 0x80, 0xec, 0x3a, 0xbd, 0x47, 0x7c, 0x09, 0xef, 0xa3, 0x22, 0x0c, - 0xe2, 0xda, 0x99, 0xb3, 0x67, 0x1f, 0x7d, 0x8a, 0x79, 0xfb, 0xc5, 0x23, 0x8a, 0x00, 0xa0, 0x49, - 0xc8, 0x3a, 0x58, 0xb3, 0xce, 0x9c, 0x3d, 0xb7, 0xf7, 0x28, 0x73, 0xaf, 0x8b, 0x47, 0x14, 0x1f, - 0x54, 0xca, 0x10, 0xad, 0xdf, 0xf8, 0xf4, 0x94, 0x54, 0x4e, 0x43, 0xd2, 0x69, 0x35, 0x6f, 0xab, - 0x8f, 0xbc, 0x96, 0x86, 0xe9, 0x20, 0x25, 0x0d, 0x50, 0x57, 0xd4, 0x86, 0x5e, 0x53, 0xfd, 0x1b, - 0xe0, 0xf9, 0x80, 0x0d, 0x28, 0x46, 0x67, 0x13, 0x14, 0x7b, 0x5a, 0x52, 0xfe, 0x75, 0x09, 0x72, - 0x97, 0x05, 0xe7, 0x0d, 0xec, 0xa2, 0xf3, 0x00, 0x5e, 0x4f, 0x62, 0xda, 0xdc, 0x31, 0x13, 0xed, - 0x6b, 0xc6, 0xa3, 0x51, 0x02, 0xe8, 0xe8, 0x09, 0xea, 0x88, 0x96, 0xe9, 0xf0, 0xfb, 0x2f, 0x31, - 0xa4, 0x1e, 0x32, 0x7a, 0x08, 0x10, 0x8d, 0x70, 0xd5, 0x2b, 0xa6, 0xab, 0x1b, 0xf5, 0xaa, 0x65, - 0x5e, 0xe5, 0x97, 0x05, 0x93, 0x4a, 0x9e, 0x3e, 0xb9, 0x4c, 0x1f, 0xac, 0x13, 0x38, 0x11, 0x3a, - 0xeb, 0x71, 0x21, 0xab, 0x89, 0x5a, 0xab, 0xd9, 0xd8, 0x71, 0x78, 0x10, 0x13, 0x4d, 0x74, 0x1e, - 0x06, 0xad, 0xd6, 0x76, 0x55, 0x44, 0x8c, 0xa1, 0x33, 0x27, 0x3b, 0xcd, 0x7f, 0xe1, 0x1f, 0x3c, - 0x02, 0x0c, 0x58, 0xad, 0x6d, 0xe2, 0x2d, 0x77, 0x41, 0xae, 0x83, 0x30, 0x43, 0x57, 0x7c, 0x39, - 0xe8, 0xf5, 0x75, 0xae, 0x41, 0xd5, 0xb2, 0x75, 0xd3, 0xd6, 0xdd, 0x7d, 0x7a, 0x7a, 0x25, 0xa9, - 0xe4, 0xc5, 0x83, 0x75, 0x0e, 0x97, 0xf7, 0x60, 0x74, 0x83, 0xa6, 0x5a, 0xbe, 0xe4, 0x67, 0x7d, - 0xf9, 0xa4, 0x78, 0xf9, 0xba, 0x4a, 0x96, 0x68, 0x93, 0xac, 0xfc, 0x5c, 0x57, 0xef, 0x7c, 0xe2, - 0xe0, 0xde, 0x19, 0x5e, 0xfc, 0xff, 0xf8, 0x44, 0x68, 0x72, 0xf2, 0xcc, 0x3a, 0x10, 0xbe, 0xfa, - 0x75, 0xcc, 0xb8, 0x1d, 0x46, 0xb1, 0xf7, 0xa2, 0x5a, 0x8c, 0x09, 0xa3, 0xc5, 0xd8, 0x29, 0x24, - 0x3f, 0x05, 0xc3, 0xeb, 0xaa, 0xed, 0x6e, 0x60, 0xf7, 0x22, 0x56, 0x6b, 0xd8, 0x0e, 0xaf, 0xba, - 0xc3, 0x62, 0xd5, 0x45, 0x90, 0xa2, 0x4b, 0x2b, 0x5b, 0x75, 0xe8, 0x6f, 0x79, 0x17, 0x52, 0xf4, - 0x04, 0x9b, 0xb7, 0x22, 0x73, 0x0a, 0xb6, 0x22, 0x93, 0x58, 0xba, 0xef, 0x62, 0x47, 0x6c, 0xe8, - 0x68, 0x03, 0x3d, 0x2e, 0xd6, 0xd5, 0x64, 0xef, 0x75, 0x95, 0x3b, 0x22, 0x5f, 0x5d, 0x1b, 0x30, - 0x58, 0x26, 0xa1, 0x78, 0x69, 0xc1, 0x13, 0x44, 0xf2, 0x05, 0x41, 0x2b, 0x30, 0x6a, 0xa9, 0xb6, - 0x4b, 0x8f, 0xee, 0xef, 0x52, 0x2d, 0xb8, 0xaf, 0x4f, 0xb5, 0xcf, 0xbc, 0x90, 0xb2, 0xbc, 0x97, - 0x61, 0x2b, 0x08, 0x94, 0xff, 0x28, 0x05, 0x03, 0xdc, 0x18, 0x6f, 0x86, 0x41, 0x6e, 0x56, 0xee, - 0x9d, 0x77, 0xce, 0xb4, 0x2f, 0x4c, 0x33, 0xde, 0x02, 0xc2, 0xf9, 0x09, 0x1a, 0x74, 0x1f, 0x64, - 0xb4, 0x5d, 0x55, 0x37, 0xaa, 0x7a, 0x4d, 0x64, 0xbd, 0xaf, 0xdf, 0x98, 0x1a, 0x9c, 0x27, 0xb0, - 0xa5, 0x05, 0x65, 0x90, 0x3e, 0x5c, 0xaa, 0x91, 0x4c, 0x60, 0x17, 0xeb, 0xf5, 0x5d, 0x97, 0xcf, - 0x30, 0xde, 0x42, 0x4f, 0x42, 0x8a, 0x38, 0x04, 0xbf, 0xd9, 0x55, 0x6c, 0xdb, 0x7b, 0x78, 0x1b, - 0xc0, 0x72, 0x86, 0x74, 0xfc, 0xa1, 0x3f, 0x98, 0x92, 0x14, 0x4a, 0x81, 0xe6, 0x61, 0xb8, 0xa1, - 0x3a, 0x6e, 0x95, 0xae, 0x60, 0xa4, 0xfb, 0x34, 0x65, 0x71, 0xa2, 0xdd, 0x20, 0xdc, 0xb0, 0x5c, - 0xf4, 0x21, 0x42, 0xc5, 0x40, 0x35, 0x74, 0x0a, 0xf2, 0x94, 0x89, 0x66, 0x36, 0x9b, 0xba, 0xcb, - 0x72, 0xab, 0x01, 0x6a, 0xf7, 0x11, 0x02, 0x9f, 0xa7, 0x60, 0x9a, 0x61, 0xdd, 0x01, 0x59, 0x7a, - 0x95, 0x84, 0xa2, 0xb0, 0x63, 0x93, 0x19, 0x02, 0xa0, 0x0f, 0xef, 0x87, 0x51, 0x3f, 0x3e, 0x32, - 0x94, 0x0c, 0xe3, 0xe2, 0x83, 0x29, 0xe2, 0x23, 0x30, 0x61, 0xe0, 0x6b, 0xf4, 0x20, 0x67, 0x08, - 0x3b, 0x4b, 0xb1, 0x11, 0x79, 0x76, 0x39, 0x4c, 0x71, 0x2f, 0x8c, 0x68, 0xc2, 0xf8, 0x0c, 0x17, - 0x28, 0xee, 0xb0, 0x07, 0xa5, 0x68, 0x27, 0x20, 0xa3, 0x5a, 0x16, 0x43, 0x18, 0xe2, 0xf1, 0xd1, - 0xb2, 0xe8, 0xa3, 0xd3, 0x30, 0x46, 0x75, 0xb4, 0xb1, 0xd3, 0x6a, 0xb8, 0x9c, 0x49, 0x8e, 0xe2, - 0x8c, 0x92, 0x07, 0x0a, 0x83, 0x53, 0xdc, 0xbb, 0x61, 0x18, 0x5f, 0xd1, 0x6b, 0xd8, 0xd0, 0x30, - 0xc3, 0x1b, 0xa6, 0x78, 0x39, 0x01, 0xa4, 0x48, 0x0f, 0x80, 0x17, 0xf7, 0xaa, 0x22, 0x26, 0x8f, - 0x30, 0x7e, 0x02, 0x3e, 0xc7, 0xc0, 0x72, 0x01, 0x52, 0x0b, 0xaa, 0xab, 0x92, 0x04, 0xc3, 0xbd, - 0xc6, 0x16, 0x9a, 0x9c, 0x42, 0x7e, 0xca, 0x6f, 0x24, 0x20, 0x75, 0xd9, 0x74, 0x31, 0x7a, 0x2c, - 0x90, 0x00, 0x8e, 0x74, 0xf2, 0xe7, 0x0d, 0xbd, 0x6e, 0xe0, 0xda, 0x8a, 0x53, 0x0f, 0xdc, 0xe7, - 0xf6, 0xdd, 0x29, 0x11, 0x72, 0xa7, 0x09, 0x48, 0xdb, 0x66, 0xcb, 0xa8, 0x89, 0x13, 0x87, 0xb4, - 0x81, 0x2a, 0x90, 0xf1, 0xbc, 0x24, 0x15, 0xe7, 0x25, 0xa3, 0xc4, 0x4b, 0x88, 0x0f, 0x73, 0x80, - 0x32, 0xb8, 0xcd, 0x9d, 0xa5, 0x0c, 0x59, 0x2f, 0x78, 0x71, 0x6f, 0xeb, 0xcf, 0x61, 0x7d, 0x32, - 0xb2, 0x98, 0x78, 0x63, 0xef, 0x19, 0x8f, 0x79, 0x5c, 0xde, 0x7b, 0xc0, 0xad, 0x17, 0x72, 0x2b, - 0x7e, 0xb7, 0x7c, 0x90, 0xea, 0xe5, 0xbb, 0x15, 0xbb, 0x5f, 0x7e, 0x12, 0xb2, 0x8e, 0x5e, 0x37, - 0x54, 0xb7, 0x65, 0x63, 0xee, 0x79, 0x3e, 0x40, 0xfe, 0xb2, 0x04, 0x03, 0xcc, 0x93, 0x03, 0x76, - 0x93, 0x3a, 0xdb, 0x2d, 0xd1, 0xcd, 0x6e, 0xc9, 0xc3, 0xdb, 0x6d, 0x0e, 0xc0, 0x13, 0xc6, 0xe1, - 0x77, 0x83, 0x3b, 0x64, 0x0c, 0x4c, 0xc4, 0x0d, 0xbd, 0xce, 0x27, 0x6a, 0x80, 0x48, 0xfe, 0x8f, - 0x12, 0x49, 0x62, 0xf9, 0x73, 0x34, 0x07, 0xc3, 0x42, 0xae, 0xea, 0x4e, 0x43, 0xad, 0x73, 0xdf, - 0xb9, 0xb3, 0xab, 0x70, 0x17, 0x1a, 0x6a, 0x5d, 0x19, 0xe2, 0xf2, 0x90, 0x46, 0xe7, 0x71, 0x48, - 0x74, 0x19, 0x87, 0xd0, 0xc0, 0x27, 0x0f, 0x37, 0xf0, 0xa1, 0x21, 0x4a, 0x45, 0x87, 0xe8, 0x0b, - 0x09, 0xba, 0x99, 0xb1, 0x4c, 0x47, 0x6d, 0xfc, 0x30, 0x66, 0xc4, 0x1d, 0x90, 0xb5, 0xcc, 0x46, - 0x95, 0x3d, 0x61, 0x27, 0x71, 0x33, 0x96, 0xd9, 0x50, 0xda, 0x86, 0x3d, 0x7d, 0x8b, 0xa6, 0xcb, - 0xc0, 0x2d, 0xb0, 0xda, 0x60, 0xd4, 0x6a, 0x36, 0xe4, 0x98, 0x29, 0xf8, 0x5a, 0xf6, 0x08, 0xb1, - 0x01, 0x5d, 0x1c, 0xa5, 0xf6, 0xb5, 0x97, 0x89, 0xcd, 0x30, 0x15, 0x8e, 0x47, 0x28, 0x58, 0xe8, - 0xef, 0xb4, 0x0b, 0x0e, 0xba, 0xa5, 0xc2, 0xf1, 0xe4, 0x9f, 0x97, 0x00, 0x96, 0x89, 0x65, 0xa9, - 0xbe, 0x64, 0x15, 0x72, 0xa8, 0x08, 0xd5, 0x50, 0xcf, 0x93, 0xdd, 0x06, 0x8d, 0xf7, 0x9f, 0x73, - 0x82, 0x72, 0xcf, 0xc3, 0xb0, 0xef, 0x8c, 0x0e, 0x16, 0xc2, 0x4c, 0xf6, 0xc8, 0xaa, 0x37, 0xb0, - 0xab, 0xe4, 0xae, 0x04, 0x5a, 0xf2, 0x3f, 0x97, 0x20, 0x4b, 0x65, 0x5a, 0xc1, 0xae, 0x1a, 0x1a, - 0x43, 0xe9, 0xf0, 0x63, 0x78, 0x27, 0x00, 0x63, 0xe3, 0xe8, 0x2f, 0x63, 0xee, 0x59, 0x59, 0x0a, - 0xd9, 0xd0, 0x5f, 0xc6, 0xe8, 0x9c, 0x67, 0xf0, 0x64, 0x6f, 0x83, 0x8b, 0xac, 0x9b, 0x9b, 0xfd, - 0x38, 0x0c, 0xd2, 0x4f, 0xe4, 0x5c, 0x73, 0x78, 0x22, 0x3d, 0x60, 0xb4, 0x9a, 0x9b, 0xd7, 0x1c, - 0xf9, 0x45, 0x18, 0xdc, 0xbc, 0xc6, 0x6a, 0x23, 0x77, 0x40, 0xd6, 0x36, 0x4d, 0xbe, 0x26, 0xb3, - 0x5c, 0x28, 0x43, 0x00, 0x74, 0x09, 0x12, 0xf5, 0x80, 0x84, 0x5f, 0x0f, 0xf0, 0x0b, 0x1a, 0xc9, - 0xbe, 0x0a, 0x1a, 0xa7, 0xff, 0x9d, 0x04, 0x43, 0x81, 0xf8, 0x80, 0x1e, 0x85, 0xa3, 0xe5, 0xe5, - 0xb5, 0xf9, 0x4b, 0xd5, 0xa5, 0x85, 0xea, 0x85, 0xe5, 0xb9, 0x45, 0xff, 0xae, 0x49, 0xf1, 0xd8, - 0xab, 0xd7, 0xa7, 0x51, 0x00, 0x77, 0xcb, 0xd8, 0x33, 0xcc, 0xab, 0x06, 0x9a, 0x85, 0x89, 0x30, - 0xc9, 0x5c, 0x79, 0xa3, 0xb2, 0xba, 0x99, 0x97, 0x8a, 0x47, 0x5f, 0xbd, 0x3e, 0x3d, 0x16, 0xa0, - 0x98, 0xdb, 0x76, 0xb0, 0xe1, 0xb6, 0x13, 0xcc, 0xaf, 0xad, 0xac, 0x2c, 0x6d, 0xe6, 0x13, 0x6d, - 0x04, 0x3c, 0x60, 0x3f, 0x00, 0x63, 0x61, 0x82, 0xd5, 0xa5, 0xe5, 0x7c, 0xb2, 0x88, 0x5e, 0xbd, - 0x3e, 0x3d, 0x12, 0xc0, 0x5e, 0xd5, 0x1b, 0xc5, 0xcc, 0xfb, 0x3f, 0x33, 0x79, 0xe4, 0x97, 0x7e, - 0x71, 0x52, 0x22, 0x9a, 0x0d, 0x87, 0x62, 0x04, 0x7a, 0x08, 0x8e, 0x6f, 0x2c, 0x2d, 0xae, 0x56, - 0x16, 0xaa, 0x2b, 0x1b, 0x8b, 0x55, 0xf6, 0x91, 0x0d, 0x4f, 0xbb, 0xd1, 0x57, 0xaf, 0x4f, 0x0f, - 0x71, 0x95, 0xba, 0x61, 0xaf, 0x2b, 0x95, 0xcb, 0x6b, 0x9b, 0x95, 0xbc, 0xc4, 0xb0, 0xd7, 0x6d, - 0x7c, 0xc5, 0x74, 0xd9, 0x37, 0xb4, 0x1e, 0x81, 0x13, 0x1d, 0xb0, 0x3d, 0xc5, 0xc6, 0x5e, 0xbd, - 0x3e, 0x3d, 0xbc, 0x6e, 0x63, 0x36, 0x7f, 0x28, 0xc5, 0x0c, 0x14, 0xda, 0x29, 0xd6, 0xd6, 0xd7, - 0x36, 0xe6, 0x96, 0xf3, 0xd3, 0xc5, 0xfc, 0xab, 0xd7, 0xa7, 0x73, 0x22, 0x18, 0x12, 0x7c, 0x5f, - 0xb3, 0xdb, 0xb9, 0xe3, 0xf9, 0xd3, 0x87, 0xe1, 0x1e, 0x5e, 0x12, 0x75, 0x5c, 0x75, 0x4f, 0x37, - 0xea, 0x5e, 0xe1, 0x99, 0xb7, 0xf9, 0xce, 0xe7, 0x18, 0xaf, 0x3d, 0x0b, 0x68, 0xcf, 0xf2, 0x73, - 0xb1, 0xfb, 0x9b, 0xa5, 0x62, 0x4c, 0x75, 0x35, 0x7e, 0xeb, 0xd4, 0xfd, 0x55, 0x45, 0x31, 0xa6, - 0x80, 0x5e, 0xec, 0xb9, 0xb9, 0x93, 0x3f, 0x20, 0xc1, 0xc8, 0x45, 0xdd, 0x71, 0x4d, 0x5b, 0xd7, - 0xd4, 0x06, 0xbd, 0x61, 0x72, 0xae, 0xdf, 0xd8, 0x1a, 0x99, 0xea, 0xcf, 0xc0, 0xc0, 0x15, 0xb5, - 0xc1, 0x82, 0x5a, 0x92, 0x7e, 0x11, 0xa3, 0xb3, 0xf9, 0xfc, 0xd0, 0x26, 0x18, 0x30, 0x32, 0xf9, - 0x57, 0x12, 0x30, 0x4a, 0x27, 0x83, 0xc3, 0x3e, 0x81, 0x44, 0xf6, 0x58, 0x65, 0x48, 0xd9, 0xaa, - 0xcb, 0x8b, 0x86, 0xe5, 0x19, 0x5e, 0x08, 0xbf, 0x2f, 0xbe, 0xb8, 0x3d, 0xb3, 0x80, 0x35, 0x85, - 0xd2, 0xa2, 0xb7, 0x43, 0xa6, 0xa9, 0x5e, 0xab, 0x52, 0x3e, 0x6c, 0xe7, 0x32, 0x77, 0x30, 0x3e, - 0x37, 0x6f, 0x4c, 0x8d, 0xee, 0xab, 0xcd, 0x46, 0x49, 0x16, 0x7c, 0x64, 0x65, 0xb0, 0xa9, 0x5e, - 0x23, 0x22, 0x22, 0x0b, 0x46, 0x09, 0x54, 0xdb, 0x55, 0x8d, 0x3a, 0x66, 0x9d, 0xd0, 0x12, 0x68, - 0xf9, 0xe2, 0x81, 0x3b, 0x39, 0xe6, 0x77, 0x12, 0x60, 0x27, 0x2b, 0xc3, 0x4d, 0xf5, 0xda, 0x3c, - 0x05, 0x90, 0x1e, 0x4b, 0x99, 0x8f, 0x7e, 0x6a, 0xea, 0x08, 0x7d, 0xb9, 0xf0, 0x0d, 0x09, 0xc0, - 0xb7, 0x18, 0x7a, 0x3b, 0xe4, 0x35, 0xaf, 0x45, 0x69, 0x1d, 0x3e, 0x86, 0xf7, 0x77, 0x1b, 0x8b, - 0x88, 0xbd, 0xd9, 0xda, 0xfc, 0xf5, 0x1b, 0x53, 0x92, 0x32, 0xaa, 0x45, 0x86, 0xe2, 0x6d, 0x30, - 0xd4, 0xb2, 0x6a, 0xaa, 0x8b, 0xab, 0x74, 0x1f, 0x97, 0x88, 0x5d, 0xe7, 0x27, 0x09, 0xaf, 0x9b, - 0x37, 0xa6, 0x10, 0x53, 0x2b, 0x40, 0x2c, 0xd3, 0xd5, 0x1f, 0x18, 0x84, 0x10, 0x04, 0x74, 0xfa, - 0xaa, 0x04, 0x43, 0x0b, 0x81, 0x93, 0x5e, 0x05, 0x18, 0x6c, 0x9a, 0x86, 0xbe, 0xc7, 0xfd, 0x31, - 0xab, 0x88, 0x26, 0x2a, 0x42, 0x86, 0x5d, 0xba, 0x73, 0xf7, 0x45, 0x29, 0x54, 0xb4, 0x09, 0xd5, - 0x55, 0xbc, 0xed, 0xe8, 0x62, 0x34, 0x14, 0xd1, 0x44, 0x17, 0x20, 0xef, 0x60, 0xad, 0x65, 0xeb, - 0xee, 0x7e, 0x55, 0x33, 0x0d, 0x57, 0xd5, 0x5c, 0x76, 0x7d, 0xab, 0x7c, 0xc7, 0xcd, 0x1b, 0x53, - 0xc7, 0x99, 0xac, 0x51, 0x0c, 0x59, 0x19, 0x15, 0xa0, 0x79, 0x06, 0x21, 0x3d, 0xd4, 0xb0, 0xab, - 0xea, 0x0d, 0xa7, 0xc0, 0xde, 0x93, 0x89, 0x66, 0x40, 0x97, 0xcf, 0x0f, 0x06, 0x0b, 0x5b, 0x17, - 0x20, 0x6f, 0x5a, 0xd8, 0x0e, 0x25, 0xa2, 0x52, 0xb4, 0xe7, 0x28, 0x86, 0xac, 0x8c, 0x0a, 0x90, - 0x48, 0x52, 0x5d, 0x32, 0xcc, 0x62, 0xa3, 0x68, 0xb5, 0xb6, 0xfd, 0x7a, 0xd8, 0x44, 0xdb, 0x68, - 0xcc, 0x19, 0xfb, 0xe5, 0xc7, 0x7c, 0xee, 0x51, 0x3a, 0xf9, 0x6b, 0x5f, 0x7c, 0x78, 0x82, 0xbb, - 0x86, 0x5f, 0x9f, 0xba, 0x84, 0xf7, 0xc9, 0xf0, 0x73, 0xd4, 0x75, 0x8a, 0x49, 0xd2, 0xce, 0x17, - 0x55, 0xbd, 0x21, 0xae, 0x21, 0x2b, 0xbc, 0x85, 0x4a, 0x30, 0xe0, 0xb8, 0xaa, 0xdb, 0x72, 0xf8, - 0x47, 0xbf, 0xe4, 0x6e, 0xae, 0x56, 0x36, 0x8d, 0xda, 0x06, 0xc5, 0x54, 0x38, 0x05, 0xba, 0x00, - 0x03, 0xae, 0xb9, 0x87, 0x0d, 0x6e, 0xc2, 0x03, 0xcd, 0x6f, 0xfa, 0xda, 0x8e, 0x51, 0x13, 0x8b, - 0xd4, 0x70, 0x03, 0xd7, 0x59, 0x5a, 0xb5, 0xab, 0x92, 0xdd, 0x07, 0xfd, 0xf6, 0x57, 0x79, 0xe9, - 0xc0, 0x93, 0x90, 0x5b, 0x2a, 0xca, 0x4f, 0x56, 0x46, 0x3d, 0xd0, 0x06, 0x85, 0xa0, 0x4b, 0xa1, - 0x23, 0x89, 0xfc, 0x03, 0x79, 0x77, 0x77, 0x53, 0x3f, 0xe0, 0xd3, 0xa2, 0x3e, 0x11, 0x3c, 0xd0, - 0x78, 0x01, 0xf2, 0x2d, 0x63, 0xdb, 0x34, 0xe8, 0x5d, 0x41, 0x9e, 0xdf, 0x93, 0xfd, 0x5d, 0x32, - 0xe8, 0x1c, 0x51, 0x0c, 0x59, 0x19, 0xf5, 0x40, 0x17, 0xd9, 0x2e, 0xa0, 0x06, 0x23, 0x3e, 0x16, - 0x9d, 0xa8, 0xd9, 0xd8, 0x89, 0x7a, 0x17, 0x9f, 0xa8, 0x47, 0xa3, 0xbd, 0xf8, 0x73, 0x75, 0xd8, - 0x03, 0x12, 0x32, 0x74, 0x11, 0xc0, 0x0f, 0x0f, 0xb4, 0x4e, 0x31, 0xd4, 0x7d, 0xe0, 0xfd, 0x18, - 0x23, 0xf6, 0x7b, 0x3e, 0x2d, 0x7a, 0x27, 0x8c, 0x37, 0x75, 0xa3, 0xea, 0xe0, 0xc6, 0x4e, 0x95, - 0x1b, 0x98, 0xb0, 0xa4, 0xdf, 0x7a, 0x29, 0x2f, 0x1f, 0xcc, 0x1f, 0x6e, 0xde, 0x98, 0x2a, 0xf2, - 0x10, 0xda, 0xce, 0x52, 0x56, 0xc6, 0x9a, 0xba, 0xb1, 0x81, 0x1b, 0x3b, 0x0b, 0x1e, 0xac, 0x94, - 0x7b, 0xff, 0xa7, 0xa6, 0x8e, 0xf0, 0xe9, 0x7a, 0x44, 0x3e, 0x47, 0x6b, 0xe7, 0x7c, 0x9a, 0x61, - 0x87, 0xec, 0x49, 0x54, 0xd1, 0xa0, 0x15, 0x8d, 0xac, 0xe2, 0x03, 0xd8, 0x34, 0x7f, 0xe5, 0x3f, - 0x4c, 0x4b, 0xf2, 0xe7, 0x25, 0x18, 0x58, 0xb8, 0xbc, 0xae, 0xea, 0x36, 0x5a, 0x82, 0x31, 0xdf, - 0x73, 0xc2, 0x93, 0xfc, 0xe4, 0xcd, 0x1b, 0x53, 0x85, 0xa8, 0x73, 0x79, 0xb3, 0xdc, 0x77, 0x60, - 0x31, 0xcd, 0x97, 0xba, 0x6d, 0x5c, 0x43, 0xac, 0xda, 0x50, 0xe4, 0xf6, 0x6d, 0x6d, 0x44, 0xcd, - 0x0a, 0x0c, 0x32, 0x69, 0x1d, 0x54, 0x82, 0xb4, 0x45, 0x7e, 0xf0, 0x17, 0x03, 0x93, 0x5d, 0x9d, - 0x97, 0xe2, 0x7b, 0x85, 0x4c, 0x42, 0x22, 0x7f, 0x38, 0x01, 0xb0, 0x70, 0xf9, 0xf2, 0xa6, 0xad, - 0x5b, 0x0d, 0xec, 0xde, 0x4a, 0xcd, 0x37, 0xe1, 0x68, 0x60, 0x97, 0x64, 0x6b, 0x11, 0xed, 0xa7, - 0x6f, 0xde, 0x98, 0x3a, 0x19, 0xd5, 0x3e, 0x80, 0x26, 0x2b, 0xe3, 0xfe, 0x7e, 0xc9, 0xd6, 0x3a, - 0x72, 0xad, 0x39, 0xae, 0xc7, 0x35, 0xd9, 0x9d, 0x6b, 0x00, 0x2d, 0xc8, 0x75, 0xc1, 0x71, 0x3b, - 0x9b, 0x76, 0x03, 0x86, 0x7c, 0x93, 0x38, 0x68, 0x01, 0x32, 0x2e, 0xff, 0xcd, 0x2d, 0x2c, 0x77, - 0xb7, 0xb0, 0x20, 0xe3, 0x56, 0xf6, 0x28, 0xe5, 0x3f, 0x97, 0x00, 0x7c, 0x9f, 0xfd, 0xf1, 0x74, - 0x31, 0x12, 0xca, 0x79, 0xe0, 0x4d, 0x1e, 0x2a, 0x55, 0xe3, 0xd4, 0x11, 0x7b, 0xfe, 0x74, 0x02, - 0xc6, 0xb7, 0x44, 0xe4, 0xf9, 0xb1, 0xb7, 0xc1, 0x3a, 0x0c, 0x62, 0xc3, 0xb5, 0x75, 0x6a, 0x04, - 0x32, 0xda, 0x8f, 0x74, 0x1b, 0xed, 0x0e, 0x3a, 0xd1, 0x8f, 0xdd, 0x88, 0xa2, 0x3b, 0x67, 0x13, - 0xb1, 0xc6, 0x07, 0x93, 0x50, 0xe8, 0x46, 0x89, 0xe6, 0x61, 0x54, 0xb3, 0x31, 0x05, 0x54, 0x83, - 0x95, 0xbf, 0x72, 0xd1, 0xcf, 0x2c, 0x23, 0x08, 0xb2, 0x32, 0x22, 0x20, 0x7c, 0xf5, 0xa8, 0x03, - 0x49, 0xfb, 0x88, 0xdb, 0x11, 0xac, 0x3e, 0xf3, 0x3c, 0x99, 0x2f, 0x1f, 0xa2, 0x93, 0x30, 0x03, - 0xb6, 0x7e, 0x8c, 0xf8, 0x50, 0xba, 0x80, 0xbc, 0x04, 0xa3, 0xba, 0xa1, 0xbb, 0xba, 0xda, 0xa8, - 0x6e, 0xab, 0x0d, 0xd5, 0xd0, 0x0e, 0x93, 0x35, 0xb3, 0x90, 0xcf, 0xbb, 0x8d, 0xb0, 0x93, 0x95, - 0x11, 0x0e, 0x29, 0x33, 0x00, 0xba, 0x08, 0x83, 0xa2, 0xab, 0xd4, 0xa1, 0xb2, 0x0d, 0x41, 0x1e, - 0x48, 0xf0, 0x7e, 0x26, 0x09, 0x63, 0x0a, 0xae, 0xfd, 0xff, 0xa1, 0x38, 0xd8, 0x50, 0xac, 0x00, - 0xb0, 0xe9, 0x4e, 0x02, 0xec, 0x21, 0x46, 0x83, 0x04, 0x8c, 0x2c, 0xe3, 0xb0, 0xe0, 0xb8, 0x81, - 0xf1, 0xb8, 0x91, 0x80, 0x5c, 0x70, 0x3c, 0xfe, 0x92, 0xae, 0x4a, 0x68, 0xc9, 0x8f, 0x44, 0x29, - 0xfe, 0x8d, 0xd0, 0x2e, 0x91, 0xa8, 0xcd, 0x7b, 0x7b, 0x87, 0xa0, 0xff, 0x91, 0x80, 0x81, 0x75, - 0xd5, 0x56, 0x9b, 0x0e, 0xd2, 0xda, 0x32, 0x4d, 0x51, 0x7e, 0x6c, 0xfb, 0xc0, 0x33, 0xaf, 0x76, - 0xc4, 0x24, 0x9a, 0x1f, 0xed, 0x90, 0x68, 0xfe, 0x04, 0x8c, 0x90, 0xed, 0x70, 0xe0, 0x08, 0x03, - 0xb1, 0xf6, 0x70, 0xf9, 0x84, 0xcf, 0x25, 0xfc, 0x9c, 0xed, 0x96, 0x2f, 0x07, 0xcf, 0x30, 0x0c, - 0x11, 0x0c, 0x3f, 0x30, 0x13, 0xf2, 0x63, 0xfe, 0xb6, 0x34, 0xf0, 0x50, 0x56, 0xa0, 0xa9, 0x5e, - 0xab, 0xb0, 0x06, 0x5a, 0x06, 0xb4, 0xeb, 0x55, 0x46, 0xaa, 0xbe, 0x39, 0x09, 0xfd, 0x9d, 0x37, - 0x6f, 0x4c, 0x9d, 0x60, 0xf4, 0xed, 0x38, 0xb2, 0x32, 0xe6, 0x03, 0x05, 0xb7, 0xc7, 0x01, 0x88, - 0x5e, 0x55, 0x76, 0x9a, 0x90, 0x6d, 0x77, 0x8e, 0xde, 0xbc, 0x31, 0x35, 0xc6, 0xb8, 0xf8, 0xcf, - 0x64, 0x25, 0x4b, 0x1a, 0x0b, 0xe4, 0x77, 0xc0, 0xb3, 0x3f, 0x23, 0x01, 0xf2, 0x43, 0xbe, 0x82, - 0x1d, 0x8b, 0xec, 0xcf, 0x48, 0x22, 0x1e, 0xc8, 0x9a, 0xa5, 0xde, 0x89, 0xb8, 0x4f, 0x2f, 0x12, - 0xf1, 0xc0, 0x4c, 0x79, 0xca, 0x0f, 0x8f, 0x09, 0x3e, 0x8e, 0x1d, 0x8e, 0x5e, 0xce, 0xcc, 0x9b, - 0xba, 0xa0, 0x6e, 0x8b, 0x87, 0x47, 0xe4, 0x7f, 0x25, 0xc1, 0x89, 0x36, 0x8f, 0xf2, 0x84, 0xfd, - 0x2b, 0x80, 0xec, 0xc0, 0x43, 0xfe, 0xbd, 0x37, 0x26, 0xf4, 0x81, 0x1d, 0x74, 0xcc, 0x6e, 0x8b, - 0xbb, 0xb7, 0x2e, 0xc2, 0xb3, 0xb3, 0x9b, 0xff, 0x4c, 0x82, 0x89, 0x60, 0xf7, 0x9e, 0x22, 0xab, - 0x90, 0x0b, 0xf6, 0xce, 0x55, 0xb8, 0xa7, 0x1f, 0x15, 0xb8, 0xf4, 0x21, 0x7a, 0xf4, 0x9c, 0x3f, - 0x5d, 0x59, 0xed, 0xec, 0xd1, 0xbe, 0xad, 0x21, 0x64, 0x8a, 0x4e, 0xdb, 0x14, 0x1d, 0x8f, 0xff, - 0x23, 0x41, 0x6a, 0xdd, 0x34, 0x1b, 0xc8, 0x84, 0x31, 0xc3, 0x74, 0xab, 0xc4, 0xb3, 0x70, 0xad, - 0xca, 0x37, 0xdd, 0x2c, 0x0e, 0xce, 0x1f, 0xcc, 0x48, 0xdf, 0xbe, 0x31, 0xd5, 0xce, 0x4a, 0x19, - 0x35, 0x4c, 0xb7, 0x4c, 0x21, 0x9b, 0x6c, 0x4b, 0xfe, 0x4e, 0x18, 0x0e, 0x77, 0xc6, 0xa2, 0xe4, - 0xf3, 0x07, 0xee, 0x2c, 0xcc, 0xe6, 0xe6, 0x8d, 0xa9, 0x09, 0x7f, 0xc6, 0x78, 0x60, 0x59, 0xc9, - 0x6d, 0x07, 0x7a, 0x67, 0xc7, 0xbb, 0xbe, 0xfb, 0xa9, 0x29, 0xe9, 0xf4, 0x97, 0x24, 0x00, 0xbf, - 0xf2, 0x80, 0x1e, 0x82, 0xe3, 0xe5, 0xb5, 0xd5, 0x85, 0xea, 0xc6, 0xe6, 0xdc, 0xe6, 0xd6, 0x46, - 0x75, 0x6b, 0x75, 0x63, 0xbd, 0x32, 0xbf, 0x74, 0x61, 0xa9, 0xb2, 0xe0, 0x97, 0xc7, 0x1d, 0x0b, - 0x6b, 0xfa, 0x8e, 0x8e, 0x6b, 0xe8, 0x3e, 0x98, 0x08, 0x63, 0x93, 0x56, 0x65, 0x21, 0x2f, 0x15, - 0x73, 0xaf, 0x5e, 0x9f, 0xce, 0xb0, 0x5c, 0x0c, 0xd7, 0xd0, 0x29, 0x38, 0xda, 0x8e, 0xb7, 0xb4, - 0xba, 0x98, 0x4f, 0x14, 0x87, 0x5f, 0xbd, 0x3e, 0x9d, 0xf5, 0x92, 0x36, 0x24, 0x03, 0x0a, 0x62, - 0x72, 0x7e, 0xc9, 0x22, 0xbc, 0x7a, 0x7d, 0x7a, 0x80, 0x19, 0xb0, 0x98, 0x7a, 0xff, 0x67, 0x26, - 0x8f, 0x94, 0x2f, 0x74, 0x2d, 0x80, 0x3f, 0xd4, 0xd3, 0x76, 0xd7, 0xbc, 0xa2, 0x76, 0xb8, 0xea, - 0xfd, 0xea, 0x71, 0x98, 0xea, 0x52, 0xf5, 0x76, 0xaf, 0xc5, 0x14, 0xbc, 0x7b, 0x94, 0xb6, 0x63, - 0x4b, 0xd7, 0x5d, 0x8a, 0xe5, 0x87, 0x2f, 0x68, 0xf7, 0x55, 0xbb, 0x97, 0xff, 0x75, 0x0a, 0xd0, - 0x8a, 0x53, 0x9f, 0x27, 0x49, 0x55, 0xe0, 0x88, 0x56, 0xa4, 0x66, 0x23, 0xfd, 0x40, 0x35, 0x9b, - 0x95, 0x50, 0x15, 0x24, 0x71, 0xb0, 0x4a, 0x6b, 0xdf, 0xa5, 0x90, 0xe4, 0x0f, 0xa5, 0x14, 0xd2, - 0x39, 0x53, 0x4a, 0xdd, 0xba, 0x2d, 0x55, 0xfa, 0xb0, 0xdb, 0x4a, 0x5e, 0xe1, 0x1c, 0xe8, 0x51, - 0xe1, 0x2c, 0x74, 0x2d, 0x63, 0x72, 0x6a, 0x74, 0x56, 0x5c, 0xc9, 0x19, 0xec, 0x6f, 0x6d, 0xe3, - 0x77, 0x76, 0x32, 0xef, 0x17, 0x2b, 0xdb, 0x49, 0x28, 0xb6, 0xbb, 0x93, 0x08, 0xbe, 0xf2, 0x47, - 0x92, 0x90, 0x5f, 0x71, 0xea, 0x95, 0x9a, 0xee, 0xde, 0x26, 0x5f, 0x7b, 0xa6, 0xfb, 0x36, 0x15, - 0xdd, 0xbc, 0x31, 0x35, 0xc2, 0x6c, 0xda, 0xc3, 0x92, 0x4d, 0x18, 0x8d, 0xbc, 0x1c, 0xe0, 0x9e, - 0xb5, 0x70, 0x98, 0x77, 0x14, 0x11, 0x56, 0x32, 0xdd, 0x55, 0x04, 0xfc, 0x1b, 0x5d, 0xeb, 0xec, - 0xcc, 0xcc, 0xa1, 0x2e, 0xde, 0xce, 0x9a, 0x9e, 0x3f, 0x66, 0x45, 0x28, 0x44, 0x07, 0xc5, 0x1b, - 0xb1, 0x3f, 0x92, 0x60, 0x68, 0xc5, 0x11, 0xbb, 0x68, 0xfc, 0x63, 0x5a, 0x51, 0x78, 0xc2, 0xbb, - 0x68, 0x92, 0xec, 0xcf, 0x6f, 0xc5, 0xe5, 0x13, 0xdf, 0x08, 0x47, 0x61, 0x3c, 0xa0, 0xa7, 0xa7, - 0xff, 0xef, 0x24, 0x68, 0x7c, 0x2c, 0xe3, 0xba, 0x6e, 0x78, 0x49, 0x05, 0xfe, 0xcb, 0xba, 0x5f, - 0xf2, 0xed, 0x9c, 0x3a, 0xac, 0x9d, 0xf7, 0x68, 0x80, 0x88, 0xd8, 0xd3, 0xcb, 0x18, 0x57, 0xda, - 0x77, 0xf3, 0xd2, 0x01, 0x0e, 0xca, 0x44, 0xf6, 0xec, 0xf2, 0x1b, 0x12, 0x0c, 0xaf, 0x38, 0xf5, - 0x2d, 0xa3, 0xf6, 0xff, 0xbc, 0xff, 0xee, 0xc0, 0xd1, 0x90, 0xa6, 0xb7, 0xc9, 0xa4, 0x67, 0x5e, - 0x4b, 0x41, 0x72, 0xc5, 0xa9, 0xa3, 0x97, 0x60, 0x34, 0x9a, 0x34, 0x9c, 0xee, 0x16, 0xb3, 0xdb, - 0x57, 0x84, 0xe2, 0x99, 0xfe, 0x71, 0x3d, 0x4d, 0xf6, 0x60, 0x38, 0xbc, 0x72, 0x9c, 0xea, 0xc1, - 0x24, 0x84, 0x59, 0x7c, 0xa4, 0x5f, 0x4c, 0xaf, 0xb3, 0xb7, 0x43, 0xc6, 0x0b, 0x7a, 0x77, 0xf7, - 0xa0, 0x16, 0x48, 0xc5, 0x07, 0xfb, 0x40, 0xf2, 0xb8, 0xbf, 0x04, 0xa3, 0xd1, 0x90, 0xd2, 0xcb, - 0x7a, 0x11, 0xdc, 0x9e, 0xd6, 0xeb, 0x36, 0xb5, 0xb6, 0x01, 0x02, 0xf3, 0xe0, 0xde, 0x1e, 0x1c, - 0x7c, 0xb4, 0xe2, 0xc3, 0x7d, 0xa1, 0x79, 0x9b, 0xab, 0x5b, 0x9d, 0x8c, 0xff, 0x8b, 0x04, 0x9c, - 0x0e, 0xa6, 0xb9, 0x2f, 0xb5, 0xb0, 0xbd, 0xef, 0x65, 0xb2, 0x96, 0x5a, 0xd7, 0x8d, 0xe0, 0xed, - 0xbb, 0x13, 0xc1, 0x59, 0x43, 0x71, 0x85, 0xbc, 0xb2, 0x01, 0x43, 0xeb, 0x6a, 0x1d, 0x2b, 0xf8, - 0xa5, 0x16, 0x76, 0xdc, 0x0e, 0xb7, 0xbf, 0x8e, 0xc1, 0x80, 0xb9, 0xb3, 0x23, 0xce, 0x9a, 0xa5, - 0x14, 0xde, 0x42, 0x13, 0x90, 0x6e, 0xe8, 0x4d, 0x9d, 0xcd, 0xcc, 0x94, 0xc2, 0x1a, 0x68, 0x0a, - 0x86, 0x34, 0x32, 0x01, 0xab, 0xec, 0xdc, 0x7c, 0x4a, 0x7c, 0x99, 0xa9, 0x65, 0xb8, 0x9b, 0x04, - 0x22, 0x3f, 0x03, 0x39, 0xd6, 0x1f, 0xb7, 0xfe, 0x09, 0xc8, 0xd0, 0x73, 0xce, 0x7e, 0xaf, 0x83, - 0xa4, 0x7d, 0x89, 0xdd, 0x14, 0x63, 0x5c, 0x58, 0xc7, 0xac, 0x51, 0x2e, 0x77, 0x35, 0xe5, 0xa9, - 0xf8, 0x8c, 0x80, 0x19, 0xca, 0x33, 0xe3, 0x6f, 0xa5, 0xe1, 0x28, 0xdf, 0x7f, 0xa8, 0x96, 0x3e, - 0xbb, 0xeb, 0xba, 0xe2, 0x36, 0x33, 0xf0, 0x10, 0xa0, 0x5a, 0xba, 0xbc, 0x0f, 0xa9, 0x8b, 0xae, - 0x6b, 0xa1, 0xd3, 0x90, 0xb6, 0x5b, 0x0d, 0x2c, 0x5e, 0xc5, 0x78, 0xa9, 0xa4, 0x6a, 0xe9, 0x33, - 0x04, 0x41, 0x69, 0x35, 0xb0, 0xc2, 0x50, 0x50, 0x05, 0xa6, 0x76, 0x5a, 0x8d, 0xc6, 0x7e, 0xb5, - 0x86, 0xe9, 0x3f, 0xcb, 0xf3, 0xfe, 0x2f, 0x0d, 0xbe, 0x66, 0xa9, 0x86, 0x97, 0xef, 0x67, 0x94, - 0x93, 0x14, 0x6d, 0x81, 0x62, 0x89, 0xff, 0x49, 0x53, 0x11, 0x38, 0xf2, 0xef, 0x27, 0x20, 0x23, - 0x58, 0xd3, 0xab, 0x5b, 0xb8, 0x81, 0x35, 0xd7, 0x14, 0x47, 0x19, 0xbc, 0x36, 0x42, 0x90, 0xac, - 0xf3, 0x21, 0xca, 0x5e, 0x3c, 0xa2, 0x90, 0x06, 0x81, 0x79, 0x17, 0xea, 0x08, 0xcc, 0x6a, 0x91, - 0x51, 0x4b, 0x59, 0xa6, 0xa8, 0x99, 0x5e, 0x3c, 0xa2, 0xd0, 0x16, 0x2a, 0xc0, 0x00, 0x71, 0x59, - 0x97, 0x7d, 0x31, 0x98, 0xc0, 0x79, 0x1b, 0x1d, 0x83, 0xb4, 0xa5, 0xba, 0x1a, 0x3b, 0xeb, 0x4e, - 0x1e, 0xb0, 0x26, 0x09, 0xcc, 0xec, 0x4b, 0x0d, 0xd1, 0xff, 0x44, 0x45, 0x8c, 0xc1, 0x3e, 0x89, - 0x49, 0xe4, 0x5e, 0x57, 0x5d, 0x17, 0xdb, 0x06, 0x61, 0xc8, 0xd0, 0x11, 0x82, 0xd4, 0xb6, 0x59, - 0xdb, 0xe7, 0xff, 0x1d, 0x8b, 0xfe, 0xe6, 0xff, 0xb7, 0x87, 0xfa, 0x43, 0x95, 0x3e, 0x64, 0xff, - 0x14, 0x30, 0x27, 0x80, 0x65, 0x82, 0x54, 0x81, 0x71, 0xb5, 0x56, 0xd3, 0x89, 0x57, 0xab, 0x8d, - 0xea, 0xb6, 0x4e, 0xf7, 0xc3, 0x0e, 0xfd, 0x97, 0x8f, 0xdd, 0xc6, 0x02, 0xf9, 0x04, 0x65, 0x8e, - 0x5f, 0xce, 0xc2, 0xa0, 0xc5, 0x84, 0x92, 0xcf, 0xc3, 0x58, 0x9b, 0xa4, 0x44, 0xbe, 0x3d, 0xdd, - 0xa8, 0x89, 0x5b, 0x86, 0xe4, 0x37, 0x81, 0xd1, 0xcf, 0xda, 0xb2, 0x43, 0x22, 0xf4, 0x77, 0xf9, - 0xdd, 0xdd, 0xef, 0xa0, 0x8e, 0x04, 0xee, 0xa0, 0xaa, 0x96, 0x5e, 0xce, 0x52, 0xfe, 0xfc, 0xea, - 0xe9, 0x1c, 0x7f, 0xc0, 0xae, 0x9d, 0xce, 0x98, 0x76, 0x7d, 0xb6, 0x8e, 0x0d, 0xb1, 0xbf, 0x25, - 0x8f, 0x54, 0x4b, 0x77, 0xa8, 0x3b, 0xfa, 0x9f, 0xd9, 0x75, 0xce, 0x07, 0x7e, 0xd3, 0x1b, 0xa9, - 0xa9, 0xc5, 0xb9, 0xf5, 0x25, 0xcf, 0x8f, 0x7f, 0x33, 0x01, 0x27, 0x03, 0x7e, 0x1c, 0x40, 0x6e, - 0x77, 0xe7, 0x62, 0x67, 0x8f, 0xef, 0xe3, 0x92, 0xfa, 0x25, 0x48, 0x11, 0x7c, 0x14, 0xf3, 0x5f, - 0x75, 0x0a, 0xbf, 0xfa, 0xb5, 0x7f, 0x2a, 0x87, 0x37, 0x5b, 0xa1, 0x51, 0xa1, 0x4c, 0xca, 0xef, - 0xeb, 0xdf, 0x7e, 0x79, 0xff, 0x0b, 0xc3, 0xce, 0xad, 0x33, 0x63, 0xd4, 0x86, 0xdf, 0x3a, 0x0b, - 0x72, 0x97, 0xca, 0x00, 0x8b, 0x98, 0xbd, 0x4b, 0x1c, 0x07, 0x08, 0xc7, 0xdd, 0x2e, 0xe6, 0xf5, - 0x1a, 0xc1, 0x3e, 0xab, 0x16, 0xd7, 0xe0, 0xd8, 0x73, 0xa4, 0x6f, 0xbf, 0x7e, 0x2d, 0x02, 0xfb, - 0x31, 0xef, 0x98, 0x8d, 0xc4, 0xff, 0xe3, 0xa6, 0x38, 0x42, 0x03, 0xbe, 0x7c, 0xbc, 0x06, 0x71, - 0xdf, 0x4c, 0xd7, 0xf5, 0x62, 0x26, 0xb0, 0x58, 0x28, 0x01, 0x4a, 0xf9, 0x97, 0x25, 0x38, 0xde, - 0xd6, 0x35, 0x8f, 0xf1, 0x8b, 0x1d, 0xee, 0x10, 0xf6, 0x7d, 0xba, 0x2f, 0x78, 0x9f, 0x70, 0xb1, - 0x83, 0xb0, 0xf7, 0xc7, 0x0a, 0xcb, 0xa4, 0x08, 0x49, 0xfb, 0x34, 0x1c, 0x0d, 0x0b, 0x2b, 0xcc, - 0x74, 0x2f, 0x8c, 0x84, 0x13, 0x53, 0x6e, 0xae, 0xe1, 0x50, 0x6a, 0x2a, 0x57, 0xa3, 0x76, 0xf6, - 0x74, 0xad, 0x40, 0xd6, 0x43, 0xe5, 0xf9, 0x64, 0xdf, 0xaa, 0xfa, 0x94, 0xf2, 0x87, 0x25, 0x98, - 0x0e, 0xf7, 0xe0, 0xef, 0x50, 0x9d, 0x83, 0x09, 0x7b, 0xcb, 0x86, 0xf8, 0x0d, 0x09, 0xee, 0xea, - 0x21, 0x13, 0x37, 0xc0, 0xcb, 0x30, 0x11, 0x28, 0xd1, 0x8b, 0x10, 0x2e, 0x86, 0xfd, 0x74, 0xfc, - 0xbb, 0x05, 0x2f, 0x69, 0xba, 0x83, 0x18, 0xe5, 0x73, 0x7f, 0x30, 0x35, 0xde, 0xfe, 0xcc, 0x51, - 0xc6, 0xdb, 0xcb, 0xea, 0xb7, 0xd0, 0x3f, 0x5e, 0x93, 0xe0, 0x81, 0xb0, 0xaa, 0x1d, 0xde, 0x9b, - 0xff, 0xa8, 0xc6, 0xe1, 0xdf, 0x4b, 0x70, 0xba, 0x1f, 0xe1, 0xbc, 0xfc, 0x76, 0xdc, 0x7f, 0x51, - 0x16, 0x1d, 0x8f, 0x07, 0x0f, 0x70, 0xc2, 0x80, 0x7b, 0x29, 0xf2, 0xb8, 0xdd, 0x06, 0xc3, 0x5b, - 0x7c, 0x62, 0x05, 0x87, 0xdc, 0x33, 0x72, 0x78, 0xf7, 0x29, 0x8c, 0x1c, 0xda, 0x7f, 0x76, 0x18, - 0x8b, 0x44, 0x87, 0xb1, 0x08, 0xec, 0x0f, 0xaf, 0xf0, 0xb8, 0xd5, 0xe1, 0xe5, 0xd8, 0xdb, 0x60, - 0xbc, 0x83, 0x2b, 0xf3, 0x59, 0x7d, 0x00, 0x4f, 0x56, 0x50, 0xbb, 0xb3, 0xca, 0xfb, 0x30, 0x45, - 0xfb, 0xed, 0x60, 0xe8, 0xdb, 0xad, 0x72, 0x93, 0xc7, 0x96, 0x8e, 0x5d, 0x73, 0xdd, 0x97, 0x60, - 0x80, 0x8d, 0x33, 0x57, 0xf7, 0x10, 0x8e, 0xc2, 0x19, 0xc8, 0x1f, 0x17, 0xb1, 0x6c, 0x41, 0x88, - 0xdd, 0x79, 0x0e, 0xf5, 0xa3, 0xeb, 0x2d, 0x9a, 0x43, 0x01, 0x63, 0x7c, 0x43, 0x44, 0xb5, 0xce, - 0xd2, 0x71, 0x73, 0x68, 0xb7, 0x2c, 0xaa, 0x31, 0xdb, 0xdc, 0xde, 0xf0, 0xf5, 0x8b, 0x22, 0x7c, - 0x79, 0x3a, 0xc5, 0x84, 0xaf, 0x1f, 0x8d, 0xe9, 0xbd, 0x40, 0x16, 0x23, 0xe6, 0x5f, 0xc4, 0x40, - 0xf6, 0x5d, 0x09, 0x4e, 0x50, 0xdd, 0x82, 0x6f, 0x5c, 0x0f, 0x6a, 0xf2, 0x87, 0x00, 0x39, 0xb6, - 0x56, 0xed, 0x38, 0xbb, 0xf3, 0x8e, 0xad, 0x5d, 0x0e, 0xad, 0x2f, 0x0f, 0x01, 0xaa, 0x39, 0x6e, - 0x14, 0x9b, 0x1d, 0x5f, 0xcf, 0xd7, 0x1c, 0xf7, 0x72, 0x8f, 0xd5, 0x28, 0x75, 0x0b, 0x86, 0xf3, - 0xeb, 0x12, 0x14, 0x3b, 0xa9, 0xcc, 0x87, 0x4f, 0x87, 0x63, 0xa1, 0xb7, 0xf7, 0xd1, 0x11, 0x7c, - 0xa8, 0x9f, 0x77, 0xd6, 0x91, 0x69, 0x74, 0xd4, 0xc6, 0xb7, 0x3b, 0x0f, 0x98, 0x0a, 0x7b, 0x68, - 0x7b, 0x66, 0xfd, 0x23, 0x9b, 0x3e, 0x5f, 0x6c, 0x8b, 0xab, 0x7f, 0x21, 0x72, 0xef, 0x6b, 0x30, - 0xd9, 0x45, 0xea, 0xdb, 0xbd, 0xee, 0xed, 0x76, 0x1d, 0xcc, 0x5b, 0x9d, 0xbe, 0x3f, 0xce, 0x67, - 0x42, 0xf8, 0x6a, 0x54, 0x60, 0x2f, 0xd6, 0xe9, 0x6e, 0xb5, 0xfc, 0x16, 0xb8, 0xa3, 0x23, 0x15, - 0x97, 0xad, 0x04, 0xa9, 0x5d, 0xdd, 0x71, 0xb9, 0x58, 0xf7, 0x75, 0x13, 0x2b, 0x42, 0x4d, 0x69, - 0x64, 0x04, 0x79, 0xca, 0x7a, 0xdd, 0x34, 0x1b, 0x5c, 0x0c, 0xf9, 0x12, 0x8c, 0x05, 0x60, 0xbc, - 0x93, 0x73, 0x90, 0xb2, 0x4c, 0xfe, 0xdd, 0xa0, 0xa1, 0x33, 0x27, 0xbb, 0x75, 0x42, 0x68, 0xb8, - 0xda, 0x14, 0x5f, 0x9e, 0x00, 0xc4, 0x98, 0xd1, 0xc3, 0x5d, 0xa2, 0x8b, 0x0d, 0x18, 0x0f, 0x41, - 0x79, 0x27, 0x6f, 0x82, 0x01, 0x8b, 0x42, 0xbc, 0x4b, 0xb0, 0xdd, 0xba, 0xa1, 0x58, 0xde, 0x97, - 0x58, 0x68, 0xeb, 0xcc, 0xb7, 0x8f, 0x42, 0x9a, 0x72, 0x45, 0x1f, 0x93, 0x00, 0x02, 0x47, 0xb5, - 0x66, 0xba, 0xb1, 0xe9, 0xbc, 0x27, 0x2e, 0xce, 0xf6, 0x8d, 0xcf, 0x73, 0xb6, 0xd3, 0xef, 0xfe, - 0x37, 0xdf, 0xfa, 0x48, 0xe2, 0x1e, 0x24, 0xcf, 0x76, 0xd9, 0x8d, 0x07, 0xe6, 0xcb, 0x67, 0x43, - 0x1f, 0xa5, 0x79, 0xb8, 0xbf, 0xae, 0x84, 0x64, 0x33, 0xfd, 0xa2, 0x73, 0xc1, 0xce, 0x53, 0xc1, - 0xce, 0xa2, 0xc7, 0xe2, 0x05, 0x9b, 0x7d, 0x47, 0x78, 0xd2, 0xbc, 0x0b, 0xfd, 0xae, 0x04, 0x13, - 0x9d, 0xb6, 0x74, 0xe8, 0xc9, 0xfe, 0xa4, 0x68, 0x4f, 0x29, 0x8a, 0x4f, 0x1d, 0x82, 0x92, 0xab, - 0xb2, 0x48, 0x55, 0x99, 0x43, 0xcf, 0x1c, 0x42, 0x95, 0xd9, 0xc0, 0xba, 0x83, 0xfe, 0x97, 0x04, - 0x77, 0xf6, 0xdc, 0x21, 0xa1, 0xb9, 0xfe, 0xa4, 0xec, 0x91, 0x3b, 0x15, 0xcb, 0x3f, 0x08, 0x0b, - 0xae, 0xf1, 0x73, 0x54, 0xe3, 0x4b, 0x68, 0xe9, 0x30, 0x1a, 0xfb, 0x19, 0x51, 0x50, 0xf7, 0xdf, - 0x0e, 0x1f, 0xf9, 0xef, 0xed, 0x4e, 0x6d, 0x1b, 0x8f, 0x98, 0x89, 0xd1, 0x9e, 0xd4, 0xca, 0x2f, - 0x50, 0x15, 0x14, 0xb4, 0xfe, 0x03, 0x0e, 0xda, 0xec, 0x3b, 0xc2, 0x81, 0xff, 0x5d, 0xe8, 0x7f, - 0x4a, 0x9d, 0x4f, 0xf0, 0x3f, 0xd1, 0x53, 0xc4, 0xee, 0x9b, 0xaa, 0xe2, 0x93, 0x07, 0x27, 0xe4, - 0x4a, 0x36, 0xa9, 0x92, 0x75, 0x84, 0x6f, 0xb5, 0x92, 0x1d, 0x07, 0x11, 0x7d, 0x55, 0x82, 0x89, - 0x4e, 0x7b, 0x92, 0x98, 0x69, 0xd9, 0x63, 0x93, 0x15, 0x33, 0x2d, 0x7b, 0x6d, 0x80, 0xe4, 0x37, - 0x51, 0xe5, 0xcf, 0xa1, 0xc7, 0xbb, 0x29, 0xdf, 0x73, 0x14, 0xc9, 0x5c, 0xec, 0x99, 0xe4, 0xc7, - 0xcc, 0xc5, 0x7e, 0xf6, 0x31, 0x31, 0x73, 0xb1, 0xaf, 0x3d, 0x46, 0xfc, 0x5c, 0xf4, 0x34, 0xeb, - 0x73, 0x18, 0x1d, 0xf4, 0x9b, 0x12, 0x0c, 0x87, 0x32, 0x62, 0xf4, 0x68, 0x4f, 0x41, 0x3b, 0x6d, - 0x18, 0xba, 0xbf, 0xd8, 0xec, 0x9e, 0x70, 0xcb, 0x4b, 0x54, 0x97, 0x79, 0x34, 0x77, 0x18, 0x5d, - 0xec, 0x90, 0xc4, 0x5f, 0x97, 0x60, 0xbc, 0x43, 0x96, 0x19, 0x33, 0x0b, 0xbb, 0x27, 0xcd, 0xc5, - 0x27, 0x0f, 0x4e, 0xc8, 0xb5, 0xba, 0x40, 0xb5, 0xfa, 0x09, 0xf4, 0xf4, 0x61, 0xb4, 0x0a, 0xac, - 0xcf, 0x37, 0xfc, 0x03, 0xd1, 0x81, 0x7e, 0xd0, 0xb9, 0x03, 0x0a, 0x26, 0x14, 0x7a, 0xe2, 0xc0, - 0x74, 0x5c, 0x9f, 0xe7, 0xa9, 0x3e, 0xcf, 0xa1, 0xb5, 0x1f, 0x4c, 0x9f, 0xf6, 0x65, 0xfd, 0x0b, - 0xed, 0x57, 0xf3, 0x7b, 0x7b, 0x51, 0xc7, 0x64, 0xb5, 0xf8, 0xd8, 0x81, 0x68, 0xb8, 0x52, 0x4f, - 0x52, 0xa5, 0xce, 0xa0, 0x47, 0xba, 0x29, 0x15, 0x38, 0xf5, 0xae, 0x1b, 0x3b, 0xe6, 0xec, 0x3b, - 0x58, 0x0a, 0xfc, 0x2e, 0xf4, 0x53, 0xe2, 0xc4, 0xf1, 0xa9, 0x9e, 0xfd, 0x06, 0xf2, 0xd8, 0xe2, - 0x03, 0x7d, 0x60, 0x72, 0xb9, 0xee, 0xa1, 0x72, 0x4d, 0xa2, 0x93, 0xdd, 0xe4, 0x22, 0xb9, 0x2c, - 0xfa, 0x80, 0xe4, 0x5d, 0x52, 0x38, 0xdd, 0x9b, 0x77, 0x30, 0xd9, 0xed, 0x7e, 0xd0, 0xa1, 0x43, - 0x0a, 0x2c, 0xdf, 0x47, 0x25, 0x99, 0x46, 0x93, 0x5d, 0x25, 0x61, 0xa9, 0xef, 0xad, 0x3e, 0x39, - 0xf0, 0x27, 0x83, 0x5d, 0x3f, 0x5e, 0x51, 0xc7, 0x06, 0x76, 0x74, 0xe7, 0x50, 0x1f, 0xaf, 0xe8, - 0xef, 0xf5, 0xd4, 0xef, 0xa6, 0x21, 0xb7, 0xc8, 0x7a, 0xd9, 0x70, 0x55, 0xf7, 0x07, 0xdc, 0x08, - 0x20, 0x87, 0x7f, 0x93, 0x8d, 0x7d, 0x2a, 0xd2, 0xff, 0xf8, 0x61, 0xee, 0x40, 0xd7, 0xb6, 0xd9, - 0x21, 0x41, 0x7e, 0x43, 0x3a, 0xca, 0x4f, 0x66, 0x9f, 0x77, 0xa3, 0x67, 0x17, 0xd8, 0x47, 0x1e, - 0xdf, 0x2b, 0xc1, 0x51, 0x8a, 0xe5, 0xcf, 0x37, 0x8a, 0x29, 0xee, 0xec, 0x75, 0xf5, 0x98, 0x65, - 0x35, 0x50, 0x82, 0x61, 0x9f, 0x65, 0xbc, 0x87, 0xdf, 0x67, 0x39, 0x19, 0xe8, 0x3c, 0xca, 0x56, - 0x56, 0xc6, 0x1b, 0x6d, 0x94, 0x4e, 0x64, 0x5f, 0x9f, 0x3a, 0xfc, 0xbe, 0xfe, 0x59, 0x18, 0x0a, - 0x44, 0xfa, 0x42, 0x3a, 0xe6, 0x9a, 0x69, 0xb4, 0x88, 0x16, 0x24, 0x46, 0xef, 0x93, 0xe0, 0x68, - 0xc7, 0x45, 0x90, 0xfe, 0xaf, 0xda, 0x03, 0x16, 0xe9, 0x22, 0xc6, 0xe9, 0xc8, 0x57, 0x56, 0x26, - 0x5a, 0x9d, 0xb2, 0x89, 0x75, 0x18, 0x0e, 0x2d, 0x60, 0x05, 0xf1, 0x1f, 0xa7, 0xfb, 0xbf, 0x61, - 0x11, 0x66, 0x80, 0x8a, 0x90, 0xc1, 0xd7, 0x2c, 0xd3, 0x76, 0x71, 0x8d, 0x1e, 0x79, 0xc8, 0x28, - 0x5e, 0x5b, 0x5e, 0x05, 0xd4, 0x3e, 0xb8, 0xd1, 0xef, 0x90, 0x66, 0xfd, 0xef, 0x90, 0x4e, 0x40, - 0x3a, 0xf8, 0xa5, 0x4e, 0xd6, 0xf0, 0xeb, 0x14, 0xb7, 0x7a, 0xce, 0xff, 0xdf, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x01, 0xf6, 0xec, 0xd9, 0x42, 0x94, 0x00, 0x00, + 0x06, 0x1d, 0x6c, 0x5f, 0xd1, 0x35, 0x5c, 0x18, 0xa0, 0x0c, 0xee, 0x6f, 0x63, 0xb0, 0xc1, 0xda, + 0xa3, 0x3c, 0x04, 0x1d, 0x9a, 0x87, 0x2c, 0xbe, 0xe6, 0x62, 0xc3, 0xd1, 0x4d, 0xa3, 0x30, 0x48, + 0x99, 0xdc, 0xdb, 0x61, 0x14, 0x71, 0xa3, 0x16, 0x65, 0xe1, 0xd3, 0xa1, 0x73, 0x30, 0x68, 0x5a, + 0xae, 0x6e, 0x1a, 0x4e, 0x21, 0x33, 0x2d, 0x9d, 0x1a, 0x3a, 0x73, 0xb2, 0xa3, 0x23, 0xac, 0x31, + 0x1c, 0x45, 0x20, 0xa3, 0x25, 0xc8, 0x3b, 0x66, 0xcb, 0xd6, 0x70, 0x55, 0x33, 0x6b, 0xb8, 0xaa, + 0x1b, 0x3b, 0x66, 0x21, 0x4b, 0x19, 0x4c, 0xb5, 0x2b, 0x42, 0x11, 0xe7, 0xcd, 0x1a, 0x5e, 0x32, + 0x76, 0x4c, 0x65, 0xc4, 0x09, 0x3d, 0xa3, 0x63, 0x30, 0xe0, 0xec, 0x1b, 0xae, 0x7a, 0xad, 0x90, + 0xa3, 0x1e, 0xc2, 0x9f, 0xe4, 0xdf, 0x18, 0x80, 0xd1, 0x7e, 0x5c, 0xec, 0x3c, 0xa4, 0x77, 0x88, + 0x96, 0x85, 0xc4, 0x41, 0x6c, 0xc0, 0x68, 0xc2, 0x46, 0x1c, 0x38, 0xa4, 0x11, 0xe7, 0x60, 0xc8, + 0xc0, 0x8e, 0x8b, 0x6b, 0xcc, 0x23, 0x92, 0x7d, 0xfa, 0x14, 0x30, 0xa2, 0x76, 0x97, 0x4a, 0x1d, + 0xca, 0xa5, 0x5e, 0x80, 0x51, 0x4f, 0xa4, 0xaa, 0xad, 0x1a, 0x75, 0xe1, 0x9b, 0xb3, 0x71, 0x92, + 0xcc, 0x54, 0x04, 0x9d, 0x42, 0xc8, 0x94, 0x11, 0x1c, 0x7a, 0x46, 0x0b, 0x00, 0xa6, 0x81, 0xcd, + 0x9d, 0x6a, 0x0d, 0x6b, 0x8d, 0x42, 0xa6, 0x8b, 0x95, 0xd6, 0x08, 0x4a, 0x9b, 0x95, 0x4c, 0x06, + 0xd5, 0x1a, 0xe8, 0x29, 0xdf, 0xd5, 0x06, 0xbb, 0x78, 0xca, 0x0a, 0x9b, 0x64, 0x6d, 0xde, 0xb6, + 0x05, 0x23, 0x36, 0x26, 0x7e, 0x8f, 0x6b, 0x5c, 0xb3, 0x2c, 0x15, 0x62, 0x26, 0x56, 0x33, 0x85, + 0x93, 0x31, 0xc5, 0x86, 0xed, 0xe0, 0x23, 0xba, 0x1b, 0x3c, 0x40, 0x95, 0xba, 0x15, 0xd0, 0x28, + 0x94, 0x13, 0xc0, 0x55, 0xb5, 0x89, 0x8b, 0x2f, 0xc3, 0x48, 0xd8, 0x3c, 0x68, 0x02, 0xd2, 0x8e, + 0xab, 0xda, 0x2e, 0xf5, 0xc2, 0xb4, 0xc2, 0x1e, 0x50, 0x1e, 0x92, 0xd8, 0xa8, 0xd1, 0x28, 0x97, + 0x56, 0xc8, 0x4f, 0xf4, 0x13, 0xbe, 0xc2, 0x49, 0xaa, 0xf0, 0x7d, 0xed, 0x23, 0x1a, 0xe2, 0x1c, + 0xd5, 0xbb, 0xf8, 0x04, 0x0c, 0x87, 0x14, 0xe8, 0xb7, 0x6b, 0xf9, 0x9d, 0x70, 0xb4, 0x23, 0x6b, + 0xf4, 0x02, 0x4c, 0xb4, 0x0c, 0xdd, 0x70, 0xb1, 0x6d, 0xd9, 0x98, 0x78, 0x2c, 0xeb, 0xaa, 0xf0, + 0x9f, 0x07, 0xbb, 0xf8, 0xdc, 0x56, 0x10, 0x9b, 0x71, 0x51, 0xc6, 0x5b, 0xed, 0xc0, 0xd3, 0xd9, + 0xcc, 0x1b, 0x83, 0xf9, 0x57, 0x5e, 0x79, 0xe5, 0x95, 0x84, 0xfc, 0xe5, 0x01, 0x98, 0xe8, 0x34, + 0x67, 0x3a, 0x4e, 0xdf, 0x63, 0x30, 0x60, 0xb4, 0x9a, 0xdb, 0xd8, 0xa6, 0x46, 0x4a, 0x2b, 0xfc, + 0x09, 0xcd, 0x41, 0xba, 0xa1, 0x6e, 0xe3, 0x46, 0x21, 0x35, 0x2d, 0x9d, 0x1a, 0x39, 0xf3, 0x60, + 0x5f, 0xb3, 0x72, 0x66, 0x99, 0x90, 0x28, 0x8c, 0x12, 0x3d, 0x0d, 0x29, 0x1e, 0xa2, 0x09, 0x87, + 0xd3, 0xfd, 0x71, 0x20, 0x73, 0x49, 0xa1, 0x74, 0xe8, 0x0e, 0xc8, 0x92, 0xbf, 0xcc, 0x37, 0x06, + 0xa8, 0xcc, 0x19, 0x02, 0x20, 0x7e, 0x81, 0x8a, 0x90, 0xa1, 0xd3, 0xa4, 0x86, 0xc5, 0xd2, 0xe6, + 0x3d, 0x13, 0xc7, 0xaa, 0xe1, 0x1d, 0xb5, 0xd5, 0x70, 0xab, 0x57, 0xd4, 0x46, 0x0b, 0x53, 0x87, + 0xcf, 0x2a, 0x39, 0x0e, 0xbc, 0x4c, 0x60, 0x68, 0x0a, 0x86, 0xd8, 0xac, 0xd2, 0x8d, 0x1a, 0xbe, + 0x46, 0xa3, 0x67, 0x5a, 0x61, 0x13, 0x6d, 0x89, 0x40, 0x48, 0xf7, 0x2f, 0x3a, 0xa6, 0x21, 0x5c, + 0x93, 0x76, 0x41, 0x00, 0xb4, 0xfb, 0x27, 0xa2, 0x81, 0xfb, 0xce, 0xce, 0xea, 0xb5, 0xcd, 0xa5, + 0xfb, 0x61, 0x94, 0x62, 0x3c, 0xc6, 0x87, 0x5e, 0x6d, 0x14, 0xc6, 0xa6, 0xa5, 0x53, 0x19, 0x65, + 0x84, 0x81, 0xd7, 0x38, 0x54, 0xfe, 0x62, 0x02, 0x52, 0x34, 0xb0, 0x8c, 0xc2, 0xd0, 0xe6, 0x5b, + 0xd6, 0x2b, 0xd5, 0x85, 0xb5, 0xad, 0xf2, 0x72, 0x25, 0x2f, 0xa1, 0x11, 0x00, 0x0a, 0xb8, 0xb0, + 0xbc, 0x36, 0xb7, 0x99, 0x4f, 0x78, 0xcf, 0x4b, 0xab, 0x9b, 0xe7, 0x1e, 0xcf, 0x27, 0x3d, 0x82, + 0x2d, 0x06, 0x48, 0x05, 0x11, 0x1e, 0x3b, 0x93, 0x4f, 0xa3, 0x3c, 0xe4, 0x18, 0x83, 0xa5, 0x17, + 0x2a, 0x0b, 0xe7, 0x1e, 0xcf, 0x0f, 0x84, 0x21, 0x8f, 0x9d, 0xc9, 0x0f, 0xa2, 0x61, 0xc8, 0x52, + 0x48, 0x79, 0x6d, 0x6d, 0x39, 0x9f, 0xf1, 0x78, 0x6e, 0x6c, 0x2a, 0x4b, 0xab, 0x8b, 0xf9, 0xac, + 0xc7, 0x73, 0x51, 0x59, 0xdb, 0x5a, 0xcf, 0x83, 0xc7, 0x61, 0xa5, 0xb2, 0xb1, 0x31, 0xb7, 0x58, + 0xc9, 0x0f, 0x79, 0x18, 0xe5, 0xb7, 0x6c, 0x56, 0x36, 0xf2, 0xb9, 0x90, 0x58, 0x8f, 0x9d, 0xc9, + 0x0f, 0x7b, 0x5d, 0x54, 0x56, 0xb7, 0x56, 0xf2, 0x23, 0x68, 0x0c, 0x86, 0x59, 0x17, 0x42, 0x88, + 0xd1, 0x08, 0xe8, 0xdc, 0xe3, 0xf9, 0xbc, 0x2f, 0x08, 0xe3, 0x32, 0x16, 0x02, 0x9c, 0x7b, 0x3c, + 0x8f, 0xe4, 0x79, 0x48, 0x53, 0x37, 0x44, 0x08, 0x46, 0x96, 0xe7, 0xca, 0x95, 0xe5, 0xea, 0xda, + 0xfa, 0xe6, 0xd2, 0xda, 0xea, 0xdc, 0x72, 0x5e, 0xf2, 0x61, 0x4a, 0xe5, 0xb9, 0xad, 0x25, 0xa5, + 0xb2, 0x90, 0x4f, 0x04, 0x61, 0xeb, 0x95, 0xb9, 0xcd, 0xca, 0x42, 0x3e, 0x29, 0x6b, 0x30, 0xd1, + 0x29, 0xa0, 0x76, 0x9c, 0x42, 0x01, 0x5f, 0x48, 0x74, 0xf1, 0x05, 0xca, 0x2b, 0xea, 0x0b, 0xf2, + 0x37, 0x13, 0x30, 0xde, 0x61, 0x51, 0xe9, 0xd8, 0xc9, 0x33, 0x90, 0x66, 0xbe, 0xcc, 0x96, 0xd9, + 0x07, 0x3a, 0xae, 0x4e, 0xd4, 0xb3, 0xdb, 0x96, 0x5a, 0x4a, 0x17, 0x4c, 0x35, 0x92, 0x5d, 0x52, + 0x0d, 0xc2, 0xa2, 0xcd, 0x61, 0x7f, 0xb2, 0x2d, 0xf8, 0xb3, 0xf5, 0xf1, 0x5c, 0x3f, 0xeb, 0x23, + 0x85, 0x1d, 0x6c, 0x11, 0x48, 0x77, 0x58, 0x04, 0xce, 0xc3, 0x58, 0x1b, 0xa3, 0xbe, 0x83, 0xf1, + 0x7b, 0x24, 0x28, 0x74, 0x33, 0x4e, 0x4c, 0x48, 0x4c, 0x84, 0x42, 0xe2, 0xf9, 0xa8, 0x05, 0xef, + 0xea, 0x3e, 0x08, 0x6d, 0x63, 0xfd, 0x19, 0x09, 0x8e, 0x75, 0x4e, 0x29, 0x3b, 0xca, 0xf0, 0x34, + 0x0c, 0x34, 0xb1, 0xbb, 0x6b, 0x8a, 0xb4, 0xea, 0xbe, 0x0e, 0x8b, 0x35, 0x69, 0x8e, 0x0e, 0x36, + 0xa7, 0x0a, 0xae, 0xf6, 0xc9, 0x6e, 0x79, 0x21, 0x93, 0xa6, 0x4d, 0xd2, 0x0f, 0x24, 0xe0, 0x68, + 0x47, 0xe6, 0x1d, 0x05, 0xbd, 0x13, 0x40, 0x37, 0xac, 0x96, 0xcb, 0x52, 0x27, 0x16, 0x89, 0xb3, + 0x14, 0x42, 0x83, 0x17, 0x89, 0xb2, 0x2d, 0xd7, 0x6b, 0x4f, 0xd2, 0x76, 0x60, 0x20, 0x8a, 0xf0, + 0xa4, 0x2f, 0x68, 0x8a, 0x0a, 0x3a, 0xd9, 0x45, 0xd3, 0x36, 0xc7, 0x7c, 0x04, 0xf2, 0x5a, 0x43, + 0xc7, 0x86, 0x5b, 0x75, 0x5c, 0x1b, 0xab, 0x4d, 0xdd, 0xa8, 0xd3, 0xa5, 0x26, 0x53, 0x4a, 0xef, + 0xa8, 0x0d, 0x07, 0x2b, 0xa3, 0xac, 0x79, 0x43, 0xb4, 0x12, 0x0a, 0xea, 0x40, 0x76, 0x80, 0x62, + 0x20, 0x44, 0xc1, 0x9a, 0x3d, 0x0a, 0xf9, 0xc3, 0x59, 0x18, 0x0a, 0x24, 0xe0, 0xe8, 0x2e, 0xc8, + 0xbd, 0xa8, 0x5e, 0x51, 0xab, 0x62, 0x53, 0xc5, 0x2c, 0x31, 0x44, 0x60, 0xeb, 0x7c, 0x63, 0xf5, + 0x08, 0x4c, 0x50, 0x14, 0xb3, 0xe5, 0x62, 0xbb, 0xaa, 0x35, 0x54, 0xc7, 0xa1, 0x46, 0xcb, 0x50, + 0x54, 0x44, 0xda, 0xd6, 0x48, 0xd3, 0xbc, 0x68, 0x41, 0x67, 0x61, 0x9c, 0x52, 0x34, 0x5b, 0x0d, + 0x57, 0xb7, 0x1a, 0xb8, 0x4a, 0xb6, 0x79, 0x0e, 0x5d, 0x72, 0x3c, 0xc9, 0xc6, 0x08, 0xc6, 0x0a, + 0x47, 0x20, 0x12, 0x39, 0x68, 0x01, 0xee, 0xa4, 0x64, 0x75, 0x6c, 0x60, 0x5b, 0x75, 0x71, 0x15, + 0xbf, 0xd4, 0x52, 0x1b, 0x4e, 0x55, 0x35, 0x6a, 0xd5, 0x5d, 0xd5, 0xd9, 0x2d, 0x4c, 0x10, 0x06, + 0xe5, 0x44, 0x41, 0x52, 0x4e, 0x10, 0xc4, 0x45, 0x8e, 0x57, 0xa1, 0x68, 0x73, 0x46, 0xed, 0xa2, + 0xea, 0xec, 0xa2, 0x12, 0x1c, 0xa3, 0x5c, 0x1c, 0xd7, 0xd6, 0x8d, 0x7a, 0x55, 0xdb, 0xc5, 0xda, + 0x5e, 0xb5, 0xe5, 0xee, 0x3c, 0x59, 0xb8, 0x23, 0xd8, 0x3f, 0x95, 0x70, 0x83, 0xe2, 0xcc, 0x13, + 0x94, 0x2d, 0x77, 0xe7, 0x49, 0xb4, 0x01, 0x39, 0x32, 0x18, 0x4d, 0xfd, 0x65, 0x5c, 0xdd, 0x31, + 0x6d, 0xba, 0x86, 0x8e, 0x74, 0x08, 0x4d, 0x01, 0x0b, 0xce, 0xac, 0x71, 0x82, 0x15, 0xb3, 0x86, + 0x4b, 0xe9, 0x8d, 0xf5, 0x4a, 0x65, 0x41, 0x19, 0x12, 0x5c, 0x2e, 0x98, 0x36, 0x71, 0xa8, 0xba, + 0xe9, 0x19, 0x78, 0x88, 0x39, 0x54, 0xdd, 0x14, 0xe6, 0x3d, 0x0b, 0xe3, 0x9a, 0xc6, 0x74, 0xd6, + 0xb5, 0x2a, 0xdf, 0x8c, 0x39, 0x85, 0x7c, 0xc8, 0x58, 0x9a, 0xb6, 0xc8, 0x10, 0xb8, 0x8f, 0x3b, + 0xe8, 0x29, 0x38, 0xea, 0x1b, 0x2b, 0x48, 0x38, 0xd6, 0xa6, 0x65, 0x94, 0xf4, 0x2c, 0x8c, 0x5b, + 0xfb, 0xed, 0x84, 0x28, 0xd4, 0xa3, 0xb5, 0x1f, 0x25, 0x7b, 0x02, 0x26, 0xac, 0x5d, 0xab, 0x9d, + 0xee, 0x74, 0x90, 0x0e, 0x59, 0xbb, 0x56, 0x94, 0xf0, 0x5e, 0xba, 0x33, 0xb7, 0xb1, 0xa6, 0xba, + 0xb8, 0x56, 0x38, 0x1e, 0x44, 0x0f, 0x34, 0xa0, 0x19, 0xc8, 0x6b, 0x5a, 0x15, 0x1b, 0xea, 0x76, + 0x03, 0x57, 0x55, 0x1b, 0x1b, 0xaa, 0x53, 0x98, 0xa2, 0xc8, 0x29, 0xd7, 0x6e, 0x61, 0x65, 0x44, + 0xd3, 0x2a, 0xb4, 0x71, 0x8e, 0xb6, 0xa1, 0xd3, 0x30, 0x66, 0x6e, 0xbf, 0xa8, 0x31, 0x8f, 0xac, + 0x5a, 0x36, 0xde, 0xd1, 0xaf, 0x15, 0xee, 0xa1, 0xe6, 0x1d, 0x25, 0x0d, 0xd4, 0x1f, 0xd7, 0x29, + 0x18, 0x3d, 0x00, 0x79, 0xcd, 0xd9, 0x55, 0x6d, 0x8b, 0x86, 0x64, 0xc7, 0x52, 0x35, 0x5c, 0xb8, + 0x97, 0xa1, 0x32, 0xf8, 0xaa, 0x00, 0x93, 0x19, 0xe1, 0x5c, 0xd5, 0x77, 0x5c, 0xc1, 0xf1, 0x7e, + 0x36, 0x23, 0x28, 0x8c, 0x73, 0x3b, 0x05, 0x79, 0x62, 0x89, 0x50, 0xc7, 0xa7, 0x28, 0xda, 0x88, + 0xb5, 0x6b, 0x05, 0xfb, 0xbd, 0x1b, 0x86, 0x09, 0xa6, 0xdf, 0xe9, 0x03, 0x2c, 0x71, 0xb3, 0x76, + 0x03, 0x3d, 0x3e, 0x0e, 0xc7, 0x08, 0x52, 0x13, 0xbb, 0x6a, 0x4d, 0x75, 0xd5, 0x00, 0xf6, 0x43, + 0x14, 0x9b, 0x98, 0x7d, 0x85, 0x37, 0x86, 0xe4, 0xb4, 0x5b, 0xdb, 0xfb, 0x9e, 0x63, 0x3d, 0xcc, + 0xe4, 0x24, 0x30, 0xe1, 0x5a, 0xb7, 0x2d, 0x39, 0x97, 0x4b, 0x90, 0x0b, 0xfa, 0x3d, 0xca, 0x02, + 0xf3, 0xfc, 0xbc, 0x44, 0x92, 0xa0, 0xf9, 0xb5, 0x05, 0x92, 0xbe, 0xbc, 0xb5, 0x92, 0x4f, 0x90, + 0x34, 0x6a, 0x79, 0x69, 0xb3, 0x52, 0x55, 0xb6, 0x56, 0x37, 0x97, 0x56, 0x2a, 0xf9, 0x64, 0x20, + 0xb1, 0x7f, 0x36, 0x95, 0xb9, 0x2f, 0x7f, 0xbf, 0xfc, 0x8d, 0x04, 0x8c, 0x84, 0x77, 0x6a, 0xe8, + 0x4d, 0x70, 0x5c, 0x94, 0x55, 0x1c, 0xec, 0x56, 0xaf, 0xea, 0x36, 0x9d, 0x90, 0x4d, 0x95, 0x2d, + 0x8e, 0x9e, 0xff, 0x4c, 0x70, 0xac, 0x0d, 0xec, 0x3e, 0xaf, 0xdb, 0x64, 0xba, 0x35, 0x55, 0x17, + 0x2d, 0xc3, 0x94, 0x61, 0x56, 0x1d, 0x57, 0x35, 0x6a, 0xaa, 0x5d, 0xab, 0xfa, 0x05, 0xad, 0xaa, + 0xaa, 0x69, 0xd8, 0x71, 0x4c, 0xb6, 0x10, 0x7a, 0x5c, 0x4e, 0x1a, 0xe6, 0x06, 0x47, 0xf6, 0x57, + 0x88, 0x39, 0x8e, 0x1a, 0x71, 0xdf, 0x64, 0x37, 0xf7, 0xbd, 0x03, 0xb2, 0x4d, 0xd5, 0xaa, 0x62, + 0xc3, 0xb5, 0xf7, 0x69, 0x7e, 0x9e, 0x51, 0x32, 0x4d, 0xd5, 0xaa, 0x90, 0xe7, 0x1f, 0xca, 0x36, + 0xe9, 0xd9, 0x54, 0x26, 0x93, 0xcf, 0x3e, 0x9b, 0xca, 0x64, 0xf3, 0x20, 0xbf, 0x9e, 0x84, 0x5c, + 0x30, 0x5f, 0x27, 0xdb, 0x1f, 0x8d, 0xae, 0x58, 0x12, 0x8d, 0x69, 0x77, 0xf7, 0xcc, 0xee, 0x67, + 0xe6, 0xc9, 0x52, 0x56, 0x1a, 0x60, 0xc9, 0xb1, 0xc2, 0x28, 0x49, 0x1a, 0x41, 0x9c, 0x0d, 0xb3, + 0x64, 0x24, 0xa3, 0xf0, 0x27, 0xb4, 0x08, 0x03, 0x2f, 0x3a, 0x94, 0xf7, 0x00, 0xe5, 0x7d, 0x4f, + 0x6f, 0xde, 0xcf, 0x6e, 0x50, 0xe6, 0xd9, 0x67, 0x37, 0xaa, 0xab, 0x6b, 0xca, 0xca, 0xdc, 0xb2, + 0xc2, 0xc9, 0xd1, 0x09, 0x48, 0x35, 0xd4, 0x97, 0xf7, 0xc3, 0x8b, 0x1e, 0x05, 0xf5, 0x3b, 0x08, + 0x27, 0x20, 0x75, 0x15, 0xab, 0x7b, 0xe1, 0xa5, 0x86, 0x82, 0x6e, 0xe3, 0x64, 0x98, 0x85, 0x34, + 0xb5, 0x17, 0x02, 0xe0, 0x16, 0xcb, 0x1f, 0x41, 0x19, 0x48, 0xcd, 0xaf, 0x29, 0x64, 0x42, 0xe4, + 0x21, 0xc7, 0xa0, 0xd5, 0xf5, 0xa5, 0xca, 0x7c, 0x25, 0x9f, 0x90, 0xcf, 0xc2, 0x00, 0x33, 0x02, + 0x99, 0x2c, 0x9e, 0x19, 0xf2, 0x47, 0xf8, 0x23, 0xe7, 0x21, 0x89, 0xd6, 0xad, 0x95, 0x72, 0x45, + 0xc9, 0x27, 0xc2, 0x43, 0x9d, 0xca, 0xa7, 0x65, 0x07, 0x72, 0xc1, 0x3c, 0xfc, 0x87, 0xb3, 0x19, + 0xff, 0x92, 0x04, 0x43, 0x81, 0xbc, 0x9a, 0x24, 0x44, 0x6a, 0xa3, 0x61, 0x5e, 0xad, 0xaa, 0x0d, + 0x5d, 0x75, 0xb8, 0x6b, 0x00, 0x05, 0xcd, 0x11, 0x48, 0xbf, 0x43, 0xf7, 0x43, 0x9a, 0x22, 0xe9, + 0xfc, 0x80, 0xfc, 0x09, 0x09, 0xf2, 0xd1, 0xc4, 0x36, 0x22, 0xa6, 0xf4, 0xa3, 0x14, 0x53, 0xfe, + 0xb8, 0x04, 0x23, 0xe1, 0x6c, 0x36, 0x22, 0xde, 0x5d, 0x3f, 0x52, 0xf1, 0xfe, 0x20, 0x01, 0xc3, + 0xa1, 0x1c, 0xb6, 0x5f, 0xe9, 0x5e, 0x82, 0x31, 0xbd, 0x86, 0x9b, 0x96, 0xe9, 0x62, 0x43, 0xdb, + 0xaf, 0x36, 0xf0, 0x15, 0xdc, 0x28, 0xc8, 0x34, 0x68, 0xcc, 0xf6, 0xce, 0x92, 0x67, 0x96, 0x7c, + 0xba, 0x65, 0x42, 0x56, 0x1a, 0x5f, 0x5a, 0xa8, 0xac, 0xac, 0xaf, 0x6d, 0x56, 0x56, 0xe7, 0xdf, + 0x52, 0xdd, 0x5a, 0xbd, 0xb4, 0xba, 0xf6, 0xfc, 0xaa, 0x92, 0xd7, 0x23, 0x68, 0xb7, 0x71, 0xda, + 0xaf, 0x43, 0x3e, 0x2a, 0x14, 0x3a, 0x0e, 0x9d, 0xc4, 0xca, 0x1f, 0x41, 0xe3, 0x30, 0xba, 0xba, + 0x56, 0xdd, 0x58, 0x5a, 0xa8, 0x54, 0x2b, 0x17, 0x2e, 0x54, 0xe6, 0x37, 0x37, 0x58, 0xdd, 0xc3, + 0xc3, 0xde, 0x0c, 0x4d, 0x70, 0xf9, 0xb5, 0x24, 0x8c, 0x77, 0x90, 0x04, 0xcd, 0xf1, 0x1d, 0x0b, + 0xdb, 0x44, 0x3d, 0xdc, 0x8f, 0xf4, 0x33, 0x24, 0x67, 0x58, 0x57, 0x6d, 0x97, 0x6f, 0x70, 0x1e, + 0x00, 0x62, 0x25, 0xc3, 0xd5, 0x77, 0x74, 0x6c, 0xf3, 0x7a, 0x12, 0xdb, 0xc6, 0x8c, 0xfa, 0x70, + 0x56, 0x52, 0x7a, 0x08, 0x90, 0x65, 0x3a, 0xba, 0xab, 0x5f, 0xc1, 0x55, 0xdd, 0x10, 0xc5, 0x27, + 0xb2, 0xad, 0x49, 0x29, 0x79, 0xd1, 0xb2, 0x64, 0xb8, 0x1e, 0xb6, 0x81, 0xeb, 0x6a, 0x04, 0x9b, + 0x04, 0xf3, 0xa4, 0x92, 0x17, 0x2d, 0x1e, 0xf6, 0x5d, 0x90, 0xab, 0x99, 0x2d, 0x92, 0xeb, 0x31, + 0x3c, 0xb2, 0x76, 0x48, 0xca, 0x10, 0x83, 0x79, 0x28, 0x3c, 0x8b, 0xf7, 0xab, 0x5e, 0x39, 0x65, + 0x88, 0xc1, 0x18, 0xca, 0xfd, 0x30, 0xaa, 0xd6, 0xeb, 0x36, 0x61, 0x2e, 0x18, 0xb1, 0x7d, 0xc9, + 0x88, 0x07, 0xa6, 0x88, 0xc5, 0x67, 0x21, 0x23, 0xec, 0x40, 0x96, 0x6a, 0x62, 0x89, 0xaa, 0xc5, + 0x36, 0xdb, 0x89, 0x53, 0x59, 0x25, 0x63, 0x88, 0xc6, 0xbb, 0x20, 0xa7, 0x3b, 0x55, 0xbf, 0x88, + 0x9f, 0x98, 0x4e, 0x9c, 0xca, 0x28, 0x43, 0xba, 0xe3, 0x15, 0x40, 0xe5, 0xcf, 0x24, 0x60, 0x24, + 0xfc, 0x12, 0x02, 0x2d, 0x40, 0xa6, 0x61, 0x6a, 0x2a, 0x75, 0x2d, 0xf6, 0x06, 0xec, 0x54, 0xcc, + 0x7b, 0x8b, 0x99, 0x65, 0x8e, 0xaf, 0x78, 0x94, 0xc5, 0xdf, 0x96, 0x20, 0x23, 0xc0, 0xe8, 0x18, + 0xa4, 0x2c, 0xd5, 0xdd, 0xa5, 0xec, 0xd2, 0xe5, 0x44, 0x5e, 0x52, 0xe8, 0x33, 0x81, 0x3b, 0x96, + 0x6a, 0x50, 0x17, 0xe0, 0x70, 0xf2, 0x4c, 0xc6, 0xb5, 0x81, 0xd5, 0x1a, 0xdd, 0xf4, 0x98, 0xcd, + 0x26, 0x36, 0x5c, 0x47, 0x8c, 0x2b, 0x87, 0xcf, 0x73, 0x30, 0x7a, 0x10, 0xc6, 0x5c, 0x5b, 0xd5, + 0x1b, 0x21, 0xdc, 0x14, 0xc5, 0xcd, 0x8b, 0x06, 0x0f, 0xb9, 0x04, 0x27, 0x04, 0xdf, 0x1a, 0x76, + 0x55, 0x6d, 0x17, 0xd7, 0x7c, 0xa2, 0x01, 0x5a, 0xdc, 0x38, 0xce, 0x11, 0x16, 0x78, 0xbb, 0xa0, + 0x95, 0xbf, 0x21, 0xc1, 0x98, 0xd8, 0xa6, 0xd5, 0x3c, 0x63, 0xad, 0x00, 0xa8, 0x86, 0x61, 0xba, + 0x41, 0x73, 0xb5, 0xbb, 0x72, 0x1b, 0xdd, 0xcc, 0x9c, 0x47, 0xa4, 0x04, 0x18, 0x14, 0x9b, 0x00, + 0x7e, 0x4b, 0x57, 0xb3, 0x4d, 0xc1, 0x10, 0x7f, 0xc3, 0x44, 0x5f, 0x53, 0xb2, 0x8d, 0x3d, 0x30, + 0x10, 0xd9, 0xcf, 0xa1, 0x09, 0x48, 0x6f, 0xe3, 0xba, 0x6e, 0xf0, 0xba, 0x31, 0x7b, 0x10, 0xe5, + 0x97, 0x94, 0x57, 0x7e, 0x29, 0x7f, 0x50, 0x82, 0x71, 0xcd, 0x6c, 0x46, 0xe5, 0x2d, 0xe7, 0x23, + 0xd5, 0x05, 0xe7, 0xa2, 0xf4, 0xd6, 0xa7, 0xeb, 0xba, 0xbb, 0xdb, 0xda, 0x9e, 0xd1, 0xcc, 0xe6, + 0x6c, 0xdd, 0x6c, 0xa8, 0x46, 0xdd, 0x7f, 0xcf, 0x4a, 0x7f, 0x68, 0x0f, 0xd7, 0xb1, 0xf1, 0x70, + 0xdd, 0x0c, 0xbc, 0x75, 0x3d, 0xef, 0xff, 0xfc, 0x33, 0x49, 0xfa, 0x85, 0x44, 0x72, 0x71, 0xbd, + 0xfc, 0xd9, 0x44, 0x71, 0x91, 0x75, 0xb7, 0x2e, 0xcc, 0xa3, 0xe0, 0x9d, 0x06, 0xd6, 0x88, 0xca, + 0xf0, 0xed, 0x07, 0x61, 0xa2, 0x6e, 0xd6, 0x4d, 0xca, 0x71, 0x96, 0xfc, 0xe2, 0x6f, 0x6e, 0xb3, + 0x1e, 0xb4, 0x18, 0xfb, 0x9a, 0xb7, 0xb4, 0x0a, 0xe3, 0x1c, 0xb9, 0x4a, 0x5f, 0x1d, 0xb1, 0x8d, + 0x0d, 0xea, 0x59, 0x55, 0x2b, 0xfc, 0xda, 0xb7, 0xe8, 0x82, 0xae, 0x8c, 0x71, 0x52, 0xd2, 0xc6, + 0xf6, 0x3e, 0x25, 0x05, 0x8e, 0x86, 0xf8, 0xb1, 0x69, 0x8b, 0xed, 0x18, 0x8e, 0xbf, 0xc9, 0x39, + 0x8e, 0x07, 0x38, 0x6e, 0x70, 0xd2, 0xd2, 0x3c, 0x0c, 0x1f, 0x84, 0xd7, 0xbf, 0xe4, 0xbc, 0x72, + 0x38, 0xc8, 0x64, 0x11, 0x46, 0x29, 0x13, 0xad, 0xe5, 0xb8, 0x66, 0x93, 0xc6, 0xc4, 0xde, 0x6c, + 0x7e, 0xeb, 0x5b, 0x6c, 0x1e, 0x8d, 0x10, 0xb2, 0x79, 0x8f, 0xaa, 0x54, 0x02, 0xfa, 0xb6, 0xac, + 0x86, 0xb5, 0x46, 0x0c, 0x87, 0xaf, 0x70, 0x41, 0x3c, 0xfc, 0xd2, 0x65, 0x98, 0x20, 0xbf, 0x69, + 0xc8, 0x0a, 0x4a, 0x12, 0x5f, 0x82, 0x2b, 0x7c, 0xe3, 0x3d, 0x6c, 0xaa, 0x8e, 0x7b, 0x0c, 0x02, + 0x32, 0x05, 0x46, 0xb1, 0x8e, 0x5d, 0x17, 0xdb, 0x4e, 0x55, 0x6d, 0x74, 0x12, 0x2f, 0x50, 0xc3, + 0x28, 0x7c, 0xec, 0x3b, 0xe1, 0x51, 0x5c, 0x64, 0x94, 0x73, 0x8d, 0x46, 0x69, 0x0b, 0x8e, 0x77, + 0xf0, 0x8a, 0x3e, 0x78, 0xbe, 0xc6, 0x79, 0x4e, 0xb4, 0x79, 0x06, 0x61, 0xbb, 0x0e, 0x02, 0xee, + 0x8d, 0x65, 0x1f, 0x3c, 0x7f, 0x9e, 0xf3, 0x44, 0x9c, 0x56, 0x0c, 0x29, 0xe1, 0xf8, 0x2c, 0x8c, + 0x5d, 0xc1, 0xf6, 0xb6, 0xe9, 0xf0, 0xba, 0x51, 0x1f, 0xec, 0x3e, 0xce, 0xd9, 0x8d, 0x72, 0x42, + 0x5a, 0x48, 0x22, 0xbc, 0x9e, 0x82, 0xcc, 0x8e, 0xaa, 0xe1, 0x3e, 0x58, 0x5c, 0xe7, 0x2c, 0x06, + 0x09, 0x3e, 0x21, 0x9d, 0x83, 0x5c, 0xdd, 0xe4, 0xab, 0x56, 0x3c, 0xf9, 0x27, 0x38, 0xf9, 0x90, + 0xa0, 0xe1, 0x2c, 0x2c, 0xd3, 0x6a, 0x35, 0xc8, 0x92, 0x16, 0xcf, 0xe2, 0x6f, 0x0a, 0x16, 0x82, + 0x86, 0xb3, 0x38, 0x80, 0x59, 0x3f, 0x29, 0x58, 0x38, 0x01, 0x7b, 0x3e, 0x03, 0x43, 0xa6, 0xd1, + 0xd8, 0x37, 0x8d, 0x7e, 0x84, 0xf8, 0x14, 0xe7, 0x00, 0x9c, 0x84, 0x30, 0x38, 0x0f, 0xd9, 0x7e, + 0x07, 0xe2, 0x6f, 0x7d, 0x47, 0x4c, 0x0f, 0x31, 0x02, 0x8b, 0x30, 0x2a, 0x02, 0x94, 0x6e, 0x1a, + 0x7d, 0xb0, 0xf8, 0xdb, 0x9c, 0xc5, 0x48, 0x80, 0x8c, 0xab, 0xe1, 0x62, 0xc7, 0xad, 0xe3, 0x7e, + 0x98, 0x7c, 0x46, 0xa8, 0xc1, 0x49, 0xb8, 0x29, 0xb7, 0xb1, 0xa1, 0xed, 0xf6, 0xc7, 0xe1, 0x97, + 0x84, 0x29, 0x05, 0x0d, 0x61, 0x31, 0x0f, 0xc3, 0x4d, 0xd5, 0x76, 0x76, 0xd5, 0x46, 0x5f, 0xc3, + 0xf1, 0x77, 0x38, 0x8f, 0x9c, 0x47, 0xc4, 0x2d, 0xd2, 0x32, 0x0e, 0xc2, 0xe6, 0xb3, 0xc2, 0x22, + 0x01, 0x32, 0x3e, 0xf5, 0x1c, 0x97, 0x16, 0xd9, 0x0e, 0xc2, 0xed, 0x97, 0xc5, 0xd4, 0x63, 0xb4, + 0x2b, 0x41, 0x8e, 0xe7, 0x21, 0xeb, 0xe8, 0x2f, 0xf7, 0xc5, 0xe6, 0x73, 0x62, 0xa4, 0x29, 0x01, + 0x21, 0x7e, 0x0b, 0x9c, 0xe8, 0xb8, 0x4c, 0xf4, 0xc1, 0xec, 0xef, 0x72, 0x66, 0xc7, 0x3a, 0x2c, + 0x15, 0x3c, 0x24, 0x1c, 0x94, 0xe5, 0xdf, 0x13, 0x21, 0x01, 0x47, 0x78, 0xad, 0x93, 0x7d, 0x84, + 0xa3, 0xee, 0x1c, 0xcc, 0x6a, 0xbf, 0x22, 0xac, 0xc6, 0x68, 0x43, 0x56, 0xdb, 0x84, 0x63, 0x9c, + 0xe3, 0xc1, 0xc6, 0xf5, 0x57, 0x45, 0x60, 0x65, 0xd4, 0x5b, 0xe1, 0xd1, 0x7d, 0x1b, 0x14, 0x3d, + 0x73, 0x8a, 0x84, 0xd5, 0xa9, 0x36, 0x55, 0xab, 0x0f, 0xce, 0xbf, 0xc6, 0x39, 0x8b, 0x88, 0xef, + 0x65, 0xbc, 0xce, 0x8a, 0x6a, 0x11, 0xe6, 0x2f, 0x40, 0x41, 0x30, 0x6f, 0x19, 0x36, 0xd6, 0xcc, + 0xba, 0xa1, 0xbf, 0x8c, 0x6b, 0x7d, 0xb0, 0xfe, 0xf5, 0xc8, 0x50, 0x6d, 0x05, 0xc8, 0x09, 0xe7, + 0x25, 0xc8, 0x7b, 0xb9, 0x4a, 0x55, 0x6f, 0x5a, 0xa6, 0xed, 0xc6, 0x70, 0xfc, 0xbc, 0x18, 0x29, + 0x8f, 0x6e, 0x89, 0x92, 0x95, 0x2a, 0xc0, 0xde, 0x3c, 0xf7, 0xeb, 0x92, 0x5f, 0xe0, 0x8c, 0x86, + 0x7d, 0x2a, 0x1e, 0x38, 0x34, 0xb3, 0x69, 0xa9, 0x76, 0x3f, 0xf1, 0xef, 0xef, 0x8b, 0xc0, 0xc1, + 0x49, 0x78, 0xe0, 0x70, 0xf7, 0x2d, 0x4c, 0x56, 0xfb, 0x3e, 0x38, 0x7c, 0x51, 0x04, 0x0e, 0x41, + 0xc3, 0x59, 0x88, 0x84, 0xa1, 0x0f, 0x16, 0xff, 0x40, 0xb0, 0x10, 0x34, 0x84, 0xc5, 0x73, 0xfe, + 0x42, 0x6b, 0xe3, 0xba, 0xee, 0xb8, 0x36, 0x4b, 0x93, 0x7b, 0xb3, 0xfa, 0x87, 0xdf, 0x09, 0x27, + 0x61, 0x4a, 0x80, 0x94, 0x44, 0x22, 0x5e, 0x76, 0xa5, 0xbb, 0xa8, 0x78, 0xc1, 0x7e, 0x43, 0x44, + 0xa2, 0x00, 0x19, 0x91, 0x2d, 0x90, 0x21, 0x12, 0xb3, 0x6b, 0x64, 0xef, 0xd0, 0x07, 0xbb, 0x7f, + 0x14, 0x11, 0x6e, 0x43, 0xd0, 0x12, 0x9e, 0x81, 0xfc, 0xa7, 0x65, 0xec, 0xe1, 0xfd, 0xbe, 0xbc, + 0xf3, 0x1f, 0x47, 0xf2, 0x9f, 0x2d, 0x46, 0xc9, 0x62, 0xc8, 0x68, 0x24, 0x9f, 0x42, 0x71, 0xe7, + 0x8c, 0x0a, 0x3f, 0xf5, 0x3d, 0xae, 0x6f, 0x38, 0x9d, 0x2a, 0x2d, 0x13, 0x27, 0x0f, 0x27, 0x3d, + 0xf1, 0xcc, 0xde, 0xf3, 0x3d, 0xcf, 0xcf, 0x43, 0x39, 0x4f, 0xe9, 0x02, 0x0c, 0x87, 0x12, 0x9e, + 0x78, 0x56, 0xef, 0xe5, 0xac, 0x72, 0xc1, 0x7c, 0xa7, 0x74, 0x16, 0x52, 0x24, 0x79, 0x89, 0x27, + 0xff, 0xcb, 0x9c, 0x9c, 0xa2, 0x97, 0xde, 0x0c, 0x19, 0x91, 0xb4, 0xc4, 0x93, 0xbe, 0x8f, 0x93, + 0x7a, 0x24, 0x84, 0x5c, 0x24, 0x2c, 0xf1, 0xe4, 0x7f, 0x45, 0x90, 0x0b, 0x12, 0x42, 0xde, 0xbf, + 0x09, 0xbf, 0xf4, 0xd3, 0x29, 0xbe, 0xe8, 0x08, 0xdb, 0x9d, 0x87, 0x41, 0x9e, 0xa9, 0xc4, 0x53, + 0x7f, 0x80, 0x77, 0x2e, 0x28, 0x4a, 0x4f, 0x40, 0xba, 0x4f, 0x83, 0xff, 0x0c, 0x27, 0x65, 0xf8, + 0xa5, 0x79, 0x18, 0x0a, 0x64, 0x27, 0xf1, 0xe4, 0x7f, 0x8d, 0x93, 0x07, 0xa9, 0x88, 0xe8, 0x3c, + 0x3b, 0x89, 0x67, 0xf0, 0x41, 0x21, 0x3a, 0xa7, 0x20, 0x66, 0x13, 0x89, 0x49, 0x3c, 0xf5, 0x87, + 0x84, 0xd5, 0x05, 0x49, 0xe9, 0x19, 0xc8, 0x7a, 0x8b, 0x4d, 0x3c, 0xfd, 0x87, 0x39, 0xbd, 0x4f, + 0x43, 0x2c, 0x10, 0x58, 0xec, 0xe2, 0x59, 0xfc, 0x75, 0x61, 0x81, 0x00, 0x15, 0x99, 0x46, 0xd1, + 0x04, 0x26, 0x9e, 0xd3, 0x47, 0xc4, 0x34, 0x8a, 0xe4, 0x2f, 0x64, 0x34, 0x69, 0xcc, 0x8f, 0x67, + 0xf1, 0xb3, 0x62, 0x34, 0x29, 0x3e, 0x11, 0x23, 0x9a, 0x11, 0xc4, 0xf3, 0xf8, 0x1b, 0x42, 0x8c, + 0x48, 0x42, 0x50, 0x5a, 0x07, 0xd4, 0x9e, 0x0d, 0xc4, 0xf3, 0xfb, 0x28, 0xe7, 0x37, 0xd6, 0x96, + 0x0c, 0x94, 0x9e, 0x87, 0x63, 0x9d, 0x33, 0x81, 0x78, 0xae, 0x1f, 0xfb, 0x5e, 0x64, 0xef, 0x16, + 0x4c, 0x04, 0x4a, 0x9b, 0xfe, 0x92, 0x12, 0xcc, 0x02, 0xe2, 0xd9, 0xbe, 0xf6, 0xbd, 0x70, 0xe0, + 0x0e, 0x26, 0x01, 0xa5, 0x39, 0x00, 0x7f, 0x01, 0x8e, 0xe7, 0xf5, 0x71, 0xce, 0x2b, 0x40, 0x44, + 0xa6, 0x06, 0x5f, 0x7f, 0xe3, 0xe9, 0xaf, 0x8b, 0xa9, 0xc1, 0x29, 0xc8, 0xd4, 0x10, 0x4b, 0x6f, + 0x3c, 0xf5, 0x27, 0xc4, 0xd4, 0x10, 0x24, 0xc4, 0xb3, 0x03, 0xab, 0x5b, 0x3c, 0x87, 0x4f, 0x09, + 0xcf, 0x0e, 0x50, 0x95, 0x56, 0x61, 0xac, 0x6d, 0x41, 0x8c, 0x67, 0xf5, 0x0b, 0x9c, 0x55, 0x3e, + 0xba, 0x1e, 0x06, 0x17, 0x2f, 0xbe, 0x18, 0xc6, 0x73, 0xfb, 0x74, 0x64, 0xf1, 0xe2, 0x6b, 0x61, + 0xe9, 0x3c, 0x64, 0x8c, 0x56, 0xa3, 0x41, 0x26, 0x0f, 0xea, 0x7d, 0x36, 0xb0, 0xf0, 0x5f, 0xbe, + 0xcf, 0xad, 0x23, 0x08, 0x4a, 0x67, 0x21, 0x8d, 0x9b, 0xdb, 0xb8, 0x16, 0x47, 0xf9, 0xed, 0xef, + 0x8b, 0x80, 0x49, 0xb0, 0x4b, 0xcf, 0x00, 0xb0, 0xd2, 0x08, 0x7d, 0x3d, 0x18, 0x43, 0xfb, 0x5f, + 0xbf, 0xcf, 0x0f, 0xe3, 0xf8, 0x24, 0x3e, 0x03, 0x76, 0xb4, 0xa7, 0x37, 0x83, 0xef, 0x84, 0x19, + 0xd0, 0x11, 0x79, 0x0a, 0x06, 0x5f, 0x74, 0x4c, 0xc3, 0x55, 0xeb, 0x71, 0xd4, 0xff, 0x8d, 0x53, + 0x0b, 0x7c, 0x62, 0xb0, 0xa6, 0x69, 0x63, 0x57, 0xad, 0x3b, 0x71, 0xb4, 0xff, 0x9d, 0xd3, 0x7a, + 0x04, 0x84, 0x58, 0x53, 0x1d, 0xb7, 0x1f, 0xbd, 0xff, 0x48, 0x10, 0x0b, 0x02, 0x22, 0x34, 0xf9, + 0xbd, 0x87, 0xf7, 0xe3, 0x68, 0xbf, 0x2b, 0x84, 0xe6, 0xf8, 0xa5, 0x37, 0x43, 0x96, 0xfc, 0x64, + 0x27, 0xec, 0x62, 0x88, 0xff, 0x98, 0x13, 0xfb, 0x14, 0xa4, 0x67, 0xc7, 0xad, 0xb9, 0x7a, 0xbc, + 0xb1, 0x6f, 0xf2, 0x91, 0x16, 0xf8, 0xa5, 0x39, 0x18, 0x72, 0xdc, 0x5a, 0xad, 0xc5, 0xf3, 0xd3, + 0x18, 0xf2, 0x3f, 0xf9, 0xbe, 0x57, 0xb2, 0xf0, 0x68, 0xc8, 0x68, 0x5f, 0xdd, 0x73, 0x2d, 0x93, + 0xbe, 0x02, 0x89, 0xe3, 0xf0, 0x3d, 0xce, 0x21, 0x40, 0x52, 0x9a, 0x87, 0x1c, 0xd1, 0xc5, 0xc6, + 0x16, 0xa6, 0xef, 0xab, 0x62, 0x58, 0xfc, 0x29, 0x37, 0x40, 0x88, 0xa8, 0xfc, 0x93, 0x5f, 0x79, + 0x7d, 0x52, 0xfa, 0xfa, 0xeb, 0x93, 0xd2, 0x1f, 0xbc, 0x3e, 0x29, 0x7d, 0xe8, 0x9b, 0x93, 0x47, + 0xbe, 0xfe, 0xcd, 0xc9, 0x23, 0xbf, 0xfb, 0xcd, 0xc9, 0x23, 0x9d, 0xcb, 0xc6, 0xb0, 0x68, 0x2e, + 0x9a, 0xac, 0x60, 0xfc, 0x56, 0x39, 0x54, 0x2e, 0xae, 0x9b, 0x7e, 0xb5, 0xd6, 0xdb, 0xe4, 0xc0, + 0x9f, 0x4a, 0x64, 0xc3, 0x1c, 0xae, 0xe5, 0xaa, 0xc6, 0x7e, 0x97, 0xbb, 0x3a, 0xc5, 0x8e, 0x85, + 0x61, 0xf9, 0x4d, 0x90, 0x9c, 0x33, 0xf6, 0xd1, 0x09, 0x16, 0xf3, 0xaa, 0x2d, 0xbb, 0xc1, 0x4f, + 0x7e, 0x0d, 0x92, 0xe7, 0x2d, 0xbb, 0x81, 0x26, 0xfc, 0xe3, 0x99, 0xd2, 0xa9, 0x1c, 0x3f, 0x73, + 0x59, 0x4a, 0x7d, 0xf7, 0x53, 0x53, 0x47, 0xca, 0x7b, 0x51, 0x0d, 0xbf, 0x14, 0xab, 0x65, 0x66, + 0xce, 0xd8, 0xa7, 0x4a, 0xae, 0x4b, 0x6f, 0x4d, 0x93, 0x3e, 0x1c, 0x51, 0xd8, 0x9e, 0x8c, 0x16, + 0xb6, 0x9f, 0xc7, 0x8d, 0xc6, 0x25, 0xc3, 0xbc, 0x6a, 0x6c, 0x12, 0xb4, 0xed, 0x01, 0x76, 0x8c, + 0x18, 0x3e, 0x94, 0x80, 0xa9, 0xa8, 0xde, 0xc4, 0x71, 0x1c, 0x57, 0x6d, 0x5a, 0xdd, 0x6e, 0x2a, + 0x9d, 0x87, 0xec, 0xa6, 0xc0, 0x41, 0x05, 0x18, 0x74, 0xb0, 0x66, 0x1a, 0x35, 0x87, 0x2a, 0x9b, + 0x54, 0xc4, 0x23, 0x51, 0xd6, 0x50, 0x0d, 0xd3, 0xe1, 0xe7, 0x23, 0xd9, 0x43, 0xf9, 0xe7, 0xa4, + 0x83, 0x8d, 0xe4, 0x88, 0xd7, 0x95, 0xd0, 0xf4, 0xc1, 0x5e, 0xe5, 0x7f, 0x6a, 0x05, 0x5f, 0x85, + 0x40, 0xad, 0xbf, 0x5f, 0x93, 0xbc, 0x3b, 0x09, 0x27, 0x34, 0xd3, 0x69, 0x9a, 0x4e, 0x95, 0x8d, + 0x30, 0x7b, 0xe0, 0xc6, 0xc8, 0x05, 0x9b, 0xfa, 0xa8, 0xff, 0x5f, 0x84, 0x11, 0x3a, 0x0b, 0x68, + 0xe5, 0x93, 0x06, 0x9e, 0xd8, 0xb5, 0xe2, 0xab, 0xff, 0x36, 0x4d, 0xbd, 0x66, 0xd8, 0x23, 0xa4, + 0x47, 0x3b, 0x36, 0x61, 0x42, 0x6f, 0x5a, 0x0d, 0x4c, 0xdf, 0x01, 0x55, 0xbd, 0xb6, 0x78, 0x7e, + 0x5f, 0xe3, 0xfc, 0xc6, 0x7d, 0xf2, 0x25, 0x41, 0x5d, 0x5a, 0x86, 0x31, 0x55, 0xd3, 0xb0, 0x15, + 0x62, 0x19, 0x33, 0x43, 0x85, 0x80, 0x79, 0x4e, 0xe9, 0x71, 0x2b, 0x3f, 0xd3, 0x6d, 0x6c, 0xdf, + 0x7a, 0x6f, 0x60, 0xd0, 0x6c, 0x5c, 0xc7, 0xc6, 0xc3, 0x06, 0x76, 0xaf, 0x9a, 0xf6, 0x1e, 0x37, + 0xef, 0xc3, 0xac, 0x2b, 0x31, 0x08, 0xef, 0x4d, 0xc2, 0x24, 0x6b, 0x98, 0xdd, 0x56, 0x1d, 0x3c, + 0x7b, 0xe5, 0xd1, 0x6d, 0xec, 0xaa, 0x8f, 0xce, 0x6a, 0xa6, 0x6e, 0xf0, 0x91, 0x18, 0xe7, 0xe3, + 0x42, 0xda, 0x67, 0x78, 0x7b, 0x97, 0x89, 0xb9, 0x08, 0xa9, 0x79, 0x53, 0x37, 0x88, 0x47, 0xd6, + 0xb0, 0x61, 0x36, 0xf9, 0xb4, 0x64, 0x0f, 0xe8, 0x6e, 0x18, 0x50, 0x9b, 0x66, 0xcb, 0x70, 0xd9, + 0xeb, 0xab, 0xf2, 0xd0, 0x57, 0x6e, 0x4c, 0x1d, 0xf9, 0xbd, 0x1b, 0x53, 0xc9, 0x25, 0xc3, 0x55, + 0x78, 0x53, 0x29, 0xf5, 0xc6, 0x27, 0xa7, 0x24, 0xf9, 0x59, 0x18, 0x5c, 0xc0, 0xda, 0x61, 0x78, + 0x2d, 0x60, 0x2d, 0xc2, 0xeb, 0x01, 0xc8, 0x2c, 0x19, 0x2e, 0x3b, 0x32, 0x7b, 0x27, 0x24, 0x75, + 0x83, 0x9d, 0xc2, 0x8a, 0xf4, 0x4f, 0xe0, 0x04, 0x75, 0x01, 0x6b, 0x1e, 0x6a, 0x0d, 0x6b, 0x51, + 0x54, 0xc2, 0x9e, 0xc0, 0xcb, 0x0b, 0xbf, 0xfb, 0x9f, 0x26, 0x8f, 0xbc, 0xf2, 0xfa, 0xe4, 0x91, + 0xae, 0x23, 0x11, 0x0c, 0x87, 0xdc, 0xc4, 0x7c, 0x08, 0x9c, 0xda, 0xde, 0xac, 0x1b, 0x9a, 0x0b, + 0x7f, 0x35, 0x01, 0x93, 0x6d, 0x2e, 0xce, 0x17, 0x86, 0x6e, 0xd1, 0xa1, 0x04, 0x99, 0x05, 0xb1, + 0xde, 0x1c, 0x34, 0x38, 0xfc, 0xec, 0x01, 0x83, 0xc3, 0xb0, 0xe8, 0x49, 0xc4, 0x86, 0xd3, 0xf1, + 0xb1, 0x41, 0xc8, 0x7f, 0x88, 0xd0, 0xf0, 0xd9, 0x14, 0xdc, 0x49, 0x2f, 0x8f, 0xd8, 0x4d, 0xdd, + 0x70, 0x67, 0x35, 0x7b, 0xdf, 0x72, 0xe9, 0x72, 0x62, 0xee, 0x70, 0x6b, 0x8c, 0xf9, 0xcd, 0x33, + 0xac, 0xb9, 0x8b, 0x4b, 0xee, 0x40, 0x7a, 0x9d, 0xd0, 0x11, 0x43, 0xb8, 0xa6, 0xab, 0x36, 0xb8, + 0x81, 0xd8, 0x03, 0x81, 0xb2, 0x0b, 0x27, 0x09, 0x06, 0xd5, 0xc5, 0x5d, 0x93, 0x06, 0x56, 0x77, + 0xd8, 0xb9, 0xdd, 0x24, 0x5d, 0x42, 0x32, 0x04, 0x40, 0x8f, 0xe8, 0x4e, 0x40, 0x5a, 0x6d, 0xb1, + 0x57, 0xce, 0x49, 0xb2, 0xb6, 0xd0, 0x07, 0xf9, 0x12, 0x0c, 0xf2, 0xd7, 0x5c, 0x28, 0x0f, 0xc9, + 0x3d, 0xbc, 0x4f, 0xfb, 0xc9, 0x29, 0xe4, 0x27, 0x9a, 0x81, 0x34, 0x15, 0x9e, 0x5f, 0x48, 0x28, + 0xcc, 0xb4, 0x49, 0x3f, 0x43, 0x85, 0x54, 0x18, 0x9a, 0xfc, 0x2c, 0x64, 0x16, 0xcc, 0xa6, 0x6e, + 0x98, 0x61, 0x6e, 0x59, 0xc6, 0x8d, 0xca, 0x6c, 0xb5, 0xb8, 0xeb, 0x2b, 0xec, 0x01, 0x1d, 0x83, + 0x01, 0x76, 0x8e, 0x9b, 0xbf, 0x36, 0xe7, 0x4f, 0xf2, 0x3c, 0x0c, 0x52, 0xde, 0x6b, 0x16, 0x42, + 0xfc, 0x06, 0x10, 0x3f, 0x30, 0x4e, 0xa3, 0x24, 0x67, 0x9f, 0xf0, 0x85, 0x45, 0x90, 0xaa, 0xa9, + 0xae, 0xca, 0xf5, 0xa6, 0xbf, 0xe5, 0xa7, 0x21, 0xc3, 0x99, 0x38, 0xe8, 0x0c, 0x24, 0x4d, 0xcb, + 0xe1, 0x2f, 0xbe, 0x8b, 0xdd, 0x54, 0x59, 0xb3, 0xca, 0x29, 0x32, 0x69, 0x14, 0x82, 0x5c, 0x56, + 0xba, 0xce, 0x92, 0x27, 0x03, 0x8e, 0x14, 0x18, 0xf2, 0xc0, 0x4f, 0x36, 0xa4, 0x6d, 0xee, 0xe0, + 0x39, 0xcb, 0xa7, 0x12, 0x30, 0x19, 0x68, 0xbd, 0x82, 0x6d, 0xb2, 0xd7, 0x63, 0x13, 0x8c, 0x7b, + 0x0b, 0x0a, 0x08, 0xc9, 0xdb, 0xbb, 0xb8, 0xcb, 0x9b, 0x21, 0x39, 0x67, 0x59, 0xa8, 0x08, 0x19, + 0xf6, 0x82, 0xdb, 0x64, 0xfe, 0x92, 0x52, 0xbc, 0x67, 0xd2, 0xe6, 0x98, 0x3b, 0xee, 0x55, 0xd5, + 0xf6, 0xae, 0x3a, 0x89, 0x67, 0xf9, 0x29, 0xc8, 0xce, 0x9b, 0x86, 0x83, 0x0d, 0xa7, 0x45, 0xa7, + 0xde, 0x76, 0xc3, 0xd4, 0xf6, 0x38, 0x07, 0xf6, 0x40, 0x0c, 0xae, 0x5a, 0x16, 0xa5, 0x4c, 0x29, + 0xe4, 0x27, 0x0b, 0x53, 0xe5, 0x8d, 0xae, 0x26, 0x7a, 0xea, 0xe0, 0x26, 0xe2, 0x4a, 0x7a, 0x36, + 0xfa, 0xdf, 0x12, 0x9c, 0x6c, 0x9f, 0x50, 0x7b, 0x78, 0xdf, 0x39, 0xe8, 0x7c, 0x7a, 0x01, 0xb2, + 0xeb, 0xf4, 0xbe, 0xf1, 0x25, 0xbc, 0x8f, 0x8a, 0x30, 0x88, 0x6b, 0x67, 0xce, 0x9e, 0x7d, 0xf4, + 0x29, 0xe6, 0xed, 0x17, 0x8f, 0x28, 0x02, 0x80, 0x26, 0x21, 0xeb, 0x60, 0xcd, 0x3a, 0x73, 0xf6, + 0xdc, 0xde, 0xa3, 0xcc, 0xbd, 0x2e, 0x1e, 0x51, 0x7c, 0x50, 0x29, 0x43, 0xb4, 0x7e, 0xe3, 0x53, + 0x53, 0x52, 0x39, 0x0d, 0x49, 0xa7, 0xd5, 0xbc, 0xad, 0x3e, 0xf2, 0x5a, 0x1a, 0xa6, 0x83, 0x94, + 0x34, 0x40, 0x5d, 0x51, 0x1b, 0x7a, 0x4d, 0xf5, 0x6f, 0x8a, 0xe7, 0x03, 0x36, 0xa0, 0x18, 0x9d, + 0x4d, 0x50, 0xec, 0x69, 0x49, 0xf9, 0xd7, 0x25, 0xc8, 0x5d, 0x16, 0x9c, 0x37, 0xb0, 0x8b, 0xce, + 0x03, 0x78, 0x3d, 0x89, 0x69, 0x73, 0xc7, 0x4c, 0xb4, 0xaf, 0x19, 0x8f, 0x46, 0x09, 0xa0, 0xa3, + 0x27, 0xa8, 0x23, 0x5a, 0xa6, 0xc3, 0xaf, 0xbf, 0xc4, 0x90, 0x7a, 0xc8, 0xe8, 0x21, 0x40, 0x34, + 0xc2, 0x55, 0xaf, 0x98, 0xae, 0x6e, 0xd4, 0xab, 0x96, 0x79, 0x95, 0x5f, 0x2a, 0x4c, 0x2a, 0x79, + 0xda, 0x72, 0x99, 0x36, 0xac, 0x13, 0x38, 0x11, 0x3a, 0xeb, 0x71, 0x21, 0xab, 0x89, 0x5a, 0xab, + 0xd9, 0xd8, 0x71, 0x78, 0x10, 0x13, 0x8f, 0xe8, 0x3c, 0x0c, 0x5a, 0xad, 0xed, 0xaa, 0x88, 0x18, + 0x43, 0x67, 0x4e, 0x76, 0x9a, 0xff, 0xc2, 0x3f, 0x78, 0x04, 0x18, 0xb0, 0x5a, 0xdb, 0xc4, 0x5b, + 0xee, 0x82, 0x5c, 0x07, 0x61, 0x86, 0xae, 0xf8, 0x72, 0xd0, 0x6b, 0xee, 0x5c, 0x83, 0xaa, 0x65, + 0xeb, 0xa6, 0xad, 0xbb, 0xfb, 0xf4, 0xf4, 0x4a, 0x52, 0xc9, 0x8b, 0x86, 0x75, 0x0e, 0x97, 0xf7, + 0x60, 0x74, 0x83, 0xa6, 0x5a, 0xbe, 0xe4, 0x67, 0x7d, 0xf9, 0xa4, 0x78, 0xf9, 0xba, 0x4a, 0x96, + 0x68, 0x93, 0xac, 0xfc, 0x5c, 0x57, 0xef, 0x7c, 0xe2, 0xe0, 0xde, 0x19, 0x5e, 0xfc, 0xff, 0xe8, + 0x44, 0x68, 0x72, 0xf2, 0xcc, 0x3a, 0x10, 0xbe, 0xfa, 0x75, 0xcc, 0xb8, 0x1d, 0x46, 0xb1, 0xf7, + 0xa2, 0x5a, 0x8c, 0x09, 0xa3, 0xc5, 0xd8, 0x29, 0x24, 0x3f, 0x05, 0xc3, 0xeb, 0xaa, 0xed, 0x6e, + 0x60, 0xf7, 0x22, 0x56, 0x6b, 0xd8, 0x0e, 0xaf, 0xba, 0xc3, 0x62, 0xd5, 0x45, 0x90, 0xa2, 0x4b, + 0x2b, 0x5b, 0x75, 0xe8, 0x6f, 0x79, 0x17, 0x52, 0xf4, 0x04, 0x9b, 0xb7, 0x22, 0x73, 0x0a, 0xb6, + 0x22, 0x93, 0x58, 0xba, 0xef, 0x62, 0x47, 0x6c, 0xe8, 0xe8, 0x03, 0x7a, 0x5c, 0xac, 0xab, 0xc9, + 0xde, 0xeb, 0x2a, 0x77, 0x44, 0xbe, 0xba, 0x36, 0x60, 0xb0, 0x4c, 0x42, 0xf1, 0xd2, 0x82, 0x27, + 0x88, 0xe4, 0x0b, 0x82, 0x56, 0x60, 0xd4, 0x52, 0x6d, 0x97, 0x1e, 0xdd, 0xdf, 0xa5, 0x5a, 0x70, + 0x5f, 0x9f, 0x6a, 0x9f, 0x79, 0x21, 0x65, 0x79, 0x2f, 0xc3, 0x56, 0x10, 0x28, 0xff, 0x61, 0x0a, + 0x06, 0xb8, 0x31, 0xde, 0x0c, 0x83, 0xdc, 0xac, 0xdc, 0x3b, 0xef, 0x9c, 0x69, 0x5f, 0x98, 0x66, + 0xbc, 0x05, 0x84, 0xf3, 0x13, 0x34, 0xe8, 0x3e, 0xc8, 0x68, 0xbb, 0xaa, 0x6e, 0x54, 0xf5, 0x9a, + 0xc8, 0x7a, 0x5f, 0xbf, 0x31, 0x35, 0x38, 0x4f, 0x60, 0x4b, 0x0b, 0xca, 0x20, 0x6d, 0x5c, 0xaa, + 0x91, 0x4c, 0x60, 0x17, 0xeb, 0xf5, 0x5d, 0x97, 0xcf, 0x30, 0xfe, 0x84, 0x9e, 0x84, 0x14, 0x71, + 0x08, 0x7e, 0xb1, 0xab, 0xd8, 0xb6, 0xf7, 0xf0, 0x36, 0x80, 0xe5, 0x0c, 0xe9, 0xf8, 0x43, 0xbf, + 0x3f, 0x25, 0x29, 0x94, 0x02, 0xcd, 0xc3, 0x70, 0x43, 0x75, 0xdc, 0x2a, 0x5d, 0xc1, 0x48, 0xf7, + 0x69, 0xca, 0xe2, 0x44, 0xbb, 0x41, 0xb8, 0x61, 0xb9, 0xe8, 0x43, 0x84, 0x8a, 0x81, 0x6a, 0xe8, + 0x14, 0xe4, 0x29, 0x13, 0xcd, 0x6c, 0x36, 0x75, 0x97, 0xe5, 0x56, 0x03, 0xd4, 0xee, 0x23, 0x04, + 0x3e, 0x4f, 0xc1, 0x34, 0xc3, 0xba, 0x03, 0xb2, 0xf4, 0x2a, 0x09, 0x45, 0x61, 0xc7, 0x26, 0x33, + 0x04, 0x40, 0x1b, 0xef, 0x87, 0x51, 0x3f, 0x3e, 0x32, 0x94, 0x0c, 0xe3, 0xe2, 0x83, 0x29, 0xe2, + 0x23, 0x30, 0x61, 0xe0, 0x6b, 0xf4, 0x20, 0x67, 0x08, 0x3b, 0x4b, 0xb1, 0x11, 0x69, 0xbb, 0x1c, + 0xa6, 0xb8, 0x17, 0x46, 0x34, 0x61, 0x7c, 0x86, 0x0b, 0x14, 0x77, 0xd8, 0x83, 0x52, 0xb4, 0x13, + 0x90, 0x51, 0x2d, 0x8b, 0x21, 0x0c, 0xf1, 0xf8, 0x68, 0x59, 0xb4, 0xe9, 0x34, 0x8c, 0x51, 0x1d, + 0x6d, 0xec, 0xb4, 0x1a, 0x2e, 0x67, 0x92, 0xa3, 0x38, 0xa3, 0xa4, 0x41, 0x61, 0x70, 0x8a, 0x7b, + 0x37, 0x0c, 0xe3, 0x2b, 0x7a, 0x0d, 0x1b, 0x1a, 0x66, 0x78, 0xc3, 0x14, 0x2f, 0x27, 0x80, 0x14, + 0xe9, 0x01, 0xf0, 0xe2, 0x5e, 0x55, 0xc4, 0xe4, 0x11, 0xc6, 0x4f, 0xc0, 0xe7, 0x18, 0x58, 0x2e, + 0x40, 0x6a, 0x41, 0x75, 0x55, 0x92, 0x60, 0xb8, 0xd7, 0xd8, 0x42, 0x93, 0x53, 0xc8, 0x4f, 0xf9, + 0x8d, 0x04, 0xa4, 0x2e, 0x9b, 0x2e, 0x46, 0x8f, 0x05, 0x12, 0xc0, 0x91, 0x4e, 0xfe, 0xbc, 0xa1, + 0xd7, 0x0d, 0x5c, 0x5b, 0x71, 0xea, 0x81, 0x7b, 0xdf, 0xbe, 0x3b, 0x25, 0x42, 0xee, 0x34, 0x01, + 0x69, 0xdb, 0x6c, 0x19, 0x35, 0x71, 0xe2, 0x90, 0x3e, 0xa0, 0x0a, 0x64, 0x3c, 0x2f, 0x49, 0xc5, + 0x79, 0xc9, 0x28, 0xf1, 0x12, 0xe2, 0xc3, 0x1c, 0xa0, 0x0c, 0x6e, 0x73, 0x67, 0x29, 0x43, 0xd6, + 0x0b, 0x5e, 0xdc, 0xdb, 0xfa, 0x73, 0x58, 0x9f, 0x8c, 0x2c, 0x26, 0xde, 0xd8, 0x7b, 0xc6, 0x63, + 0x1e, 0x97, 0xf7, 0x1a, 0xb8, 0xf5, 0x42, 0x6e, 0xc5, 0xef, 0xa0, 0x0f, 0x52, 0xbd, 0x7c, 0xb7, + 0x62, 0xf7, 0xd0, 0x4f, 0x42, 0xd6, 0xd1, 0xeb, 0x86, 0xea, 0xb6, 0x6c, 0xcc, 0x3d, 0xcf, 0x07, + 0xc8, 0x5f, 0x92, 0x60, 0x80, 0x79, 0x72, 0xc0, 0x6e, 0x52, 0x67, 0xbb, 0x25, 0xba, 0xd9, 0x2d, + 0x79, 0x78, 0xbb, 0xcd, 0x01, 0x78, 0xc2, 0x38, 0xfc, 0x6a, 0x70, 0x87, 0x8c, 0x81, 0x89, 0xb8, + 0xa1, 0xd7, 0xf9, 0x44, 0x0d, 0x10, 0xc9, 0xff, 0x51, 0x22, 0x49, 0x2c, 0x6f, 0x47, 0x73, 0x30, + 0x2c, 0xe4, 0xaa, 0xee, 0x34, 0xd4, 0x3a, 0xf7, 0x9d, 0x3b, 0xbb, 0x0a, 0x77, 0xa1, 0xa1, 0xd6, + 0x95, 0x21, 0x2e, 0x0f, 0x79, 0xe8, 0x3c, 0x0e, 0x89, 0x2e, 0xe3, 0x10, 0x1a, 0xf8, 0xe4, 0xe1, + 0x06, 0x3e, 0x34, 0x44, 0xa9, 0xe8, 0x10, 0x7d, 0x3e, 0x41, 0x37, 0x33, 0x96, 0xe9, 0xa8, 0x8d, + 0x1f, 0xc6, 0x8c, 0xb8, 0x03, 0xb2, 0x96, 0xd9, 0xa8, 0xb2, 0x16, 0x76, 0x12, 0x37, 0x63, 0x99, + 0x0d, 0xa5, 0x6d, 0xd8, 0xd3, 0xb7, 0x68, 0xba, 0x0c, 0xdc, 0x02, 0xab, 0x0d, 0x46, 0xad, 0x66, + 0x43, 0x8e, 0x99, 0x82, 0xaf, 0x65, 0x8f, 0x10, 0x1b, 0xd0, 0xc5, 0x51, 0x6a, 0x5f, 0x7b, 0x99, + 0xd8, 0x0c, 0x53, 0xe1, 0x78, 0x84, 0x82, 0x85, 0xfe, 0x4e, 0xbb, 0xe0, 0xa0, 0x5b, 0x2a, 0x1c, + 0x4f, 0xfe, 0x39, 0x09, 0x60, 0x99, 0x58, 0x96, 0xea, 0x4b, 0x56, 0x21, 0x87, 0x8a, 0x50, 0x0d, + 0xf5, 0x3c, 0xd9, 0x6d, 0xd0, 0x78, 0xff, 0x39, 0x27, 0x28, 0xf7, 0x3c, 0x0c, 0xfb, 0xce, 0xe8, + 0x60, 0x21, 0xcc, 0x64, 0x8f, 0xac, 0x7a, 0x03, 0xbb, 0x4a, 0xee, 0x4a, 0xe0, 0x49, 0xfe, 0x67, + 0x12, 0x64, 0xa9, 0x4c, 0x2b, 0xd8, 0x55, 0x43, 0x63, 0x28, 0x1d, 0x7e, 0x0c, 0xef, 0x04, 0x60, + 0x6c, 0x1c, 0xfd, 0x65, 0xcc, 0x3d, 0x2b, 0x4b, 0x21, 0x1b, 0xfa, 0xcb, 0x18, 0x9d, 0xf3, 0x0c, + 0x9e, 0xec, 0x6d, 0x70, 0x91, 0x75, 0x73, 0xb3, 0x1f, 0x87, 0x41, 0xfa, 0x29, 0x9d, 0x6b, 0x0e, + 0x4f, 0xa4, 0x07, 0x8c, 0x56, 0x73, 0xf3, 0x9a, 0x23, 0xbf, 0x08, 0x83, 0x9b, 0xd7, 0x58, 0x6d, + 0xe4, 0x0e, 0xc8, 0xda, 0xa6, 0xc9, 0xd7, 0x64, 0x96, 0x0b, 0x65, 0x08, 0x80, 0x2e, 0x41, 0xa2, + 0x1e, 0x90, 0xf0, 0xeb, 0x01, 0x7e, 0x41, 0x23, 0xd9, 0x57, 0x41, 0xe3, 0xf4, 0xbf, 0x93, 0x60, + 0x28, 0x10, 0x1f, 0xd0, 0xa3, 0x70, 0xb4, 0xbc, 0xbc, 0x36, 0x7f, 0xa9, 0xba, 0xb4, 0x50, 0xbd, + 0xb0, 0x3c, 0xb7, 0xe8, 0xdf, 0x35, 0x29, 0x1e, 0x7b, 0xf5, 0xfa, 0x34, 0x0a, 0xe0, 0x6e, 0x19, + 0x7b, 0x86, 0x79, 0xd5, 0x40, 0xb3, 0x30, 0x11, 0x26, 0x99, 0x2b, 0x6f, 0x54, 0x56, 0x37, 0xf3, + 0x52, 0xf1, 0xe8, 0xab, 0xd7, 0xa7, 0xc7, 0x02, 0x14, 0x73, 0xdb, 0x0e, 0x36, 0xdc, 0x76, 0x82, + 0xf9, 0xb5, 0x95, 0x95, 0xa5, 0xcd, 0x7c, 0xa2, 0x8d, 0x80, 0x07, 0xec, 0x07, 0x60, 0x2c, 0x4c, + 0xb0, 0xba, 0xb4, 0x9c, 0x4f, 0x16, 0xd1, 0xab, 0xd7, 0xa7, 0x47, 0x02, 0xd8, 0xab, 0x7a, 0xa3, + 0x98, 0x79, 0xff, 0xa7, 0x27, 0x8f, 0xfc, 0xd2, 0x2f, 0x4e, 0x4a, 0x44, 0xb3, 0xe1, 0x50, 0x8c, + 0x40, 0x0f, 0xc1, 0xf1, 0x8d, 0xa5, 0xc5, 0xd5, 0xca, 0x42, 0x75, 0x65, 0x63, 0xb1, 0xca, 0xbe, + 0xb1, 0xe1, 0x69, 0x37, 0xfa, 0xea, 0xf5, 0xe9, 0x21, 0xae, 0x52, 0x37, 0xec, 0x75, 0xa5, 0x72, + 0x79, 0x6d, 0xb3, 0x92, 0x97, 0x18, 0xf6, 0xba, 0x8d, 0xaf, 0x98, 0x2e, 0xfb, 0xd6, 0xd6, 0x23, + 0x70, 0xa2, 0x03, 0xb6, 0xa7, 0xd8, 0xd8, 0xab, 0xd7, 0xa7, 0x87, 0xd7, 0x6d, 0xcc, 0xe6, 0x0f, + 0xa5, 0x98, 0x81, 0x42, 0x3b, 0xc5, 0xda, 0xfa, 0xda, 0xc6, 0xdc, 0x72, 0x7e, 0xba, 0x98, 0x7f, + 0xf5, 0xfa, 0x74, 0x4e, 0x04, 0x43, 0x82, 0xef, 0x6b, 0x76, 0x3b, 0x77, 0x3c, 0x7f, 0xf2, 0x30, + 0xdc, 0xc3, 0x4b, 0xa2, 0x8e, 0xab, 0xee, 0xe9, 0x46, 0xdd, 0x2b, 0x3c, 0xf3, 0x67, 0xbe, 0xf3, + 0x39, 0xc6, 0x6b, 0xcf, 0x02, 0xda, 0xb3, 0xfc, 0x5c, 0xec, 0xfe, 0x66, 0xa9, 0x18, 0x53, 0x5d, + 0x8d, 0xdf, 0x3a, 0x75, 0x7f, 0x55, 0x51, 0x8c, 0x29, 0xa0, 0x17, 0x7b, 0x6e, 0xee, 0xe4, 0x0f, + 0x48, 0x30, 0x72, 0x51, 0x77, 0x5c, 0xd3, 0xd6, 0x35, 0xb5, 0x41, 0x6f, 0x98, 0x9c, 0xeb, 0x37, + 0xb6, 0x46, 0xa6, 0xfa, 0x33, 0x30, 0x70, 0x45, 0x6d, 0xb0, 0xa0, 0x96, 0xa4, 0x1f, 0xc4, 0xe8, + 0x6c, 0x3e, 0x3f, 0xb4, 0x09, 0x06, 0x8c, 0x4c, 0xfe, 0x95, 0x04, 0x8c, 0xd2, 0xc9, 0xe0, 0xb0, + 0x4f, 0x25, 0x91, 0x3d, 0x56, 0x19, 0x52, 0xb6, 0xea, 0xf2, 0xa2, 0x61, 0x79, 0x86, 0x17, 0xc2, + 0xef, 0x8b, 0x2f, 0x6e, 0xcf, 0x2c, 0x60, 0x4d, 0xa1, 0xb4, 0xe8, 0xed, 0x90, 0x69, 0xaa, 0xd7, + 0xaa, 0x94, 0x0f, 0xdb, 0xb9, 0xcc, 0x1d, 0x8c, 0xcf, 0xcd, 0x1b, 0x53, 0xa3, 0xfb, 0x6a, 0xb3, + 0x51, 0x92, 0x05, 0x1f, 0x59, 0x19, 0x6c, 0xaa, 0xd7, 0x88, 0x88, 0xc8, 0x82, 0x51, 0x02, 0xd5, + 0x76, 0x55, 0xa3, 0x8e, 0x59, 0x27, 0xb4, 0x04, 0x5a, 0xbe, 0x78, 0xe0, 0x4e, 0x8e, 0xf9, 0x9d, + 0x04, 0xd8, 0xc9, 0xca, 0x70, 0x53, 0xbd, 0x36, 0x4f, 0x01, 0xa4, 0xc7, 0x52, 0xe6, 0xa3, 0x9f, + 0x9c, 0x3a, 0x42, 0x5f, 0x2e, 0x7c, 0x43, 0x02, 0xf0, 0x2d, 0x86, 0xde, 0x0e, 0x79, 0xcd, 0x7b, + 0xa2, 0xb4, 0x0e, 0x1f, 0xc3, 0xfb, 0xbb, 0x8d, 0x45, 0xc4, 0xde, 0x6c, 0x6d, 0xfe, 0xfa, 0x8d, + 0x29, 0x49, 0x19, 0xd5, 0x22, 0x43, 0xf1, 0x36, 0x18, 0x6a, 0x59, 0x35, 0xd5, 0xc5, 0x55, 0xba, + 0x8f, 0x4b, 0xc4, 0xae, 0xf3, 0x93, 0x84, 0xd7, 0xcd, 0x1b, 0x53, 0x88, 0xa9, 0x15, 0x20, 0x96, + 0xe9, 0xea, 0x0f, 0x0c, 0x42, 0x08, 0x02, 0x3a, 0x7d, 0x55, 0x82, 0xa1, 0x85, 0xc0, 0x49, 0xaf, + 0x02, 0x0c, 0x36, 0x4d, 0x43, 0xdf, 0xe3, 0xfe, 0x98, 0x55, 0xc4, 0x23, 0x2a, 0x42, 0x86, 0x5d, + 0xba, 0x73, 0xf7, 0x45, 0x29, 0x54, 0x3c, 0x13, 0xaa, 0xab, 0x78, 0xdb, 0xd1, 0xc5, 0x68, 0x28, + 0xe2, 0x11, 0x5d, 0x80, 0xbc, 0x83, 0xb5, 0x96, 0xad, 0xbb, 0xfb, 0x55, 0xcd, 0x34, 0x5c, 0x55, + 0x73, 0xd9, 0xf5, 0xad, 0xf2, 0x1d, 0x37, 0x6f, 0x4c, 0x1d, 0x67, 0xb2, 0x46, 0x31, 0x64, 0x65, + 0x54, 0x80, 0xe6, 0x19, 0x84, 0xf4, 0x50, 0xc3, 0xae, 0xaa, 0x37, 0x9c, 0x02, 0x7b, 0x4f, 0x26, + 0x1e, 0x03, 0xba, 0x7c, 0x6e, 0x30, 0x58, 0xd8, 0xba, 0x00, 0x79, 0xd3, 0xc2, 0x76, 0x28, 0x11, + 0x95, 0xa2, 0x3d, 0x47, 0x31, 0x64, 0x65, 0x54, 0x80, 0x44, 0x92, 0xea, 0x92, 0x61, 0x16, 0x1b, + 0x45, 0xab, 0xb5, 0xed, 0xd7, 0xc3, 0x26, 0xda, 0x46, 0x63, 0xce, 0xd8, 0x2f, 0x3f, 0xe6, 0x73, + 0x8f, 0xd2, 0xc9, 0x5f, 0xfb, 0xc2, 0xc3, 0x13, 0xdc, 0x35, 0xfc, 0xfa, 0xd4, 0x25, 0xbc, 0x4f, + 0x86, 0x9f, 0xa3, 0xae, 0x53, 0x4c, 0x92, 0x76, 0xbe, 0xa8, 0xea, 0x0d, 0x71, 0x0d, 0x59, 0xe1, + 0x4f, 0xa8, 0x04, 0x03, 0x8e, 0xab, 0xba, 0x2d, 0x87, 0x7f, 0x1c, 0x4c, 0xee, 0xe6, 0x6a, 0x65, + 0xd3, 0xa8, 0x6d, 0x50, 0x4c, 0x85, 0x53, 0xa0, 0x0b, 0x30, 0xe0, 0x9a, 0x7b, 0xd8, 0xe0, 0x26, + 0x3c, 0xd0, 0xfc, 0xa6, 0xaf, 0xed, 0x18, 0x35, 0xb1, 0x48, 0x0d, 0x37, 0x70, 0x9d, 0xa5, 0x55, + 0xbb, 0x2a, 0xd9, 0x7d, 0xd0, 0x6f, 0x84, 0x95, 0x97, 0x0e, 0x3c, 0x09, 0xb9, 0xa5, 0xa2, 0xfc, + 0x64, 0x65, 0xd4, 0x03, 0x6d, 0x50, 0x08, 0xba, 0x14, 0x3a, 0x92, 0xc8, 0x3f, 0xa4, 0x77, 0x77, + 0x37, 0xf5, 0x03, 0x3e, 0x2d, 0xea, 0x13, 0xc1, 0x03, 0x8d, 0x17, 0x20, 0xdf, 0x32, 0xb6, 0x4d, + 0x83, 0xde, 0x15, 0xe4, 0xf9, 0x3d, 0xd9, 0xdf, 0x25, 0x83, 0xce, 0x11, 0xc5, 0x90, 0x95, 0x51, + 0x0f, 0x74, 0x91, 0xed, 0x02, 0x6a, 0x30, 0xe2, 0x63, 0xd1, 0x89, 0x9a, 0x8d, 0x9d, 0xa8, 0x77, + 0xf1, 0x89, 0x7a, 0x34, 0xda, 0x8b, 0x3f, 0x57, 0x87, 0x3d, 0x20, 0x21, 0x43, 0x17, 0x01, 0xfc, + 0xf0, 0x40, 0xeb, 0x14, 0x43, 0xdd, 0x07, 0xde, 0x8f, 0x31, 0x62, 0xbf, 0xe7, 0xd3, 0xa2, 0x77, + 0xc2, 0x78, 0x53, 0x37, 0xaa, 0x0e, 0x6e, 0xec, 0x54, 0xb9, 0x81, 0x09, 0x4b, 0xfa, 0xa9, 0x97, + 0xf2, 0xf2, 0xc1, 0xfc, 0xe1, 0xe6, 0x8d, 0xa9, 0x22, 0x0f, 0xa1, 0xed, 0x2c, 0x65, 0x65, 0xac, + 0xa9, 0x1b, 0x1b, 0xb8, 0xb1, 0xb3, 0xe0, 0xc1, 0x4a, 0xb9, 0xf7, 0x7f, 0x72, 0xea, 0x08, 0x9f, + 0xae, 0x47, 0xe4, 0x73, 0xb4, 0x76, 0xce, 0xa7, 0x19, 0x76, 0xc8, 0x9e, 0x44, 0x15, 0x0f, 0xb4, + 0xa2, 0x91, 0x55, 0x7c, 0x00, 0x9b, 0xe6, 0xaf, 0xfc, 0x87, 0x69, 0x49, 0xfe, 0x9c, 0x04, 0x03, + 0x0b, 0x97, 0xd7, 0x55, 0xdd, 0x46, 0x4b, 0x30, 0xe6, 0x7b, 0x4e, 0x78, 0x92, 0x9f, 0xbc, 0x79, + 0x63, 0xaa, 0x10, 0x75, 0x2e, 0x6f, 0x96, 0xfb, 0x0e, 0x2c, 0xa6, 0xf9, 0x52, 0xb7, 0x8d, 0x6b, + 0x88, 0x55, 0x1b, 0x8a, 0xdc, 0xbe, 0xad, 0x8d, 0xa8, 0x59, 0x81, 0x41, 0x26, 0xad, 0x83, 0x4a, + 0x90, 0xb6, 0xc8, 0x0f, 0xfe, 0x62, 0x60, 0xb2, 0xab, 0xf3, 0x52, 0x7c, 0xaf, 0x90, 0x49, 0x48, + 0xe4, 0x0f, 0x27, 0x00, 0x16, 0x2e, 0x5f, 0xde, 0xb4, 0x75, 0xab, 0x81, 0xdd, 0x5b, 0xa9, 0xf9, + 0x26, 0x1c, 0x0d, 0xec, 0x92, 0x6c, 0x2d, 0xa2, 0xfd, 0xf4, 0xcd, 0x1b, 0x53, 0x27, 0xa3, 0xda, + 0x07, 0xd0, 0x64, 0x65, 0xdc, 0xdf, 0x2f, 0xd9, 0x5a, 0x47, 0xae, 0x35, 0xc7, 0xf5, 0xb8, 0x26, + 0xbb, 0x73, 0x0d, 0xa0, 0x05, 0xb9, 0x2e, 0x38, 0x6e, 0x67, 0xd3, 0x6e, 0xc0, 0x90, 0x6f, 0x12, + 0x07, 0x2d, 0x40, 0xc6, 0xe5, 0xbf, 0xb9, 0x85, 0xe5, 0xee, 0x16, 0x16, 0x64, 0xdc, 0xca, 0x1e, + 0xa5, 0xfc, 0x67, 0x12, 0x80, 0xef, 0xb3, 0x3f, 0x9e, 0x2e, 0x46, 0x42, 0x39, 0x0f, 0xbc, 0xc9, + 0x43, 0xa5, 0x6a, 0x9c, 0x3a, 0x62, 0xcf, 0x9f, 0x4e, 0xc0, 0xf8, 0x96, 0x88, 0x3c, 0x3f, 0xf6, + 0x36, 0x58, 0x87, 0x41, 0x6c, 0xb8, 0xb6, 0x4e, 0x8d, 0x40, 0x46, 0xfb, 0x91, 0x6e, 0xa3, 0xdd, + 0x41, 0x27, 0xfa, 0xb1, 0x1b, 0x51, 0x74, 0xe7, 0x6c, 0x22, 0xd6, 0xf8, 0x60, 0x12, 0x0a, 0xdd, + 0x28, 0xd1, 0x3c, 0x8c, 0x6a, 0x36, 0xa6, 0x80, 0x6a, 0xb0, 0xf2, 0x57, 0x2e, 0xfa, 0x99, 0x65, + 0x04, 0x41, 0x56, 0x46, 0x04, 0x84, 0xaf, 0x1e, 0x75, 0x20, 0x69, 0x1f, 0x71, 0x3b, 0x82, 0xd5, + 0x67, 0x9e, 0x27, 0xf3, 0xe5, 0x43, 0x74, 0x12, 0x66, 0xc0, 0xd6, 0x8f, 0x11, 0x1f, 0x4a, 0x17, + 0x90, 0x97, 0x60, 0x54, 0x37, 0x74, 0x57, 0x57, 0x1b, 0xd5, 0x6d, 0xb5, 0xa1, 0x1a, 0xda, 0x61, + 0xb2, 0x66, 0x16, 0xf2, 0x79, 0xb7, 0x11, 0x76, 0xb2, 0x32, 0xc2, 0x21, 0x65, 0x06, 0x40, 0x17, + 0x61, 0x50, 0x74, 0x95, 0x3a, 0x54, 0xb6, 0x21, 0xc8, 0x03, 0x09, 0xde, 0xcf, 0x24, 0x61, 0x4c, + 0xc1, 0xb5, 0xff, 0x3f, 0x14, 0x07, 0x1b, 0x8a, 0x15, 0x00, 0x36, 0xdd, 0x49, 0x80, 0x3d, 0xc4, + 0x68, 0x90, 0x80, 0x91, 0x65, 0x1c, 0x16, 0x1c, 0x37, 0x30, 0x1e, 0x37, 0x12, 0x90, 0x0b, 0x8e, + 0xc7, 0x5f, 0xd0, 0x55, 0x09, 0x2d, 0xf9, 0x91, 0x28, 0xc5, 0x3f, 0x11, 0xda, 0x25, 0x12, 0xb5, + 0x79, 0x6f, 0xef, 0x10, 0xf4, 0x3f, 0x12, 0x30, 0xb0, 0xae, 0xda, 0x6a, 0xd3, 0x41, 0x5a, 0x5b, + 0xa6, 0x29, 0xca, 0x8f, 0x6d, 0x1f, 0x82, 0xe6, 0xd5, 0x8e, 0x98, 0x44, 0xf3, 0xa3, 0x1d, 0x12, + 0xcd, 0x9f, 0x80, 0x11, 0xb2, 0x1d, 0x0e, 0x1c, 0x61, 0x20, 0xd6, 0x1e, 0x2e, 0x9f, 0xf0, 0xb9, + 0x84, 0xdb, 0xd9, 0x6e, 0xf9, 0x72, 0xf0, 0x0c, 0xc3, 0x10, 0xc1, 0xf0, 0x03, 0x33, 0x21, 0x3f, + 0xe6, 0x6f, 0x4b, 0x03, 0x8d, 0xb2, 0x02, 0x4d, 0xf5, 0x5a, 0x85, 0x3d, 0xa0, 0x65, 0x40, 0xbb, + 0x5e, 0x65, 0xa4, 0xea, 0x9b, 0x93, 0xd0, 0xdf, 0x79, 0xf3, 0xc6, 0xd4, 0x09, 0x46, 0xdf, 0x8e, + 0x23, 0x2b, 0x63, 0x3e, 0x50, 0x70, 0x7b, 0x1c, 0x80, 0xe8, 0x55, 0x65, 0xa7, 0x09, 0xd9, 0x76, + 0xe7, 0xe8, 0xcd, 0x1b, 0x53, 0x63, 0x8c, 0x8b, 0xdf, 0x26, 0x2b, 0x59, 0xf2, 0xb0, 0x40, 0x7e, + 0x07, 0x3c, 0xfb, 0xd3, 0x12, 0x20, 0x3f, 0xe4, 0x2b, 0xd8, 0xb1, 0xc8, 0xfe, 0x8c, 0x24, 0xe2, + 0x81, 0xac, 0x59, 0xea, 0x9d, 0x88, 0xfb, 0xf4, 0x22, 0x11, 0x0f, 0xcc, 0x94, 0xa7, 0xfc, 0xf0, + 0x98, 0xe0, 0xe3, 0xd8, 0xe1, 0xe8, 0xe5, 0xcc, 0xbc, 0xa9, 0x0b, 0xea, 0xb6, 0x78, 0x78, 0x44, + 0xfe, 0x57, 0x12, 0x9c, 0x68, 0xf3, 0x28, 0x4f, 0xd8, 0xbf, 0x04, 0xc8, 0x0e, 0x34, 0xf2, 0xef, + 0xbd, 0x31, 0xa1, 0x0f, 0xec, 0xa0, 0x63, 0x76, 0x5b, 0xdc, 0xbd, 0x75, 0x11, 0x9e, 0x9d, 0xdd, + 0xfc, 0xa7, 0x12, 0x4c, 0x04, 0xbb, 0xf7, 0x14, 0x59, 0x85, 0x5c, 0xb0, 0x77, 0xae, 0xc2, 0x3d, + 0xfd, 0xa8, 0xc0, 0xa5, 0x0f, 0xd1, 0xa3, 0xe7, 0xfc, 0xe9, 0xca, 0x6a, 0x67, 0x8f, 0xf6, 0x6d, + 0x0d, 0x21, 0x53, 0x74, 0xda, 0xa6, 0xe8, 0x78, 0xfc, 0x1f, 0x09, 0x52, 0xeb, 0xa6, 0xd9, 0x40, + 0x26, 0x8c, 0x19, 0xa6, 0x5b, 0x25, 0x9e, 0x85, 0x6b, 0x55, 0xbe, 0xe9, 0x66, 0x71, 0x70, 0xfe, + 0x60, 0x46, 0xfa, 0xf6, 0x8d, 0xa9, 0x76, 0x56, 0xca, 0xa8, 0x61, 0xba, 0x65, 0x0a, 0xd9, 0x64, + 0x5b, 0xf2, 0x77, 0xc2, 0x70, 0xb8, 0x33, 0x16, 0x25, 0x9f, 0x3f, 0x70, 0x67, 0x61, 0x36, 0x37, + 0x6f, 0x4c, 0x4d, 0xf8, 0x33, 0xc6, 0x03, 0xcb, 0x4a, 0x6e, 0x3b, 0xd0, 0x3b, 0x3b, 0xde, 0xf5, + 0xdd, 0x4f, 0x4e, 0x49, 0xa7, 0xbf, 0x28, 0x01, 0xf8, 0x95, 0x07, 0xf4, 0x10, 0x1c, 0x2f, 0xaf, + 0xad, 0x2e, 0x54, 0x37, 0x36, 0xe7, 0x36, 0xb7, 0x36, 0xaa, 0x5b, 0xab, 0x1b, 0xeb, 0x95, 0xf9, + 0xa5, 0x0b, 0x4b, 0x95, 0x05, 0xbf, 0x3c, 0xee, 0x58, 0x58, 0xd3, 0x77, 0x74, 0x5c, 0x43, 0xf7, + 0xc1, 0x44, 0x18, 0x9b, 0x3c, 0x55, 0x16, 0xf2, 0x52, 0x31, 0xf7, 0xea, 0xf5, 0xe9, 0x0c, 0xcb, + 0xc5, 0x70, 0x0d, 0x9d, 0x82, 0xa3, 0xed, 0x78, 0x4b, 0xab, 0x8b, 0xf9, 0x44, 0x71, 0xf8, 0xd5, + 0xeb, 0xd3, 0x59, 0x2f, 0x69, 0x43, 0x32, 0xa0, 0x20, 0x26, 0xe7, 0x97, 0x2c, 0xc2, 0xab, 0xd7, + 0xa7, 0x07, 0x98, 0x01, 0x8b, 0xa9, 0xf7, 0x7f, 0x7a, 0xf2, 0x48, 0xf9, 0x42, 0xd7, 0x02, 0xf8, + 0x43, 0x3d, 0x6d, 0x77, 0xcd, 0x2b, 0x6a, 0x87, 0xab, 0xde, 0xaf, 0x1e, 0x87, 0xa9, 0x2e, 0x55, + 0x6f, 0xf7, 0x5a, 0x4c, 0xc1, 0xbb, 0x47, 0x69, 0x3b, 0xb6, 0x74, 0xdd, 0xa5, 0x58, 0x7e, 0xf8, + 0x82, 0x76, 0x5f, 0xb5, 0x7b, 0xf9, 0x5f, 0xa7, 0x00, 0xad, 0x38, 0xf5, 0x79, 0x92, 0x54, 0x05, + 0x8e, 0x68, 0x45, 0x6a, 0x36, 0xd2, 0x0f, 0x54, 0xb3, 0x59, 0x09, 0x55, 0x41, 0x12, 0x07, 0xab, + 0xb4, 0xf6, 0x5d, 0x0a, 0x49, 0xfe, 0x50, 0x4a, 0x21, 0x9d, 0x33, 0xa5, 0xd4, 0xad, 0xdb, 0x52, + 0xa5, 0x0f, 0xbb, 0xad, 0xe4, 0x15, 0xce, 0x81, 0x1e, 0x15, 0xce, 0x42, 0xd7, 0x32, 0x26, 0xa7, + 0x46, 0x67, 0xc5, 0x95, 0x9c, 0xc1, 0xfe, 0xd6, 0x36, 0x7e, 0x67, 0x27, 0xf3, 0x7e, 0xb1, 0xb2, + 0x9d, 0x84, 0x62, 0xbb, 0x3b, 0x89, 0xe0, 0x2b, 0x7f, 0x24, 0x09, 0xf9, 0x15, 0xa7, 0x5e, 0xa9, + 0xe9, 0xee, 0x6d, 0xf2, 0xb5, 0x67, 0xba, 0x6f, 0x53, 0xd1, 0xcd, 0x1b, 0x53, 0x23, 0xcc, 0xa6, + 0x3d, 0x2c, 0xd9, 0x84, 0xd1, 0xc8, 0xcb, 0x01, 0xee, 0x59, 0x0b, 0x87, 0x79, 0x47, 0x11, 0x61, + 0x25, 0xd3, 0x5d, 0x45, 0xc0, 0xbf, 0xd1, 0xb5, 0xce, 0xce, 0xcc, 0x1c, 0xea, 0xe2, 0xed, 0xac, + 0xe9, 0xf9, 0x63, 0x56, 0x84, 0x42, 0x74, 0x50, 0xbc, 0x11, 0xfb, 0x43, 0x09, 0x86, 0x56, 0x1c, + 0xb1, 0x8b, 0xc6, 0x3f, 0xa6, 0x15, 0x85, 0x27, 0xbc, 0x8b, 0x26, 0xc9, 0xfe, 0xfc, 0x56, 0x5c, + 0x3e, 0xf1, 0x8d, 0x70, 0x14, 0xc6, 0x03, 0x7a, 0x7a, 0xfa, 0xff, 0x76, 0x82, 0xc6, 0xc7, 0x32, + 0xae, 0xeb, 0x86, 0x97, 0x54, 0xe0, 0xbf, 0xa8, 0xfb, 0x25, 0xdf, 0xce, 0xa9, 0xc3, 0xda, 0x79, + 0x8f, 0x06, 0x88, 0x88, 0x3d, 0xbd, 0x8c, 0x71, 0xa5, 0x7d, 0x37, 0x2f, 0x1d, 0xe0, 0xa0, 0x4c, + 0x64, 0xcf, 0x2e, 0xbf, 0x21, 0xc1, 0xf0, 0x8a, 0x53, 0xdf, 0x32, 0x6a, 0xff, 0xcf, 0xfb, 0xef, + 0x0e, 0x1c, 0x0d, 0x69, 0x7a, 0x9b, 0x4c, 0x7a, 0xe6, 0xb5, 0x14, 0x24, 0x57, 0x9c, 0x3a, 0x7a, + 0x09, 0x46, 0xa3, 0x49, 0xc3, 0xe9, 0x6e, 0x31, 0xbb, 0x7d, 0x45, 0x28, 0x9e, 0xe9, 0x1f, 0xd7, + 0xd3, 0x64, 0x0f, 0x86, 0xc3, 0x2b, 0xc7, 0xa9, 0x1e, 0x4c, 0x42, 0x98, 0xc5, 0x47, 0xfa, 0xc5, + 0xf4, 0x3a, 0x7b, 0x3b, 0x64, 0xbc, 0xa0, 0x77, 0x77, 0x0f, 0x6a, 0x81, 0x54, 0x7c, 0xb0, 0x0f, + 0x24, 0x8f, 0xfb, 0x4b, 0x30, 0x1a, 0x0d, 0x29, 0xbd, 0xac, 0x17, 0xc1, 0xed, 0x69, 0xbd, 0x6e, + 0x53, 0x6b, 0x1b, 0x20, 0x30, 0x0f, 0xee, 0xed, 0xc1, 0xc1, 0x47, 0x2b, 0x3e, 0xdc, 0x17, 0x9a, + 0xb7, 0xb9, 0xba, 0xd5, 0xc9, 0xf8, 0xbf, 0x48, 0xc0, 0xe9, 0x60, 0x9a, 0xfb, 0x52, 0x0b, 0xdb, + 0xfb, 0x5e, 0x26, 0x6b, 0xa9, 0x75, 0xdd, 0x08, 0xde, 0xbe, 0x3b, 0x11, 0x9c, 0x35, 0x14, 0x57, + 0xc8, 0x2b, 0x1b, 0x30, 0xb4, 0xae, 0xd6, 0xb1, 0x82, 0x5f, 0x6a, 0x61, 0xc7, 0xed, 0x70, 0xfb, + 0xeb, 0x18, 0x0c, 0x98, 0x3b, 0x3b, 0xe2, 0xac, 0x59, 0x4a, 0xe1, 0x4f, 0x68, 0x02, 0xd2, 0x0d, + 0xbd, 0xa9, 0xb3, 0x99, 0x99, 0x52, 0xd8, 0x03, 0x9a, 0x82, 0x21, 0x8d, 0x4c, 0xc0, 0x2a, 0x3b, + 0x37, 0x9f, 0x12, 0x5f, 0x66, 0x6a, 0x19, 0xee, 0x26, 0x81, 0xc8, 0xcf, 0x40, 0x8e, 0xf5, 0xc7, + 0xad, 0x7f, 0x02, 0x32, 0xf4, 0x9c, 0xb3, 0xdf, 0xeb, 0x20, 0x79, 0xbe, 0xc4, 0x6e, 0x8a, 0x31, + 0x2e, 0xac, 0x63, 0xf6, 0x50, 0x2e, 0x77, 0x35, 0xe5, 0xa9, 0xf8, 0x8c, 0x80, 0x19, 0xca, 0x33, + 0xe3, 0x6f, 0xa6, 0xe1, 0x28, 0xdf, 0x7f, 0xa8, 0x96, 0x3e, 0xbb, 0xeb, 0xba, 0xe2, 0x36, 0x33, + 0xf0, 0x10, 0xa0, 0x5a, 0xba, 0xbc, 0x0f, 0xa9, 0x8b, 0xae, 0x6b, 0xa1, 0xd3, 0x90, 0xb6, 0x5b, + 0x0d, 0x2c, 0x5e, 0xc5, 0x78, 0xa9, 0xa4, 0x6a, 0xe9, 0x33, 0x04, 0x41, 0x69, 0x35, 0xb0, 0xc2, + 0x50, 0x50, 0x05, 0xa6, 0x76, 0x5a, 0x8d, 0xc6, 0x7e, 0xb5, 0x86, 0xe9, 0x3f, 0xd5, 0xf3, 0xfe, + 0x2d, 0x0d, 0xbe, 0x66, 0xa9, 0x86, 0x97, 0xef, 0x67, 0x94, 0x93, 0x14, 0x6d, 0x81, 0x62, 0x89, + 0x7f, 0x49, 0x53, 0x11, 0x38, 0xf2, 0xef, 0x25, 0x20, 0x23, 0x58, 0xd3, 0xab, 0x5b, 0xb8, 0x81, + 0x35, 0xd7, 0x14, 0x47, 0x19, 0xbc, 0x67, 0x84, 0x20, 0x59, 0xe7, 0x43, 0x94, 0xbd, 0x78, 0x44, + 0x21, 0x0f, 0x04, 0xe6, 0x5d, 0xa8, 0x23, 0x30, 0xab, 0x45, 0x46, 0x2d, 0x65, 0x99, 0xa2, 0x66, + 0x7a, 0xf1, 0x88, 0x42, 0x9f, 0x50, 0x01, 0x06, 0x88, 0xcb, 0xba, 0xec, 0x8b, 0xc1, 0x04, 0xce, + 0x9f, 0xd1, 0x31, 0x48, 0x5b, 0xaa, 0xab, 0xb1, 0xb3, 0xee, 0xa4, 0x81, 0x3d, 0x92, 0xc0, 0xcc, + 0xbe, 0xd4, 0x10, 0xfd, 0x8f, 0x55, 0xc4, 0x18, 0xec, 0x93, 0x98, 0x44, 0xee, 0x75, 0xd5, 0x75, + 0xb1, 0x6d, 0x10, 0x86, 0x0c, 0x1d, 0x21, 0x48, 0x6d, 0x9b, 0xb5, 0x7d, 0xfe, 0x5f, 0xb4, 0xe8, + 0x6f, 0xfe, 0x6f, 0x7b, 0xa8, 0x3f, 0x54, 0x69, 0x23, 0xfb, 0xe7, 0x81, 0x39, 0x01, 0x2c, 0x13, + 0xa4, 0x0a, 0x8c, 0xab, 0xb5, 0x9a, 0xce, 0xfe, 0xa1, 0x55, 0x75, 0x5b, 0xa7, 0xfb, 0x61, 0x87, + 0xfe, 0x6b, 0xc8, 0x6e, 0x63, 0x81, 0x7c, 0x82, 0x32, 0xc7, 0x2f, 0x67, 0x61, 0xd0, 0x62, 0x42, + 0xc9, 0xe7, 0x61, 0xac, 0x4d, 0x52, 0x22, 0xdf, 0x9e, 0x6e, 0xd4, 0xc4, 0x2d, 0x43, 0xf2, 0x9b, + 0xc0, 0xe8, 0x67, 0x6d, 0xd9, 0x21, 0x11, 0xfa, 0xbb, 0xfc, 0xee, 0xee, 0x77, 0x50, 0x47, 0x02, + 0x77, 0x50, 0x55, 0x4b, 0x2f, 0x67, 0x29, 0x7f, 0x7e, 0xf5, 0x74, 0x8e, 0x37, 0xb0, 0x6b, 0xa7, + 0x33, 0xa6, 0x5d, 0x9f, 0xad, 0x63, 0x43, 0xec, 0x6f, 0x49, 0x93, 0x6a, 0xe9, 0x0e, 0x75, 0x47, + 0xff, 0x33, 0xbb, 0xce, 0xf9, 0xc0, 0x6f, 0x7a, 0x23, 0x35, 0xb5, 0x38, 0xb7, 0xbe, 0xe4, 0xf9, + 0xf1, 0x97, 0x13, 0x70, 0x32, 0xe0, 0xc7, 0x01, 0xe4, 0x76, 0x77, 0x2e, 0x76, 0xf6, 0xf8, 0x3e, + 0x2e, 0xa9, 0x5f, 0x82, 0x14, 0xc1, 0x47, 0x31, 0xff, 0x54, 0xa7, 0xf0, 0xab, 0x5f, 0xfb, 0x27, + 0x72, 0x78, 0xb3, 0x15, 0x1a, 0x15, 0xca, 0xa4, 0xfc, 0xbe, 0xfe, 0xed, 0x97, 0xf7, 0xbf, 0x30, + 0xec, 0xdc, 0x3a, 0x33, 0x46, 0x6d, 0xf8, 0xad, 0xb3, 0x20, 0x77, 0xa9, 0x0c, 0xb0, 0x88, 0xd9, + 0xbb, 0xc4, 0x71, 0x80, 0x70, 0xdc, 0xed, 0x62, 0x5e, 0xaf, 0x11, 0xec, 0xb3, 0x6a, 0x71, 0x0d, + 0x8e, 0x3d, 0x47, 0xfa, 0xf6, 0xeb, 0xd7, 0x22, 0xb0, 0x1f, 0xf3, 0x8e, 0xd9, 0x48, 0xfc, 0x3f, + 0x73, 0x8a, 0x23, 0x34, 0xe0, 0xcb, 0xc7, 0x6b, 0x10, 0xf7, 0xcd, 0x74, 0x5d, 0x2f, 0x66, 0x02, + 0x8b, 0x85, 0x12, 0xa0, 0x94, 0x7f, 0x59, 0x82, 0xe3, 0x6d, 0x5d, 0xf3, 0x18, 0xbf, 0xd8, 0xe1, + 0x0e, 0x61, 0xdf, 0xa7, 0xfb, 0x82, 0xf7, 0x09, 0x17, 0x3b, 0x08, 0x7b, 0x7f, 0xac, 0xb0, 0x4c, + 0x8a, 0x90, 0xb4, 0x4f, 0xc3, 0xd1, 0xb0, 0xb0, 0xc2, 0x4c, 0xf7, 0xc2, 0x48, 0x38, 0x31, 0xe5, + 0xe6, 0x1a, 0x0e, 0xa5, 0xa6, 0x72, 0x35, 0x6a, 0x67, 0x4f, 0xd7, 0x0a, 0x64, 0x3d, 0x54, 0x9e, + 0x4f, 0xf6, 0xad, 0xaa, 0x4f, 0x29, 0x7f, 0x58, 0x82, 0xe9, 0x70, 0x0f, 0xfe, 0x0e, 0xd5, 0x39, + 0x98, 0xb0, 0xb7, 0x6c, 0x88, 0xdf, 0x90, 0xe0, 0xae, 0x1e, 0x32, 0x71, 0x03, 0xbc, 0x0c, 0x13, + 0x81, 0x12, 0xbd, 0x08, 0xe1, 0x62, 0xd8, 0x4f, 0xc7, 0xbf, 0x5b, 0xf0, 0x92, 0xa6, 0x3b, 0x88, + 0x51, 0x3e, 0xfb, 0xfb, 0x53, 0xe3, 0xed, 0x6d, 0x8e, 0x32, 0xde, 0x5e, 0x56, 0xbf, 0x85, 0xfe, + 0xf1, 0x9a, 0x04, 0x0f, 0x84, 0x55, 0xed, 0xf0, 0xde, 0xfc, 0x47, 0x35, 0x0e, 0xff, 0x5e, 0x82, + 0xd3, 0xfd, 0x08, 0xe7, 0xe5, 0xb7, 0xe3, 0xfe, 0x8b, 0xb2, 0xe8, 0x78, 0x3c, 0x78, 0x80, 0x13, + 0x06, 0xdc, 0x4b, 0x91, 0xc7, 0xed, 0x36, 0x18, 0xde, 0xe2, 0x13, 0x2b, 0x38, 0xe4, 0x9e, 0x91, + 0xc3, 0xbb, 0x4f, 0x61, 0xe4, 0xd0, 0xfe, 0xb3, 0xc3, 0x58, 0x24, 0x3a, 0x8c, 0x45, 0x60, 0x7f, + 0x78, 0x85, 0xc7, 0xad, 0x0e, 0x2f, 0xc7, 0xde, 0x06, 0xe3, 0x1d, 0x5c, 0x99, 0xcf, 0xea, 0x03, + 0x78, 0xb2, 0x82, 0xda, 0x9d, 0x55, 0xde, 0x87, 0x29, 0xda, 0x6f, 0x07, 0x43, 0xdf, 0x6e, 0x95, + 0x9b, 0x3c, 0xb6, 0x74, 0xec, 0x9a, 0xeb, 0xbe, 0x04, 0x03, 0x6c, 0x9c, 0xb9, 0xba, 0x87, 0x70, + 0x14, 0xce, 0x40, 0xfe, 0x79, 0x11, 0xcb, 0x16, 0x84, 0xd8, 0x9d, 0xe7, 0x50, 0x3f, 0xba, 0xde, + 0xa2, 0x39, 0x14, 0x30, 0xc6, 0x37, 0x44, 0x54, 0xeb, 0x2c, 0x1d, 0x37, 0x87, 0x76, 0xcb, 0xa2, + 0x1a, 0xb3, 0xcd, 0xed, 0x0d, 0x5f, 0xbf, 0x28, 0xc2, 0x97, 0xa7, 0x53, 0x4c, 0xf8, 0xfa, 0xd1, + 0x98, 0xde, 0x0b, 0x64, 0x31, 0x62, 0xfe, 0x79, 0x0c, 0x64, 0xdf, 0x95, 0xe0, 0x04, 0xd5, 0x2d, + 0xf8, 0xc6, 0xf5, 0xa0, 0x26, 0x7f, 0x08, 0x90, 0x63, 0x6b, 0xd5, 0x8e, 0xb3, 0x3b, 0xef, 0xd8, + 0xda, 0xe5, 0xd0, 0xfa, 0xf2, 0x10, 0xa0, 0x9a, 0xe3, 0x46, 0xb1, 0xd9, 0xf1, 0xf5, 0x7c, 0xcd, + 0x71, 0x2f, 0xf7, 0x58, 0x8d, 0x52, 0xb7, 0x60, 0x38, 0xbf, 0x2e, 0x41, 0xb1, 0x93, 0xca, 0x7c, + 0xf8, 0x74, 0x38, 0x16, 0x7a, 0x7b, 0x1f, 0x1d, 0xc1, 0x87, 0xfa, 0x79, 0x67, 0x1d, 0x99, 0x46, + 0x47, 0x6d, 0x7c, 0xbb, 0xf3, 0x80, 0xa9, 0xb0, 0x87, 0xb6, 0x67, 0xd6, 0x3f, 0xb2, 0xe9, 0xf3, + 0x85, 0xb6, 0xb8, 0xfa, 0xe7, 0x22, 0xf7, 0xbe, 0x06, 0x93, 0x5d, 0xa4, 0xbe, 0xdd, 0xeb, 0xde, + 0x6e, 0xd7, 0xc1, 0xbc, 0xd5, 0xe9, 0xfb, 0xe3, 0x7c, 0x26, 0x84, 0xaf, 0x46, 0x05, 0xf6, 0x62, + 0x9d, 0xee, 0x56, 0xcb, 0x6f, 0x81, 0x3b, 0x3a, 0x52, 0x71, 0xd9, 0x4a, 0x90, 0xda, 0xd5, 0x1d, + 0x97, 0x8b, 0x75, 0x5f, 0x37, 0xb1, 0x22, 0xd4, 0x94, 0x46, 0x46, 0x90, 0xa7, 0xac, 0xd7, 0x4d, + 0xb3, 0xc1, 0xc5, 0x90, 0x2f, 0xc1, 0x58, 0x00, 0xc6, 0x3b, 0x39, 0x07, 0x29, 0xcb, 0xe4, 0xdf, + 0x0d, 0x1a, 0x3a, 0x73, 0xb2, 0x5b, 0x27, 0x84, 0x86, 0xab, 0x4d, 0xf1, 0xe5, 0x09, 0x40, 0x8c, + 0x19, 0x3d, 0xdc, 0x25, 0xba, 0xd8, 0x80, 0xf1, 0x10, 0x94, 0x77, 0xf2, 0x26, 0x18, 0xb0, 0x28, + 0xc4, 0xbb, 0x04, 0xdb, 0xad, 0x1b, 0x8a, 0xe5, 0x7d, 0x89, 0x85, 0x3e, 0x9d, 0xf9, 0xf6, 0x51, + 0x48, 0x53, 0xae, 0xe8, 0x63, 0x12, 0x40, 0xe0, 0xa8, 0xd6, 0x4c, 0x37, 0x36, 0x9d, 0xf7, 0xc4, + 0xc5, 0xd9, 0xbe, 0xf1, 0x79, 0xce, 0x76, 0xfa, 0xdd, 0xff, 0xe6, 0x5b, 0x1f, 0x49, 0xdc, 0x83, + 0xe4, 0xd9, 0x2e, 0xbb, 0xf1, 0xc0, 0x7c, 0xf9, 0x4c, 0xe8, 0xa3, 0x34, 0x0f, 0xf7, 0xd7, 0x95, + 0x90, 0x6c, 0xa6, 0x5f, 0x74, 0x2e, 0xd8, 0x79, 0x2a, 0xd8, 0x59, 0xf4, 0x58, 0xbc, 0x60, 0xb3, + 0xef, 0x08, 0x4f, 0x9a, 0x77, 0xa1, 0xdf, 0x91, 0x60, 0xa2, 0xd3, 0x96, 0x0e, 0x3d, 0xd9, 0x9f, + 0x14, 0xed, 0x29, 0x45, 0xf1, 0xa9, 0x43, 0x50, 0x72, 0x55, 0x16, 0xa9, 0x2a, 0x73, 0xe8, 0x99, + 0x43, 0xa8, 0x32, 0x1b, 0x58, 0x77, 0xd0, 0xff, 0x92, 0xe0, 0xce, 0x9e, 0x3b, 0x24, 0x34, 0xd7, + 0x9f, 0x94, 0x3d, 0x72, 0xa7, 0x62, 0xf9, 0x07, 0x61, 0xc1, 0x35, 0x7e, 0x8e, 0x6a, 0x7c, 0x09, + 0x2d, 0x1d, 0x46, 0x63, 0x3f, 0x23, 0x0a, 0xea, 0xfe, 0x5b, 0xe1, 0x23, 0xff, 0xbd, 0xdd, 0xa9, + 0x6d, 0xe3, 0x11, 0x33, 0x31, 0xda, 0x93, 0x5a, 0xf9, 0x05, 0xaa, 0x82, 0x82, 0xd6, 0x7f, 0xc0, + 0x41, 0x9b, 0x7d, 0x47, 0x38, 0xf0, 0xbf, 0x0b, 0xfd, 0x4f, 0xa9, 0xf3, 0x09, 0xfe, 0x27, 0x7a, + 0x8a, 0xd8, 0x7d, 0x53, 0x55, 0x7c, 0xf2, 0xe0, 0x84, 0x5c, 0xc9, 0x26, 0x55, 0xb2, 0x8e, 0xf0, + 0xad, 0x56, 0xb2, 0xe3, 0x20, 0xa2, 0xaf, 0x4a, 0x30, 0xd1, 0x69, 0x4f, 0x12, 0x33, 0x2d, 0x7b, + 0x6c, 0xb2, 0x62, 0xa6, 0x65, 0xaf, 0x0d, 0x90, 0xfc, 0x26, 0xaa, 0xfc, 0x39, 0xf4, 0x78, 0x37, + 0xe5, 0x7b, 0x8e, 0x22, 0x99, 0x8b, 0x3d, 0x93, 0xfc, 0x98, 0xb9, 0xd8, 0xcf, 0x3e, 0x26, 0x66, + 0x2e, 0xf6, 0xb5, 0xc7, 0x88, 0x9f, 0x8b, 0x9e, 0x66, 0x7d, 0x0e, 0xa3, 0x83, 0xbe, 0x2c, 0xc1, + 0x70, 0x28, 0x23, 0x46, 0x8f, 0xf6, 0x14, 0xb4, 0xd3, 0x86, 0xa1, 0xfb, 0x8b, 0xcd, 0xee, 0x09, + 0xb7, 0xbc, 0x44, 0x75, 0x99, 0x47, 0x73, 0x87, 0xd1, 0xc5, 0x0e, 0x49, 0xfc, 0x75, 0x09, 0xc6, + 0x3b, 0x64, 0x99, 0x31, 0xb3, 0xb0, 0x7b, 0xd2, 0x5c, 0x7c, 0xf2, 0xe0, 0x84, 0x5c, 0xab, 0x0b, + 0x54, 0xab, 0x9f, 0x40, 0x4f, 0x1f, 0x46, 0xab, 0xc0, 0xfa, 0x7c, 0xc3, 0x3f, 0x10, 0x1d, 0xe8, + 0x07, 0x9d, 0x3b, 0xa0, 0x60, 0x42, 0xa1, 0x27, 0x0e, 0x4c, 0xc7, 0xf5, 0x79, 0x9e, 0xea, 0xf3, + 0x1c, 0x5a, 0xfb, 0xc1, 0xf4, 0x69, 0x5f, 0xd6, 0x3f, 0xdf, 0x7e, 0x35, 0xbf, 0xb7, 0x17, 0x75, + 0x4c, 0x56, 0x8b, 0x8f, 0x1d, 0x88, 0x86, 0x2b, 0xf5, 0x24, 0x55, 0xea, 0x0c, 0x7a, 0xa4, 0x9b, + 0x52, 0x81, 0x53, 0xef, 0xba, 0xb1, 0x63, 0xce, 0xbe, 0x83, 0xa5, 0xc0, 0xef, 0x42, 0x3f, 0x25, + 0x4e, 0x1c, 0x9f, 0xea, 0xd9, 0x6f, 0x20, 0x8f, 0x2d, 0x3e, 0xd0, 0x07, 0x26, 0x97, 0xeb, 0x1e, + 0x2a, 0xd7, 0x24, 0x3a, 0xd9, 0x4d, 0x2e, 0x92, 0xcb, 0xa2, 0x0f, 0x48, 0xde, 0x25, 0x85, 0xd3, + 0xbd, 0x79, 0x07, 0x93, 0xdd, 0xee, 0x07, 0x1d, 0x3a, 0xa4, 0xc0, 0xf2, 0x7d, 0x54, 0x92, 0x69, + 0x34, 0xd9, 0x55, 0x12, 0x96, 0xfa, 0xde, 0xea, 0x93, 0x03, 0x7f, 0x3c, 0xd8, 0xf5, 0xe3, 0x15, + 0x75, 0x6c, 0x60, 0x47, 0x77, 0x0e, 0xf5, 0xf1, 0x8a, 0xfe, 0x5e, 0x4f, 0xfd, 0x4e, 0x1a, 0x72, + 0x8b, 0xac, 0x97, 0x0d, 0x57, 0x75, 0x7f, 0xc0, 0x8d, 0x00, 0x72, 0xf8, 0x37, 0xd9, 0xd8, 0xa7, + 0x22, 0xfd, 0x8f, 0x1f, 0xe6, 0x0e, 0x74, 0x6d, 0x9b, 0x1d, 0x12, 0xe4, 0x37, 0xa4, 0xa3, 0xfc, + 0x64, 0xf6, 0x79, 0x37, 0x7a, 0x76, 0x81, 0x7d, 0xe4, 0xf1, 0xbd, 0x12, 0x1c, 0xa5, 0x58, 0xfe, + 0x7c, 0xa3, 0x98, 0xe2, 0xce, 0x5e, 0x57, 0x8f, 0x59, 0x56, 0x03, 0x25, 0x18, 0xf6, 0x59, 0xc6, + 0x7b, 0xf8, 0x7d, 0x96, 0x93, 0x81, 0xce, 0xa3, 0x6c, 0x65, 0x65, 0xbc, 0xd1, 0x46, 0xe9, 0x44, + 0xf6, 0xf5, 0xa9, 0xc3, 0xef, 0xeb, 0x9f, 0x85, 0xa1, 0x40, 0xa4, 0x2f, 0xa4, 0x63, 0xae, 0x99, + 0x46, 0x8b, 0x68, 0x41, 0x62, 0xf4, 0x3e, 0x09, 0x8e, 0x76, 0x5c, 0x04, 0xe9, 0xff, 0xaa, 0x3d, + 0x60, 0x91, 0x2e, 0x62, 0x9c, 0x8e, 0x7c, 0x65, 0x65, 0xa2, 0xd5, 0x29, 0x9b, 0x58, 0x87, 0xe1, + 0xd0, 0x02, 0x56, 0x10, 0xff, 0x71, 0xba, 0xff, 0x1b, 0x16, 0x61, 0x06, 0xa8, 0x08, 0x19, 0x7c, + 0xcd, 0x32, 0x6d, 0x17, 0xd7, 0xe8, 0x91, 0x87, 0x8c, 0xe2, 0x3d, 0xcb, 0xab, 0x80, 0xda, 0x07, + 0x37, 0xfa, 0x1d, 0xd2, 0xac, 0xff, 0x1d, 0xd2, 0x09, 0x48, 0x07, 0xbf, 0xd4, 0xc9, 0x1e, 0xfc, + 0x3a, 0xc5, 0xad, 0x9e, 0xf3, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x4f, 0xa1, 0x5b, 0x6b, 0x6a, + 0x94, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) From 300b7393addba8c162cae929db90b083dcf93bd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?colin=20axn=C3=A9r?= <25233464+colin-axner@users.noreply.github.com> Date: Tue, 10 Nov 2020 18:05:21 +0100 Subject: [PATCH 3/4] Update IBC host keys + cleanup (#7873) * init changes * cleanup keys and remove redunancdy * revert unintentional changes * KeyChannel -> ChannelKey --- .../transfer/keeper/relay_test.go | 2 +- x/ibc/core/02-client/client/utils/utils.go | 4 +- x/ibc/core/02-client/keeper/grpc_query.go | 2 +- x/ibc/core/02-client/keeper/keeper.go | 18 +- x/ibc/core/02-client/simulation/decoder.go | 4 +- .../core/02-client/simulation/decoder_test.go | 4 +- .../core/03-connection/client/utils/utils.go | 4 +- x/ibc/core/03-connection/keeper/grpc_query.go | 2 +- .../03-connection/keeper/handshake_test.go | 20 +- x/ibc/core/03-connection/keeper/keeper.go | 10 +- .../core/03-connection/keeper/verify_test.go | 12 +- .../core/03-connection/simulation/decoder.go | 4 +- .../03-connection/simulation/decoder_test.go | 4 +- x/ibc/core/04-channel/client/utils/utils.go | 10 +- x/ibc/core/04-channel/keeper/grpc_query.go | 4 +- .../core/04-channel/keeper/handshake_test.go | 8 +- x/ibc/core/04-channel/keeper/keeper.go | 36 ++-- x/ibc/core/04-channel/keeper/packet_test.go | 4 +- x/ibc/core/04-channel/keeper/timeout_test.go | 10 +- x/ibc/core/04-channel/simulation/decoder.go | 2 +- .../04-channel/simulation/decoder_test.go | 12 +- x/ibc/core/24-host/errors.go | 7 +- x/ibc/core/24-host/keys.go | 185 ++++++++++-------- x/ibc/core/24-host/parse.go | 2 +- x/ibc/core/keeper/msg_server_test.go | 32 +-- x/ibc/core/simulation/decoder_test.go | 6 +- x/ibc/core/spec/02_state.md | 14 +- .../06-solomachine/types/client_state.go | 6 +- .../06-solomachine/types/solomachine_test.go | 2 +- .../07-tendermint/types/client_state.go | 4 +- .../07-tendermint/types/client_state_test.go | 12 +- .../07-tendermint/types/store.go | 2 +- .../07-tendermint/types/store_test.go | 4 +- .../09-localhost/types/client_state.go | 16 +- .../09-localhost/types/client_state_test.go | 30 +-- x/ibc/testing/chain.go | 16 +- x/ibc/testing/coordinator.go | 4 +- x/ibc/testing/solomachine.go | 6 +- 38 files changed, 273 insertions(+), 251 deletions(-) diff --git a/x/ibc/applications/transfer/keeper/relay_test.go b/x/ibc/applications/transfer/keeper/relay_test.go index 5bb7993f9..738de9e80 100644 --- a/x/ibc/applications/transfer/keeper/relay_test.go +++ b/x/ibc/applications/transfer/keeper/relay_test.go @@ -109,7 +109,7 @@ func (suite *KeeperTestSuite) TestSendTransfer() { packet := channeltypes.NewPacket(fungibleTokenPacket.GetBytes(), 1, channelB.PortID, channelB.ID, channelA.PortID, channelA.ID, clienttypes.NewHeight(0, 110), 0) // get proof of packet commitment from chainB - packetKey := host.KeyPacketCommitment(packet.GetSourcePort(), packet.GetSourceChannel(), packet.GetSequence()) + packetKey := host.PacketCommitmentKey(packet.GetSourcePort(), packet.GetSourceChannel(), packet.GetSequence()) proof, proofHeight := suite.chainB.QueryProof(packetKey) recvMsg := channeltypes.NewMsgRecvPacket(packet, proof, proofHeight, suite.chainA.SenderAccount.GetAddress()) diff --git a/x/ibc/core/02-client/client/utils/utils.go b/x/ibc/core/02-client/client/utils/utils.go index bcd649ae7..200f6423f 100644 --- a/x/ibc/core/02-client/client/utils/utils.go +++ b/x/ibc/core/02-client/client/utils/utils.go @@ -38,7 +38,7 @@ func QueryClientState( func QueryClientStateABCI( clientCtx client.Context, clientID string, ) (*types.QueryClientStateResponse, error) { - key := host.FullKeyClientPath(clientID, host.KeyClientState()) + key := host.FullClientStateKey(clientID) value, proofBz, proofHeight, err := ibcclient.QueryTendermintProof(clientCtx, key) if err != nil { @@ -91,7 +91,7 @@ func QueryConsensusState( func QueryConsensusStateABCI( clientCtx client.Context, clientID string, height exported.Height, ) (*types.QueryConsensusStateResponse, error) { - key := host.FullKeyClientPath(clientID, host.KeyConsensusState(height)) + key := host.FullConsensusStateKey(clientID, height) value, proofBz, proofHeight, err := ibcclient.QueryTendermintProof(clientCtx, key) if err != nil { diff --git a/x/ibc/core/02-client/keeper/grpc_query.go b/x/ibc/core/02-client/keeper/grpc_query.go index eeb3c10b8..8bb530689 100644 --- a/x/ibc/core/02-client/keeper/grpc_query.go +++ b/x/ibc/core/02-client/keeper/grpc_query.go @@ -152,7 +152,7 @@ func (q Keeper) ConsensusStates(c context.Context, req *types.QueryConsensusStat ctx := sdk.UnwrapSDKContext(c) consensusStates := []types.ConsensusStateWithHeight{} - store := prefix.NewStore(ctx.KVStore(q.storeKey), host.FullKeyClientPath(req.ClientId, []byte(fmt.Sprintf("%s/", host.KeyConsensusStatesPrefix)))) + store := prefix.NewStore(ctx.KVStore(q.storeKey), host.FullClientKey(req.ClientId, []byte(fmt.Sprintf("%s/", host.KeyConsensusStatePrefix)))) pageRes, err := query.Paginate(store, req.Pagination, func(key, value []byte) error { height, err := types.ParseHeight(string(key)) diff --git a/x/ibc/core/02-client/keeper/keeper.go b/x/ibc/core/02-client/keeper/keeper.go index 8af73dd75..7c68499f8 100644 --- a/x/ibc/core/02-client/keeper/keeper.go +++ b/x/ibc/core/02-client/keeper/keeper.go @@ -46,7 +46,7 @@ func (k Keeper) Logger(ctx sdk.Context) log.Logger { // GetClientState gets a particular client from the store func (k Keeper) GetClientState(ctx sdk.Context, clientID string) (exported.ClientState, bool) { store := k.ClientStore(ctx, clientID) - bz := store.Get(host.KeyClientState()) + bz := store.Get(host.ClientStateKey()) if bz == nil { return nil, false } @@ -58,13 +58,13 @@ func (k Keeper) GetClientState(ctx sdk.Context, clientID string) (exported.Clien // SetClientState sets a particular Client to the store func (k Keeper) SetClientState(ctx sdk.Context, clientID string, clientState exported.ClientState) { store := k.ClientStore(ctx, clientID) - store.Set(host.KeyClientState(), k.MustMarshalClientState(clientState)) + store.Set(host.ClientStateKey(), k.MustMarshalClientState(clientState)) } // GetClientConsensusState gets the stored consensus state from a client at a given height. func (k Keeper) GetClientConsensusState(ctx sdk.Context, clientID string, height exported.Height) (exported.ConsensusState, bool) { store := k.ClientStore(ctx, clientID) - bz := store.Get(host.KeyConsensusState(height)) + bz := store.Get(host.ConsensusStateKey(height)) if bz == nil { return nil, false } @@ -77,7 +77,7 @@ func (k Keeper) GetClientConsensusState(ctx sdk.Context, clientID string, height // height func (k Keeper) SetClientConsensusState(ctx sdk.Context, clientID string, height exported.Height, consensusState exported.ConsensusState) { store := k.ClientStore(ctx, clientID) - store.Set(host.KeyConsensusState(height), k.MustMarshalConsensusState(consensusState)) + store.Set(host.ConsensusStateKey(height), k.MustMarshalConsensusState(consensusState)) } // IterateConsensusStates provides an iterator over all stored consensus states. @@ -91,7 +91,7 @@ func (k Keeper) IterateConsensusStates(ctx sdk.Context, cb func(clientID string, for ; iterator.Valid(); iterator.Next() { keySplit := strings.Split(string(iterator.Key()), "/") // consensus key is in the format "clients//consensusStates/" - if len(keySplit) != 4 || keySplit[2] != string(host.KeyConsensusStatesPrefix) { + if len(keySplit) != 4 || keySplit[2] != string(host.KeyConsensusStatePrefix) { continue } clientID := keySplit[1] @@ -144,7 +144,7 @@ func (k Keeper) GetAllConsensusStates(ctx sdk.Context) types.ClientsConsensusSta // client at the given height func (k Keeper) HasClientConsensusState(ctx sdk.Context, clientID string, height exported.Height) bool { store := k.ClientStore(ctx, clientID) - return store.Has(host.KeyConsensusState(height)) + return store.Has(host.ConsensusStateKey(height)) } // GetLatestClientConsensusState gets the latest ConsensusState stored for a given client @@ -266,7 +266,7 @@ func (k Keeper) IterateClients(ctx sdk.Context, cb func(clientID string, cs expo defer iterator.Close() for ; iterator.Valid(); iterator.Next() { keySplit := strings.Split(string(iterator.Key()), "/") - if keySplit[len(keySplit)-1] != "clientState" { + if keySplit[len(keySplit)-1] != host.KeyClientState { continue } clientState := k.MustUnmarshalClientState(iterator.Value()) @@ -291,8 +291,6 @@ func (k Keeper) GetAllClients(ctx sdk.Context) (states []exported.ClientState) { // ClientStore returns isolated prefix store for each client so they can read/write in separate // namespace without being able to read/write other client's data func (k Keeper) ClientStore(ctx sdk.Context, clientID string) sdk.KVStore { - // append here is safe, appends within a function won't cause - // weird side effects when its singlethreaded - clientPrefix := append([]byte("clients/"+clientID), '/') + clientPrefix := []byte(fmt.Sprintf("%s/%s/", host.KeyClientStorePrefix, clientID)) return prefix.NewStore(ctx.KVStore(k.storeKey), clientPrefix) } diff --git a/x/ibc/core/02-client/simulation/decoder.go b/x/ibc/core/02-client/simulation/decoder.go index a5cff11d4..03a803b1b 100644 --- a/x/ibc/core/02-client/simulation/decoder.go +++ b/x/ibc/core/02-client/simulation/decoder.go @@ -22,12 +22,12 @@ type ClientUnmarshaler interface { // Value to the corresponding client type. func NewDecodeStore(cdc ClientUnmarshaler, kvA, kvB kv.Pair) (string, bool) { switch { - case bytes.HasPrefix(kvA.Key, host.KeyClientStorePrefix) && bytes.HasSuffix(kvA.Key, host.KeyClientState()): + case bytes.HasPrefix(kvA.Key, host.KeyClientStorePrefix) && bytes.HasSuffix(kvA.Key, []byte(host.KeyClientState)): clientStateA := cdc.MustUnmarshalClientState(kvA.Value) clientStateB := cdc.MustUnmarshalClientState(kvB.Value) return fmt.Sprintf("ClientState A: %v\nClientState B: %v", clientStateA, clientStateB), true - case bytes.HasPrefix(kvA.Key, host.KeyClientStorePrefix) && bytes.Contains(kvA.Key, []byte("consensusState")): + case bytes.HasPrefix(kvA.Key, host.KeyClientStorePrefix) && bytes.Contains(kvA.Key, []byte(host.KeyConsensusStatePrefix)): consensusStateA := cdc.MustUnmarshalConsensusState(kvA.Value) consensusStateB := cdc.MustUnmarshalConsensusState(kvB.Value) return fmt.Sprintf("ConsensusState A: %v\nConsensusState B: %v", consensusStateA, consensusStateB), true diff --git a/x/ibc/core/02-client/simulation/decoder_test.go b/x/ibc/core/02-client/simulation/decoder_test.go index 6ee442eab..095834ba0 100644 --- a/x/ibc/core/02-client/simulation/decoder_test.go +++ b/x/ibc/core/02-client/simulation/decoder_test.go @@ -32,11 +32,11 @@ func TestDecodeStore(t *testing.T) { kvPairs := kv.Pairs{ Pairs: []kv.Pair{ { - Key: host.FullKeyClientPath(clientID, host.KeyClientState()), + Key: host.FullClientStateKey(clientID), Value: app.IBCKeeper.ClientKeeper.MustMarshalClientState(clientState), }, { - Key: host.FullKeyClientPath(clientID, host.KeyConsensusState(height)), + Key: host.FullConsensusStateKey(clientID, height), Value: app.IBCKeeper.ClientKeeper.MustMarshalConsensusState(consState), }, { diff --git a/x/ibc/core/03-connection/client/utils/utils.go b/x/ibc/core/03-connection/client/utils/utils.go index 955ecfe6b..44283aef8 100644 --- a/x/ibc/core/03-connection/client/utils/utils.go +++ b/x/ibc/core/03-connection/client/utils/utils.go @@ -38,7 +38,7 @@ func QueryConnection( } func queryConnectionABCI(clientCtx client.Context, connectionID string) (*types.QueryConnectionResponse, error) { - key := host.KeyConnection(connectionID) + key := host.ConnectionKey(connectionID) value, proofBz, proofHeight, err := ibcclient.QueryTendermintProof(clientCtx, key) if err != nil { @@ -79,7 +79,7 @@ func QueryClientConnections( } func queryClientConnectionsABCI(clientCtx client.Context, clientID string) (*types.QueryClientConnectionsResponse, error) { - key := host.KeyClientConnections(clientID) + key := host.ClientConnectionsKey(clientID) value, proofBz, proofHeight, err := ibcclient.QueryTendermintProof(clientCtx, key) if err != nil { diff --git a/x/ibc/core/03-connection/keeper/grpc_query.go b/x/ibc/core/03-connection/keeper/grpc_query.go index 1c644e3da..5b34d1e4e 100644 --- a/x/ibc/core/03-connection/keeper/grpc_query.go +++ b/x/ibc/core/03-connection/keeper/grpc_query.go @@ -51,7 +51,7 @@ func (q Keeper) Connections(c context.Context, req *types.QueryConnectionsReques ctx := sdk.UnwrapSDKContext(c) connections := []*types.IdentifiedConnection{} - store := prefix.NewStore(ctx.KVStore(q.storeKey), host.KeyConnectionPrefix) + store := prefix.NewStore(ctx.KVStore(q.storeKey), []byte(host.KeyConnectionPrefix)) pageRes, err := query.Paginate(store, req.Pagination, func(key, value []byte) error { var result types.ConnectionEnd diff --git a/x/ibc/core/03-connection/keeper/handshake_test.go b/x/ibc/core/03-connection/keeper/handshake_test.go index b677b2352..903781086 100644 --- a/x/ibc/core/03-connection/keeper/handshake_test.go +++ b/x/ibc/core/03-connection/keeper/handshake_test.go @@ -306,18 +306,18 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { counterpartyChosenConnectionID = connection.Counterparty.ConnectionId } - connectionKey := host.KeyConnection(connA.ID) + connectionKey := host.ConnectionKey(connA.ID) proofInit, proofHeight := suite.chainA.QueryProof(connectionKey) if consensusHeight.IsZero() { // retrieve consensus state height to provide proof for consensusHeight = counterpartyClient.GetLatestHeight() } - consensusKey := host.FullKeyClientPath(clientA, host.KeyConsensusState(consensusHeight)) + consensusKey := host.FullConsensusStateKey(clientA, consensusHeight) proofConsensus, _ := suite.chainA.QueryProof(consensusKey) // retrieve proof of counterparty clientstate on chainA - clientKey := host.FullKeyClientPath(clientA, host.KeyClientState()) + clientKey := host.FullClientStateKey(clientA) proofClient, _ := suite.chainA.QueryProof(clientKey) err := suite.chainB.App.IBCKeeper.ConnectionKeeper.ConnOpenTry( @@ -661,10 +661,10 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { for _, tc := range testCases { tc := tc suite.Run(tc.msg, func() { - suite.SetupTest() // reset + suite.SetupTest() // reset version = types.ExportedVersionsToProto(types.GetCompatibleVersions())[0] // must be explicitly changed in malleate - consensusHeight = clienttypes.ZeroHeight() // must be explicitly changed in malleate - counterpartyConnectionID = "" // must be explicitly changed in malleate + consensusHeight = clienttypes.ZeroHeight() // must be explicitly changed in malleate + counterpartyConnectionID = "" // must be explicitly changed in malleate tc.malleate() @@ -675,7 +675,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { counterpartyConnectionID = connB.ID } - connectionKey := host.KeyConnection(connB.ID) + connectionKey := host.ConnectionKey(connB.ID) proofTry, proofHeight := suite.chainB.QueryProof(connectionKey) if consensusHeight.IsZero() { @@ -683,11 +683,11 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { clientState := suite.chainB.GetClientState(clientB) consensusHeight = clientState.GetLatestHeight() } - consensusKey := host.FullKeyClientPath(clientB, host.KeyConsensusState(consensusHeight)) + consensusKey := host.FullConsensusStateKey(clientB, consensusHeight) proofConsensus, _ := suite.chainB.QueryProof(consensusKey) // retrieve proof of counterparty clientstate on chainA - clientKey := host.FullKeyClientPath(clientB, host.KeyClientState()) + clientKey := host.FullClientStateKey(clientB) proofClient, _ := suite.chainB.QueryProof(clientKey) err := suite.chainA.App.IBCKeeper.ConnectionKeeper.ConnOpenAck( @@ -757,7 +757,7 @@ func (suite *KeeperTestSuite) TestConnOpenConfirm() { connA := suite.chainA.GetFirstTestConnection(clientA, clientB) connB := suite.chainB.GetFirstTestConnection(clientB, clientA) - connectionKey := host.KeyConnection(connA.ID) + connectionKey := host.ConnectionKey(connA.ID) proofAck, proofHeight := suite.chainA.QueryProof(connectionKey) err := suite.chainB.App.IBCKeeper.ConnectionKeeper.ConnOpenConfirm( diff --git a/x/ibc/core/03-connection/keeper/keeper.go b/x/ibc/core/03-connection/keeper/keeper.go index c838b4fa6..dda529587 100644 --- a/x/ibc/core/03-connection/keeper/keeper.go +++ b/x/ibc/core/03-connection/keeper/keeper.go @@ -48,7 +48,7 @@ func (k Keeper) GetCommitmentPrefix() exported.Prefix { // GetConnection returns a connection with a particular identifier func (k Keeper) GetConnection(ctx sdk.Context, connectionID string) (types.ConnectionEnd, bool) { store := ctx.KVStore(k.storeKey) - bz := store.Get(host.KeyConnection(connectionID)) + bz := store.Get(host.ConnectionKey(connectionID)) if bz == nil { return types.ConnectionEnd{}, false } @@ -63,7 +63,7 @@ func (k Keeper) GetConnection(ctx sdk.Context, connectionID string) (types.Conne func (k Keeper) SetConnection(ctx sdk.Context, connectionID string, connection types.ConnectionEnd) { store := ctx.KVStore(k.storeKey) bz := k.cdc.MustMarshalBinaryBare(&connection) - store.Set(host.KeyConnection(connectionID), bz) + store.Set(host.ConnectionKey(connectionID), bz) } // GetTimestampAtHeight returns the timestamp in nanoseconds of the consensus state at the @@ -87,7 +87,7 @@ func (k Keeper) GetTimestampAtHeight(ctx sdk.Context, connection types.Connectio // particular client func (k Keeper) GetClientConnectionPaths(ctx sdk.Context, clientID string) ([]string, bool) { store := ctx.KVStore(k.storeKey) - bz := store.Get(host.KeyClientConnections(clientID)) + bz := store.Get(host.ClientConnectionsKey(clientID)) if bz == nil { return nil, false } @@ -102,7 +102,7 @@ func (k Keeper) SetClientConnectionPaths(ctx sdk.Context, clientID string, paths store := ctx.KVStore(k.storeKey) clientPaths := types.ClientPaths{Paths: paths} bz := k.cdc.MustMarshalBinaryBare(&clientPaths) - store.Set(host.KeyClientConnections(clientID), bz) + store.Set(host.ClientConnectionsKey(clientID), bz) } // GetAllClientConnectionPaths returns all stored clients connection id paths. It @@ -129,7 +129,7 @@ func (k Keeper) GetAllClientConnectionPaths(ctx sdk.Context) []types.ConnectionP // iterator will close and stop. func (k Keeper) IterateConnections(ctx sdk.Context, cb func(types.IdentifiedConnection) bool) { store := ctx.KVStore(k.storeKey) - iterator := sdk.KVStorePrefixIterator(store, host.KeyConnectionPrefix) + iterator := sdk.KVStorePrefixIterator(store, []byte(host.KeyConnectionPrefix)) defer iterator.Close() for ; iterator.Valid(); iterator.Next() { diff --git a/x/ibc/core/03-connection/keeper/verify_test.go b/x/ibc/core/03-connection/keeper/verify_test.go index 7f9705a80..c9db5cc2b 100644 --- a/x/ibc/core/03-connection/keeper/verify_test.go +++ b/x/ibc/core/03-connection/keeper/verify_test.go @@ -178,7 +178,7 @@ func (suite *KeeperTestSuite) TestVerifyConnectionState() { } expectedConnection := suite.chainB.GetConnection(connB) - connectionKey := host.KeyConnection(connB.ID) + connectionKey := host.ConnectionKey(connB.ID) proof, proofHeight := suite.chainB.QueryProof(connectionKey) if tc.changeConnectionState { @@ -227,7 +227,7 @@ func (suite *KeeperTestSuite) TestVerifyChannelState() { connection.ClientId = ibctesting.InvalidID } - channelKey := host.KeyChannel(channelB.PortID, channelB.ID) + channelKey := host.ChannelKey(channelB.PortID, channelB.ID) proof, proofHeight := suite.chainB.QueryProof(channelKey) channel := suite.chainB.GetChannel(channelB) @@ -282,7 +282,7 @@ func (suite *KeeperTestSuite) TestVerifyPacketCommitment() { err := suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) suite.Require().NoError(err) - commitmentKey := host.KeyPacketCommitment(packet.GetSourcePort(), packet.GetSourceChannel(), packet.GetSequence()) + commitmentKey := host.PacketCommitmentKey(packet.GetSourcePort(), packet.GetSourceChannel(), packet.GetSequence()) proof, proofHeight := suite.chainA.QueryProof(commitmentKey) if tc.changePacketCommitmentState { @@ -340,7 +340,7 @@ func (suite *KeeperTestSuite) TestVerifyPacketAcknowledgement() { err = suite.coordinator.RecvPacket(suite.chainA, suite.chainB, clientA, packet) suite.Require().NoError(err) - packetAckKey := host.KeyPacketAcknowledgement(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) + packetAckKey := host.PacketAcknowledgementKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) proof, proofHeight := suite.chainB.QueryProof(packetAckKey) ack := ibcmock.MockAcknowledgement @@ -405,7 +405,7 @@ func (suite *KeeperTestSuite) TestVerifyPacketReceiptAbsence() { suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) } - packetReceiptKey := host.KeyPacketReceipt(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) + packetReceiptKey := host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) proof, proofHeight := suite.chainB.QueryProof(packetReceiptKey) err = suite.chainA.App.IBCKeeper.ConnectionKeeper.VerifyPacketReceiptAbsence( @@ -459,7 +459,7 @@ func (suite *KeeperTestSuite) TestVerifyNextSequenceRecv() { err = suite.coordinator.RecvPacket(suite.chainA, suite.chainB, clientA, packet) suite.Require().NoError(err) - nextSeqRecvKey := host.KeyNextSequenceRecv(packet.GetDestPort(), packet.GetDestChannel()) + nextSeqRecvKey := host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) proof, proofHeight := suite.chainB.QueryProof(nextSeqRecvKey) err = suite.chainA.App.IBCKeeper.ConnectionKeeper.VerifyNextSequenceRecv( diff --git a/x/ibc/core/03-connection/simulation/decoder.go b/x/ibc/core/03-connection/simulation/decoder.go index 4b2d3bdf8..ef988a103 100644 --- a/x/ibc/core/03-connection/simulation/decoder.go +++ b/x/ibc/core/03-connection/simulation/decoder.go @@ -14,13 +14,13 @@ import ( // Value to the corresponding connection type. func NewDecodeStore(cdc codec.BinaryMarshaler, kvA, kvB kv.Pair) (string, bool) { switch { - case bytes.HasPrefix(kvA.Key, host.KeyClientStorePrefix) && bytes.HasSuffix(kvA.Key, host.KeyConnectionPrefix): + case bytes.HasPrefix(kvA.Key, host.KeyClientStorePrefix) && bytes.HasSuffix(kvA.Key, []byte(host.KeyConnectionPrefix)): var clientConnectionsA, clientConnectionsB types.ClientPaths cdc.MustUnmarshalBinaryBare(kvA.Value, &clientConnectionsA) cdc.MustUnmarshalBinaryBare(kvB.Value, &clientConnectionsB) return fmt.Sprintf("ClientPaths A: %v\nClientPaths B: %v", clientConnectionsA, clientConnectionsB), true - case bytes.HasPrefix(kvA.Key, host.KeyConnectionPrefix): + case bytes.HasPrefix(kvA.Key, []byte(host.KeyConnectionPrefix)): var connectionA, connectionB types.ConnectionEnd cdc.MustUnmarshalBinaryBare(kvA.Value, &connectionA) cdc.MustUnmarshalBinaryBare(kvB.Value, &connectionB) diff --git a/x/ibc/core/03-connection/simulation/decoder_test.go b/x/ibc/core/03-connection/simulation/decoder_test.go index 7e36b05a7..673bf6400 100644 --- a/x/ibc/core/03-connection/simulation/decoder_test.go +++ b/x/ibc/core/03-connection/simulation/decoder_test.go @@ -31,11 +31,11 @@ func TestDecodeStore(t *testing.T) { kvPairs := kv.Pairs{ Pairs: []kv.Pair{ { - Key: host.KeyClientConnections(connection.ClientId), + Key: host.ClientConnectionsKey(connection.ClientId), Value: cdc.MustMarshalBinaryBare(&paths), }, { - Key: host.KeyConnection(connectionID), + Key: host.ConnectionKey(connectionID), Value: cdc.MustMarshalBinaryBare(&connection), }, { diff --git a/x/ibc/core/04-channel/client/utils/utils.go b/x/ibc/core/04-channel/client/utils/utils.go index a5cae383b..f28ffcf80 100644 --- a/x/ibc/core/04-channel/client/utils/utils.go +++ b/x/ibc/core/04-channel/client/utils/utils.go @@ -35,7 +35,7 @@ func QueryChannel( } func queryChannelABCI(clientCtx client.Context, portID, channelID string) (*types.QueryChannelResponse, error) { - key := host.KeyChannel(portID, channelID) + key := host.ChannelKey(portID, channelID) value, proofBz, proofHeight, err := ibcclient.QueryTendermintProof(clientCtx, key) if err != nil { @@ -176,7 +176,7 @@ func QueryNextSequenceReceive( } func queryNextSequenceRecvABCI(clientCtx client.Context, portID, channelID string) (*types.QueryNextSequenceReceiveResponse, error) { - key := host.KeyNextSequenceRecv(portID, channelID) + key := host.NextSequenceRecvKey(portID, channelID) value, proofBz, proofHeight, err := ibcclient.QueryTendermintProof(clientCtx, key) if err != nil { @@ -217,7 +217,7 @@ func QueryPacketCommitment( func queryPacketCommitmentABCI( clientCtx client.Context, portID, channelID string, sequence uint64, ) (*types.QueryPacketCommitmentResponse, error) { - key := host.KeyPacketCommitment(portID, channelID, sequence) + key := host.PacketCommitmentKey(portID, channelID, sequence) value, proofBz, proofHeight, err := ibcclient.QueryTendermintProof(clientCtx, key) if err != nil { @@ -256,7 +256,7 @@ func QueryPacketReceipt( func queryPacketReceiptABCI( clientCtx client.Context, portID, channelID string, sequence uint64, ) (*types.QueryPacketReceiptResponse, error) { - key := host.KeyPacketReceipt(portID, channelID, sequence) + key := host.PacketReceiptKey(portID, channelID, sequence) value, proofBz, proofHeight, err := ibcclient.QueryTendermintProof(clientCtx, key) if err != nil { @@ -285,7 +285,7 @@ func QueryPacketAcknowledgement(clientCtx client.Context, portID, channelID stri } func queryPacketAcknowledgementABCI(clientCtx client.Context, portID, channelID string, sequence uint64) (*types.QueryPacketAcknowledgementResponse, error) { - key := host.KeyPacketAcknowledgement(portID, channelID, sequence) + key := host.PacketAcknowledgementKey(portID, channelID, sequence) value, proofBz, proofHeight, err := ibcclient.QueryTendermintProof(clientCtx, key) if err != nil { diff --git a/x/ibc/core/04-channel/keeper/grpc_query.go b/x/ibc/core/04-channel/keeper/grpc_query.go index 5e279ee43..355f192d7 100644 --- a/x/ibc/core/04-channel/keeper/grpc_query.go +++ b/x/ibc/core/04-channel/keeper/grpc_query.go @@ -52,7 +52,7 @@ func (q Keeper) Channels(c context.Context, req *types.QueryChannelsRequest) (*t ctx := sdk.UnwrapSDKContext(c) channels := []*types.IdentifiedChannel{} - store := prefix.NewStore(ctx.KVStore(q.storeKey), []byte(host.KeyChannelPrefix)) + store := prefix.NewStore(ctx.KVStore(q.storeKey), []byte(host.KeyChannelEndPrefix)) pageRes, err := query.Paginate(store, req.Pagination, func(key, value []byte) error { var result types.Channel @@ -95,7 +95,7 @@ func (q Keeper) ConnectionChannels(c context.Context, req *types.QueryConnection ctx := sdk.UnwrapSDKContext(c) channels := []*types.IdentifiedChannel{} - store := prefix.NewStore(ctx.KVStore(q.storeKey), []byte(host.KeyChannelPrefix)) + store := prefix.NewStore(ctx.KVStore(q.storeKey), []byte(host.KeyChannelEndPrefix)) pageRes, err := query.Paginate(store, req.Pagination, func(key, value []byte) error { var result types.Channel diff --git a/x/ibc/core/04-channel/keeper/handshake_test.go b/x/ibc/core/04-channel/keeper/handshake_test.go index fe5dc3593..cf391d038 100644 --- a/x/ibc/core/04-channel/keeper/handshake_test.go +++ b/x/ibc/core/04-channel/keeper/handshake_test.go @@ -289,7 +289,7 @@ func (suite *KeeperTestSuite) TestChanOpenTry() { counterpartyChosenChannelID = channel.Counterparty.ChannelId } - channelKey := host.KeyChannel(counterparty.PortId, counterparty.ChannelId) + channelKey := host.ChannelKey(counterparty.PortId, counterparty.ChannelId) proof, proofHeight := suite.chainA.QueryProof(channelKey) cap, err := suite.chainB.App.IBCKeeper.ChannelKeeper.ChanOpenTry( @@ -455,7 +455,7 @@ func (suite *KeeperTestSuite) TestChanOpenAck() { counterpartyChannelID = channelB.ID } - channelKey := host.KeyChannel(channelB.PortID, channelB.ID) + channelKey := host.ChannelKey(channelB.PortID, channelB.ID) proof, proofHeight := suite.chainB.QueryProof(channelKey) err := suite.chainA.App.IBCKeeper.ChannelKeeper.ChanOpenAck( @@ -583,7 +583,7 @@ func (suite *KeeperTestSuite) TestChanOpenConfirm() { channelA := connA.FirstOrNextTestChannel(ibctesting.MockPort) channelB := connB.FirstOrNextTestChannel(ibctesting.MockPort) - channelKey := host.KeyChannel(channelA.PortID, channelA.ID) + channelKey := host.ChannelKey(channelA.PortID, channelA.ID) proof, proofHeight := suite.chainA.QueryProof(channelKey) err := suite.chainB.App.IBCKeeper.ChannelKeeper.ChanOpenConfirm( @@ -784,7 +784,7 @@ func (suite *KeeperTestSuite) TestChanCloseConfirm() { channelA = connA.FirstOrNextTestChannel(ibctesting.MockPort) channelB = connB.FirstOrNextTestChannel(ibctesting.MockPort) - channelKey := host.KeyChannel(channelA.PortID, channelA.ID) + channelKey := host.ChannelKey(channelA.PortID, channelA.ID) proof, proofHeight := suite.chainA.QueryProof(channelKey) err := suite.chainB.App.IBCKeeper.ChannelKeeper.ChanCloseConfirm( diff --git a/x/ibc/core/04-channel/keeper/keeper.go b/x/ibc/core/04-channel/keeper/keeper.go index b3f23ca7f..99aee2c6d 100644 --- a/x/ibc/core/04-channel/keeper/keeper.go +++ b/x/ibc/core/04-channel/keeper/keeper.go @@ -58,7 +58,7 @@ func (k Keeper) Logger(ctx sdk.Context) log.Logger { // GetChannel returns a channel with a particular identifier binded to a specific port func (k Keeper) GetChannel(ctx sdk.Context, portID, channelID string) (types.Channel, bool) { store := ctx.KVStore(k.storeKey) - bz := store.Get(host.KeyChannel(portID, channelID)) + bz := store.Get(host.ChannelKey(portID, channelID)) if bz == nil { return types.Channel{}, false } @@ -72,13 +72,13 @@ func (k Keeper) GetChannel(ctx sdk.Context, portID, channelID string) (types.Cha func (k Keeper) SetChannel(ctx sdk.Context, portID, channelID string, channel types.Channel) { store := ctx.KVStore(k.storeKey) bz := k.cdc.MustMarshalBinaryBare(&channel) - store.Set(host.KeyChannel(portID, channelID), bz) + store.Set(host.ChannelKey(portID, channelID), bz) } // GetNextSequenceSend gets a channel's next send sequence from the store func (k Keeper) GetNextSequenceSend(ctx sdk.Context, portID, channelID string) (uint64, bool) { store := ctx.KVStore(k.storeKey) - bz := store.Get(host.KeyNextSequenceSend(portID, channelID)) + bz := store.Get(host.NextSequenceSendKey(portID, channelID)) if bz == nil { return 0, false } @@ -90,13 +90,13 @@ func (k Keeper) GetNextSequenceSend(ctx sdk.Context, portID, channelID string) ( func (k Keeper) SetNextSequenceSend(ctx sdk.Context, portID, channelID string, sequence uint64) { store := ctx.KVStore(k.storeKey) bz := sdk.Uint64ToBigEndian(sequence) - store.Set(host.KeyNextSequenceSend(portID, channelID), bz) + store.Set(host.NextSequenceSendKey(portID, channelID), bz) } // GetNextSequenceRecv gets a channel's next receive sequence from the store func (k Keeper) GetNextSequenceRecv(ctx sdk.Context, portID, channelID string) (uint64, bool) { store := ctx.KVStore(k.storeKey) - bz := store.Get(host.KeyNextSequenceRecv(portID, channelID)) + bz := store.Get(host.NextSequenceRecvKey(portID, channelID)) if bz == nil { return 0, false } @@ -108,13 +108,13 @@ func (k Keeper) GetNextSequenceRecv(ctx sdk.Context, portID, channelID string) ( func (k Keeper) SetNextSequenceRecv(ctx sdk.Context, portID, channelID string, sequence uint64) { store := ctx.KVStore(k.storeKey) bz := sdk.Uint64ToBigEndian(sequence) - store.Set(host.KeyNextSequenceRecv(portID, channelID), bz) + store.Set(host.NextSequenceRecvKey(portID, channelID), bz) } // GetNextSequenceAck gets a channel's next ack sequence from the store func (k Keeper) GetNextSequenceAck(ctx sdk.Context, portID, channelID string) (uint64, bool) { store := ctx.KVStore(k.storeKey) - bz := store.Get(host.KeyNextSequenceAck(portID, channelID)) + bz := store.Get(host.NextSequenceAckKey(portID, channelID)) if bz == nil { return 0, false } @@ -126,13 +126,13 @@ func (k Keeper) GetNextSequenceAck(ctx sdk.Context, portID, channelID string) (u func (k Keeper) SetNextSequenceAck(ctx sdk.Context, portID, channelID string, sequence uint64) { store := ctx.KVStore(k.storeKey) bz := sdk.Uint64ToBigEndian(sequence) - store.Set(host.KeyNextSequenceAck(portID, channelID), bz) + store.Set(host.NextSequenceAckKey(portID, channelID), bz) } // GetPacketReceipt gets a packet receipt from the store func (k Keeper) GetPacketReceipt(ctx sdk.Context, portID, channelID string, sequence uint64) (string, bool) { store := ctx.KVStore(k.storeKey) - bz := store.Get(host.KeyPacketReceipt(portID, channelID, sequence)) + bz := store.Get(host.PacketReceiptKey(portID, channelID, sequence)) if bz == nil { return "", false } @@ -143,43 +143,43 @@ func (k Keeper) GetPacketReceipt(ctx sdk.Context, portID, channelID string, sequ // SetPacketReceipt sets an empty packet receipt to the store func (k Keeper) SetPacketReceipt(ctx sdk.Context, portID, channelID string, sequence uint64) { store := ctx.KVStore(k.storeKey) - store.Set(host.KeyPacketReceipt(portID, channelID, sequence), []byte("")) + store.Set(host.PacketReceiptKey(portID, channelID, sequence), []byte("")) } // GetPacketCommitment gets the packet commitment hash from the store func (k Keeper) GetPacketCommitment(ctx sdk.Context, portID, channelID string, sequence uint64) []byte { store := ctx.KVStore(k.storeKey) - bz := store.Get(host.KeyPacketCommitment(portID, channelID, sequence)) + bz := store.Get(host.PacketCommitmentKey(portID, channelID, sequence)) return bz } // HasPacketCommitment returns true if the packet commitment exists func (k Keeper) HasPacketCommitment(ctx sdk.Context, portID, channelID string, sequence uint64) bool { store := ctx.KVStore(k.storeKey) - return store.Has(host.KeyPacketCommitment(portID, channelID, sequence)) + return store.Has(host.PacketCommitmentKey(portID, channelID, sequence)) } // SetPacketCommitment sets the packet commitment hash to the store func (k Keeper) SetPacketCommitment(ctx sdk.Context, portID, channelID string, sequence uint64, commitmentHash []byte) { store := ctx.KVStore(k.storeKey) - store.Set(host.KeyPacketCommitment(portID, channelID, sequence), commitmentHash) + store.Set(host.PacketCommitmentKey(portID, channelID, sequence), commitmentHash) } func (k Keeper) deletePacketCommitment(ctx sdk.Context, portID, channelID string, sequence uint64) { store := ctx.KVStore(k.storeKey) - store.Delete(host.KeyPacketCommitment(portID, channelID, sequence)) + store.Delete(host.PacketCommitmentKey(portID, channelID, sequence)) } // SetPacketAcknowledgement sets the packet ack hash to the store func (k Keeper) SetPacketAcknowledgement(ctx sdk.Context, portID, channelID string, sequence uint64, ackHash []byte) { store := ctx.KVStore(k.storeKey) - store.Set(host.KeyPacketAcknowledgement(portID, channelID, sequence), ackHash) + store.Set(host.PacketAcknowledgementKey(portID, channelID, sequence), ackHash) } // GetPacketAcknowledgement gets the packet ack hash from the store func (k Keeper) GetPacketAcknowledgement(ctx sdk.Context, portID, channelID string, sequence uint64) ([]byte, bool) { store := ctx.KVStore(k.storeKey) - bz := store.Get(host.KeyPacketAcknowledgement(portID, channelID, sequence)) + bz := store.Get(host.PacketAcknowledgementKey(portID, channelID, sequence)) if bz == nil { return nil, false } @@ -189,7 +189,7 @@ func (k Keeper) GetPacketAcknowledgement(ctx sdk.Context, portID, channelID stri // HasPacketAcknowledgement check if the packet ack hash is already on the store func (k Keeper) HasPacketAcknowledgement(ctx sdk.Context, portID, channelID string, sequence uint64) bool { store := ctx.KVStore(k.storeKey) - return store.Has(host.KeyPacketAcknowledgement(portID, channelID, sequence)) + return store.Has(host.PacketAcknowledgementKey(portID, channelID, sequence)) } // IteratePacketSequence provides an iterator over all send, receive or ack sequences. @@ -330,7 +330,7 @@ func (k Keeper) GetAllPacketAcks(ctx sdk.Context) (acks []types.PacketState) { // and stop. func (k Keeper) IterateChannels(ctx sdk.Context, cb func(types.IdentifiedChannel) bool) { store := ctx.KVStore(k.storeKey) - iterator := sdk.KVStorePrefixIterator(store, []byte(host.KeyChannelPrefix)) + iterator := sdk.KVStorePrefixIterator(store, []byte(host.KeyChannelEndPrefix)) defer iterator.Close() for ; iterator.Valid(); iterator.Next() { diff --git a/x/ibc/core/04-channel/keeper/packet_test.go b/x/ibc/core/04-channel/keeper/packet_test.go index 3d942ce12..f3624897d 100644 --- a/x/ibc/core/04-channel/keeper/packet_test.go +++ b/x/ibc/core/04-channel/keeper/packet_test.go @@ -345,7 +345,7 @@ func (suite *KeeperTestSuite) TestRecvPacket() { tc.malleate() // get proof of packet commitment from chainA - packetKey := host.KeyPacketCommitment(packet.GetSourcePort(), packet.GetSourceChannel(), packet.GetSequence()) + packetKey := host.PacketCommitmentKey(packet.GetSourcePort(), packet.GetSourceChannel(), packet.GetSequence()) proof, proofHeight := suite.chainA.QueryProof(packetKey) err := suite.chainB.App.IBCKeeper.ChannelKeeper.RecvPacket(suite.chainB.GetContext(), channelCap, packet, proof, proofHeight) @@ -622,7 +622,7 @@ func (suite *KeeperTestSuite) TestAcknowledgePacket() { suite.SetupTest() // reset tc.malleate() - packetKey := host.KeyPacketAcknowledgement(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) + packetKey := host.PacketAcknowledgementKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) proof, proofHeight := suite.chainB.QueryProof(packetKey) err := suite.chainA.App.IBCKeeper.ChannelKeeper.AcknowledgePacket(suite.chainA.GetContext(), channelCap, packet, ack, proof, proofHeight) diff --git a/x/ibc/core/04-channel/keeper/timeout_test.go b/x/ibc/core/04-channel/keeper/timeout_test.go index 774f9eacf..2ff497582 100644 --- a/x/ibc/core/04-channel/keeper/timeout_test.go +++ b/x/ibc/core/04-channel/keeper/timeout_test.go @@ -125,8 +125,8 @@ func (suite *KeeperTestSuite) TestTimeoutPacket() { nextSeqRecv = 1 // must be explicitly changed tc.malleate() - orderedPacketKey := host.KeyNextSequenceRecv(packet.GetDestPort(), packet.GetDestChannel()) - unorderedPacketKey := host.KeyPacketReceipt(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) + orderedPacketKey := host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) + unorderedPacketKey := host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) if ordered { proof, proofHeight = suite.chainB.QueryProof(orderedPacketKey) @@ -326,9 +326,9 @@ func (suite *KeeperTestSuite) TestTimeoutOnClose() { nextSeqRecv = 1 // must be explicitly changed tc.malleate() - channelKey := host.KeyChannel(packet.GetDestPort(), packet.GetDestChannel()) - unorderedPacketKey := host.KeyPacketReceipt(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) - orderedPacketKey := host.KeyNextSequenceRecv(packet.GetDestPort(), packet.GetDestChannel()) + channelKey := host.ChannelKey(packet.GetDestPort(), packet.GetDestChannel()) + unorderedPacketKey := host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) + orderedPacketKey := host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) proofClosed, proofHeight := suite.chainB.QueryProof(channelKey) diff --git a/x/ibc/core/04-channel/simulation/decoder.go b/x/ibc/core/04-channel/simulation/decoder.go index 006bc08e9..809976cc0 100644 --- a/x/ibc/core/04-channel/simulation/decoder.go +++ b/x/ibc/core/04-channel/simulation/decoder.go @@ -15,7 +15,7 @@ import ( // Value to the corresponding channel type. func NewDecodeStore(cdc codec.BinaryMarshaler, kvA, kvB kv.Pair) (string, bool) { switch { - case bytes.HasPrefix(kvA.Key, []byte(host.KeyChannelPrefix)): + case bytes.HasPrefix(kvA.Key, []byte(host.KeyChannelEndPrefix)): var channelA, channelB types.Channel cdc.MustUnmarshalBinaryBare(kvA.Value, &channelA) cdc.MustUnmarshalBinaryBare(kvB.Value, &channelB) diff --git a/x/ibc/core/04-channel/simulation/decoder_test.go b/x/ibc/core/04-channel/simulation/decoder_test.go index 2d61a8f9a..5f2ba2f5e 100644 --- a/x/ibc/core/04-channel/simulation/decoder_test.go +++ b/x/ibc/core/04-channel/simulation/decoder_test.go @@ -31,27 +31,27 @@ func TestDecodeStore(t *testing.T) { kvPairs := kv.Pairs{ Pairs: []kv.Pair{ { - Key: host.KeyChannel(portID, channelID), + Key: host.ChannelKey(portID, channelID), Value: cdc.MustMarshalBinaryBare(&channel), }, { - Key: host.KeyNextSequenceSend(portID, channelID), + Key: host.NextSequenceSendKey(portID, channelID), Value: sdk.Uint64ToBigEndian(1), }, { - Key: host.KeyNextSequenceRecv(portID, channelID), + Key: host.NextSequenceRecvKey(portID, channelID), Value: sdk.Uint64ToBigEndian(1), }, { - Key: host.KeyNextSequenceAck(portID, channelID), + Key: host.NextSequenceAckKey(portID, channelID), Value: sdk.Uint64ToBigEndian(1), }, { - Key: host.KeyPacketCommitment(portID, channelID, 1), + Key: host.PacketCommitmentKey(portID, channelID, 1), Value: bz, }, { - Key: host.KeyPacketAcknowledgement(portID, channelID, 1), + Key: host.PacketAcknowledgementKey(portID, channelID, 1), Value: bz, }, { diff --git a/x/ibc/core/24-host/errors.go b/x/ibc/core/24-host/errors.go index 3ec901625..fe8129bde 100644 --- a/x/ibc/core/24-host/errors.go +++ b/x/ibc/core/24-host/errors.go @@ -9,8 +9,7 @@ const SubModuleName = "host" // IBC client sentinel errors var ( - ErrInvalidID = sdkerrors.Register(SubModuleName, 2, "invalid identifier") - ErrInvalidPath = sdkerrors.Register(SubModuleName, 3, "invalid path") - ErrInvalidPacket = sdkerrors.Register(SubModuleName, 4, "invalid packet") - ErrInvalidVersion = sdkerrors.Register(SubModuleName, 5, "invalid version") + ErrInvalidID = sdkerrors.Register(SubModuleName, 2, "invalid identifier") + ErrInvalidPath = sdkerrors.Register(SubModuleName, 3, "invalid path") + ErrInvalidPacket = sdkerrors.Register(SubModuleName, 4, "invalid packet") ) diff --git a/x/ibc/core/24-host/keys.go b/x/ibc/core/24-host/keys.go index 3a51a13db..51d293957 100644 --- a/x/ibc/core/24-host/keys.go +++ b/x/ibc/core/24-host/keys.go @@ -22,14 +22,18 @@ const ( // KVStore key prefixes for IBC var ( - KeyClientStorePrefix = []byte("clients") - KeyConsensusStatesPrefix = []byte("consensusStates") - KeyConnectionPrefix = []byte("connections") + KeyClientStorePrefix = []byte("clients") ) // KVStore key prefixes for IBC const ( - KeyChannelPrefix = "channelEnds" + KeyClientState = "clientState" + KeyConsensusStatePrefix = "consensusStates" + KeyConnectionPrefix = "connections" + KeyChannelEndPrefix = "channelEnds" + KeyChannelPrefix = "channels" + KeyPortPrefix = "ports" + KeySequencePrefix = "sequences" KeyChannelCapabilityPrefix = "capabilities" KeyNextSeqSendPrefix = "nextSequenceSend" KeyNextSeqRecvPrefix = "nextSequenceRecv" @@ -42,38 +46,57 @@ const ( // FullClientPath returns the full path of a specific client path in the format: // "clients/{clientID}/{path}" as a string. func FullClientPath(clientID string, path string) string { - return string(FullKeyClientPath(clientID, []byte(path))) + return fmt.Sprintf("%s/%s/%s", KeyClientStorePrefix, clientID, path) } -// FullKeyClientPath returns the full path of specific client path in the format: +// FullClientKey returns the full path of specific client path in the format: // "clients/{clientID}/{path}" as a byte array. -func FullKeyClientPath(clientID string, path []byte) []byte { - return append(KeyClientStorePrefix, append([]byte("/"+clientID+"/"), path...)...) +func FullClientKey(clientID string, path []byte) []byte { + return []byte(FullClientPath(clientID, string(path))) } // ICS02 // The following paths are the keys to the store as defined in https://github.com/cosmos/ics/tree/master/spec/ics-002-client-semantics#path-space -// ClientStatePath takes an Identifier and returns a Path under which to store a +// FullClientStatePath takes a client identifier and returns a Path under which to store a // particular client state -func ClientStatePath() string { - return "clientState" +func FullClientStatePath(clientID string) string { + return FullClientPath(clientID, KeyClientState) } -// ConsensusStatePath takes an Identifier and returns a Path under which to +// FullClientStateKey takes a client identifier and returns a Key under which to store a +// particular client state. +func FullClientStateKey(clientID string) []byte { + return FullClientKey(clientID, []byte(KeyClientState)) +} + +// ClientStateKey returns a store key under which a particular client state is stored +// in a client prefixed store +func ClientStateKey() []byte { + return []byte(KeyClientState) +} + +// FullConsensusStatePath takes a client identifier and returns a Path under which to // store the consensus state of a client. +func FullConsensusStatePath(clientID string, height exported.Height) string { + return FullClientPath(clientID, fmt.Sprintf("%s/%s", KeyConsensusStatePrefix, height)) +} + +// FullConsensusStateKey returns the store key for the consensus state of a particular +// client. +func FullConsensusStateKey(clientID string, height exported.Height) []byte { + return []byte(FullConsensusStatePath(clientID, height)) +} + +// ConsensusStatePath returns the suffix store key for the consensus state at a +// particular height stored in a client prefixed store. func ConsensusStatePath(height exported.Height) string { - return fmt.Sprintf("%s/%s", KeyConsensusStatesPrefix, height) + return fmt.Sprintf("%s/%s", KeyConsensusStatePrefix, height) } -// KeyClientState returns the store key for a particular client state -func KeyClientState() []byte { - return []byte(ClientStatePath()) -} - -// KeyConsensusState returns the store key for the consensus state of a particular -// client -func KeyConsensusState(height exported.Height) []byte { +// ConsensusStateKey returns the store key for a the consensus state of a particular +// client stored in a client prefixed store. +func ConsensusStateKey(height exported.Height) []byte { return []byte(ConsensusStatePath(height)) } @@ -82,7 +105,12 @@ func KeyConsensusState(height exported.Height) []byte { // ClientConnectionsPath defines a reverse mapping from clients to a set of connections func ClientConnectionsPath(clientID string) string { - return fmt.Sprintf("%s/%s/connections", KeyClientStorePrefix, clientID) + return FullClientPath(clientID, KeyConnectionPrefix) +} + +// ClientConnectionsKey returns the store key for the connections of a given client +func ClientConnectionsKey(clientID string) []byte { + return []byte(ClientConnectionsPath(clientID)) } // ConnectionPath defines the path under which connection paths are stored @@ -90,13 +118,8 @@ func ConnectionPath(connectionID string) string { return fmt.Sprintf("%s/%s", KeyConnectionPrefix, connectionID) } -// KeyClientConnections returns the store key for the connections of a given client -func KeyClientConnections(clientID string) []byte { - return []byte(ClientConnectionsPath(clientID)) -} - -// KeyConnection returns the store key for a particular connection -func KeyConnection(connectionID string) []byte { +// ConnectionKey returns the store key for a particular connection +func ConnectionKey(connectionID string) []byte { return []byte(ConnectionPath(connectionID)) } @@ -105,98 +128,102 @@ func KeyConnection(connectionID string) []byte { // ChannelPath defines the path under which channels are stored func ChannelPath(portID, channelID string) string { - return fmt.Sprintf("%s/", KeyChannelPrefix) + channelPath(portID, channelID) + return fmt.Sprintf("%s/%s", KeyChannelEndPrefix, channelPath(portID, channelID)) +} + +// ChannelKey returns the store key for a particular channel +func ChannelKey(portID, channelID string) []byte { + return []byte(ChannelPath(portID, channelID)) } // ChannelCapabilityPath defines the path under which capability keys associated // with a channel are stored func ChannelCapabilityPath(portID, channelID string) string { - return fmt.Sprintf("%s/", KeyChannelCapabilityPrefix) + channelPath(portID, channelID) + "/key" + return fmt.Sprintf("%s/%s", KeyChannelCapabilityPrefix, channelPath(portID, channelID)) } // NextSequenceSendPath defines the next send sequence counter store path func NextSequenceSendPath(portID, channelID string) string { - return fmt.Sprintf("%s/", KeyNextSeqSendPrefix) + channelPath(portID, channelID) + return fmt.Sprintf("%s/%s", KeyNextSeqSendPrefix, channelPath(portID, channelID)) } -// NextSequenceRecvPath defines the next receive sequence counter store path +// NextSequenceSendKey returns the store key for the send sequence of a particular +// channel binded to a specific port. +func NextSequenceSendKey(portID, channelID string) []byte { + return []byte(NextSequenceSendPath(portID, channelID)) +} + +// NextSequenceRecvPath defines the next receive sequence counter store path. func NextSequenceRecvPath(portID, channelID string) string { - return fmt.Sprintf("%s/", KeyNextSeqRecvPrefix) + channelPath(portID, channelID) + return fmt.Sprintf("%s/%s", KeyNextSeqRecvPrefix, channelPath(portID, channelID)) +} + +// NextSequenceRecvKey returns the store key for the receive sequence of a particular +// channel binded to a specific port +func NextSequenceRecvKey(portID, channelID string) []byte { + return []byte(NextSequenceRecvPath(portID, channelID)) } // NextSequenceAckPath defines the next acknowledgement sequence counter store path func NextSequenceAckPath(portID, channelID string) string { - return fmt.Sprintf("%s/", KeyNextSeqAckPrefix) + channelPath(portID, channelID) + return fmt.Sprintf("%s/%s", KeyNextSeqAckPrefix, channelPath(portID, channelID)) +} + +// NextSequenceAckKey returns the store key for the acknowledgement sequence of +// a particular channel binded to a specific port. +func NextSequenceAckKey(portID, channelID string) []byte { + return []byte(NextSequenceAckPath(portID, channelID)) } // PacketCommitmentPath defines the commitments to packet data fields store path func PacketCommitmentPath(portID, channelID string, sequence uint64) string { - return fmt.Sprintf("%s/", KeyPacketCommitmentPrefix) + channelPath(portID, channelID) + fmt.Sprintf("/packets/%d", sequence) + return fmt.Sprintf("%s/%s/%s", KeyPacketCommitmentPrefix, channelPath(portID, channelID), sequencePath(sequence)) +} + +// PacketCommitmentKey returns the store key of under which a packet commitment +// is stored +func PacketCommitmentKey(portID, channelID string, sequence uint64) []byte { + return []byte(PacketCommitmentPath(portID, channelID, sequence)) } // PacketCommitmentPrefixPath defines the prefix for commitments to packet data fields store path. func PacketCommitmentPrefixPath(portID, channelID string) string { - return fmt.Sprintf("%s/", KeyPacketCommitmentPrefix) + channelPath(portID, channelID) + return fmt.Sprintf("%s/%s/%s", KeyPacketCommitmentPrefix, channelPath(portID, channelID), KeySequencePrefix) } // PacketAcknowledgementPath defines the packet acknowledgement store path func PacketAcknowledgementPath(portID, channelID string, sequence uint64) string { - return fmt.Sprintf("%s/", KeyPacketAckPrefix) + channelPath(portID, channelID) + fmt.Sprintf("/acknowledgements/%d", sequence) + return fmt.Sprintf("%s/%s/%s", KeyPacketAckPrefix, channelPath(portID, channelID), sequencePath(sequence)) +} + +// PacketAcknowledgementKey returns the store key of under which a packet +// acknowledgement is stored +func PacketAcknowledgementKey(portID, channelID string, sequence uint64) []byte { + return []byte(PacketAcknowledgementPath(portID, channelID, sequence)) } // PacketAcknowledgementPrefixPath defines the prefix for commitments to packet data fields store path. func PacketAcknowledgementPrefixPath(portID, channelID string) string { - return fmt.Sprintf("%s/", KeyPacketAckPrefix) + channelPath(portID, channelID) + return fmt.Sprintf("%s/%s/%s", KeyPacketAckPrefix, channelPath(portID, channelID), KeySequencePrefix) } // PacketReceiptPath defines the packet receipt store path func PacketReceiptPath(portID, channelID string, sequence uint64) string { - return fmt.Sprintf("%s/", KeyPacketReceiptPrefix) + channelPath(portID, channelID) + fmt.Sprintf("/receipts/%d", sequence) + return fmt.Sprintf("%s/%s/%s", KeyPacketReceiptPrefix, channelPath(portID, channelID), sequencePath(sequence)) } -// KeyChannel returns the store key for a particular channel -func KeyChannel(portID, channelID string) []byte { - return []byte(ChannelPath(portID, channelID)) -} - -// KeyNextSequenceSend returns the store key for the send sequence of a particular -// channel binded to a specific port -func KeyNextSequenceSend(portID, channelID string) []byte { - return []byte(NextSequenceSendPath(portID, channelID)) -} - -// KeyNextSequenceRecv returns the store key for the receive sequence of a particular -// channel binded to a specific port -func KeyNextSequenceRecv(portID, channelID string) []byte { - return []byte(NextSequenceRecvPath(portID, channelID)) -} - -// KeyNextSequenceAck returns the store key for the acknowledgement sequence of -// a particular channel binded to a specific port. -func KeyNextSequenceAck(portID, channelID string) []byte { - return []byte(NextSequenceAckPath(portID, channelID)) -} - -// KeyPacketCommitment returns the store key of under which a packet commitment -// is stored -func KeyPacketCommitment(portID, channelID string, sequence uint64) []byte { - return []byte(PacketCommitmentPath(portID, channelID, sequence)) -} - -// KeyPacketAcknowledgement returns the store key of under which a packet -// acknowledgement is stored -func KeyPacketAcknowledgement(portID, channelID string, sequence uint64) []byte { - return []byte(PacketAcknowledgementPath(portID, channelID, sequence)) -} - -// KeyPacketReceipt returns the store key of under which a packet +// PacketReceiptKey returns the store key of under which a packet // receipt is stored -func KeyPacketReceipt(portID, channelID string, sequence uint64) []byte { +func PacketReceiptKey(portID, channelID string, sequence uint64) []byte { return []byte(PacketReceiptPath(portID, channelID, sequence)) } func channelPath(portID, channelID string) string { - return fmt.Sprintf("ports/%s/channels/%s", portID, channelID) + return fmt.Sprintf("%s/%s/%s/%s", KeyPortPrefix, portID, KeyChannelPrefix, channelID) +} + +func sequencePath(sequence uint64) string { + return fmt.Sprintf("%s/%d", KeySequencePrefix, sequence) } // ICS05 @@ -204,5 +231,5 @@ func channelPath(portID, channelID string) string { // PortPath defines the path under which ports paths are stored on the capability module func PortPath(portID string) string { - return fmt.Sprintf("ports/%s", portID) + return fmt.Sprintf("%s/%s", KeyPortPrefix, portID) } diff --git a/x/ibc/core/24-host/parse.go b/x/ibc/core/24-host/parse.go index 7200c4ff0..7e6301a39 100644 --- a/x/ibc/core/24-host/parse.go +++ b/x/ibc/core/24-host/parse.go @@ -25,7 +25,7 @@ func ParseChannelPath(path string) (string, string, error) { return "", "", sdkerrors.Wrapf(ErrInvalidPath, "cannot parse channel path %s", path) } - if split[1] != "ports" || split[3] != "channels" { + if split[1] != KeyPortPrefix || split[3] != KeyChannelPrefix { return "", "", sdkerrors.Wrapf(ErrInvalidPath, "cannot parse channel path %s", path) } diff --git a/x/ibc/core/keeper/msg_server_test.go b/x/ibc/core/keeper/msg_server_test.go index a80426724..5c4aa466a 100644 --- a/x/ibc/core/keeper/msg_server_test.go +++ b/x/ibc/core/keeper/msg_server_test.go @@ -142,7 +142,7 @@ func (suite *KeeperTestSuite) TestHandleRecvPacket() { tc.malleate() // get proof of packet commitment from chainA - packetKey := host.KeyPacketCommitment(packet.GetSourcePort(), packet.GetSourceChannel(), packet.GetSequence()) + packetKey := host.PacketCommitmentKey(packet.GetSourcePort(), packet.GetSourceChannel(), packet.GetSequence()) proof, proofHeight := suite.chainA.QueryProof(packetKey) msg := channeltypes.NewMsgRecvPacket(packet, proof, proofHeight, suite.chainB.SenderAccount.GetAddress()) @@ -281,7 +281,7 @@ func (suite *KeeperTestSuite) TestHandleAcknowledgePacket() { tc.malleate() - packetKey := host.KeyPacketAcknowledgement(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) + packetKey := host.PacketAcknowledgementKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) proof, proofHeight := suite.chainB.QueryProof(packetKey) msg := channeltypes.NewMsgAcknowledgement(packet, ibcmock.MockAcknowledgement, proof, proofHeight, suite.chainA.SenderAccount.GetAddress()) @@ -333,7 +333,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutPacket() { // need to update chainA client to prove missing ack suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) - packetKey = host.KeyNextSequenceRecv(packet.GetDestPort(), packet.GetDestChannel()) + packetKey = host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) }, true}, {"success: UNORDERED", func() { clientA, clientB, _, _, channelA, channelB := suite.coordinator.Setup(suite.chainA, suite.chainB, channeltypes.UNORDERED) @@ -346,7 +346,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutPacket() { // need to update chainA client to prove missing ack suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) - packetKey = host.KeyPacketReceipt(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) + packetKey = host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) }, true}, {"success: UNORDERED timeout out of order packet", func() { // setup uses an UNORDERED channel @@ -363,7 +363,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutPacket() { } suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) - packetKey = host.KeyPacketReceipt(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) + packetKey = host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) }, true}, {"success: ORDERED timeout out of order packet", func() { clientA, clientB, _, _, channelA, channelB := suite.coordinator.Setup(suite.chainA, suite.chainB, channeltypes.ORDERED) @@ -379,19 +379,19 @@ func (suite *KeeperTestSuite) TestHandleTimeoutPacket() { } suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) - packetKey = host.KeyNextSequenceRecv(packet.GetDestPort(), packet.GetDestChannel()) + packetKey = host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) }, true}, {"channel does not exist", func() { // any non-nil value of packet is valid suite.Require().NotNil(packet) - packetKey = host.KeyNextSequenceRecv(packet.GetDestPort(), packet.GetDestChannel()) + packetKey = host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) }, false}, {"UNORDERED: packet not sent", func() { _, _, _, _, channelA, channelB := suite.coordinator.Setup(suite.chainA, suite.chainB, channeltypes.UNORDERED) packet = channeltypes.NewPacket(ibctesting.MockCommitment, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, timeoutHeight, 0) - packetKey = host.KeyPacketReceipt(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) + packetKey = host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) }, false}, } @@ -460,7 +460,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutOnClosePacket() { // need to update chainA client to prove missing ack suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) - packetKey = host.KeyNextSequenceRecv(packet.GetDestPort(), packet.GetDestChannel()) + packetKey = host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) // close counterparty channel suite.coordinator.SetChannelClosed(suite.chainB, suite.chainA, counterpartyChannel) @@ -481,7 +481,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutOnClosePacket() { // need to update chainA client to prove missing ack suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) - packetKey = host.KeyPacketReceipt(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) + packetKey = host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) // close counterparty channel suite.coordinator.SetChannelClosed(suite.chainB, suite.chainA, counterpartyChannel) @@ -506,7 +506,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutOnClosePacket() { } suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) - packetKey = host.KeyPacketReceipt(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) + packetKey = host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) // close counterparty channel suite.coordinator.SetChannelClosed(suite.chainB, suite.chainA, counterpartyChannel) @@ -530,7 +530,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutOnClosePacket() { } suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) - packetKey = host.KeyNextSequenceRecv(packet.GetDestPort(), packet.GetDestChannel()) + packetKey = host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) // close counterparty channel suite.coordinator.SetChannelClosed(suite.chainB, suite.chainA, counterpartyChannel) @@ -539,12 +539,12 @@ func (suite *KeeperTestSuite) TestHandleTimeoutOnClosePacket() { // any non-nil value of packet is valid suite.Require().NotNil(packet) - packetKey = host.KeyNextSequenceRecv(packet.GetDestPort(), packet.GetDestChannel()) + packetKey = host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) }, false}, {"UNORDERED: packet not sent", func() { clientA, _, _, _, channelA, channelB := suite.coordinator.Setup(suite.chainA, suite.chainB, channeltypes.UNORDERED) packet = channeltypes.NewPacket(ibctesting.MockCommitment, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, timeoutHeight, 0) - packetKey = host.KeyPacketAcknowledgement(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) + packetKey = host.PacketAcknowledgementKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) counterpartyChannel = ibctesting.TestChannel{ PortID: channelB.PortID, ID: channelB.ID, @@ -570,7 +570,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutOnClosePacket() { // need to update chainA client to prove missing ack suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) - packetKey = host.KeyNextSequenceRecv(packet.GetDestPort(), packet.GetDestChannel()) + packetKey = host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) }, false}, } @@ -584,7 +584,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutOnClosePacket() { proof, proofHeight := suite.chainB.QueryProof(packetKey) - channelKey := host.KeyChannel(counterpartyChannel.PortID, counterpartyChannel.ID) + channelKey := host.ChannelKey(counterpartyChannel.PortID, counterpartyChannel.ID) proofClosed, _ := suite.chainB.QueryProof(channelKey) msg := channeltypes.NewMsgTimeoutOnClose(packet, 1, proof, proofClosed, proofHeight, suite.chainA.SenderAccount.GetAddress()) diff --git a/x/ibc/core/simulation/decoder_test.go b/x/ibc/core/simulation/decoder_test.go index d14a9f28c..095157274 100644 --- a/x/ibc/core/simulation/decoder_test.go +++ b/x/ibc/core/simulation/decoder_test.go @@ -40,15 +40,15 @@ func TestDecodeStore(t *testing.T) { kvPairs := kv.Pairs{ Pairs: []kv.Pair{ { - Key: host.FullKeyClientPath(clientID, host.KeyClientState()), + Key: host.FullClientStateKey(clientID), Value: app.IBCKeeper.ClientKeeper.MustMarshalClientState(clientState), }, { - Key: host.KeyConnection(connectionID), + Key: host.ConnectionKey(connectionID), Value: app.IBCKeeper.Codec().MustMarshalBinaryBare(&connection), }, { - Key: host.KeyChannel(portID, channelID), + Key: host.ChannelKey(portID, channelID), Value: app.IBCKeeper.Codec().MustMarshalBinaryBare(&channel), }, { diff --git a/x/ibc/core/spec/02_state.md b/x/ibc/core/spec/02_state.md index 5df09a097..54eb41bc4 100644 --- a/x/ibc/core/spec/02_state.md +++ b/x/ibc/core/spec/02_state.md @@ -16,10 +16,10 @@ The client type is not stored since it can be obtained through the client state. | "0/" | "connections/{identifier}" | ConnectionEnd | | "0/" | "ports/{identifier}" | CapabilityKey | | "0/" | "channelEnds/ports/{identifier}/channels/{identifier}" | ChannelEnd | -| "0/" | "capabilities/ports/{identifier}/channels/{identifier}/key" | CapabilityKey | -| "0/" | "seqSends/ports/{identifier}/channels/{identifier}/nextSequenceSend" | uint64 | -| "0/" | "seqRecvs/ports/{identifier}/channels/{identifier}/nextSequenceRecv" | uint64 | -| "0/" | "seqAcks/ports/{identifier}/channels/{identifier}/nextSequenceAck" | uint64 | -| "0/" | "commitments/ports/{identifier}/channels/{identifier}/packets/{sequence}" | bytes | -| "0/" | "receipts/ports/{identifier}/channels/{identifier}/receipts/{sequence}" | bytes | -| "0/" | "acks/ports/{identifier}/channels/{identifier}/acknowledgements/{sequence}" | bytes | +| "0/" | "capabilities/ports/{identifier}/channels/{identifier}" | CapabilityKey | +| "0/" | "nextSequenceSend/ports/{identifier}/channels/{identifier}" | uint64 | +| "0/" | "nextSequenceRecv/ports/{identifier}/channels/{identifier}" | uint64 | +| "0/" | "nextSequenceAck/ports/{identifier}/channels/{identifier}" | uint64 | +| "0/" | "commitments/ports/{identifier}/channels/{identifier}/sequences/{sequence}" | bytes | +| "0/" | "receipts/ports/{identifier}/channels/{identifier}/sequences/{sequence}" | bytes | +| "0/" | "acks/ports/{identifier}/channels/{identifier}/sequences/{sequence}" | bytes | diff --git a/x/ibc/light-clients/06-solomachine/types/client_state.go b/x/ibc/light-clients/06-solomachine/types/client_state.go index 583193f3d..5e9fe014a 100644 --- a/x/ibc/light-clients/06-solomachine/types/client_state.go +++ b/x/ibc/light-clients/06-solomachine/types/client_state.go @@ -100,7 +100,7 @@ func (cs ClientState) VerifyClientState( return err } - clientPrefixedPath := commitmenttypes.NewMerklePath("clients/" + counterpartyClientIdentifier + "/" + host.ClientStatePath()) + clientPrefixedPath := commitmenttypes.NewMerklePath(host.FullClientStatePath(counterpartyClientIdentifier)) path, err := commitmenttypes.ApplyPrefix(prefix, clientPrefixedPath) if err != nil { return err @@ -138,7 +138,7 @@ func (cs ClientState) VerifyClientConsensusState( return err } - clientPrefixedPath := commitmenttypes.NewMerklePath("clients/" + counterpartyClientIdentifier + "/" + host.ConsensusStatePath(consensusHeight)) + clientPrefixedPath := commitmenttypes.NewMerklePath(host.FullConsensusStatePath(counterpartyClientIdentifier, consensusHeight)) path, err := commitmenttypes.ApplyPrefix(prefix, clientPrefixedPath) if err != nil { return err @@ -460,5 +460,5 @@ func produceVerificationArgs( // sets the client state to the store func setClientState(store sdk.KVStore, cdc codec.BinaryMarshaler, clientState exported.ClientState) { bz := clienttypes.MustMarshalClientState(cdc, clientState) - store.Set(host.KeyClientState(), bz) + store.Set([]byte(host.KeyClientState), bz) } diff --git a/x/ibc/light-clients/06-solomachine/types/solomachine_test.go b/x/ibc/light-clients/06-solomachine/types/solomachine_test.go index ee236a9e8..53f5c4a48 100644 --- a/x/ibc/light-clients/06-solomachine/types/solomachine_test.go +++ b/x/ibc/light-clients/06-solomachine/types/solomachine_test.go @@ -49,7 +49,7 @@ func TestSoloMachineTestSuite(t *testing.T) { } func (suite *SoloMachineTestSuite) GetSequenceFromStore() uint64 { - bz := suite.store.Get(host.KeyClientState()) + bz := suite.store.Get(host.ClientStateKey()) suite.Require().NotNil(bz) var clientState exported.ClientState diff --git a/x/ibc/light-clients/07-tendermint/types/client_state.go b/x/ibc/light-clients/07-tendermint/types/client_state.go index 65d431245..3940d44b7 100644 --- a/x/ibc/light-clients/07-tendermint/types/client_state.go +++ b/x/ibc/light-clients/07-tendermint/types/client_state.go @@ -180,7 +180,7 @@ func (cs ClientState) VerifyClientState( return err } - clientPrefixedPath := commitmenttypes.NewMerklePath("clients/" + counterpartyClientIdentifier + "/" + host.ClientStatePath()) + clientPrefixedPath := commitmenttypes.NewMerklePath(host.FullClientStatePath(counterpartyClientIdentifier)) path, err := commitmenttypes.ApplyPrefix(prefix, clientPrefixedPath) if err != nil { return err @@ -220,7 +220,7 @@ func (cs ClientState) VerifyClientConsensusState( return err } - clientPrefixedPath := commitmenttypes.NewMerklePath("clients/" + counterpartyClientIdentifier + "/" + host.ConsensusStatePath(consensusHeight)) + clientPrefixedPath := commitmenttypes.NewMerklePath(host.FullConsensusStatePath(counterpartyClientIdentifier, consensusHeight)) path, err := commitmenttypes.ApplyPrefix(prefix, clientPrefixedPath) if err != nil { return err diff --git a/x/ibc/light-clients/07-tendermint/types/client_state_test.go b/x/ibc/light-clients/07-tendermint/types/client_state_test.go index 4f8204466..90ff6767f 100644 --- a/x/ibc/light-clients/07-tendermint/types/client_state_test.go +++ b/x/ibc/light-clients/07-tendermint/types/client_state_test.go @@ -230,7 +230,7 @@ func (suite *TendermintTestSuite) TestVerifyConnectionState() { prefix = suite.chainB.GetPrefix() // make connection proof - connectionKey := host.KeyConnection(connB.ID) + connectionKey := host.ConnectionKey(connB.ID) proof, proofHeight = suite.chainB.QueryProof(connectionKey) tc.malleate() // make changes as necessary @@ -308,7 +308,7 @@ func (suite *TendermintTestSuite) TestVerifyChannelState() { prefix = suite.chainB.GetPrefix() // make channel proof - channelKey := host.KeyChannel(channelB.PortID, channelB.ID) + channelKey := host.ChannelKey(channelB.PortID, channelB.ID) proof, proofHeight = suite.chainB.QueryProof(channelKey) tc.malleate() // make changes as necessary @@ -389,7 +389,7 @@ func (suite *TendermintTestSuite) TestVerifyPacketCommitment() { prefix = suite.chainB.GetPrefix() // make packet commitment proof - packetKey := host.KeyPacketCommitment(packet.GetSourcePort(), packet.GetSourceChannel(), packet.GetSequence()) + packetKey := host.PacketCommitmentKey(packet.GetSourcePort(), packet.GetSourceChannel(), packet.GetSequence()) proof, proofHeight = suite.chainB.QueryProof(packetKey) tc.malleate() // make changes as necessary @@ -477,7 +477,7 @@ func (suite *TendermintTestSuite) TestVerifyPacketAcknowledgement() { prefix = suite.chainB.GetPrefix() // make packet acknowledgement proof - acknowledgementKey := host.KeyPacketAcknowledgement(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) + acknowledgementKey := host.PacketAcknowledgementKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) proof, proofHeight = suite.chainB.QueryProof(acknowledgementKey) tc.malleate() // make changes as necessary @@ -564,7 +564,7 @@ func (suite *TendermintTestSuite) TestVerifyPacketReceiptAbsence() { prefix = suite.chainB.GetPrefix() // make packet receipt absence proof - receiptKey := host.KeyPacketReceipt(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) + receiptKey := host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) proof, proofHeight = suite.chainB.QueryProof(receiptKey) tc.malleate() // make changes as necessary @@ -655,7 +655,7 @@ func (suite *TendermintTestSuite) TestVerifyNextSeqRecv() { prefix = suite.chainB.GetPrefix() // make next seq recv proof - nextSeqRecvKey := host.KeyNextSequenceRecv(packet.GetDestPort(), packet.GetDestChannel()) + nextSeqRecvKey := host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) proof, proofHeight = suite.chainB.QueryProof(nextSeqRecvKey) tc.malleate() // make changes as necessary diff --git a/x/ibc/light-clients/07-tendermint/types/store.go b/x/ibc/light-clients/07-tendermint/types/store.go index 096d79833..50f8d2a1d 100644 --- a/x/ibc/light-clients/07-tendermint/types/store.go +++ b/x/ibc/light-clients/07-tendermint/types/store.go @@ -12,7 +12,7 @@ import ( // GetConsensusState retrieves the consensus state from the client prefixed // store. An error is returned if the consensus state does not exist. func GetConsensusState(store sdk.KVStore, cdc codec.BinaryMarshaler, height exported.Height) (*ConsensusState, error) { - bz := store.Get(host.KeyConsensusState(height)) + bz := store.Get(host.ConsensusStateKey(height)) if bz == nil { return nil, sdkerrors.Wrapf( clienttypes.ErrConsensusStateNotFound, diff --git a/x/ibc/light-clients/07-tendermint/types/store_test.go b/x/ibc/light-clients/07-tendermint/types/store_test.go index 91cb973ca..3bb267b0f 100644 --- a/x/ibc/light-clients/07-tendermint/types/store_test.go +++ b/x/ibc/light-clients/07-tendermint/types/store_test.go @@ -34,7 +34,7 @@ func (suite *TendermintTestSuite) TestGetConsensusState() { // marshal an empty client state and set as consensus state store := suite.chainA.App.IBCKeeper.ClientKeeper.ClientStore(suite.chainA.GetContext(), clientA) clientStateBz := suite.chainA.App.IBCKeeper.ClientKeeper.MustMarshalClientState(&types.ClientState{}) - store.Set(host.KeyConsensusState(height), clientStateBz) + store.Set(host.ConsensusStateKey(height), clientStateBz) }, false, }, { @@ -42,7 +42,7 @@ func (suite *TendermintTestSuite) TestGetConsensusState() { // marshal and set solomachine consensus state store := suite.chainA.App.IBCKeeper.ClientKeeper.ClientStore(suite.chainA.GetContext(), clientA) consensusStateBz := suite.chainA.App.IBCKeeper.ClientKeeper.MustMarshalConsensusState(&solomachinetypes.ConsensusState{}) - store.Set(host.KeyConsensusState(height), consensusStateBz) + store.Set(host.ConsensusStateKey(height), consensusStateBz) }, false, }, } diff --git a/x/ibc/light-clients/09-localhost/types/client_state.go b/x/ibc/light-clients/09-localhost/types/client_state.go index fa4223fc9..eb6931147 100644 --- a/x/ibc/light-clients/09-localhost/types/client_state.go +++ b/x/ibc/light-clients/09-localhost/types/client_state.go @@ -115,8 +115,8 @@ func (cs ClientState) VerifyClientState( store sdk.KVStore, cdc codec.BinaryMarshaler, _ exported.Height, _ exported.Prefix, _ string, _ []byte, clientState exported.ClientState, ) error { - path := host.KeyClientState() - bz := store.Get(path) + path := host.KeyClientState + bz := store.Get([]byte(path)) if bz == nil { return sdkerrors.Wrapf(clienttypes.ErrFailedClientStateVerification, "not found for path: %s", path) @@ -154,7 +154,7 @@ func (cs ClientState) VerifyConnectionState( connectionID string, connectionEnd exported.ConnectionI, ) error { - path := host.KeyConnection(connectionID) + path := host.ConnectionKey(connectionID) bz := store.Get(path) if bz == nil { return sdkerrors.Wrapf(clienttypes.ErrFailedConnectionStateVerification, "not found for path %s", path) @@ -188,7 +188,7 @@ func (cs ClientState) VerifyChannelState( channelID string, channel exported.ChannelI, ) error { - path := host.KeyChannel(portID, channelID) + path := host.ChannelKey(portID, channelID) bz := store.Get(path) if bz == nil { return sdkerrors.Wrapf(clienttypes.ErrFailedChannelStateVerification, "not found for path %s", path) @@ -223,7 +223,7 @@ func (cs ClientState) VerifyPacketCommitment( sequence uint64, commitmentBytes []byte, ) error { - path := host.KeyPacketCommitment(portID, channelID, sequence) + path := host.PacketCommitmentKey(portID, channelID, sequence) data := store.Get(path) if len(data) == 0 { @@ -253,7 +253,7 @@ func (cs ClientState) VerifyPacketAcknowledgement( sequence uint64, acknowledgement []byte, ) error { - path := host.KeyPacketAcknowledgement(portID, channelID, sequence) + path := host.PacketAcknowledgementKey(portID, channelID, sequence) data := store.Get(path) if len(data) == 0 { @@ -283,7 +283,7 @@ func (cs ClientState) VerifyPacketReceiptAbsence( channelID string, sequence uint64, ) error { - path := host.KeyPacketReceipt(portID, channelID, sequence) + path := host.PacketReceiptKey(portID, channelID, sequence) data := store.Get(path) if data != nil { @@ -305,7 +305,7 @@ func (cs ClientState) VerifyNextSequenceRecv( channelID string, nextSequenceRecv uint64, ) error { - path := host.KeyNextSequenceRecv(portID, channelID) + path := host.NextSequenceRecvKey(portID, channelID) data := store.Get(path) if len(data) == 0 { diff --git a/x/ibc/light-clients/09-localhost/types/client_state_test.go b/x/ibc/light-clients/09-localhost/types/client_state_test.go index f56cec5d7..a4443867d 100644 --- a/x/ibc/light-clients/09-localhost/types/client_state_test.go +++ b/x/ibc/light-clients/09-localhost/types/client_state_test.go @@ -66,7 +66,7 @@ func (suite *LocalhostTestSuite) TestVerifyClientState() { clientState: clientState, malleate: func() { bz := clienttypes.MustMarshalClientState(suite.cdc, clientState) - suite.store.Set(host.KeyClientState(), bz) + suite.store.Set(host.ClientStateKey(), bz) }, counterparty: clientState, expPass: true, @@ -76,7 +76,7 @@ func (suite *LocalhostTestSuite) TestVerifyClientState() { clientState: clientState, malleate: func() { bz := clienttypes.MustMarshalClientState(suite.cdc, clientState) - suite.store.Set(host.KeyClientState(), bz) + suite.store.Set(host.ClientStateKey(), bz) }, counterparty: invalidClient, expPass: false, @@ -161,7 +161,7 @@ func (suite *LocalhostTestSuite) TestVerifyConnectionState() { malleate: func() { bz, err := suite.cdc.MarshalBinaryBare(&conn1) suite.Require().NoError(err) - suite.store.Set(host.KeyConnection(testConnectionID), bz) + suite.store.Set(host.ConnectionKey(testConnectionID), bz) }, connection: conn1, expPass: true, @@ -177,7 +177,7 @@ func (suite *LocalhostTestSuite) TestVerifyConnectionState() { name: "proof verification failed: unmarshal error", clientState: types.NewClientState("chainID", clientHeight), malleate: func() { - suite.store.Set(host.KeyConnection(testConnectionID), []byte("connection")) + suite.store.Set(host.ConnectionKey(testConnectionID), []byte("connection")) }, connection: conn1, expPass: false, @@ -188,7 +188,7 @@ func (suite *LocalhostTestSuite) TestVerifyConnectionState() { malleate: func() { bz, err := suite.cdc.MarshalBinaryBare(&conn2) suite.Require().NoError(err) - suite.store.Set(host.KeyConnection(testConnectionID), bz) + suite.store.Set(host.ConnectionKey(testConnectionID), bz) }, connection: conn1, expPass: false, @@ -233,7 +233,7 @@ func (suite *LocalhostTestSuite) TestVerifyChannelState() { malleate: func() { bz, err := suite.cdc.MarshalBinaryBare(&ch1) suite.Require().NoError(err) - suite.store.Set(host.KeyChannel(testPortID, testChannelID), bz) + suite.store.Set(host.ChannelKey(testPortID, testChannelID), bz) }, channel: ch1, expPass: true, @@ -249,7 +249,7 @@ func (suite *LocalhostTestSuite) TestVerifyChannelState() { name: "proof verification failed: unmarshal failed", clientState: types.NewClientState("chainID", clientHeight), malleate: func() { - suite.store.Set(host.KeyChannel(testPortID, testChannelID), []byte("channel")) + suite.store.Set(host.ChannelKey(testPortID, testChannelID), []byte("channel")) }, channel: ch1, @@ -261,7 +261,7 @@ func (suite *LocalhostTestSuite) TestVerifyChannelState() { malleate: func() { bz, err := suite.cdc.MarshalBinaryBare(&ch2) suite.Require().NoError(err) - suite.store.Set(host.KeyChannel(testPortID, testChannelID), bz) + suite.store.Set(host.ChannelKey(testPortID, testChannelID), bz) }, channel: ch1, @@ -302,7 +302,7 @@ func (suite *LocalhostTestSuite) TestVerifyPacketCommitment() { clientState: types.NewClientState("chainID", clientHeight), malleate: func() { suite.store.Set( - host.KeyPacketCommitment(testPortID, testChannelID, testSequence), []byte("commitment"), + host.PacketCommitmentKey(testPortID, testChannelID, testSequence), []byte("commitment"), ) }, commitment: []byte("commitment"), @@ -313,7 +313,7 @@ func (suite *LocalhostTestSuite) TestVerifyPacketCommitment() { clientState: types.NewClientState("chainID", clientHeight), malleate: func() { suite.store.Set( - host.KeyPacketCommitment(testPortID, testChannelID, testSequence), []byte("different"), + host.PacketCommitmentKey(testPortID, testChannelID, testSequence), []byte("different"), ) }, commitment: []byte("commitment"), @@ -361,7 +361,7 @@ func (suite *LocalhostTestSuite) TestVerifyPacketAcknowledgement() { clientState: types.NewClientState("chainID", clientHeight), malleate: func() { suite.store.Set( - host.KeyPacketAcknowledgement(testPortID, testChannelID, testSequence), []byte("acknowledgement"), + host.PacketAcknowledgementKey(testPortID, testChannelID, testSequence), []byte("acknowledgement"), ) }, ack: []byte("acknowledgement"), @@ -372,7 +372,7 @@ func (suite *LocalhostTestSuite) TestVerifyPacketAcknowledgement() { clientState: types.NewClientState("chainID", clientHeight), malleate: func() { suite.store.Set( - host.KeyPacketAcknowledgement(testPortID, testChannelID, testSequence), []byte("different"), + host.PacketAcknowledgementKey(testPortID, testChannelID, testSequence), []byte("different"), ) }, ack: []byte("acknowledgement"), @@ -416,7 +416,7 @@ func (suite *LocalhostTestSuite) TestVerifyPacketReceiptAbsence() { suite.Require().NoError(err, "receipt absence failed") - suite.store.Set(host.KeyPacketReceipt(testPortID, testChannelID, testSequence), []byte("receipt")) + suite.store.Set(host.PacketReceiptKey(testPortID, testChannelID, testSequence), []byte("receipt")) err = clientState.VerifyPacketReceiptAbsence( suite.store, suite.cdc, clientHeight, nil, nil, testPortID, testChannelID, testSequence, @@ -439,7 +439,7 @@ func (suite *LocalhostTestSuite) TestVerifyNextSeqRecv() { clientState: types.NewClientState("chainID", clientHeight), malleate: func() { suite.store.Set( - host.KeyNextSequenceRecv(testPortID, testChannelID), + host.NextSequenceRecvKey(testPortID, testChannelID), sdk.Uint64ToBigEndian(nextSeqRecv), ) }, @@ -451,7 +451,7 @@ func (suite *LocalhostTestSuite) TestVerifyNextSeqRecv() { clientState: types.NewClientState("chainID", clientHeight), malleate: func() { suite.store.Set( - host.KeyNextSequenceRecv(testPortID, testChannelID), + host.NextSequenceRecvKey(testPortID, testChannelID), sdk.Uint64ToBigEndian(3), ) }, diff --git a/x/ibc/testing/chain.go b/x/ibc/testing/chain.go index f43c4d267..5886695ef 100644 --- a/x/ibc/testing/chain.go +++ b/x/ibc/testing/chain.go @@ -242,7 +242,7 @@ func (chain *TestChain) QueryClientStateProof(clientID string) (exported.ClientS clientState, found := chain.App.IBCKeeper.ClientKeeper.GetClientState(chain.GetContext(), clientID) require.True(chain.t, found) - clientKey := host.FullKeyClientPath(clientID, host.KeyClientState()) + clientKey := host.FullClientStateKey(clientID) proofClient, _ := chain.QueryProof(clientKey) return clientState, proofClient @@ -254,7 +254,7 @@ func (chain *TestChain) QueryConsensusStateProof(clientID string) ([]byte, clien clientState := chain.GetClientState(clientID) consensusHeight := clientState.GetLatestHeight().(clienttypes.Height) - consensusKey := host.FullKeyClientPath(clientID, host.KeyConsensusState(consensusHeight)) + consensusKey := host.FullConsensusStateKey(clientID, consensusHeight) proofConsensus, _ := chain.QueryProof(consensusKey) return proofConsensus, consensusHeight @@ -645,7 +645,7 @@ func (chain *TestChain) ConnectionOpenTry( ) error { counterpartyClient, proofClient := counterparty.QueryClientStateProof(counterpartyConnection.ClientID) - connectionKey := host.KeyConnection(counterpartyConnection.ID) + connectionKey := host.ConnectionKey(counterpartyConnection.ID) proofInit, proofHeight := counterparty.QueryProof(connectionKey) proofConsensus, consensusHeight := counterparty.QueryConsensusStateProof(counterpartyConnection.ClientID) @@ -668,7 +668,7 @@ func (chain *TestChain) ConnectionOpenAck( ) error { counterpartyClient, proofClient := counterparty.QueryClientStateProof(counterpartyConnection.ClientID) - connectionKey := host.KeyConnection(counterpartyConnection.ID) + connectionKey := host.ConnectionKey(counterpartyConnection.ID) proofTry, proofHeight := counterparty.QueryProof(connectionKey) proofConsensus, consensusHeight := counterparty.QueryConsensusStateProof(counterpartyConnection.ClientID) @@ -688,7 +688,7 @@ func (chain *TestChain) ConnectionOpenConfirm( counterparty *TestChain, connection, counterpartyConnection *TestConnection, ) error { - connectionKey := host.KeyConnection(counterpartyConnection.ID) + connectionKey := host.ConnectionKey(counterpartyConnection.ID) proof, height := counterparty.QueryProof(connectionKey) msg := connectiontypes.NewMsgConnectionOpenConfirm( @@ -788,7 +788,7 @@ func (chain *TestChain) ChanOpenTry( order channeltypes.Order, connectionID string, ) error { - proof, height := counterparty.QueryProof(host.KeyChannel(counterpartyCh.PortID, counterpartyCh.ID)) + proof, height := counterparty.QueryProof(host.ChannelKey(counterpartyCh.PortID, counterpartyCh.ID)) msg := channeltypes.NewMsgChannelOpenTry( ch.PortID, ch.ID, ch.ID, // testing doesn't use flexible selection @@ -806,7 +806,7 @@ func (chain *TestChain) ChanOpenAck( counterparty *TestChain, ch, counterpartyCh TestChannel, ) error { - proof, height := counterparty.QueryProof(host.KeyChannel(counterpartyCh.PortID, counterpartyCh.ID)) + proof, height := counterparty.QueryProof(host.ChannelKey(counterpartyCh.PortID, counterpartyCh.ID)) msg := channeltypes.NewMsgChannelOpenAck( ch.PortID, ch.ID, @@ -822,7 +822,7 @@ func (chain *TestChain) ChanOpenConfirm( counterparty *TestChain, ch, counterpartyCh TestChannel, ) error { - proof, height := counterparty.QueryProof(host.KeyChannel(counterpartyCh.PortID, counterpartyCh.ID)) + proof, height := counterparty.QueryProof(host.ChannelKey(counterpartyCh.PortID, counterpartyCh.ID)) msg := channeltypes.NewMsgChannelOpenConfirm( ch.PortID, ch.ID, diff --git a/x/ibc/testing/coordinator.go b/x/ibc/testing/coordinator.go index 7ead436ab..ce5c8607f 100644 --- a/x/ibc/testing/coordinator.go +++ b/x/ibc/testing/coordinator.go @@ -238,7 +238,7 @@ func (coord *Coordinator) RecvPacket( packet channeltypes.Packet, ) error { // get proof of packet commitment on source - packetKey := host.KeyPacketCommitment(packet.GetSourcePort(), packet.GetSourceChannel(), packet.GetSequence()) + packetKey := host.PacketCommitmentKey(packet.GetSourcePort(), packet.GetSourceChannel(), packet.GetSequence()) proof, proofHeight := source.QueryProof(packetKey) recvMsg := channeltypes.NewMsgRecvPacket(packet, proof, proofHeight, counterparty.SenderAccount.GetAddress()) @@ -277,7 +277,7 @@ func (coord *Coordinator) AcknowledgePacket( packet channeltypes.Packet, ack []byte, ) error { // get proof of acknowledgement on counterparty - packetKey := host.KeyPacketAcknowledgement(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) + packetKey := host.PacketAcknowledgementKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) proof, proofHeight := counterparty.QueryProof(packetKey) ackMsg := channeltypes.NewMsgAcknowledgement(packet, ack, proof, proofHeight, source.SenderAccount.GetAddress()) diff --git a/x/ibc/testing/solomachine.go b/x/ibc/testing/solomachine.go index 0d3b35811..03fe887b8 100644 --- a/x/ibc/testing/solomachine.go +++ b/x/ibc/testing/solomachine.go @@ -251,8 +251,7 @@ func (solo *Solomachine) GenerateSignature(signBytes []byte) []byte { // GetClientStatePath returns the commitment path for the client state. func (solo *Solomachine) GetClientStatePath(counterpartyClientIdentifier string) commitmenttypes.MerklePath { - clientPrefixedPath := commitmenttypes.NewMerklePath("clients/" + counterpartyClientIdentifier + "/" + host.ClientStatePath()) - path, err := commitmenttypes.ApplyPrefix(prefix, clientPrefixedPath) + path, err := commitmenttypes.ApplyPrefix(prefix, commitmenttypes.NewMerklePath(host.FullClientStatePath(counterpartyClientIdentifier))) require.NoError(solo.t, err) return path @@ -260,8 +259,7 @@ func (solo *Solomachine) GetClientStatePath(counterpartyClientIdentifier string) // GetConsensusStatePath returns the commitment path for the consensus state. func (solo *Solomachine) GetConsensusStatePath(counterpartyClientIdentifier string, consensusHeight exported.Height) commitmenttypes.MerklePath { - clientPrefixedPath := commitmenttypes.NewMerklePath("clients/" + counterpartyClientIdentifier + "/" + host.ConsensusStatePath(consensusHeight)) - path, err := commitmenttypes.ApplyPrefix(prefix, clientPrefixedPath) + path, err := commitmenttypes.ApplyPrefix(prefix, commitmenttypes.NewMerklePath(host.FullConsensusStatePath(counterpartyClientIdentifier, consensusHeight))) require.NoError(solo.t, err) return path From bcdd6ee15c08a742c346a6cf7e8fc80ae17c75b0 Mon Sep 17 00:00:00 2001 From: Federico Kunze <31522760+fedekunze@users.noreply.github.com> Date: Tue, 10 Nov 2020 18:50:53 +0100 Subject: [PATCH 4/4] ibc: fix grpc gateway routes (#7881) --- client/docs/swagger-ui/swagger.yaml | 50 ++--- .../ibc/applications/transfer/v1/query.proto | 6 +- proto/ibc/core/channel/v1/query.proto | 26 +-- proto/ibc/core/client/v1/query.proto | 8 +- proto/ibc/core/connection/v1/query.proto | 10 +- x/ibc/applications/transfer/types/query.pb.go | 69 ++++--- .../transfer/types/query.pb.gw.go | 6 +- x/ibc/core/02-client/types/query.pb.go | 96 ++++----- x/ibc/core/02-client/types/query.pb.gw.go | 8 +- x/ibc/core/03-connection/types/query.pb.go | 114 +++++------ x/ibc/core/03-connection/types/query.pb.gw.go | 10 +- x/ibc/core/04-channel/types/query.pb.go | 188 +++++++++--------- x/ibc/core/04-channel/types/query.pb.gw.go | 26 +-- .../core/23-commitment/types/commitment.pb.go | 2 + 14 files changed, 310 insertions(+), 309 deletions(-) diff --git a/client/docs/swagger-ui/swagger.yaml b/client/docs/swagger-ui/swagger.yaml index 06500d754..f8a2cccb9 100644 --- a/client/docs/swagger-ui/swagger.yaml +++ b/client/docs/swagger-ui/swagger.yaml @@ -15760,7 +15760,7 @@ paths: } tags: - Query - /ibc/channel/v1beta1/channels: + /ibc/core/channel/v1beta1/channels: get: summary: Channels queries all the IBC channels of a chain. operationId: Channels @@ -16146,7 +16146,7 @@ paths: type: boolean tags: - Query - '/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}': + '/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}': get: summary: Channel queries an IBC Channel. operationId: Channel @@ -16471,7 +16471,7 @@ paths: type: string tags: - Query - '/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/client_state': + '/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/client_state': get: summary: >- ChannelClientState queries for the client state for the channel @@ -16909,7 +16909,7 @@ paths: type: string tags: - Query - '/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/consensus_state/version/{version_number}/height/{version_height}': + '/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/consensus_state/version/{version_number}/height/{version_height}': get: summary: |- ChannelConsensusState queries for the consensus state for the channel @@ -17344,7 +17344,7 @@ paths: format: uint64 tags: - Query - '/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/next_sequence': + '/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/next_sequence': get: summary: >- NextSequenceReceive returns the next receive sequence for a given @@ -17596,7 +17596,7 @@ paths: type: string tags: - Query - '/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_acknowledgements': + '/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_acknowledgements': get: summary: >- PacketAcknowledgements returns all the packet acknowledgements @@ -17945,7 +17945,7 @@ paths: type: boolean tags: - Query - '/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_acks/{sequence}': + '/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_acks/{sequence}': get: summary: PacketAcknowledgement queries a stored packet acknowledgement hash. operationId: PacketAcknowledgement @@ -18205,7 +18205,7 @@ paths: format: uint64 tags: - Query - '/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments': + '/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments': get: summary: |- PacketCommitments returns all the packet commitments hashes associated @@ -18552,7 +18552,7 @@ paths: type: boolean tags: - Query - '/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_ack_sequences}/unreceived_acks': + '/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_ack_sequences}/unreceived_acks': get: summary: >- UnreceivedAcks returns all the unreceived IBC acknowledgements @@ -18814,7 +18814,7 @@ paths: minItems: 1 tags: - Query - '/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_commitment_sequences}/unreceived_packets': + '/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/{packet_commitment_sequences}/unreceived_packets': get: summary: >- UnreceivedPackets returns all the unreceived IBC packets associated with @@ -19076,7 +19076,7 @@ paths: minItems: 1 tags: - Query - '/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/{sequence}': + '/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/{sequence}': get: summary: PacketCommitment queries a stored packet commitment hash. operationId: PacketCommitment @@ -19337,7 +19337,7 @@ paths: format: uint64 tags: - Query - '/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_receipts/{sequence}': + '/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_receipts/{sequence}': get: summary: >- PacketReceipt queries if a given packet sequence has been received on @@ -19599,7 +19599,7 @@ paths: format: uint64 tags: - Query - '/ibc/channel/v1beta1/connections/{connection}/channels': + '/ibc/core/channel/v1beta1/connections/{connection}/channels': get: summary: |- ConnectionChannels queries all the channels associated with a connection @@ -19992,7 +19992,7 @@ paths: type: boolean tags: - Query - /ibc/client/v1beta1/client_states: + /ibc/core/client/v1beta1/client_states: get: summary: ClientStates queries all the IBC light clients of a chain. operationId: ClientStates @@ -20465,7 +20465,7 @@ paths: type: boolean tags: - Query - '/ibc/client/v1beta1/client_states/{client_id}': + '/ibc/core/client/v1beta1/client_states/{client_id}': get: summary: ClientState queries an IBC light client. operationId: ClientState @@ -20883,7 +20883,7 @@ paths: type: string tags: - Query - '/ibc/client/v1beta1/consensus_states/{client_id}': + '/ibc/core/client/v1beta1/consensus_states/{client_id}': get: summary: |- ConsensusStates queries all the consensus state associated with a given @@ -21383,7 +21383,7 @@ paths: type: boolean tags: - Query - '/ibc/client/v1beta1/consensus_states/{client_id}/version/{version_number}/height/{version_height}': + '/ibc/core/client/v1beta1/consensus_states/{client_id}/version/{version_number}/height/{version_height}': get: summary: >- ConsensusState queries a consensus state associated with a client state @@ -21825,7 +21825,7 @@ paths: type: boolean tags: - Query - '/ibc/connection/v1beta1/client_connections/{client_id}': + '/ibc/core/connection/v1beta1/client_connections/{client_id}': get: summary: |- ClientConnections queries the connection paths associated with a client @@ -22073,7 +22073,7 @@ paths: type: string tags: - Query - /ibc/connection/v1beta1/connections: + /ibc/core/connection/v1beta1/connections: get: summary: Connections queries all the IBC connections of a chain. operationId: Connections @@ -22457,7 +22457,7 @@ paths: type: boolean tags: - Query - '/ibc/connection/v1beta1/connections/{connection_id}': + '/ibc/core/connection/v1beta1/connections/{connection_id}': get: summary: Connection queries an IBC connection end. operationId: Connection @@ -22777,7 +22777,7 @@ paths: type: string tags: - Query - '/ibc/connection/v1beta1/connections/{connection_id}/client_state': + '/ibc/core/connection/v1beta1/connections/{connection_id}/client_state': get: summary: |- ConnectionClientState queries the client state associated with the @@ -23208,7 +23208,7 @@ paths: type: string tags: - Query - '/ibc/connection/v1beta1/connections/{connection_id}/consensus_state/version/{version_number}/height/{version_height}': + '/ibc/core/connection/v1beta1/connections/{connection_id}/consensus_state/version/{version_number}/height/{version_height}': get: summary: |- ConnectionConsensusState queries the consensus state associated with the @@ -23636,7 +23636,7 @@ paths: format: uint64 tags: - Query - /ibc_transfer/v1beta1/denom_traces: + /ibc/applications/transfer/v1beta1/denom_traces: get: summary: DenomTraces queries all denomination traces. operationId: DenomTraces @@ -23761,7 +23761,7 @@ paths: type: boolean tags: - Query - '/ibc_transfer/v1beta1/denom_traces/{hash}': + '/ibc/applications/transfer/v1beta1/denom_traces/{hash}': get: summary: DenomTrace queries a denomination trace information. operationId: DenomTrace @@ -23822,7 +23822,7 @@ paths: type: string tags: - Query - /ibc_transfer/v1beta1/params: + /ibc/applications/transfer/v1beta1/params: get: summary: Params queries all parameters of the ibc-transfer module. operationId: IBCTransferParams diff --git a/proto/ibc/applications/transfer/v1/query.proto b/proto/ibc/applications/transfer/v1/query.proto index 98dd02f75..e9cbd02a3 100644 --- a/proto/ibc/applications/transfer/v1/query.proto +++ b/proto/ibc/applications/transfer/v1/query.proto @@ -12,17 +12,17 @@ option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/applications/transfer/ty service Query { // DenomTrace queries a denomination trace information. rpc DenomTrace(QueryDenomTraceRequest) returns (QueryDenomTraceResponse) { - option (google.api.http).get = "/ibc_transfer/v1beta1/denom_traces/{hash}"; + option (google.api.http).get = "/ibc/applications/transfer/v1beta1/denom_traces/{hash}"; } // DenomTraces queries all denomination traces. rpc DenomTraces(QueryDenomTracesRequest) returns (QueryDenomTracesResponse) { - option (google.api.http).get = "/ibc_transfer/v1beta1/denom_traces"; + option (google.api.http).get = "/ibc/applications/transfer/v1beta1/denom_traces"; } // Params queries all parameters of the ibc-transfer module. rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/ibc_transfer/v1beta1/params"; + option (google.api.http).get = "/ibc/applications/transfer/v1beta1/params"; } } diff --git a/proto/ibc/core/channel/v1/query.proto b/proto/ibc/core/channel/v1/query.proto index dcff04f7f..90d2adaea 100644 --- a/proto/ibc/core/channel/v1/query.proto +++ b/proto/ibc/core/channel/v1/query.proto @@ -14,79 +14,79 @@ option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types"; service Query { // Channel queries an IBC Channel. rpc Channel(QueryChannelRequest) returns (QueryChannelResponse) { - option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}"; + option (google.api.http).get = "/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}"; } // Channels queries all the IBC channels of a chain. rpc Channels(QueryChannelsRequest) returns (QueryChannelsResponse) { - option (google.api.http).get = "/ibc/channel/v1beta1/channels"; + option (google.api.http).get = "/ibc/core/channel/v1beta1/channels"; } // ConnectionChannels queries all the channels associated with a connection // end. rpc ConnectionChannels(QueryConnectionChannelsRequest) returns (QueryConnectionChannelsResponse) { - option (google.api.http).get = "/ibc/channel/v1beta1/connections/{connection}/channels"; + option (google.api.http).get = "/ibc/core/channel/v1beta1/connections/{connection}/channels"; } // ChannelClientState queries for the client state for the channel associated // with the provided channel identifiers. rpc ChannelClientState(QueryChannelClientStateRequest) returns (QueryChannelClientStateResponse) { - option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/client_state"; + option (google.api.http).get = "/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/client_state"; } // ChannelConsensusState queries for the consensus state for the channel // associated with the provided channel identifiers. rpc ChannelConsensusState(QueryChannelConsensusStateRequest) returns (QueryChannelConsensusStateResponse) { - option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/consensus_state/version/" + option (google.api.http).get = "/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/consensus_state/version/" "{version_number}/height/{version_height}"; } // PacketCommitment queries a stored packet commitment hash. rpc PacketCommitment(QueryPacketCommitmentRequest) returns (QueryPacketCommitmentResponse) { option (google.api.http).get = - "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/{sequence}"; + "/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/{sequence}"; } // PacketCommitments returns all the packet commitments hashes associated // with a channel. rpc PacketCommitments(QueryPacketCommitmentsRequest) returns (QueryPacketCommitmentsResponse) { - option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments"; + option (google.api.http).get = "/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments"; } // PacketReceipt queries if a given packet sequence has been received on the queried chain rpc PacketReceipt(QueryPacketReceiptRequest) returns (QueryPacketReceiptResponse) { - option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_receipts/{sequence}"; + option (google.api.http).get = "/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_receipts/{sequence}"; } // PacketAcknowledgement queries a stored packet acknowledgement hash. rpc PacketAcknowledgement(QueryPacketAcknowledgementRequest) returns (QueryPacketAcknowledgementResponse) { - option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_acks/{sequence}"; + option (google.api.http).get = "/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_acks/{sequence}"; } // PacketAcknowledgements returns all the packet acknowledgements associated // with a channel. rpc PacketAcknowledgements(QueryPacketAcknowledgementsRequest) returns (QueryPacketAcknowledgementsResponse) { - option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_acknowledgements"; + option (google.api.http).get = "/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_acknowledgements"; } // UnreceivedPackets returns all the unreceived IBC packets associated with a // channel and sequences. rpc UnreceivedPackets(QueryUnreceivedPacketsRequest) returns (QueryUnreceivedPacketsResponse) { - option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/" + option (google.api.http).get = "/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/" "{packet_commitment_sequences}/unreceived_packets"; } // UnreceivedAcks returns all the unreceived IBC acknowledgements associated with a // channel and sequences. rpc UnreceivedAcks(QueryUnreceivedAcksRequest) returns (QueryUnreceivedAcksResponse) { - option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/" + option (google.api.http).get = "/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/packet_commitments/" "{packet_ack_sequences}/unreceived_acks"; } // NextSequenceReceive returns the next receive sequence for a given channel. rpc NextSequenceReceive(QueryNextSequenceReceiveRequest) returns (QueryNextSequenceReceiveResponse) { - option (google.api.http).get = "/ibc/channel/v1beta1/channels/{channel_id}/ports/{port_id}/next_sequence"; + option (google.api.http).get = "/ibc/core/channel/v1beta1/channels/{channel_id}/ports/{port_id}/next_sequence"; } } diff --git a/proto/ibc/core/client/v1/query.proto b/proto/ibc/core/client/v1/query.proto index a40fed843..db580a260 100644 --- a/proto/ibc/core/client/v1/query.proto +++ b/proto/ibc/core/client/v1/query.proto @@ -13,25 +13,25 @@ option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types"; service Query { // ClientState queries an IBC light client. rpc ClientState(QueryClientStateRequest) returns (QueryClientStateResponse) { - option (google.api.http).get = "/ibc/client/v1beta1/client_states/{client_id}"; + option (google.api.http).get = "/ibc/core/client/v1beta1/client_states/{client_id}"; } // ClientStates queries all the IBC light clients of a chain. rpc ClientStates(QueryClientStatesRequest) returns (QueryClientStatesResponse) { - option (google.api.http).get = "/ibc/client/v1beta1/client_states"; + option (google.api.http).get = "/ibc/core/client/v1beta1/client_states"; } // ConsensusState queries a consensus state associated with a client state at // a given height. rpc ConsensusState(QueryConsensusStateRequest) returns (QueryConsensusStateResponse) { - option (google.api.http).get = "/ibc/client/v1beta1/consensus_states/{client_id}/version/{version_number}/" + option (google.api.http).get = "/ibc/core/client/v1beta1/consensus_states/{client_id}/version/{version_number}/" "height/{version_height}"; } // ConsensusStates queries all the consensus state associated with a given // client. rpc ConsensusStates(QueryConsensusStatesRequest) returns (QueryConsensusStatesResponse) { - option (google.api.http).get = "/ibc/client/v1beta1/consensus_states/{client_id}"; + option (google.api.http).get = "/ibc/core/client/v1beta1/consensus_states/{client_id}"; } } diff --git a/proto/ibc/core/connection/v1/query.proto b/proto/ibc/core/connection/v1/query.proto index c2666ee28..9e5b06880 100644 --- a/proto/ibc/core/connection/v1/query.proto +++ b/proto/ibc/core/connection/v1/query.proto @@ -14,30 +14,30 @@ option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/core/03-connection/types service Query { // Connection queries an IBC connection end. rpc Connection(QueryConnectionRequest) returns (QueryConnectionResponse) { - option (google.api.http).get = "/ibc/connection/v1beta1/connections/{connection_id}"; + option (google.api.http).get = "/ibc/core/connection/v1beta1/connections/{connection_id}"; } // Connections queries all the IBC connections of a chain. rpc Connections(QueryConnectionsRequest) returns (QueryConnectionsResponse) { - option (google.api.http).get = "/ibc/connection/v1beta1/connections"; + option (google.api.http).get = "/ibc/core/connection/v1beta1/connections"; } // ClientConnections queries the connection paths associated with a client // state. rpc ClientConnections(QueryClientConnectionsRequest) returns (QueryClientConnectionsResponse) { - option (google.api.http).get = "/ibc/connection/v1beta1/client_connections/{client_id}"; + option (google.api.http).get = "/ibc/core/connection/v1beta1/client_connections/{client_id}"; } // ConnectionClientState queries the client state associated with the // connection. rpc ConnectionClientState(QueryConnectionClientStateRequest) returns (QueryConnectionClientStateResponse) { - option (google.api.http).get = "/ibc/connection/v1beta1/connections/{connection_id}/client_state"; + option (google.api.http).get = "/ibc/core/connection/v1beta1/connections/{connection_id}/client_state"; } // ConnectionConsensusState queries the consensus state associated with the // connection. rpc ConnectionConsensusState(QueryConnectionConsensusStateRequest) returns (QueryConnectionConsensusStateResponse) { - option (google.api.http).get = "/ibc/connection/v1beta1/connections/{connection_id}/consensus_state/" + option (google.api.http).get = "/ibc/core/connection/v1beta1/connections/{connection_id}/consensus_state/" "version/{version_number}/height/{version_height}"; } } diff --git a/x/ibc/applications/transfer/types/query.pb.go b/x/ibc/applications/transfer/types/query.pb.go index 27e155632..ee069d350 100644 --- a/x/ibc/applications/transfer/types/query.pb.go +++ b/x/ibc/applications/transfer/types/query.pb.go @@ -324,41 +324,40 @@ func init() { } var fileDescriptor_a638e2800a01538c = []byte{ - // 532 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0x4f, 0x6f, 0xd3, 0x30, - 0x14, 0xaf, 0x37, 0xa8, 0xc4, 0x2b, 0xe2, 0x60, 0x26, 0xa8, 0xa2, 0x2a, 0x9b, 0xa2, 0x0a, 0xca, - 0x06, 0x36, 0x19, 0x7f, 0x4e, 0x88, 0xc3, 0x84, 0x40, 0xdc, 0x46, 0xe1, 0x80, 0xe0, 0x30, 0x39, - 0xa9, 0x49, 0x23, 0xd6, 0x38, 0x8b, 0xdd, 0x8a, 0x09, 0x71, 0xe1, 0x13, 0x20, 0xed, 0x4b, 0x20, - 0xc4, 0x87, 0xe0, 0xb8, 0xe3, 0x24, 0x2e, 0x9c, 0x00, 0xb5, 0x7c, 0x07, 0xae, 0x28, 0xb6, 0xb3, - 0xa6, 0xea, 0xe8, 0x96, 0x53, 0xad, 0xd7, 0xf7, 0x7b, 0xbf, 0x3f, 0xcf, 0x31, 0x74, 0xe2, 0x20, - 0xa4, 0x2c, 0x4d, 0x77, 0xe3, 0x90, 0xa9, 0x58, 0x24, 0x92, 0xaa, 0x8c, 0x25, 0xf2, 0x0d, 0xcf, - 0xe8, 0xc8, 0xa7, 0x7b, 0x43, 0x9e, 0xed, 0x93, 0x34, 0x13, 0x4a, 0xe0, 0x56, 0x1c, 0x84, 0xa4, - 0xdc, 0x49, 0x8a, 0x4e, 0x32, 0xf2, 0x9d, 0x95, 0x48, 0x44, 0x42, 0x37, 0xd2, 0xfc, 0x64, 0x30, - 0xce, 0x7a, 0x28, 0xe4, 0x40, 0x48, 0x1a, 0x30, 0xc9, 0xcd, 0x30, 0x3a, 0xf2, 0x03, 0xae, 0x98, - 0x4f, 0x53, 0x16, 0xc5, 0x89, 0x1e, 0x64, 0x7b, 0x37, 0x16, 0x2a, 0x39, 0xe6, 0x32, 0xcd, 0xad, - 0x48, 0x88, 0x68, 0x97, 0x53, 0x96, 0xc6, 0x94, 0x25, 0x89, 0x50, 0x56, 0x92, 0xfe, 0xd7, 0xbb, - 0x09, 0x57, 0x9e, 0xe5, 0x64, 0x8f, 0x78, 0x22, 0x06, 0x2f, 0x32, 0x16, 0xf2, 0x2e, 0xdf, 0x1b, - 0x72, 0xa9, 0x30, 0x86, 0x73, 0x7d, 0x26, 0xfb, 0x4d, 0xb4, 0x86, 0x3a, 0x17, 0xba, 0xfa, 0xec, - 0xf5, 0xe0, 0xea, 0x5c, 0xb7, 0x4c, 0x45, 0x22, 0x39, 0x7e, 0x0a, 0x8d, 0x5e, 0x5e, 0xdd, 0x51, - 0x79, 0x59, 0xa3, 0x1a, 0x9b, 0x1d, 0xb2, 0x28, 0x09, 0x52, 0x1a, 0x03, 0xbd, 0xe3, 0xb3, 0xc7, - 0xe6, 0x58, 0x64, 0x21, 0xea, 0x31, 0xc0, 0x34, 0x0d, 0x4b, 0x72, 0x8d, 0x98, 0xe8, 0x48, 0x1e, - 0x1d, 0x31, 0x7b, 0xb0, 0xd1, 0x91, 0x6d, 0x16, 0x15, 0x86, 0xba, 0x25, 0xa4, 0xf7, 0x0d, 0x41, - 0x73, 0x9e, 0xc3, 0x5a, 0x79, 0x0d, 0x17, 0x4b, 0x56, 0x64, 0x13, 0xad, 0x2d, 0x57, 0xf1, 0xb2, - 0x75, 0xe9, 0xf0, 0xe7, 0x6a, 0xed, 0xcb, 0xaf, 0xd5, 0xba, 0x9d, 0xdb, 0x98, 0x7a, 0x93, 0xf8, - 0xc9, 0x8c, 0x83, 0x25, 0xed, 0xe0, 0xfa, 0xa9, 0x0e, 0x8c, 0xb2, 0x19, 0x0b, 0x2b, 0x80, 0xb5, - 0x83, 0x6d, 0x96, 0xb1, 0x41, 0x11, 0x90, 0xf7, 0x1c, 0x2e, 0xcf, 0x54, 0xad, 0xa5, 0x07, 0x50, - 0x4f, 0x75, 0xc5, 0x66, 0xd6, 0x5e, 0x6c, 0xc6, 0xa2, 0x2d, 0x66, 0xf3, 0xef, 0x32, 0x9c, 0xd7, - 0x53, 0xf1, 0x57, 0x04, 0x30, 0x75, 0x8a, 0xef, 0x2e, 0x1e, 0x73, 0xf2, 0xcd, 0x72, 0xee, 0x55, - 0x44, 0x19, 0x0f, 0x9e, 0xff, 0xf1, 0xfb, 0x9f, 0x83, 0xa5, 0x0d, 0x7c, 0x83, 0xc6, 0x41, 0xb8, - 0x53, 0xba, 0xf1, 0xe6, 0x2b, 0x29, 0xaf, 0x8c, 0xbe, 0xcf, 0xaf, 0xeb, 0x07, 0xfc, 0x19, 0x41, - 0xa3, 0xb4, 0x61, 0x5c, 0x8d, 0xb9, 0x08, 0xd5, 0xb9, 0x5f, 0x15, 0x66, 0x15, 0xaf, 0x6b, 0xc5, - 0x6d, 0xec, 0x9d, 0xae, 0x18, 0x1f, 0x20, 0xa8, 0x9b, 0xd8, 0xf1, 0xed, 0x33, 0xd0, 0xcd, 0x6c, - 0xdd, 0xf1, 0x2b, 0x20, 0xac, 0xb6, 0xb6, 0xd6, 0xe6, 0xe2, 0xd6, 0xc9, 0xda, 0xcc, 0xe6, 0xb7, - 0x5e, 0x1e, 0x8e, 0x5d, 0x74, 0x34, 0x76, 0xd1, 0xef, 0xb1, 0x8b, 0x3e, 0x4d, 0xdc, 0xda, 0xd1, - 0xc4, 0xad, 0xfd, 0x98, 0xb8, 0xb5, 0x57, 0x0f, 0xa3, 0x58, 0xf5, 0x87, 0x01, 0x09, 0xc5, 0x80, - 0xda, 0xa7, 0xcb, 0xfc, 0xdc, 0x92, 0xbd, 0xb7, 0xf4, 0x1d, 0xfd, 0xff, 0x13, 0xa5, 0xf6, 0x53, - 0x2e, 0x83, 0xba, 0x7e, 0x7f, 0xee, 0xfc, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x19, 0x46, 0xdf, 0x94, - 0x56, 0x05, 0x00, 0x00, + // 528 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0x3f, 0x6f, 0xd3, 0x40, + 0x14, 0xcf, 0x95, 0x12, 0x89, 0x17, 0xc4, 0x70, 0x54, 0x10, 0x59, 0x95, 0x5b, 0x59, 0x08, 0x02, + 0x85, 0x3b, 0x5c, 0xa0, 0x30, 0xa0, 0x0e, 0x15, 0x02, 0xb1, 0x95, 0xc0, 0x80, 0x60, 0x40, 0x67, + 0xe7, 0x70, 0x2c, 0x1a, 0x9f, 0xeb, 0xbb, 0x44, 0x54, 0x88, 0x85, 0x4f, 0x80, 0xc4, 0x8e, 0x98, + 0xd9, 0x19, 0xd8, 0x18, 0x3b, 0x56, 0x62, 0x61, 0x02, 0x94, 0xf0, 0x41, 0x90, 0xef, 0xce, 0x8d, + 0xa3, 0x20, 0x13, 0x4f, 0x39, 0x5d, 0xde, 0xef, 0xfd, 0xfe, 0xbc, 0xe7, 0x83, 0x4e, 0x1c, 0x84, + 0x94, 0xa5, 0xe9, 0x5e, 0x1c, 0x32, 0x15, 0x8b, 0x44, 0x52, 0x95, 0xb1, 0x44, 0xbe, 0xe4, 0x19, + 0x1d, 0xf9, 0x74, 0x7f, 0xc8, 0xb3, 0x03, 0x92, 0x66, 0x42, 0x09, 0xbc, 0x1a, 0x07, 0x21, 0x29, + 0x57, 0x92, 0xa2, 0x92, 0x8c, 0x7c, 0x67, 0x25, 0x12, 0x91, 0xd0, 0x85, 0x34, 0x3f, 0x19, 0x8c, + 0x73, 0x25, 0x14, 0x72, 0x20, 0x24, 0x0d, 0x98, 0xe4, 0xa6, 0x19, 0x1d, 0xf9, 0x01, 0x57, 0xcc, + 0xa7, 0x29, 0x8b, 0xe2, 0x44, 0x37, 0xb2, 0xb5, 0x1b, 0x95, 0x4a, 0x8e, 0xb9, 0x4c, 0xf1, 0x6a, + 0x24, 0x44, 0xb4, 0xc7, 0x29, 0x4b, 0x63, 0xca, 0x92, 0x44, 0x28, 0x2b, 0x49, 0xff, 0xeb, 0x5d, + 0x85, 0x73, 0x8f, 0x72, 0xb2, 0x7b, 0x3c, 0x11, 0x83, 0x27, 0x19, 0x0b, 0x79, 0x97, 0xef, 0x0f, + 0xb9, 0x54, 0x18, 0xc3, 0x72, 0x9f, 0xc9, 0x7e, 0x1b, 0xad, 0xa3, 0xce, 0xa9, 0xae, 0x3e, 0x7b, + 0x3d, 0x38, 0x3f, 0x57, 0x2d, 0x53, 0x91, 0x48, 0x8e, 0x1f, 0x42, 0xab, 0x97, 0xdf, 0xbe, 0x50, + 0xf9, 0xb5, 0x46, 0xb5, 0x36, 0x3b, 0xa4, 0x2a, 0x09, 0x52, 0x6a, 0x03, 0xbd, 0xe3, 0xb3, 0xc7, + 0xe6, 0x58, 0x64, 0x21, 0xea, 0x3e, 0xc0, 0x34, 0x0d, 0x4b, 0x72, 0x91, 0x98, 0xe8, 0x48, 0x1e, + 0x1d, 0x31, 0x73, 0xb0, 0xd1, 0x91, 0x5d, 0x16, 0x15, 0x86, 0xba, 0x25, 0xa4, 0xf7, 0x0d, 0x41, + 0x7b, 0x9e, 0xc3, 0x5a, 0x79, 0x0e, 0xa7, 0x4b, 0x56, 0x64, 0x1b, 0xad, 0x9f, 0xa8, 0xe3, 0x65, + 0xe7, 0xcc, 0xe1, 0xcf, 0xb5, 0xc6, 0xe7, 0x5f, 0x6b, 0x4d, 0xdb, 0xb7, 0x35, 0xf5, 0x26, 0xf1, + 0x83, 0x19, 0x07, 0x4b, 0xda, 0xc1, 0xa5, 0xff, 0x3a, 0x30, 0xca, 0x66, 0x2c, 0xac, 0x00, 0xd6, + 0x0e, 0x76, 0x59, 0xc6, 0x06, 0x45, 0x40, 0xde, 0x63, 0x38, 0x3b, 0x73, 0x6b, 0x2d, 0xdd, 0x85, + 0x66, 0xaa, 0x6f, 0x6c, 0x66, 0x17, 0xaa, 0xcd, 0x58, 0xb4, 0xc5, 0x6c, 0x7e, 0x5c, 0x86, 0x93, + 0xba, 0x2b, 0xfe, 0x8a, 0x00, 0xa6, 0x4e, 0xf1, 0xcd, 0xea, 0x36, 0xff, 0xde, 0x2c, 0xe7, 0x56, + 0x4d, 0x94, 0xf1, 0xe0, 0x6d, 0xbf, 0xfb, 0xfe, 0xe7, 0xc3, 0xd2, 0x1d, 0xbc, 0x45, 0xab, 0xd6, + 0xdf, 0x7c, 0x32, 0xe5, 0xf9, 0xd1, 0x37, 0xf9, 0xee, 0xbe, 0xc5, 0x5f, 0x10, 0xb4, 0x4a, 0xe3, + 0xc6, 0xf5, 0x64, 0x14, 0x09, 0x3b, 0x5b, 0x75, 0x61, 0x56, 0xfe, 0x6d, 0x2d, 0xdf, 0xc7, 0xb4, + 0xa6, 0x7c, 0xfc, 0x09, 0x41, 0xd3, 0x0c, 0x04, 0x5f, 0x5f, 0x80, 0x7b, 0x66, 0x1f, 0x1c, 0xbf, + 0x06, 0xc2, 0x0a, 0xf5, 0xb5, 0xd0, 0x0d, 0x7c, 0x79, 0x01, 0xa1, 0x66, 0x41, 0x76, 0x9e, 0x1e, + 0x8e, 0x5d, 0x74, 0x34, 0x76, 0xd1, 0xef, 0xb1, 0x8b, 0xde, 0x4f, 0xdc, 0xc6, 0xd1, 0xc4, 0x6d, + 0xfc, 0x98, 0xb8, 0x8d, 0x67, 0xdb, 0x51, 0xac, 0xfa, 0xc3, 0x80, 0x84, 0x62, 0x40, 0xed, 0x0b, + 0x67, 0x7e, 0xae, 0xc9, 0xde, 0x2b, 0xfa, 0xba, 0x82, 0x42, 0x1d, 0xa4, 0x5c, 0x06, 0x4d, 0xfd, + 0x4c, 0xdd, 0xf8, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xb2, 0x7f, 0xfe, 0xbd, 0x7d, 0x05, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/ibc/applications/transfer/types/query.pb.gw.go b/x/ibc/applications/transfer/types/query.pb.gw.go index 0e1dfd25c..99a7f1906 100644 --- a/x/ibc/applications/transfer/types/query.pb.gw.go +++ b/x/ibc/applications/transfer/types/query.pb.gw.go @@ -310,11 +310,11 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } var ( - pattern_Query_DenomTrace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"ibc_transfer", "v1beta1", "denom_traces", "hash"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_DenomTrace_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"ibc", "applications", "transfer", "v1beta1", "denom_traces", "hash"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_DenomTraces_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"ibc_transfer", "v1beta1", "denom_traces"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_DenomTraces_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"ibc", "applications", "transfer", "v1beta1", "denom_traces"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"ibc_transfer", "v1beta1", "params"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"ibc", "applications", "transfer", "v1beta1", "params"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( diff --git a/x/ibc/core/02-client/types/query.pb.go b/x/ibc/core/02-client/types/query.pb.go index fb91ead13..3e250c9ea 100644 --- a/x/ibc/core/02-client/types/query.pb.go +++ b/x/ibc/core/02-client/types/query.pb.go @@ -514,54 +514,54 @@ func init() { func init() { proto.RegisterFile("ibc/core/client/v1/query.proto", fileDescriptor_dc42cdfd1d52d76e) } var fileDescriptor_dc42cdfd1d52d76e = []byte{ - // 747 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0x4f, 0x4f, 0x13, 0x41, - 0x14, 0xef, 0xf0, 0xc7, 0xc0, 0xb4, 0x80, 0x99, 0x90, 0x58, 0x16, 0x52, 0x6a, 0x89, 0x5a, 0x94, - 0xce, 0xd0, 0x1a, 0xc5, 0x8b, 0x07, 0x21, 0x41, 0xb9, 0x10, 0x59, 0x0f, 0x26, 0x26, 0x86, 0xec, - 0x6e, 0x87, 0xed, 0x44, 0xd8, 0x29, 0x9d, 0x69, 0x23, 0x21, 0x5c, 0xf8, 0x04, 0x26, 0x26, 0x5e, - 0xfd, 0x02, 0x86, 0x93, 0x89, 0xdf, 0xc0, 0x70, 0x24, 0x7a, 0xf1, 0x60, 0x8c, 0x01, 0x3f, 0x88, - 0xe9, 0xcc, 0x2c, 0xdd, 0x85, 0x25, 0xac, 0x46, 0x4f, 0x3b, 0xf3, 0xfe, 0xfe, 0xde, 0xef, 0xbd, - 0x79, 0x59, 0x58, 0x60, 0xae, 0x47, 0x3c, 0xde, 0xa2, 0xc4, 0xdb, 0x64, 0x34, 0x90, 0xa4, 0x53, - 0x25, 0xdb, 0x6d, 0xda, 0xda, 0xc1, 0xcd, 0x16, 0x97, 0x1c, 0x21, 0xe6, 0x7a, 0xb8, 0xab, 0xc7, - 0x5a, 0x8f, 0x3b, 0x55, 0xeb, 0xb6, 0xc7, 0xc5, 0x16, 0x17, 0xc4, 0x75, 0x04, 0xd5, 0xc6, 0xa4, - 0x53, 0x75, 0xa9, 0x74, 0xaa, 0xa4, 0xe9, 0xf8, 0x2c, 0x70, 0x24, 0xe3, 0x81, 0xf6, 0xb7, 0xa6, - 0x13, 0xe2, 0x9b, 0x48, 0xda, 0x60, 0xc2, 0xe7, 0xdc, 0xdf, 0xa4, 0x44, 0xdd, 0xdc, 0xf6, 0x06, - 0x71, 0x02, 0x93, 0xdb, 0x9a, 0x32, 0x2a, 0xa7, 0xc9, 0x88, 0x13, 0x04, 0x5c, 0xaa, 0xc0, 0xc2, - 0x68, 0xc7, 0x7d, 0xee, 0x73, 0x75, 0x24, 0xdd, 0x93, 0x96, 0x96, 0xee, 0xc3, 0x6b, 0x6b, 0x5d, - 0x44, 0x4b, 0x2a, 0xc7, 0x33, 0xe9, 0x48, 0x6a, 0xd3, 0xed, 0x36, 0x15, 0x12, 0x4d, 0xc2, 0x61, - 0x9d, 0x79, 0x9d, 0xd5, 0xf3, 0xa0, 0x08, 0xca, 0xc3, 0xf6, 0x90, 0x16, 0xac, 0xd4, 0x4b, 0x07, - 0x00, 0xe6, 0xcf, 0x3b, 0x8a, 0x26, 0x0f, 0x04, 0x45, 0x0b, 0x30, 0x67, 0x3c, 0x45, 0x57, 0xae, - 0x9c, 0xb3, 0xb5, 0x71, 0xac, 0xf1, 0xe1, 0x10, 0x3a, 0x7e, 0x14, 0xec, 0xd8, 0x59, 0xaf, 0x17, - 0x00, 0x8d, 0xc3, 0xc1, 0x66, 0x8b, 0xf3, 0x8d, 0x7c, 0x5f, 0x11, 0x94, 0x73, 0xb6, 0xbe, 0xa0, - 0x25, 0x98, 0x53, 0x87, 0xf5, 0x06, 0x65, 0x7e, 0x43, 0xe6, 0xfb, 0x55, 0x38, 0x0b, 0x9f, 0xa7, - 0x1a, 0x3f, 0x51, 0x16, 0x8b, 0x03, 0x87, 0x3f, 0xa6, 0x33, 0x76, 0x56, 0x79, 0x69, 0x51, 0xc9, - 0x3d, 0x8f, 0x57, 0x84, 0x95, 0x2e, 0x43, 0xd8, 0x6b, 0x84, 0x41, 0x7b, 0x13, 0xeb, 0xae, 0xe1, - 0x6e, 0xd7, 0xb0, 0x6e, 0xb1, 0xe9, 0x1a, 0x7e, 0xea, 0xf8, 0x21, 0x4b, 0x76, 0xc4, 0xb3, 0xf4, - 0x11, 0xc0, 0x89, 0x84, 0x24, 0x86, 0x95, 0x55, 0x38, 0x12, 0x65, 0x45, 0xe4, 0x41, 0xb1, 0xbf, - 0x9c, 0xad, 0xcd, 0x26, 0xd5, 0xb1, 0x52, 0xa7, 0x81, 0x64, 0x1b, 0x8c, 0xd6, 0xa3, 0xfc, 0xe6, - 0x22, 0x5c, 0x09, 0xf4, 0x38, 0x86, 0xba, 0x4f, 0xa1, 0xbe, 0x75, 0x29, 0x6a, 0x0d, 0x26, 0x06, - 0xfb, 0x03, 0x80, 0x96, 0x86, 0xdd, 0x55, 0x05, 0xa2, 0x2d, 0x52, 0xcf, 0x01, 0xba, 0x01, 0x47, - 0x3b, 0xb4, 0x25, 0x18, 0x0f, 0xd6, 0x83, 0xf6, 0x96, 0x4b, 0x5b, 0x0a, 0xc8, 0x80, 0x3d, 0x62, - 0xa4, 0xab, 0x4a, 0x18, 0x35, 0x8b, 0x34, 0xb1, 0x67, 0xa6, 0x9b, 0x84, 0x66, 0xe0, 0xc8, 0x66, - 0xb7, 0x36, 0x19, 0x5a, 0x0d, 0x14, 0x41, 0x79, 0xc8, 0xce, 0x69, 0xa1, 0xe9, 0xe4, 0x27, 0x00, - 0x27, 0x13, 0xe1, 0x1a, 0x9e, 0x1f, 0xc2, 0x31, 0x2f, 0xd4, 0xa4, 0x18, 0xc0, 0x51, 0x2f, 0x16, - 0xe6, 0x7f, 0xce, 0xe0, 0x7e, 0x32, 0x72, 0x91, 0x8a, 0xe9, 0xe5, 0x84, 0x76, 0xff, 0xcd, 0x90, - 0x7e, 0x06, 0x70, 0x2a, 0x19, 0x84, 0xe1, 0xef, 0x25, 0xbc, 0x7a, 0x86, 0xbf, 0x70, 0x54, 0xe7, - 0x92, 0xca, 0x8d, 0x87, 0x79, 0xce, 0x64, 0x23, 0x46, 0xc0, 0x58, 0x9c, 0xde, 0x7f, 0x37, 0xb6, - 0xb5, 0x2f, 0x83, 0x70, 0x50, 0x15, 0x82, 0xde, 0x03, 0x98, 0x8d, 0xbc, 0x13, 0x74, 0x27, 0x09, - 0xe7, 0x05, 0x6b, 0xce, 0x9a, 0x4b, 0x67, 0xac, 0x01, 0x94, 0xee, 0xed, 0x7f, 0xfd, 0xf5, 0xb6, - 0x8f, 0xa0, 0x0a, 0x51, 0x8b, 0x3a, 0xdc, 0xd1, 0x7a, 0x9b, 0xc7, 0x9e, 0x37, 0xd9, 0x3d, 0xed, - 0xe5, 0x1e, 0x7a, 0x07, 0x60, 0x2e, 0xba, 0x14, 0x50, 0xaa, 0xac, 0xe1, 0x60, 0x58, 0x95, 0x94, - 0xd6, 0x06, 0xe4, 0xac, 0x02, 0x39, 0x83, 0xae, 0x5f, 0x0a, 0x12, 0x7d, 0x07, 0x70, 0x34, 0xde, - 0x41, 0x84, 0x2f, 0x4e, 0x96, 0xb4, 0x1f, 0x2c, 0x92, 0xda, 0xde, 0xc0, 0x63, 0x0a, 0x9e, 0x87, - 0x9c, 0x44, 0x78, 0x67, 0x46, 0x2f, 0x4a, 0x23, 0x31, 0xdb, 0x82, 0xec, 0xc6, 0x77, 0xce, 0x1e, - 0xd1, 0xaf, 0xb2, 0x27, 0xd7, 0xf7, 0x3d, 0x74, 0x00, 0xe0, 0xd8, 0x99, 0x39, 0x47, 0x69, 0xf1, - 0x9e, 0xb2, 0x3f, 0x9f, 0xde, 0xc1, 0x54, 0xf8, 0x40, 0x55, 0x58, 0x43, 0xf3, 0x7f, 0x5a, 0xe1, - 0xe2, 0xda, 0xe1, 0x71, 0x01, 0x1c, 0x1d, 0x17, 0xc0, 0xcf, 0xe3, 0x02, 0x78, 0x73, 0x52, 0xc8, - 0x1c, 0x9d, 0x14, 0x32, 0xdf, 0x4e, 0x0a, 0x99, 0x17, 0x0b, 0x3e, 0x93, 0x8d, 0xb6, 0x8b, 0x3d, - 0xbe, 0x45, 0xcc, 0x0f, 0x85, 0xfe, 0x54, 0x44, 0xfd, 0x15, 0x79, 0x4d, 0x4e, 0x7f, 0x1c, 0xe6, - 0x6b, 0x15, 0x93, 0x51, 0xee, 0x34, 0xa9, 0x70, 0xaf, 0xa8, 0x75, 0x77, 0xf7, 0x77, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x09, 0x8e, 0x83, 0x3d, 0xbb, 0x08, 0x00, 0x00, + // 746 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0x4d, 0x6b, 0x13, 0x4f, + 0x18, 0xcf, 0xf4, 0xe5, 0x4f, 0x3b, 0x49, 0xdb, 0x3f, 0x43, 0xc1, 0x74, 0x5b, 0xb6, 0x21, 0x62, + 0x8d, 0xda, 0xce, 0x34, 0xf1, 0xa5, 0x20, 0xf4, 0x60, 0x0b, 0xd5, 0x5e, 0x8a, 0x5d, 0x0f, 0x82, + 0x20, 0x65, 0x77, 0x33, 0xd9, 0x2c, 0xb6, 0x3b, 0x69, 0x66, 0x12, 0x2c, 0xa5, 0x97, 0x7e, 0x02, + 0xc1, 0xa3, 0x57, 0x8f, 0xe2, 0x45, 0xc1, 0x6f, 0x20, 0x3d, 0x16, 0xbc, 0x78, 0x12, 0x6d, 0xc5, + 0xcf, 0x21, 0x3b, 0x33, 0xdb, 0xec, 0x36, 0x5b, 0x5c, 0x8a, 0x9e, 0xb2, 0xfb, 0xbc, 0xfe, 0x9e, + 0xdf, 0xef, 0xd9, 0x87, 0x40, 0xd3, 0x77, 0x5c, 0xe2, 0xb2, 0x36, 0x25, 0xee, 0xb6, 0x4f, 0x03, + 0x41, 0xba, 0x55, 0xb2, 0xdb, 0xa1, 0xed, 0x3d, 0xdc, 0x6a, 0x33, 0xc1, 0x10, 0xf2, 0x1d, 0x17, + 0x87, 0x7e, 0xac, 0xfc, 0xb8, 0x5b, 0x35, 0x6e, 0xba, 0x8c, 0xef, 0x30, 0x4e, 0x1c, 0x9b, 0x53, + 0x15, 0x4c, 0xba, 0x55, 0x87, 0x0a, 0xbb, 0x4a, 0x5a, 0xb6, 0xe7, 0x07, 0xb6, 0xf0, 0x59, 0xa0, + 0xf2, 0x8d, 0xd9, 0x94, 0xfa, 0xba, 0x92, 0x0a, 0x98, 0xf2, 0x18, 0xf3, 0xb6, 0x29, 0x91, 0x6f, + 0x4e, 0xa7, 0x41, 0xec, 0x40, 0xf7, 0x36, 0x66, 0xb4, 0xcb, 0x6e, 0xf9, 0xc4, 0x0e, 0x02, 0x26, + 0x64, 0x61, 0xae, 0xbd, 0x93, 0x1e, 0xf3, 0x98, 0x7c, 0x24, 0xe1, 0x93, 0xb2, 0x96, 0xef, 0xc1, + 0x2b, 0x9b, 0x21, 0xa2, 0x55, 0xd9, 0xe3, 0x89, 0xb0, 0x05, 0xb5, 0xe8, 0x6e, 0x87, 0x72, 0x81, + 0xa6, 0xe1, 0xa8, 0xea, 0xbc, 0xe5, 0xd7, 0x8b, 0xa0, 0x04, 0x2a, 0xa3, 0xd6, 0x88, 0x32, 0xac, + 0xd7, 0xcb, 0xef, 0x01, 0x2c, 0xf6, 0x27, 0xf2, 0x16, 0x0b, 0x38, 0x45, 0x4b, 0xb0, 0xa0, 0x33, + 0x79, 0x68, 0x97, 0xc9, 0xf9, 0xda, 0x24, 0x56, 0xf8, 0x70, 0x04, 0x1d, 0x3f, 0x08, 0xf6, 0xac, + 0xbc, 0xdb, 0x2b, 0x80, 0x26, 0xe1, 0x70, 0xab, 0xcd, 0x58, 0xa3, 0x38, 0x50, 0x02, 0x95, 0x82, + 0xa5, 0x5e, 0xd0, 0x2a, 0x2c, 0xc8, 0x87, 0xad, 0x26, 0xf5, 0xbd, 0xa6, 0x28, 0x0e, 0xca, 0x72, + 0x06, 0xee, 0xa7, 0x1a, 0x3f, 0x92, 0x11, 0x2b, 0x43, 0x47, 0xdf, 0x66, 0x73, 0x56, 0x5e, 0x66, + 0x29, 0x53, 0xd9, 0xe9, 0xc7, 0xcb, 0xa3, 0x49, 0xd7, 0x20, 0xec, 0x09, 0xa1, 0xd1, 0xce, 0x61, + 0xa5, 0x1a, 0x0e, 0x55, 0xc3, 0x4a, 0x62, 0xad, 0x1a, 0x7e, 0x6c, 0x7b, 0x11, 0x4b, 0x56, 0x2c, + 0xb3, 0xfc, 0x11, 0xc0, 0xa9, 0x94, 0x26, 0x9a, 0x95, 0x0d, 0x38, 0x16, 0x67, 0x85, 0x17, 0x41, + 0x69, 0xb0, 0x92, 0xaf, 0xdd, 0x48, 0x9b, 0x63, 0xbd, 0x4e, 0x03, 0xe1, 0x37, 0x7c, 0x5a, 0x8f, + 0xf3, 0x5b, 0x88, 0x71, 0xc5, 0xd1, 0xc3, 0x04, 0xea, 0x01, 0x89, 0xfa, 0xfa, 0x1f, 0x51, 0x2b, + 0x30, 0x09, 0xd8, 0xef, 0x00, 0x34, 0x14, 0xec, 0xd0, 0x15, 0xf0, 0x0e, 0xcf, 0xbc, 0x07, 0xe8, + 0x1a, 0x1c, 0xef, 0xd2, 0x36, 0xf7, 0x59, 0xb0, 0x15, 0x74, 0x76, 0x1c, 0xda, 0x96, 0x40, 0x86, + 0xac, 0x31, 0x6d, 0xdd, 0x90, 0xc6, 0x78, 0x58, 0x4c, 0xc4, 0x5e, 0x98, 0x12, 0x09, 0x5d, 0x85, + 0x63, 0xdb, 0xe1, 0x6c, 0x22, 0x8a, 0x1a, 0x2a, 0x81, 0xca, 0x88, 0x55, 0x50, 0x46, 0xad, 0xe4, + 0x27, 0x00, 0xa7, 0x53, 0xe1, 0x6a, 0x9e, 0x97, 0xe1, 0x84, 0x1b, 0x79, 0x32, 0x2c, 0xe0, 0xb8, + 0x9b, 0x28, 0xf3, 0x2f, 0x77, 0xf0, 0x30, 0x1d, 0x39, 0xcf, 0xc4, 0xf4, 0x5a, 0x8a, 0xdc, 0x97, + 0x59, 0xd2, 0xcf, 0x00, 0xce, 0xa4, 0x83, 0xd0, 0xfc, 0x3d, 0x87, 0xff, 0x9f, 0xe3, 0x2f, 0x5a, + 0xd5, 0xf9, 0xb4, 0x71, 0x93, 0x65, 0x9e, 0xfa, 0xa2, 0x99, 0x20, 0x60, 0x22, 0x49, 0xef, 0xdf, + 0x5b, 0xdb, 0xda, 0xaf, 0x61, 0x38, 0x2c, 0x07, 0x41, 0x6f, 0x01, 0xcc, 0xc7, 0xbe, 0x13, 0x74, + 0x2b, 0x0d, 0xe7, 0x05, 0x67, 0xce, 0x98, 0xcf, 0x16, 0xac, 0x00, 0x94, 0xef, 0x1f, 0x7e, 0xf9, + 0xf9, 0x7a, 0xe0, 0x0e, 0xaa, 0x91, 0xfe, 0x43, 0xad, 0x4e, 0x7a, 0xe2, 0x1b, 0x27, 0xfb, 0x67, + 0x82, 0x1e, 0xa0, 0x37, 0x00, 0x16, 0xe2, 0x97, 0x01, 0x65, 0x6a, 0x1d, 0x6d, 0x87, 0xb1, 0x90, + 0x31, 0x5a, 0x23, 0xc5, 0x12, 0x69, 0x05, 0xcd, 0x65, 0x43, 0x8a, 0x7e, 0x00, 0x38, 0x9e, 0xd4, + 0x12, 0xe1, 0x8b, 0x3b, 0xa6, 0x5d, 0x0a, 0x83, 0x64, 0x8e, 0xd7, 0x18, 0x03, 0x89, 0xb1, 0x89, + 0x1a, 0x17, 0x63, 0x3c, 0xb7, 0x89, 0x71, 0x42, 0x89, 0x3e, 0x1e, 0x64, 0x3f, 0x79, 0x82, 0x0e, + 0x88, 0xfa, 0x48, 0x7b, 0x76, 0xf5, 0x7e, 0x80, 0x3e, 0x00, 0x38, 0x71, 0x6e, 0xed, 0x51, 0x56, + 0xd0, 0x67, 0x3a, 0x2c, 0x66, 0x4f, 0xd0, 0x63, 0x2e, 0xcb, 0x31, 0x97, 0xd0, 0xdd, 0x4b, 0x8d, + 0xb9, 0xb2, 0x79, 0x74, 0x62, 0x82, 0xe3, 0x13, 0x13, 0x7c, 0x3f, 0x31, 0xc1, 0xab, 0x53, 0x33, + 0x77, 0x7c, 0x6a, 0xe6, 0xbe, 0x9e, 0x9a, 0xb9, 0x67, 0x4b, 0x9e, 0x2f, 0x9a, 0x1d, 0x07, 0xbb, + 0x6c, 0x87, 0xe8, 0x3f, 0x19, 0xea, 0x67, 0x81, 0xd7, 0x5f, 0x90, 0x97, 0xbd, 0x76, 0x8b, 0xb5, + 0x05, 0xdd, 0x51, 0xec, 0xb5, 0x28, 0x77, 0xfe, 0x93, 0x27, 0xf0, 0xf6, 0xef, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x71, 0x1f, 0x83, 0xc2, 0xcf, 0x08, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/ibc/core/02-client/types/query.pb.gw.go b/x/ibc/core/02-client/types/query.pb.gw.go index 935c305d6..4d1cce836 100644 --- a/x/ibc/core/02-client/types/query.pb.gw.go +++ b/x/ibc/core/02-client/types/query.pb.gw.go @@ -520,13 +520,13 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } var ( - pattern_Query_ClientState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"ibc", "client", "v1beta1", "client_states", "client_id"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_ClientState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"ibc", "core", "client", "v1beta1", "client_states", "client_id"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_ClientStates_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"ibc", "client", "v1beta1", "client_states"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_ClientStates_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"ibc", "core", "client", "v1beta1", "client_states"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_ConsensusState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6, 2, 7, 1, 0, 4, 1, 5, 8}, []string{"ibc", "client", "v1beta1", "consensus_states", "client_id", "version", "version_number", "height", "version_height"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_ConsensusState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6, 1, 0, 4, 1, 5, 7, 2, 8, 1, 0, 4, 1, 5, 9}, []string{"ibc", "core", "client", "v1beta1", "consensus_states", "client_id", "version", "version_number", "height", "version_height"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_ConsensusStates_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"ibc", "client", "v1beta1", "consensus_states", "client_id"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_ConsensusStates_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"ibc", "core", "client", "v1beta1", "consensus_states", "client_id"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( diff --git a/x/ibc/core/03-connection/types/query.pb.go b/x/ibc/core/03-connection/types/query.pb.go index 3007ac05b..5c3a2bcb2 100644 --- a/x/ibc/core/03-connection/types/query.pb.go +++ b/x/ibc/core/03-connection/types/query.pb.go @@ -635,63 +635,63 @@ func init() { } var fileDescriptor_cd8d529f8c7cd06b = []byte{ - // 891 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0xc1, 0x4f, 0x2b, 0x45, - 0x18, 0xef, 0x14, 0xde, 0xcb, 0x63, 0xca, 0x7b, 0xea, 0xa4, 0x0f, 0xea, 0xaa, 0x05, 0x17, 0x2b, - 0xa0, 0x32, 0x43, 0x21, 0x10, 0x04, 0x6a, 0xb4, 0x04, 0x85, 0x0b, 0xc1, 0x35, 0x5e, 0xbc, 0x90, - 0xdd, 0xed, 0xb0, 0xdd, 0x48, 0x77, 0x4a, 0x77, 0xdb, 0xd8, 0x60, 0x2f, 0x9e, 0x3d, 0x98, 0x18, - 0x8f, 0x5e, 0x3d, 0x78, 0xf5, 0xe8, 0xcd, 0x13, 0x47, 0x12, 0x2f, 0x9c, 0x88, 0x29, 0x5e, 0xbd, - 0xf8, 0x17, 0x98, 0x9d, 0x99, 0xb2, 0xb3, 0x74, 0x0b, 0xa5, 0x91, 0x53, 0x77, 0xbf, 0xf9, 0xbe, - 0x99, 0xdf, 0xef, 0xf7, 0x7d, 0xf3, 0xdb, 0x42, 0xdd, 0xb5, 0x6c, 0x62, 0xb3, 0x06, 0x25, 0x36, - 0xf3, 0x3c, 0x6a, 0x07, 0x2e, 0xf3, 0x48, 0xab, 0x48, 0x4e, 0x9b, 0xb4, 0xd1, 0xc6, 0xf5, 0x06, - 0x0b, 0x18, 0x9a, 0x72, 0x2d, 0x1b, 0x87, 0x39, 0x38, 0xca, 0xc1, 0xad, 0xa2, 0x96, 0x75, 0x98, - 0xc3, 0x78, 0x0a, 0x09, 0x9f, 0x44, 0xb6, 0xf6, 0x9e, 0xcd, 0xfc, 0x1a, 0xf3, 0x89, 0x65, 0xfa, - 0x54, 0x6c, 0x43, 0x5a, 0x45, 0x8b, 0x06, 0x66, 0x91, 0xd4, 0x4d, 0xc7, 0xf5, 0x4c, 0x5e, 0x2e, - 0x72, 0x67, 0xa2, 0xd3, 0x4f, 0x5c, 0xea, 0x05, 0xe1, 0xc9, 0xe2, 0x49, 0x26, 0xcc, 0x0f, 0x80, - 0xa7, 0x00, 0x11, 0x89, 0x6f, 0x3a, 0x8c, 0x39, 0x27, 0x94, 0x98, 0x75, 0x97, 0x98, 0x9e, 0xc7, - 0x02, 0x7e, 0x8c, 0x2f, 0x57, 0x5f, 0x97, 0xab, 0xfc, 0xcd, 0x6a, 0x1e, 0x13, 0xd3, 0x93, 0xe4, - 0xf4, 0x12, 0x9c, 0xfa, 0x3c, 0x04, 0xb9, 0x73, 0xb3, 0xa3, 0x41, 0x4f, 0x9b, 0xd4, 0x0f, 0xd0, - 0x1c, 0x7c, 0x1e, 0x1d, 0x73, 0xe4, 0x56, 0x72, 0x60, 0x16, 0x2c, 0x4c, 0x18, 0x93, 0x51, 0x70, - 0xbf, 0xa2, 0xff, 0x0e, 0xe0, 0x74, 0x5f, 0xbd, 0x5f, 0x67, 0x9e, 0x4f, 0xd1, 0x2e, 0x84, 0x51, - 0x2e, 0xaf, 0xce, 0xac, 0x14, 0x70, 0xb2, 0x98, 0x38, 0xaa, 0xdf, 0xf5, 0x2a, 0x86, 0x52, 0x88, - 0xb2, 0xf0, 0x49, 0xbd, 0xc1, 0xd8, 0x71, 0x2e, 0x3d, 0x0b, 0x16, 0x26, 0x0d, 0xf1, 0x82, 0x76, - 0xe0, 0x24, 0x7f, 0x38, 0xaa, 0x52, 0xd7, 0xa9, 0x06, 0xb9, 0x31, 0xbe, 0xbd, 0xa6, 0x6c, 0x2f, - 0x74, 0x6c, 0x15, 0xf1, 0x1e, 0xcf, 0x28, 0x8f, 0x9f, 0x5f, 0xcd, 0xa4, 0x8c, 0x0c, 0xaf, 0x12, - 0x21, 0xdd, 0xec, 0x03, 0xef, 0xf7, 0xd8, 0x7f, 0x0a, 0x61, 0xd4, 0x2e, 0x09, 0xfe, 0x5d, 0x2c, - 0x7a, 0x8b, 0xc3, 0xde, 0x62, 0x31, 0x22, 0xb2, 0xb7, 0xf8, 0xd0, 0x74, 0xa8, 0xac, 0x35, 0x94, - 0x4a, 0xfd, 0x1f, 0x00, 0x73, 0xfd, 0x67, 0x48, 0x85, 0x0e, 0x60, 0x26, 0x22, 0xea, 0xe7, 0xc0, - 0xec, 0xd8, 0x42, 0x66, 0xe5, 0x83, 0x41, 0x12, 0xed, 0x57, 0xa8, 0x17, 0xb8, 0xc7, 0x2e, 0xad, - 0x28, 0x62, 0xab, 0x1b, 0xa0, 0xcf, 0x62, 0xa0, 0xd3, 0x1c, 0xf4, 0xfc, 0xbd, 0xa0, 0x05, 0x18, - 0x15, 0x35, 0xda, 0x80, 0x4f, 0x1f, 0xa8, 0xab, 0xcc, 0xd7, 0xb7, 0xe1, 0x5b, 0x82, 0x2e, 0x4f, - 0x4b, 0x10, 0xf6, 0x0d, 0x38, 0x21, 0xb6, 0x88, 0x46, 0xea, 0x99, 0x08, 0xec, 0x57, 0xf4, 0x5f, - 0x00, 0xcc, 0x0f, 0x2a, 0x97, 0x9a, 0x2d, 0xc2, 0x57, 0x95, 0xb1, 0xac, 0x9b, 0x41, 0x55, 0x08, - 0x37, 0x61, 0xbc, 0x12, 0xc5, 0x0f, 0xc3, 0xf0, 0x63, 0x4e, 0x8e, 0x05, 0xdf, 0xbe, 0xd5, 0x55, - 0x81, 0xf8, 0x8b, 0xc0, 0x0c, 0x7a, 0x73, 0x80, 0x4a, 0x89, 0x37, 0xa8, 0x9c, 0xfb, 0xf7, 0x6a, - 0x26, 0xdb, 0x36, 0x6b, 0x27, 0x9b, 0x7a, 0x6c, 0x59, 0xbf, 0x75, 0xb7, 0xba, 0x00, 0xea, 0x77, - 0x1d, 0x22, 0x05, 0x31, 0xe1, 0xb4, 0x7b, 0x33, 0x19, 0x47, 0x52, 0x5b, 0x3f, 0x4c, 0x91, 0x63, - 0xbb, 0x98, 0x44, 0x4d, 0x19, 0x26, 0x65, 0xcf, 0x97, 0x6e, 0x52, 0xf8, 0x31, 0x85, 0xfc, 0x0d, - 0xc0, 0x77, 0x6e, 0x93, 0x0c, 0x69, 0x79, 0x7e, 0xd3, 0xff, 0x1f, 0xc5, 0x44, 0x05, 0xf8, 0xa2, - 0x45, 0x1b, 0x7e, 0xb8, 0xe8, 0x35, 0x6b, 0x16, 0x6d, 0x70, 0x2e, 0xe3, 0xc6, 0x73, 0x19, 0x3d, - 0xe0, 0x41, 0x35, 0x4d, 0x61, 0x15, 0xa5, 0x49, 0xd4, 0x57, 0x00, 0x16, 0xee, 0x41, 0x2d, 0xbb, - 0x53, 0x82, 0xe1, 0x58, 0x8a, 0x95, 0x58, 0x57, 0xb2, 0x58, 0x98, 0x32, 0xee, 0x99, 0x32, 0xfe, - 0xc4, 0x6b, 0x1b, 0x2f, 0xec, 0xd8, 0x36, 0xf1, 0xdb, 0x92, 0x8e, 0xdf, 0x96, 0xa8, 0x2d, 0x63, - 0x77, 0xb5, 0x65, 0x7c, 0x84, 0xb6, 0xac, 0x7c, 0xff, 0x0c, 0x3e, 0xe1, 0x04, 0xd1, 0xaf, 0x00, - 0xc2, 0x88, 0x25, 0xc2, 0x83, 0xdc, 0x29, 0xf9, 0x2b, 0xa2, 0x91, 0xa1, 0xf3, 0x85, 0x60, 0xfa, - 0xd6, 0x77, 0x7f, 0xfe, 0xfd, 0x63, 0x7a, 0x0d, 0xad, 0x12, 0xf1, 0xed, 0x53, 0x3e, 0x7b, 0xe2, - 0x2b, 0xaa, 0x18, 0x1e, 0x39, 0x8b, 0xf5, 0xbc, 0x83, 0x7e, 0x06, 0x30, 0xa3, 0x98, 0x06, 0x1a, - 0xf6, 0xf4, 0x9e, 0x3b, 0x69, 0xcb, 0xc3, 0x17, 0x48, 0xbc, 0xef, 0x73, 0xbc, 0x05, 0x34, 0x37, - 0x04, 0x5e, 0xf4, 0x07, 0x80, 0xaf, 0xf5, 0x59, 0x1b, 0x5a, 0xbb, 0xfb, 0xd0, 0x01, 0x4e, 0xaa, - 0xad, 0x3f, 0xb4, 0x4c, 0x22, 0xfe, 0x88, 0x23, 0xde, 0x40, 0xeb, 0x03, 0x11, 0x8b, 0x89, 0x8b, - 0x0b, 0xdd, 0x9b, 0xc2, 0x0e, 0xba, 0x04, 0xf0, 0x65, 0xa2, 0x25, 0xa1, 0x0f, 0x87, 0x54, 0xaf, - 0xdf, 0x2b, 0xb5, 0xcd, 0x51, 0x4a, 0x25, 0xa1, 0x3d, 0x4e, 0xa8, 0x8c, 0x3e, 0x1e, 0x61, 0x64, - 0x88, 0x6a, 0x98, 0xe8, 0xa7, 0x34, 0xcc, 0x0d, 0xba, 0xd2, 0x68, 0x7b, 0x58, 0x88, 0x49, 0xfe, - 0xa5, 0x95, 0x46, 0xac, 0x96, 0x1c, 0xbf, 0xe5, 0x1c, 0x5b, 0x28, 0x18, 0x89, 0x63, 0xdc, 0x81, - 0x88, 0x34, 0x33, 0x72, 0x16, 0xb7, 0xc4, 0x0e, 0x11, 0x96, 0x11, 0xc5, 0xc5, 0x7b, 0xa7, 0xfc, - 0xe5, 0x79, 0x37, 0x0f, 0x2e, 0xba, 0x79, 0xf0, 0x57, 0x37, 0x0f, 0x7e, 0xb8, 0xce, 0xa7, 0x2e, - 0xae, 0xf3, 0xa9, 0xcb, 0xeb, 0x7c, 0xea, 0xab, 0x2d, 0xc7, 0x0d, 0xaa, 0x4d, 0x0b, 0xdb, 0xac, - 0x46, 0xe4, 0x3f, 0x5f, 0xf1, 0xb3, 0xe4, 0x57, 0xbe, 0x26, 0xdf, 0x90, 0x9b, 0x3f, 0xb0, 0xcb, - 0xab, 0x4b, 0x0a, 0xea, 0xa0, 0x5d, 0xa7, 0xbe, 0xf5, 0x94, 0x7b, 0xdf, 0xea, 0x7f, 0x01, 0x00, - 0x00, 0xff, 0xff, 0x3b, 0x66, 0x6e, 0x99, 0x86, 0x0b, 0x00, 0x00, + // 887 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0x41, 0x4f, 0x33, 0x45, + 0x18, 0xee, 0x14, 0xbe, 0x2f, 0x1f, 0x53, 0x40, 0x9d, 0x14, 0xa8, 0xab, 0x16, 0x5c, 0x45, 0x0a, + 0x91, 0x19, 0x0a, 0xd1, 0x20, 0xd0, 0x44, 0x21, 0x88, 0x1c, 0x24, 0xb8, 0xc6, 0x8b, 0x17, 0xb2, + 0xbb, 0x1d, 0xb6, 0x1b, 0xe9, 0x4e, 0xe9, 0x6e, 0x1b, 0x1b, 0xd2, 0x83, 0xfe, 0x02, 0x13, 0x8f, + 0xde, 0x3c, 0x70, 0xf5, 0xe0, 0xd1, 0x1f, 0x20, 0x47, 0x12, 0x2f, 0x5e, 0x24, 0xa6, 0x78, 0xf5, + 0xe2, 0x2f, 0x30, 0x3b, 0x33, 0x65, 0x67, 0xe9, 0xb6, 0x94, 0xe6, 0xe3, 0xd4, 0xdd, 0x77, 0xde, + 0x77, 0xe6, 0x79, 0x9e, 0xf7, 0x9d, 0x67, 0x0b, 0x75, 0xd7, 0xb2, 0x89, 0xcd, 0xea, 0x94, 0xd8, + 0xcc, 0xf3, 0xa8, 0x1d, 0xb8, 0xcc, 0x23, 0xcd, 0x22, 0x39, 0x6f, 0xd0, 0x7a, 0x0b, 0xd7, 0xea, + 0x2c, 0x60, 0x68, 0xd6, 0xb5, 0x6c, 0x1c, 0xe6, 0xe0, 0x28, 0x07, 0x37, 0x8b, 0x5a, 0xd6, 0x61, + 0x0e, 0xe3, 0x29, 0x24, 0x7c, 0x12, 0xd9, 0xda, 0x8a, 0xcd, 0xfc, 0x2a, 0xf3, 0x89, 0x65, 0xfa, + 0x54, 0x6c, 0x43, 0x9a, 0x45, 0x8b, 0x06, 0x66, 0x91, 0xd4, 0x4c, 0xc7, 0xf5, 0x4c, 0x5e, 0x2e, + 0x72, 0xe7, 0xa3, 0xd3, 0xcf, 0x5c, 0xea, 0x05, 0xe1, 0xc9, 0xe2, 0x49, 0x26, 0x2c, 0xf5, 0x81, + 0xa7, 0x00, 0x11, 0x89, 0x6f, 0x3a, 0x8c, 0x39, 0x67, 0x94, 0x98, 0x35, 0x97, 0x98, 0x9e, 0xc7, + 0x02, 0x7e, 0x8c, 0x2f, 0x57, 0x5f, 0x97, 0xab, 0xfc, 0xcd, 0x6a, 0x9c, 0x12, 0xd3, 0x93, 0xe4, + 0xf4, 0x12, 0x9c, 0xfd, 0x22, 0x04, 0xb9, 0x77, 0xb7, 0xa3, 0x41, 0xcf, 0x1b, 0xd4, 0x0f, 0xd0, + 0x3b, 0x70, 0x2a, 0x3a, 0xe6, 0xc4, 0x2d, 0xe7, 0xc0, 0x02, 0x28, 0x4c, 0x18, 0x93, 0x51, 0xf0, + 0xb0, 0xac, 0xff, 0x06, 0xe0, 0x5c, 0x4f, 0xbd, 0x5f, 0x63, 0x9e, 0x4f, 0xd1, 0x3e, 0x84, 0x51, + 0x2e, 0xaf, 0xce, 0xac, 0x2f, 0xe2, 0x64, 0x31, 0x71, 0x54, 0xbf, 0xef, 0x95, 0x0d, 0xa5, 0x10, + 0x65, 0xe1, 0xb3, 0x5a, 0x9d, 0xb1, 0xd3, 0x5c, 0x7a, 0x01, 0x14, 0x26, 0x0d, 0xf1, 0x82, 0xf6, + 0xe0, 0x24, 0x7f, 0x38, 0xa9, 0x50, 0xd7, 0xa9, 0x04, 0xb9, 0x31, 0xbe, 0xbd, 0xa6, 0x6c, 0x2f, + 0x74, 0x6c, 0x16, 0xf1, 0x67, 0x3c, 0x63, 0x77, 0xfc, 0xea, 0x66, 0x3e, 0x65, 0x64, 0x78, 0x95, + 0x08, 0xe9, 0x66, 0x0f, 0x78, 0xbf, 0xcb, 0xfe, 0x53, 0x08, 0xa3, 0x76, 0x49, 0xf0, 0xef, 0x61, + 0xd1, 0x5b, 0x1c, 0xf6, 0x16, 0x8b, 0x11, 0x91, 0xbd, 0xc5, 0xc7, 0xa6, 0x43, 0x65, 0xad, 0xa1, + 0x54, 0xea, 0xff, 0x02, 0x98, 0xeb, 0x3d, 0x43, 0x2a, 0x74, 0x04, 0x33, 0x11, 0x51, 0x3f, 0x07, + 0x16, 0xc6, 0x0a, 0x99, 0xf5, 0xf7, 0xfb, 0x49, 0x74, 0x58, 0xa6, 0x5e, 0xe0, 0x9e, 0xba, 0xb4, + 0xac, 0x88, 0xad, 0x6e, 0x80, 0x0e, 0x62, 0xa0, 0xd3, 0x1c, 0xf4, 0xd2, 0x83, 0xa0, 0x05, 0x18, + 0x15, 0x35, 0xda, 0x84, 0xcf, 0x1f, 0xa9, 0xab, 0xcc, 0xd7, 0x77, 0xe0, 0x5b, 0x82, 0x2e, 0x4f, + 0x4b, 0x10, 0xf6, 0x0d, 0x38, 0x21, 0xb6, 0x88, 0x46, 0xea, 0x85, 0x08, 0x1c, 0x96, 0xf5, 0x4b, + 0x00, 0xf3, 0xfd, 0xca, 0xa5, 0x66, 0xcb, 0xf0, 0x55, 0x65, 0x2c, 0x6b, 0x66, 0x50, 0x11, 0xc2, + 0x4d, 0x18, 0xaf, 0x44, 0xf1, 0xe3, 0x30, 0xfc, 0x94, 0x93, 0x63, 0xc1, 0xb7, 0xef, 0x75, 0x55, + 0x20, 0xfe, 0x32, 0x30, 0x83, 0xee, 0x1c, 0xa0, 0x52, 0xe2, 0x0d, 0xda, 0xcd, 0xfd, 0x77, 0x33, + 0x9f, 0x6d, 0x99, 0xd5, 0xb3, 0x2d, 0x3d, 0xb6, 0xac, 0xdf, 0xbb, 0x5b, 0x1d, 0x00, 0xf5, 0x41, + 0x87, 0x48, 0x41, 0x4c, 0x38, 0xe7, 0xde, 0x4d, 0xc6, 0x89, 0xd4, 0xd6, 0x0f, 0x53, 0xe4, 0xd8, + 0x2e, 0x27, 0x51, 0x53, 0x86, 0x49, 0xd9, 0x73, 0xc6, 0x4d, 0x0a, 0x3f, 0xa5, 0x90, 0xbf, 0x02, + 0xf8, 0xee, 0x7d, 0x92, 0x21, 0x2d, 0xcf, 0x6f, 0xf8, 0x2f, 0x51, 0x4c, 0xb4, 0x08, 0xa7, 0x9b, + 0xb4, 0xee, 0x87, 0x8b, 0x5e, 0xa3, 0x6a, 0xd1, 0x3a, 0xe7, 0x32, 0x6e, 0x4c, 0xc9, 0xe8, 0x11, + 0x0f, 0xaa, 0x69, 0x0a, 0xab, 0x28, 0x4d, 0xa2, 0xbe, 0x01, 0x70, 0xf1, 0x01, 0xd4, 0xb2, 0x3b, + 0x25, 0x18, 0x8e, 0xa5, 0x58, 0x89, 0x75, 0x25, 0x8b, 0x85, 0x29, 0xe3, 0xae, 0x29, 0xe3, 0x4f, + 0xbc, 0x96, 0x31, 0x6d, 0xc7, 0xb6, 0x89, 0xdf, 0x96, 0x74, 0xfc, 0xb6, 0x44, 0x6d, 0x19, 0x1b, + 0xd4, 0x96, 0xf1, 0x11, 0xda, 0xb2, 0x7e, 0xf9, 0x02, 0x3e, 0xe3, 0x04, 0xd1, 0x2f, 0x00, 0xc2, + 0x88, 0x25, 0xc2, 0xfd, 0xdc, 0x29, 0xf9, 0x2b, 0xa2, 0x91, 0xa1, 0xf3, 0x85, 0x60, 0xfa, 0xc7, + 0xdf, 0xff, 0xf1, 0xcf, 0x8f, 0xe9, 0x2d, 0xb4, 0x49, 0x92, 0xbf, 0x7d, 0xe2, 0x53, 0xaa, 0xb8, + 0x1e, 0xb9, 0x88, 0x35, 0xbe, 0x8d, 0x7e, 0x06, 0x30, 0xa3, 0x38, 0x07, 0x1a, 0x16, 0x42, 0xd7, + 0xa2, 0xb4, 0xb5, 0xe1, 0x0b, 0x24, 0xe8, 0x35, 0x0e, 0x7a, 0x05, 0x15, 0x86, 0x05, 0x8d, 0x7e, + 0x07, 0xf0, 0xb5, 0x1e, 0x93, 0x43, 0x1f, 0x0c, 0x3e, 0xb9, 0x8f, 0xa7, 0x6a, 0x1f, 0x3e, 0xb6, + 0x4c, 0xc2, 0xde, 0xe3, 0xb0, 0x4b, 0x68, 0x7b, 0x30, 0x6c, 0x31, 0x80, 0x71, 0xc9, 0xbb, 0x43, + 0xd9, 0x46, 0x7f, 0x01, 0x38, 0x93, 0xe8, 0x50, 0xe8, 0xa3, 0x21, 0x75, 0xec, 0xb5, 0x4e, 0x6d, + 0x6b, 0x94, 0x52, 0xc9, 0xea, 0x73, 0xce, 0xea, 0x00, 0xed, 0x8f, 0x3a, 0x41, 0x44, 0x35, 0x51, + 0xf4, 0x53, 0x1a, 0xe6, 0xfa, 0x5d, 0x73, 0xb4, 0x33, 0x2c, 0xce, 0x24, 0x4f, 0xd3, 0x4a, 0x23, + 0x56, 0x4b, 0xa2, 0xdf, 0x01, 0xce, 0xf4, 0x02, 0xb5, 0x46, 0x67, 0x1a, 0xf7, 0x26, 0x22, 0x6d, + 0x8e, 0x5c, 0xc4, 0xcd, 0xb2, 0x4d, 0x84, 0x99, 0x44, 0x71, 0xf1, 0xde, 0xde, 0xfd, 0xea, 0xaa, + 0x93, 0x07, 0xd7, 0x9d, 0x3c, 0xf8, 0xbb, 0x93, 0x07, 0x3f, 0xdc, 0xe6, 0x53, 0xd7, 0xb7, 0xf9, + 0xd4, 0x9f, 0xb7, 0xf9, 0xd4, 0xd7, 0xdb, 0x8e, 0x1b, 0x54, 0x1a, 0x16, 0xb6, 0x59, 0x95, 0xc8, + 0xff, 0xc4, 0xe2, 0x67, 0xd5, 0x2f, 0x7f, 0x43, 0xbe, 0x8d, 0x20, 0xaf, 0x6d, 0xac, 0x2a, 0xa8, + 0x83, 0x56, 0x8d, 0xfa, 0xd6, 0x73, 0xee, 0x8a, 0x1b, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x91, + 0x3b, 0x2c, 0x79, 0xa0, 0x0b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/ibc/core/03-connection/types/query.pb.gw.go b/x/ibc/core/03-connection/types/query.pb.gw.go index 57b8ab492..1d7151ad5 100644 --- a/x/ibc/core/03-connection/types/query.pb.gw.go +++ b/x/ibc/core/03-connection/types/query.pb.gw.go @@ -578,15 +578,15 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } var ( - pattern_Query_Connection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"ibc", "connection", "v1beta1", "connections", "connection_id"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_Connection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"ibc", "core", "connection", "v1beta1", "connections", "connection_id"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_Connections_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"ibc", "connection", "v1beta1", "connections"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_Connections_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"ibc", "core", "connection", "v1beta1", "connections"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_ClientConnections_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"ibc", "connection", "v1beta1", "client_connections", "client_id"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_ClientConnections_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"ibc", "core", "connection", "v1beta1", "client_connections", "client_id"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_ConnectionClientState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"ibc", "connection", "v1beta1", "connections", "connection_id", "client_state"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_ConnectionClientState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"ibc", "core", "connection", "v1beta1", "connections", "connection_id", "client_state"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_ConnectionConsensusState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 2, 6, 1, 0, 4, 1, 5, 7, 2, 8, 1, 0, 4, 1, 5, 9}, []string{"ibc", "connection", "v1beta1", "connections", "connection_id", "consensus_state", "version", "version_number", "height", "version_height"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_ConnectionConsensusState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6, 2, 7, 1, 0, 4, 1, 5, 8, 2, 9, 1, 0, 4, 1, 5, 10}, []string{"ibc", "core", "connection", "v1beta1", "connections", "connection_id", "consensus_state", "version", "version_number", "height", "version_height"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( diff --git a/x/ibc/core/04-channel/types/query.pb.go b/x/ibc/core/04-channel/types/query.pb.go index d66ace711..7015a2acf 100644 --- a/x/ibc/core/04-channel/types/query.pb.go +++ b/x/ibc/core/04-channel/types/query.pb.go @@ -1699,100 +1699,100 @@ func init() { func init() { proto.RegisterFile("ibc/core/channel/v1/query.proto", fileDescriptor_1034a1e9abc4cca1) } var fileDescriptor_1034a1e9abc4cca1 = []byte{ - // 1488 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x59, 0xcf, 0x6f, 0x13, 0xc7, - 0x17, 0xcf, 0x38, 0x01, 0x92, 0xc7, 0xef, 0x49, 0x02, 0x61, 0x09, 0x4e, 0xf0, 0x57, 0x7c, 0x1b, - 0x90, 0xd8, 0x21, 0x81, 0xd2, 0xa8, 0x6a, 0x91, 0x48, 0xa4, 0x42, 0xaa, 0xf2, 0x6b, 0x29, 0x2a, - 0x20, 0xb5, 0xee, 0x7a, 0x3d, 0x38, 0xab, 0x24, 0xbb, 0xc6, 0xbb, 0x36, 0x41, 0xa9, 0xab, 0xaa, - 0x95, 0x80, 0x53, 0x55, 0x89, 0x43, 0xa5, 0x5e, 0x2a, 0x55, 0xbd, 0x70, 0xec, 0x5f, 0xd0, 0x2b, - 0xb7, 0x22, 0xd1, 0x43, 0x25, 0x24, 0x5a, 0x91, 0x4a, 0xf4, 0xda, 0x4b, 0xcf, 0xd5, 0xce, 0xbc, - 0x5d, 0xef, 0xda, 0xbb, 0x9b, 0x38, 0x8e, 0xa5, 0xa8, 0xa7, 0x78, 0x67, 0xe7, 0xbd, 0xf9, 0x7c, - 0x3e, 0x6f, 0xde, 0xf3, 0x7b, 0x0e, 0x8c, 0x99, 0x05, 0x83, 0x19, 0x76, 0x85, 0x33, 0x63, 0x5e, - 0xb7, 0x2c, 0xbe, 0xc8, 0x6a, 0x93, 0xec, 0x6e, 0x95, 0x57, 0xee, 0xab, 0xe5, 0x8a, 0xed, 0xda, - 0x74, 0xd0, 0x2c, 0x18, 0xaa, 0xb7, 0x41, 0xc5, 0x0d, 0x6a, 0x6d, 0x52, 0x09, 0x59, 0x2d, 0x9a, - 0xdc, 0x72, 0x3d, 0x23, 0xf9, 0x49, 0x5a, 0x29, 0x27, 0x0c, 0xdb, 0x59, 0xb2, 0x1d, 0x56, 0xd0, - 0x1d, 0x2e, 0xdd, 0xb1, 0xda, 0x64, 0x81, 0xbb, 0xfa, 0x24, 0x2b, 0xeb, 0x25, 0xd3, 0xd2, 0x5d, - 0xd3, 0xb6, 0x70, 0xef, 0xd1, 0x38, 0x08, 0xfe, 0x61, 0x72, 0xcb, 0x68, 0xc9, 0xb6, 0x4b, 0x8b, - 0x9c, 0xe9, 0x65, 0x93, 0xe9, 0x96, 0x65, 0xbb, 0xc2, 0xde, 0xc1, 0xb7, 0x87, 0xf0, 0xad, 0x78, - 0x2a, 0x54, 0xef, 0x30, 0xdd, 0x42, 0xf4, 0xca, 0x50, 0xc9, 0x2e, 0xd9, 0xe2, 0x23, 0xf3, 0x3e, - 0xc9, 0xd5, 0xdc, 0x25, 0x18, 0xbc, 0xe6, 0x61, 0x9a, 0x95, 0x87, 0x68, 0xfc, 0x6e, 0x95, 0x3b, - 0x2e, 0x3d, 0x08, 0x3b, 0xca, 0x76, 0xc5, 0xcd, 0x9b, 0xc5, 0x11, 0x32, 0x4e, 0x26, 0x06, 0xb4, - 0xed, 0xde, 0xe3, 0x5c, 0x91, 0x1e, 0x01, 0x40, 0x3c, 0xde, 0xbb, 0x8c, 0x78, 0x37, 0x80, 0x2b, - 0x73, 0xc5, 0xdc, 0x13, 0x02, 0x43, 0x51, 0x7f, 0x4e, 0xd9, 0xb6, 0x1c, 0x4e, 0xcf, 0xc2, 0x0e, - 0xdc, 0x25, 0x1c, 0xee, 0x9c, 0x1a, 0x55, 0x63, 0xd4, 0x54, 0x7d, 0x33, 0x7f, 0x33, 0x1d, 0x82, - 0x6d, 0xe5, 0x8a, 0x6d, 0xdf, 0x11, 0x47, 0xed, 0xd2, 0xe4, 0x03, 0x9d, 0x85, 0x5d, 0xe2, 0x43, - 0x7e, 0x9e, 0x9b, 0xa5, 0x79, 0x77, 0xa4, 0x57, 0xb8, 0x54, 0x42, 0x2e, 0x65, 0x04, 0x6a, 0x93, - 0xea, 0x45, 0xb1, 0x63, 0xa6, 0xef, 0xe9, 0xcb, 0xb1, 0x1e, 0x6d, 0xa7, 0xb0, 0x92, 0x4b, 0xb9, - 0x4f, 0xa2, 0x50, 0x1d, 0x9f, 0xfb, 0x7b, 0x00, 0x8d, 0xc0, 0x20, 0xda, 0xff, 0xab, 0x32, 0x8a, - 0xaa, 0x17, 0x45, 0x55, 0x5e, 0x0a, 0x8c, 0xa2, 0x7a, 0x55, 0x2f, 0x71, 0xb4, 0xd5, 0x42, 0x96, - 0xb9, 0x97, 0x04, 0x86, 0x9b, 0x0e, 0x40, 0x31, 0x66, 0xa0, 0x1f, 0xf9, 0x39, 0x23, 0x64, 0xbc, - 0x57, 0xf8, 0x8f, 0x53, 0x63, 0xae, 0xc8, 0x2d, 0xd7, 0xbc, 0x63, 0xf2, 0xa2, 0xaf, 0x4b, 0x60, - 0x47, 0x2f, 0x44, 0x50, 0x66, 0x04, 0xca, 0x37, 0xd6, 0x44, 0x29, 0x01, 0x84, 0x61, 0xd2, 0x69, - 0xd8, 0xde, 0xa6, 0x8a, 0xb8, 0x3f, 0xf7, 0x88, 0x40, 0x56, 0x12, 0xb4, 0x2d, 0x8b, 0x1b, 0x9e, - 0xb7, 0x66, 0x2d, 0xb3, 0x00, 0x46, 0xf0, 0x12, 0xaf, 0x52, 0x68, 0xa5, 0x49, 0xeb, 0xcc, 0x86, - 0xb5, 0xfe, 0x8b, 0xc0, 0x58, 0x22, 0x94, 0xff, 0x96, 0xea, 0x37, 0x7d, 0xd1, 0x25, 0xa6, 0x59, - 0xb1, 0xfb, 0xba, 0xab, 0xbb, 0xbc, 0xd3, 0xe4, 0xfd, 0x3d, 0x10, 0x31, 0xc6, 0x35, 0x8a, 0xa8, - 0xc3, 0x41, 0x33, 0xd0, 0x27, 0x2f, 0xa1, 0xe6, 0x1d, 0x6f, 0x0b, 0x66, 0xca, 0xf1, 0x38, 0x22, - 0x21, 0x49, 0x43, 0x3e, 0x87, 0xcd, 0xb8, 0xe5, 0x6e, 0xa6, 0xfc, 0x13, 0x02, 0x47, 0x23, 0x0c, - 0x3d, 0x4e, 0x96, 0x53, 0x75, 0x36, 0x43, 0x3f, 0x7a, 0x0c, 0xf6, 0xd4, 0x78, 0xc5, 0x31, 0x6d, - 0x2b, 0x6f, 0x55, 0x97, 0x0a, 0xbc, 0x22, 0x40, 0xf6, 0x69, 0xbb, 0x71, 0xf5, 0xb2, 0x58, 0x0c, - 0x6f, 0x43, 0x2e, 0x7d, 0x91, 0x6d, 0x88, 0xf5, 0x05, 0x81, 0x5c, 0x1a, 0x56, 0x0c, 0xc8, 0xbb, - 0xb0, 0xd7, 0xf0, 0xdf, 0x44, 0x02, 0x31, 0xa4, 0xca, 0xef, 0x02, 0xd5, 0xff, 0x2e, 0x50, 0xcf, - 0x5b, 0xf7, 0xb5, 0x3d, 0x46, 0xc4, 0x0d, 0x3d, 0x0c, 0x03, 0x18, 0xc4, 0x80, 0x51, 0xbf, 0x5c, - 0x98, 0x2b, 0x36, 0x22, 0xd1, 0x9b, 0x16, 0x89, 0xbe, 0x8d, 0x44, 0xa2, 0x02, 0xa3, 0x82, 0xdc, - 0x55, 0xdd, 0x58, 0xe0, 0xee, 0xac, 0xbd, 0xb4, 0x64, 0xba, 0x4b, 0xdc, 0x72, 0x3b, 0x8d, 0x81, - 0x02, 0xfd, 0x8e, 0xe7, 0xc2, 0x32, 0x38, 0xaa, 0x1f, 0x3c, 0xe7, 0xbe, 0x23, 0x70, 0x24, 0xe1, - 0x50, 0x14, 0x53, 0x94, 0x2b, 0x7f, 0x55, 0x1c, 0xbc, 0x4b, 0x0b, 0xad, 0x74, 0xf3, 0x6a, 0x7e, - 0x9f, 0x04, 0xce, 0xe9, 0x54, 0x92, 0x68, 0x8d, 0xed, 0xdd, 0x70, 0x8d, 0x7d, 0xed, 0x97, 0xfb, - 0x18, 0x84, 0x41, 0x89, 0xdd, 0xd9, 0x50, 0xcb, 0xaf, 0xb2, 0xe3, 0xb1, 0x55, 0x56, 0x3a, 0x91, - 0x77, 0x39, 0x6c, 0xb4, 0x15, 0x4a, 0xac, 0x0d, 0x87, 0x42, 0x44, 0x35, 0x6e, 0x70, 0xb3, 0xdc, - 0xd5, 0x9b, 0xf9, 0x98, 0x80, 0x12, 0x77, 0x22, 0xca, 0xaa, 0x40, 0x7f, 0xc5, 0x5b, 0xaa, 0x71, - 0xe9, 0xb7, 0x5f, 0x0b, 0x9e, 0xbb, 0x99, 0xa3, 0xf7, 0xb0, 0x58, 0x4a, 0x50, 0xe7, 0x8d, 0x05, - 0xcb, 0xbe, 0xb7, 0xc8, 0x8b, 0x25, 0xde, 0xed, 0x44, 0x7d, 0xe2, 0x97, 0xbe, 0x84, 0x93, 0x51, - 0x96, 0x09, 0xd8, 0xab, 0x47, 0x5f, 0x61, 0xca, 0x36, 0x2f, 0x77, 0x33, 0x6f, 0x7f, 0x4c, 0xc5, - 0xba, 0x65, 0x92, 0xf7, 0x1f, 0x02, 0xff, 0x4b, 0x85, 0x89, 0x9a, 0x7e, 0x00, 0xfb, 0x9a, 0xc4, - 0x5b, 0x7f, 0x1a, 0xb7, 0x58, 0x6e, 0x85, 0x5c, 0xfe, 0xd6, 0xaf, 0xab, 0x37, 0x2c, 0x3f, 0x67, - 0x24, 0xe6, 0x8e, 0x43, 0x73, 0x0e, 0x0e, 0x97, 0x85, 0xa7, 0x7c, 0xa3, 0x7c, 0xe5, 0xfd, 0x3b, - 0xec, 0x8c, 0xf4, 0x8e, 0xf7, 0x4e, 0xf4, 0x69, 0x87, 0xca, 0x4d, 0xc5, 0xf2, 0xba, 0xbf, 0x21, - 0xb7, 0x8c, 0xe5, 0x34, 0x06, 0x18, 0x06, 0x63, 0x14, 0x06, 0x1a, 0xfe, 0x88, 0xf0, 0xd7, 0x58, - 0x08, 0x69, 0x92, 0x69, 0x53, 0x93, 0x07, 0x7e, 0xb9, 0x69, 0x1c, 0x7d, 0xde, 0x58, 0xe8, 0x58, - 0x90, 0x53, 0x30, 0x84, 0x82, 0xe8, 0xc6, 0x42, 0x8b, 0x12, 0xb4, 0xec, 0xdf, 0xbc, 0x86, 0x04, - 0x55, 0x38, 0x1c, 0x8b, 0xa3, 0xcb, 0xfc, 0x6f, 0x61, 0x9f, 0x7b, 0x99, 0x2f, 0x07, 0xf1, 0xd0, - 0x24, 0x80, 0x4e, 0x7b, 0xe8, 0x9f, 0x08, 0x8c, 0x27, 0xfb, 0x46, 0x5e, 0x53, 0x30, 0x6c, 0xf1, - 0xe5, 0xc6, 0x65, 0xc9, 0x23, 0x7b, 0x71, 0x54, 0x9f, 0x36, 0x68, 0xb5, 0xda, 0x76, 0xb1, 0x84, - 0x4d, 0x3d, 0x3c, 0x00, 0xdb, 0x04, 0x66, 0xfa, 0x03, 0x81, 0x1d, 0xd8, 0x6e, 0xd2, 0x89, 0xd8, - 0x7c, 0x8f, 0xf9, 0xb1, 0x40, 0x39, 0xbe, 0x8e, 0x9d, 0x92, 0x79, 0x6e, 0xe6, 0xcb, 0xe7, 0x7f, - 0x3e, 0xce, 0xbc, 0x43, 0xdf, 0x66, 0xe2, 0x97, 0x8e, 0xe0, 0x47, 0x0e, 0xf9, 0x7b, 0x88, 0x3f, - 0x66, 0xb1, 0x95, 0x86, 0xc4, 0x75, 0xe6, 0x09, 0xef, 0xb0, 0x15, 0x0c, 0x47, 0x9d, 0x3e, 0x22, - 0xd0, 0xef, 0x0f, 0x77, 0x74, 0xed, 0xb3, 0xfd, 0x6b, 0xad, 0x9c, 0x58, 0xcf, 0x56, 0xc4, 0x79, - 0x4c, 0xe0, 0x1c, 0xa3, 0x47, 0x52, 0x71, 0xd2, 0x9f, 0x09, 0xd0, 0xd6, 0x89, 0x93, 0x9e, 0x4e, - 0x39, 0x29, 0x69, 0x54, 0x56, 0xce, 0xb4, 0x67, 0x84, 0x40, 0xcf, 0x09, 0xa0, 0xd3, 0xf4, 0x6c, - 0x3c, 0xd0, 0xc0, 0xd0, 0xd3, 0x34, 0x78, 0xa8, 0x37, 0x18, 0x3c, 0xf3, 0x18, 0xb4, 0x8c, 0x7b, - 0xa9, 0x0c, 0x92, 0xe6, 0xce, 0x54, 0x06, 0x89, 0x13, 0x65, 0xee, 0x8a, 0x60, 0x30, 0x47, 0x2f, - 0x6c, 0xfc, 0x4a, 0xb0, 0xf0, 0x1c, 0x4a, 0xbf, 0xce, 0xc0, 0x70, 0xec, 0xcc, 0x44, 0xcf, 0xae, - 0x0d, 0x30, 0x6e, 0x20, 0x54, 0xde, 0x6a, 0xdb, 0x0e, 0xb9, 0x7d, 0x45, 0x04, 0xb9, 0x3a, 0x5d, - 0xe9, 0x84, 0x5c, 0x74, 0xbc, 0x63, 0x38, 0x26, 0xb2, 0x95, 0xe8, 0xb0, 0x59, 0x67, 0xb2, 0x06, - 0x34, 0xd6, 0xe5, 0x73, 0x9d, 0xbe, 0x20, 0xb0, 0xaf, 0xb9, 0x67, 0xa7, 0x93, 0xc9, 0x9c, 0x12, - 0x66, 0x32, 0x65, 0xaa, 0x1d, 0x13, 0x54, 0xe0, 0x53, 0x21, 0xc0, 0x6d, 0x7a, 0xb3, 0x03, 0x01, - 0x5a, 0xbe, 0x65, 0x1d, 0xb6, 0xe2, 0x97, 0xce, 0x3a, 0x7d, 0x4e, 0x60, 0x7f, 0xcb, 0x44, 0x42, - 0xdb, 0xc0, 0x1a, 0x64, 0xe0, 0xe9, 0xb6, 0x6c, 0x90, 0xe0, 0x0d, 0x41, 0xf0, 0x0a, 0xbd, 0xb4, - 0xa9, 0x04, 0xe9, 0x2f, 0x04, 0x76, 0x47, 0x86, 0x01, 0xaa, 0xae, 0x85, 0x2e, 0x3a, 0xa7, 0x28, - 0x6c, 0xdd, 0xfb, 0x91, 0xc9, 0xc7, 0x82, 0xc9, 0x47, 0xf4, 0x46, 0xe7, 0x4c, 0x2a, 0xd2, 0x75, - 0x24, 0x4e, 0xab, 0x04, 0x86, 0x63, 0x9b, 0xcf, 0xb4, 0xb4, 0x4c, 0x1b, 0x3d, 0xd2, 0xd2, 0x32, - 0x75, 0x70, 0xc8, 0xdd, 0x12, 0x4c, 0xaf, 0xd3, 0x6b, 0x9d, 0x33, 0xd5, 0x8d, 0x85, 0x08, 0xcb, - 0xd7, 0x04, 0x0e, 0xc4, 0xb7, 0xd8, 0xb4, 0x5d, 0xb8, 0xc1, 0xbd, 0x9c, 0x6e, 0xdf, 0x10, 0x89, - 0xde, 0x16, 0x44, 0x3f, 0xa4, 0xda, 0xa6, 0x10, 0x8d, 0xd2, 0x79, 0x90, 0x81, 0xfd, 0x2d, 0xad, - 0x6b, 0x5a, 0xde, 0x25, 0x35, 0xe0, 0x69, 0x79, 0x97, 0xd8, 0x1b, 0xe7, 0x1e, 0xca, 0xd2, 0xfa, - 0x05, 0xa1, 0x9f, 0x6f, 0x72, 0x69, 0x49, 0x69, 0xea, 0xeb, 0xac, 0x1a, 0x00, 0xca, 0x97, 0x91, - 0xf2, 0xdf, 0x04, 0xf6, 0x44, 0x1b, 0x58, 0xca, 0xd6, 0xc3, 0x28, 0xd4, 0x72, 0x2b, 0xa7, 0xd6, - 0x6f, 0x80, 0xfc, 0x3f, 0x13, 0xf4, 0x6b, 0xd4, 0xed, 0x0e, 0xfb, 0x48, 0x07, 0x1f, 0xa1, 0xed, - 0xdd, 0x78, 0xfa, 0x2b, 0x81, 0xc1, 0x98, 0x0e, 0x97, 0xa6, 0xb4, 0x00, 0xc9, 0xcd, 0xb6, 0xf2, - 0x66, 0x9b, 0x56, 0x28, 0xc1, 0x55, 0x21, 0xc1, 0xfb, 0xf4, 0x62, 0x07, 0x12, 0x44, 0xfa, 0xf0, - 0x19, 0xed, 0xe9, 0xab, 0x2c, 0x79, 0xf6, 0x2a, 0x4b, 0xfe, 0x78, 0x95, 0x25, 0xdf, 0xac, 0x66, - 0x7b, 0x9e, 0xad, 0x66, 0x7b, 0x7e, 0x5b, 0xcd, 0xf6, 0xdc, 0x9e, 0x2e, 0x99, 0xee, 0x7c, 0xb5, - 0xa0, 0x1a, 0xf6, 0x12, 0xc3, 0x7f, 0xe8, 0xc9, 0x3f, 0x27, 0x9d, 0xe2, 0x02, 0x5b, 0x66, 0xc1, - 0x3f, 0xee, 0x4e, 0x9d, 0x39, 0xe9, 0x23, 0x71, 0xef, 0x97, 0xb9, 0x53, 0xd8, 0x2e, 0x7e, 0x7f, - 0x3d, 0xfd, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x07, 0x22, 0x97, 0x6e, 0x5f, 0x1c, 0x00, 0x00, + // 1487 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x59, 0xdf, 0x6b, 0x14, 0xd7, + 0x17, 0xcf, 0xdd, 0x44, 0x4d, 0x8e, 0xbf, 0x6f, 0x12, 0x8d, 0x63, 0x5c, 0xe3, 0x7e, 0xbf, 0x6d, + 0xa3, 0xe0, 0x5c, 0x13, 0xad, 0x15, 0x8a, 0x2d, 0x31, 0x50, 0x1b, 0x50, 0x6b, 0x47, 0x6d, 0x55, + 0x5a, 0x97, 0xd9, 0xd9, 0xeb, 0x66, 0x48, 0x32, 0xb3, 0xee, 0xcc, 0xc6, 0x84, 0xb0, 0xd0, 0x56, + 0x90, 0x52, 0x2a, 0x14, 0xa4, 0x14, 0xfa, 0xd2, 0x97, 0x42, 0xf1, 0xb1, 0xff, 0x43, 0x1f, 0x7c, + 0xe8, 0x83, 0xd0, 0x16, 0x2c, 0x05, 0x2b, 0x5a, 0xa8, 0x0f, 0x7d, 0x6e, 0x5f, 0xcb, 0xdc, 0x7b, + 0xe6, 0xd7, 0xee, 0xcc, 0x24, 0xeb, 0x66, 0x41, 0xfa, 0x94, 0x9d, 0x3b, 0xe7, 0x9c, 0xfb, 0xf9, + 0x7c, 0xce, 0x3d, 0x67, 0xef, 0xd9, 0xc0, 0x7e, 0xb3, 0x64, 0x30, 0xc3, 0xae, 0x71, 0x66, 0xcc, + 0xea, 0x96, 0xc5, 0xe7, 0xd9, 0xe2, 0x04, 0xbb, 0x51, 0xe7, 0xb5, 0x65, 0xb5, 0x5a, 0xb3, 0x5d, + 0x9b, 0x0e, 0x9a, 0x25, 0x43, 0xf5, 0x0c, 0x54, 0x34, 0x50, 0x17, 0x27, 0x94, 0x88, 0xd7, 0xbc, + 0xc9, 0x2d, 0xd7, 0x73, 0x92, 0x9f, 0xa4, 0x97, 0x72, 0xc8, 0xb0, 0x9d, 0x05, 0xdb, 0x61, 0x25, + 0xdd, 0xe1, 0x32, 0x1c, 0x5b, 0x9c, 0x28, 0x71, 0x57, 0x9f, 0x60, 0x55, 0xbd, 0x62, 0x5a, 0xba, + 0x6b, 0xda, 0x16, 0xda, 0x1e, 0x48, 0x82, 0xe0, 0x6f, 0x26, 0x4d, 0x46, 0x2b, 0xb6, 0x5d, 0x99, + 0xe7, 0x4c, 0xaf, 0x9a, 0x4c, 0xb7, 0x2c, 0xdb, 0x15, 0xfe, 0x0e, 0xbe, 0xdd, 0x83, 0x6f, 0xc5, + 0x53, 0xa9, 0x7e, 0x9d, 0xe9, 0x16, 0xa2, 0x57, 0x86, 0x2a, 0x76, 0xc5, 0x16, 0x1f, 0x99, 0xf7, + 0x49, 0xae, 0x16, 0xce, 0xc2, 0xe0, 0xbb, 0x1e, 0xa6, 0x69, 0xb9, 0x89, 0xc6, 0x6f, 0xd4, 0xb9, + 0xe3, 0xd2, 0xdd, 0xb0, 0xa9, 0x6a, 0xd7, 0xdc, 0xa2, 0x59, 0x1e, 0x21, 0x63, 0x64, 0x7c, 0x40, + 0xdb, 0xe8, 0x3d, 0xce, 0x94, 0xe9, 0x3e, 0x00, 0xc4, 0xe3, 0xbd, 0xcb, 0x89, 0x77, 0x03, 0xb8, + 0x32, 0x53, 0x2e, 0xdc, 0x23, 0x30, 0x14, 0x8f, 0xe7, 0x54, 0x6d, 0xcb, 0xe1, 0xf4, 0x38, 0x6c, + 0x42, 0x2b, 0x11, 0x70, 0xf3, 0xe4, 0xa8, 0x9a, 0xa0, 0xa6, 0xea, 0xbb, 0xf9, 0xc6, 0x74, 0x08, + 0x36, 0x54, 0x6b, 0xb6, 0x7d, 0x5d, 0x6c, 0xb5, 0x45, 0x93, 0x0f, 0x74, 0x1a, 0xb6, 0x88, 0x0f, + 0xc5, 0x59, 0x6e, 0x56, 0x66, 0xdd, 0x91, 0x5e, 0x11, 0x52, 0x89, 0x84, 0x94, 0x19, 0x58, 0x9c, + 0x50, 0xdf, 0x16, 0x16, 0xa7, 0xfa, 0xee, 0x3f, 0xda, 0xdf, 0xa3, 0x6d, 0x16, 0x5e, 0x72, 0xa9, + 0x70, 0x2d, 0x0e, 0xd5, 0xf1, 0xb9, 0xbf, 0x05, 0x10, 0x26, 0x06, 0xd1, 0xbe, 0xac, 0xca, 0x2c, + 0xaa, 0x5e, 0x16, 0x55, 0x79, 0x28, 0x30, 0x8b, 0xea, 0x79, 0xbd, 0xc2, 0xd1, 0x57, 0x8b, 0x78, + 0x16, 0x1e, 0x11, 0x18, 0x6e, 0xda, 0x00, 0xc5, 0x38, 0x05, 0xfd, 0xc8, 0xcf, 0x19, 0x21, 0x63, + 0xbd, 0x22, 0x7e, 0x92, 0x1a, 0x33, 0x65, 0x6e, 0xb9, 0xe6, 0x75, 0x93, 0x97, 0x7d, 0x5d, 0x02, + 0x3f, 0x7a, 0x3a, 0x86, 0x32, 0x27, 0x50, 0xbe, 0xb2, 0x2a, 0x4a, 0x09, 0x20, 0x0a, 0x93, 0x9e, + 0x80, 0x8d, 0x6d, 0xaa, 0x88, 0xf6, 0x85, 0x4f, 0x09, 0xe4, 0x25, 0x41, 0xdb, 0xb2, 0xb8, 0xe1, + 0x45, 0x6b, 0xd6, 0x32, 0x0f, 0x60, 0x04, 0x2f, 0xf1, 0x28, 0x45, 0x56, 0x9a, 0xb4, 0xce, 0x3d, + 0xb7, 0xd6, 0xcf, 0x08, 0xec, 0x4f, 0x85, 0xf2, 0xdf, 0x52, 0xfd, 0xb2, 0x2f, 0xba, 0xc4, 0x34, + 0x2d, 0xac, 0x2f, 0xb8, 0xba, 0xcb, 0x3b, 0x2d, 0xde, 0xdf, 0x03, 0x11, 0x13, 0x42, 0xa3, 0x88, + 0x3a, 0xec, 0x36, 0x03, 0x7d, 0x8a, 0x12, 0x6a, 0xd1, 0xf1, 0x4c, 0xb0, 0x52, 0x0e, 0x26, 0x11, + 0x89, 0x48, 0x1a, 0x89, 0x39, 0x6c, 0x26, 0x2d, 0x77, 0xb3, 0xe4, 0xef, 0x11, 0x38, 0x10, 0x63, + 0xe8, 0x71, 0xb2, 0x9c, 0xba, 0xb3, 0x1e, 0xfa, 0xd1, 0x97, 0x60, 0xdb, 0x22, 0xaf, 0x39, 0xa6, + 0x6d, 0x15, 0xad, 0xfa, 0x42, 0x89, 0xd7, 0x04, 0xc8, 0x3e, 0x6d, 0x2b, 0xae, 0x9e, 0x13, 0x8b, + 0x51, 0x33, 0xe4, 0xd2, 0x17, 0x33, 0x43, 0xac, 0xbf, 0x11, 0x28, 0x64, 0x61, 0xc5, 0x84, 0x9c, + 0x84, 0xed, 0x86, 0xff, 0x26, 0x96, 0x88, 0x21, 0x55, 0x7e, 0x17, 0xa8, 0xfe, 0x77, 0x81, 0x3a, + 0x65, 0x2d, 0x6b, 0xdb, 0x8c, 0x58, 0x18, 0xba, 0x17, 0x06, 0x30, 0x89, 0x01, 0xa3, 0x7e, 0xb9, + 0x30, 0x53, 0x0e, 0x33, 0xd1, 0x9b, 0x95, 0x89, 0xbe, 0xe7, 0xc9, 0x44, 0x0d, 0x46, 0x05, 0xb9, + 0xf3, 0xba, 0x31, 0xc7, 0xdd, 0x69, 0x7b, 0x61, 0xc1, 0x74, 0x17, 0xb8, 0xe5, 0x76, 0x9a, 0x03, + 0x05, 0xfa, 0x1d, 0x2f, 0x84, 0x65, 0x70, 0x54, 0x3f, 0x78, 0x2e, 0x7c, 0x4d, 0x60, 0x5f, 0xca, + 0xa6, 0x28, 0xa6, 0x68, 0x57, 0xfe, 0xaa, 0xd8, 0x78, 0x8b, 0x16, 0x59, 0xe9, 0xe6, 0xd1, 0xfc, + 0x26, 0x0d, 0x9c, 0xd3, 0xa9, 0x24, 0xf1, 0x1e, 0xdb, 0xfb, 0xdc, 0x3d, 0xf6, 0x4f, 0xbf, 0xdd, + 0x27, 0x20, 0x0c, 0x5a, 0xec, 0xe6, 0x50, 0x2d, 0xbf, 0xcb, 0x8e, 0x25, 0x76, 0x59, 0x19, 0x44, + 0x9e, 0xe5, 0xa8, 0xd3, 0x8b, 0xd0, 0x62, 0x6d, 0xd8, 0x13, 0x21, 0xaa, 0x71, 0x83, 0x9b, 0xd5, + 0xae, 0x9e, 0xcc, 0xbb, 0x04, 0x94, 0xa4, 0x1d, 0x51, 0x56, 0x05, 0xfa, 0x6b, 0xde, 0xd2, 0x22, + 0x97, 0x71, 0xfb, 0xb5, 0xe0, 0xb9, 0x9b, 0x35, 0x7a, 0x13, 0x9b, 0xa5, 0x04, 0x35, 0x65, 0xcc, + 0x59, 0xf6, 0xcd, 0x79, 0x5e, 0xae, 0xf0, 0x6e, 0x17, 0xea, 0x3d, 0xbf, 0xf5, 0xa5, 0xec, 0x8c, + 0xb2, 0x8c, 0xc3, 0x76, 0x3d, 0xfe, 0x0a, 0x4b, 0xb6, 0x79, 0xb9, 0x9b, 0x75, 0xfb, 0x6d, 0x26, + 0xd6, 0x17, 0xa6, 0x78, 0xff, 0x26, 0xf0, 0xbf, 0x4c, 0x98, 0xa8, 0xe9, 0x19, 0xd8, 0xd1, 0x24, + 0xde, 0xda, 0xcb, 0xb8, 0xc5, 0xf3, 0x45, 0xa8, 0xe5, 0xaf, 0xfc, 0xbe, 0x7a, 0xc9, 0xf2, 0x6b, + 0x46, 0x62, 0xee, 0x38, 0x35, 0x6f, 0xc0, 0xde, 0xaa, 0x88, 0x54, 0x0c, 0xdb, 0x57, 0xd1, 0x3f, + 0xc3, 0xce, 0x48, 0xef, 0x58, 0xef, 0x78, 0x9f, 0xb6, 0xa7, 0xda, 0xd4, 0x2c, 0x2f, 0xf8, 0x06, + 0x85, 0x25, 0x6c, 0xa7, 0x09, 0xc0, 0x30, 0x19, 0xa3, 0x30, 0x10, 0xc6, 0x23, 0x22, 0x5e, 0xb8, + 0x10, 0xd1, 0x24, 0xd7, 0xa6, 0x26, 0xb7, 0xfd, 0x76, 0x13, 0x6e, 0x3d, 0x65, 0xcc, 0x75, 0x2c, + 0xc8, 0x11, 0x18, 0x42, 0x41, 0x74, 0x63, 0xae, 0x45, 0x09, 0x5a, 0xf5, 0x4f, 0x5e, 0x28, 0x41, + 0x1d, 0xf6, 0x26, 0xe2, 0xe8, 0x32, 0xff, 0x2b, 0x78, 0xcf, 0x3d, 0xc7, 0x97, 0x82, 0x7c, 0x68, + 0x12, 0x40, 0xa7, 0x77, 0xe8, 0xef, 0x09, 0x8c, 0xa5, 0xc7, 0x46, 0x5e, 0x93, 0x30, 0x6c, 0xf1, + 0xa5, 0xf0, 0xb0, 0x14, 0x91, 0xbd, 0xd8, 0xaa, 0x4f, 0x1b, 0xb4, 0x5a, 0x7d, 0xbb, 0xd8, 0xc2, + 0x26, 0x7f, 0xdc, 0x05, 0x1b, 0x04, 0x66, 0xfa, 0x1d, 0x81, 0x4d, 0x78, 0xdd, 0xa4, 0xe3, 0x89, + 0xf5, 0x9e, 0xf0, 0x63, 0x81, 0x72, 0x70, 0x0d, 0x96, 0x92, 0x79, 0xe1, 0xf4, 0x27, 0x3f, 0xfd, + 0x71, 0x37, 0x37, 0x45, 0xdf, 0x64, 0x09, 0xbf, 0x74, 0xc8, 0x1f, 0x45, 0xfc, 0x59, 0x8b, 0xad, + 0x84, 0x3a, 0x37, 0x98, 0xa7, 0xbe, 0xc3, 0x56, 0x30, 0x27, 0x0d, 0x7a, 0x87, 0x40, 0xbf, 0x3f, + 0xe1, 0xd1, 0xd5, 0x01, 0xf8, 0x67, 0x5b, 0x39, 0xb4, 0x16, 0x53, 0x04, 0x7b, 0x48, 0x80, 0xfd, + 0x3f, 0x2d, 0xac, 0x0e, 0x96, 0xfe, 0x40, 0x80, 0xb6, 0xce, 0x9e, 0xf4, 0x68, 0xc6, 0x76, 0x69, + 0x43, 0xb3, 0x72, 0xac, 0x3d, 0x27, 0x44, 0x3b, 0x2d, 0xd0, 0x9e, 0xa4, 0xaf, 0x67, 0xa0, 0x0d, + 0xbc, 0x3d, 0x75, 0x83, 0x87, 0x46, 0x48, 0xe3, 0x17, 0x8f, 0x46, 0xcb, 0xf4, 0x97, 0x49, 0x23, + 0x6d, 0x0c, 0xcd, 0xa4, 0x91, 0x3a, 0x60, 0x16, 0x2e, 0x0a, 0x1a, 0xe7, 0xe8, 0x99, 0x0e, 0x4f, + 0x08, 0x8b, 0xce, 0xa6, 0xf4, 0xcb, 0x1c, 0x0c, 0x27, 0xce, 0x51, 0xf4, 0xf8, 0xea, 0x28, 0x93, + 0x86, 0x44, 0xe5, 0xb5, 0xb6, 0xfd, 0x90, 0xe0, 0x67, 0x44, 0x30, 0xbc, 0x45, 0xe8, 0x47, 0xa4, + 0x63, 0x8e, 0xf1, 0xc9, 0x8f, 0xe1, 0x04, 0xc9, 0x56, 0xe2, 0x73, 0x68, 0x83, 0xc9, 0xf6, 0x10, + 0xae, 0xcb, 0xe7, 0x06, 0x7d, 0x4c, 0x60, 0x47, 0xf3, 0x75, 0x9e, 0x4e, 0xa4, 0x53, 0x4b, 0x19, + 0xd7, 0x94, 0xc9, 0x76, 0x5c, 0x50, 0x08, 0x2e, 0x74, 0x28, 0xd2, 0x0f, 0x3b, 0x55, 0xa1, 0xe5, + 0x5b, 0xd8, 0x61, 0x2b, 0x7e, 0x6b, 0x6d, 0xd0, 0x87, 0x04, 0x76, 0xb6, 0x4c, 0x2c, 0xb4, 0x0d, + 0xc0, 0x41, 0x5d, 0x1e, 0x6d, 0xcb, 0x07, 0x59, 0x5e, 0x15, 0x2c, 0x2f, 0x52, 0x6d, 0xfd, 0x59, + 0xd2, 0x9f, 0x09, 0x6c, 0x8d, 0x4d, 0x0c, 0x54, 0x5d, 0x0d, 0x62, 0x7c, 0x98, 0x51, 0xd8, 0x9a, + 0xed, 0x91, 0x4e, 0x49, 0xd0, 0xf9, 0x80, 0x5e, 0x5d, 0x27, 0x3a, 0x35, 0x19, 0x3f, 0x96, 0xb1, + 0x67, 0x04, 0x86, 0x13, 0xaf, 0xa9, 0x59, 0xc5, 0x9a, 0x35, 0xa4, 0x64, 0x15, 0x6b, 0xe6, 0x88, + 0x51, 0xb8, 0x26, 0xe8, 0x5e, 0xa6, 0xef, 0xad, 0x13, 0x5d, 0xdd, 0x98, 0x8b, 0x51, 0xfd, 0x8b, + 0xc0, 0xae, 0xe4, 0x1b, 0x39, 0x6d, 0x17, 0x73, 0x70, 0x4c, 0x4f, 0xb4, 0xef, 0x88, 0x6c, 0x8b, + 0x82, 0xed, 0x15, 0xfa, 0xfe, 0xfa, 0xb1, 0x8d, 0x73, 0xfa, 0x3c, 0x07, 0x3b, 0x5b, 0xae, 0xbb, + 0x59, 0xb5, 0x98, 0x76, 0x69, 0xcf, 0xaa, 0xc5, 0xd4, 0xfb, 0x74, 0xe1, 0x8e, 0x6c, 0xbd, 0xb7, + 0x09, 0xbd, 0x45, 0xba, 0xd1, 0x74, 0x32, 0xc6, 0x81, 0x06, 0xab, 0x07, 0xb0, 0x8a, 0x55, 0x24, + 0xfe, 0x0f, 0x81, 0x6d, 0xf1, 0xab, 0x2f, 0x65, 0x6b, 0xe1, 0x15, 0xb9, 0xac, 0x2b, 0x47, 0xd6, + 0xee, 0x80, 0x2a, 0x7c, 0x2c, 0x55, 0x58, 0xa1, 0xcb, 0x5d, 0xd4, 0x20, 0x36, 0x01, 0xc4, 0xc8, + 0x7b, 0x25, 0x40, 0x7f, 0x25, 0x30, 0x98, 0x70, 0x43, 0xa6, 0x19, 0x77, 0x86, 0xf4, 0xcb, 0xba, + 0xf2, 0x6a, 0x9b, 0x5e, 0x28, 0xc4, 0x25, 0xa1, 0xc3, 0x3b, 0xf4, 0x6c, 0xa7, 0x3a, 0xc4, 0x2e, + 0xf3, 0xa7, 0xb4, 0xfb, 0x4f, 0xf2, 0xe4, 0xc1, 0x93, 0x3c, 0x79, 0xfc, 0x24, 0x4f, 0xbe, 0x78, + 0x9a, 0xef, 0x79, 0xf0, 0x34, 0xdf, 0xf3, 0xf0, 0x69, 0xbe, 0xe7, 0xea, 0x89, 0x8a, 0xe9, 0xce, + 0xd6, 0x4b, 0xaa, 0x61, 0x2f, 0x30, 0xfc, 0xaf, 0xa0, 0xfc, 0x73, 0xd8, 0x29, 0xcf, 0xb1, 0xa5, + 0x10, 0xc6, 0x91, 0x63, 0x87, 0x7d, 0x24, 0xee, 0x72, 0x95, 0x3b, 0xa5, 0x8d, 0xe2, 0x47, 0xdc, + 0xa3, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x48, 0x61, 0x15, 0x26, 0xa4, 0x1c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/ibc/core/04-channel/types/query.pb.gw.go b/x/ibc/core/04-channel/types/query.pb.gw.go index a2ae71d96..270aa3db9 100644 --- a/x/ibc/core/04-channel/types/query.pb.gw.go +++ b/x/ibc/core/04-channel/types/query.pb.gw.go @@ -1736,31 +1736,31 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } var ( - pattern_Query_Channel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6}, []string{"ibc", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_Channel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6, 1, 0, 4, 1, 5, 7}, []string{"ibc", "core", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_Channels_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"ibc", "channel", "v1beta1", "channels"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_Channels_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"ibc", "core", "channel", "v1beta1", "channels"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_ConnectionChannels_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"ibc", "channel", "v1beta1", "connections", "connection", "channels"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_ConnectionChannels_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"ibc", "core", "channel", "v1beta1", "connections", "connection", "channels"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_ChannelClientState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6, 2, 7}, []string{"ibc", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "client_state"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_ChannelClientState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6, 1, 0, 4, 1, 5, 7, 2, 8}, []string{"ibc", "core", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "client_state"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_ChannelConsensusState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6, 2, 7, 2, 8, 1, 0, 4, 1, 5, 9, 2, 10, 1, 0, 4, 1, 5, 11}, []string{"ibc", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "consensus_state", "version", "version_number", "height", "version_height"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_ChannelConsensusState_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6, 1, 0, 4, 1, 5, 7, 2, 8, 2, 9, 1, 0, 4, 1, 5, 10, 2, 11, 1, 0, 4, 1, 5, 12}, []string{"ibc", "core", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "consensus_state", "version", "version_number", "height", "version_height"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_PacketCommitment_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6, 2, 7, 1, 0, 4, 1, 5, 8}, []string{"ibc", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "packet_commitments", "sequence"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_PacketCommitment_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6, 1, 0, 4, 1, 5, 7, 2, 8, 1, 0, 4, 1, 5, 9}, []string{"ibc", "core", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "packet_commitments", "sequence"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_PacketCommitments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6, 2, 7}, []string{"ibc", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "packet_commitments"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_PacketCommitments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6, 1, 0, 4, 1, 5, 7, 2, 8}, []string{"ibc", "core", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "packet_commitments"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_PacketReceipt_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6, 2, 7, 1, 0, 4, 1, 5, 8}, []string{"ibc", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "packet_receipts", "sequence"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_PacketReceipt_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6, 1, 0, 4, 1, 5, 7, 2, 8, 1, 0, 4, 1, 5, 9}, []string{"ibc", "core", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "packet_receipts", "sequence"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_PacketAcknowledgement_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6, 2, 7, 1, 0, 4, 1, 5, 8}, []string{"ibc", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "packet_acks", "sequence"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_PacketAcknowledgement_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6, 1, 0, 4, 1, 5, 7, 2, 8, 1, 0, 4, 1, 5, 9}, []string{"ibc", "core", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "packet_acks", "sequence"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_PacketAcknowledgements_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6, 2, 7}, []string{"ibc", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "packet_acknowledgements"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_PacketAcknowledgements_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6, 1, 0, 4, 1, 5, 7, 2, 8}, []string{"ibc", "core", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "packet_acknowledgements"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_UnreceivedPackets_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6, 2, 7, 1, 0, 4, 1, 5, 8, 2, 9}, []string{"ibc", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "packet_commitments", "packet_commitment_sequences", "unreceived_packets"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_UnreceivedPackets_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6, 1, 0, 4, 1, 5, 7, 2, 8, 1, 0, 4, 1, 5, 9, 2, 10}, []string{"ibc", "core", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "packet_commitments", "packet_commitment_sequences", "unreceived_packets"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_UnreceivedAcks_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6, 2, 7, 1, 0, 4, 1, 5, 8, 2, 9}, []string{"ibc", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "packet_commitments", "packet_ack_sequences", "unreceived_acks"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_UnreceivedAcks_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6, 1, 0, 4, 1, 5, 7, 2, 8, 1, 0, 4, 1, 5, 9, 2, 10}, []string{"ibc", "core", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "packet_commitments", "packet_ack_sequences", "unreceived_acks"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Query_NextSequenceReceive_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5, 1, 0, 4, 1, 5, 6, 2, 7}, []string{"ibc", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "next_sequence"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_NextSequenceReceive_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6, 1, 0, 4, 1, 5, 7, 2, 8}, []string{"ibc", "core", "channel", "v1beta1", "channels", "channel_id", "ports", "port_id", "next_sequence"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( diff --git a/x/ibc/core/23-commitment/types/commitment.pb.go b/x/ibc/core/23-commitment/types/commitment.pb.go index bb28053e7..9634e2573 100644 --- a/x/ibc/core/23-commitment/types/commitment.pb.go +++ b/x/ibc/core/23-commitment/types/commitment.pb.go @@ -112,6 +112,7 @@ func (m *MerklePrefix) GetKeyPrefix() []byte { // MerklePath is the path used to verify commitment proofs, which can be an // arbitrary structured object (defined by a commitment type). +// MerklePath is represented from root-to-leaf type MerklePath struct { KeyPath []string `protobuf:"bytes,1,rep,name=key_path,json=keyPath,proto3" json:"key_path,omitempty" yaml:"key_path"` } @@ -159,6 +160,7 @@ func (m *MerklePath) GetKeyPath() []string { // It demonstrates membership or non-membership for an element or set of // elements, verifiable in conjunction with a known commitment root. Proofs // should be succinct. +// MerkleProofs are ordered from leaf-to-root type MerkleProof struct { Proofs []*_go.CommitmentProof `protobuf:"bytes,1,rep,name=proofs,proto3" json:"proofs,omitempty"` }