diff --git a/proto/ibc/core/client/v1/client.proto b/proto/ibc/core/client/v1/client.proto index 118318c246..a5d2b0f19e 100644 --- a/proto/ibc/core/client/v1/client.proto +++ b/proto/ibc/core/client/v1/client.proto @@ -6,91 +6,6 @@ option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types"; import "gogoproto/gogo.proto"; import "google/protobuf/any.proto"; -// Msg defines the ibc/client Msg service. -service Msg { - // CreateClient defines a rpc handler method for MsgCreateClient. - rpc CreateClient(MsgCreateClient) returns (MsgCreateClientResponse); - - // UpdateClient defines a rpc handler method for MsgUpdateClient. - rpc UpdateClient(MsgUpdateClient) returns (MsgUpdateClientResponse); - - // UpgradeClient defines a rpc handler method for MsgUpgradeClient. - rpc UpgradeClient(MsgUpgradeClient) returns (MsgUpgradeClientResponse); - - // SubmitMisbehaviour defines a rpc handler method for MsgSubmitMisbehaviour. - rpc SubmitMisbehaviour(MsgSubmitMisbehaviour) returns (MsgSubmitMisbehaviourResponse); -} - -// MsgCreateClient defines a message to create an IBC client -message MsgCreateClient { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // client unique identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // light client state - google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""]; - // consensus state associated with the client that corresponds to a given - // height. - google.protobuf.Any consensus_state = 3 [(gogoproto.moretags) = "yaml:\"consensus_state\""]; - // signer address - string signer = 4; -} - -// MsgCreateClientResponse defines the Msg/CreateClient response type. -message MsgCreateClientResponse { } - -// MsgUpdateClient defines an sdk.Msg to update a IBC client state using -// the given header. -message MsgUpdateClient { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // client unique identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // header to update the light client - google.protobuf.Any header = 2; - // signer address - string signer = 3; -} - -// MsgUpdateClientResponse defines the Msg/UpdateClient response type. -message MsgUpdateClientResponse { } - -// MsgUpgradeClient defines an sdk.Msg to upgrade an IBC client to a new client state -message MsgUpgradeClient { - // client unique identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // upgraded client state - google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""]; - // height at which old chain halts and upgrades (i.e last block executed) - Height upgrade_height = 3 [(gogoproto.moretags) = "yaml:\"upgrade_height\""]; - // proof that old chain committed to new client - bytes proof_upgrade = 4 [(gogoproto.moretags) = "yaml:\"proof_upgrade\""]; - // signer address - string signer = 5; -} - -// MsgUpgradeClientResponse defines the Msg/UpgradeClient response type. -message MsgUpgradeClientResponse { } - -// MsgSubmitMisbehaviour defines an sdk.Msg type that submits Evidence for -// light client misbehaviour. -message MsgSubmitMisbehaviour { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; - - // client unique identifier - string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; - // misbehaviour used for freezing the light client - google.protobuf.Any misbehaviour = 2; - // signer address - string signer = 3; -} - -// MsgSubmitMisbehaviourResponse defines the Msg/SubmitMisbehaviour response type. -message MsgSubmitMisbehaviourResponse { } - // IdentifiedClientState defines a client state with an additional client // identifier field. message IdentifiedClientState { @@ -151,3 +66,9 @@ message Height { // the height within the given version uint64 version_height = 2 [(gogoproto.moretags) = "yaml:\"version_height\""]; } + +// Params defines the set of IBC light client parameters. +message Params { + // allowed_clients defines the list of allowed client state types. + repeated string allowed_clients = 1 [(gogoproto.moretags) = "yaml:\"allowed_clients\""]; +} diff --git a/proto/ibc/core/client/v1/genesis.proto b/proto/ibc/core/client/v1/genesis.proto index 1041ca9448..110140e232 100644 --- a/proto/ibc/core/client/v1/genesis.proto +++ b/proto/ibc/core/client/v1/genesis.proto @@ -9,13 +9,17 @@ import "gogoproto/gogo.proto"; // GenesisState defines the ibc client submodule's genesis state. message GenesisState { // client states with their corresponding identifiers - repeated IdentifiedClientState clients = 1 [(gogoproto.nullable) = false]; + repeated IdentifiedClientState clients = 1 [ + (gogoproto.nullable) = false, + (gogoproto.castrepeated) = "IdentifiedClientStates" + ]; // consensus states from each client repeated ClientConsensusStates clients_consensus = 2 [ (gogoproto.nullable) = false, (gogoproto.castrepeated) = "ClientsConsensusStates", (gogoproto.moretags) = "yaml:\"clients_consensus\"" ]; + Params params = 3 [ (gogoproto.nullable) = false]; // create localhost on initialization - bool create_localhost = 3 [(gogoproto.moretags) = "yaml:\"create_localhost\""]; + bool create_localhost = 4 [(gogoproto.moretags) = "yaml:\"create_localhost\""]; } diff --git a/proto/ibc/core/client/v1/query.proto b/proto/ibc/core/client/v1/query.proto index db580a260c..038b97bc46 100644 --- a/proto/ibc/core/client/v1/query.proto +++ b/proto/ibc/core/client/v1/query.proto @@ -33,6 +33,11 @@ service Query { rpc ConsensusStates(QueryConsensusStatesRequest) returns (QueryConsensusStatesResponse) { option (google.api.http).get = "/ibc/core/client/v1beta1/consensus_states/{client_id}"; } + + // ClientParams queries all parameters of the ibc client. + rpc ClientParams(QueryClientParamsRequest) returns (QueryClientParamsResponse) { + option (google.api.http).get = "/ibc/client/v1beta1/params"; + } } // QueryClientStateRequest is the request type for the Query/ClientState RPC @@ -65,7 +70,10 @@ message QueryClientStatesRequest { // method. message QueryClientStatesResponse { // list of stored ClientStates of the chain. - repeated IdentifiedClientState client_states = 1; + repeated IdentifiedClientState client_states = 1 [ + (gogoproto.nullable) = false, + (gogoproto.castrepeated) = "IdentifiedClientStates" + ]; // pagination response cosmos.base.query.v1beta1.PageResponse pagination = 2; } @@ -113,3 +121,12 @@ message QueryConsensusStatesResponse { // pagination response cosmos.base.query.v1beta1.PageResponse pagination = 2; } + +// QueryClientParamsRequest is the request type for the Query/ClientParams RPC method. +message QueryClientParamsRequest {} + +// QueryClientParamsResponse is the response type for the Query/ClientParams RPC method. +message QueryClientParamsResponse { + // params defines the parameters of the module. + Params params = 1; +} diff --git a/proto/ibc/core/client/v1/tx.proto b/proto/ibc/core/client/v1/tx.proto new file mode 100644 index 0000000000..efe843cba4 --- /dev/null +++ b/proto/ibc/core/client/v1/tx.proto @@ -0,0 +1,93 @@ +syntax = "proto3"; +package ibc.core.client.v1; + +option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types"; + +import "gogoproto/gogo.proto"; +import "google/protobuf/any.proto"; +import "ibc/core/client/v1/client.proto"; + +// Msg defines the ibc/client Msg service. +service Msg { + // CreateClient defines a rpc handler method for MsgCreateClient. + rpc CreateClient(MsgCreateClient) returns (MsgCreateClientResponse); + + // UpdateClient defines a rpc handler method for MsgUpdateClient. + rpc UpdateClient(MsgUpdateClient) returns (MsgUpdateClientResponse); + + // UpgradeClient defines a rpc handler method for MsgUpgradeClient. + rpc UpgradeClient(MsgUpgradeClient) returns (MsgUpgradeClientResponse); + + // SubmitMisbehaviour defines a rpc handler method for MsgSubmitMisbehaviour. + rpc SubmitMisbehaviour(MsgSubmitMisbehaviour) returns (MsgSubmitMisbehaviourResponse); +} + +// MsgCreateClient defines a message to create an IBC client +message MsgCreateClient { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + // client unique identifier + string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; + // light client state + google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""]; + // consensus state associated with the client that corresponds to a given + // height. + google.protobuf.Any consensus_state = 3 [(gogoproto.moretags) = "yaml:\"consensus_state\""]; + // signer address + string signer = 4; +} + +// MsgCreateClientResponse defines the Msg/CreateClient response type. +message MsgCreateClientResponse { } + +// MsgUpdateClient defines an sdk.Msg to update a IBC client state using +// the given header. +message MsgUpdateClient { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + // client unique identifier + string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; + // header to update the light client + google.protobuf.Any header = 2; + // signer address + string signer = 3; +} + +// MsgUpdateClientResponse defines the Msg/UpdateClient response type. +message MsgUpdateClientResponse { } + +// MsgUpgradeClient defines an sdk.Msg to upgrade an IBC client to a new client state +message MsgUpgradeClient { + // client unique identifier + string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; + // upgraded client state + google.protobuf.Any client_state = 2 [(gogoproto.moretags) = "yaml:\"client_state\""]; + // height at which old chain halts and upgrades (i.e last block executed) + Height upgrade_height = 3 [(gogoproto.moretags) = "yaml:\"upgrade_height\""]; + // proof that old chain committed to new client + bytes proof_upgrade = 4 [(gogoproto.moretags) = "yaml:\"proof_upgrade\""]; + // signer address + string signer = 5; +} + +// MsgUpgradeClientResponse defines the Msg/UpgradeClient response type. +message MsgUpgradeClientResponse { } + +// MsgSubmitMisbehaviour defines an sdk.Msg type that submits Evidence for +// light client misbehaviour. +message MsgSubmitMisbehaviour { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + // client unique identifier + string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""]; + // misbehaviour used for freezing the light client + google.protobuf.Any misbehaviour = 2; + // signer address + string signer = 3; +} + +// MsgSubmitMisbehaviourResponse defines the Msg/SubmitMisbehaviour response type. +message MsgSubmitMisbehaviourResponse { } diff --git a/simapp/app.go b/simapp/app.go index a8c9e584be..8aaa007327 100644 --- a/simapp/app.go +++ b/simapp/app.go @@ -279,7 +279,7 @@ func NewSimApp( // Create IBC Keeper app.IBCKeeper = ibckeeper.NewKeeper( - appCodec, keys[ibchost.StoreKey], app.StakingKeeper, scopedIBCKeeper, + appCodec, keys[ibchost.StoreKey], app.GetSubspace(ibchost.ModuleName), app.StakingKeeper, scopedIBCKeeper, ) // register the proposal types @@ -609,6 +609,7 @@ func initParamsKeeper(appCodec codec.BinaryMarshaler, legacyAmino *codec.LegacyA paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govtypes.ParamKeyTable()) paramsKeeper.Subspace(crisistypes.ModuleName) paramsKeeper.Subspace(ibctransfertypes.ModuleName) + paramsKeeper.Subspace(ibchost.ModuleName) return paramsKeeper } diff --git a/x/ibc/applications/transfer/client/cli/cli.go b/x/ibc/applications/transfer/client/cli/cli.go index 9686afaa18..d3ca8341e9 100644 --- a/x/ibc/applications/transfer/client/cli/cli.go +++ b/x/ibc/applications/transfer/client/cli/cli.go @@ -18,6 +18,7 @@ func GetQueryCmd() *cobra.Command { queryCmd.AddCommand( GetCmdQueryDenomTrace(), GetCmdQueryDenomTraces(), + GetCmdParams(), ) return queryCmd diff --git a/x/ibc/applications/transfer/client/cli/query.go b/x/ibc/applications/transfer/client/cli/query.go index c0953d7ca6..3d158ed59a 100644 --- a/x/ibc/applications/transfer/client/cli/query.go +++ b/x/ibc/applications/transfer/client/cli/query.go @@ -86,8 +86,8 @@ func GetCmdQueryDenomTraces() *cobra.Command { return cmd } -// QueryParamsCmd returns the command handler for ibc-transfer parameter querying. -func QueryParamsCmd() *cobra.Command { +// GetCmdParams returns the command handler for ibc-transfer parameter querying. +func GetCmdParams() *cobra.Command { cmd := &cobra.Command{ Use: "params", Short: "Query the current ibc-transfer parameters", diff --git a/x/ibc/applications/transfer/handler_test.go b/x/ibc/applications/transfer/handler_test.go index fd6b686fe2..b1ee24f2ed 100644 --- a/x/ibc/applications/transfer/handler_test.go +++ b/x/ibc/applications/transfer/handler_test.go @@ -9,6 +9,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/ibc/applications/transfer/types" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" channeltypes "github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -31,7 +32,7 @@ func (suite *TransferTestSuite) SetupTest() { // constructs a send from chainA to chainB on the established channel/connection // and sends the same coin back from chainB to chainA. func (suite *TransferTestSuite) TestHandleMsgTransfer() { - clientA, clientB, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB := suite.coordinator.CreateTransferChannels(suite.chainA, suite.chainB, connA, connB, channeltypes.UNORDERED) originalBalance := suite.chainA.App.BankKeeper.GetBalance(suite.chainA.GetContext(), suite.chainA.SenderAccount.GetAddress(), sdk.DefaultBondDenom) timeoutHeight := clienttypes.NewHeight(0, 110) diff --git a/x/ibc/applications/transfer/keeper/relay_test.go b/x/ibc/applications/transfer/keeper/relay_test.go index 738de9e80a..7878c59357 100644 --- a/x/ibc/applications/transfer/keeper/relay_test.go +++ b/x/ibc/applications/transfer/keeper/relay_test.go @@ -8,6 +8,7 @@ import ( clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" channeltypes "github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types" host "github.com/cosmos/cosmos-sdk/x/ibc/core/24-host" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -28,28 +29,28 @@ func (suite *KeeperTestSuite) TestSendTransfer() { }{ {"successful transfer from source chain", func() { - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB = suite.coordinator.CreateTransferChannels(suite.chainA, suite.chainB, connA, connB, channeltypes.UNORDERED) amount = sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)) }, true, true}, {"successful transfer with coin from counterparty chain", func() { // send coin from chainA back to chainB - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB = suite.coordinator.CreateTransferChannels(suite.chainA, suite.chainB, connA, connB, channeltypes.UNORDERED) amount = types.GetTransferCoin(channelA.PortID, channelA.ID, sdk.DefaultBondDenom, 100) }, false, true}, {"source channel not found", func() { // channel references wrong ID - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB = suite.coordinator.CreateTransferChannels(suite.chainA, suite.chainB, connA, connB, channeltypes.UNORDERED) channelA.ID = ibctesting.InvalidID amount = sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100)) }, true, false}, {"next seq send not found", func() { - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA = connA.NextTestChannel(ibctesting.TransferPort) channelB = connB.NextTestChannel(ibctesting.TransferPort) // manually create channel so next seq send is never set @@ -66,20 +67,20 @@ func (suite *KeeperTestSuite) TestSendTransfer() { // - source chain {"send coin failed", func() { - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB = suite.coordinator.CreateTransferChannels(suite.chainA, suite.chainB, connA, connB, channeltypes.UNORDERED) amount = sdk.NewCoin("randomdenom", sdk.NewInt(100)) }, true, false}, // - receiving chain {"send from module account failed", func() { - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB = suite.coordinator.CreateTransferChannels(suite.chainA, suite.chainB, connA, connB, channeltypes.UNORDERED) amount = types.GetTransferCoin(channelA.PortID, channelA.ID, " randomdenom", 100) }, false, false}, {"channel capability not found", func() { - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB = suite.coordinator.CreateTransferChannels(suite.chainA, suite.chainB, connA, connB, channeltypes.UNORDERED) cap := suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) @@ -177,7 +178,7 @@ func (suite *KeeperTestSuite) TestOnRecvPacket() { suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { suite.SetupTest() // reset - clientA, clientB, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB = suite.coordinator.CreateTransferChannels(suite.chainA, suite.chainB, connA, connB, channeltypes.UNORDERED) receiver = suite.chainB.SenderAccount.GetAddress().String() // must be explicitly changed in malleate @@ -365,7 +366,7 @@ func (suite *KeeperTestSuite) TestOnTimeoutPacket() { suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { suite.SetupTest() // reset - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB = suite.coordinator.CreateTransferChannels(suite.chainA, suite.chainB, connA, connB, channeltypes.UNORDERED) amount = sdk.NewInt(100) // must be explicitly changed sender = suite.chainA.SenderAccount.GetAddress().String() diff --git a/x/ibc/applications/transfer/module_test.go b/x/ibc/applications/transfer/module_test.go index 7f3cec0bde..b0d0fd10e4 100644 --- a/x/ibc/applications/transfer/module_test.go +++ b/x/ibc/applications/transfer/module_test.go @@ -5,6 +5,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/ibc/applications/transfer/types" channeltypes "github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types" host "github.com/cosmos/cosmos-sdk/x/ibc/core/24-host" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -54,7 +55,7 @@ func (suite *TransferTestSuite) TestOnChanOpenInit() { suite.Run(tc.name, func() { suite.SetupTest() // reset - _, _, connA, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) testChannel = connA.NextTestChannel(ibctesting.TransferPort) counterparty := channeltypes.NewCounterparty(testChannel.PortID, testChannel.ID) channel = &channeltypes.Channel{ @@ -142,7 +143,7 @@ func (suite *TransferTestSuite) TestOnChanOpenTry() { suite.Run(tc.name, func() { suite.SetupTest() // reset - _, _, connA, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) testChannel = connA.NextTestChannel(ibctesting.TransferPort) counterparty := channeltypes.NewCounterparty(testChannel.PortID, testChannel.ID) channel = &channeltypes.Channel{ @@ -208,7 +209,7 @@ func (suite *TransferTestSuite) TestOnChanOpenAck() { suite.Run(tc.name, func() { suite.SetupTest() // reset - _, _, connA, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) testChannel = connA.NextTestChannel(ibctesting.TransferPort) counterpartyVersion = types.Version diff --git a/x/ibc/core/02-client/client/cli/cli.go b/x/ibc/core/02-client/client/cli/cli.go index 32aafc82c7..375d8f6369 100644 --- a/x/ibc/core/02-client/client/cli/cli.go +++ b/x/ibc/core/02-client/client/cli/cli.go @@ -24,6 +24,7 @@ func GetQueryCmd() *cobra.Command { GetCmdQueryConsensusState(), GetCmdQueryHeader(), GetCmdNodeConsensusState(), + GetCmdParams(), ) return queryCmd diff --git a/x/ibc/core/02-client/client/cli/query.go b/x/ibc/core/02-client/client/cli/query.go index 9d4ad4c19d..0140cb7850 100644 --- a/x/ibc/core/02-client/client/cli/query.go +++ b/x/ibc/core/02-client/client/cli/query.go @@ -250,3 +250,30 @@ func GetCmdNodeConsensusState() *cobra.Command { return cmd } + +// GetCmdParams returns the command handler for ibc client parameter querying. +func GetCmdParams() *cobra.Command { + cmd := &cobra.Command{ + Use: "params", + Short: "Query the current ibc client parameters", + Long: "Query the current ibc client parameters", + Args: cobra.NoArgs, + Example: fmt.Sprintf("%s query %s %s params", version.AppName, host.ModuleName, types.SubModuleName), + RunE: func(cmd *cobra.Command, _ []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + clientCtx, err := client.ReadQueryCommandFlags(clientCtx, cmd.Flags()) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + res, _ := queryClient.ClientParams(context.Background(), &types.QueryClientParamsRequest{}) + return clientCtx.PrintOutput(res.Params) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/ibc/core/02-client/genesis.go b/x/ibc/core/02-client/genesis.go index cda4f7ed7f..988e297c18 100644 --- a/x/ibc/core/02-client/genesis.go +++ b/x/ibc/core/02-client/genesis.go @@ -13,12 +13,18 @@ import ( // InitGenesis initializes the ibc client submodule's state from a provided genesis // state. func InitGenesis(ctx sdk.Context, k keeper.Keeper, gs types.GenesisState) { + k.SetParams(ctx, gs.Params) + for _, client := range gs.Clients { cs, ok := client.ClientState.GetCachedValue().(exported.ClientState) if !ok { panic("invalid client state") } + if !gs.Params.IsAllowedClient(cs.ClientType()) { + panic(fmt.Sprintf("client state type %s is not registered on the allowlist", cs.ClientType())) + } + k.SetClientState(ctx, client.ClientId, cs) } @@ -49,6 +55,10 @@ func InitGenesis(ctx sdk.Context, k keeper.Keeper, gs types.GenesisState) { ctx.ChainID(), types.NewHeight(version, uint64(ctx.BlockHeight())), ) + if err := clientState.Validate(); err != nil { + panic(err) + } + if err := k.CreateClient(ctx, exported.Localhost, clientState, nil); err != nil { panic(err) } @@ -61,6 +71,7 @@ func ExportGenesis(ctx sdk.Context, k keeper.Keeper) types.GenesisState { return types.GenesisState{ Clients: k.GetAllGenesisClients(ctx), ClientsConsensus: k.GetAllConsensusStates(ctx), + Params: k.GetParams(ctx), CreateLocalhost: false, } } diff --git a/x/ibc/core/02-client/keeper/client.go b/x/ibc/core/02-client/keeper/client.go index 49e9c62c88..83ecedc535 100644 --- a/x/ibc/core/02-client/keeper/client.go +++ b/x/ibc/core/02-client/keeper/client.go @@ -17,6 +17,14 @@ import ( func (k Keeper) CreateClient( ctx sdk.Context, clientID string, clientState exported.ClientState, consensusState exported.ConsensusState, ) error { + params := k.GetParams(ctx) + if !params.IsAllowedClient(clientState.ClientType()) { + return sdkerrors.Wrapf( + types.ErrInvalidClientType, + "client state type %s is not registered in the allowlist", clientState.ClientType(), + ) + } + _, found := k.GetClientState(ctx, clientID) if found { return sdkerrors.Wrapf(types.ErrClientExists, "cannot create client with ID %s", clientID) diff --git a/x/ibc/core/02-client/keeper/client_test.go b/x/ibc/core/02-client/keeper/client_test.go index 30528b88ca..0c700f907c 100644 --- a/x/ibc/core/02-client/keeper/client_test.go +++ b/x/ibc/core/02-client/keeper/client_test.go @@ -261,7 +261,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -286,7 +286,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -313,7 +313,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -345,7 +345,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() { upgradedClient = ibctmtypes.NewClientState("wrongchainID", ibctmtypes.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, newClientHeight, ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, true, true) suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -359,7 +359,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() { for _, tc := range testCases { tc := tc - clientA, _ = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) tc.setup() diff --git a/x/ibc/core/02-client/keeper/grpc_query.go b/x/ibc/core/02-client/keeper/grpc_query.go index 8bb5306897..9f4bb6c808 100644 --- a/x/ibc/core/02-client/keeper/grpc_query.go +++ b/x/ibc/core/02-client/keeper/grpc_query.go @@ -3,6 +3,7 @@ package keeper import ( "context" "fmt" + "sort" "strings" "google.golang.org/grpc/codes" @@ -58,7 +59,7 @@ func (q Keeper) ClientStates(c context.Context, req *types.QueryClientStatesRequ ctx := sdk.UnwrapSDKContext(c) - clientStates := []*types.IdentifiedClientState{} + clientStates := types.IdentifiedClientStates{} store := prefix.NewStore(ctx.KVStore(q.storeKey), host.KeyClientStorePrefix) pageRes, err := query.Paginate(store, req.Pagination, func(key, value []byte) error { @@ -78,7 +79,7 @@ func (q Keeper) ClientStates(c context.Context, req *types.QueryClientStatesRequ } identifiedClient := types.NewIdentifiedClientState(clientID, clientState) - clientStates = append(clientStates, &identifiedClient) + clientStates = append(clientStates, identifiedClient) return nil }) @@ -86,6 +87,8 @@ func (q Keeper) ClientStates(c context.Context, req *types.QueryClientStatesRequ return nil, err } + sort.Sort(clientStates) + return &types.QueryClientStatesResponse{ ClientStates: clientStates, Pagination: pageRes, @@ -178,3 +181,13 @@ func (q Keeper) ConsensusStates(c context.Context, req *types.QueryConsensusStat Pagination: pageRes, }, nil } + +// ClientParams implements the Query/ClientParams gRPC method +func (q Keeper) ClientParams(c context.Context, _ *types.QueryClientParamsRequest) (*types.QueryClientParamsResponse, error) { + ctx := sdk.UnwrapSDKContext(c) + params := q.GetParams(ctx) + + return &types.QueryClientParamsResponse{ + Params: ¶ms, + }, nil +} diff --git a/x/ibc/core/02-client/keeper/grpc_query_test.go b/x/ibc/core/02-client/keeper/grpc_query_test.go index b99d290f84..d111f540a9 100644 --- a/x/ibc/core/02-client/keeper/grpc_query_test.go +++ b/x/ibc/core/02-client/keeper/grpc_query_test.go @@ -82,7 +82,7 @@ func (suite *KeeperTestSuite) TestQueryClientState() { func (suite *KeeperTestSuite) TestQueryClientStates() { var ( req *types.QueryClientStatesRequest - expClientStates = []*types.IdentifiedClientState(nil) + expClientStates = types.IdentifiedClientStates{} ) testCases := []struct { @@ -112,8 +112,8 @@ func (suite *KeeperTestSuite) TestQueryClientStates() { { "success", func() { - clientA1, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) - clientA2, _ := suite.coordinator.CreateClient(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA1, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) + clientA2, _ := suite.coordinator.CreateClient(suite.chainA, suite.chainB, exported.Tendermint) clientStateA1 := suite.chainA.GetClientState(clientA1) clientStateA2 := suite.chainA.GetClientState(clientA2) @@ -122,7 +122,7 @@ func (suite *KeeperTestSuite) TestQueryClientStates() { idcs2 := types.NewIdentifiedClientState(clientA2, clientStateA2) // order is sorted by client id, localhost is last - expClientStates = []*types.IdentifiedClientState{&idcs, &idcs2} + expClientStates = types.IdentifiedClientStates{idcs, idcs2}.Sort() req = &types.QueryClientStatesRequest{ Pagination: &query.PageRequest{ Limit: 7, @@ -144,7 +144,7 @@ func (suite *KeeperTestSuite) TestQueryClientStates() { // always add localhost which is created by default in init genesis localhostClientState := suite.chainA.GetClientState(exported.Localhost) identifiedLocalhost := types.NewIdentifiedClientState(exported.Localhost, localhostClientState) - expClientStates = append(expClientStates, &identifiedLocalhost) + expClientStates = append(expClientStates, identifiedLocalhost) ctx := sdk.WrapSDKContext(suite.chainA.GetContext()) @@ -153,12 +153,7 @@ func (suite *KeeperTestSuite) TestQueryClientStates() { if tc.expPass { suite.Require().NoError(err) suite.Require().NotNil(res) - suite.Require().Equal(len(expClientStates), len(res.ClientStates)) - for i := range expClientStates { - suite.Require().Equal(expClientStates[i].ClientId, res.ClientStates[i].ClientId) - suite.Require().NotNil(res.ClientStates[i].ClientState) - suite.Require().Equal(expClientStates[i].ClientState, res.ClientStates[i].ClientState) - } + suite.Require().Equal(expClientStates.Sort(), res.ClientStates) } else { suite.Require().Error(err) } @@ -364,3 +359,10 @@ func (suite *KeeperTestSuite) TestQueryConsensusStates() { }) } } + +func (suite *KeeperTestSuite) TestQueryParams() { + ctx := sdk.WrapSDKContext(suite.chainA.GetContext()) + expParams := types.DefaultParams() + res, _ := suite.queryClient.ClientParams(ctx, &types.QueryClientParamsRequest{}) + suite.Require().Equal(&expParams, res.Params) +} diff --git a/x/ibc/core/02-client/keeper/keeper.go b/x/ibc/core/02-client/keeper/keeper.go index 7c68499f8a..96632fc171 100644 --- a/x/ibc/core/02-client/keeper/keeper.go +++ b/x/ibc/core/02-client/keeper/keeper.go @@ -18,6 +18,7 @@ import ( host "github.com/cosmos/cosmos-sdk/x/ibc/core/24-host" "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" ibctmtypes "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/07-tendermint/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" ) @@ -26,14 +27,21 @@ import ( type Keeper struct { storeKey sdk.StoreKey cdc codec.BinaryMarshaler + paramSpace paramtypes.Subspace stakingKeeper types.StakingKeeper } // NewKeeper creates a new NewKeeper instance -func NewKeeper(cdc codec.BinaryMarshaler, key sdk.StoreKey, sk types.StakingKeeper) Keeper { +func NewKeeper(cdc codec.BinaryMarshaler, key sdk.StoreKey, paramSpace paramtypes.Subspace, sk types.StakingKeeper) Keeper { + // set KeyTable if it has not already been set + if !paramSpace.HasKeyTable() { + paramSpace = paramSpace.WithKeyTable(types.ParamKeyTable()) + } + return Keeper{ storeKey: key, cdc: cdc, + paramSpace: paramSpace, stakingKeeper: sk, } } @@ -107,12 +115,14 @@ func (k Keeper) IterateConsensusStates(ctx sdk.Context, cb func(clientID string, } // GetAllGenesisClients returns all the clients in state with their client ids returned as IdentifiedClientState -func (k Keeper) GetAllGenesisClients(ctx sdk.Context) (genClients []types.IdentifiedClientState) { +func (k Keeper) GetAllGenesisClients(ctx sdk.Context) types.IdentifiedClientStates { + var genClients types.IdentifiedClientStates k.IterateClients(ctx, func(clientID string, cs exported.ClientState) bool { genClients = append(genClients, types.NewIdentifiedClientState(clientID, cs)) return false }) - return + + return genClients.Sort() } // GetAllConsensusStates returns all stored client consensus states. diff --git a/x/ibc/core/02-client/keeper/keeper_test.go b/x/ibc/core/02-client/keeper/keeper_test.go index d5e162b09e..1f2c09ac5f 100644 --- a/x/ibc/core/02-client/keeper/keeper_test.go +++ b/x/ibc/core/02-client/keeper/keeper_test.go @@ -243,30 +243,6 @@ func (suite *KeeperTestSuite) TestValidateSelfClient() { } } -func (suite KeeperTestSuite) TestGetAllClients() { - clientIDs := []string{ - testClientID2, testClientID3, testClientID, - } - expClients := []exported.ClientState{ - ibctmtypes.NewClientState(testChainID, ibctmtypes.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, types.ZeroHeight(), ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false), - ibctmtypes.NewClientState(testChainID, ibctmtypes.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, types.ZeroHeight(), ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false), - ibctmtypes.NewClientState(testChainID, ibctmtypes.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, types.ZeroHeight(), ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false), - } - - for i := range expClients { - suite.chainA.App.IBCKeeper.ClientKeeper.SetClientState(suite.chainA.GetContext(), clientIDs[i], expClients[i]) - } - - // add localhost client - localHostClient, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), exported.Localhost) - suite.Require().True(found) - expClients = append(expClients, localHostClient) - - clients := suite.chainA.App.IBCKeeper.ClientKeeper.GetAllClients(suite.chainA.GetContext()) - suite.Require().Len(clients, len(expClients)) - suite.Require().Equal(expClients, clients) -} - func (suite KeeperTestSuite) TestGetAllGenesisClients() { clientIDs := []string{ testClientID2, testClientID3, testClientID, @@ -277,7 +253,7 @@ func (suite KeeperTestSuite) TestGetAllGenesisClients() { ibctmtypes.NewClientState(testChainID, ibctmtypes.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, types.ZeroHeight(), ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false), } - expGenClients := make([]types.IdentifiedClientState, len(expClients)) + expGenClients := make(types.IdentifiedClientStates, len(expClients)) for i := range expClients { suite.chainA.App.IBCKeeper.ClientKeeper.SetClientState(suite.chainA.GetContext(), clientIDs[i], expClients[i]) @@ -291,7 +267,7 @@ func (suite KeeperTestSuite) TestGetAllGenesisClients() { genClients := suite.chainA.App.IBCKeeper.ClientKeeper.GetAllGenesisClients(suite.chainA.GetContext()) - suite.Require().Equal(expGenClients, genClients) + suite.Require().Equal(expGenClients.Sort(), genClients) } func (suite KeeperTestSuite) TestGetConsensusState() { @@ -347,7 +323,7 @@ func (suite KeeperTestSuite) TestConsensusStateHelpers() { // 2 clients in total are created on chainA. The first client is updated so it contains an initial consensus state // and a consensus state at the update height. func (suite KeeperTestSuite) TestGetAllConsensusStates() { - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState := suite.chainA.GetClientState(clientA) expConsensusHeight0 := clientState.GetLatestHeight() @@ -355,7 +331,7 @@ func (suite KeeperTestSuite) TestGetAllConsensusStates() { suite.Require().True(ok) // update client to create a second consensus state - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) clientState = suite.chainA.GetClientState(clientA) @@ -370,7 +346,7 @@ func (suite KeeperTestSuite) TestGetAllConsensusStates() { } // create second client on chainA - clientA2, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA2, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState = suite.chainA.GetClientState(clientA2) expConsensusHeight2 := clientState.GetLatestHeight() diff --git a/x/ibc/core/02-client/keeper/params.go b/x/ibc/core/02-client/keeper/params.go new file mode 100644 index 0000000000..04f4a25637 --- /dev/null +++ b/x/ibc/core/02-client/keeper/params.go @@ -0,0 +1,23 @@ +package keeper + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" +) + +// GetAllowedClients retrieves the receive enabled boolean from the paramstore +func (k Keeper) GetAllowedClients(ctx sdk.Context) []string { + var res []string + k.paramSpace.Get(ctx, types.KeyAllowedClients, &res) + return res +} + +// GetParams returns the total set of ibc-transfer parameters. +func (k Keeper) GetParams(ctx sdk.Context) types.Params { + return types.NewParams(k.GetAllowedClients(ctx)...) +} + +// SetParams sets the total set of ibc-transfer parameters. +func (k Keeper) SetParams(ctx sdk.Context, params types.Params) { + k.paramSpace.SetParamSet(ctx, ¶ms) +} diff --git a/x/ibc/core/02-client/keeper/params_test.go b/x/ibc/core/02-client/keeper/params_test.go new file mode 100644 index 0000000000..9df0859710 --- /dev/null +++ b/x/ibc/core/02-client/keeper/params_test.go @@ -0,0 +1,17 @@ +package keeper_test + +import ( + "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" +) + +func (suite *KeeperTestSuite) TestParams() { + expParams := types.DefaultParams() + + params := suite.chainA.App.IBCKeeper.ClientKeeper.GetParams(suite.chainA.GetContext()) + suite.Require().Equal(expParams, params) + + expParams.AllowedClients = []string{} + suite.chainA.App.IBCKeeper.ClientKeeper.SetParams(suite.chainA.GetContext(), expParams) + params = suite.chainA.App.IBCKeeper.ClientKeeper.GetParams(suite.chainA.GetContext()) + suite.Require().Empty(expParams.AllowedClients) +} diff --git a/x/ibc/core/02-client/keeper/proposal_test.go b/x/ibc/core/02-client/keeper/proposal_test.go index ea5cd372fa..ada205402b 100644 --- a/x/ibc/core/02-client/keeper/proposal_test.go +++ b/x/ibc/core/02-client/keeper/proposal_test.go @@ -21,7 +21,7 @@ func (suite *KeeperTestSuite) TestClientUpdateProposal() { }{ { "valid update client proposal", func() { - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState := suite.chainA.GetClientState(clientA) tmClientState, ok := clientState.(*ibctmtypes.ClientState) @@ -58,14 +58,14 @@ func (suite *KeeperTestSuite) TestClientUpdateProposal() { }, { "cannot unpack header, header is nil", func() { - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) content = &clienttypes.ClientUpdateProposal{ibctesting.Title, ibctesting.Description, clientA, nil} }, false, }, { "update fails", func() { header := &ibctmtypes.Header{} - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) content, err = clienttypes.NewClientUpdateProposal(ibctesting.Title, ibctesting.Description, clientA, header) suite.Require().NoError(err) }, false, diff --git a/x/ibc/core/02-client/proposal_handler_test.go b/x/ibc/core/02-client/proposal_handler_test.go index 839dd2e532..91c1451b70 100644 --- a/x/ibc/core/02-client/proposal_handler_test.go +++ b/x/ibc/core/02-client/proposal_handler_test.go @@ -6,6 +6,7 @@ import ( govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" client "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" ibctmtypes "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/07-tendermint/types" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -23,7 +24,7 @@ func (suite *ClientTestSuite) TestNewClientUpdateProposalHandler() { }{ { "valid update client proposal", func() { - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState := suite.chainA.GetClientState(clientA) tmClientState, ok := clientState.(*ibctmtypes.ClientState) diff --git a/x/ibc/core/02-client/types/client.go b/x/ibc/core/02-client/types/client.go index 99fe98e19e..305b07cec4 100644 --- a/x/ibc/core/02-client/types/client.go +++ b/x/ibc/core/02-client/types/client.go @@ -2,6 +2,7 @@ package types import ( "fmt" + "sort" proto "github.com/gogo/protobuf/proto" @@ -37,6 +38,26 @@ func (ics IdentifiedClientState) UnpackInterfaces(unpacker codectypes.AnyUnpacke return unpacker.UnpackAny(ics.ClientState, new(exported.ClientState)) } +var _ sort.Interface = IdentifiedClientStates{} + +// IdentifiedClientStates defines a slice of ClientConsensusStates that supports the sort interface +type IdentifiedClientStates []IdentifiedClientState + +// Len implements sort.Interface +func (ics IdentifiedClientStates) Len() int { return len(ics) } + +// Less implements sort.Interface +func (ics IdentifiedClientStates) Less(i, j int) bool { return ics[i].ClientId < ics[j].ClientId } + +// Swap implements sort.Interface +func (ics IdentifiedClientStates) Swap(i, j int) { ics[i], ics[j] = ics[j], ics[i] } + +// Sort is a helper function to sort the set of IdentifiedClientStates in place +func (ics IdentifiedClientStates) Sort() IdentifiedClientStates { + sort.Sort(ics) + return ics +} + // NewConsensusStateWithHeight creates a new ConsensusStateWithHeight instance func NewConsensusStateWithHeight(height Height, consensusState exported.ConsensusState) ConsensusStateWithHeight { msg, ok := consensusState.(proto.Message) diff --git a/x/ibc/core/02-client/types/client.pb.go b/x/ibc/core/02-client/types/client.pb.go index aa9bd5c3d3..95fc58c339 100644 --- a/x/ibc/core/02-client/types/client.pb.go +++ b/x/ibc/core/02-client/types/client.pb.go @@ -4,15 +4,10 @@ package types import ( - context "context" fmt "fmt" types "github.com/cosmos/cosmos-sdk/codec/types" _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" io "io" math "math" math_bits "math/bits" @@ -29,370 +24,6 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// MsgCreateClient defines a message to create an IBC client -type MsgCreateClient struct { - // client unique identifier - ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty" yaml:"client_id"` - // light client state - ClientState *types.Any `protobuf:"bytes,2,opt,name=client_state,json=clientState,proto3" json:"client_state,omitempty" yaml:"client_state"` - // consensus state associated with the client that corresponds to a given - // height. - ConsensusState *types.Any `protobuf:"bytes,3,opt,name=consensus_state,json=consensusState,proto3" json:"consensus_state,omitempty" yaml:"consensus_state"` - // signer address - Signer string `protobuf:"bytes,4,opt,name=signer,proto3" json:"signer,omitempty"` -} - -func (m *MsgCreateClient) Reset() { *m = MsgCreateClient{} } -func (m *MsgCreateClient) String() string { return proto.CompactTextString(m) } -func (*MsgCreateClient) ProtoMessage() {} -func (*MsgCreateClient) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{0} -} -func (m *MsgCreateClient) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgCreateClient) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgCreateClient.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 *MsgCreateClient) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgCreateClient.Merge(m, src) -} -func (m *MsgCreateClient) XXX_Size() int { - return m.Size() -} -func (m *MsgCreateClient) XXX_DiscardUnknown() { - xxx_messageInfo_MsgCreateClient.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgCreateClient proto.InternalMessageInfo - -// MsgCreateClientResponse defines the Msg/CreateClient response type. -type MsgCreateClientResponse struct { -} - -func (m *MsgCreateClientResponse) Reset() { *m = MsgCreateClientResponse{} } -func (m *MsgCreateClientResponse) String() string { return proto.CompactTextString(m) } -func (*MsgCreateClientResponse) ProtoMessage() {} -func (*MsgCreateClientResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{1} -} -func (m *MsgCreateClientResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgCreateClientResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgCreateClientResponse.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 *MsgCreateClientResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgCreateClientResponse.Merge(m, src) -} -func (m *MsgCreateClientResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgCreateClientResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgCreateClientResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgCreateClientResponse proto.InternalMessageInfo - -// MsgUpdateClient defines an sdk.Msg to update a IBC client state using -// the given header. -type MsgUpdateClient struct { - // client unique identifier - ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty" yaml:"client_id"` - // header to update the light client - Header *types.Any `protobuf:"bytes,2,opt,name=header,proto3" json:"header,omitempty"` - // signer address - Signer string `protobuf:"bytes,3,opt,name=signer,proto3" json:"signer,omitempty"` -} - -func (m *MsgUpdateClient) Reset() { *m = MsgUpdateClient{} } -func (m *MsgUpdateClient) String() string { return proto.CompactTextString(m) } -func (*MsgUpdateClient) ProtoMessage() {} -func (*MsgUpdateClient) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{2} -} -func (m *MsgUpdateClient) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgUpdateClient) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgUpdateClient.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 *MsgUpdateClient) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgUpdateClient.Merge(m, src) -} -func (m *MsgUpdateClient) XXX_Size() int { - return m.Size() -} -func (m *MsgUpdateClient) XXX_DiscardUnknown() { - xxx_messageInfo_MsgUpdateClient.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgUpdateClient proto.InternalMessageInfo - -// MsgUpdateClientResponse defines the Msg/UpdateClient response type. -type MsgUpdateClientResponse struct { -} - -func (m *MsgUpdateClientResponse) Reset() { *m = MsgUpdateClientResponse{} } -func (m *MsgUpdateClientResponse) String() string { return proto.CompactTextString(m) } -func (*MsgUpdateClientResponse) ProtoMessage() {} -func (*MsgUpdateClientResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{3} -} -func (m *MsgUpdateClientResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgUpdateClientResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgUpdateClientResponse.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 *MsgUpdateClientResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgUpdateClientResponse.Merge(m, src) -} -func (m *MsgUpdateClientResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgUpdateClientResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgUpdateClientResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgUpdateClientResponse proto.InternalMessageInfo - -// MsgUpgradeClient defines an sdk.Msg to upgrade an IBC client to a new client state -type MsgUpgradeClient struct { - // client unique identifier - ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty" yaml:"client_id"` - // upgraded client state - ClientState *types.Any `protobuf:"bytes,2,opt,name=client_state,json=clientState,proto3" json:"client_state,omitempty" yaml:"client_state"` - // height at which old chain halts and upgrades (i.e last block executed) - UpgradeHeight *Height `protobuf:"bytes,3,opt,name=upgrade_height,json=upgradeHeight,proto3" json:"upgrade_height,omitempty" yaml:"upgrade_height"` - // proof that old chain committed to new client - ProofUpgrade []byte `protobuf:"bytes,4,opt,name=proof_upgrade,json=proofUpgrade,proto3" json:"proof_upgrade,omitempty" yaml:"proof_upgrade"` - // signer address - Signer string `protobuf:"bytes,5,opt,name=signer,proto3" json:"signer,omitempty"` -} - -func (m *MsgUpgradeClient) Reset() { *m = MsgUpgradeClient{} } -func (m *MsgUpgradeClient) String() string { return proto.CompactTextString(m) } -func (*MsgUpgradeClient) ProtoMessage() {} -func (*MsgUpgradeClient) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{4} -} -func (m *MsgUpgradeClient) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgUpgradeClient) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgUpgradeClient.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 *MsgUpgradeClient) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgUpgradeClient.Merge(m, src) -} -func (m *MsgUpgradeClient) XXX_Size() int { - return m.Size() -} -func (m *MsgUpgradeClient) XXX_DiscardUnknown() { - xxx_messageInfo_MsgUpgradeClient.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgUpgradeClient proto.InternalMessageInfo - -func (m *MsgUpgradeClient) GetClientId() string { - if m != nil { - return m.ClientId - } - return "" -} - -func (m *MsgUpgradeClient) GetClientState() *types.Any { - if m != nil { - return m.ClientState - } - return nil -} - -func (m *MsgUpgradeClient) GetUpgradeHeight() *Height { - if m != nil { - return m.UpgradeHeight - } - return nil -} - -func (m *MsgUpgradeClient) GetProofUpgrade() []byte { - if m != nil { - return m.ProofUpgrade - } - return nil -} - -func (m *MsgUpgradeClient) GetSigner() string { - if m != nil { - return m.Signer - } - return "" -} - -// MsgUpgradeClientResponse defines the Msg/UpgradeClient response type. -type MsgUpgradeClientResponse struct { -} - -func (m *MsgUpgradeClientResponse) Reset() { *m = MsgUpgradeClientResponse{} } -func (m *MsgUpgradeClientResponse) String() string { return proto.CompactTextString(m) } -func (*MsgUpgradeClientResponse) ProtoMessage() {} -func (*MsgUpgradeClientResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{5} -} -func (m *MsgUpgradeClientResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgUpgradeClientResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgUpgradeClientResponse.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 *MsgUpgradeClientResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgUpgradeClientResponse.Merge(m, src) -} -func (m *MsgUpgradeClientResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgUpgradeClientResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgUpgradeClientResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgUpgradeClientResponse proto.InternalMessageInfo - -// MsgSubmitMisbehaviour defines an sdk.Msg type that submits Evidence for -// light client misbehaviour. -type MsgSubmitMisbehaviour struct { - // client unique identifier - ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty" yaml:"client_id"` - // misbehaviour used for freezing the light client - Misbehaviour *types.Any `protobuf:"bytes,2,opt,name=misbehaviour,proto3" json:"misbehaviour,omitempty"` - // signer address - Signer string `protobuf:"bytes,3,opt,name=signer,proto3" json:"signer,omitempty"` -} - -func (m *MsgSubmitMisbehaviour) Reset() { *m = MsgSubmitMisbehaviour{} } -func (m *MsgSubmitMisbehaviour) String() string { return proto.CompactTextString(m) } -func (*MsgSubmitMisbehaviour) ProtoMessage() {} -func (*MsgSubmitMisbehaviour) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{6} -} -func (m *MsgSubmitMisbehaviour) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgSubmitMisbehaviour) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgSubmitMisbehaviour.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 *MsgSubmitMisbehaviour) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgSubmitMisbehaviour.Merge(m, src) -} -func (m *MsgSubmitMisbehaviour) XXX_Size() int { - return m.Size() -} -func (m *MsgSubmitMisbehaviour) XXX_DiscardUnknown() { - xxx_messageInfo_MsgSubmitMisbehaviour.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgSubmitMisbehaviour proto.InternalMessageInfo - -// MsgSubmitMisbehaviourResponse defines the Msg/SubmitMisbehaviour response type. -type MsgSubmitMisbehaviourResponse struct { -} - -func (m *MsgSubmitMisbehaviourResponse) Reset() { *m = MsgSubmitMisbehaviourResponse{} } -func (m *MsgSubmitMisbehaviourResponse) String() string { return proto.CompactTextString(m) } -func (*MsgSubmitMisbehaviourResponse) ProtoMessage() {} -func (*MsgSubmitMisbehaviourResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{7} -} -func (m *MsgSubmitMisbehaviourResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgSubmitMisbehaviourResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgSubmitMisbehaviourResponse.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 *MsgSubmitMisbehaviourResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgSubmitMisbehaviourResponse.Merge(m, src) -} -func (m *MsgSubmitMisbehaviourResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgSubmitMisbehaviourResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgSubmitMisbehaviourResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgSubmitMisbehaviourResponse proto.InternalMessageInfo - // IdentifiedClientState defines a client state with an additional client // identifier field. type IdentifiedClientState struct { @@ -406,7 +37,7 @@ func (m *IdentifiedClientState) Reset() { *m = IdentifiedClientState{} } func (m *IdentifiedClientState) String() string { return proto.CompactTextString(m) } func (*IdentifiedClientState) ProtoMessage() {} func (*IdentifiedClientState) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{8} + return fileDescriptor_b6bc4c8185546947, []int{0} } func (m *IdentifiedClientState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -461,7 +92,7 @@ func (m *ConsensusStateWithHeight) Reset() { *m = ConsensusStateWithHeig func (m *ConsensusStateWithHeight) String() string { return proto.CompactTextString(m) } func (*ConsensusStateWithHeight) ProtoMessage() {} func (*ConsensusStateWithHeight) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{9} + return fileDescriptor_b6bc4c8185546947, []int{1} } func (m *ConsensusStateWithHeight) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -517,7 +148,7 @@ func (m *ClientConsensusStates) Reset() { *m = ClientConsensusStates{} } func (m *ClientConsensusStates) String() string { return proto.CompactTextString(m) } func (*ClientConsensusStates) ProtoMessage() {} func (*ClientConsensusStates) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{10} + return fileDescriptor_b6bc4c8185546947, []int{2} } func (m *ClientConsensusStates) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -578,7 +209,7 @@ func (m *ClientUpdateProposal) Reset() { *m = ClientUpdateProposal{} } func (m *ClientUpdateProposal) String() string { return proto.CompactTextString(m) } func (*ClientUpdateProposal) ProtoMessage() {} func (*ClientUpdateProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{11} + return fileDescriptor_b6bc4c8185546947, []int{3} } func (m *ClientUpdateProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -626,7 +257,7 @@ type Height struct { func (m *Height) Reset() { *m = Height{} } func (*Height) ProtoMessage() {} func (*Height) Descriptor() ([]byte, []int) { - return fileDescriptor_b6bc4c8185546947, []int{12} + return fileDescriptor_b6bc4c8185546947, []int{4} } func (m *Height) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -655,593 +286,102 @@ func (m *Height) XXX_DiscardUnknown() { var xxx_messageInfo_Height proto.InternalMessageInfo +// Params defines the set of IBC light client parameters. +type Params struct { + // allowed_clients defines the list of allowed client state types. + AllowedClients []string `protobuf:"bytes,1,rep,name=allowed_clients,json=allowedClients,proto3" json:"allowed_clients,omitempty" yaml:"allowed_clients"` +} + +func (m *Params) Reset() { *m = Params{} } +func (m *Params) String() string { return proto.CompactTextString(m) } +func (*Params) ProtoMessage() {} +func (*Params) Descriptor() ([]byte, []int) { + return fileDescriptor_b6bc4c8185546947, []int{5} +} +func (m *Params) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Params.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 *Params) XXX_Merge(src proto.Message) { + xxx_messageInfo_Params.Merge(m, src) +} +func (m *Params) XXX_Size() int { + return m.Size() +} +func (m *Params) XXX_DiscardUnknown() { + xxx_messageInfo_Params.DiscardUnknown(m) +} + +var xxx_messageInfo_Params proto.InternalMessageInfo + +func (m *Params) GetAllowedClients() []string { + if m != nil { + return m.AllowedClients + } + return nil +} + func init() { - proto.RegisterType((*MsgCreateClient)(nil), "ibc.core.client.v1.MsgCreateClient") - proto.RegisterType((*MsgCreateClientResponse)(nil), "ibc.core.client.v1.MsgCreateClientResponse") - proto.RegisterType((*MsgUpdateClient)(nil), "ibc.core.client.v1.MsgUpdateClient") - proto.RegisterType((*MsgUpdateClientResponse)(nil), "ibc.core.client.v1.MsgUpdateClientResponse") - proto.RegisterType((*MsgUpgradeClient)(nil), "ibc.core.client.v1.MsgUpgradeClient") - proto.RegisterType((*MsgUpgradeClientResponse)(nil), "ibc.core.client.v1.MsgUpgradeClientResponse") - proto.RegisterType((*MsgSubmitMisbehaviour)(nil), "ibc.core.client.v1.MsgSubmitMisbehaviour") - proto.RegisterType((*MsgSubmitMisbehaviourResponse)(nil), "ibc.core.client.v1.MsgSubmitMisbehaviourResponse") proto.RegisterType((*IdentifiedClientState)(nil), "ibc.core.client.v1.IdentifiedClientState") proto.RegisterType((*ConsensusStateWithHeight)(nil), "ibc.core.client.v1.ConsensusStateWithHeight") proto.RegisterType((*ClientConsensusStates)(nil), "ibc.core.client.v1.ClientConsensusStates") proto.RegisterType((*ClientUpdateProposal)(nil), "ibc.core.client.v1.ClientUpdateProposal") proto.RegisterType((*Height)(nil), "ibc.core.client.v1.Height") + proto.RegisterType((*Params)(nil), "ibc.core.client.v1.Params") } func init() { proto.RegisterFile("ibc/core/client/v1/client.proto", fileDescriptor_b6bc4c8185546947) } var fileDescriptor_b6bc4c8185546947 = []byte{ - // 827 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0x3f, 0x6f, 0x1a, 0x49, - 0x14, 0x67, 0x01, 0x23, 0x7b, 0x00, 0xdb, 0xda, 0x03, 0x1b, 0xaf, 0x74, 0x2c, 0x9a, 0xbb, 0xc2, - 0xa7, 0xb3, 0x77, 0x0f, 0xae, 0x38, 0xcb, 0xd2, 0x49, 0x77, 0xd0, 0x9c, 0x0b, 0x4e, 0xbe, 0xb5, - 0x4e, 0xf9, 0xa3, 0x48, 0x64, 0xff, 0x8c, 0x97, 0x51, 0x60, 0x07, 0xed, 0x2c, 0xc8, 0x7c, 0x83, - 0x94, 0x91, 0x12, 0x45, 0x29, 0x52, 0x58, 0x29, 0x52, 0xa6, 0xcb, 0x37, 0x48, 0xe1, 0x22, 0x85, - 0xcb, 0x54, 0x28, 0xb2, 0x9b, 0xd4, 0x7c, 0x82, 0x68, 0x77, 0xc6, 0xab, 0x5d, 0x0c, 0x98, 0x38, - 0x8d, 0x2b, 0xf6, 0xbd, 0xf9, 0xcd, 0xef, 0xbd, 0xf7, 0x9b, 0x37, 0x6f, 0x00, 0x32, 0x36, 0x4c, - 0xd5, 0x24, 0x2e, 0x52, 0xcd, 0x0e, 0x46, 0x8e, 0xa7, 0x0e, 0xaa, 0xfc, 0x4b, 0xe9, 0xb9, 0xc4, - 0x23, 0xa2, 0x88, 0x0d, 0x53, 0xf1, 0x01, 0x0a, 0x77, 0x0f, 0xaa, 0x52, 0xc1, 0x26, 0x36, 0x09, - 0x96, 0x55, 0xff, 0x8b, 0x21, 0xa5, 0x2d, 0x9b, 0x10, 0xbb, 0x83, 0xd4, 0xc0, 0x32, 0xfa, 0xc7, - 0xaa, 0xee, 0x0c, 0xd9, 0x12, 0x7c, 0x9e, 0x04, 0x6b, 0x4d, 0x6a, 0x37, 0x5c, 0xa4, 0x7b, 0xa8, - 0x11, 0xf0, 0x88, 0x55, 0xb0, 0xc2, 0x18, 0x5b, 0xd8, 0x2a, 0x09, 0x15, 0x61, 0x7b, 0xa5, 0x5e, - 0x18, 0x8f, 0xe4, 0xf5, 0xa1, 0xde, 0xed, 0xec, 0xc3, 0x70, 0x09, 0x6a, 0xcb, 0xec, 0xfb, 0xc0, - 0x12, 0x0f, 0x41, 0x8e, 0xfb, 0xa9, 0xa7, 0x7b, 0xa8, 0x94, 0xac, 0x08, 0xdb, 0xd9, 0x5a, 0x41, - 0x61, 0x81, 0x95, 0xab, 0xc0, 0xca, 0xdf, 0xce, 0xb0, 0xbe, 0x39, 0x1e, 0xc9, 0x3f, 0xc4, 0xb8, - 0x82, 0x3d, 0x50, 0xcb, 0x32, 0xf3, 0xc8, 0xb7, 0xc4, 0x07, 0x60, 0xcd, 0x24, 0x0e, 0x45, 0x0e, - 0xed, 0x53, 0x4e, 0x9a, 0x9a, 0x43, 0x2a, 0x8d, 0x47, 0xf2, 0x06, 0x27, 0x8d, 0x6f, 0x83, 0xda, - 0x6a, 0xe8, 0x61, 0xd4, 0x1b, 0x20, 0x43, 0xb1, 0xed, 0x20, 0xb7, 0x94, 0xf6, 0x8b, 0xd3, 0xb8, - 0xb5, 0xbf, 0xfc, 0xf4, 0x54, 0x4e, 0x7c, 0x39, 0x95, 0x13, 0x70, 0x0b, 0x6c, 0x4e, 0x88, 0xa2, - 0x21, 0xda, 0xf3, 0x59, 0xe0, 0x0b, 0x21, 0x10, 0xec, 0xff, 0x9e, 0xf5, 0x5d, 0x82, 0xed, 0x80, - 0x4c, 0x1b, 0xe9, 0x16, 0x72, 0xe7, 0x49, 0xa5, 0x71, 0x4c, 0x24, 0xe3, 0xd4, 0xdc, 0x8c, 0xa3, - 0x59, 0x85, 0x19, 0x7f, 0x4c, 0x82, 0xf5, 0x60, 0xcd, 0x76, 0x75, 0xeb, 0x4e, 0x9d, 0xf1, 0x23, - 0xb0, 0xda, 0x67, 0x59, 0xb5, 0xda, 0x08, 0xdb, 0x6d, 0x8f, 0x1f, 0xb1, 0xa4, 0x5c, 0x6f, 0x6d, - 0xe5, 0x9f, 0x00, 0x51, 0xdf, 0x1a, 0x8f, 0xe4, 0x22, 0x63, 0x8e, 0xef, 0x85, 0x5a, 0x9e, 0x3b, - 0x18, 0x52, 0xfc, 0x13, 0xe4, 0x7b, 0x2e, 0x21, 0xc7, 0x2d, 0xee, 0x0e, 0x4e, 0x3b, 0x57, 0x2f, - 0x8d, 0x47, 0x72, 0x81, 0x11, 0xc4, 0x96, 0xa1, 0x96, 0x0b, 0x6c, 0xae, 0x53, 0x44, 0xf3, 0xa5, - 0xa8, 0xe6, 0x50, 0x02, 0xa5, 0x49, 0x35, 0x43, 0xa9, 0xdf, 0x0a, 0xa0, 0xd8, 0xa4, 0xf6, 0x51, - 0xdf, 0xe8, 0x62, 0xaf, 0x89, 0xa9, 0x81, 0xda, 0xfa, 0x00, 0x93, 0xbe, 0x7b, 0x1b, 0xbd, 0xf7, - 0x40, 0xae, 0x1b, 0xa1, 0x98, 0xdb, 0x28, 0x31, 0xe4, 0x02, 0xed, 0x22, 0x83, 0x1f, 0xa7, 0xe6, - 0x19, 0x56, 0xf2, 0x5a, 0x00, 0xc5, 0x03, 0x0b, 0x39, 0x1e, 0x3e, 0xc6, 0xc8, 0x6a, 0x44, 0x0e, - 0xed, 0x2e, 0x74, 0x0e, 0x7c, 0x27, 0x80, 0x52, 0x23, 0x76, 0xab, 0xef, 0x61, 0xaf, 0xcd, 0x0f, - 0x7e, 0xcf, 0xbf, 0x5b, 0x41, 0x3b, 0x09, 0x37, 0xb6, 0x53, 0xfa, 0x6c, 0x24, 0x27, 0x34, 0x8e, - 0x17, 0xef, 0x5f, 0x1f, 0x3a, 0xf3, 0x72, 0x0d, 0x7b, 0xf1, 0xc6, 0x99, 0x03, 0x3f, 0x08, 0xa0, - 0xc8, 0x54, 0x8c, 0xa7, 0x4d, 0x6f, 0xa3, 0xe7, 0x09, 0x58, 0x9f, 0x08, 0x48, 0x4b, 0xc9, 0x4a, - 0x6a, 0x3b, 0x5b, 0xdb, 0x99, 0x56, 0xea, 0x2c, 0xa1, 0xea, 0xb2, 0x5f, 0xfc, 0x78, 0x24, 0x6f, - 0x4e, 0x1d, 0x9c, 0x14, 0x6a, 0x6b, 0xf1, 0x2a, 0x28, 0x7c, 0x2f, 0x80, 0x02, 0x2b, 0x83, 0x8d, - 0x9a, 0x43, 0x97, 0xf4, 0x08, 0xd5, 0x3b, 0x62, 0x01, 0x2c, 0x79, 0xd8, 0xeb, 0x20, 0x56, 0x81, - 0xc6, 0x0c, 0xb1, 0x02, 0xb2, 0x16, 0xa2, 0xa6, 0x8b, 0x7b, 0x1e, 0x26, 0x4e, 0xa0, 0xe5, 0x8a, - 0x16, 0x75, 0xc5, 0xab, 0x4f, 0x7d, 0xe3, 0xe8, 0x4c, 0xdf, 0x3c, 0x3a, 0xf7, 0xd3, 0x7e, 0xcf, - 0xc3, 0x97, 0x02, 0xc8, 0xf0, 0xee, 0xf8, 0x0b, 0xac, 0x0e, 0x90, 0x4b, 0x31, 0x71, 0x5a, 0x4e, - 0xbf, 0x6b, 0x20, 0x37, 0x48, 0x39, 0x1d, 0x1d, 0x2c, 0xf1, 0x75, 0xa8, 0xe5, 0xb9, 0xe3, 0xdf, - 0xc0, 0x8e, 0x32, 0xf0, 0x3e, 0x4b, 0xce, 0x62, 0x08, 0x47, 0x13, 0x77, 0xb0, 0x1c, 0xd8, 0x45, - 0x7c, 0x75, 0x2a, 0x27, 0x6a, 0x6f, 0x52, 0x20, 0xd5, 0xa4, 0xb6, 0xf8, 0x18, 0xe4, 0x62, 0x6f, - 0xf0, 0x4f, 0xd3, 0x0e, 0x72, 0xe2, 0x4d, 0x92, 0x7e, 0x5d, 0x00, 0x74, 0x75, 0xa3, 0xfd, 0x08, - 0xb1, 0x47, 0x6b, 0x56, 0x84, 0x28, 0x68, 0x66, 0x84, 0x69, 0x0f, 0x8d, 0x68, 0x82, 0x7c, 0xfc, - 0x91, 0xf9, 0x79, 0xe6, 0xee, 0x08, 0x4a, 0xda, 0x59, 0x04, 0x15, 0x06, 0x71, 0x81, 0x38, 0x65, - 0xbc, 0xfe, 0x32, 0x83, 0xe3, 0x3a, 0x54, 0xaa, 0x2e, 0x0c, 0xbd, 0x8a, 0x59, 0xff, 0xef, 0xec, - 0xa2, 0x2c, 0x9c, 0x5f, 0x94, 0x85, 0xcf, 0x17, 0x65, 0xe1, 0xd9, 0x65, 0x39, 0x71, 0x7e, 0x59, - 0x4e, 0x7c, 0xba, 0x2c, 0x27, 0x1e, 0xfe, 0x61, 0x63, 0xaf, 0xdd, 0x37, 0x14, 0x93, 0x74, 0x55, - 0x93, 0xd0, 0x2e, 0xa1, 0xfc, 0x67, 0x97, 0x5a, 0x4f, 0xd4, 0x13, 0x35, 0xfc, 0x0f, 0xf7, 0x5b, - 0x6d, 0x97, 0xff, 0x8d, 0xf3, 0x86, 0x3d, 0x44, 0x8d, 0x4c, 0xd0, 0xac, 0xbf, 0x7f, 0x0d, 0x00, - 0x00, 0xff, 0xff, 0x06, 0xa7, 0xa2, 0x16, 0xe6, 0x09, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// MsgClient is the client API for Msg service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type MsgClient interface { - // CreateClient defines a rpc handler method for MsgCreateClient. - CreateClient(ctx context.Context, in *MsgCreateClient, opts ...grpc.CallOption) (*MsgCreateClientResponse, error) - // UpdateClient defines a rpc handler method for MsgUpdateClient. - UpdateClient(ctx context.Context, in *MsgUpdateClient, opts ...grpc.CallOption) (*MsgUpdateClientResponse, error) - // UpgradeClient defines a rpc handler method for MsgUpgradeClient. - UpgradeClient(ctx context.Context, in *MsgUpgradeClient, opts ...grpc.CallOption) (*MsgUpgradeClientResponse, error) - // SubmitMisbehaviour defines a rpc handler method for MsgSubmitMisbehaviour. - SubmitMisbehaviour(ctx context.Context, in *MsgSubmitMisbehaviour, opts ...grpc.CallOption) (*MsgSubmitMisbehaviourResponse, error) -} - -type msgClient struct { - cc grpc1.ClientConn -} - -func NewMsgClient(cc grpc1.ClientConn) MsgClient { - return &msgClient{cc} -} - -func (c *msgClient) CreateClient(ctx context.Context, in *MsgCreateClient, opts ...grpc.CallOption) (*MsgCreateClientResponse, error) { - out := new(MsgCreateClientResponse) - err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Msg/CreateClient", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) UpdateClient(ctx context.Context, in *MsgUpdateClient, opts ...grpc.CallOption) (*MsgUpdateClientResponse, error) { - out := new(MsgUpdateClientResponse) - err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Msg/UpdateClient", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) UpgradeClient(ctx context.Context, in *MsgUpgradeClient, opts ...grpc.CallOption) (*MsgUpgradeClientResponse, error) { - out := new(MsgUpgradeClientResponse) - err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Msg/UpgradeClient", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) SubmitMisbehaviour(ctx context.Context, in *MsgSubmitMisbehaviour, opts ...grpc.CallOption) (*MsgSubmitMisbehaviourResponse, error) { - out := new(MsgSubmitMisbehaviourResponse) - err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Msg/SubmitMisbehaviour", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// MsgServer is the server API for Msg service. -type MsgServer interface { - // CreateClient defines a rpc handler method for MsgCreateClient. - CreateClient(context.Context, *MsgCreateClient) (*MsgCreateClientResponse, error) - // UpdateClient defines a rpc handler method for MsgUpdateClient. - UpdateClient(context.Context, *MsgUpdateClient) (*MsgUpdateClientResponse, error) - // UpgradeClient defines a rpc handler method for MsgUpgradeClient. - UpgradeClient(context.Context, *MsgUpgradeClient) (*MsgUpgradeClientResponse, error) - // SubmitMisbehaviour defines a rpc handler method for MsgSubmitMisbehaviour. - SubmitMisbehaviour(context.Context, *MsgSubmitMisbehaviour) (*MsgSubmitMisbehaviourResponse, error) -} - -// UnimplementedMsgServer can be embedded to have forward compatible implementations. -type UnimplementedMsgServer struct { -} - -func (*UnimplementedMsgServer) CreateClient(ctx context.Context, req *MsgCreateClient) (*MsgCreateClientResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateClient not implemented") -} -func (*UnimplementedMsgServer) UpdateClient(ctx context.Context, req *MsgUpdateClient) (*MsgUpdateClientResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateClient not implemented") -} -func (*UnimplementedMsgServer) UpgradeClient(ctx context.Context, req *MsgUpgradeClient) (*MsgUpgradeClientResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpgradeClient not implemented") -} -func (*UnimplementedMsgServer) SubmitMisbehaviour(ctx context.Context, req *MsgSubmitMisbehaviour) (*MsgSubmitMisbehaviourResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method SubmitMisbehaviour not implemented") -} - -func RegisterMsgServer(s grpc1.Server, srv MsgServer) { - s.RegisterService(&_Msg_serviceDesc, srv) -} - -func _Msg_CreateClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgCreateClient) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).CreateClient(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/ibc.core.client.v1.Msg/CreateClient", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).CreateClient(ctx, req.(*MsgCreateClient)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_UpdateClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgUpdateClient) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).UpdateClient(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/ibc.core.client.v1.Msg/UpdateClient", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).UpdateClient(ctx, req.(*MsgUpdateClient)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_UpgradeClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgUpgradeClient) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).UpgradeClient(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/ibc.core.client.v1.Msg/UpgradeClient", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).UpgradeClient(ctx, req.(*MsgUpgradeClient)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_SubmitMisbehaviour_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgSubmitMisbehaviour) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).SubmitMisbehaviour(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/ibc.core.client.v1.Msg/SubmitMisbehaviour", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).SubmitMisbehaviour(ctx, req.(*MsgSubmitMisbehaviour)) - } - return interceptor(ctx, in, info, handler) -} - -var _Msg_serviceDesc = grpc.ServiceDesc{ - ServiceName: "ibc.core.client.v1.Msg", - HandlerType: (*MsgServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "CreateClient", - Handler: _Msg_CreateClient_Handler, - }, - { - MethodName: "UpdateClient", - Handler: _Msg_UpdateClient_Handler, - }, - { - MethodName: "UpgradeClient", - Handler: _Msg_UpgradeClient_Handler, - }, - { - MethodName: "SubmitMisbehaviour", - Handler: _Msg_SubmitMisbehaviour_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "ibc/core/client/v1/client.proto", -} - -func (m *MsgCreateClient) 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 *MsgCreateClient) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgCreateClient) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Signer) > 0 { - i -= len(m.Signer) - copy(dAtA[i:], m.Signer) - i = encodeVarintClient(dAtA, i, uint64(len(m.Signer))) - i-- - dAtA[i] = 0x22 - } - if m.ConsensusState != nil { - { - size, err := m.ConsensusState.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintClient(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - if m.ClientState != nil { - { - size, err := m.ClientState.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintClient(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.ClientId) > 0 { - i -= len(m.ClientId) - copy(dAtA[i:], m.ClientId) - i = encodeVarintClient(dAtA, i, uint64(len(m.ClientId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgCreateClientResponse) 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 *MsgCreateClientResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgCreateClientResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *MsgUpdateClient) 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 *MsgUpdateClient) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgUpdateClient) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Signer) > 0 { - i -= len(m.Signer) - copy(dAtA[i:], m.Signer) - i = encodeVarintClient(dAtA, i, uint64(len(m.Signer))) - i-- - dAtA[i] = 0x1a - } - if m.Header != nil { - { - size, err := m.Header.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintClient(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.ClientId) > 0 { - i -= len(m.ClientId) - copy(dAtA[i:], m.ClientId) - i = encodeVarintClient(dAtA, i, uint64(len(m.ClientId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgUpdateClientResponse) 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 *MsgUpdateClientResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgUpdateClientResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *MsgUpgradeClient) 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 *MsgUpgradeClient) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgUpgradeClient) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Signer) > 0 { - i -= len(m.Signer) - copy(dAtA[i:], m.Signer) - i = encodeVarintClient(dAtA, i, uint64(len(m.Signer))) - i-- - dAtA[i] = 0x2a - } - if len(m.ProofUpgrade) > 0 { - i -= len(m.ProofUpgrade) - copy(dAtA[i:], m.ProofUpgrade) - i = encodeVarintClient(dAtA, i, uint64(len(m.ProofUpgrade))) - i-- - dAtA[i] = 0x22 - } - if m.UpgradeHeight != nil { - { - size, err := m.UpgradeHeight.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintClient(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - if m.ClientState != nil { - { - size, err := m.ClientState.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintClient(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.ClientId) > 0 { - i -= len(m.ClientId) - copy(dAtA[i:], m.ClientId) - i = encodeVarintClient(dAtA, i, uint64(len(m.ClientId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgUpgradeClientResponse) 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 *MsgUpgradeClientResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgUpgradeClientResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *MsgSubmitMisbehaviour) 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 *MsgSubmitMisbehaviour) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgSubmitMisbehaviour) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Signer) > 0 { - i -= len(m.Signer) - copy(dAtA[i:], m.Signer) - i = encodeVarintClient(dAtA, i, uint64(len(m.Signer))) - i-- - dAtA[i] = 0x1a - } - if m.Misbehaviour != nil { - { - size, err := m.Misbehaviour.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintClient(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.ClientId) > 0 { - i -= len(m.ClientId) - copy(dAtA[i:], m.ClientId) - i = encodeVarintClient(dAtA, i, uint64(len(m.ClientId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgSubmitMisbehaviourResponse) 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 *MsgSubmitMisbehaviourResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgSubmitMisbehaviourResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil + // 579 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0xbd, 0x8e, 0xd3, 0x4c, + 0x14, 0xcd, 0x6c, 0xf2, 0x45, 0x9b, 0xc9, 0x47, 0xb2, 0x32, 0x09, 0xeb, 0x4d, 0x61, 0x47, 0x53, + 0xa5, 0xd8, 0xb5, 0x49, 0x28, 0x40, 0xa9, 0xc0, 0x69, 0xd8, 0x02, 0x14, 0x8c, 0x10, 0x88, 0x26, + 0xf2, 0xcf, 0xac, 0x33, 0xc2, 0xf1, 0x44, 0x9e, 0x49, 0xd8, 0xbc, 0x01, 0x25, 0x15, 0xa2, 0xa0, + 0xe0, 0x09, 0xe8, 0x78, 0x03, 0x8a, 0x2d, 0xb7, 0xa4, 0xb2, 0x50, 0xf2, 0x06, 0x79, 0x02, 0x64, + 0xcf, 0xec, 0x66, 0x1d, 0x88, 0xb4, 0xa2, 0xf2, 0x9d, 0x7b, 0xaf, 0xcf, 0x3d, 0xe7, 0xdc, 0xd1, + 0x40, 0x9d, 0xb8, 0x9e, 0xe9, 0xd1, 0x18, 0x9b, 0x5e, 0x48, 0x70, 0xc4, 0xcd, 0x79, 0x57, 0x46, + 0xc6, 0x34, 0xa6, 0x9c, 0x2a, 0x0a, 0x71, 0x3d, 0x23, 0x6d, 0x30, 0x64, 0x7a, 0xde, 0x6d, 0x35, + 0x02, 0x1a, 0xd0, 0xac, 0x6c, 0xa6, 0x91, 0xe8, 0x6c, 0x1d, 0x05, 0x94, 0x06, 0x21, 0x36, 0xb3, + 0x93, 0x3b, 0x3b, 0x33, 0x9d, 0x68, 0x21, 0x4a, 0xe8, 0x0b, 0x80, 0xcd, 0x53, 0x1f, 0x47, 0x9c, + 0x9c, 0x11, 0xec, 0x0f, 0x32, 0xa0, 0x97, 0xdc, 0xe1, 0x58, 0xe9, 0xc2, 0x8a, 0xc0, 0x1d, 0x11, + 0x5f, 0x05, 0x6d, 0xd0, 0xa9, 0x58, 0x8d, 0x75, 0xa2, 0x1f, 0x2c, 0x9c, 0x49, 0xd8, 0x47, 0xd7, + 0x25, 0x64, 0xef, 0x8b, 0xf8, 0xd4, 0x57, 0x86, 0xf0, 0x7f, 0x99, 0x67, 0x29, 0x84, 0xba, 0xd7, + 0x06, 0x9d, 0x6a, 0xaf, 0x61, 0x88, 0xf1, 0xc6, 0xd5, 0x78, 0xe3, 0x49, 0xb4, 0xb0, 0x0e, 0xd7, + 0x89, 0x7e, 0x37, 0x87, 0x95, 0xfd, 0x83, 0xec, 0xaa, 0xb7, 0x21, 0x81, 0xbe, 0x01, 0xa8, 0x0e, + 0x68, 0xc4, 0x70, 0xc4, 0x66, 0x2c, 0x4b, 0xbd, 0x26, 0x7c, 0xfc, 0x14, 0x93, 0x60, 0xcc, 0x95, + 0x47, 0xb0, 0x3c, 0xce, 0xa2, 0x8c, 0x5e, 0xb5, 0xd7, 0x32, 0xfe, 0x74, 0xc4, 0x10, 0xbd, 0x56, + 0xe9, 0x22, 0xd1, 0x0b, 0xb6, 0xec, 0x57, 0xde, 0xc0, 0xba, 0x77, 0x85, 0x7a, 0x0b, 0xae, 0x47, + 0xeb, 0x44, 0x6f, 0xa6, 0x5c, 0xd1, 0xd6, 0x5f, 0xc8, 0xae, 0x79, 0x39, 0x76, 0xe8, 0x07, 0x80, + 0x4d, 0xe1, 0x62, 0x9e, 0x36, 0xfb, 0x17, 0x3f, 0xcf, 0xe1, 0xc1, 0xd6, 0x40, 0xa6, 0xee, 0xb5, + 0x8b, 0x9d, 0x6a, 0xef, 0xf8, 0x6f, 0x52, 0x77, 0x19, 0x65, 0xe9, 0xa9, 0xf8, 0x75, 0xa2, 0x1f, + 0xca, 0x59, 0x5b, 0x98, 0xc8, 0xae, 0xe7, 0x55, 0x30, 0xf4, 0x1d, 0xc0, 0x86, 0x90, 0xf1, 0x6a, + 0xea, 0x3b, 0x1c, 0x0f, 0x63, 0x3a, 0xa5, 0xcc, 0x09, 0x95, 0x06, 0xfc, 0x8f, 0x13, 0x1e, 0x62, + 0xa1, 0xc0, 0x16, 0x07, 0xa5, 0x0d, 0xab, 0x3e, 0x66, 0x5e, 0x4c, 0xa6, 0x9c, 0xd0, 0x28, 0xf3, + 0xb2, 0x62, 0xdf, 0x4c, 0xe5, 0xd5, 0x17, 0x6f, 0xa5, 0xfe, 0x38, 0x5d, 0xaf, 0xe3, 0xe3, 0x58, + 0x2d, 0xed, 0xde, 0x8d, 0x2d, 0x7b, 0xfa, 0xa5, 0x0f, 0x5f, 0xf5, 0x02, 0xfa, 0x04, 0x60, 0x59, + 0xde, 0x8e, 0xc7, 0xb0, 0x36, 0xc7, 0x31, 0x23, 0x34, 0x1a, 0x45, 0xb3, 0x89, 0x8b, 0xe3, 0x8c, + 0x72, 0x69, 0xb3, 0xcc, 0x3e, 0xca, 0xd7, 0x91, 0x7d, 0x47, 0x26, 0x9e, 0x67, 0xe7, 0x9b, 0x08, + 0xf2, 0x9e, 0xed, 0xed, 0x42, 0x10, 0xf5, 0x0d, 0x82, 0xe0, 0xd0, 0xdf, 0x4f, 0x49, 0x7d, 0x4e, + 0x89, 0x3d, 0x83, 0xe5, 0xa1, 0x13, 0x3b, 0x13, 0xa6, 0x0c, 0x60, 0xdd, 0x09, 0x43, 0xfa, 0x1e, + 0xfb, 0x23, 0x21, 0x95, 0xa9, 0xa0, 0x5d, 0xec, 0x54, 0xac, 0xd6, 0x3a, 0xd1, 0xef, 0x09, 0xd8, + 0xad, 0x06, 0x64, 0xd7, 0x64, 0x46, 0xec, 0x84, 0x59, 0x2f, 0x2e, 0x96, 0x1a, 0xb8, 0x5c, 0x6a, + 0xe0, 0xd7, 0x52, 0x03, 0x1f, 0x57, 0x5a, 0xe1, 0x72, 0xa5, 0x15, 0x7e, 0xae, 0xb4, 0xc2, 0xdb, + 0x87, 0x01, 0xe1, 0xe3, 0x99, 0x6b, 0x78, 0x74, 0x62, 0x7a, 0x94, 0x4d, 0x28, 0x93, 0x9f, 0x13, + 0xe6, 0xbf, 0x33, 0xcf, 0xcd, 0xeb, 0x57, 0xe5, 0x7e, 0xef, 0x44, 0x3e, 0x2c, 0x7c, 0x31, 0xc5, + 0xcc, 0x2d, 0x67, 0xb6, 0x3e, 0xf8, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x91, 0xd2, 0x2f, 0x3f, 0x78, + 0x04, 0x00, 0x00, } func (m *IdentifiedClientState) Marshal() (dAtA []byte, err error) { @@ -1464,6 +604,38 @@ func (m *Height) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *Params) 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 *Params) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.AllowedClients) > 0 { + for iNdEx := len(m.AllowedClients) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.AllowedClients[iNdEx]) + copy(dAtA[i:], m.AllowedClients[iNdEx]) + i = encodeVarintClient(dAtA, i, uint64(len(m.AllowedClients[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func encodeVarintClient(dAtA []byte, offset int, v uint64) int { offset -= sovClient(v) base := offset @@ -1475,138 +647,6 @@ func encodeVarintClient(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } -func (m *MsgCreateClient) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ClientId) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - if m.ClientState != nil { - l = m.ClientState.Size() - n += 1 + l + sovClient(uint64(l)) - } - if m.ConsensusState != nil { - l = m.ConsensusState.Size() - n += 1 + l + sovClient(uint64(l)) - } - l = len(m.Signer) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - return n -} - -func (m *MsgCreateClientResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *MsgUpdateClient) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ClientId) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - if m.Header != nil { - l = m.Header.Size() - n += 1 + l + sovClient(uint64(l)) - } - l = len(m.Signer) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - return n -} - -func (m *MsgUpdateClientResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *MsgUpgradeClient) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ClientId) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - if m.ClientState != nil { - l = m.ClientState.Size() - n += 1 + l + sovClient(uint64(l)) - } - if m.UpgradeHeight != nil { - l = m.UpgradeHeight.Size() - n += 1 + l + sovClient(uint64(l)) - } - l = len(m.ProofUpgrade) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - l = len(m.Signer) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - return n -} - -func (m *MsgUpgradeClientResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *MsgSubmitMisbehaviour) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ClientId) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - if m.Misbehaviour != nil { - l = m.Misbehaviour.Size() - n += 1 + l + sovClient(uint64(l)) - } - l = len(m.Signer) - if l > 0 { - n += 1 + l + sovClient(uint64(l)) - } - return n -} - -func (m *MsgSubmitMisbehaviourResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - func (m *IdentifiedClientState) Size() (n int) { if m == nil { return 0 @@ -1698,942 +738,27 @@ func (m *Height) Size() (n int) { return n } +func (m *Params) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.AllowedClients) > 0 { + for _, s := range m.AllowedClients { + l = len(s) + n += 1 + l + sovClient(uint64(l)) + } + } + return n +} + func sovClient(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } func sozClient(x uint64) (n int) { return sovClient(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (m *MsgCreateClient) 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 ErrIntOverflowClient - } - 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: MsgCreateClient: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgCreateClient: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClientId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientState", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ClientState == nil { - m.ClientState = &types.Any{} - } - if err := m.ClientState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConsensusState", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ConsensusState == nil { - m.ConsensusState = &types.Any{} - } - if err := m.ConsensusState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Signer = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipClient(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgCreateClientResponse) 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 ErrIntOverflowClient - } - 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: MsgCreateClientResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgCreateClientResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipClient(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgUpdateClient) 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 ErrIntOverflowClient - } - 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: MsgUpdateClient: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgUpdateClient: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClientId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Header == nil { - m.Header = &types.Any{} - } - if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Signer = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipClient(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgUpdateClientResponse) 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 ErrIntOverflowClient - } - 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: MsgUpdateClientResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgUpdateClientResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipClient(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgUpgradeClient) 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 ErrIntOverflowClient - } - 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: MsgUpgradeClient: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgUpgradeClient: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClientId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientState", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ClientState == nil { - m.ClientState = &types.Any{} - } - if err := m.ClientState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UpgradeHeight", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.UpgradeHeight == nil { - m.UpgradeHeight = &Height{} - } - if err := m.UpgradeHeight.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProofUpgrade", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ProofUpgrade = append(m.ProofUpgrade[:0], dAtA[iNdEx:postIndex]...) - if m.ProofUpgrade == nil { - m.ProofUpgrade = []byte{} - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Signer = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipClient(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgUpgradeClientResponse) 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 ErrIntOverflowClient - } - 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: MsgUpgradeClientResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgUpgradeClientResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipClient(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgSubmitMisbehaviour) 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 ErrIntOverflowClient - } - 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: MsgSubmitMisbehaviour: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgSubmitMisbehaviour: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClientId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Misbehaviour", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Misbehaviour == nil { - m.Misbehaviour = &types.Any{} - } - if err := m.Misbehaviour.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowClient - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthClient - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthClient - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Signer = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipClient(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgSubmitMisbehaviourResponse) 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 ErrIntOverflowClient - } - 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: MsgSubmitMisbehaviourResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgSubmitMisbehaviourResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipClient(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthClient - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *IdentifiedClientState) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3272,6 +1397,91 @@ func (m *Height) Unmarshal(dAtA []byte) error { } return nil } +func (m *Params) 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 ErrIntOverflowClient + } + 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: Params: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedClients", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowClient + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthClient + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthClient + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AllowedClients = append(m.AllowedClients, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipClient(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthClient + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthClient + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipClient(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/ibc/core/02-client/types/client_test.go b/x/ibc/core/02-client/types/client_test.go index 3028980b89..409ab53050 100644 --- a/x/ibc/core/02-client/types/client_test.go +++ b/x/ibc/core/02-client/types/client_test.go @@ -2,6 +2,7 @@ package types_test import ( "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -22,7 +23,7 @@ func (suite *TypesTestSuite) TestMarshalConsensusStateWithHeight() { }, { "tendermint client", func() { - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState := suite.chainA.GetClientState(clientA) consensusState, ok := suite.chainA.GetConsensusState(clientA, clientState.GetLatestHeight()) suite.Require().True(ok) diff --git a/x/ibc/core/02-client/types/genesis.go b/x/ibc/core/02-client/types/genesis.go index c9be22f821..fc3ba12d19 100644 --- a/x/ibc/core/02-client/types/genesis.go +++ b/x/ibc/core/02-client/types/genesis.go @@ -66,11 +66,13 @@ func (ccs ClientConsensusStates) UnpackInterfaces(unpacker codectypes.AnyUnpacke // NewGenesisState creates a GenesisState instance. func NewGenesisState( - clients []IdentifiedClientState, clientsConsensus ClientsConsensusStates, createLocalhost bool, + clients []IdentifiedClientState, clientsConsensus ClientsConsensusStates, + params Params, createLocalhost bool, ) GenesisState { return GenesisState{ Clients: clients, ClientsConsensus: clientsConsensus, + Params: params, CreateLocalhost: createLocalhost, } } @@ -80,6 +82,7 @@ func DefaultGenesisState() GenesisState { return GenesisState{ Clients: []IdentifiedClientState{}, ClientsConsensus: ClientsConsensusStates{}, + Params: DefaultParams(), CreateLocalhost: false, } } @@ -133,5 +136,13 @@ func (gs GenesisState) Validate() error { } } + if err := gs.Params.Validate(); err != nil { + return err + } + + if gs.CreateLocalhost && !gs.Params.IsAllowedClient(exported.Localhost) { + return fmt.Errorf("localhost client is not registered on the allowlist") + } + return nil } diff --git a/x/ibc/core/02-client/types/genesis.pb.go b/x/ibc/core/02-client/types/genesis.pb.go index 8d16b4519a..4c72edfe5e 100644 --- a/x/ibc/core/02-client/types/genesis.pb.go +++ b/x/ibc/core/02-client/types/genesis.pb.go @@ -26,11 +26,12 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // GenesisState defines the ibc client submodule's genesis state. type GenesisState struct { // client states with their corresponding identifiers - Clients []IdentifiedClientState `protobuf:"bytes,1,rep,name=clients,proto3" json:"clients"` + Clients IdentifiedClientStates `protobuf:"bytes,1,rep,name=clients,proto3,castrepeated=IdentifiedClientStates" json:"clients"` // consensus states from each client ClientsConsensus ClientsConsensusStates `protobuf:"bytes,2,rep,name=clients_consensus,json=clientsConsensus,proto3,castrepeated=ClientsConsensusStates" json:"clients_consensus" yaml:"clients_consensus"` + Params Params `protobuf:"bytes,3,opt,name=params,proto3" json:"params"` // create localhost on initialization - CreateLocalhost bool `protobuf:"varint,3,opt,name=create_localhost,json=createLocalhost,proto3" json:"create_localhost,omitempty" yaml:"create_localhost"` + CreateLocalhost bool `protobuf:"varint,4,opt,name=create_localhost,json=createLocalhost,proto3" json:"create_localhost,omitempty" yaml:"create_localhost"` } func (m *GenesisState) Reset() { *m = GenesisState{} } @@ -66,7 +67,7 @@ func (m *GenesisState) XXX_DiscardUnknown() { var xxx_messageInfo_GenesisState proto.InternalMessageInfo -func (m *GenesisState) GetClients() []IdentifiedClientState { +func (m *GenesisState) GetClients() IdentifiedClientStates { if m != nil { return m.Clients } @@ -80,6 +81,13 @@ func (m *GenesisState) GetClientsConsensus() ClientsConsensusStates { return nil } +func (m *GenesisState) GetParams() Params { + if m != nil { + return m.Params + } + return Params{} +} + func (m *GenesisState) GetCreateLocalhost() bool { if m != nil { return m.CreateLocalhost @@ -94,28 +102,30 @@ func init() { func init() { proto.RegisterFile("ibc/core/client/v1/genesis.proto", fileDescriptor_bcd0c0f1f2e6a91a) } var fileDescriptor_bcd0c0f1f2e6a91a = []byte{ - // 328 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0xc8, 0x4c, 0x4a, 0xd6, - 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0xce, 0xc9, 0x4c, 0xcd, 0x2b, 0xd1, 0x2f, 0x33, 0xd4, 0x4f, - 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0xca, 0x4c, - 0x4a, 0xd6, 0x03, 0xa9, 0xd0, 0x83, 0xa8, 0xd0, 0x2b, 0x33, 0x94, 0x92, 0xc7, 0xa2, 0x0b, 0x2a, - 0x0b, 0xd6, 0x24, 0x25, 0x92, 0x9e, 0x9f, 0x9e, 0x0f, 0x66, 0xea, 0x83, 0x58, 0x10, 0x51, 0xa5, - 0x6d, 0x4c, 0x5c, 0x3c, 0xee, 0x10, 0xc3, 0x83, 0x4b, 0x12, 0x4b, 0x52, 0x85, 0x3c, 0xb9, 0xd8, - 0x21, 0xda, 0x8a, 0x25, 0x18, 0x15, 0x98, 0x35, 0xb8, 0x8d, 0x34, 0xf5, 0x30, 0x6d, 0xd3, 0xf3, - 0x4c, 0x49, 0xcd, 0x2b, 0xc9, 0x4c, 0xcb, 0x4c, 0x4d, 0x71, 0x06, 0x8b, 0x81, 0xf5, 0x3a, 0xb1, - 0x9c, 0xb8, 0x27, 0xcf, 0x10, 0x04, 0xd3, 0x2f, 0x34, 0x89, 0x91, 0x4b, 0x10, 0xca, 0x8e, 0x4f, - 0xce, 0xcf, 0x2b, 0x4e, 0xcd, 0x2b, 0x2e, 0x2d, 0x96, 0x60, 0xc2, 0x6d, 0x2a, 0xc4, 0x2c, 0x67, - 0x98, 0x52, 0xb0, 0xa1, 0xc5, 0x4e, 0x56, 0x20, 0x53, 0x3f, 0xdd, 0x93, 0x97, 0xa8, 0x4c, 0xcc, - 0xcd, 0xb1, 0x52, 0xc2, 0x30, 0x51, 0x69, 0xd5, 0x7d, 0x79, 0x31, 0x88, 0xd6, 0x62, 0x34, 0xbd, - 0x41, 0x02, 0xc9, 0x68, 0xe2, 0x42, 0x6e, 0x5c, 0x02, 0xc9, 0x45, 0xa9, 0x89, 0x25, 0xa9, 0xf1, - 0x39, 0xf9, 0xc9, 0x89, 0x39, 0x19, 0xf9, 0xc5, 0x25, 0x12, 0xcc, 0x0a, 0x8c, 0x1a, 0x1c, 0x4e, - 0xd2, 0x9f, 0xee, 0xc9, 0x8b, 0x43, 0xed, 0x40, 0x53, 0xa1, 0x14, 0xc4, 0x0f, 0x11, 0xf2, 0x81, - 0x89, 0x38, 0x05, 0x9e, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, - 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x79, 0x7a, - 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x7e, 0x72, 0x7e, 0x71, 0x6e, 0x7e, 0x31, - 0x94, 0xd2, 0x2d, 0x4e, 0xc9, 0xd6, 0xaf, 0xd0, 0x87, 0x47, 0x94, 0x81, 0x91, 0x2e, 0x34, 0xae, - 0x4a, 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x51, 0x62, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, - 0x5b, 0xe3, 0x61, 0x24, 0x01, 0x02, 0x00, 0x00, + // 362 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x91, 0xc1, 0x4e, 0xea, 0x40, + 0x14, 0x86, 0xdb, 0x0b, 0xe1, 0xde, 0x94, 0x9b, 0x88, 0x8d, 0xd1, 0x06, 0x93, 0xb6, 0xe9, 0x0a, + 0x17, 0xcc, 0x08, 0x2e, 0x34, 0x2c, 0x4b, 0xa2, 0x31, 0x71, 0xa1, 0x75, 0xe7, 0x86, 0xb4, 0xc3, + 0x58, 0x26, 0xb6, 0x1d, 0xd2, 0x33, 0x10, 0x79, 0x05, 0x57, 0xc6, 0xc7, 0xf0, 0x49, 0x58, 0xb2, + 0x74, 0x85, 0x06, 0xde, 0x80, 0x27, 0x30, 0xed, 0x14, 0x17, 0x80, 0xab, 0x39, 0xf9, 0xe7, 0xff, + 0xfe, 0xff, 0x24, 0x47, 0xb3, 0x59, 0x40, 0x30, 0xe1, 0x29, 0xc5, 0x24, 0x62, 0x34, 0x11, 0x78, + 0xdc, 0xc2, 0x21, 0x4d, 0x28, 0x30, 0x40, 0xc3, 0x94, 0x0b, 0xae, 0xeb, 0x2c, 0x20, 0x28, 0x73, + 0x20, 0xe9, 0x40, 0xe3, 0x56, 0xdd, 0xda, 0x41, 0x15, 0xbf, 0x39, 0x54, 0x3f, 0x08, 0x79, 0xc8, + 0xf3, 0x11, 0x67, 0x93, 0x54, 0x9d, 0x97, 0x92, 0xf6, 0xff, 0x4a, 0x86, 0xdf, 0x0b, 0x5f, 0x50, + 0x9d, 0x68, 0x7f, 0x25, 0x06, 0x86, 0x6a, 0x97, 0x1a, 0xd5, 0xf6, 0x09, 0xda, 0x6e, 0x43, 0xd7, + 0x7d, 0x9a, 0x08, 0xf6, 0xc8, 0x68, 0xbf, 0x9b, 0x6b, 0x39, 0xeb, 0x9a, 0xd3, 0xb9, 0xa5, 0xbc, + 0x7f, 0x5a, 0x87, 0x3b, 0xbf, 0xc1, 0x5b, 0x27, 0xeb, 0x6f, 0xaa, 0xb6, 0x5f, 0xcc, 0x3d, 0xc2, + 0x13, 0xa0, 0x09, 0x8c, 0xc0, 0xf8, 0xf3, 0x7b, 0x9f, 0x8c, 0xe9, 0xae, 0xad, 0x32, 0xcf, 0xed, + 0x64, 0x7d, 0xab, 0xb9, 0x65, 0x4c, 0xfc, 0x38, 0xea, 0x38, 0x5b, 0x89, 0x4e, 0xb6, 0x8b, 0x44, + 0x61, 0x83, 0xf5, 0x6a, 0x64, 0x43, 0xd7, 0x2f, 0xb4, 0xca, 0xd0, 0x4f, 0xfd, 0x18, 0x8c, 0x92, + 0xad, 0x36, 0xaa, 0xed, 0xfa, 0xae, 0x45, 0x6e, 0x73, 0x87, 0x5b, 0xce, 0x9a, 0xbd, 0xc2, 0xaf, + 0x5f, 0x6a, 0x35, 0x92, 0x52, 0x5f, 0xd0, 0x5e, 0xc4, 0x89, 0x1f, 0x0d, 0x38, 0x08, 0xa3, 0x6c, + 0xab, 0x8d, 0x7f, 0xee, 0xf1, 0x6a, 0x6e, 0x1d, 0x15, 0xdb, 0x6d, 0x38, 0x1c, 0x6f, 0x4f, 0x4a, + 0x37, 0x6b, 0xc5, 0xbd, 0x9b, 0x2e, 0x4c, 0x75, 0xb6, 0x30, 0xd5, 0xaf, 0x85, 0xa9, 0xbe, 0x2e, + 0x4d, 0x65, 0xb6, 0x34, 0x95, 0x8f, 0xa5, 0xa9, 0x3c, 0x9c, 0x87, 0x4c, 0x0c, 0x46, 0x01, 0x22, + 0x3c, 0xc6, 0x84, 0x43, 0xcc, 0xa1, 0x78, 0x9a, 0xd0, 0x7f, 0xc2, 0xcf, 0xf8, 0xe7, 0xf8, 0xa7, + 0xed, 0x66, 0x71, 0x7f, 0x31, 0x19, 0x52, 0x08, 0x2a, 0xf9, 0x99, 0xcf, 0xbe, 0x03, 0x00, 0x00, + 0xff, 0xff, 0x8d, 0xa4, 0x74, 0xd6, 0x55, 0x02, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -146,8 +156,18 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0 } i-- - dAtA[i] = 0x18 + dAtA[i] = 0x20 } + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a if len(m.ClientsConsensus) > 0 { for iNdEx := len(m.ClientsConsensus) - 1; iNdEx >= 0; iNdEx-- { { @@ -208,6 +228,8 @@ func (m *GenesisState) Size() (n int) { n += 1 + l + sovGenesis(uint64(l)) } } + l = m.Params.Size() + n += 1 + l + sovGenesis(uint64(l)) if m.CreateLocalhost { n += 2 } @@ -318,6 +340,39 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field CreateLocalhost", wireType) } diff --git a/x/ibc/core/02-client/types/genesis_test.go b/x/ibc/core/02-client/types/genesis_test.go index 41d88edae8..296bceb129 100644 --- a/x/ibc/core/02-client/types/genesis_test.go +++ b/x/ibc/core/02-client/types/genesis_test.go @@ -28,7 +28,7 @@ var clientHeight = types.NewHeight(0, 10) func (suite *TypesTestSuite) TestMarshalGenesisState() { cdc := suite.chainA.App.AppCodec() clientA, _, _, _, _, _ := suite.coordinator.Setup(suite.chainA, suite.chainB, channeltypes.ORDERED) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) genesis := client.ExportGenesis(suite.chainA.GetContext(), suite.chainA.App.IBCKeeper.ClientKeeper) @@ -65,7 +65,7 @@ func (suite *TypesTestSuite) TestValidateGenesis() { expPass: true, }, { - name: "valid genesis", + name: "valid custom genesis", genState: types.NewGenesisState( []types.IdentifiedClientState{ types.NewIdentifiedClientState( @@ -88,7 +88,8 @@ func (suite *TypesTestSuite) TestValidateGenesis() { }, ), }, - true, + types.NewParams(exported.Tendermint), + false, ), expPass: true, }, @@ -116,7 +117,8 @@ func (suite *TypesTestSuite) TestValidateGenesis() { }, ), }, - true, + types.NewParams(exported.Tendermint), + false, ), expPass: false, }, @@ -130,12 +132,13 @@ func (suite *TypesTestSuite) TestValidateGenesis() { types.NewIdentifiedClientState(exported.Localhost, localhosttypes.NewClientState("chaindID", types.ZeroHeight())), }, nil, - true, + types.NewParams(exported.Tendermint), + false, ), expPass: false, }, { - name: "invalid consensus state", + name: "invalid consensus state client id", genState: types.NewGenesisState( []types.IdentifiedClientState{ types.NewIdentifiedClientState( @@ -158,12 +161,13 @@ func (suite *TypesTestSuite) TestValidateGenesis() { }, ), }, - true, + types.NewParams(exported.Tendermint), + false, ), expPass: false, }, { - name: "invalid consensus state", + name: "invalid consensus state height", genState: types.NewGenesisState( []types.IdentifiedClientState{ types.NewIdentifiedClientState( @@ -186,6 +190,123 @@ func (suite *TypesTestSuite) TestValidateGenesis() { }, ), }, + types.NewParams(exported.Tendermint), + false, + ), + expPass: false, + }, + { + name: "invalid consensus state", + genState: types.NewGenesisState( + []types.IdentifiedClientState{ + types.NewIdentifiedClientState( + clientID, ibctmtypes.NewClientState(chainID, ibctmtypes.DefaultTrustLevel, ibctesting.TrustingPeriod, ibctesting.UnbondingPeriod, ibctesting.MaxClockDrift, clientHeight, ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false), + ), + types.NewIdentifiedClientState( + exported.Localhost, localhosttypes.NewClientState("chaindID", clientHeight), + ), + }, + []types.ClientConsensusStates{ + types.NewClientConsensusStates( + clientID, + []types.ConsensusStateWithHeight{ + types.NewConsensusStateWithHeight( + types.NewHeight(0, 1), + ibctmtypes.NewConsensusState( + time.Time{}, commitmenttypes.NewMerkleRoot(header.Header.GetAppHash()), header.Header.NextValidatorsHash, + ), + ), + }, + ), + }, + types.NewParams(exported.Tendermint), + false, + ), + expPass: false, + }, + { + name: "invalid params", + genState: types.NewGenesisState( + []types.IdentifiedClientState{ + types.NewIdentifiedClientState( + clientID, ibctmtypes.NewClientState(chainID, ibctesting.DefaultTrustLevel, ibctesting.TrustingPeriod, ibctesting.UnbondingPeriod, ibctesting.MaxClockDrift, clientHeight, ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false), + ), + types.NewIdentifiedClientState( + exported.Localhost, localhosttypes.NewClientState("chainID", clientHeight), + ), + }, + []types.ClientConsensusStates{ + types.NewClientConsensusStates( + clientID, + []types.ConsensusStateWithHeight{ + types.NewConsensusStateWithHeight( + header.GetHeight().(types.Height), + ibctmtypes.NewConsensusState( + header.GetTime(), commitmenttypes.NewMerkleRoot(header.Header.GetAppHash()), header.Header.NextValidatorsHash, + ), + ), + }, + ), + }, + types.NewParams(" "), + false, + ), + expPass: false, + }, + { + name: "invalid param", + genState: types.NewGenesisState( + []types.IdentifiedClientState{ + types.NewIdentifiedClientState( + clientID, ibctmtypes.NewClientState(chainID, ibctesting.DefaultTrustLevel, ibctesting.TrustingPeriod, ibctesting.UnbondingPeriod, ibctesting.MaxClockDrift, clientHeight, ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false), + ), + types.NewIdentifiedClientState( + exported.Localhost, localhosttypes.NewClientState("chainID", clientHeight), + ), + }, + []types.ClientConsensusStates{ + types.NewClientConsensusStates( + clientID, + []types.ConsensusStateWithHeight{ + types.NewConsensusStateWithHeight( + header.GetHeight().(types.Height), + ibctmtypes.NewConsensusState( + header.GetTime(), commitmenttypes.NewMerkleRoot(header.Header.GetAppHash()), header.Header.NextValidatorsHash, + ), + ), + }, + ), + }, + types.NewParams(" "), + true, + ), + expPass: false, + }, + { + name: "localhost client not registered on allowlist", + genState: types.NewGenesisState( + []types.IdentifiedClientState{ + types.NewIdentifiedClientState( + clientID, ibctmtypes.NewClientState(chainID, ibctesting.DefaultTrustLevel, ibctesting.TrustingPeriod, ibctesting.UnbondingPeriod, ibctesting.MaxClockDrift, clientHeight, ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), ibctesting.UpgradePath, false, false), + ), + types.NewIdentifiedClientState( + exported.Localhost, localhosttypes.NewClientState("chainID", clientHeight), + ), + }, + []types.ClientConsensusStates{ + types.NewClientConsensusStates( + clientID, + []types.ConsensusStateWithHeight{ + types.NewConsensusStateWithHeight( + header.GetHeight().(types.Height), + ibctmtypes.NewConsensusState( + header.GetTime(), commitmenttypes.NewMerkleRoot(header.Header.GetAppHash()), header.Header.NextValidatorsHash, + ), + ), + }, + ), + }, + types.NewParams(exported.Tendermint), true, ), expPass: false, diff --git a/x/ibc/core/02-client/types/params.go b/x/ibc/core/02-client/types/params.go new file mode 100644 index 0000000000..6477e3f6f4 --- /dev/null +++ b/x/ibc/core/02-client/types/params.go @@ -0,0 +1,71 @@ +package types + +import ( + "fmt" + "strings" + + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" +) + +var ( + // DefaultAllowedClients are "06-solomachine" and "07-tendermint" + DefaultAllowedClients = []string{exported.Solomachine, exported.Tendermint} + + // KeyAllowedClients is store's key for AllowedClients Params + KeyAllowedClients = []byte("AllowedClients") +) + +// ParamKeyTable type declaration for parameters +func ParamKeyTable() paramtypes.KeyTable { + return paramtypes.NewKeyTable().RegisterParamSet(&Params{}) +} + +// NewParams creates a new parameter configuration for the ibc transfer module +func NewParams(allowedClients ...string) Params { + return Params{ + AllowedClients: allowedClients, + } +} + +// DefaultParams is the default parameter configuration for the ibc-transfer module +func DefaultParams() Params { + return NewParams(DefaultAllowedClients...) +} + +// Validate all ibc-transfer module parameters +func (p Params) Validate() error { + return validateClients(p.AllowedClients) +} + +// ParamSetPairs implements params.ParamSet +func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { + return paramtypes.ParamSetPairs{ + paramtypes.NewParamSetPair(KeyAllowedClients, p.AllowedClients, validateClients), + } +} + +// IsAllowedClient checks if the given client type is registered on the allowlist. +func (p Params) IsAllowedClient(clientType string) bool { + for _, allowedClient := range p.AllowedClients { + if allowedClient == clientType { + return true + } + } + return false +} + +func validateClients(i interface{}) error { + clients, ok := i.([]string) + if !ok { + return fmt.Errorf("invalid parameter type: %T", i) + } + + for i, clientType := range clients { + if strings.TrimSpace(clientType) == "" { + return fmt.Errorf("client type %d cannot be blank", i) + } + } + + return nil +} diff --git a/x/ibc/core/02-client/types/params_test.go b/x/ibc/core/02-client/types/params_test.go new file mode 100644 index 0000000000..9484e48b4a --- /dev/null +++ b/x/ibc/core/02-client/types/params_test.go @@ -0,0 +1,29 @@ +package types + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" + "github.com/stretchr/testify/require" +) + +func TestValidateParams(t *testing.T) { + testCases := []struct { + name string + params Params + expPass bool + }{ + {"default params", DefaultParams(), true}, + {"custom params", NewParams(exported.Tendermint), true}, + {"blank client", NewParams(" "), false}, + } + + for _, tc := range testCases { + err := tc.params.Validate() + if tc.expPass { + require.NoError(t, err, tc.name) + } else { + require.Error(t, err, tc.name) + } + } +} diff --git a/x/ibc/core/02-client/types/query.pb.go b/x/ibc/core/02-client/types/query.pb.go index 3e250c9ead..755d401802 100644 --- a/x/ibc/core/02-client/types/query.pb.go +++ b/x/ibc/core/02-client/types/query.pb.go @@ -195,7 +195,7 @@ func (m *QueryClientStatesRequest) GetPagination() *query.PageRequest { // method. type QueryClientStatesResponse struct { // list of stored ClientStates of the chain. - ClientStates []*IdentifiedClientState `protobuf:"bytes,1,rep,name=client_states,json=clientStates,proto3" json:"client_states,omitempty"` + ClientStates IdentifiedClientStates `protobuf:"bytes,1,rep,name=client_states,json=clientStates,proto3,castrepeated=IdentifiedClientStates" json:"client_states"` // pagination response Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` } @@ -233,7 +233,7 @@ func (m *QueryClientStatesResponse) XXX_DiscardUnknown() { var xxx_messageInfo_QueryClientStatesResponse proto.InternalMessageInfo -func (m *QueryClientStatesResponse) GetClientStates() []*IdentifiedClientState { +func (m *QueryClientStatesResponse) GetClientStates() IdentifiedClientStates { if m != nil { return m.ClientStates } @@ -500,6 +500,89 @@ func (m *QueryConsensusStatesResponse) GetPagination() *query.PageResponse { return nil } +// QueryClientParamsRequest is the request type for the Query/ClientParams RPC method. +type QueryClientParamsRequest struct { +} + +func (m *QueryClientParamsRequest) Reset() { *m = QueryClientParamsRequest{} } +func (m *QueryClientParamsRequest) String() string { return proto.CompactTextString(m) } +func (*QueryClientParamsRequest) ProtoMessage() {} +func (*QueryClientParamsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_dc42cdfd1d52d76e, []int{8} +} +func (m *QueryClientParamsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryClientParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryClientParamsRequest.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 *QueryClientParamsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryClientParamsRequest.Merge(m, src) +} +func (m *QueryClientParamsRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryClientParamsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryClientParamsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryClientParamsRequest proto.InternalMessageInfo + +// QueryClientParamsResponse is the response type for the Query/ClientParams RPC method. +type QueryClientParamsResponse struct { + // params defines the parameters of the module. + Params *Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params,omitempty"` +} + +func (m *QueryClientParamsResponse) Reset() { *m = QueryClientParamsResponse{} } +func (m *QueryClientParamsResponse) String() string { return proto.CompactTextString(m) } +func (*QueryClientParamsResponse) ProtoMessage() {} +func (*QueryClientParamsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_dc42cdfd1d52d76e, []int{9} +} +func (m *QueryClientParamsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryClientParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryClientParamsResponse.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 *QueryClientParamsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryClientParamsResponse.Merge(m, src) +} +func (m *QueryClientParamsResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryClientParamsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryClientParamsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryClientParamsResponse proto.InternalMessageInfo + +func (m *QueryClientParamsResponse) GetParams() *Params { + if m != nil { + return m.Params + } + return nil +} + func init() { proto.RegisterType((*QueryClientStateRequest)(nil), "ibc.core.client.v1.QueryClientStateRequest") proto.RegisterType((*QueryClientStateResponse)(nil), "ibc.core.client.v1.QueryClientStateResponse") @@ -509,59 +592,66 @@ func init() { proto.RegisterType((*QueryConsensusStateResponse)(nil), "ibc.core.client.v1.QueryConsensusStateResponse") proto.RegisterType((*QueryConsensusStatesRequest)(nil), "ibc.core.client.v1.QueryConsensusStatesRequest") proto.RegisterType((*QueryConsensusStatesResponse)(nil), "ibc.core.client.v1.QueryConsensusStatesResponse") + proto.RegisterType((*QueryClientParamsRequest)(nil), "ibc.core.client.v1.QueryClientParamsRequest") + proto.RegisterType((*QueryClientParamsResponse)(nil), "ibc.core.client.v1.QueryClientParamsResponse") } func init() { proto.RegisterFile("ibc/core/client/v1/query.proto", fileDescriptor_dc42cdfd1d52d76e) } var fileDescriptor_dc42cdfd1d52d76e = []byte{ - // 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, + // 823 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0x4d, 0x4f, 0xdb, 0x48, + 0x18, 0xce, 0xf0, 0x25, 0x98, 0x04, 0x58, 0x8d, 0xd0, 0x6e, 0x30, 0xc8, 0x44, 0x5e, 0x2d, 0x9b, + 0xdd, 0x85, 0x19, 0x92, 0xdd, 0x2d, 0x52, 0x25, 0x0e, 0x05, 0x89, 0x96, 0x4b, 0x0b, 0xee, 0xa1, + 0x52, 0xa5, 0x0a, 0xd9, 0xce, 0xc4, 0xb1, 0x4a, 0x3c, 0x21, 0xe3, 0x44, 0x45, 0x88, 0x0b, 0x7f, + 0xa0, 0x95, 0x7a, 0xec, 0xb5, 0xa7, 0xaa, 0xea, 0xa5, 0x87, 0xfe, 0x83, 0x8a, 0x23, 0x52, 0x7b, + 0xe8, 0xa9, 0x1f, 0xd0, 0x1f, 0xd1, 0x63, 0xe5, 0x99, 0x31, 0xb1, 0x89, 0x11, 0x16, 0x6a, 0x4f, + 0xb1, 0xdf, 0xaf, 0x79, 0x9e, 0xe7, 0x7d, 0xdf, 0x71, 0xa0, 0xee, 0xd9, 0x0e, 0x71, 0x58, 0x9b, + 0x12, 0x67, 0xc7, 0xa3, 0x7e, 0x40, 0xba, 0x15, 0xb2, 0xdb, 0xa1, 0xed, 0x3d, 0xdc, 0x6a, 0xb3, + 0x80, 0x21, 0xe4, 0xd9, 0x0e, 0x0e, 0xfd, 0x58, 0xfa, 0x71, 0xb7, 0xa2, 0xfd, 0xed, 0x30, 0xde, + 0x64, 0x9c, 0xd8, 0x16, 0xa7, 0x32, 0x98, 0x74, 0x2b, 0x36, 0x0d, 0xac, 0x0a, 0x69, 0x59, 0xae, + 0xe7, 0x5b, 0x81, 0xc7, 0x7c, 0x99, 0xaf, 0xcd, 0xa5, 0xd4, 0x57, 0x95, 0x64, 0xc0, 0xb4, 0xcb, + 0x98, 0xbb, 0x43, 0x89, 0x78, 0xb3, 0x3b, 0x75, 0x62, 0xf9, 0xea, 0x6c, 0x6d, 0x56, 0xb9, 0xac, + 0x96, 0x47, 0x2c, 0xdf, 0x67, 0x81, 0x28, 0xcc, 0x95, 0x77, 0xca, 0x65, 0x2e, 0x13, 0x8f, 0x24, + 0x7c, 0x92, 0x56, 0xe3, 0x1a, 0xfc, 0x6d, 0x2b, 0x44, 0xb4, 0x26, 0xce, 0xb8, 0x1b, 0x58, 0x01, + 0x35, 0xe9, 0x6e, 0x87, 0xf2, 0x00, 0xcd, 0xc0, 0x31, 0x79, 0xf2, 0xb6, 0x57, 0x2b, 0x82, 0x12, + 0x28, 0x8f, 0x99, 0xa3, 0xd2, 0xb0, 0x51, 0x33, 0x5e, 0x01, 0x58, 0xec, 0x4f, 0xe4, 0x2d, 0xe6, + 0x73, 0x8a, 0x96, 0x61, 0x41, 0x65, 0xf2, 0xd0, 0x2e, 0x92, 0xf3, 0xd5, 0x29, 0x2c, 0xf1, 0xe1, + 0x08, 0x3a, 0xbe, 0xe1, 0xef, 0x99, 0x79, 0xa7, 0x57, 0x00, 0x4d, 0xc1, 0xe1, 0x56, 0x9b, 0xb1, + 0x7a, 0x71, 0xa0, 0x04, 0xca, 0x05, 0x53, 0xbe, 0xa0, 0x35, 0x58, 0x10, 0x0f, 0xdb, 0x0d, 0xea, + 0xb9, 0x8d, 0xa0, 0x38, 0x28, 0xca, 0x69, 0xb8, 0x5f, 0x6a, 0x7c, 0x4b, 0x44, 0xac, 0x0e, 0x1d, + 0x7d, 0x9c, 0xcb, 0x99, 0x79, 0x91, 0x25, 0x4d, 0x86, 0xdd, 0x8f, 0x97, 0x47, 0x4c, 0xd7, 0x21, + 0xec, 0x35, 0x42, 0xa1, 0x9d, 0xc7, 0xb2, 0x6b, 0x38, 0xec, 0x1a, 0x96, 0x2d, 0x56, 0x5d, 0xc3, + 0x9b, 0x96, 0x1b, 0xa9, 0x64, 0xc6, 0x32, 0x8d, 0xf7, 0x00, 0x4e, 0xa7, 0x1c, 0xa2, 0x54, 0xf1, + 0xe1, 0x78, 0x5c, 0x15, 0x5e, 0x04, 0xa5, 0xc1, 0x72, 0xbe, 0xfa, 0x57, 0x1a, 0x8f, 0x8d, 0x1a, + 0xf5, 0x03, 0xaf, 0xee, 0xd1, 0x5a, 0xac, 0xd4, 0xaa, 0x1e, 0xd2, 0x7a, 0xf1, 0x69, 0xee, 0xd7, + 0x54, 0x37, 0x37, 0x0b, 0x31, 0x2d, 0x39, 0xba, 0x99, 0x60, 0x35, 0x20, 0x58, 0xfd, 0x79, 0x29, + 0x2b, 0x09, 0x36, 0x41, 0xeb, 0x25, 0x80, 0x9a, 0xa4, 0x15, 0xba, 0x7c, 0xde, 0xe1, 0x99, 0xe7, + 0x04, 0xfd, 0x01, 0x27, 0xba, 0xb4, 0xcd, 0x3d, 0xe6, 0x6f, 0xfb, 0x9d, 0xa6, 0x4d, 0xdb, 0x02, + 0xc8, 0x90, 0x39, 0xae, 0xac, 0xb7, 0x85, 0x31, 0x1e, 0x16, 0x6b, 0x72, 0x2f, 0x4c, 0x36, 0x11, + 0xfd, 0x0e, 0xc7, 0x77, 0x42, 0x6e, 0x41, 0x14, 0x35, 0x54, 0x02, 0xe5, 0x51, 0xb3, 0x20, 0x8d, + 0xaa, 0xd3, 0x6f, 0x00, 0x9c, 0x49, 0x85, 0xab, 0xfa, 0xb0, 0x02, 0x27, 0x9d, 0xc8, 0x93, 0x61, + 0x40, 0x27, 0x9c, 0x44, 0x99, 0x9f, 0x39, 0xa3, 0x87, 0xe9, 0xc8, 0x79, 0x26, 0xa5, 0xd7, 0x53, + 0xda, 0x7d, 0x95, 0x21, 0x7e, 0x0b, 0xe0, 0x6c, 0x3a, 0x08, 0xa5, 0xdf, 0x03, 0xf8, 0xcb, 0x39, + 0xfd, 0xa2, 0x51, 0x5e, 0x48, 0xa3, 0x9b, 0x2c, 0x73, 0xcf, 0x0b, 0x1a, 0x09, 0x01, 0x26, 0x93, + 0xf2, 0xfe, 0xc0, 0xb1, 0xd5, 0x12, 0x1b, 0xbf, 0x69, 0xb5, 0xad, 0x66, 0xa4, 0xa4, 0x71, 0x27, + 0xb1, 0xa8, 0x91, 0x4f, 0x11, 0xac, 0xc2, 0x91, 0x96, 0xb0, 0xa8, 0xb9, 0x48, 0xed, 0xa2, 0xca, + 0x51, 0x91, 0xd5, 0x6f, 0x23, 0x70, 0x58, 0x54, 0x44, 0xcf, 0x01, 0xcc, 0xc7, 0xb6, 0x12, 0xfd, + 0x93, 0x96, 0x7d, 0xc1, 0x9d, 0xab, 0x2d, 0x64, 0x0b, 0x96, 0x40, 0x8d, 0xeb, 0x87, 0xef, 0xbe, + 0x3e, 0x1d, 0xf8, 0x0f, 0x55, 0x49, 0xff, 0x57, 0x43, 0x7e, 0x5f, 0x12, 0x17, 0x0e, 0xd9, 0x3f, + 0x9b, 0x9e, 0x03, 0xf4, 0x0c, 0xc0, 0x42, 0xfc, 0xf2, 0x40, 0x99, 0x8e, 0x8e, 0x04, 0xd4, 0x16, + 0x33, 0x46, 0x2b, 0xa4, 0x58, 0x20, 0x2d, 0xa3, 0xf9, 0x6c, 0x48, 0xd1, 0x17, 0x00, 0x27, 0x92, + 0x83, 0x83, 0xf0, 0xc5, 0x27, 0xa6, 0x5d, 0x4b, 0x1a, 0xc9, 0x1c, 0xaf, 0x30, 0xfa, 0x02, 0x63, + 0x03, 0xd5, 0x2f, 0xc6, 0x78, 0x6e, 0xec, 0xe3, 0x82, 0x12, 0x75, 0x53, 0x91, 0xfd, 0xe4, 0x7d, + 0x77, 0x40, 0xe4, 0x8d, 0xd0, 0xb3, 0xcb, 0xf7, 0x03, 0xf4, 0x1a, 0xc0, 0xc9, 0x73, 0x3b, 0x86, + 0xb2, 0x82, 0x3e, 0xeb, 0xc3, 0x52, 0xf6, 0x04, 0x45, 0x73, 0x45, 0xd0, 0x5c, 0x46, 0xff, 0x5f, + 0x89, 0x26, 0x7a, 0x7c, 0x36, 0x37, 0x72, 0x03, 0x2e, 0x9d, 0x9b, 0xc4, 0xe2, 0x5d, 0x3a, 0x37, + 0xc9, 0x55, 0x34, 0x0c, 0x01, 0x76, 0x16, 0x69, 0x12, 0x6c, 0x12, 0xa7, 0x5c, 0xbd, 0xd5, 0xad, + 0xa3, 0x13, 0x1d, 0x1c, 0x9f, 0xe8, 0xe0, 0xf3, 0x89, 0x0e, 0x9e, 0x9c, 0xea, 0xb9, 0xe3, 0x53, + 0x3d, 0xf7, 0xe1, 0x54, 0xcf, 0xdd, 0x5f, 0x76, 0xbd, 0xa0, 0xd1, 0xb1, 0xb1, 0xc3, 0x9a, 0x44, + 0xfd, 0x07, 0x93, 0x3f, 0x8b, 0xbc, 0xf6, 0x90, 0x3c, 0xea, 0x09, 0xb0, 0x54, 0x5d, 0x54, 0xb5, + 0x83, 0xbd, 0x16, 0xe5, 0xf6, 0x88, 0xf8, 0x02, 0xfc, 0xfb, 0x3d, 0x00, 0x00, 0xff, 0xff, 0xca, + 0xdc, 0xd5, 0x38, 0xee, 0x09, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -586,6 +676,8 @@ type QueryClient interface { // ConsensusStates queries all the consensus state associated with a given // client. ConsensusStates(ctx context.Context, in *QueryConsensusStatesRequest, opts ...grpc.CallOption) (*QueryConsensusStatesResponse, error) + // ClientParams queries all parameters of the ibc client. + ClientParams(ctx context.Context, in *QueryClientParamsRequest, opts ...grpc.CallOption) (*QueryClientParamsResponse, error) } type queryClient struct { @@ -632,6 +724,15 @@ func (c *queryClient) ConsensusStates(ctx context.Context, in *QueryConsensusSta return out, nil } +func (c *queryClient) ClientParams(ctx context.Context, in *QueryClientParamsRequest, opts ...grpc.CallOption) (*QueryClientParamsResponse, error) { + out := new(QueryClientParamsResponse) + err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Query/ClientParams", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. type QueryServer interface { // ClientState queries an IBC light client. @@ -644,6 +745,8 @@ type QueryServer interface { // ConsensusStates queries all the consensus state associated with a given // client. ConsensusStates(context.Context, *QueryConsensusStatesRequest) (*QueryConsensusStatesResponse, error) + // ClientParams queries all parameters of the ibc client. + ClientParams(context.Context, *QueryClientParamsRequest) (*QueryClientParamsResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -662,6 +765,9 @@ func (*UnimplementedQueryServer) ConsensusState(ctx context.Context, req *QueryC func (*UnimplementedQueryServer) ConsensusStates(ctx context.Context, req *QueryConsensusStatesRequest) (*QueryConsensusStatesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ConsensusStates not implemented") } +func (*UnimplementedQueryServer) ClientParams(ctx context.Context, req *QueryClientParamsRequest) (*QueryClientParamsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ClientParams not implemented") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -739,6 +845,24 @@ func _Query_ConsensusStates_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } +func _Query_ClientParams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryClientParamsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).ClientParams(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ibc.core.client.v1.Query/ClientParams", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).ClientParams(ctx, req.(*QueryClientParamsRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "ibc.core.client.v1.Query", HandlerType: (*QueryServer)(nil), @@ -759,6 +883,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "ConsensusStates", Handler: _Query_ConsensusStates_Handler, }, + { + MethodName: "ClientParams", + Handler: _Query_ClientParams_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "ibc/core/client/v1/query.proto", @@ -1123,6 +1251,64 @@ func (m *QueryConsensusStatesResponse) MarshalToSizedBuffer(dAtA []byte) (int, e return len(dAtA) - i, nil } +func (m *QueryClientParamsRequest) 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 *QueryClientParamsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryClientParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryClientParamsResponse) 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 *QueryClientParamsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryClientParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Params != nil { + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { offset -= sovQuery(v) base := offset @@ -1275,6 +1461,28 @@ func (m *QueryConsensusStatesResponse) Size() (n int) { return n } +func (m *QueryClientParamsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryClientParamsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Params != nil { + l = m.Params.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -1669,7 +1877,7 @@ func (m *QueryClientStatesResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ClientStates = append(m.ClientStates, &IdentifiedClientState{}) + m.ClientStates = append(m.ClientStates, IdentifiedClientState{}) if err := m.ClientStates[len(m.ClientStates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -2277,6 +2485,148 @@ func (m *QueryConsensusStatesResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryClientParamsRequest) 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 ErrIntOverflowQuery + } + 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: QueryClientParamsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryClientParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryClientParamsResponse) 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 ErrIntOverflowQuery + } + 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: QueryClientParamsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryClientParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Params == nil { + m.Params = &Params{} + } + if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 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 4d1cce8361..77b3df69a8 100644 --- a/x/ibc/core/02-client/types/query.pb.gw.go +++ b/x/ibc/core/02-client/types/query.pb.gw.go @@ -309,6 +309,24 @@ func local_request_Query_ConsensusStates_0(ctx context.Context, marshaler runtim } +func request_Query_ClientParams_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryClientParamsRequest + var metadata runtime.ServerMetadata + + msg, err := client.ClientParams(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_ClientParams_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryClientParamsRequest + var metadata runtime.ServerMetadata + + msg, err := server.ClientParams(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -395,6 +413,26 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_ClientParams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_ClientParams_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ClientParams_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -516,6 +554,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_ClientParams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_ClientParams_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ClientParams_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -527,6 +585,8 @@ var ( 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, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"ibc", "core", "client", "v1beta1", "consensus_states", "client_id"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_ClientParams_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"ibc", "client", "v1beta1", "params"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -537,4 +597,6 @@ var ( forward_Query_ConsensusState_0 = runtime.ForwardResponseMessage forward_Query_ConsensusStates_0 = runtime.ForwardResponseMessage + + forward_Query_ClientParams_0 = runtime.ForwardResponseMessage ) diff --git a/x/ibc/core/02-client/types/tx.pb.go b/x/ibc/core/02-client/types/tx.pb.go new file mode 100644 index 0000000000..4b637e5ba6 --- /dev/null +++ b/x/ibc/core/02-client/types/tx.pb.go @@ -0,0 +1,2128 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: ibc/core/client/v1/tx.proto + +package types + +import ( + context "context" + fmt "fmt" + types "github.com/cosmos/cosmos-sdk/codec/types" + _ "github.com/gogo/protobuf/gogoproto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// MsgCreateClient defines a message to create an IBC client +type MsgCreateClient struct { + // client unique identifier + ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty" yaml:"client_id"` + // light client state + ClientState *types.Any `protobuf:"bytes,2,opt,name=client_state,json=clientState,proto3" json:"client_state,omitempty" yaml:"client_state"` + // consensus state associated with the client that corresponds to a given + // height. + ConsensusState *types.Any `protobuf:"bytes,3,opt,name=consensus_state,json=consensusState,proto3" json:"consensus_state,omitempty" yaml:"consensus_state"` + // signer address + Signer string `protobuf:"bytes,4,opt,name=signer,proto3" json:"signer,omitempty"` +} + +func (m *MsgCreateClient) Reset() { *m = MsgCreateClient{} } +func (m *MsgCreateClient) String() string { return proto.CompactTextString(m) } +func (*MsgCreateClient) ProtoMessage() {} +func (*MsgCreateClient) Descriptor() ([]byte, []int) { + return fileDescriptor_cb5dc4651eb49a04, []int{0} +} +func (m *MsgCreateClient) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateClient) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateClient.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 *MsgCreateClient) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateClient.Merge(m, src) +} +func (m *MsgCreateClient) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateClient) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateClient.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateClient proto.InternalMessageInfo + +// MsgCreateClientResponse defines the Msg/CreateClient response type. +type MsgCreateClientResponse struct { +} + +func (m *MsgCreateClientResponse) Reset() { *m = MsgCreateClientResponse{} } +func (m *MsgCreateClientResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCreateClientResponse) ProtoMessage() {} +func (*MsgCreateClientResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cb5dc4651eb49a04, []int{1} +} +func (m *MsgCreateClientResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateClientResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateClientResponse.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 *MsgCreateClientResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateClientResponse.Merge(m, src) +} +func (m *MsgCreateClientResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateClientResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateClientResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateClientResponse proto.InternalMessageInfo + +// MsgUpdateClient defines an sdk.Msg to update a IBC client state using +// the given header. +type MsgUpdateClient struct { + // client unique identifier + ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty" yaml:"client_id"` + // header to update the light client + Header *types.Any `protobuf:"bytes,2,opt,name=header,proto3" json:"header,omitempty"` + // signer address + Signer string `protobuf:"bytes,3,opt,name=signer,proto3" json:"signer,omitempty"` +} + +func (m *MsgUpdateClient) Reset() { *m = MsgUpdateClient{} } +func (m *MsgUpdateClient) String() string { return proto.CompactTextString(m) } +func (*MsgUpdateClient) ProtoMessage() {} +func (*MsgUpdateClient) Descriptor() ([]byte, []int) { + return fileDescriptor_cb5dc4651eb49a04, []int{2} +} +func (m *MsgUpdateClient) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpdateClient) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpdateClient.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 *MsgUpdateClient) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpdateClient.Merge(m, src) +} +func (m *MsgUpdateClient) XXX_Size() int { + return m.Size() +} +func (m *MsgUpdateClient) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpdateClient.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpdateClient proto.InternalMessageInfo + +// MsgUpdateClientResponse defines the Msg/UpdateClient response type. +type MsgUpdateClientResponse struct { +} + +func (m *MsgUpdateClientResponse) Reset() { *m = MsgUpdateClientResponse{} } +func (m *MsgUpdateClientResponse) String() string { return proto.CompactTextString(m) } +func (*MsgUpdateClientResponse) ProtoMessage() {} +func (*MsgUpdateClientResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cb5dc4651eb49a04, []int{3} +} +func (m *MsgUpdateClientResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpdateClientResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpdateClientResponse.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 *MsgUpdateClientResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpdateClientResponse.Merge(m, src) +} +func (m *MsgUpdateClientResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgUpdateClientResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpdateClientResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpdateClientResponse proto.InternalMessageInfo + +// MsgUpgradeClient defines an sdk.Msg to upgrade an IBC client to a new client state +type MsgUpgradeClient struct { + // client unique identifier + ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty" yaml:"client_id"` + // upgraded client state + ClientState *types.Any `protobuf:"bytes,2,opt,name=client_state,json=clientState,proto3" json:"client_state,omitempty" yaml:"client_state"` + // height at which old chain halts and upgrades (i.e last block executed) + UpgradeHeight *Height `protobuf:"bytes,3,opt,name=upgrade_height,json=upgradeHeight,proto3" json:"upgrade_height,omitempty" yaml:"upgrade_height"` + // proof that old chain committed to new client + ProofUpgrade []byte `protobuf:"bytes,4,opt,name=proof_upgrade,json=proofUpgrade,proto3" json:"proof_upgrade,omitempty" yaml:"proof_upgrade"` + // signer address + Signer string `protobuf:"bytes,5,opt,name=signer,proto3" json:"signer,omitempty"` +} + +func (m *MsgUpgradeClient) Reset() { *m = MsgUpgradeClient{} } +func (m *MsgUpgradeClient) String() string { return proto.CompactTextString(m) } +func (*MsgUpgradeClient) ProtoMessage() {} +func (*MsgUpgradeClient) Descriptor() ([]byte, []int) { + return fileDescriptor_cb5dc4651eb49a04, []int{4} +} +func (m *MsgUpgradeClient) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpgradeClient) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpgradeClient.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 *MsgUpgradeClient) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpgradeClient.Merge(m, src) +} +func (m *MsgUpgradeClient) XXX_Size() int { + return m.Size() +} +func (m *MsgUpgradeClient) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpgradeClient.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpgradeClient proto.InternalMessageInfo + +func (m *MsgUpgradeClient) GetClientId() string { + if m != nil { + return m.ClientId + } + return "" +} + +func (m *MsgUpgradeClient) GetClientState() *types.Any { + if m != nil { + return m.ClientState + } + return nil +} + +func (m *MsgUpgradeClient) GetUpgradeHeight() *Height { + if m != nil { + return m.UpgradeHeight + } + return nil +} + +func (m *MsgUpgradeClient) GetProofUpgrade() []byte { + if m != nil { + return m.ProofUpgrade + } + return nil +} + +func (m *MsgUpgradeClient) GetSigner() string { + if m != nil { + return m.Signer + } + return "" +} + +// MsgUpgradeClientResponse defines the Msg/UpgradeClient response type. +type MsgUpgradeClientResponse struct { +} + +func (m *MsgUpgradeClientResponse) Reset() { *m = MsgUpgradeClientResponse{} } +func (m *MsgUpgradeClientResponse) String() string { return proto.CompactTextString(m) } +func (*MsgUpgradeClientResponse) ProtoMessage() {} +func (*MsgUpgradeClientResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cb5dc4651eb49a04, []int{5} +} +func (m *MsgUpgradeClientResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpgradeClientResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpgradeClientResponse.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 *MsgUpgradeClientResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpgradeClientResponse.Merge(m, src) +} +func (m *MsgUpgradeClientResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgUpgradeClientResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpgradeClientResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpgradeClientResponse proto.InternalMessageInfo + +// MsgSubmitMisbehaviour defines an sdk.Msg type that submits Evidence for +// light client misbehaviour. +type MsgSubmitMisbehaviour struct { + // client unique identifier + ClientId string `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty" yaml:"client_id"` + // misbehaviour used for freezing the light client + Misbehaviour *types.Any `protobuf:"bytes,2,opt,name=misbehaviour,proto3" json:"misbehaviour,omitempty"` + // signer address + Signer string `protobuf:"bytes,3,opt,name=signer,proto3" json:"signer,omitempty"` +} + +func (m *MsgSubmitMisbehaviour) Reset() { *m = MsgSubmitMisbehaviour{} } +func (m *MsgSubmitMisbehaviour) String() string { return proto.CompactTextString(m) } +func (*MsgSubmitMisbehaviour) ProtoMessage() {} +func (*MsgSubmitMisbehaviour) Descriptor() ([]byte, []int) { + return fileDescriptor_cb5dc4651eb49a04, []int{6} +} +func (m *MsgSubmitMisbehaviour) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgSubmitMisbehaviour) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgSubmitMisbehaviour.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 *MsgSubmitMisbehaviour) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgSubmitMisbehaviour.Merge(m, src) +} +func (m *MsgSubmitMisbehaviour) XXX_Size() int { + return m.Size() +} +func (m *MsgSubmitMisbehaviour) XXX_DiscardUnknown() { + xxx_messageInfo_MsgSubmitMisbehaviour.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgSubmitMisbehaviour proto.InternalMessageInfo + +// MsgSubmitMisbehaviourResponse defines the Msg/SubmitMisbehaviour response type. +type MsgSubmitMisbehaviourResponse struct { +} + +func (m *MsgSubmitMisbehaviourResponse) Reset() { *m = MsgSubmitMisbehaviourResponse{} } +func (m *MsgSubmitMisbehaviourResponse) String() string { return proto.CompactTextString(m) } +func (*MsgSubmitMisbehaviourResponse) ProtoMessage() {} +func (*MsgSubmitMisbehaviourResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cb5dc4651eb49a04, []int{7} +} +func (m *MsgSubmitMisbehaviourResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgSubmitMisbehaviourResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgSubmitMisbehaviourResponse.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 *MsgSubmitMisbehaviourResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgSubmitMisbehaviourResponse.Merge(m, src) +} +func (m *MsgSubmitMisbehaviourResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgSubmitMisbehaviourResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgSubmitMisbehaviourResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgSubmitMisbehaviourResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*MsgCreateClient)(nil), "ibc.core.client.v1.MsgCreateClient") + proto.RegisterType((*MsgCreateClientResponse)(nil), "ibc.core.client.v1.MsgCreateClientResponse") + proto.RegisterType((*MsgUpdateClient)(nil), "ibc.core.client.v1.MsgUpdateClient") + proto.RegisterType((*MsgUpdateClientResponse)(nil), "ibc.core.client.v1.MsgUpdateClientResponse") + proto.RegisterType((*MsgUpgradeClient)(nil), "ibc.core.client.v1.MsgUpgradeClient") + proto.RegisterType((*MsgUpgradeClientResponse)(nil), "ibc.core.client.v1.MsgUpgradeClientResponse") + proto.RegisterType((*MsgSubmitMisbehaviour)(nil), "ibc.core.client.v1.MsgSubmitMisbehaviour") + proto.RegisterType((*MsgSubmitMisbehaviourResponse)(nil), "ibc.core.client.v1.MsgSubmitMisbehaviourResponse") +} + +func init() { proto.RegisterFile("ibc/core/client/v1/tx.proto", fileDescriptor_cb5dc4651eb49a04) } + +var fileDescriptor_cb5dc4651eb49a04 = []byte{ + // 608 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x55, 0x3f, 0x6f, 0xd3, 0x40, + 0x14, 0x8f, 0x1b, 0x88, 0xda, 0x6b, 0xd2, 0x56, 0x26, 0x6d, 0x13, 0x23, 0xec, 0xca, 0x30, 0x14, + 0xd1, 0xda, 0x24, 0x0c, 0xa0, 0x4a, 0x0c, 0xa4, 0x0b, 0x0c, 0x91, 0xc0, 0x15, 0x03, 0x08, 0x29, + 0xf8, 0xcf, 0xf5, 0x62, 0x91, 0xf8, 0x22, 0xdf, 0x39, 0x6a, 0xbe, 0x01, 0x23, 0x12, 0x7c, 0x80, + 0x8a, 0x81, 0xcf, 0xc2, 0xc0, 0xd0, 0x91, 0x29, 0x42, 0xc9, 0xc2, 0x9c, 0x4f, 0x80, 0x7c, 0x77, + 0xb1, 0xec, 0x34, 0x89, 0x22, 0x58, 0x98, 0xe2, 0x77, 0xef, 0xf7, 0x7e, 0xef, 0xe7, 0xdf, 0x7b, + 0x17, 0x83, 0xdb, 0xbe, 0xe3, 0x9a, 0x2e, 0x0e, 0xa1, 0xe9, 0x76, 0x7c, 0x18, 0x50, 0xb3, 0x5f, + 0x33, 0xe9, 0x85, 0xd1, 0x0b, 0x31, 0xc5, 0xb2, 0xec, 0x3b, 0xae, 0x11, 0x27, 0x0d, 0x9e, 0x34, + 0xfa, 0x35, 0xa5, 0x8c, 0x30, 0xc2, 0x2c, 0x6d, 0xc6, 0x4f, 0x1c, 0xa9, 0x54, 0x11, 0xc6, 0xa8, + 0x03, 0x4d, 0x16, 0x39, 0xd1, 0xb9, 0x69, 0x07, 0x03, 0x91, 0xd2, 0xe6, 0x74, 0x10, 0x74, 0x0c, + 0xa0, 0x7f, 0x5e, 0x03, 0xdb, 0x4d, 0x82, 0x4e, 0x43, 0x68, 0x53, 0x78, 0xca, 0x32, 0x72, 0x0d, + 0x6c, 0x70, 0x4c, 0xcb, 0xf7, 0x2a, 0xd2, 0x81, 0x74, 0xb8, 0xd1, 0x28, 0x4f, 0x86, 0xda, 0xce, + 0xc0, 0xee, 0x76, 0x4e, 0xf4, 0x24, 0xa5, 0x5b, 0xeb, 0xfc, 0xf9, 0x85, 0x27, 0xbf, 0x04, 0x45, + 0x71, 0x4e, 0xa8, 0x4d, 0x61, 0x65, 0xed, 0x40, 0x3a, 0xdc, 0xac, 0x97, 0x0d, 0xae, 0xcc, 0x98, + 0x2a, 0x33, 0x9e, 0x05, 0x83, 0xc6, 0xfe, 0x64, 0xa8, 0xdd, 0xca, 0x70, 0xb1, 0x1a, 0xdd, 0xda, + 0xe4, 0xe1, 0x59, 0x1c, 0xc9, 0x6f, 0xc0, 0xb6, 0x8b, 0x03, 0x02, 0x03, 0x12, 0x11, 0x41, 0x9a, + 0x5f, 0x42, 0xaa, 0x4c, 0x86, 0xda, 0x9e, 0x20, 0xcd, 0x96, 0xe9, 0xd6, 0x56, 0x72, 0xc2, 0xa9, + 0xf7, 0x40, 0x81, 0xf8, 0x28, 0x80, 0x61, 0xe5, 0x46, 0xfc, 0x72, 0x96, 0x88, 0x4e, 0xd6, 0x3f, + 0x5e, 0x6a, 0xb9, 0xdf, 0x97, 0x5a, 0x4e, 0xaf, 0x82, 0xfd, 0x19, 0x53, 0x2c, 0x48, 0x7a, 0x31, + 0x8b, 0xfe, 0x45, 0x62, 0x86, 0xbd, 0xee, 0x79, 0xff, 0x64, 0xd8, 0x11, 0x28, 0xb4, 0xa1, 0xed, + 0xc1, 0x70, 0x99, 0x55, 0x96, 0xc0, 0xa4, 0x14, 0xe7, 0x97, 0x2a, 0x4e, 0xab, 0x4a, 0x14, 0xff, + 0x58, 0x03, 0x3b, 0x2c, 0x87, 0x42, 0xdb, 0xfb, 0xaf, 0x66, 0xfc, 0x0e, 0x6c, 0x45, 0x5c, 0x55, + 0xab, 0x0d, 0x7d, 0xd4, 0xa6, 0x62, 0xc4, 0x8a, 0x71, 0x7d, 0xf7, 0x8d, 0xe7, 0x0c, 0xd1, 0xa8, + 0x4e, 0x86, 0xda, 0x2e, 0x67, 0xce, 0xd6, 0xea, 0x56, 0x49, 0x1c, 0x70, 0xa4, 0xfc, 0x14, 0x94, + 0x7a, 0x21, 0xc6, 0xe7, 0x2d, 0x71, 0xcc, 0xa6, 0x5d, 0x6c, 0x54, 0x26, 0x43, 0xad, 0xcc, 0x09, + 0x32, 0x69, 0xdd, 0x2a, 0xb2, 0x58, 0xf8, 0x94, 0xf2, 0xfc, 0x66, 0xda, 0x73, 0x5d, 0x01, 0x95, + 0x59, 0x37, 0x13, 0xab, 0xbf, 0x49, 0x60, 0xb7, 0x49, 0xd0, 0x59, 0xe4, 0x74, 0x7d, 0xda, 0xf4, + 0x89, 0x03, 0xdb, 0x76, 0xdf, 0xc7, 0x51, 0xf8, 0x37, 0x7e, 0x3f, 0x01, 0xc5, 0x6e, 0x8a, 0x62, + 0xe9, 0xa2, 0x64, 0x90, 0x2b, 0xac, 0x8b, 0x06, 0xee, 0xcc, 0xd5, 0x39, 0x7d, 0x93, 0xfa, 0xd7, + 0x3c, 0xc8, 0x37, 0x09, 0x92, 0xdf, 0x83, 0x62, 0xe6, 0xbf, 0xe1, 0xee, 0xbc, 0xd1, 0xcc, 0xdc, + 0x15, 0xe5, 0xc1, 0x0a, 0xa0, 0x69, 0xa7, 0xb8, 0x43, 0xe6, 0x32, 0x2d, 0xea, 0x90, 0x06, 0x2d, + 0xec, 0x30, 0xef, 0x02, 0xc8, 0x2e, 0x28, 0x65, 0x97, 0xff, 0xde, 0xc2, 0xea, 0x14, 0x4a, 0x39, + 0x5a, 0x05, 0x95, 0x34, 0x09, 0x81, 0x3c, 0x67, 0xec, 0xf7, 0x17, 0x70, 0x5c, 0x87, 0x2a, 0xb5, + 0x95, 0xa1, 0xd3, 0x9e, 0x8d, 0x57, 0xdf, 0x47, 0xaa, 0x74, 0x35, 0x52, 0xa5, 0x5f, 0x23, 0x55, + 0xfa, 0x34, 0x56, 0x73, 0x57, 0x63, 0x35, 0xf7, 0x73, 0xac, 0xe6, 0xde, 0x3e, 0x46, 0x3e, 0x6d, + 0x47, 0x8e, 0xe1, 0xe2, 0xae, 0xe9, 0x62, 0xd2, 0xc5, 0x44, 0xfc, 0x1c, 0x13, 0xef, 0x83, 0x79, + 0x61, 0x26, 0x9f, 0x85, 0x87, 0xf5, 0x63, 0xf1, 0x65, 0xa0, 0x83, 0x1e, 0x24, 0x4e, 0x81, 0xad, + 0xd5, 0xa3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb1, 0x03, 0x55, 0x1e, 0x9b, 0x06, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// MsgClient is the client API for Msg service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type MsgClient interface { + // CreateClient defines a rpc handler method for MsgCreateClient. + CreateClient(ctx context.Context, in *MsgCreateClient, opts ...grpc.CallOption) (*MsgCreateClientResponse, error) + // UpdateClient defines a rpc handler method for MsgUpdateClient. + UpdateClient(ctx context.Context, in *MsgUpdateClient, opts ...grpc.CallOption) (*MsgUpdateClientResponse, error) + // UpgradeClient defines a rpc handler method for MsgUpgradeClient. + UpgradeClient(ctx context.Context, in *MsgUpgradeClient, opts ...grpc.CallOption) (*MsgUpgradeClientResponse, error) + // SubmitMisbehaviour defines a rpc handler method for MsgSubmitMisbehaviour. + SubmitMisbehaviour(ctx context.Context, in *MsgSubmitMisbehaviour, opts ...grpc.CallOption) (*MsgSubmitMisbehaviourResponse, error) +} + +type msgClient struct { + cc grpc1.ClientConn +} + +func NewMsgClient(cc grpc1.ClientConn) MsgClient { + return &msgClient{cc} +} + +func (c *msgClient) CreateClient(ctx context.Context, in *MsgCreateClient, opts ...grpc.CallOption) (*MsgCreateClientResponse, error) { + out := new(MsgCreateClientResponse) + err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Msg/CreateClient", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) UpdateClient(ctx context.Context, in *MsgUpdateClient, opts ...grpc.CallOption) (*MsgUpdateClientResponse, error) { + out := new(MsgUpdateClientResponse) + err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Msg/UpdateClient", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) UpgradeClient(ctx context.Context, in *MsgUpgradeClient, opts ...grpc.CallOption) (*MsgUpgradeClientResponse, error) { + out := new(MsgUpgradeClientResponse) + err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Msg/UpgradeClient", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) SubmitMisbehaviour(ctx context.Context, in *MsgSubmitMisbehaviour, opts ...grpc.CallOption) (*MsgSubmitMisbehaviourResponse, error) { + out := new(MsgSubmitMisbehaviourResponse) + err := c.cc.Invoke(ctx, "/ibc.core.client.v1.Msg/SubmitMisbehaviour", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MsgServer is the server API for Msg service. +type MsgServer interface { + // CreateClient defines a rpc handler method for MsgCreateClient. + CreateClient(context.Context, *MsgCreateClient) (*MsgCreateClientResponse, error) + // UpdateClient defines a rpc handler method for MsgUpdateClient. + UpdateClient(context.Context, *MsgUpdateClient) (*MsgUpdateClientResponse, error) + // UpgradeClient defines a rpc handler method for MsgUpgradeClient. + UpgradeClient(context.Context, *MsgUpgradeClient) (*MsgUpgradeClientResponse, error) + // SubmitMisbehaviour defines a rpc handler method for MsgSubmitMisbehaviour. + SubmitMisbehaviour(context.Context, *MsgSubmitMisbehaviour) (*MsgSubmitMisbehaviourResponse, error) +} + +// UnimplementedMsgServer can be embedded to have forward compatible implementations. +type UnimplementedMsgServer struct { +} + +func (*UnimplementedMsgServer) CreateClient(ctx context.Context, req *MsgCreateClient) (*MsgCreateClientResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateClient not implemented") +} +func (*UnimplementedMsgServer) UpdateClient(ctx context.Context, req *MsgUpdateClient) (*MsgUpdateClientResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateClient not implemented") +} +func (*UnimplementedMsgServer) UpgradeClient(ctx context.Context, req *MsgUpgradeClient) (*MsgUpgradeClientResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpgradeClient not implemented") +} +func (*UnimplementedMsgServer) SubmitMisbehaviour(ctx context.Context, req *MsgSubmitMisbehaviour) (*MsgSubmitMisbehaviourResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SubmitMisbehaviour not implemented") +} + +func RegisterMsgServer(s grpc1.Server, srv MsgServer) { + s.RegisterService(&_Msg_serviceDesc, srv) +} + +func _Msg_CreateClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgCreateClient) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).CreateClient(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ibc.core.client.v1.Msg/CreateClient", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).CreateClient(ctx, req.(*MsgCreateClient)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_UpdateClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgUpdateClient) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).UpdateClient(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ibc.core.client.v1.Msg/UpdateClient", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).UpdateClient(ctx, req.(*MsgUpdateClient)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_UpgradeClient_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgUpgradeClient) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).UpgradeClient(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ibc.core.client.v1.Msg/UpgradeClient", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).UpgradeClient(ctx, req.(*MsgUpgradeClient)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_SubmitMisbehaviour_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgSubmitMisbehaviour) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).SubmitMisbehaviour(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ibc.core.client.v1.Msg/SubmitMisbehaviour", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).SubmitMisbehaviour(ctx, req.(*MsgSubmitMisbehaviour)) + } + return interceptor(ctx, in, info, handler) +} + +var _Msg_serviceDesc = grpc.ServiceDesc{ + ServiceName: "ibc.core.client.v1.Msg", + HandlerType: (*MsgServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateClient", + Handler: _Msg_CreateClient_Handler, + }, + { + MethodName: "UpdateClient", + Handler: _Msg_UpdateClient_Handler, + }, + { + MethodName: "UpgradeClient", + Handler: _Msg_UpgradeClient_Handler, + }, + { + MethodName: "SubmitMisbehaviour", + Handler: _Msg_SubmitMisbehaviour_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "ibc/core/client/v1/tx.proto", +} + +func (m *MsgCreateClient) 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 *MsgCreateClient) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateClient) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signer) > 0 { + i -= len(m.Signer) + copy(dAtA[i:], m.Signer) + i = encodeVarintTx(dAtA, i, uint64(len(m.Signer))) + i-- + dAtA[i] = 0x22 + } + if m.ConsensusState != nil { + { + size, err := m.ConsensusState.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.ClientState != nil { + { + size, err := m.ClientState.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.ClientId) > 0 { + i -= len(m.ClientId) + copy(dAtA[i:], m.ClientId) + i = encodeVarintTx(dAtA, i, uint64(len(m.ClientId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgCreateClientResponse) 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 *MsgCreateClientResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateClientResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgUpdateClient) 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 *MsgUpdateClient) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateClient) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signer) > 0 { + i -= len(m.Signer) + copy(dAtA[i:], m.Signer) + i = encodeVarintTx(dAtA, i, uint64(len(m.Signer))) + i-- + dAtA[i] = 0x1a + } + if m.Header != nil { + { + size, err := m.Header.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.ClientId) > 0 { + i -= len(m.ClientId) + copy(dAtA[i:], m.ClientId) + i = encodeVarintTx(dAtA, i, uint64(len(m.ClientId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgUpdateClientResponse) 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 *MsgUpdateClientResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateClientResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgUpgradeClient) 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 *MsgUpgradeClient) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpgradeClient) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signer) > 0 { + i -= len(m.Signer) + copy(dAtA[i:], m.Signer) + i = encodeVarintTx(dAtA, i, uint64(len(m.Signer))) + i-- + dAtA[i] = 0x2a + } + if len(m.ProofUpgrade) > 0 { + i -= len(m.ProofUpgrade) + copy(dAtA[i:], m.ProofUpgrade) + i = encodeVarintTx(dAtA, i, uint64(len(m.ProofUpgrade))) + i-- + dAtA[i] = 0x22 + } + if m.UpgradeHeight != nil { + { + size, err := m.UpgradeHeight.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.ClientState != nil { + { + size, err := m.ClientState.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.ClientId) > 0 { + i -= len(m.ClientId) + copy(dAtA[i:], m.ClientId) + i = encodeVarintTx(dAtA, i, uint64(len(m.ClientId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgUpgradeClientResponse) 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 *MsgUpgradeClientResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpgradeClientResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgSubmitMisbehaviour) 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 *MsgSubmitMisbehaviour) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgSubmitMisbehaviour) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signer) > 0 { + i -= len(m.Signer) + copy(dAtA[i:], m.Signer) + i = encodeVarintTx(dAtA, i, uint64(len(m.Signer))) + i-- + dAtA[i] = 0x1a + } + if m.Misbehaviour != nil { + { + size, err := m.Misbehaviour.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.ClientId) > 0 { + i -= len(m.ClientId) + copy(dAtA[i:], m.ClientId) + i = encodeVarintTx(dAtA, i, uint64(len(m.ClientId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgSubmitMisbehaviourResponse) 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 *MsgSubmitMisbehaviourResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgSubmitMisbehaviourResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func encodeVarintTx(dAtA []byte, offset int, v uint64) int { + offset -= sovTx(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *MsgCreateClient) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClientId) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.ClientState != nil { + l = m.ClientState.Size() + n += 1 + l + sovTx(uint64(l)) + } + if m.ConsensusState != nil { + l = m.ConsensusState.Size() + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Signer) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgCreateClientResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgUpdateClient) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClientId) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Signer) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgUpdateClientResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgUpgradeClient) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClientId) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.ClientState != nil { + l = m.ClientState.Size() + n += 1 + l + sovTx(uint64(l)) + } + if m.UpgradeHeight != nil { + l = m.UpgradeHeight.Size() + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.ProofUpgrade) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Signer) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgUpgradeClientResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgSubmitMisbehaviour) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ClientId) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.Misbehaviour != nil { + l = m.Misbehaviour.Size() + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Signer) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgSubmitMisbehaviourResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func sovTx(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTx(x uint64) (n int) { + return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MsgCreateClient) 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 ErrIntOverflowTx + } + 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: MsgCreateClient: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateClient: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientState", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ClientState == nil { + m.ClientState = &types.Any{} + } + if err := m.ClientState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConsensusState", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ConsensusState == nil { + m.ConsensusState = &types.Any{} + } + if err := m.ConsensusState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreateClientResponse) 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 ErrIntOverflowTx + } + 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: MsgCreateClientResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateClientResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgUpdateClient) 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 ErrIntOverflowTx + } + 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: MsgUpdateClient: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpdateClient: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &types.Any{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgUpdateClientResponse) 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 ErrIntOverflowTx + } + 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: MsgUpdateClientResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpdateClientResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgUpgradeClient) 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 ErrIntOverflowTx + } + 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: MsgUpgradeClient: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpgradeClient: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientState", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ClientState == nil { + m.ClientState = &types.Any{} + } + if err := m.ClientState.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UpgradeHeight", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.UpgradeHeight == nil { + m.UpgradeHeight = &Height{} + } + if err := m.UpgradeHeight.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProofUpgrade", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ProofUpgrade = append(m.ProofUpgrade[:0], dAtA[iNdEx:postIndex]...) + if m.ProofUpgrade == nil { + m.ProofUpgrade = []byte{} + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgUpgradeClientResponse) 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 ErrIntOverflowTx + } + 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: MsgUpgradeClientResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpgradeClientResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgSubmitMisbehaviour) 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 ErrIntOverflowTx + } + 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: MsgSubmitMisbehaviour: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgSubmitMisbehaviour: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Misbehaviour", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Misbehaviour == nil { + m.Misbehaviour = &types.Any{} + } + if err := m.Misbehaviour.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgSubmitMisbehaviourResponse) 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 ErrIntOverflowTx + } + 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: MsgSubmitMisbehaviourResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgSubmitMisbehaviourResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTx(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTx + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTx + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTx + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/ibc/core/03-connection/keeper/grpc_query_test.go b/x/ibc/core/03-connection/keeper/grpc_query_test.go index 5a8122e279..7e27b5af10 100644 --- a/x/ibc/core/03-connection/keeper/grpc_query_test.go +++ b/x/ibc/core/03-connection/keeper/grpc_query_test.go @@ -47,7 +47,7 @@ func (suite *KeeperTestSuite) TestQueryConnection() { { "success", func() { - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA := suite.chainA.GetFirstTestConnection(clientA, clientB) connB := suite.chainB.GetFirstTestConnection(clientB, clientA) @@ -111,11 +111,11 @@ func (suite *KeeperTestSuite) TestQueryConnections() { { "success", func() { - clientA, clientB, connA0, connB0 := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB, connA0, connB0 := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) connA1, connB1, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) - clientA1, clientB1, connA2, connB2 := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA1, clientB1, connA2, connB2 := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) counterparty1 := types.NewCounterparty(clientB, connB0.ID, suite.chainB.GetPrefix()) counterparty2 := types.NewCounterparty(clientB, connB1.ID, suite.chainB.GetPrefix()) @@ -197,7 +197,7 @@ func (suite *KeeperTestSuite) TestQueryClientConnections() { { "success", func() { - clientA, clientB, connA0, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB, connA0, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) connA1, _ := suite.coordinator.CreateConnection(suite.chainA, suite.chainB, clientA, clientB) expPaths = []string{connA0.ID, connA1.ID} suite.chainA.App.IBCKeeper.ConnectionKeeper.SetClientConnectionPaths(suite.chainA.GetContext(), clientA, expPaths) @@ -282,7 +282,7 @@ func (suite *KeeperTestSuite) TestQueryConnectionClientState() { { "success", func() { - clientA, _, connA, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _, connA, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) expClientState := suite.chainA.GetClientState(clientA) expIdentifiedClientState = clienttypes.NewIdentifiedClientState(clientA, expClientState) @@ -371,7 +371,7 @@ func (suite *KeeperTestSuite) TestQueryConnectionConsensusState() { { "success", func() { - clientA, _, connA, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _, connA, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) clientState := suite.chainA.GetClientState(clientA) expConsensusState, _ = suite.chainA.GetConsensusState(clientA, clientState.GetLatestHeight()) diff --git a/x/ibc/core/03-connection/keeper/handshake_test.go b/x/ibc/core/03-connection/keeper/handshake_test.go index 9037810864..74ccbf7cb9 100644 --- a/x/ibc/core/03-connection/keeper/handshake_test.go +++ b/x/ibc/core/03-connection/keeper/handshake_test.go @@ -27,26 +27,26 @@ func (suite *KeeperTestSuite) TestConnOpenInit() { expPass bool }{ {"success", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) }, true}, {"success with empty counterparty identifier", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) emptyConnBID = true }, true}, {"success with non empty version", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) version = types.ExportedVersionsToProto(types.GetCompatibleVersions())[0] }, true}, {"connection already exists", func() { - clientA, clientB, _, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB, _, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) }, false}, {"invalid version", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) version = &types.Version{} }, false}, {"couldn't add connection to client", func() { // swap client identifiers to result in client that does not exist - clientB, clientA = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientB, clientA = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) }, false}, } @@ -94,7 +94,7 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { expPass bool }{ {"success", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) _, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -102,7 +102,7 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { counterpartyClient = suite.chainA.GetClientState(clientA) }, true}, {"success with empty counterpartyChosenConnectionID", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -114,17 +114,17 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { suite.chainA.App.IBCKeeper.ConnectionKeeper.SetConnection(suite.chainA.GetContext(), connA.ID, connection) - err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) - err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) suite.Require().NoError(err) // retrieve client state of chainA to pass as counterpartyClient counterpartyClient = suite.chainA.GetClientState(clientA) }, true}, {"counterpartyChosenConnectionID does not match desiredConnectionID", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -136,17 +136,17 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { suite.chainA.App.IBCKeeper.ConnectionKeeper.SetConnection(suite.chainA.GetContext(), connA.ID, connection) - err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) - err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) suite.Require().NoError(err) // retrieve client state of chainA to pass as counterpartyClient counterpartyClient = suite.chainA.GetClientState(clientA) }, false}, {"invalid counterparty client", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) _, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -161,7 +161,7 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { suite.chainA.App.IBCKeeper.ClientKeeper.SetClientState(suite.chainA.GetContext(), clientA, tmClient) }, false}, {"consensus height >= latest height", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) _, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -171,7 +171,7 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { consensusHeight = clienttypes.GetSelfHeight(suite.chainB.GetContext()) }, false}, {"self consensus state not found", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) _, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -181,7 +181,7 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { consensusHeight = clienttypes.NewHeight(0, 1) }, false}, {"counterparty versions is empty", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) _, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -191,7 +191,7 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { versions = nil }, false}, {"counterparty versions don't have a match", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) _, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -202,14 +202,14 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { versions = []exported.Version{version} }, false}, {"connection state verification failed", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) // chainA connection not created // retrieve client state of chainA to pass as counterpartyClient counterpartyClient = suite.chainA.GetClientState(clientA) }, false}, {"client state verification failed", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) _, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -222,7 +222,7 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { tmClient.LatestHeight = tmClient.LatestHeight.Increment() }, false}, {"consensus state verification failed", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) // retrieve client state of chainA to pass as counterpartyClient counterpartyClient = suite.chainA.GetClientState(clientA) @@ -241,7 +241,7 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { suite.Require().NoError(err) }, false}, {"invalid previous connection is in TRYOPEN", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) // open init chainA connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) @@ -251,14 +251,14 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { err = suite.coordinator.ConnOpenTry(suite.chainB, suite.chainA, connB, connA) suite.Require().NoError(err) - err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) suite.Require().NoError(err) // retrieve client state of chainA to pass as counterpartyClient counterpartyClient = suite.chainA.GetClientState(clientA) }, false}, {"invalid previous connection has invalid versions", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) // open init chainA connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) @@ -277,7 +277,7 @@ func (suite *KeeperTestSuite) TestConnOpenTry() { suite.chainB.App.IBCKeeper.ConnectionKeeper.SetConnection(suite.chainB.GetContext(), connB.ID, connection) - err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) suite.Require().NoError(err) // retrieve client state of chainA to pass as counterpartyClient @@ -353,7 +353,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { expPass bool }{ {"success", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -364,7 +364,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { counterpartyClient = suite.chainB.GetClientState(clientB) }, true}, {"success with empty stored counterparty connection ID", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -381,10 +381,10 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { suite.chainA.App.IBCKeeper.ConnectionKeeper.SetConnection(suite.chainA.GetContext(), connA.ID, connection) - err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) suite.Require().NoError(err) - err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) // retrieve client state of chainB to pass as counterpartyClient @@ -392,7 +392,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { }, true}, {"success from tryopen", func() { // chainA is in TRYOPEN, chainB is in TRYOPEN - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connB, connA, err := suite.coordinator.ConnOpenInit(suite.chainB, suite.chainA, clientB, clientA) suite.Require().NoError(err) @@ -404,16 +404,16 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { connection.State = types.TRYOPEN suite.chainB.App.IBCKeeper.ConnectionKeeper.SetConnection(suite.chainB.GetContext(), connB.ID, connection) // update clientB so state change is committed - suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) // retrieve client state of chainB to pass as counterpartyClient counterpartyClient = suite.chainB.GetClientState(clientB) }, true}, {"success from tryopen with empty stored connection id", func() { // chainA is in TRYOPEN, chainB is in TRYOPEN - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connB, connA, err := suite.coordinator.ConnOpenInit(suite.chainB, suite.chainA, clientB, clientA) suite.Require().NoError(err) @@ -435,15 +435,15 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { suite.chainA.App.IBCKeeper.ConnectionKeeper.SetConnection(suite.chainA.GetContext(), connA.ID, connection) // update clientB so state change is committed - suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) // retrieve client state of chainB to pass as counterpartyClient counterpartyClient = suite.chainB.GetClientState(clientB) }, true}, {"invalid counterparty client", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -461,7 +461,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { suite.Require().NoError(err) }, false}, {"consensus height >= latest height", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -475,13 +475,13 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { }, false}, {"connection not found", func() { // connections are never created - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) // retrieve client state of chainB to pass as counterpartyClient counterpartyClient = suite.chainB.GetClientState(clientB) }, false}, {"invalid counterparty connection ID", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -499,15 +499,15 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { suite.chainA.App.IBCKeeper.ConnectionKeeper.SetConnection(suite.chainA.GetContext(), connA.ID, connection) - err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) - err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) suite.Require().NoError(err) }, false}, {"connection state is not INIT", func() { // connection state is already OPEN on chainA - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -522,7 +522,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { }, false}, {"connection is in INIT but the proposed version is invalid", func() { // chainA is in INIT, chainB is in TRYOPEN - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -536,7 +536,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { }, false}, {"connection is in TRYOPEN but the set version in the connection is invalid", func() { // chainA is in TRYOPEN, chainB is in TRYOPEN - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connB, connA, err := suite.coordinator.ConnOpenInit(suite.chainB, suite.chainA, clientB, clientA) suite.Require().NoError(err) @@ -549,8 +549,8 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { suite.chainB.App.IBCKeeper.ConnectionKeeper.SetConnection(suite.chainB.GetContext(), connB.ID, connection) // update clientB so state change is committed - suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) // retrieve client state of chainB to pass as counterpartyClient counterpartyClient = suite.chainB.GetClientState(clientB) @@ -558,7 +558,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { version = types.NewVersion("2.0", nil) }, false}, {"incompatible IBC versions", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -572,7 +572,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { version = types.NewVersion("2.0", nil) }, false}, {"empty version", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -585,7 +585,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { version = &types.Version{} }, false}, {"feature set verification failed - unsupported feature", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -598,7 +598,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { version = types.NewVersion(types.DefaultIBCVersionIdentifier, []string{"ORDER_ORDERED", "ORDER_UNORDERED", "ORDER_DAG"}) }, false}, {"self consensus state not found", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -612,7 +612,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { }, false}, {"connection state verification failed", func() { // chainB connection is not in INIT - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) _, _, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -620,7 +620,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { counterpartyClient = suite.chainB.GetClientState(clientB) }, false}, {"client state verification failed", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -636,7 +636,7 @@ func (suite *KeeperTestSuite) TestConnOpenAck() { suite.Require().NoError(err) }, false}, {"consensus state verification failed", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -717,7 +717,7 @@ func (suite *KeeperTestSuite) TestConnOpenConfirm() { expPass bool }{ {"success", func() { - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -729,15 +729,15 @@ func (suite *KeeperTestSuite) TestConnOpenConfirm() { }, true}, {"connection not found", func() { // connections are never created - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) }, false}, {"chain B's connection state is not TRYOPEN", func() { // connections are OPEN - clientA, clientB, _, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB, _, _ = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) }, false}, {"connection state verification failed", func() { // chainA is in INIT - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -779,7 +779,7 @@ func (suite *KeeperTestSuite) TestConnOpenConfirm() { // package. func (suite *KeeperTestSuite) TestConsensusParamsValidation() { // invalid client state in ConnOpenTry - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -804,7 +804,7 @@ func (suite *KeeperTestSuite) TestConsensusParamsValidation() { suite.SetupTest() // reset // invalid client state in ConnOpenAck - clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA, connB, err = suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) diff --git a/x/ibc/core/03-connection/keeper/keeper_test.go b/x/ibc/core/03-connection/keeper/keeper_test.go index 3ae867a5a0..cf8f447179 100644 --- a/x/ibc/core/03-connection/keeper/keeper_test.go +++ b/x/ibc/core/03-connection/keeper/keeper_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/x/ibc/core/03-connection/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -31,7 +32,7 @@ func TestKeeperTestSuite(t *testing.T) { } func (suite *KeeperTestSuite) TestSetAndGetConnection() { - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) connA := suite.chainA.GetFirstTestConnection(clientA, clientB) _, existed := suite.chainA.App.IBCKeeper.ConnectionKeeper.GetConnection(suite.chainA.GetContext(), connA.ID) suite.Require().False(existed) @@ -42,7 +43,7 @@ func (suite *KeeperTestSuite) TestSetAndGetConnection() { } func (suite *KeeperTestSuite) TestSetAndGetClientConnectionPaths() { - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) _, existed := suite.chainA.App.IBCKeeper.ConnectionKeeper.GetClientConnectionPaths(suite.chainA.GetContext(), clientA) suite.False(existed) @@ -55,7 +56,7 @@ func (suite *KeeperTestSuite) TestSetAndGetClientConnectionPaths() { // create 2 connections: A0 - B0, A1 - B1 func (suite KeeperTestSuite) TestGetAllConnections() { - clientA, clientB, connA0, connB0 := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB, connA0, connB0 := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) connA1, connB1 := suite.coordinator.CreateConnection(suite.chainA, suite.chainB, clientA, clientB) counterpartyB0 := types.NewCounterparty(clientB, connB0.ID, suite.chainB.GetPrefix()) // connection B0 @@ -77,8 +78,8 @@ func (suite KeeperTestSuite) TestGetAllConnections() { // the test creates 2 clients clientA0 and clientA1. clientA0 has a single // connection and clientA1 has 2 connections. func (suite KeeperTestSuite) TestGetAllClientConnectionPaths() { - clientA0, _, connA0, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) - clientA1, clientB1, connA1, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA0, _, connA0, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) + clientA1, clientB1, connA1, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) connA2, _ := suite.coordinator.CreateConnection(suite.chainA, suite.chainB, clientA1, clientB1) expPaths := []types.ConnectionPaths{ @@ -102,7 +103,7 @@ func (suite *KeeperTestSuite) TestGetTimestampAtHeight() { expPass bool }{ {"verification success", func() { - _, _, connA, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) connection = suite.chainA.GetConnection(connA) }, true}, {"consensus state not found", func() { diff --git a/x/ibc/core/03-connection/keeper/verify_test.go b/x/ibc/core/03-connection/keeper/verify_test.go index c9db5cc2bf..ace373e12a 100644 --- a/x/ibc/core/03-connection/keeper/verify_test.go +++ b/x/ibc/core/03-connection/keeper/verify_test.go @@ -38,7 +38,7 @@ func (suite *KeeperTestSuite) TestVerifyClientState() { suite.Run(tc.msg, func() { suite.SetupTest() // reset - _, clientB, connA, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, clientB, connA, _ := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) counterpartyClient, clientProof := suite.chainB.QueryClientStateProof(clientB) proofHeight := clienttypes.NewHeight(0, uint64(suite.chainB.GetContext().BlockHeight()-1)) @@ -83,20 +83,20 @@ func (suite *KeeperTestSuite) TestVerifyClientConsensusState() { expPass bool }{ {"verification success", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) }, true}, {"client state not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) changeClientID = true }, false}, {"consensus state not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) heightDiff = 5 }, false}, {"verification failed", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) clientB := connB.ClientID clientState := suite.chainB.GetClientState(clientB) @@ -170,7 +170,7 @@ func (suite *KeeperTestSuite) TestVerifyConnectionState() { suite.Run(tc.msg, func() { suite.SetupTest() // reset - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) connection := suite.chainA.GetConnection(connA) if tc.changeClientID { @@ -402,7 +402,7 @@ func (suite *KeeperTestSuite) TestVerifyPacketReceiptAbsence() { } else { // need to update height to prove absence suite.coordinator.CommitBlock(suite.chainA, suite.chainB) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) } packetReceiptKey := host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) diff --git a/x/ibc/core/04-channel/keeper/grpc_query_test.go b/x/ibc/core/04-channel/keeper/grpc_query_test.go index 031b89cc10..9e96d2b2fa 100644 --- a/x/ibc/core/04-channel/keeper/grpc_query_test.go +++ b/x/ibc/core/04-channel/keeper/grpc_query_test.go @@ -62,7 +62,7 @@ func (suite *KeeperTestSuite) TestQueryChannel() { { "success", func() { - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) // init channel channelA, _, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -377,7 +377,7 @@ func (suite *KeeperTestSuite) TestQueryChannelClientState() { { "success", func() { - clientA, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) // init channel channelA, _, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -505,7 +505,7 @@ func (suite *KeeperTestSuite) TestQueryChannelConsensusState() { { "success", func() { - clientA, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) // init channel channelA, _, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) diff --git a/x/ibc/core/04-channel/keeper/handshake_test.go b/x/ibc/core/04-channel/keeper/handshake_test.go index cf391d0387..857bba57d4 100644 --- a/x/ibc/core/04-channel/keeper/handshake_test.go +++ b/x/ibc/core/04-channel/keeper/handshake_test.go @@ -32,7 +32,7 @@ func (suite *KeeperTestSuite) TestChanOpenInit() { testCases := []testCase{ {"success", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) features = []string{"ORDER_ORDERED", "ORDER_UNORDERED"} suite.chainA.CreatePortCapability(connA.NextTestChannel(ibctesting.MockPort).PortID) portCap = suite.chainA.GetPortCapability(connA.NextTestChannel(ibctesting.MockPort).PortID) @@ -46,12 +46,12 @@ func (suite *KeeperTestSuite) TestChanOpenInit() { suite.Require().NotNil(connB) }, false}, {"capability is incorrect", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) features = []string{"ORDER_ORDERED", "ORDER_UNORDERED"} portCap = capabilitytypes.NewCapability(3) }, false}, {"connection version not negotiated", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) // modify connA versions conn := suite.chainA.GetConnection(connA) @@ -68,7 +68,7 @@ func (suite *KeeperTestSuite) TestChanOpenInit() { portCap = suite.chainA.GetPortCapability(connA.NextTestChannel(ibctesting.MockPort).PortID) }, false}, {"connection does not support ORDERED channels", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) // modify connA versions to only support UNORDERED channels conn := suite.chainA.GetConnection(connA) @@ -145,21 +145,21 @@ func (suite *KeeperTestSuite) TestChanOpenTry() { testCases := []testCase{ {"success", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.chainB.CreatePortCapability(connB.NextTestChannel(ibctesting.MockPort).PortID) portCap = suite.chainB.GetPortCapability(connB.NextTestChannel(ibctesting.MockPort).PortID) }, true}, {"success with crossing hello", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) suite.coordinator.ChanOpenInitOnBothChains(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) portCap = suite.chainB.GetPortCapability(connB.NextTestChannel(ibctesting.MockPort).PortID) }, true}, {"success with empty counterparty chosen channel id", func() { var clientA, clientB string - clientA, clientB, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, _, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -168,17 +168,17 @@ func (suite *KeeperTestSuite) TestChanOpenTry() { channel.Counterparty.ChannelId = "" suite.chainA.App.IBCKeeper.ChannelKeeper.SetChannel(suite.chainA.GetContext(), channelA.PortID, channelA.ID, channel) - err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) - err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, ibctesting.Tendermint) + err = suite.coordinator.UpdateClient(suite.chainB, suite.chainA, clientB, exported.Tendermint) suite.Require().NoError(err) suite.chainB.CreatePortCapability(connB.NextTestChannel(ibctesting.MockPort).PortID) portCap = suite.chainB.GetPortCapability(connB.NextTestChannel(ibctesting.MockPort).PortID) }, true}, {"previous channel with invalid state", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) // make previous channel have wrong ordering suite.coordinator.ChanOpenInit(suite.chainB, suite.chainA, connB, connA, ibctesting.MockPort, ibctesting.MockPort, types.UNORDERED) @@ -193,7 +193,7 @@ func (suite *KeeperTestSuite) TestChanOpenTry() { portCap = suite.chainB.GetPortCapability(connB.FirstOrNextTestChannel(ibctesting.MockPort).PortID) }, false}, {"connection is not OPEN", func() { - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) // pass capability check suite.chainB.CreatePortCapability(connB.FirstOrNextTestChannel(ibctesting.MockPort).PortID) portCap = suite.chainB.GetPortCapability(connB.FirstOrNextTestChannel(ibctesting.MockPort).PortID) @@ -203,7 +203,7 @@ func (suite *KeeperTestSuite) TestChanOpenTry() { suite.Require().NoError(err) }, false}, {"consensus state not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.chainB.CreatePortCapability(connB.NextTestChannel(ibctesting.MockPort).PortID) @@ -212,7 +212,7 @@ func (suite *KeeperTestSuite) TestChanOpenTry() { heightDiff = 3 // consensus state doesn't exist at this height }, false}, {"counterparty chosen channel id does not match desired channel id", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, _, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -226,17 +226,17 @@ func (suite *KeeperTestSuite) TestChanOpenTry() { }, false}, {"channel verification failed", func() { // not creating a channel on chainA will result in an invalid proof of existence - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) portCap = suite.chainB.GetPortCapability(connB.NextTestChannel(ibctesting.MockPort).PortID) }, false}, {"port capability not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) portCap = capabilitytypes.NewCapability(3) }, false}, {"connection version not negotiated", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) // modify connB versions @@ -253,7 +253,7 @@ func (suite *KeeperTestSuite) TestChanOpenTry() { portCap = suite.chainB.GetPortCapability(connB.NextTestChannel(ibctesting.MockPort).PortID) }, false}, {"connection does not support ORDERED channels", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) // modify connA versions to only support UNORDERED channels @@ -329,7 +329,7 @@ func (suite *KeeperTestSuite) TestChanOpenAck() { testCases := []testCase{ {"success", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -339,7 +339,7 @@ func (suite *KeeperTestSuite) TestChanOpenAck() { channelCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, true}, {"success with empty stored counterparty channel ID", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -365,7 +365,7 @@ func (suite *KeeperTestSuite) TestChanOpenAck() { channelCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, false}, {"connection not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -380,7 +380,7 @@ func (suite *KeeperTestSuite) TestChanOpenAck() { suite.chainA.App.IBCKeeper.ChannelKeeper.SetChannel(suite.chainA.GetContext(), channelA.PortID, channelA.ID, channel) }, false}, {"connection is not OPEN", func() { - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) var err error connA, connB, err = suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) @@ -394,7 +394,7 @@ func (suite *KeeperTestSuite) TestChanOpenAck() { channelCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, false}, {"consensus state not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -406,7 +406,7 @@ func (suite *KeeperTestSuite) TestChanOpenAck() { heightDiff = 3 // consensus state doesn't exist at this height }, false}, {"invalid counterparty channel identifier", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -419,7 +419,7 @@ func (suite *KeeperTestSuite) TestChanOpenAck() { }, false}, {"channel verification failed", func() { // chainB is INIT, chainA in TRYOPEN - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelB, channelA, err := suite.coordinator.ChanOpenInit(suite.chainB, suite.chainA, connB, connA, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -429,7 +429,7 @@ func (suite *KeeperTestSuite) TestChanOpenAck() { channelCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, false}, {"channel capability not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -484,7 +484,7 @@ func (suite *KeeperTestSuite) TestChanOpenConfirm() { ) testCases := []testCase{ {"success", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -504,7 +504,7 @@ func (suite *KeeperTestSuite) TestChanOpenConfirm() { channelCap = suite.chainB.GetChannelCapability(channelB.PortID, channelB.ID) }, false}, {"connection not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -522,7 +522,7 @@ func (suite *KeeperTestSuite) TestChanOpenConfirm() { suite.chainB.App.IBCKeeper.ChannelKeeper.SetChannel(suite.chainB.GetContext(), channelB.PortID, channelB.ID, channel) }, false}, {"connection is not OPEN", func() { - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) var err error connA, connB, err = suite.coordinator.ConnOpenInit(suite.chainB, suite.chainA, clientB, clientA) @@ -532,7 +532,7 @@ func (suite *KeeperTestSuite) TestChanOpenConfirm() { channelCap = suite.chainB.GetChannelCapability(channelB.PortID, channelB.ID) }, false}, {"consensus state not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -548,7 +548,7 @@ func (suite *KeeperTestSuite) TestChanOpenConfirm() { }, false}, {"channel verification failed", func() { // chainA is INIT, chainB in TRYOPEN - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -558,7 +558,7 @@ func (suite *KeeperTestSuite) TestChanOpenConfirm() { channelCap = suite.chainB.GetChannelCapability(channelB.PortID, channelB.ID) }, false}, {"channel capability not found", func() { - _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB = suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA, channelB, err := suite.coordinator.ChanOpenInit(suite.chainA, suite.chainB, connA, connB, ibctesting.MockPort, ibctesting.MockPort, types.ORDERED) suite.Require().NoError(err) @@ -645,7 +645,7 @@ func (suite *KeeperTestSuite) TestChanCloseInit() { suite.chainA.App.IBCKeeper.ChannelKeeper.SetChannel(suite.chainA.GetContext(), channelA.PortID, channelA.ID, channel) }, false}, {"connection is not OPEN", func() { - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) var err error connA, connB, err = suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) @@ -734,7 +734,7 @@ func (suite *KeeperTestSuite) TestChanCloseConfirm() { suite.chainB.App.IBCKeeper.ChannelKeeper.SetChannel(suite.chainB.GetContext(), channelB.PortID, channelB.ID, channel) }, false}, {"connection is not OPEN", func() { - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) var err error connB, connA, err = suite.coordinator.ConnOpenInit(suite.chainB, suite.chainA, clientB, clientA) diff --git a/x/ibc/core/04-channel/keeper/keeper_test.go b/x/ibc/core/04-channel/keeper/keeper_test.go index 01f7a75849..d1ea3de5da 100644 --- a/x/ibc/core/04-channel/keeper/keeper_test.go +++ b/x/ibc/core/04-channel/keeper/keeper_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/x/ibc/core/04-channel/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -39,7 +40,7 @@ func (suite *KeeperTestSuite) SetupTest() { // and existence of a channel in INIT on chainA. func (suite *KeeperTestSuite) TestSetChannel() { // create client and connections on both chains - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) // check for channel to be created on chainB channelA := connA.NextTestChannel(ibctesting.MockPort) diff --git a/x/ibc/core/04-channel/keeper/packet_test.go b/x/ibc/core/04-channel/keeper/packet_test.go index f3624897dd..f04b6ac100 100644 --- a/x/ibc/core/04-channel/keeper/packet_test.go +++ b/x/ibc/core/04-channel/keeper/packet_test.go @@ -130,7 +130,7 @@ func (suite *KeeperTestSuite) TestSendPacket() { channelCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, false}, {"next sequence send not found", func() { - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA := connA.NextTestChannel(ibctesting.TransferPort) channelB := connB.NextTestChannel(ibctesting.TransferPort) packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, timeoutHeight, disabledTimeoutTimestamp) @@ -276,7 +276,7 @@ func (suite *KeeperTestSuite) TestRecvPacket() { channelCap = suite.chainB.GetChannelCapability(channelB.PortID, channelB.ID) }, false}, {"connection not OPEN", func() { - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) // connection on chainB is in INIT connB, connA, err := suite.coordinator.ConnOpenInit(suite.chainB, suite.chainA, clientB, clientA) suite.Require().NoError(err) @@ -304,7 +304,7 @@ func (suite *KeeperTestSuite) TestRecvPacket() { channelCap = suite.chainB.GetChannelCapability(channelB.PortID, channelB.ID) }, false}, {"next receive sequence is not found", func() { - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA := connA.NextTestChannel(ibctesting.TransferPort) channelB := connB.NextTestChannel(ibctesting.TransferPort) @@ -548,7 +548,7 @@ func (suite *KeeperTestSuite) TestAcknowledgePacket() { channelCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, false}, {"connection not OPEN", func() { - clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, clientB := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) // connection on chainA is in INIT connA, connB, err := suite.coordinator.ConnOpenInit(suite.chainA, suite.chainB, clientA, clientB) suite.Require().NoError(err) @@ -581,7 +581,7 @@ func (suite *KeeperTestSuite) TestAcknowledgePacket() { channelCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, false}, {"next ack sequence not found", func() { - _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, ibctesting.Tendermint) + _, _, connA, connB := suite.coordinator.SetupClientConnections(suite.chainA, suite.chainB, exported.Tendermint) channelA := connA.NextTestChannel(ibctesting.TransferPort) channelB := connB.NextTestChannel(ibctesting.TransferPort) packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, timeoutHeight, disabledTimeoutTimestamp) diff --git a/x/ibc/core/04-channel/keeper/timeout_test.go b/x/ibc/core/04-channel/keeper/timeout_test.go index 2ff4975826..640452e881 100644 --- a/x/ibc/core/04-channel/keeper/timeout_test.go +++ b/x/ibc/core/04-channel/keeper/timeout_test.go @@ -29,7 +29,7 @@ func (suite *KeeperTestSuite) TestTimeoutPacket() { packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, clienttypes.GetSelfHeight(suite.chainB.GetContext()), uint64(suite.chainB.GetContext().BlockTime().UnixNano())) suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) // need to update chainA's client representing chainB to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) }, true}, {"success: UNORDERED", func() { ordered = false @@ -38,7 +38,7 @@ func (suite *KeeperTestSuite) TestTimeoutPacket() { packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, clienttypes.GetSelfHeight(suite.chainB.GetContext()), disabledTimeoutTimestamp) suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) // need to update chainA's client representing chainB to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) }, true}, {"channel not found", func() { // use wrong channel naming @@ -77,7 +77,7 @@ func (suite *KeeperTestSuite) TestTimeoutPacket() { clientA, clientB, _, _, channelA, channelB := suite.coordinator.Setup(suite.chainA, suite.chainB, types.ORDERED) packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, timeoutHeight, disabledTimeoutTimestamp) suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) }, false}, {"packet already received ", func() { ordered = true @@ -86,12 +86,12 @@ func (suite *KeeperTestSuite) TestTimeoutPacket() { clientA, clientB, _, _, channelA, channelB := suite.coordinator.Setup(suite.chainA, suite.chainB, types.ORDERED) packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, timeoutHeight, uint64(suite.chainB.GetContext().BlockTime().UnixNano())) suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) }, false}, {"packet hasn't been sent", func() { clientA, _, _, _, channelA, channelB := suite.coordinator.Setup(suite.chainA, suite.chainB, types.ORDERED) packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, timeoutHeight, uint64(suite.chainB.GetContext().BlockTime().UnixNano())) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) }, false}, {"next seq receive verification failed", func() { // set ordered to false resulting in wrong proof provided @@ -100,7 +100,7 @@ func (suite *KeeperTestSuite) TestTimeoutPacket() { clientA, clientB, _, _, channelA, channelB := suite.coordinator.Setup(suite.chainA, suite.chainB, types.ORDERED) packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, clienttypes.GetSelfHeight(suite.chainB.GetContext()), disabledTimeoutTimestamp) suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) }, false}, {"packet ack verification failed", func() { // set ordered to true resulting in wrong proof provided @@ -109,7 +109,7 @@ func (suite *KeeperTestSuite) TestTimeoutPacket() { clientA, clientB, _, _, channelA, channelB := suite.coordinator.Setup(suite.chainA, suite.chainB, types.UNORDERED) packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, clienttypes.GetSelfHeight(suite.chainB.GetContext()), disabledTimeoutTimestamp) suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) }, false}, } @@ -213,7 +213,7 @@ func (suite *KeeperTestSuite) TestTimeoutOnClose() { suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) suite.coordinator.SetChannelClosed(suite.chainB, suite.chainA, channelB) // need to update chainA's client representing chainB to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) chanCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, true}, @@ -224,7 +224,7 @@ func (suite *KeeperTestSuite) TestTimeoutOnClose() { suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) suite.coordinator.SetChannelClosed(suite.chainB, suite.chainA, channelB) // need to update chainA's client representing chainB to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) chanCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, true}, @@ -273,7 +273,7 @@ func (suite *KeeperTestSuite) TestTimeoutOnClose() { suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) suite.coordinator.SetChannelClosed(suite.chainB, suite.chainA, channelB) // need to update chainA's client representing chainB to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) chanCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, false}, @@ -291,7 +291,7 @@ func (suite *KeeperTestSuite) TestTimeoutOnClose() { packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, clienttypes.GetSelfHeight(suite.chainB.GetContext()), uint64(suite.chainB.GetContext().BlockTime().UnixNano())) suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) suite.coordinator.SetChannelClosed(suite.chainB, suite.chainA, channelB) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) chanCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, false}, {"packet ack verification failed", func() { @@ -301,7 +301,7 @@ func (suite *KeeperTestSuite) TestTimeoutOnClose() { packet = types.NewPacket(validPacketData, 1, channelA.PortID, channelA.ID, channelB.PortID, channelB.ID, clienttypes.GetSelfHeight(suite.chainB.GetContext()), disabledTimeoutTimestamp) suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) suite.coordinator.SetChannelClosed(suite.chainB, suite.chainA, channelB) - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) chanCap = suite.chainA.GetChannelCapability(channelA.PortID, channelA.ID) }, false}, {"channel capability not found", func() { @@ -311,7 +311,7 @@ func (suite *KeeperTestSuite) TestTimeoutOnClose() { suite.coordinator.SendPacket(suite.chainA, suite.chainB, packet, clientB) suite.coordinator.SetChannelClosed(suite.chainB, suite.chainA, channelB) // need to update chainA's client representing chainB to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) chanCap = capabilitytypes.NewCapability(100) }, false}, diff --git a/x/ibc/core/exported/client.go b/x/ibc/core/exported/client.go index e5b38a0598..8c7e89b33e 100644 --- a/x/ibc/core/exported/client.go +++ b/x/ibc/core/exported/client.go @@ -12,9 +12,15 @@ const ( // TypeClientMisbehaviour is the shared evidence misbehaviour type TypeClientMisbehaviour string = "client_misbehaviour" + // Solomachine is used to indicate that the light client is a solo machine. + Solomachine string = "06-solomachine" + + // Tendermint is used to indicate that the client uses the Tendermint Consensus Algorithm. + Tendermint string = "07-tendermint" + // Localhost is the client type for a localhost client. It is also used as the clientID // for the localhost client. - Localhost string = "localhost" + Localhost string = "09-localhost" ) // ClientState defines the required common functions for light clients. diff --git a/x/ibc/core/genesis_test.go b/x/ibc/core/genesis_test.go index d4cf1ec3aa..5290c47897 100644 --- a/x/ibc/core/genesis_test.go +++ b/x/ibc/core/genesis_test.go @@ -96,6 +96,7 @@ func (suite *IBCTestSuite) TestValidateGenesis() { }, ), }, + clienttypes.NewParams(exported.Tendermint, exported.Localhost), true, ), ConnectionGenesis: connectiontypes.NewGenesisState( @@ -150,6 +151,7 @@ func (suite *IBCTestSuite) TestValidateGenesis() { ), }, nil, + clienttypes.NewParams(exported.Tendermint), false, ), ConnectionGenesis: connectiontypes.DefaultGenesisState(), @@ -233,6 +235,7 @@ func (suite *IBCTestSuite) TestInitGenesis() { }, ), }, + clienttypes.NewParams(exported.Tendermint, exported.Localhost), true, ), ConnectionGenesis: connectiontypes.NewGenesisState( @@ -295,8 +298,8 @@ func (suite *IBCTestSuite) TestExportGenesis() { // creates clients suite.coordinator.Setup(suite.chainA, suite.chainB, channeltypes.UNORDERED) // create extra clients - suite.coordinator.CreateClient(suite.chainA, suite.chainB, ibctesting.Tendermint) - suite.coordinator.CreateClient(suite.chainA, suite.chainB, ibctesting.Tendermint) + suite.coordinator.CreateClient(suite.chainA, suite.chainB, exported.Tendermint) + suite.coordinator.CreateClient(suite.chainA, suite.chainB, exported.Tendermint) }, }, } diff --git a/x/ibc/core/keeper/grpc_query.go b/x/ibc/core/keeper/grpc_query.go index e7dbe26109..f406d2e86f 100644 --- a/x/ibc/core/keeper/grpc_query.go +++ b/x/ibc/core/keeper/grpc_query.go @@ -28,6 +28,11 @@ func (q Keeper) ConsensusStates(c context.Context, req *clienttypes.QueryConsens return q.ClientKeeper.ConsensusStates(c, req) } +// ClientParams implements the IBC QueryServer interface +func (q Keeper) ClientParams(c context.Context, req *clienttypes.QueryClientParamsRequest) (*clienttypes.QueryClientParamsResponse, error) { + return q.ClientKeeper.ClientParams(c, req) +} + // Connection implements the IBC QueryServer interface func (q Keeper) Connection(c context.Context, req *connectiontypes.QueryConnectionRequest) (*connectiontypes.QueryConnectionResponse, error) { return q.ConnectionKeeper.Connection(c, req) diff --git a/x/ibc/core/keeper/keeper.go b/x/ibc/core/keeper/keeper.go index e9b7a0f1e5..5f9abc382e 100644 --- a/x/ibc/core/keeper/keeper.go +++ b/x/ibc/core/keeper/keeper.go @@ -11,6 +11,7 @@ import ( portkeeper "github.com/cosmos/cosmos-sdk/x/ibc/core/05-port/keeper" porttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/05-port/types" "github.com/cosmos/cosmos-sdk/x/ibc/core/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" ) var _ types.QueryServer = (*Keeper)(nil) @@ -31,9 +32,10 @@ type Keeper struct { // NewKeeper creates a new ibc Keeper func NewKeeper( - cdc codec.BinaryMarshaler, key sdk.StoreKey, stakingKeeper clienttypes.StakingKeeper, scopedKeeper capabilitykeeper.ScopedKeeper, + cdc codec.BinaryMarshaler, key sdk.StoreKey, paramSpace paramtypes.Subspace, + stakingKeeper clienttypes.StakingKeeper, scopedKeeper capabilitykeeper.ScopedKeeper, ) *Keeper { - clientKeeper := clientkeeper.NewKeeper(cdc, key, stakingKeeper) + clientKeeper := clientkeeper.NewKeeper(cdc, key, paramSpace, stakingKeeper) connectionKeeper := connectionkeeper.NewKeeper(cdc, key, clientKeeper) portKeeper := portkeeper.NewKeeper(scopedKeeper) channelKeeper := channelkeeper.NewKeeper(cdc, key, clientKeeper, connectionKeeper, portKeeper, scopedKeeper) diff --git a/x/ibc/core/keeper/msg_server_test.go b/x/ibc/core/keeper/msg_server_test.go index 5c4aa466a1..497a806caa 100644 --- a/x/ibc/core/keeper/msg_server_test.go +++ b/x/ibc/core/keeper/msg_server_test.go @@ -331,7 +331,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutPacket() { suite.Require().NoError(err) // need to update chainA client to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) packetKey = host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) }, true}, @@ -344,7 +344,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutPacket() { suite.Require().NoError(err) // need to update chainA client to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) packetKey = host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) }, true}, @@ -362,7 +362,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutPacket() { suite.Require().NoError(err) } - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) packetKey = host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) }, true}, {"success: ORDERED timeout out of order packet", func() { @@ -378,7 +378,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutPacket() { suite.Require().NoError(err) } - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) packetKey = host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) }, true}, @@ -458,7 +458,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutOnClosePacket() { suite.Require().NoError(err) // need to update chainA client to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) packetKey = host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) @@ -479,7 +479,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutOnClosePacket() { suite.Require().NoError(err) // need to update chainA client to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) packetKey = host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) @@ -505,7 +505,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutOnClosePacket() { suite.Require().NoError(err) } - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) packetKey = host.PacketReceiptKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence()) // close counterparty channel @@ -529,7 +529,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutOnClosePacket() { suite.Require().NoError(err) } - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) packetKey = host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) // close counterparty channel @@ -568,7 +568,7 @@ func (suite *KeeperTestSuite) TestHandleTimeoutOnClosePacket() { suite.Require().NoError(err) // need to update chainA client to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) packetKey = host.NextSequenceRecvKey(packet.GetDestPort(), packet.GetDestChannel()) }, false}, @@ -639,7 +639,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -689,7 +689,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) msg, err = clienttypes.NewMsgUpgradeClient(clientA, upgradedClient, upgradeHeight, nil, suite.chainA.SenderAccount.GetAddress()) @@ -701,7 +701,7 @@ func (suite *KeeperTestSuite) TestUpgradeClient() { for _, tc := range cases { tc := tc - clientA, _ = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) tc.setup() diff --git a/x/ibc/core/spec/07_params.md b/x/ibc/core/spec/07_params.md new file mode 100644 index 0000000000..67e79ef81d --- /dev/null +++ b/x/ibc/core/spec/07_params.md @@ -0,0 +1,21 @@ + + +# Parameters + +## Clients + +The ibc clients contain the following parameters: + +| Key | Type | Default Value | +|------------------|------|---------------| +| `AllowedClients` | []string | `"06-solomachine","07-tendermint"` | + +### AllowedClients + +The allowed clients parameter defines an allowlist of client types supported by the chain. A client +that is not registered on this list will fail upon creation or on genesis validation. Note that, +since the client type is an arbitrary string, chains they must not register two light clients which +return the same value for the `ClientType()` function, otherwise the allowlist check can be +bypassed. diff --git a/x/ibc/core/spec/README.md b/x/ibc/core/spec/README.md index 0ae00bbcda..f6de9749b5 100644 --- a/x/ibc/core/spec/README.md +++ b/x/ibc/core/spec/README.md @@ -23,3 +23,4 @@ For the general specification please refer to the [Interchain Standards](https:/ 4. **[Messages](04_messages.md)** 5. **[Callbacks](05_callbacks.md)** 6. **[Events](06_events.md)** +7. **[Params](07_params.md)** 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 05ed359baf..34cb91964b 100644 --- a/x/ibc/light-clients/06-solomachine/types/client_state.go +++ b/x/ibc/light-clients/06-solomachine/types/client_state.go @@ -16,9 +16,6 @@ import ( var _ exported.ClientState = (*ClientState)(nil) -// SoloMachine is used to indicate that the light client is a solo machine. -const SoloMachine string = "Solo Machine" - // NewClientState creates a new ClientState instance. func NewClientState(latestSequence uint64, consensusState *ConsensusState, allowUpdateAfterProposal bool) *ClientState { return &ClientState{ @@ -31,7 +28,7 @@ func NewClientState(latestSequence uint64, consensusState *ConsensusState, allow // ClientType is Solo Machine. func (cs ClientState) ClientType() string { - return SoloMachine + return exported.Solomachine } // GetLatestHeight returns the latest sequence number. diff --git a/x/ibc/light-clients/06-solomachine/types/client_state_test.go b/x/ibc/light-clients/06-solomachine/types/client_state_test.go index f2daca5ae3..597adff345 100644 --- a/x/ibc/light-clients/06-solomachine/types/client_state_test.go +++ b/x/ibc/light-clients/06-solomachine/types/client_state_test.go @@ -82,7 +82,7 @@ func (suite *SoloMachineTestSuite) TestClientStateValidateBasic() { func (suite *SoloMachineTestSuite) TestVerifyClientState() { // create client for tendermint so we can use client state for verification - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState := suite.chainA.GetClientState(clientA) path := suite.solomachine.GetClientStatePath(counterpartyClientIdentifier) @@ -208,7 +208,7 @@ func (suite *SoloMachineTestSuite) TestVerifyClientState() { func (suite *SoloMachineTestSuite) TestVerifyClientConsensusState() { // create client for tendermint so we can use consensus state for verification - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState := suite.chainA.GetClientState(clientA) consensusState, found := suite.chainA.GetConsensusState(clientA, clientState.GetLatestHeight()) suite.Require().True(found) diff --git a/x/ibc/light-clients/06-solomachine/types/consensus_state.go b/x/ibc/light-clients/06-solomachine/types/consensus_state.go index cebd399ffa..1cc95caf08 100644 --- a/x/ibc/light-clients/06-solomachine/types/consensus_state.go +++ b/x/ibc/light-clients/06-solomachine/types/consensus_state.go @@ -13,7 +13,7 @@ var _ exported.ConsensusState = ConsensusState{} // ClientType returns Solo Machine type. func (ConsensusState) ClientType() string { - return SoloMachine + return exported.Solomachine } // GetTimestamp returns zero. diff --git a/x/ibc/light-clients/06-solomachine/types/consensus_state_test.go b/x/ibc/light-clients/06-solomachine/types/consensus_state_test.go index 820e812462..e0c22f9595 100644 --- a/x/ibc/light-clients/06-solomachine/types/consensus_state_test.go +++ b/x/ibc/light-clients/06-solomachine/types/consensus_state_test.go @@ -1,6 +1,7 @@ package types_test import ( + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/06-solomachine/types" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -8,7 +9,7 @@ import ( func (suite *SoloMachineTestSuite) TestConsensusState() { consensusState := suite.solomachine.ConsensusState() - suite.Require().Equal(types.SoloMachine, consensusState.ClientType()) + suite.Require().Equal(exported.Solomachine, consensusState.ClientType()) suite.Require().Equal(suite.solomachine.Time, consensusState.GetTimestamp()) suite.Require().Nil(consensusState.GetRoot()) } diff --git a/x/ibc/light-clients/06-solomachine/types/header.go b/x/ibc/light-clients/06-solomachine/types/header.go index cb2b55b4f8..dc43cee4f7 100644 --- a/x/ibc/light-clients/06-solomachine/types/header.go +++ b/x/ibc/light-clients/06-solomachine/types/header.go @@ -13,7 +13,7 @@ var _ exported.Header = Header{} // ClientType defines that the Header is a Solo Machine. func (Header) ClientType() string { - return SoloMachine + return exported.Solomachine } // GetHeight returns the current sequence number as the height. diff --git a/x/ibc/light-clients/06-solomachine/types/header_test.go b/x/ibc/light-clients/06-solomachine/types/header_test.go index e456f9e966..a5ca45e8aa 100644 --- a/x/ibc/light-clients/06-solomachine/types/header_test.go +++ b/x/ibc/light-clients/06-solomachine/types/header_test.go @@ -1,6 +1,7 @@ package types_test import ( + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/06-solomachine/types" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -78,7 +79,7 @@ func (suite *SoloMachineTestSuite) TestHeaderValidateBasic() { }, } - suite.Require().Equal(types.SoloMachine, header.ClientType()) + suite.Require().Equal(exported.Solomachine, header.ClientType()) for _, tc := range cases { tc := tc diff --git a/x/ibc/light-clients/06-solomachine/types/misbehaviour.go b/x/ibc/light-clients/06-solomachine/types/misbehaviour.go index 1f97f323ce..66ee6d9392 100644 --- a/x/ibc/light-clients/06-solomachine/types/misbehaviour.go +++ b/x/ibc/light-clients/06-solomachine/types/misbehaviour.go @@ -17,7 +17,7 @@ var ( // ClientType is a Solo Machine light client. func (misbehaviour Misbehaviour) ClientType() string { - return SoloMachine + return exported.Solomachine } // GetClientID returns the ID of the client that committed a misbehaviour. diff --git a/x/ibc/light-clients/06-solomachine/types/misbehaviour_test.go b/x/ibc/light-clients/06-solomachine/types/misbehaviour_test.go index 311dc8d8c8..a976186eab 100644 --- a/x/ibc/light-clients/06-solomachine/types/misbehaviour_test.go +++ b/x/ibc/light-clients/06-solomachine/types/misbehaviour_test.go @@ -1,6 +1,7 @@ package types_test import ( + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/06-solomachine/types" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -8,7 +9,7 @@ import ( func (suite *SoloMachineTestSuite) TestMisbehaviour() { misbehaviour := suite.solomachine.CreateMisbehaviour() - suite.Require().Equal(types.SoloMachine, misbehaviour.ClientType()) + suite.Require().Equal(exported.Solomachine, misbehaviour.ClientType()) suite.Require().Equal(suite.solomachine.ClientID, misbehaviour.GetClientID()) suite.Require().Equal(uint64(0), misbehaviour.GetHeight().GetVersionNumber()) suite.Require().Equal(suite.solomachine.Sequence, misbehaviour.GetHeight().GetVersionHeight()) 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 53f5c4a48c..b3b647d829 100644 --- a/x/ibc/light-clients/06-solomachine/types/solomachine_test.go +++ b/x/ibc/light-clients/06-solomachine/types/solomachine_test.go @@ -41,7 +41,7 @@ func (suite *SoloMachineTestSuite) SetupTest() { suite.solomachine = ibctesting.NewSolomachine(suite.T(), suite.chainA.Codec, "solomachinesingle", "testing", 1) suite.solomachineMulti = ibctesting.NewSolomachine(suite.T(), suite.chainA.Codec, "solomachinemulti", "testing", 4) - suite.store = suite.chainA.App.IBCKeeper.ClientKeeper.ClientStore(suite.chainA.GetContext(), types.SoloMachine) + suite.store = suite.chainA.App.IBCKeeper.ClientKeeper.ClientStore(suite.chainA.GetContext(), exported.Solomachine) } func TestSoloMachineTestSuite(t *testing.T) { 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 3940d44b7f..6807304468 100644 --- a/x/ibc/light-clients/07-tendermint/types/client_state.go +++ b/x/ibc/light-clients/07-tendermint/types/client_state.go @@ -22,9 +22,6 @@ import ( var _ exported.ClientState = (*ClientState)(nil) -// Tendermint is used to indicate that the client uses the Tendermint Consensus Algorithm. -const Tendermint string = "Tendermint" - // NewClientState creates a new ClientState instance func NewClientState( chainID string, trustLevel Fraction, @@ -55,7 +52,7 @@ func (cs ClientState) GetChainID() string { // ClientType is tendermint. func (cs ClientState) ClientType() string { - return Tendermint + return exported.Tendermint } // GetLatestHeight returns latest block height. 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 90ff6767f0..dc662da8fd 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 @@ -554,7 +554,7 @@ func (suite *TendermintTestSuite) TestVerifyPacketReceiptAbsence() { suite.Require().NoError(err) // need to update chainA's client representing chainB to prove missing ack - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) var ok bool clientStateI := suite.chainA.GetClientState(clientA) @@ -645,7 +645,7 @@ func (suite *TendermintTestSuite) TestVerifyNextSeqRecv() { suite.Require().NoError(err) // need to update chainA's client representing chainB - suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) var ok bool clientStateI := suite.chainA.GetClientState(clientA) diff --git a/x/ibc/light-clients/07-tendermint/types/consensus_state.go b/x/ibc/light-clients/07-tendermint/types/consensus_state.go index 0a8981281c..d55bc11305 100644 --- a/x/ibc/light-clients/07-tendermint/types/consensus_state.go +++ b/x/ibc/light-clients/07-tendermint/types/consensus_state.go @@ -26,7 +26,7 @@ func NewConsensusState( // ClientType returns Tendermint func (ConsensusState) ClientType() string { - return Tendermint + return exported.Tendermint } // GetRoot returns the commitment Root for the specific diff --git a/x/ibc/light-clients/07-tendermint/types/consensus_state_test.go b/x/ibc/light-clients/07-tendermint/types/consensus_state_test.go index a3a8b154a6..313815d0c7 100644 --- a/x/ibc/light-clients/07-tendermint/types/consensus_state_test.go +++ b/x/ibc/light-clients/07-tendermint/types/consensus_state_test.go @@ -4,6 +4,7 @@ import ( "time" commitmenttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/23-commitment/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/07-tendermint/types" ) @@ -54,13 +55,15 @@ func (suite *TendermintTestSuite) TestConsensusStateValidateBasic() { for i, tc := range testCases { tc := tc - suite.Require().Equal(tc.consensusState.ClientType(), types.Tendermint) + // check just to increase coverage + suite.Require().Equal(exported.Tendermint, tc.consensusState.ClientType()) suite.Require().Equal(tc.consensusState.GetRoot(), tc.consensusState.Root) + err := tc.consensusState.ValidateBasic() if tc.expectPass { - suite.Require().NoError(tc.consensusState.ValidateBasic(), "valid test case %d failed: %s", i, tc.msg) + suite.Require().NoError(err, "valid test case %d failed: %s", i, tc.msg) } else { - suite.Require().Error(tc.consensusState.ValidateBasic(), "invalid test case %d passed: %s", i, tc.msg) + suite.Require().Error(err, "invalid test case %d passed: %s", i, tc.msg) } } } diff --git a/x/ibc/light-clients/07-tendermint/types/header.go b/x/ibc/light-clients/07-tendermint/types/header.go index 86e166caf5..e128abea1c 100644 --- a/x/ibc/light-clients/07-tendermint/types/header.go +++ b/x/ibc/light-clients/07-tendermint/types/header.go @@ -25,7 +25,7 @@ func (h Header) ConsensusState() *ConsensusState { // ClientType defines that the Header is a Tendermint consensus algorithm func (h Header) ClientType() string { - return Tendermint + return exported.Tendermint } // GetHeight returns the current height. It returns 0 if the tendermint diff --git a/x/ibc/light-clients/07-tendermint/types/header_test.go b/x/ibc/light-clients/07-tendermint/types/header_test.go index 235e1f7584..cda3047be2 100644 --- a/x/ibc/light-clients/07-tendermint/types/header_test.go +++ b/x/ibc/light-clients/07-tendermint/types/header_test.go @@ -6,6 +6,7 @@ import ( tmprotocrypto "github.com/tendermint/tendermint/proto/tendermint/crypto" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/07-tendermint/types" ) @@ -63,7 +64,7 @@ func (suite *TendermintTestSuite) TestHeaderValidateBasic() { }, false}, } - suite.Require().Equal(types.Tendermint, suite.header.ClientType()) + suite.Require().Equal(exported.Tendermint, suite.header.ClientType()) for _, tc := range testCases { tc := tc diff --git a/x/ibc/light-clients/07-tendermint/types/misbehaviour.go b/x/ibc/light-clients/07-tendermint/types/misbehaviour.go index b1277110a2..c090ecb0b6 100644 --- a/x/ibc/light-clients/07-tendermint/types/misbehaviour.go +++ b/x/ibc/light-clients/07-tendermint/types/misbehaviour.go @@ -27,12 +27,11 @@ func NewMisbehaviour(clientID, chainID string, header1, header2 *Header) *Misbeh Header1: header1, Header2: header2, } - } // ClientType is Tendermint light client func (misbehaviour Misbehaviour) ClientType() string { - return Tendermint + return exported.Tendermint } // GetClientID returns the ID of the client that committed a misbehaviour. diff --git a/x/ibc/light-clients/07-tendermint/types/misbehaviour_test.go b/x/ibc/light-clients/07-tendermint/types/misbehaviour_test.go index 6f70c4b716..9d7cddff5c 100644 --- a/x/ibc/light-clients/07-tendermint/types/misbehaviour_test.go +++ b/x/ibc/light-clients/07-tendermint/types/misbehaviour_test.go @@ -8,6 +8,7 @@ import ( tmtypes "github.com/tendermint/tendermint/types" clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/07-tendermint/types" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ibctestingmock "github.com/cosmos/cosmos-sdk/x/ibc/testing/mock" @@ -24,7 +25,7 @@ func (suite *TendermintTestSuite) TestMisbehaviour() { ClientId: clientID, } - suite.Require().Equal(types.Tendermint, misbehaviour.ClientType()) + suite.Require().Equal(exported.Tendermint, misbehaviour.ClientType()) suite.Require().Equal(clientID, misbehaviour.GetClientID()) suite.Require().Equal(height, misbehaviour.GetHeight()) } diff --git a/x/ibc/light-clients/07-tendermint/types/proposal_handle_test.go b/x/ibc/light-clients/07-tendermint/types/proposal_handle_test.go index 33c10854e7..062a29a0dc 100644 --- a/x/ibc/light-clients/07-tendermint/types/proposal_handle_test.go +++ b/x/ibc/light-clients/07-tendermint/types/proposal_handle_test.go @@ -2,6 +2,7 @@ package types_test import ( clienttypes "github.com/cosmos/cosmos-sdk/x/ibc/core/02-client/types" + "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/07-tendermint/types" ibctesting "github.com/cosmos/cosmos-sdk/x/ibc/testing" ) @@ -12,7 +13,7 @@ var ( // sanity checks func (suite *TendermintTestSuite) TestCheckProposedHeaderAndUpdateStateBasic() { - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState := suite.chainA.GetClientState(clientA).(*types.ClientState) clientStore := suite.chainA.App.IBCKeeper.ClientKeeper.ClientStore(suite.chainA.GetContext(), clientA) @@ -201,7 +202,7 @@ func (suite *TendermintTestSuite) TestCheckProposedHeaderAndUpdateState() { suite.SetupTest() // reset // construct client state based on test case parameters - clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ := suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState := suite.chainA.GetClientState(clientA).(*types.ClientState) clientState.AllowUpdateAfterExpiry = tc.AllowUpdateAfterExpiry clientState.AllowUpdateAfterMisbehaviour = tc.AllowUpdateAfterMisbehaviour @@ -319,7 +320,7 @@ func (suite *TendermintTestSuite) TestCheckProposedHeader() { suite.Run(tc.name, func() { suite.SetupTest() // reset - clientA, _ = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) clientState = suite.chainA.GetClientState(clientA).(*types.ClientState) clientState.AllowUpdateAfterExpiry = true clientState.AllowUpdateAfterMisbehaviour = false diff --git a/x/ibc/light-clients/07-tendermint/types/upgrade_test.go b/x/ibc/light-clients/07-tendermint/types/upgrade_test.go index f5debb01a6..bb2108508d 100644 --- a/x/ibc/light-clients/07-tendermint/types/upgrade_test.go +++ b/x/ibc/light-clients/07-tendermint/types/upgrade_test.go @@ -37,7 +37,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -63,7 +63,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { upgradedClient = types.NewClientState("newChainId", types.DefaultTrustLevel, ubdPeriod, ubdPeriod+trustingPeriod, maxClockDrift+5, newClientHeight, ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), upgradePath, true, false) suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -93,7 +93,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -119,7 +119,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { upgradedClient = types.NewClientState("wrongchainID", types.DefaultTrustLevel, trustingPeriod, ubdPeriod, maxClockDrift, newClientHeight, ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), upgradePath, true, true) suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -141,7 +141,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { upgradedClient = types.NewClientState("newChainId", types.DefaultTrustLevel, ubdPeriod, ubdPeriod+trustingPeriod, maxClockDrift+5, upgradeHeight, ibctesting.DefaultConsensusParams, commitmenttypes.GetSDKSpecs(), upgradePath, true, false) suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -198,7 +198,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -228,7 +228,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -258,7 +258,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -283,7 +283,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) cs, found := suite.chainA.App.IBCKeeper.ClientKeeper.GetClientState(suite.chainA.GetContext(), clientA) @@ -304,7 +304,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { // commit upgrade store changes and update clients suite.coordinator.CommitBlock(suite.chainB) - err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, ibctesting.Tendermint) + err := suite.coordinator.UpdateClient(suite.chainA, suite.chainB, clientA, exported.Tendermint) suite.Require().NoError(err) // expire chainB's client @@ -325,7 +325,7 @@ func (suite *TendermintTestSuite) TestVerifyUpgrade() { // reset suite suite.SetupTest() - clientA, _ = suite.coordinator.SetupClients(suite.chainA, suite.chainB, ibctesting.Tendermint) + clientA, _ = suite.coordinator.SetupClients(suite.chainA, suite.chainB, exported.Tendermint) tc.setup() diff --git a/x/ibc/testing/chain.go b/x/ibc/testing/chain.go index 5886695efd..bba056f459 100644 --- a/x/ibc/testing/chain.go +++ b/x/ibc/testing/chain.go @@ -33,7 +33,6 @@ import ( host "github.com/cosmos/cosmos-sdk/x/ibc/core/24-host" "github.com/cosmos/cosmos-sdk/x/ibc/core/exported" "github.com/cosmos/cosmos-sdk/x/ibc/core/types" - solomachinetypes "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/06-solomachine/types" ibctmtypes "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/07-tendermint/types" "github.com/cosmos/cosmos-sdk/x/ibc/testing/mock" "github.com/cosmos/cosmos-sdk/x/staking/teststaking" @@ -41,10 +40,6 @@ import ( ) const ( - // client types - Tendermint = ibctmtypes.Tendermint - SoloMachine = solomachinetypes.SoloMachine - // Default params constants used to create a TM client TrustingPeriod time.Duration = time.Hour * 24 * 7 * 2 UnbondingPeriod time.Duration = time.Hour * 24 * 7 * 3 @@ -432,7 +427,7 @@ func (chain *TestChain) ConstructMsgCreateClient(counterparty *TestChain, client ) switch clientType { - case Tendermint: + case exported.Tendermint: height := counterparty.LastHeader.GetHeight().(clienttypes.Height) clientState = ibctmtypes.NewClientState( counterparty.ChainID, DefaultTrustLevel, TrustingPeriod, UnbondingPeriod, MaxClockDrift, @@ -440,7 +435,7 @@ func (chain *TestChain) ConstructMsgCreateClient(counterparty *TestChain, client UpgradePath, false, false, ) consensusState = counterparty.LastHeader.ConsensusState() - case SoloMachine: + case exported.Solomachine: solo := NewSolomachine(chain.t, chain.Codec, clientID, "", 1) clientState = solo.ClientState() consensusState = solo.ConsensusState() @@ -459,7 +454,7 @@ func (chain *TestChain) ConstructMsgCreateClient(counterparty *TestChain, client // client will be created on the (target) chain. func (chain *TestChain) CreateTMClient(counterparty *TestChain, clientID string) error { // construct MsgCreateClient using counterparty - msg := chain.ConstructMsgCreateClient(counterparty, clientID, Tendermint) + msg := chain.ConstructMsgCreateClient(counterparty, clientID, exported.Tendermint) return chain.sendMsgs(msg) } diff --git a/x/ibc/testing/coordinator.go b/x/ibc/testing/coordinator.go index ce5c8607f5..b1c6e99d3f 100644 --- a/x/ibc/testing/coordinator.go +++ b/x/ibc/testing/coordinator.go @@ -49,7 +49,7 @@ func NewCoordinator(t *testing.T, n int) *Coordinator { func (coord *Coordinator) Setup( chainA, chainB *TestChain, order channeltypes.Order, ) (string, string, *TestConnection, *TestConnection, TestChannel, TestChannel) { - clientA, clientB, connA, connB := coord.SetupClientConnections(chainA, chainB, Tendermint) + clientA, clientB, connA, connB := coord.SetupClientConnections(chainA, chainB, exported.Tendermint) // channels can also be referenced through the returned connections channelA, channelB := coord.CreateMockChannels(chainA, chainB, connA, connB, order) @@ -98,7 +98,7 @@ func (coord *Coordinator) CreateClient( clientID = source.NewClientID(counterparty.ChainID) switch clientType { - case Tendermint: + case exported.Tendermint: err = source.CreateTMClient(counterparty, clientID) default: @@ -123,7 +123,7 @@ func (coord *Coordinator) UpdateClient( coord.CommitBlock(source, counterparty) switch clientType { - case Tendermint: + case exported.Tendermint: err = source.UpdateTMClient(counterparty, clientID) default: @@ -226,7 +226,7 @@ func (coord *Coordinator) SendPacket( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - counterpartyClientID, Tendermint, + counterpartyClientID, exported.Tendermint, ) } @@ -262,7 +262,7 @@ func (coord *Coordinator) WriteAcknowledgement( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - counterpartyClientID, Tendermint, + counterpartyClientID, exported.Tendermint, ) } @@ -327,7 +327,7 @@ func (coord *Coordinator) SendMsgs(source, counterparty *TestChain, counterparty // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - counterpartyClientID, Tendermint, + counterpartyClientID, exported.Tendermint, ) } @@ -386,7 +386,7 @@ func (coord *Coordinator) ConnOpenInit( // update source client on counterparty connection if err := coord.UpdateClient( counterparty, source, - counterpartyClientID, Tendermint, + counterpartyClientID, exported.Tendermint, ); err != nil { return sourceConnection, counterpartyConnection, err } @@ -409,7 +409,7 @@ func (coord *Coordinator) ConnOpenTry( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - counterpartyConnection.ClientID, Tendermint, + counterpartyConnection.ClientID, exported.Tendermint, ) } @@ -428,7 +428,7 @@ func (coord *Coordinator) ConnOpenAck( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - counterpartyConnection.ClientID, Tendermint, + counterpartyConnection.ClientID, exported.Tendermint, ) } @@ -446,7 +446,7 @@ func (coord *Coordinator) ConnOpenConfirm( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - counterpartyConnection.ClientID, Tendermint, + counterpartyConnection.ClientID, exported.Tendermint, ) } @@ -478,7 +478,7 @@ func (coord *Coordinator) ChanOpenInit( // update source client on counterparty connection if err := coord.UpdateClient( counterparty, source, - counterpartyConnection.ClientID, Tendermint, + counterpartyConnection.ClientID, exported.Tendermint, ); err != nil { return sourceChannel, counterpartyChannel, err } @@ -518,7 +518,7 @@ func (coord *Coordinator) ChanOpenInitOnBothChains( // update counterparty client on source connection if err := coord.UpdateClient( source, counterparty, - connection.ClientID, Tendermint, + connection.ClientID, exported.Tendermint, ); err != nil { return sourceChannel, counterpartyChannel, err } @@ -526,7 +526,7 @@ func (coord *Coordinator) ChanOpenInitOnBothChains( // update source client on counterparty connection if err := coord.UpdateClient( counterparty, source, - counterpartyConnection.ClientID, Tendermint, + counterpartyConnection.ClientID, exported.Tendermint, ); err != nil { return sourceChannel, counterpartyChannel, err } @@ -552,7 +552,7 @@ func (coord *Coordinator) ChanOpenTry( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - connection.CounterpartyClientID, Tendermint, + connection.CounterpartyClientID, exported.Tendermint, ) } @@ -571,7 +571,7 @@ func (coord *Coordinator) ChanOpenAck( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - sourceChannel.CounterpartyClientID, Tendermint, + sourceChannel.CounterpartyClientID, exported.Tendermint, ) } @@ -590,7 +590,7 @@ func (coord *Coordinator) ChanOpenConfirm( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - sourceChannel.CounterpartyClientID, Tendermint, + sourceChannel.CounterpartyClientID, exported.Tendermint, ) } @@ -611,7 +611,7 @@ func (coord *Coordinator) ChanCloseInit( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - channel.CounterpartyClientID, Tendermint, + channel.CounterpartyClientID, exported.Tendermint, ) } @@ -630,6 +630,6 @@ func (coord *Coordinator) SetChannelClosed( // update source client on counterparty connection return coord.UpdateClient( counterparty, source, - testChannel.CounterpartyClientID, Tendermint, + testChannel.CounterpartyClientID, exported.Tendermint, ) } diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 102fcea422..865953c9dd 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -1216,608 +1216,606 @@ 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{ - // 9603 bytes of a gzipped FileDescriptorSet + // 9578 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, 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, + 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, 0x22, 0x04, 0x29, 0x43, 0x6d, 0x12, 0x8e, 0xd2, 0xa9, 0xac, 0x42, 0x7f, 0xa3, 0x02, 0x0c, 0x5a, - 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, + 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, 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, 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, + 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, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r)